李宏毅transformer笔记
首先这里解决的问题是Seq2Seq
列出各种场景,语音识别,机器翻译,chatbot
当前现在NLP模型之所以这么重要,在于他的通用能力,很多场景都可以转换成Seq2Seq
summary,情感分析啊,只要你能通过QA和机器交互的场景都可以是Seq2Seq
这里的例子,语法树解析,多元分类,甚至是对象识别
Seq2Seq其实也不是啥新问题,以前都是用RNN来解决的
当然现在都用transformer
Transformer分为Encoder和Decoder
这里看下Encoder,当然这样的encoder可以是各种模型,RNN,CNN都行
对于transformer,可以看出Encoder就是一个self-Attention模型,n2n,输入和输出个数相同
和之前说的标准的Self-attention相比,差异在于
加入residual,每一层都输出都会加上输入,residual的目的主要是在网络过深的时候防止梯度消失
在每层输出都加入layer Norm,这个norm的过程很直觉
至于使用Multi-head,和加入Positional Encoding的目的前面也都说过
Bert的架构和这个完全一样
Encode讲完,看下Decode
Decode有两种,AR和NAR
AR,顾名思义,输出的向量是一个个依次输出的,每次取概率最大的那个,其实就是个分类问题
每个向量输出,作为下个输入
为了能有效结束,需要加入end token
Decoder的结构,不看中间的部分,和Encoder几乎相同
唯一的差别就是,这是用Masked Attention
为何用Masked,这个很直觉,因为在Decode的时候,无法像普通的Self Attention一样看到所有的输出,只能看到之前的
对于NAT,是一次性输入所有的输出向量,这里的问题自然是如何决定个数?训练一个predicter来输出num或者每次都输出些,找到end截断
NAT,会比较高效,但是准确率不行,这就是为何主要还是用AT的decoder
现在把中间的部分补上,这部分叫Cross Attention
在Self Attention中,是看encoder中一个输入和其他输入的Attention Score,即相关度
这里是,decoder根据Begin token生成的向量作为q,计算和Encoder中每个输出向量的Attention Score,用到的是K,V两个向量
所以称为cross Attention,这个输出是由decoder生成的向量,和所有encoder输出向量决定的,影响力由cross Attention score决定
最后看下如何训练,
训练就是看生成向量和训练集中答案算minimize cross entropy
这里需要注意的是,在训练的时候,Decoder输入是正确答案,而不是生成的值;但是测试的时候输入是生成的值
这里产生不一致,称为exposure bias,怎么弥补?方法居然是训练的时候故意给点错误