Внутри блоков преобразования BERT есть модули, называемые Query, Key и Value, или просто Q, К, В.
На основе статьи BERT и код (особенно в models.py), мое понимание псевдокода прямого прохода модуля внимания (с использованием Q, K, V) с одной головой внимания выглядит следующим образом:
q_param = a matrix of learned parameters
k_param = a matrix of learned parameters
v_param = a matrix of learned parameters
d = one of the matrix dimensions (scalar value)
def attention(to_tensor, from_tensor, attention_mask):
q = from_tensor * q_param
k = to_tensor * k_param
v = to_tensor * v_param
attention_scores = q * transpose(k) / sqrt(d)
attention_scores += some_function(attention_mask) #attention_mask is usually just ones
attention_probs = dropout(softmax(attention_scores))
context = attention_probs * v
return context
Обратите внимание, что BERT использует «самовнимание», поэтому from_tensor
и to_tensor
в BERT одинаковы; Я думаю, что оба они - просто результат предыдущего слоя.
Вопросы
- Почему матрицы называются «запрос», «ключ» и «значение»?
- Сделал ли я какие-либо ошибки в моем псевдокодовом представлении алгоритма?
from_tensor
- это результат модуля кодировщика, аto_tensor
- это результат предыдущего модуля декодера. Это интересно. Но что в этомq,k,v
делает более интуитивно понятным? - person solvingPuzzles   schedule 26.06.2019