我实现了一个LSTM
withKeras
来执行单词排序任务(给定一个句法无序的句子,目标是用正确的位置标记句子的每个单词。)所以,我的数据集由数字向量组成,每个数字向量代表一个单词。
我训练我的模型试图学习由具有句法关系的单词组成的句法子树的本地顺序(例如,子树可以是一组三个单词,其中根是动词,子树是主宾关系)。
我将每个子树的长度填充为 20,这是我在数据集中找到的最大子树长度。通过填充介绍,我插入了许多仅由零组成的向量。
我的初始数据集形状是(700000, 837)
,但知道需要Keras
一个 3D 数据集,我将其重新调整为(35000, 20, 837)
和我的标签相同(从 700000 到(35000, 20)
)。
作为损失函数,我使用ListNet
算法损失函数,它接受一个单词列表,并为每个计算元素排在第一位的概率(然后对这些分数进行排序,我得到每个单词的预测标签) .
当前的实现如下:
model = tf.keras.Sequential()
model.add(LSTM(units=100, activation='tanh', return_sequences=True, input_shape=(timesteps, features)))
model.add(Dense(1, activation='sigmoid'))
model.summary()
model.compile(loss=listnet_loss, optimizer=keras.optimizers.Adam(learning_rate=0.00005, beta_1=0.9, beta_2=0.999, amsgrad=True), metrics=["accuracy"])
model.fit(training_dataset, training_dataset_labels, batch_size=1, epochs=number_of_epochs, workers=10, verbose=1, callbacks=[SaveModelCallback()])
并且SaveModelCallback
在训练期间简单地保存每个模型。
目前,我在每个时期都获得了非常相似的结果:
Epoch 21/50
39200/39200 [==============================] - 363s 9ms/step - loss: 2.5483 - accuracy: 0.8246
Epoch 22/50
39200/39200 [==============================] - 359s 9ms/step - loss: 2.5480 - accuracy: 0.8245
Epoch 23/50
39200/39200 [==============================] - 360s 9ms/step - loss: 2.5478 - accuracy: 0.8246
我不得不提问:
零填充会以负面的方式影响学习吗?如果是的话,我们怎么能不考虑这个填充?
这是我必须做的一个好模型吗?