听课(李宏毅老师的)笔记,方便梳理框架,以作复习之用。本节课主要讲了seq2seq model简介,以及应用,架构(包括encoder和decoder,encoder和decoder之间如何协作),怎样训练transformer,train 时的一些tips。
1. 什么是seq2seq
1.1 简介
sequence-to-sequence(seq2seq)
比如语音识别、机器翻译、语音翻译、语音合成等
输入文字,输出语音
1.2 其他应用
1.2.1 对话机器人
1.2.2 自然语言处理
大多数自然语言处理(NLP)的任务都是QA,将问题和文章输入进seq2seq model 就能得到answer
seq2seq model就像瑞士军刀,可以砍柴什么的,也可以切菜。seq2seq什么都可以做,但是没必要。定制化的模型可能更好
1.2.3 文法剖析
当时的论文把这个文法剖析当做翻译来做的
1.2.4 multi-label classification
与multi-class classification对比:
muli-class classification是选择某个class输出,只输出一个class
multi-label classification是由模型自己选择输出几个标签,比如输入一个电影的类型,可能会输出“悬疑/惊悚”,“喜剧/爱情”,“家庭”等
1.2.5 object detection
识别输出有几种动物
2. seq2seq架构(Transformer)
2.1 整体架构
2.2 encoder
2.2.1 encoder在seq2seq模型中的位置
2.2.2 encoder内部结构
讲一下大致的结构,分为输入,位置编码,N块灰框框里面的东西。
灰框框里面是:
- multi-head attention(实际上就是self-attention)
- add(下面详细讲)
- norm(下面详细讲)
- feed forward(下面详细讲)
一个block是好几层layer做的事情
之前说的那个add,就是下图中的residual connection,就是输入【b+b经过self-intention之后输出的a】形成【a+b】,这个过程叫做residual connection,也就是之前架构图里面的add
norm就是前面写的norm了,这里的norm是layer normalization,跟之前的batch normalization是不一样的。
在batch normalization里,是对不同feature的同一维度进行norm
在layer normalization里,是对同一feature的不同维度进行norm
在进行了add+norm操作之后,再丢入fc network,再进行add+norm
这样一个灰框框里的流程就走完了
2.2.3 小结
所以在encoder里,add&norm指的就是residual connection+layer normalization,而feed forward指的是fully connected network
原始论文的设计不一定是最好的,所以会有其他的encoder架构,也许performance比原论文的encoder架构更好。
2.3 decoder
2.3.1 decoder在seq2seq模型中的位置
2.3.2 decoder内部架构
2.3.3 Autoregressive(AT)
拿中文语音辨识举例:
decoder的输入:encoder的输出作为decoder的输入+BEGIN标识符
这里的BEGIN标识符其实是one-hot vector,就是一维为1,其他维为0
decoder的输出:经过softmax函数之后的vector的size大小为中文中所有字的个数,挑选出概率最大的那个字进行输出。
由于之前进行了softmax函数,所以这些中文字的概率加起来是1
输出第一个字后,再把第一个字当做输入,进而输出第二个字。
但是这样可能造成中途错了一个字之后,把错的字又当成输入输进去,这样就造成了“一步错步步错”。这个问题之后会提到怎么解决
与encoder的对比
那么这里的masked multi-head attention是什么呢?我们来看下它与self-attention的对比:
下图是self-attention的内部结构,可以看到b1是通过a1,a2,a3,a4生成的,但是在masked multi-head attention中,b1是通过a1生成的,b2是通过a1,a2生成的,b3是通过a1,a2,a3生成的……以此类推
self-attention具体计算过程如下:
而masked multi-head attention具体计算过程:
到目前为止有两个问题:
- 后面的回答依赖前面的输出,而前面的输出可能出现错误
- 不知道什么时候停
针对第二个问题(不知道什么时候停),可以采取以下方法来解决:
就像添加BEGIN token一样,我们添加一个STOP token,这个stop token实际上跟Begin token一样,但是一个是在输入,一个是在输出,所以不会搞混,不会存在重复的现象。
2.3.4 Non Autoregressive(NAT)
AT与NAT的对比
最大的一个区别就是AT是串行的,而NAT是并行的,速度更快。
那为什么NAT能做到并行呢?对比起AT来说,NAT的输入不再依赖于前一个输出,而是直接一股脑地将START输入,一次性得到所有输出。
那么就有一个问题:怎么知道输入几个START?
我们有两种方法:
- 另外训练一个classifer,训练为输出是几个START;
- 或者直接输入一个非常长的START序列,END会出现在输出的某个位置,我们直接忽略END后面的输出,只要END前面的。
任何东西都不是十全十美的,NAT虽然速度比AT更快,但是实际上performance比AT要差,这是因为multi-modality(多模态)。李老师没展开讲。但是我大概问了下chatgpt,下面是它的回答:
在Autoregressive(AT)与Non-Autoregressive(NAT)模型的对比中,多模态性可能会对模型的性能产生影响。由于NAT模型通常不像AT模型那样逐个生成输出序列的每个元素,它们更容易受到多模态数据的影响。多模态性可能增加了模型的复杂性,使得NAT模型更难以准确地预测输出序列。因此,一些研究表明,NAT模型在处理多模态数据时表现可能会比AT模型差。
2.4 encoder-decoder(二者的协作)
2.4.1 transformer整体架构
主要有几个概念需要解释:
- encoder提供蓝色的两个输入
- decoder提供绿色的一个输入
这些输入我们在后面会解释分别是什么 - cross attention
如下图所示:
- kv来自encoder,也就是上图中蓝色的两个圈圈
- q来自decoder,也就是上图中绿色的圈圈
qk相乘之后做softmax得α’,再乘上v,所有的v相加即可
这个过程叫cross attention
ps:上图中其实是multi-head attention模块+add&norm=cross attention,但是下图没有表现multi-head,也没有画出add&norm,我觉得可能是为了简介省略掉了。
下一个词同理
当然不是说一定得按encoder的最后一层输出为decoder的输入,encoder里面有那么多层,那也许其中的某些层的输出也能当做decoder的输入
3. Transformer的训练
3.1 输出
正确答案是一个one-hot vector,要让decoder输出的distribution跟ground truth越接近越好。也就是说minimize cross entropy
3.2 输入
在decoder训练的时候,是一个一个单词输出的,训练不是把上一个输出当成下一个输入,而是直接给decoder看正确答案当做输入。当然,最后的END符号decoder也得学习。
这种给decoder看正确答案的方法叫做teacher forcing
4. Tips
4.1 copy mechanism
有一些场景,模型没必要自己产生输出,它们也需要学会从输入中复制的能力。
比如机器对话,提取文献摘要(有些词汇是从文献中直接复制过来的)
4.2 guided attention
前面四种长句子机器能读对,但是最后的短词机器却没有念发这个字,可能训练的时候短句很少
ps:其实不知道为什么这个例子放在guided attention这里,跟guided attention有关系吗?没太懂这个逻辑呢?
在一些任务中,机器训练的顺序是非常重要的,比如语音辨识或者合成。所以产生了guided attention这种方法,固定了训练的顺序。
下图中,红线上面是正确的语序,也就是正确的训练顺序;而红线下面就是错误的训练顺序。
4.3 beam search
假设就只有两种输出,输出A的概率为0.6,输出B的概率为0.4,我们面临路径的两种选择:
- greedy decoding:每一步都选择概率最大的
- 全局最优:可能当前不是最好的,但是全局来看是最优的
- beam search:暴力搜索是不可能的,但是我们发明了一种方法叫beam search,它有时有用,有时没用
比如我们在做sentence completion的任务,用beam search就可能导致重复的话语,表明分数最高的不一定就是最好的,还是要看任务的特性。
在答案比较确定时,比如语音辨识,分数越高越好;
但是在做需要创造力的任务时,比如语句补全,有时加入一些noise可能更好。
实际上,在train时为了让model看过更多的可能性加入noise比较普遍,但是在TTS(语音合成)中,测试时加入一些杂讯反而能得到比较好的结果。
4.4 optimizating evaluation metrics
在decoder训练时,指标是让cross entropy越小,而在验证时需要BLEU scores最高。
然而,cross entropy越小并不代表BLEU scores越高。
所以,挑选最好的model不是挑cross entropy最小的,而是挑bleu scores 最高的。也就是说在validation时,应以bleu scores为指标。
那么可不可以在训练时就让BLEU scores最大呢?
可以,但是很复杂。因为BLEU scores是不能微分的,做不了gradient decent。
4.5 scheduled sampling
之前提到,如果前面的输出错了,可能导致“一步错步步错”,解决方法就是训练时就让它错,减轻exposure bias(曝光偏差)的问题。这就是scheduled sampling