我对机器学习和神经网络是新手。我正在尝试从头开始使用神经网络进行文本分类。我的数据集中有7500个文档,每个文档标注了七个类别之一。数据集中大约有5800个独特的词。我使用了一个包含4000个神经元的隐藏层。使用sigmoid作为激活函数。学习率为0.1,没有使用dropout。
在训练过程中,大约2到3个周期后,会显示一个警告:
RuntimeWarning: 在exp中遇到溢出。结果输出列表显示为:
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 4.11701866e-10] 对于除了4.11701866e-10之外的所有输入。
sigmoid函数:
def sigmoid(x): output = 1/(1+np.exp(-x)) return outputdef sigmoid_output_to_derivative(output): return output*(1-output)
如何解决这个问题?我可以使用不同的激活函数吗?
这是我的完整代码:https://gist.github.com/coding37/a5705142fe1943b93a8cef4988b3ba5f
回答:
给出一个精确的答案并不容易,因为问题可能是多方面的,且很难重现,但我会试着回答:
看起来你遇到了下溢问题,这意味着你的神经元权重将输入向量x缩放到在sigmoid函数中导致零值的值。一个简单的建议是将精度从float32增加到float64,但我猜你已经使用了这种精度。
你是否尝试过调整学习率和/或使用自适应学习率?(参见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)。
或者,你可以尝试使用其他激活函数,看看训练是否有所改善,例如先尝试使用线性函数。