文章目录
Transformer
Transformer 完全基于 attention;
是一种 seq2seq 模型,有 encoder 和 decoder,很适合做机器翻译;
不是RNN,没有循环结构。只有 attention 和全连接层。
实验效果很好,完爆 RNN;业界已经不使用 RNN,而是使用 Transformer + Bert。
2017年发表论文:Attention Is All You Need
- Self-attention
- multi-head
- 多层堆叠,位置编码
- 并行加速训练
Bert 提供预训练模型,不需要随机初始化。
传统网络的缺点
RNN 不能做并行运算。因为后一层的需要用到前一层的隐藏特征(中间结果),无法独立运算。
传统的 word2vec 训练出的词向量基本不会改变,实际不同词在不同语境表达的含义不同。
Bert 中的词拿过来还会根据语境而改变。
Attention 是使用权重来计算。
Self-attention
Transformer 结构
和大多数seq2seq模型一样,transformer的结构也是由encoder和decoder组成。
- 如何编码
- 输出结果是什么
- attention 的目的
希望让计算机通过上下文来判断,关注的目标是什么。而非人为预加。 - 如何组合
Self-attention
it 在以下两句话中,所代表的内容不同。
计算机
借助三个辅助矩阵(W)
Q: query,要去查询的
K: key,等着被查的
V: value, 实际的特征信息
输入数据,经过三个矩阵,形成了三个特征;
如何计算 self-attention
- q和k的内积,表示有多分配
- 输入两个向量得到一个分值
- K:key,等着被查的
- V:value,实际的特征信息
最终得到的分值,经过 softmax 就是最终上下文结果;
Scaled Dot-Product Attention 不能让分值随着向量维度的增大二增加。
将分值转换为比例:softmax
Attention for Seq2seq Model
encoder 的输入是 m 个向量,
x
1
x_1
x1 到
x
m
x_m
xm;
encoder 把输入的向量信息,压缩到状态向量
h
1
h_1
h1 到
h
m
h_m
hm中;
最后的状态
h
m
h_m
hm 是对所有输入的概括。
decoder 是文本生成器,依次生成状态s;
然后根据状态 s 生成单词;
把新生成的单词作为下一个向量 x’;
如果用 attention,还需要计算 context vector C;
每计算出一个状态s,就计算一个 C;
具体是这样计算C的:
α
i
j
=
a
l
i
g
n
(
h
i
,
s
j
)
\alpha_{ij} = align(h_i, s_j)
αij=align(hi,sj)
把 decoder 当前状态
s
j
s_j
sj 与 encoder 所有m个状态作对比,用 align 函数计算相关性。
每计算一个 C,就要计算 m 个权重
α
\alpha
α。每个
α
\alpha
α 对应一个状态h。
attention 整体计算流程
- 每个词的 Q 会跟每一个K计算得分;
- Softmax 后就得到整个加权结果;
- 此时每个词看的不只是它前面的序列,而是整个输入序列;
- 同一时间计算出所有词的表示结果。
multi-headed 多头机制
-
一组 q、k、v 得到了一组当前词的特征表达;
多组 qkv 得到多组特征表达。 -
类似卷积神经网络中的 filter
能不能提取多种特征呢? -
卷积中的特征图。
-
通过不同的 head 得到多个特征表达;(一般8个)
-
将所有特征拼接在一起;
-
可以通过再一层全连接来降维;(非PCA降维)
multi-headed 结果
不同的注意力结果得到的 特征向量表达不同
堆叠多层
计算方法都是相同的
位置信息表达
在 self-attention 中每个词都会考虑整个序列的加权。
所以其出现位置并不会对结果产生什么影响,相当于 放哪儿都无所谓。
这不符合实际情况,我们希望模型能对位置有额外的认识。
在 embeddings 智商,增加位置编码 postional encoding。
位置编码实现方法有很多,常见的是 增加周期性信号,如正弦、余弦。
残差连接
无法保证新增的一层,比上一层效果好。
如果后一层效果并没有更好,则回到上一层。
多一手准备,至少不比原来差。防止某一层跑偏。
归一化
对层做归一化。
Decoder 端
decoder 输出也是一个序列。
attention 计算不同。
加入了 mask 机制;
mask 机制
decoder 需要预测结果;是一个接着一个往后出答案;
比如,有四个词,前三个词来预测,后面一个当做标签 掩盖起来,就是 mask ,
最终输出结果
- 得出最终预测结果
- 损失函数 cross-entropy 即可
相关资料
- 【NLP】Transformer模型原理详解
https://zhuanlan.zhihu.com/p/44121378 - 王树森系列教程