Маскировка MultiHeadAttention с тензорным потоком

Я пытался создать пользовательскую маску для целевых комбинаций запросов и ключей для моего слоя MultiHeadAttention, но не могу понять, как использовать эту маску слоя.

Вот пример с фиктивным набором данных (размер пакета 1):

      key     = tf.ones([1, 32 , 128])
mask    = tf.concat([
    tf.concat([tf.zeros([16 , 16]) , tf.zeros([16 , 16]) ] , 0) ,
    tf.concat([tf.zeros([16 , 16]) , tf.ones([16 , 16])  ] , 0) ] , 1)
mask    = mask[tf.newaxis, tf.newaxis, : , : ]


# key shape  -> ( 1 , 32 , 128 )
# mask shape -> ( 1 , 1,  32 , 32 )

когда я печатаю mask[0][0].numpy()Я получил :

Теперь используем следующий слой (1 голова, внимание к себе):

      mha_layer =  tf.keras.layers.MultiHeadAttention( num_heads=1, key_dim=128 )
attention_output, attention_scores = mha_layer(  key , key , attention_mask=mask  ,  return_attention_scores=True)

Я получаю следующие оценки внимания ( attention_scores[0][0].numpy()):

Здесь темно-фиолетовый цвет соответствует 0,0, желтый — 0,06, зелено-синий — 0,03.

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

Я неправильно использую маскировку? или невозможно замаскировать целые запросы/ключи?

Я надеюсь, что мой вопрос имеет смысл и что он не слишком очевиден. Заранее спасибо, если поможете :)

0 ответов

Другие вопросы по тегам