Модель, основанная на огромном обзоре Amazon, Dataset быстро не сходится - PullRequest
0 голосов
/ 03 февраля 2020

Я пытался воспроизвести результаты из статьи «Модель иерархического внимания», где они обучаются на наборе данных Amazon Reviews. Мне это нужно было для мульти-выходной классификации для обзоров и настроений. Довольно-таки c, верно? Но проблема в том, что набор данных слишком велик (почти 4,2 млн. Обзоров), и я получаю пакет размером более 6000 на одном графическом процессоре Colab.

Это, вероятно, приводит к тому, что моя потеря не так эффективно сходится , Я добавил несколько слоев BatchNorm, и это действительно помогло мне решить проблему, но я не знаю, слишком ли это много, и является ли это основной причиной того, что он не сходится так быстро. В этот момент потери постоянно уменьшаются, но слишком много возиться со скоростью обучения просто приводит к тому, что модель со временем расходится. Это общая тенденция:

lr<0.001 - Very slow convergence 
lr = 0.001 -Moderately slow, much better than before
lr = 0.01 - Best as of now 
lr = 0.1 - Decent 
lr > 0.1 - Diverges slowly 

Это продолжение обучения из ранее сохраненной модели

Train on 4233936 samples, validate on 235219 samples
Epoch 1/10
4233936/4233936 [==============================] - 666s 157us/sample - loss: 1.6747 - dense_3_loss: 1.0357 - dense_4_loss: 0.6390 - dense_3_accuracy: 0.5517 - dense_3_precision: 0.6631 - dense_3_recall: 0.3783 - dense_4_accuracy: 0.7368 - dense_4_precision: 0.7655 - dense_4_recall: 0.6994 - val_loss: 1.6442 - val_dense_3_loss: 1.0197 - val_dense_4_loss: 0.6241 - val_dense_3_accuracy: 0.5669 - val_dense_3_precision: 0.6647 - val_dense_3_recall: 0.4266 - val_dense_4_accuracy: 0.7404 - val_dense_4_precision: 0.7636 - val_dense_4_recall: 0.7129
Epoch 2/10
4233936/4233936 [==============================] - 666s 157us/sample - loss: 1.5674 - dense_3_loss: 0.9750 - dense_4_loss: 0.5924 - dense_3_accuracy: 0.5782 - dense_3_precision: 0.6701 - dense_3_recall: 0.4297 - dense_4_accuracy: 0.7601 - dense_4_precision: 0.7816 - dense_4_recall: 0.7329 - val_loss: 1.5835 - val_dense_3_loss: 0.9839 - val_dense_4_loss: 0.5992 - val_dense_3_accuracy: 0.5734 - val_dense_3_precision: 0.6469 - val_dense_3_recall: 0.4583 - val_dense_4_accuracy: 0.7509 - val_dense_4_precision: 0.7693 - val_dense_4_recall: 0.7287
Epoch 3/10
4233936/4233936 [==============================] - 669s 158us/sample - loss: 1.5379 - dense_3_loss: 0.9581 - dense_4_loss: 0.5798 - dense_3_accuracy: 0.5855 - dense_3_precision: 0.6728 - dense_3_recall: 0.4437 - dense_4_accuracy: 0.7663 - dense_4_precision: 0.7858 - dense_4_recall: 0.7415 - val_loss: 1.5628 - val_dense_3_loss: 0.9722 - val_dense_4_loss: 0.5901 - val_dense_3_accuracy: 0.5883 - val_dense_3_precision: 0.6713 - val_dense_3_recall: 0.4607 - val_dense_4_accuracy: 0.7657 - val_dense_4_precision: 0.7840 - val_dense_4_recall: 0.7426
Epoch 4/10
4233936/4233936 [==============================] - 668s 158us/sample - loss: 1.5190 - dense_3_loss: 0.9477 - dense_4_loss: 0.5714 - dense_3_accuracy: 0.5896 - dense_3_precision: 0.6743 - dense_3_recall: 0.4525 - dense_4_accuracy: 0.7700 - dense_4_precision: 0.7883 - dense_4_recall: 0.7469 - val_loss: 1.5349 - val_dense_3_loss: 0.9565 - val_dense_4_loss: 0.5783 - val_dense_3_accuracy: 0.5868 - val_dense_3_precision: 0.6616 - val_dense_3_recall: 0.4625 - val_dense_4_accuracy: 0.7678 - val_dense_4_precision: 0.7882 - val_dense_4_recall: 0.7422
Epoch 5/10
4233936/4233936 [==============================] - 666s 157us/sample - loss: 1.5044 - dense_3_loss: 0.9395 - dense_4_loss: 0.5649 - dense_3_accuracy: 0.5931 - dense_3_precision: 0.6753 - dense_3_recall: 0.4594 - dense_4_accuracy: 0.7730 - dense_4_precision: 0.7904 - dense_4_recall: 0.7511 - val_loss: 1.5274 - val_dense_3_loss: 0.9492 - val_dense_4_loss: 0.5780 - val_dense_3_accuracy: 0.5918 - val_dense_3_precision: 0.6750 - val_dense_3_recall: 0.4578 - val_dense_4_accuracy: 0.7740 - val_dense_4_precision: 0.7927 - val_dense_4_recall: 0.7507
Epoch 6/10
4233936/4233936 [==============================] - 667s 158us/sample - loss: 1.4916 - dense_3_loss: 0.9324 - dense_4_loss: 0.5592 - dense_3_accuracy: 0.5962 - dense_3_precision: 0.6763 - dense_3_recall: 0.4652 - dense_4_accuracy: 0.7757 - dense_4_precision: 0.7922 - dense_4_recall: 0.7548 - val_loss: 1.5183 - val_dense_3_loss: 0.9466 - val_dense_4_loss: 0.5714 - val_dense_3_accuracy: 0.5927 - val_dense_3_precision: 0.6665 - val_dense_3_recall: 0.4788 - val_dense_4_accuracy: 0.7679 - val_dense_4_precision: 0.7822 - val_dense_4_recall: 0.7505

Потеря и Оптимизатор. Я попробовал категорическую кроссентропию и петлю, но это дало подобные результаты. Поэтому я решил попробовать Kullback Divergence (я никогда не пробовал этот оптимизатор, но, похоже, он работает хорошо)

Loss - kullback_leibler_divergence 
optimizer=SGD(learning_rate=0.01,momentum=0.6,clipvalue=0.3) 
    input_layer = tf.keras.layers.Input(shape=shape)

    embedding = tf.keras.layers.Embedding(VOCAB+1,128,input_length=100,mask_zero=True)(input_layer)
    gru = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(32,return_sequences=True,recurrent_dropout=0.2))(embedding)

    bn = tf.keras.layers.BatchNormalization()(gru)


    gru1 = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(50,recurrent_dropout=0.2,return_sequences=True))(bn)

    bn1 = tf.keras.layers.BatchNormalization()(gru1)

    attention = tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(1,activation='tanh',use_bias=False))(bn1)
    attentionf = tf.keras.layers.Flatten()(attention)
    attentiona = tf.keras.layers.Activation('softmax')(attentionf)

    merge = tf.keras.layers.dot([gru1,attentiona],axes=1) 

    bn2 = tf.keras.layers.BatchNormalization()(merge)

    dense = tf.keras.layers.Dense(256,activation='selu')(bn2)
    drop = tf.keras.layers.Dropout(0.3)(dense)
    dense1 = tf.keras.layers.Dense(128,activation='selu')(drop)
    bn3 = tf.keras.layers.BatchNormalization()(dense1)
    dense_rating_1 = tf.keras.layers.Dense(5,activation='softmax')(bn3)
    dense_sentiment_1 = tf.keras.layers.Dense(3,activation='softmax')(bn3)

    model = tf.keras.models.Model(inputs=input_layer,outputs=[dense_rating_1,dense_sentiment_1])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...