基于神经网络的文本分类

时间:2018-02-15 10:17:46

标签: python machine-learning neural-network classification activation-function

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

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

  

运行时警告:在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

2 个答案:

答案 0 :(得分: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)。

或者,您可以尝试使用其他激活功能(例如,线性的开始。

答案 1 :(得分:0)

由于机器学习中的概率往往非常小,而且计算机上的概率会导致更小的值(导致下溢错误),因此使用对数值进行计算是一种好习惯。

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

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

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