关于self-attention

  • multhead attention就是减少了hiddenSize,然后多弄几组qkv,然后将得到的结果concat起来(代码实现的时候各个W矩阵还是原来不multi-head attention的尺寸,只不过有两次reshape操作通过减少dimSizeheadSize来增加batchSize来模拟了多组qkv)。
  • 是否可以用一个全连接(dimSize * dimSize )来代替attention呢?答案是不可以的,因为这个全连接层相当于对于每一个positiondim信息做了交互,但是并没有根据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

你可能感兴趣的:(关于self-attention)