赞
踩
Transformer 是谷歌在论文《Attention is all you need》中提出来解决 Sequence to Sequence 问题的模型,其本质上是一个编解码(Encoder-Decoder )结构。
编码器 和解码器 由 6 个编码 block 组成。
编码器 中的每个 block 包含 Multi-Head Attention 和 FFN(Feed-Forward Network);解码器 每个 block 包含 Multi-Head Attention、Encoder-Decoder Attention 和 FFN。
由于Transformer中没有循环以及卷积结构,为了使模型能够利用序列的顺序,作者们需要插入一些关于tokens在序列中相对或绝对位置的信息。因此,作者们提出了“Positional Encoding”(位置编码)的概念。Positional Encoding和token embedding相加,作为encoder和decoder栈的底部输入。Positional Encoding和embedding具有同样的维度 d k d_k dk,因此这两者可以直接相加。
P E ( p o s , 2 i ) = s i n ( p o s 1000 0 2 i d k ) PE(pos,2i)=sin(\frac{pos}{10000^{\frac{2i}{d_{k}}}}) PE(pos,2i)=sin(10000dk2ipos)
P E ( p o s , 2 i + 1 ) = c o s ( p o s 1000 0 2 i d k ) PE(pos,2i+1)=cos(\frac{pos}{10000^{\frac{2i}{d_{k}}}}) PE(pos,2i+1)=cos(10000dk2ipos)
以句子“The animal didn’t cross the street because it was too tired”为例了解self attention。self-attention可以借助词的上下文判断句子中的"it"指的是"animal" 还是"street"。联系到tired,我们可以得知是"animal"。self-attention就可以通过计算词与词之间的相关性来理解句子。
假设输入2个单词 a 1 = T h i n k i n g , a 2 = M a c h i n e s a_1 = Thinking, a_2=Machines a1=Thinking,a2=Machines,,embedding后得到2个单词向量 x 1 , x 2 x_1, x2 x1,x2, 每个单词向量分别与3个weight做点积,得到每个单词对应的query, key和value。query用来和其他单词比较的,key是用来被其他单词比较的,value则是保存从单词向量中提取的信息。
假设我们正在计算本例中第一个单词“Thinking”的自注意力。步骤如下
矩阵求解根据输入 X X X和三个权重矩阵 W Q , W K , W V W^Q, W^K, W^V WQ,WK,WV,得到Query, Key, and Value矩阵;通过矩阵运算得到attention vector。
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 attention(Q,K,V) = softmax (\frac{QK^T}{\sqrt{d_k}}) V attention(Q,K,V)=softmax(dk QKT)V
muilti-head指的是有多组query, key, value,对于相同的输入 X X X每组head初始化不同的 W i Q , W i K , W i V W_i^Q, W_i^K, W_i^V WiQ,WiK,WiV(相当于将 X X X映射到了多个不同的子空间进行运算), 然后做self-attention计算,最后把多组的结果concat起来表示attention score
m u l t i h e a d ( Q , K , V ) = c o n c a t ( a t t e n t i o n ( Q i , K i , V i ) ∣ i = 1 , . . . , h ) W O multihead(Q,K,V) = concat(attention(Q_i,K_i,V_i) | i = 1, ..., h) W^O multihead(Q,K,V)=concat(attention(Qi,Ki,Vi)∣i=1,...,h)WO
每个编码器中的每个子层(self-attention,ffn)周围都有一个残差连接,然后是层归一化步骤。
F F N ( x ) = L a y e r N o r m ( x + D r o p o u t ( r e l u ( x W 1 + b 1 ) W 2 + b 2 ) ) FFN(x) = LayerNorm(x + Dropout(relu(xW_1 + b_1)W_2+ b_2)) FFN(x)=LayerNorm(x+Dropout(relu(xW1+b1)W2+b2))
在每个layer里面,除了和encoder一样有两个sublayer, 还加上了一层masked multi-head self-attention layer。因为decoder的时候,是一个单词接着一个单词的预测,对于排在位置i后面的单词没法进行attention,所以要把排在位置i后面的位置都是mask掉。具体实现的时候,mask的位置用-inf表示。
这一层主要是将decoder输出的向量转换成单词。首先,把decoder输出的向量通过线性转换,扩展到一个更大的向量, 叫做logit vector。假设训练数据中有10000个不重复的单词,那么logit vector就是10000维, 表示每个单词预测为序列中下一个单词的分数,通过softmax函数得到每个单词预测的概率,概率最大的单词作为预测结果输出。
欢迎关注微信公众号(算法工程师面试那些事儿),本公众号聚焦于算法工程师面试,期待和大家一起刷leecode,刷机器学习、深度学习面试题等,共勉~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。