Как дополнить последовательности во время обучения для модели кодера-декодера - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть модель кодера-декодера для символьного уровня Engli sh коррекция орфографии языка, это довольно просто c материал с двумя LSTM-кодером и другим LSTM-декодером.

Однако, до до сих пор я предварительно дополнял входные последовательности кодера, как показано ниже:

abc  -> -abc
defg -> defg
ad   -> --ad

И затем я разбивал данные на несколько групп с одинаковой длиной входного сигнала декодера, например,

train_data = {'15': [...], '16': [...], ...}

где ключ - длина входных данных декодера, и я обучал модель один раз для каждой длины в al oop.

Однако, должен быть лучший способ сделать это например, заполнение после EOS или перед символами SOS et c. Но если это так, как бы я изменил функцию потерь, чтобы это дополнение не учитывалось в потере?

1 Ответ

0 голосов
/ 03 марта 2020

Стандартный способ сделать заполнение - поместить его после токена конца последовательности, но на самом деле должно иметь значение, где находится заполнение.

Хитрость в том, как не включать позиции с отступами в потерю, маскируется. их, прежде чем уменьшить потери. Предполагая, что переменная PAD_ID содержит индекс символа, который вы используете для заполнения:

def custom_loss(y_true, y_pred):
    mask = 1 - K.cast(K.equal(y_true, PAD_ID), K.floatx())
    loss = K.categorical_crossentropy(y_true, y_pred) * mask    
    return K.sum(loss) / K.sum(mask)
...