-
multhead attention
就是减少了hiddenSize
,然后多弄几组qkv
,然后将得到的结果concat
起来(代码实现的时候各个W
矩阵还是原来不multi-head attention
的尺寸,只不过有两次reshape
操作通过减少dimSize
为headSize
来增加batchSize
来模拟了多组qkv
)。 - 是否可以用一个全连接(
dimSize * dimSize
)来代替attention
呢?答案是不可以的,因为这个全连接层相当于对于每一个position
的dim
信息做了交互,但是并没有根据position
的相关程度对position
做交互。 - 是否可以在之前乘一个
seqLen * seqLen
的矩阵进行position
之间的交互,来代替attention
呢?答案也是不可以的,因为这个seqLen * seqLen
可以看成是一个权值矩阵,对seq
的每一个位置的赋予不同的权值,但是这样得到的是根据大量统计规律得到的权值(第一个单词的权值是0.3
,第二个单词的权值是0.2
)这样是很不靠谱的,语言是多种多样的并不一定是第一个单词一定比第二个单词重要,这样定死的权值非常不靠谱,正确的方法应该是得到了一个句子根据这个句子的具体情况决定其他位置对于当前位置的权重是多少,相当于是layer normalization
(根据当前样本决定哪些维度重要哪些维度不同要),而全连接是batch normalization
(根据历史统计信息决定哪些维度重要哪些维度不重要) -
input
乘以矩阵得到qkv
是很合理的,对dim
信息进行整合,因为哪一个维度的信息重要其实是可以根据历史统计信息得到(也就是全连接层)。 -
Q*K^
其实是比较每一position
的相关度,然后过一个softmax
得到了这个位置关于所有位置的相似度概率,然后乘以V
的时候就是每个position
的加权组合。得到这个dim
根据不同position
的同一dim
加权得到的新的dim
。
网友评论