具有正弦波形的验证损失

Posted

技术标签:

【中文标题】具有正弦波形的验证损失【英文标题】:Validation loss having a sinusoidal wave form 【发布时间】:2020-09-18 17:44:16 【问题描述】:

我正在SemEval 2017 task 4A dataset 上训练 LSTM 模型(3 个类的分类问题)。我观察到第一次验证损失减少了,然后突然增加了很多,然后又减少了。它显示出正弦特性,可以从以下训练时期观察到。

这是我的模型的代码

model = Sequential()
model.add(Embedding(max_words, 30, input_length=max_len))
model.add(Activation('tanh'))
model.add(Dropout(0.3))
model.add(Bidirectional(LSTM(32)))
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(3, activation='sigmoid'))
model.summary()

这是模型摘要

Model: "sequential_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding_2 (Embedding)      (None, 300, 30)           60000     
_________________________________________________________________
batch_normalization_3 (Batch (None, 300, 30)           120       
_________________________________________________________________
activation_3 (Activation)    (None, 300, 30)           0         
_________________________________________________________________
dropout_3 (Dropout)          (None, 300, 30)           0         
_________________________________________________________________
bidirectional_2 (Bidirection (None, 64)                16128     
_________________________________________________________________
batch_normalization_4 (Batch (None, 64)                256       
_________________________________________________________________
activation_4 (Activation)    (None, 64)                0         
_________________________________________________________________
dropout_4 (Dropout)          (None, 64)                0         
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 65        
=================================================================
Total params: 76,569
Trainable params: 76,381
Non-trainable params: 188

我将 GloVe 用于词嵌入、Adam 优化器、分类交叉熵损失函数。

改变损失函数和密集层后,这里是训练阶段。

       Train on 16711 samples, validate on 1857 samples
Epoch 1/5
16711/16711 [==============================] - 55s 3ms/step - loss: 0.5976 - accuracy: 0.7456 - val_loss: 0.9060 - val_accuracy: 0.6182
Epoch 2/5
16711/16711 [==============================] - 54s 3ms/step - loss: 0.5872 - accuracy: 0.7521 - val_loss: 0.8919 - val_accuracy: 0.6144
Epoch 3/5
16711/16711 [==============================] - 54s 3ms/step - loss: 0.5839 - accuracy: 0.7518 - val_loss: 0.9067 - val_accuracy: 0.6187
Epoch 4/5
16711/16711 [==============================] - 54s 3ms/step - loss: 0.5766 - accuracy: 0.7554 - val_loss: 0.9437 - val_accuracy: 0.6268
Epoch 5/5
16711/16711 [==============================] - 54s 3ms/step - loss: 0.5742 - accuracy: 0.7544 - val_loss: 0.9272 - val_accuracy: 0.6166

测试阶段

 accr = model.evaluate(test_sequences_matrix, Y_test) 
    2064/2064 [==============================] - 2s 1ms/step

print('Test set\n  Loss: :0.3f\n  Accuracy: :0.3f'.format(accr[0],accr[1]))
Test set
  Loss: 0.863
  Accuracy: 0.649

混淆矩阵

Confusion Matrix :
[[517 357 165]
 [379 246 108]
 [161  88  43]]
Accuracy Score : 0.3905038759689923

分类报告

              precision    recall  f1-score   support

           0       0.49      0.50      0.49      1039
           1       0.36      0.34      0.35       733
           2       0.14      0.15      0.14       292

    accuracy                           0.39      2064
   macro avg       0.33      0.33      0.33      2064
weighted avg       0.39      0.39      0.39      2064

混淆矩阵代码(我已经导入from sklearn.metrics import chaos_matrix、accuracy_score、classification_report

results = confusion_matrix(doc_test.response, Y_test) 

print('Confusion Matrix :')
print(results) 
print('Accuracy Score :',accuracy_score(doc_test.response, Y_test))

【问题讨论】:

使用 ReLU 非常标准,您使用 tanh 有什么具体原因吗? 是分类问题吗?标签的可能值有哪些? @Pedrolarben 是的,它是一个分类问题。标签是 +ve : 1, -ve : 2 和中性 : 0 @ZabirAlNazi 没有具体的 tanh 原因,但我使用了 ReLU,它也没有给出更好的结果。反而让事情变得更糟。最大验证损失为 95.5932,最小为 -3.2638,14/20 时期验证准确度为 0.3317 (33.17%) 的常数 【参考方案1】:

当你有两个以上的类时,你不能使用二元交叉熵。将损失函数更改为分类交叉熵,并将输出层设置为具有三个神经元(每个类一个)

model = Sequential()
model.add(Embedding(max_words, 30, input_length=max_len))
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(0.3))
model.add(Bidirectional(LSTM(32)))
model.add(BatchNormalization())
model.add(Activation('tanh'))
model.add(Dropout(0.5))
model.add(Dense(3, activation='softmax'))

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

无论如何,从您的训练曲线中,我可以看到网络过度拟合。这可能是因为您的数据或网络。查看此post,了解有关深度学习模型中过度拟合的更多信息。

这是您的模型的学习曲线图。它显示了经典的过拟合行为。

【讨论】:

将损失函数和输出神经元更改为 3 工作正常,但验证准确性存在问题。直到 11 个 epochs(共 20 个)它一直在增加,但是在 2-3 个 epochs 中它下降了很多,然后又增加了。而训练准确性不断提高,这没有问题。甚至验证也在增加,但在这两者之间,它显示出这种上下波动的性质。 请张贴训练和验证损失的演变图,以便我看得更清楚 我在最后的问题中添加了训练阶段(有 20 个 epoch)。请看。 我现在看到验证损失在 epoch 11 增加了,它可能有两个答案:(1)模型开始过度拟合或(2)验证数据集不具有代表性(它非常小或它与训练分布有很大不同)。作为建议,我会尝试使用更简单的模型(尝试仅使用没有批量标准化和 dropout 的 LSTM),然后继续使网络更加复杂,这样您就可以看到每一层如何影响结果 我已经更新了问题中的训练阶段。我删除了批量标准化和丢失,并且验证阶段的波动似乎已经过去了(从训练阶段观察到)。但我观察到的是,在第 6 个 epoch 之后,验证准确度几乎保持不变(62-63%),而训练准确度却在增加。这似乎并没有过度拟合,而是我的验证集似乎很小。如有错误请指正。

以上是关于具有正弦波形的验证损失的主要内容,如果未能解决你的问题,请参考以下文章

小结非正弦波形发生器的共同特点和分析方法以及与正弦波发生器的区别

标准pcm数据(正弦波方波三角波)解读

如何确定正弦波形的峰值up,有效值u?

51单片机+PCF8591的多波形发生器仿真程序(正弦波 三角波等可调)

怎样将正弦波变成方波或者锯齿波?

C语言波形实现三角波和正弦波