学习内容
前情提要
Sequence-to-sequence(Seq2Seq)
输入是一个句子,输出长度不定; 下面的第一个是语音辨识,第二个是机器翻译,第三个是语音翻译。这三个都是独立的任务。
第三个是语音翻译,就是语音输入一个国家的语音,最后输出另一个国家的文字; 为什么需要第三个,因为第三个貌似可以根据前两个表示出来,这是因为有些国家的语音是没有文字的,那么这时候就需要语音翻译。
![](https://i-blog.csdnimg.cn/blog_migrate/df90541d520c02768b745954cc5a8673.png)
硬train
我们以Hokkien(台语、闽南语)为例训练网络:
注意语音翻译和语音辨识是不一样的!
![](https://i-blog.csdnimg.cn/blog_migrate/3cb66f42f077261c205ee9a446d2abf9.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a76fb299e2a4f15f36f45ba455a3a479.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3cf809e8d46cb22e55776065f8e709eb.png)
Text-to-Speech 语音合成
我们通过单词解析出kk音节,并将音节送到decoder中解析生成语音。
现在还不是end-to-end的网络。
![](https://i-blog.csdnimg.cn/blog_migrate/91d8f30a76331e7b8072f46331b288f8.png)
Seq2seq for Chatbot
聊天语音机器人。
通过训练数据来教机器人学习回答!
![](https://i-blog.csdnimg.cn/blog_migrate/3a031ca1c50f3eb7d61c5b44d21b2f56.png)
大多数NLP都可以是QA问题
比如阅读理解; 比如摘要; 比如情感分析!而QA问题又可以转为seq2seq问题。
![](https://i-blog.csdnimg.cn/blog_migrate/ecb548403244fe9973a8982ca7e19b7d.png)
深度学习与人类语言处理
但是不是所有的模型都转化为seq2seq,就好像所有都用瑞士军刀一样,切菜、砍柴,它需要一个最合适的模型。
Seq2seq for Syntactic Parsing
文法剖析; 就是将一句话中某些词链接起来就是动词片语、名词片语等等。 名词片语加动词片语就是一个句子等。 模型的输出本来就是一个model tree,但是我们可以把它转化为一个seq2seq。
![](https://i-blog.csdnimg.cn/blog_migrate/2da2cd080eb673ab9d8cbd10b6f28625.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f0f0cedcce91498722ec02e164ae320f.png)
Seq2Seq for Multi-label Classification
注意multi-label不是multi-class,前者是一个物体可以属于多个class,但是后者呢则是一个物体只能属于一个class;
我们设置一个阈值,如果预测的结果大于某个值,那么它就属于该类别,但是这样肯定效果不会好。
所以我们将该问题定义为一个seq2seq问题,让机器自己决定输出几个class
![](https://i-blog.csdnimg.cn/blog_migrate/aac28075913a9391ef0bdcea17140191.png)
Seq2Seq for Object Detection
目标检测同样可以硬解!!
![](https://i-blog.csdnimg.cn/blog_migrate/962f82ba5c85c0dd0e1a31bdbfadcd20.png)
Seq2seq
Seq2seq用途最广泛的就是Transformer!
![](https://i-blog.csdnimg.cn/blog_migrate/e27a8b7baf8e94deeb91afdd180c9a99.png)
Encoder
利用encoder输入一个向量,decoder输出一个向量,而Transformer中使用的是self-attention,右侧是原论文中的结构,不太好理解,我们换一个图;
![](https://i-blog.csdnimg.cn/blog_migrate/ccbe704897292af5725be9a546d67827.png)
这里不称一个Block是一个layer,是因为一个Block里面是有好几个layer在做的事情!
![](https://i-blog.csdnimg.cn/blog_migrate/62a6e98767c60b5d1d8def0db468ed88.png)
![](https://i-blog.csdnimg.cn/blog_migrate/eef782e69fa7963af077a0f7fbed0041.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6edea4496f9dfd5ea496835bd50abb77.png)
![](https://i-blog.csdnimg.cn/blog_migrate/60b05c9ba6010e50546cd4c372605375.png)
我们再次看这个网络!
位置信息需要添加; 里面有三个箭头指的是多个单词! Multi-head Attention指的是self-attention的多头版; Add&Norm值的是残差和Layer Norm;最后再次经过我们上面的说的FC层+norm+残差结构!
结合上图的解释,这里就比较好理解了!
![](https://i-blog.csdnimg.cn/blog_migrate/13d387aa73f7c1f40ab22b532b43b397.png)
To learn more
还是可以创造更多的encoder的! 只需要调整中间的布局
Decoder
Autoregressive 自回归的(以语音辨识作为例子)!
我们通过Encoder之后,将我们的语音转化为vector,并将该vector投入到decoder中产生一段话。
但是怎么产生这一段话呢?
BOS(begin of sentence)
就是在你的lexicon(词典)里面多加一个Token,本来Decoder可能产生的文字里面呢,多加一个特殊的符号,多加一个特殊的文字,这个字就代表了开始,代表了Begin。
对于NLP中的每一个token,都可以把它用一个One-Hot的Vector来表示,所以BOS也是用One-hot来表示。
第一次:
我们的Decoder吐出一个变量,这个变量的大小和vocabulary的大小是一样的,vocabulary是根据你输出的单位而不同的,你要先定义好自己要输出什么。比如我们要输出中文,我们以为它要输出某些常用的3000字的方块字,那么就是3000维度; 比如英文中我们可以是字母,但是字母太少了,我们可以用词汇,词汇太多了,我们使用subword,将英语的词根词尾切出来表示。
所以这里的就是我们要输出的经过softmax后的分布,根据哪个分数最高定义我们的输出得到哪个;
![](https://i-blog.csdnimg.cn/blog_migrate/53d69eb6d8a3753728a4322ddd5d8035.png)
第二次:
这里我们将有两个输入,“begin + 机”
第三次:
这里我们将有三个输入: “begin+机+器”
第四次:
这里我们将有三个输入: “begin+机+器+学”
所以Decoder的输入是上一次的输出;
所以Decoder还是有错误的可能的,一步错步步错 ,也就是Error Propogation! 但是我们现在先无视这个问题!
看一下Decoder内部的结构
![](https://i-blog.csdnimg.cn/blog_migrate/8446ba0c0493c2f6fbd48f36049a8ebd.png)
我们可以看到Encoder和Decoder之间的差异基本在于中间红色框中;
其二呢是Self-attention --》 Masked self-attention
masked self-attention
Self-attention 和 Masked self-attention的差距
只能考虑左边的资讯,不能考虑右边的资讯。
![](https://i-blog.csdnimg.cn/blog_migrate/5d8c8fee31ba0afb6acb84f0fedfc86f.png)
这里的自注意力是先有
b
1
b^1
b1再有
b
2
b^2
b2,是一个一个产生的,self-attention是多产生的;
所以我们并不知道输出的长度是多少,应该是seq2seq。 (语音识别,你是不知道啥时候停止)
所以这就像推文接龙了,需要有人冒险来给出“断”来终止继续往下接!!
![](https://i-blog.csdnimg.cn/blog_migrate/54b1a2147b4accb3eb156834b4929a23.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cb58f3bbf582fbca2e6e94008c80bf0e.png)
所以我们只需要在“习”后面添加一个符号, 在我们学习到这个字后自己会输出一个“END”符号。
Non-autoregressive(NAT)
AT中我们假如要输出一个长度100的,那么AT Decoder需要运行100次; 但是NAT中只需要运行一次即可。但是也有问题,你怎么知道输出的长度呢? 需要自定义一个预测器来预测他的长度。
相比于AT而言优点就是速度要快,可以控制输出长度。
比如在语音合成中,你如果想让视频加速,那么你可以将NAT Decoder中的预测器的输出结果乘以2,那么就会使得Decoder输出更多!使得语音更快。
NAT是一个热门主题,因为NAT的表现还不如AT的好,因为中间有Multi-Modality问题
![](https://i-blog.csdnimg.cn/blog_migrate/fd95a1f092fc3c3336f85a340ff711ea.png)
Encoder和Decoder是如何传递资讯的
Cross-attention
![](https://i-blog.csdnimg.cn/blog_migrate/ba2e88809205c9a8cf69f7ed85584225.png)
![](https://i-blog.csdnimg.cn/blog_migrate/75670e4bcab431aab8caf6a6adcc4601.png)
我们以第二个字符作为例子来进行说明。
Decoder总是拿Encoder的最后一层的结果吗? 原始论文是这样的,但是我们可以不这样,因为Encoder是有很多层的,Decoder也是很多不同的层,那么你可以任意的链接,采用不同层的Encoder的输出。
Training
以语义识别为准,首先准备数据集,让工具人来打标签; 其次我们将做GT标记。 把该任务当作分类任务,最小化交叉熵。
![](https://i-blog.csdnimg.cn/blog_migrate/19a7954f638d2a7905fbdf6247433325.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d368572b4a2b3e6690db7f439285273c.png)
①要使得交叉熵的总和最小
②这里我们每次的输入都是Groundtruth(也就是说不用上一次的输出,而是GT); 所以存在着MisMatch! 怎么解决后面说!
训练的Tips
Copy Mechanism
复制! 没有必要都是产生新的词!
Chat-bot
![](https://i-blog.csdnimg.cn/blog_migrate/79920a36b000995603b7eab70305280e.png)
Summarization
产生摘要。 但是需要上百万的文章,需要文章 + 摘要!更需要Copy功能
![](https://i-blog.csdnimg.cn/blog_migrate/4036a4f23ac4ab7832ae99f87f888c38.png)
Guided Attention
当我们输出比较短的词汇的时候,结果就不会好的
![](https://i-blog.csdnimg.cn/blog_migrate/d1457ad7cb07d886ba1e2b27aee6c8d8.png)
上面中的前几句话都是抑扬顿挫的读! 最后一个甚至直接读了一个字,而没有读“发”!
所以我们怎么让网络读所有的模型呢? 需要用到引导attention!
![](https://i-blog.csdnimg.cn/blog_migrate/7ba68294300fdf7a55763ba9376bb632.png)
对于语音识别而言,我们的attention的顺序应该是确定的,不应该是跳跃的获取的,所以我们要提前定义attention的顺序! 这是强制性的! 而不是根据Attention scores的分数来定义输入!
Monotonic Attention 和 Location-aware attention是两个相关的论文
Beam Search
![](https://i-blog.csdnimg.cn/blog_migrate/87aff57318f9d5238b510d794195a52c.png)
红色的线: 贪婪算法,我们一直选择最好的
绿色的线: 短期内是不好的,但是长时间下去是好的!
相当于读博士,短时间内是难的,但是在长期来说的是好的!
但是我们怎么会预知后面的结果呢? 这就需要我们先去预测,使用Beam Search!
Beam Search有时候有用 ,有时候没用!
但是Decoder是需要有随机性的! 如果是语音识别这种一对一的结果,那么使用Beam Search是最好的! 但是面对那种需要机器发挥点创造力的情况,我们是需要噪音的!
比如语音合成!
![](https://i-blog.csdnimg.cn/blog_migrate/40325d083a961c04ca0df0be4fd42a32.png)
优化的参数
左边:训练的时候使用Cross Entropy
右边: 测试的时候使用的BLEU score,计算两个句子之间的距离
但是我们最后在Validation的时候,并不是选择的loss最小的model,而是使得BLEU分数最大的model;
所以问题是,我们可以不可以直接使用BLEU分数,给它加一个负号,使得它最小就可以了啊。
但是现实是, BLEU分数是不能微分的,你根本没办法算两个句子之间的! 而使用Cross Entropy可以计算单个词之间的距离!
口诀: 遇到你无法用Optimization解决的问题时,用RL硬Train一发就对了;
你无法optimization无法解决的Loss Function时候,把它当作是RL的Reward,把你的Decoder当作Agent,当作RL问题!
Exposure bias
如果我们只是喂正确的词,那么模型是没有处理错误输入的能力的!所以我们需要在训练的时候,给它添加噪音! 这种技术叫做“Scheduled Sampling”。但是它会影响模型的平行化的能力
![](https://i-blog.csdnimg.cn/blog_migrate/bd57c6d41867f2613335a94843cdf90c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1fc736301399c0e159ee96e062ff8b68.png)