Я разработал модель трансформатора с использованием тензора. Целью модели является создание последовательности текста, которая в идеале представляет собой вопрос, за которым следует ответ с заданным входным предложением.
У меня есть точки данных (около 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
Может ли кто-нибудь помочь мне в решении этой проблемы. Я чувствую, что слишком близок к выходу. Любая помощь для настройки сети будет очень полезна.