0

我是机器学习和神经网络的新手。我正在尝试从头开始使用神经网络进行文本分类。在我的数据集中,有 7500 个文档,每个文档都标有七个类别之一。大约有 5800 个独特的单词。我正在使用一个具有 4000 个神经元的隐藏层。使用 sigmoid 激活函数。学习率=0.1,无辍学。

在训练期间大约 2 到 3 个 epoch 后,会显示警告:

运行时警告:exp 中遇到溢出。结果输出列表显示为:

[  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

4

2 回答 2

0

给出一个准确的答案并不容易,因为问题可能是多方面的,而且很难重构,但我会试一试:

因此,您似乎遇到了下溢,这意味着您的神经元的权重将您的输入向量 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)。

或者,如果您的训练通过使用其他激活函数(例如线性开始)来提高,您可以尝试。

于 2018-02-15T10:51:29.037 回答
0

由于机器学习中的概率往往非常小,并且对它们的计算会导致更小的值(导致下溢错误),因此最好使用对数值进行计算

使用 float64 类型还不错,但最终也会失败。

因此,您应该添加它们的对数值,而不是乘以两个小概率。exp() 等其他操作也是如此。

我知道的每个机器学习框架要么默认返回对数模型参数,要么有一个方法。或者你只是使用你内置的数学函数。

于 2018-02-15T11:40:28.567 回答