Выход Tensorflow Transformer Decoder не дает ожидаемого результата - PullRequest
0 голосов
/ 28 января 2020

Я разработал модель трансформатора с использованием тензора. Целью модели является создание последовательности текста, которая в идеале представляет собой вопрос, за которым следует ответ с заданным входным предложением.

У меня есть точки данных (около 15k), формат которых указан ниже

SOURCE SENTENCE: <@>A man in the distance is walking past a brick wall painted with words and graffiti.<#>where<%>wall<?>brick
TARGET SENTENCE: <^>where is the man walking ?<~>A man is walking past a brick wall

Я обучил модель, используя токенизатор предложения.

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

Ниже приведен вывод из сети из указанного выше исходного ввода после 50 Эпохи для ширины поиска луча 15.

PRED: <^>what does the woman?<~>the girls are young
PRED: <^>what was the girl holding ?<~>the girl was be
PRED: <^>what was the girl doing ?<~>the man are posing.
PRED: <^>what was the girl doing ?<~>the man are posing
PRED: <^>what was the girl holding ?<~>the girl was looking
PRED: <^>what was the girl holding ?<~>a man wearing a black shirt.
PRED: <^>what is the girls are ?<~>the girls are wearing a young man
PRED: <^>what is the girls are ?<~>the girls are wearing a
PRED: <^>what was the girl holding ?<~>the girl was be for the field
PRED: <^>what was the girl holding ?<~>the girl was holding a swing
PRED: <^>what was the girl doing ?<~>the man are tryings
PRED: <^>what is the girls are ?<~>the girls are wearing a brunette
PRED: <^>what was the girl holding ?<~>the girl was holding a peace man
PRED: <^>what is the girls are ?<~>the girls are wearing a older girl
PRED: <^>what is the girls are ?<~>the girls are wearing a older

Я не уверен, где я иду не так. Я совершенно уверен, что сеть учится на обучении, которое очень многообещающе, учитывая способ вывода построено, но главная проблема здесь заключается в том, что ответ на вопрос состоит из слов, которых нет в исходном предложении.

Существует ли способ проинструктировать сеть в основном использовать только слова из исходного предложения? функция вывода декодера.

def symbols_to_logits_fn(model, config, decoder_tensor, debug=False):
    '''We basically need to run the complete decoder function
    :param model: namespace returned from function
    :param decoder_tensor: [batch_size * beam_size, decoded_length]
    :return new_ids: [batch_size * beam_size, vocab_size]
    '''
    print('^^^^^^ decoder_tensor: {}'.format(decoder_tensor))
        decoder_gather = tf.gather(
        model.context_embedding, decoder_tensor
    ) * (config.embedding_dim ** 0.5)
    decoder_gather += tf.gather(model.position_embedding,
                            positions_for(decoder_tensor, past_length=0))
    print('>>>>> {}'.format(decoder_gather))
    encoder_tiled = tf.tile(model.encoder_embedding, [config.beam_size, 1, 1])
    print('>>> encoder_tiled: {}'.format(encoder_tiled))
    local_decoder_pad_mask = tf.math.equal(
        decoder_tensor, config.pad_id, name='beam_decoder_pad_mask')
    print('>>>> local_decoder_pad_mask: {}'.format(local_decoder_pad_mask))
    decoder_out_func = transformer_model.decoder_fn(config=config,
                                                dec_out=decoder_gather,
                                                enc_out=encoder_tiled,
                                                encoder_pad_mask=model.encoder_pad_mask,
                                                decoder_pad_mask=local_decoder_pad_mask)  # [bs,   None, embedding_dim]
    print('>>>> decoder_out_func: {}'.format(decoder_out_func))
    # [bs, None, vocab_size]
    decoder_out = tf.matmul(decoder_out_func, model.fproj_w, transpose_b=False)
    print('>>>> decoder_out: {}'.format(decoder_out))
    decoder_out_last_step = decoder_out[:, -1, :]  # [bs, vocab_size]
    print('>>> decoder_out_last_step: {}'.format(decoder_out_last_step))
    return decoder_out_last_step

Может ли кто-нибудь помочь мне в решении этой проблемы. Я чувствую, что слишком близок к выходу. Любая помощь для настройки сети будет очень полезна.

1 Ответ

0 голосов
/ 28 января 2020

15 тыс. Примеров - это совсем немного для обучения модели трансформатора с нуля. Его типичное использование в машинном переводе, где учебные корпуса обычно имеют миллионы пар предложений.

Вы можете попытаться настроить предварительно обученные модели:

  • Facebook BART - это предварительно обученный шумоподавляющий Transformer, который они использовали для генерации языка и сжатия предложений.

  • Трансформаторы Hugingface теперь позволяют комбинировать предварительно обученный кодер (например, BERT) с предварительно обученной языковой моделью (например, GPT), и вы можете только обучить внимание кодировщика-декодера, у них есть учебник по этому вопросу .

...