听课(李宏毅老师的)笔记,方便梳理框架,以作复习之用。本节课主要讲了seq2seq model简介,以及应用,架构(包括encoder和decoder)。
什么是seq2seq
sequence-to-sequence(seq2seq)
比如语音识别、机器翻译、语音翻译、语音合成等
输入文字,输出语音
其他应用
对话机器人
自然语言处理
大多数自然语言处理(NLP)的任务都是QA,将问题和文章输入进seq2seq model 就能得到answer
seq2seq model就像瑞士军刀,可以砍柴什么的,也可以切菜。seq2seq什么都可以做,但是没必要。定制化的模型可能更好
文法剖析
当时的论文把这个文法剖析当做翻译来做的
multi-label classification
与multi-class classification对比:
muli-class classification是选择某个class输出,只输出一个class
multi-label classification是由模型自己选择输出几个标签,比如输入一个电影的类型,可能会输出“悬疑/惊悚”,“喜剧/爱情”,“家庭”等
object detection
识别输出有几种动物
seq2seq架构
整体架构
encoder
encoder在seq2seq模型中的位置
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
这样一个灰框框里的流程就走完了
小结
所以在encoder里,add&norm指的就是residual connection+layer normalization,而feed forward指的是fully connected network
原始论文的设计不一定是最好的,所以会有其他的encoder架构,也许performance比原论文的encoder架构更好。
decoder
decoder在seq2seq模型中的位置
decoder内部架构
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一样,但是一个是在输入,一个是在输出,所以不会搞混,不会存在重复的现象。