一、前言
问:transformer模型的众多派生BERT,RoBERTa,ALBERT,SpanBERT,DistilBERT,SesameBERT,SemBERT,SciBERT,BioBERT,MobileBERT,TinyBERT和CamemBERT有什么共同点?
答:Self-attention//Transformer架构
使用Transformer架构对NLP任务建模,避免使用递归神经网络,完全依赖Self-Attention机制绘制输入和输出之间的全局依赖关系。
本文要:
- 探究Self-Attention机制背后的数学原理
- 引导完成Self-Attention模块中涉及的数学计算
- 从头带领编写Self-Attention模块代码(pytorch)
二、自注意力机制(Self-Attention)
一个self-attention模块输入为 n,输出也为 n.那么在这个模块内部发生了什么?用门外汉的术语来说,self-attention机制允许输入彼此之间进行交互(“self”)并找出它们应该更多关注的区域(“Attention”)。输出是这些交互作用和注意力得分的总和。
在self-attention中,每个单词有3个不同的向量,它们分别是Query向量(
),Key向量(
)和Value向量(
),长度均是64。它们是通过3个不同的权值矩阵由嵌入向量
乘以三个不同的权值矩阵
,
,
得到,其中三个矩阵的尺寸也是相同的。均是
。(Transformer中使用的词嵌入的维度为
。)
slef: 自己和自己计算相似度函数,然后进一步进行关注对吧。
计算过程:
假如我们要翻译一个词组Thinking Machines,其中Thinking的输入的embedding vector用
表示,Machines的embedding vector用
表示,以
举例,整个过程可以分成7步:
- 输入单词转化成嵌入向量;
- 根据嵌入向量得到
,
,
三个向量;
- 为每个向量计算自注意力得分,分数决定当我们在某个位置对单词进行编码时,要在输入句子的其他部分上投入多少注意力:
;
- 为了梯度的稳定,对计算的分数进行 Scale,即除以
,原因是如果点乘结果过大,使得经过 softmax 之后的梯度很小,不利于反向传播
- 对score施以softmax激活函数,归一化;
- softmax乘Value值
(每个单词的value),得到加权的每个输入向量的评分
;
- 相加之后得到最终的输出结果
:
。
q, k, v 的自我理解:q:当前词作为搜索词,此时对应query_vector k: 句子中的所有词(包括query,去和query匹配搜寻相关度,此时对应key_vector。故qk相乘可以决定在句子每个单词上投入多少注意力。v: 句子中每个词自身的价值value,将求得的注意力得分与v相乘得到最终每个单词的得分。矩阵计算:
实际实现时采用的是基于矩阵的计算方式
三、实例演示
步骤(忽略了二中的第四步):
- 准备输入x
- 初始化 K, Q, V的权重矩阵
- x与K, Q, V相乘得到key, query, value的表示
- 计算x的注意力得分(k, v),即求得每个单词的权重weight
- softmax
- weight分别乘value中的每一行,得到的是对应的加权矩阵
- 矩阵按列相加得到分数矩阵Zx
- 将每个输入的分数按列排列得到最终的输出Z
手动计算过程:
参考:https://mp.weixin.qq.com/s/xLI0yY1hAlOZ1c01SexA1A
四、代码实现(pytorch)
具体步骤同三
(矩阵中点乘和乘法不同,具体见参考3)
参考:
动手推导Self-Attentionmp.weixin.qq.com
自定义:Transformer详解zhuanlan.zhihu.com
[Python] numpy中运算符* @ mutiply dot的用法分析blog.csdn.net