Gensim doc2vec 300维向量输入keras,lstm模型不working.Loss不递减

Gensim doc2vec 300 dimensional vector fed into keras,lstm model not working.Loss is not diminishing

这是我的代码片段:

model=keras.Sequential()
model.add(keras.layers.LSTM(28,input_shape=(300,1),return_sequences=True))
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.LSTM(14))
model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(2,activation="softmax"))
sgd=keras.optimizers.SGD(lr=0.001)
model.compile(optimizer=sgd,loss=keras.losses.sparse_categorical_crossentropy)
model.fit(trainData,labeledData.sentiment,epochs=20,batch_size=3000)

trainData 形状是 [batch_size,300,1],当我开始训练这个模型时,损失并没有下降。

纪元 1/20 25000/25000 [================================] - 2s 89us/步 - 损失:0.6927 纪元 2/20 25000/25000 [================================] - 0s 8us/步 - 损失:0.6928 时代 3/20 25000/25000 [================================] - 0s 8us/步 - 损失:0.6928 时代 4/20 25000/25000 [================================] - 0s 8us/步 - 损失:0.6928 纪元 5/20 25000/25000 [================================] - 0s 8us/步 - 损失:0.6928 时代 6/20 25000/25000 [================================] - 0s 8us/步 - 损失:0.6926

我错过了什么?

正如评论中所讨论的那样,问题在于大批量,而且 - 也可能 - 在用于训练的优化器中。

很难确定您的算法未与当前设置收敛的确切原因,但可以这样论证:

大批量收敛速度较慢。

与直觉相反,在某些情况下,使用较大的批量进行训练实际上会减慢您的训练速度。这背后的原因纯粹是推测,取决于数据的确切性质和分布。不过,通常来说,批次越小意味着更新越频繁。如果你计算出的梯度都指向相似的方向,那么更频繁的更新将导致更快的收敛。
好的做法是 从不 大于 1000 的批处理大小。在大多数情况下,128 是一个很好的经验法则,并且是在较大批处理的速度优势和较小批量的良好收敛特性。请注意,这仅在您拥有大量训练数据的情况下才有意义。

另请注意,理论上在该大设置中多个示例的梯度可以 "average out",这意味着大批量将只有非常小且模糊的梯度。在小批量中使用较少的样本会减少这种机会,尽管它会增加 "going the wrong direction" 的风险(即具有指向相反方向的梯度)。

SGD 是一个很好的起点,但存在一些优化。

其中一个 "smarter" 变体是建议的 ADAM 方法。有一个被高度引用的 paper about it,它可以让您模糊地了解幕后发生的事情。本质上,SGD 是一种非常简单的解决方案,没有任何特殊假设或内置优化。 (据我所知,例如 ADAM 使用一阶导数)

存在许多不同的实现,并且有大量 theoretical articles (and practical comparisons) 的不同实现。至少部分了解参数的作用,并知道将它们设置为哪些值是有意义的,这很有价值。

例如,您已经将学习率设置为一个合理的值(0.001);就个人而言,我通常最终得到的值在 0.001-0.01 之间,如果我有更大的学习率,可能会使用学习率随时间衰减。