使用神经网络的文本分类
Text Classification Using Neural Network
我是机器学习和神经网络的新手。我正在尝试从头开始使用神经网络进行文本分类。在我的数据集中,有 7500 个文档,每个文档都标有七个 类 之一。大约有 5800 个独特的单词。我正在使用一个包含 4000 个神经元的隐藏层。使用 sigmoid 作为激活函数。学习率=0.1,没有dropout。
在训练过程中,经过大约 2 到 3 个 epoch 后,显示警告:
RuntimeWarning: overflow encountered in exp.The resultant output list
appears as:
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 4.11701866e-10] for every input except 4.11701866e-10.
sigmoid 函数:
def sigmoid(x):
output = 1/(1+np.exp(-x))
return output
def sigmoid_output_to_derivative(output):
return output*(1-output)
如何解决这个问题?我可以使用不同的激活函数吗?
这是我的完整代码:
https://gist.github.com/coding37/a5705142fe1943b93a8cef4988b3ba5f
要给出准确的答案并不容易,因为问题可能是多方面的,而且很难重构,但我会试一试:
所以你似乎遇到了下溢,这意味着你的神经元的权重将你的输入向量 x 缩放到将导致 sigmoid 函数中的零值的值。一个天真的建议是将精度从 float32 提高到 float64,但我猜你已经达到了那个精度。
你玩过学习率吗and/or尝试过自适应学习率? (有关示例,请参见 https://towardsdatascience.com/learning-rate-schedules-and-adaptive-learning-rate-methods-for-deep-learning-2c8f433990d1)。尝试以较低的学习率进行更多迭代。
此外:您是否在输出层中使用了 sigmoid 函数?添加的非线性可能会使您的神经元饱和,即您的问题。
你检查过你的梯度了吗?这有时也有助于追踪错误 (http://ufldl.stanford.edu/wiki/index.php/Gradient_checking_and_advanced_optimization)。
或者,您可以尝试使用其他激活函数(例如一开始是线性的。
由于机器学习中的概率往往非常小,并且对它们的计算会导致更小的值(导致下溢错误),因此最好使用对数值进行计算.
使用 float64 类型不错,但最终也会失败。
因此,您不应将两个小概率相乘,而应将它们的对数值相加。其他操作也是如此,例如 exp().
我知道的每个机器学习框架都默认 returns 对数模型参数,或者有相应的方法。或者您只使用内置的数学函数。
我是机器学习和神经网络的新手。我正在尝试从头开始使用神经网络进行文本分类。在我的数据集中,有 7500 个文档,每个文档都标有七个 类 之一。大约有 5800 个独特的单词。我正在使用一个包含 4000 个神经元的隐藏层。使用 sigmoid 作为激活函数。学习率=0.1,没有dropout。
在训练过程中,经过大约 2 到 3 个 epoch 后,显示警告:
RuntimeWarning: overflow encountered in exp.The resultant output list appears as:
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 4.11701866e-10] for every input except 4.11701866e-10.
sigmoid 函数:
def sigmoid(x):
output = 1/(1+np.exp(-x))
return output
def sigmoid_output_to_derivative(output):
return output*(1-output)
如何解决这个问题?我可以使用不同的激活函数吗?
这是我的完整代码: https://gist.github.com/coding37/a5705142fe1943b93a8cef4988b3ba5f
要给出准确的答案并不容易,因为问题可能是多方面的,而且很难重构,但我会试一试:
所以你似乎遇到了下溢,这意味着你的神经元的权重将你的输入向量 x 缩放到将导致 sigmoid 函数中的零值的值。一个天真的建议是将精度从 float32 提高到 float64,但我猜你已经达到了那个精度。
你玩过学习率吗and/or尝试过自适应学习率? (有关示例,请参见 https://towardsdatascience.com/learning-rate-schedules-and-adaptive-learning-rate-methods-for-deep-learning-2c8f433990d1)。尝试以较低的学习率进行更多迭代。
此外:您是否在输出层中使用了 sigmoid 函数?添加的非线性可能会使您的神经元饱和,即您的问题。
你检查过你的梯度了吗?这有时也有助于追踪错误 (http://ufldl.stanford.edu/wiki/index.php/Gradient_checking_and_advanced_optimization)。
或者,您可以尝试使用其他激活函数(例如一开始是线性的。
由于机器学习中的概率往往非常小,并且对它们的计算会导致更小的值(导致下溢错误),因此最好使用对数值进行计算.
使用 float64 类型不错,但最终也会失败。
因此,您不应将两个小概率相乘,而应将它们的对数值相加。其他操作也是如此,例如 exp().
我知道的每个机器学习框架都默认 returns 对数模型参数,或者有相应的方法。或者您只使用内置的数学函数。