李宏毅机器学习(五)Transformer

Sequence-to-sequence(Seq2Seq)

输入是一个句子,输出长度不定; 下面的第一个是语音辨识,第二个是机器翻译,第三个是语音翻译。这三个都是独立的任务。
第三个是语音翻译,就是语音输入一个国家的语音,最后输出另一个国家的文字; 为什么需要第三个,因为第三个貌似可以根据前两个表示出来,这是因为有些国家的语音是没有文字的,那么这时候就需要语音翻译。

硬train

我们以Hokkien(台语、闽南语)为例训练网络:
注意语音翻译和语音辨识是不一样的!

所以我们就做了一个实验,”硬train一发”,不管任何背景音乐、噪音等等因素

后面两个倒装句其实并没有考虑到,所以第三种完全是有可能做到的!

Text-to-Speech 语音合成

我们通过单词解析出kk音节,并将音节送到decoder中解析生成语音。
现在还不是end-to-end的网络。

Seq2seq for Chatbot

聊天语音机器人。
通过训练数据来教机器人学习回答!

大多数NLP都可以是QA问题

比如阅读理解; 比如摘要; 比如情感分析!而QA问题又可以转为seq2seq问题。

深度学习与人类语言处理

但是不是所有的模型都转化为seq2seq,就好像所有都用瑞士军刀一样,切菜、砍柴,它需要一个最合适的模型。

Seq2seq for Syntactic Parsing

文法剖析; 就是将一句话中某些词链接起来就是动词片语、名词片语等等。 名词片语加动词片语就是一个句子等。 模型的输出本来就是一个model tree,但是我们可以把它转化为一个seq2seq。

这篇文章就是这样做的,当时都是用seq2seq做的翻译,所以这篇文章题目才叫将语法作为外文语言这一说法!

Seq2Seq for Multi-label Classification

注意multi-label不是multi-class,前者是一个物体可以属于多个class,但是后者呢则是一个物体只能属于一个class;
我们设置一个阈值,如果预测的结果大于某个值,那么它就属于该类别,但是这样肯定效果不会好。
所以我们将该问题定义为一个seq2seq问题,让机器自己决定输出几个class

Seq2Seq for Object Detection

目标检测同样可以硬解!!

Seq2seq用途最广泛的就是Transformer!

Encoder

利用encoder输入一个向量,decoder输出一个向量,而Transformer中使用的是self-attention,右侧是原论文中的结构,不太好理解,我们换一个图;

这里不称一个Block是一个layer,是因为一个Block里面是有好几个layer在做的事情!

但是在Transformer中使用的是含有残差结构的输出! 不明白残差结构的,建议看看用在图像处理中的Resnet结构,通过加入这个结构之后拯救了深度学习,使得层数再次堆叠!

除此之外,这里的norm并不是batch normalization(BN层),而是layer Normalization(LN层)! 不需要考虑batch的资讯! BN中是不同feature、不同Example、相同dimension来计算mean、standard deviation LN中是同一feature、同一Example、不同dimension来计算mean、standard deviation

所以再次经过右侧后的输出才是整个block的输出!

我们再次看这个网络!
位置信息需要添加; 里面有三个箭头指的是多个单词! Multi-head Attention指的是self-attention的多头版; Add&Norm值的是残差和Layer Norm;最后再次经过我们上面的说的FC层+norm+残差结构!
结合上图的解释,这里就比较好理解了!

还是可以创造更多的encoder的! 只需要调整中间的布局

Decoder

我们通过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后的分布,根据哪个分数最高定义我们的输出得到哪个;

第二次:
这里我们将有两个输入,” begin + 机

第三次:
这里我们将有三个输入: ” begin+机+器

第四次:
这里我们将有三个输入: ” begin+机+器+学

所以Decoder的输入是上一次的输出;
所以Decoder还是有错误的可能的,一步错步步错 ,也就是Error Propogation! 但是我们现在先无视这个问题!

我们可以看到Encoder和Decoder之间的差异基本在于中间红色框中;
其二呢是Self-attention –》 Masked self-attention

Self-attention 和 Masked self-attention的差距
只能考虑左边的资讯,不能考虑右边的资讯。

这里的自注意力是先有b 1 b^1 b 1再有b 2 b^2 b 2,是一个一个产生的,self-attention是多产生的;
所以我们并不知道输出的长度是多少,应该是seq2seq。 (语音识别,你是不知道啥时候停止)

所以这就像推文接龙了,需要有人冒险来给出”断”来终止继续往下接!!

所以我们只需要在”习”后面添加一个符号, 在我们学习到这个字后自己会输出一个”END”符号。

AT中我们假如要输出一个长度100的,那么AT Decoder需要运行100次; 但是NAT中只需要运行一次即可。但是也有问题,你怎么知道输出的长度呢? 需要自定义一个预测器来预测他的长度。
相比于AT而言优点就是速度要快,可以控制输出长度。
比如在语音合成中,你如果想让视频加速,那么你可以将NAT Decoder中的预测器的输出结果乘以2,那么就会使得Decoder输出更多!使得语音更快。
NAT是一个热门主题,因为NAT的表现还不如AT的好,因为中间有Multi-Modality问题

Encoder和Decoder是如何传递资讯的

可以看到Encoder输入到Decoder中有两个!分别是下面的k和v。

我们以第二个字符作为例子来进行说明。
Decoder总是拿Encoder的最后一层的结果吗? 原始论文是这样的,但是我们可以不这样,因为Encoder是有很多层的,Decoder也是很多不同的层,那么你可以任意的链接,采用不同层的Encoder的输出。

Training

以语义识别为准,首先准备数据集,让工具人来打标签; 其次我们将做GT标记。 把该任务当作分类任务,最小化交叉熵。

①要使得交叉熵的总和最小
②这里我们每次的输入都是Groundtruth(也就是说不用上一次的输出,而是GT); 所以存在着MisMatch! 怎么解决后面说!

训练的Tips

复制! 没有必要都是产生新的词!
Chat-bot

Summarization
产生摘要。 但是需要上百万的文章,需要文章 + 摘要!更需要Copy功能

Guided Attention
当我们输出比较短的词汇的时候,结果就不会好的

上面中的前几句话都是抑扬顿挫的读! 最后一个甚至直接读了一个字,而没有读”发”!
所以我们怎么让网络读所有的模型呢? 需要用到引导attention!

对于语音识别而言,我们的attention的顺序应该是确定的,不应该是跳跃的获取的,所以我们要提前定义attention的顺序! 这是强制性的! 而不是根据Attention scores的分数来定义输入!
Monotonic Attention 和 Location-aware attention是两个相关的论文

红色的线: 贪婪算法,我们一直选择最好的
绿色的线: 短期内是不好的,但是长时间下去是好的!
相当于读博士,短时间内是难的,但是在长期来说的是好的!
但是我们怎么会预知后面的结果呢? 这就需要我们先去预测,使用Beam Search!
Beam Search有时候有用 ,有时候没用!

但是Decoder是需要有随机性的! 如果是语音识别这种一对一的结果,那么使用Beam Search是最好的! 但是面对那种需要机器发挥点创造力的情况,我们是需要噪音的!
比如语音合成!

左边:训练的时候使用Cross Entropy
右边: 测试的时候使用的BLEU score,计算两个句子之间的距离
但是我们最后在Validation的时候,并不是选择的loss最小的model,而是使得BLEU分数最大的model;
所以问题是,我们可以不可以直接使用BLEU分数,给它加一个负号,使得它最小就可以了啊。
但是现实是, BLEU分数是不能微分的,你根本没办法算两个句子之间的! 而使用Cross Entropy可以计算单个词之间的距离!
口诀: 遇到你无法用Optimization解决的问题时,用RL硬Train一发就对了;
你无法optimization无法解决的Loss Function时候,把它当作是RL的Reward,把你的Decoder当作Agent,当作RL问题!

如果我们只是喂正确的词,那么模型是没有处理错误输入的能力的!所以我们需要在训练的时候,给它添加噪音! 这种技术叫做”Scheduled Sampling”。但是它会影响模型的平行化的能力

Original: https://blog.csdn.net/qq_35222729/article/details/119383329
Author: 追赶早晨
Title: 李宏毅机器学习(五)Transformer

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/568906/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球