Attention is all your need链接
b站李沐论文带读
b站对transformer图解
什么是残差链接?
h 个不一样的距离空间指的是什么?
循环模型难以并行
Transformer是第一个完全依靠self-attention来计算输入和输出表示而不使用序列对齐RNN或卷积的转导模型。
输入序列(x1,…,xn) 通过encoder映射z = (z1,…,zn)(即机器学习算法可以使用的向量,一个句子有 n 个词,xt 是第 t 个词,zt 是第 t 个词的向量表示)。 根据z,decoder生成符号的一个输出序列(y1,…,ym) 。 在每一步decoder中,模型都是auto-regressive自回归的(过去时刻的输出也会作为当前时刻的输入)
对上图的描述:
batchnorm和layernorm
Attention函数可以描述为将query和一组key-value映射成一个输出的函数,其中query、key、value和输出都是向量。
output为value的加权和,output 中 value 的权重 等价于 query 和对应的 key 的相似度
不同注意力机制就是相似度算法不同
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V \mathrm{Attention}(Q,K,V)=\mathrm{softmax}(\dfrac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dkQKT)V
query 和 key 的长度是等长的,都等于 dk。value 的维度是 dv,输出也是 dv。
实际计算:不会一个 query 一个 query 的计算,因为运算比较慢。把多个 query 写成 一个矩阵,并行化运算。
Q:n * dk
K: m * dk
Q * K T:(n * dk) * (m * dk)T = (n * m)
softmax会让大的数据更大,小的更小(因为指数函数的曲线,建议回忆一下softmax的公式)
因为 softmax 最后的结果是希望 softmax 的预测值,置信的地方尽量靠近,不置信的地方尽量靠近零,以保证收敛差不多了。这时候梯度就会变得比较小,那就会跑不动,所以要除以根号dk,防止梯度过小
怎么做 mask :
把整个 query、key、value 整个投影 project 到 1个低维,投影 h 次。然后再做 h 次的注意力函数,把每一个函数的输出 拼接在一起,然后 again projected,会得到最终的输出
为什么要做多头注意力机制呢?一个 dot product 的注意力里面,没有什么可以learn的参数。具体函数就是内积,为了识别不一样的模式,希望有不一样的计算相似度的办法。
加性 attention 有一个权重可learn,也许能learn到一些内容。
本文的 dot-product attention,先投影到低维,投影的 w 是可以学习的。
multi-head attention 给 h 次机会去学习 不一样的投影的方法,使得在投影进去的度量空间里面能够去匹配不同模式需要的一些相似函数,然后把 h 个 heads 拼接起来,最后再做一次投影。
multi-head attention 具体公式
MuItiHad ( Q K , V ) = Concat ( head 1 , . . . , head n ) W O \text{MuIti}\text{Had}(QK,V)=\text{Concat}(\text{head}_1,...,\text{head}_n)W^O\quad MuItiHad(QK,V)=Concat(head1,...,headn)WO
head i = Attempt ( Q W i Q , K W i K , V W i V ) \text{head}_i=\text{Attempt}(QW_i^Q,KW_i^K,VW_i^V) headi=Attempt(QWiQ,KWiK,VWiV)
其中
W i Q ∈ R d m o d e l × d k , W i K ∈ R d m o d e l x d k , W i V ∈ R V m o d e l × d , W O ∈ R h d v × d model . W_{i}^{Q}\in\mathbb{R}^{d\mathrm{model}\times d k},W_{i}^{K}\in\mathbb{R^{d\mathrm{model}x d}k},W_{i}^{V}\in\mathbb{R^{\mathrm{model}\times d}_{V}},W^O\in\mathbb{R}^{hd_v\times d\text{model}}. WiQ∈Rdmodel×dk,WiK∈Rdmodelxdk,WiV∈RVmodel×d,WO∈Rhdv×dmodel.
Multi-head 的输入还是Q,K,V
但是输出是 不同的头的输出的 concat 起来,再投影到一个 WO 里面。
每一个头 headi :是把 Q,K,V 通过 可以学习的 Wq, Wk, Wv 投影到 dv 上,再通过注意力函数,得到 headi。
本文采用 8 个 heads。因为有残差连接的存在使得输入和输出的维度至少是一样的。
投影维度 dv = dmodel / h = 512 / 8 = 64,每个 head 得到 64 维度,concat,再投影回 dmodel。
三个黄色的方框是三种不一样的注意力层
encoder 的注意力层,有三个输入,它分别表示的是key、value 和 query (所以有三个箭头)
一根线过来分叉成了三个:同样一个东西,既 key 也作为 value 也作为 query,所以叫做自注意力机制。key、value 和 query 其实就是一个东西,就是自己本身。
输入了 n 个 query,每个 query 会得到一个输出,那么会有 n 个输出。
输出 是 value 加权和(权重是 query 和 key 的相似度),输出的维度 == d – > 输入维度 == 输出维度
和前面的multi-head attention区别只有看不到t时刻以后的输入(权重为0)
不再是self-attention,因为query 是来自 decoder 里 masked multi-head attention 的输出(看看三个箭头的来源)
Point-wise: 把一个 MLP 对每一个词 (position)作用一次,对每个词作用的是同样的 MLP
FFN: Linear + ReLU + Linear
单隐藏层的 MLP,中间 W1 扩维到4倍 2048,最后 W2 投影回到 512 维度大小,便于残差连接。
pytorch实现:2个线性层。因为pytorch在输入是3d的时候,默认在最后一个维度做计算。
最简单情况:没有残差连接、没有 layernorm、 attention 单头、没有投影。看和 RNN 区别
对比 RNN 怎么做的:
用一个线性层 or 一个 MLP 来做语义空间的转换。
关注点:怎么有效的去使用序列的信息。
embedding:将输入的一个词、词语 token 映射成 为一个长为 d 的向量。
乘根号dmodel让embedding 和 positional encosing 的 scale 差不多,可以做加法。
attention 不会有时序信息 。
但我们要处理时序数据怎么办呢?因此在输入里面加入时序Positional Encoding
怎么加入?一个在位置 i 的词,会把 i 位置信息加入到输入里面,
周期不一样的 sin 和 cos 函数计算 --> 任何一个值可以用一个长为 512 的向量来表示。
P E ( c o s , 2 ) = s i n ( p os/ 1000 0 2 i / d mode ) P E ( p os, 2 i + 1 ) = c o s ( p os/ 1000 0 2 i/ d mode ) \begin{matrix}P E_{(cos,2)}=sin(p\text{os/}10000^{2i\text{/}d\text{mode})}\\ P E_{(p\text{os,}2i\text{+}1)}=cos(p\text{os/}{}10000^{2\text{i/}d\text{mode}})\end{matrix} PE(cos,2)=sin(pos/100002i/dmode)PE(pos,2i+1)=cos(pos/100002i/dmode)
文章中和RNN CNN进行了对比
Maximum Path Length(一个信息从一个数据点走到另外一个数据点要走多少步)越短越好
attention主要需要使用更多的数据量