本专栏主
本专栏主要介绍和讲解李宏毅老师最新2021春季机器学习课程相关内容,如有记录错误,或理解不对,欢迎留言批评指正...
youtube课程地址:(实时更新)
ML 2021 Springspeech.ee.ntu.edu.tw/~hylee/ml/2021-spring.html
B站课程地址:
哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibilispace.bilibili.com/13606211?spm_id_from=333.788.b_765f7570696e666f.1
目录:
第一节 机器学习&深度学习介绍
第二节 机器学习攻略
一、机器学习的框架
二、模型训练攻略
三、针对Optimization Issue的优化,类神经网络训练不起来怎么办
(一) 局部最优点和鞍点
(二) 批处理和momentum
(三) 自动调节学习率Learning rate
(四) 损失函数带来的影响
第三节 CNN & Self-Attention
一、卷积神经网络
二、自注意力模型
第四节 Transformer & BN
一、Transformer
二、Batch Normalization
待更新.......
一、Transformer
讲Transformer之前,需要先讲讲seq2seq模型,因为transformer本质上就是一个seq2seq的model,对于一个seq2seq的模型,有下面几种可能的输入输出形式:
输入语音,输出文字(语音辨识,不翻译)
输入文字,输出文字
输入语音,输出文字(语音翻译)
NLP任务中很多问题其实都可以用seq2seq的模型来解决问题,比如下面的语法剖析,输入一段文字,输出这段文字的语法结构:
还有在Multi-label Classification问题上,用seq2seq的方法,让模型自己决定输出多少个类别。
还有就是在目标检测问题上,可以用seq2seq的方法,直接预测出物体的bounding box和class。
seq2seq模型由两个部分组成,一部分是Encoder,还有一部分是Decoder,我们先来看看Encoder部分。
Transformer之Encoder
通常情况下,我们会用RNN或者CNN的方式,对输入进行Encoder,如下所示,通常编码层也会有很多层叠加在一起,即下图中的每个Block,每个Block都是输入一排向量,输出一排向量,而transformer的encoder就是这一个个的Block,只不过它的设计有些特殊,
假如输入是一排vector,输出是一排vector,不过它的输出是先基于self-attention算出每个vector a ,然后采用residual模块得到 a+b ,然后通过Layer Normalization(注意不是batch Normalization),做法是不用考虑batch的信息,而是针对每个vector计算它的mean和standard,然后再标准化输出,然后再经过FC层,这边也会有一层residual层,最后再做一次Layer Normalization得到输出,这个就是整个transformer的encoder的做法(单个Head,多个Head每个Head的做法是一样的),可参考下面两张图。
上面的这种transformer架构设计是最原始的一种,当然也有很多变种,如下图(a)是transformer架构,图(b)是改进后的transformer架构。
2. Decoder之Autoregressive
Decoder要做的事情就是完成模型的最终输出,我们以语音辨识为例,Decoder的输入以Encoder的输出为输入,同时在一开始给定一个【BOS】这样的,类似于开始符这样的special token,然后得到第一个token的输出(向量),然后我们经过softmax的操作得到每个word的分数,然后我们把前面那个word的Decoder输出当做下一个生成word的输入(也就是下图中的“机”字),知道遇到停止符号【EOS】为止,这就是Autoregressive(自回归),这里有个问题就是,其中某一步预测出错都会影响下一步的生成结果。
好,以上讲的是一般情况下的Decoder模型,接下来我们看看Transformer的Decoder部分,先来比较一下Transformer的Encoder部分和Decoder部分的差异,主要的差异就在灰色区域盖住部分,其次是在Decoder部分,attention mask并不是全链接的,而是上三角类型,只能看到前面部分,而看不到后面部分。
3. Decoder之Non-autoregressive
因为autoregressive的方式通常是串行输出,需要知道前一个生成结果,然后再根据前一个生成的结果进行下一个结果的生成,这样通常效率会很低,而NAT就摆脱了这个问题,一次性给入所有的START的输入token,然后一次性输出所有要预测的token,但是这里有个问题,就是不知道输出多长,关于这个问题,有下面两种方法可以解决:
设计一个可以预测输出length的预测器,来告诉Decoder要输出多长
一次性给入Decoder部分很长的输入,然后全部生成,在【EOS】符号处做截断
但是通常情况下,NAT的效果比AT差很多,原因是Multi-modality,更多关于NAT的视频讲解可以参考以下链接:
https://www.youtube.com/watch?v=jvyKmU4OM3cwww.youtube.com/watch?v=jvyKmU4OM3c
4. Transformer 之 Decoder
接下来我们聊聊transformer的decoder是怎么做的,那前面有说,Decoder部分和Encoder部分主要的差别是在中间那块Multi-Head attention部分,这部分在transformer中采用的是Cross-attention,如下图所示,Decoder部分的输出依旧是采用串行的方式输入,(输入方式:会全部给与,但第一次只有START这个输入会去做预测,同时Attention mask保证它看不到后面的单词,当预测完第一个word之后,会把结果作为第二个单词的输入,同样Attention mask只能保证它只能看到前面的单词信息),而Cross-attention的方式就是每次的self-attention的输出都会与encoder部分做attention,然后经过fc层线性层做变换。
关于seq2seq的训练方式,就是采用cross-entropy,但是我们在训练的时候会把正确答案当做Decoder的输入进行预测下一个token,这个方式就是Teacher Forcing,对每个单词都要计算,然后目标就是让这些总的cross-entropy达到最小,在预测的时候是一个一个去预测的。
5. 关于seq2seq模型设计的一些tips
比较有用的就是copy mechanism,guide-attention,Beam search,这部分可以参考我整理的生成模型综述的文章(挖个坑,待补充)
视频最后有讲到,在实际测试的过程中,我们会用到BLEU score作为评判指标,但是在训练的时候,我们则是采用cross-entropy做training的,我们能不能在training的时候直接用BLEU的指标呢,答案是不行的,因为不可导,不过遇到这种情况,遇到optimize不能解决的问题,通常可以用强化学习的方式硬train一发就可以了(口诀),遇到无法optimize的loss function,把它当做是RL的reward把Decoder当做是agnet,把这个问题当做是RL的问题,当然这个比较难了。
二、Batch Normalization
我们在"模型训练攻略"这一节中有讨论到,如果我们模型训练的损失函数在一开始的时候就是比较平滑的,那么模型就不那么容易陷入到局部最优解,也就是说我们希望损失函数的Landaspace 能够越平滑越好。
Honda:李宏毅2021机器学习【week2】:模型训练攻略6 赞同 · 0 评论文章
首先,我们来看一下损失函数曲面出现凹凸不平的原因是什么,假设,现在有一个非常非常简单的model,它的输入是 x1 和 x2 ,模型的输出是 y=w1x1+w2x2+b ,损失函数是 L=Σ(y^−y)2 ,那什么情况下会出现凹凸不平,不太好train的loss呢,一个可能的原因就是, x1 很小, x2 很大,这个时候,当 w1 发生微小的变化的时候, L 也会有一个微小的变化,但是由于 x1 很小,就会导致 L 的变化不是太大,也就是说loss曲面上 w1 方向上曲面的是平滑的,反之 w2 方向上曲面的是陡峭的。
因此,我们会发现,当我们input feature每个维度的值差距很大的时候,就可能产生出loss曲面凹凸不平的现象,那有没有可能我们让不同维度的值都存在一个相同的区间内呢?下面就介绍一常用的方法。通常这类方法有一个专有名词:Feature Normalization
比较常见的做法是对于所有训练资料的feature vector {xi}i=1R ,我们对不同资料的每一维(每一维都是一vector)都进行归一化操作,假设第 i 维的平均值是 mi ,标准差是 σi ,则归一化之后 x~ir←xir−miσi ,对每一维都进行归一化操作,这样的话,每一维最后的平均值都是接近于0,方差都接近于1。
那通常情况下,在深度学习的网络框架下,我们不仅仅需要对输入信号做Feature Normalization,因为层数比较多,每一层做了一次变换,因此对每一层的输出,我们都需要做Feature Normalization,至于Feature Normalization在激活函数之前还是之后都是一样的。
参考下图,我们再来看一下,下图中的每一行都是一个样本资料,图中给了batch=3的情况,假设我们对 z1 做了微小的改动,那本来是只会影响到 a1 的输出,然后由于做了Feature Normalization, μ 和 σ 都会发生相应的变化,这会间接影响到每个 ai 的输出,因此,在做了Feature Normalization之后,每个输入都变得相互关联了,这样的话,我们将所有输入资料和网络看做是一个大的网络,但有时候训练的样本会很多,这个时候就会采用Batch Normalization的方式进行处理, z~i=zi−μσ 。
在Batch Normalization的时候,往往还会多一个步骤,就是会点乘以 γ ,再加上 β , z^=γ⊙z~i+β ,其中 γ 和 β 都是可学习的参数,(这块再补充一下)
那在testing的时候,其实就不需要算每个batch的 μ 和 σ ,在pytorch里面,会自动帮你计算好每个batch下的 μ 和 σ,假如就算出了 t 个batch的 μ 和 σ,那么会先对这 t 个 μ 和 σ取平均,得到 μ¯ 和 σ¯ ,然后通过 μ¯←pμ¯+(1−p)μtσ¯←pσ¯+(1−p)σt
计算出需要存储的 μ¯ 和 σ¯,其中 p 也是超参数,不过一般设定为0.1。
为什么BN会有效呢?
主要的原因还是改变了error surface,使得它不那么崎岖。(这里还可以做些补充)
要介绍和讲解李宏毅老师最新2021春季机器学习课程相关内容,如有记录错误,或理解不对,欢迎留言批评指正...
youtube课程地址:(实时更新)
ML 2021 Springspeech.ee.ntu.edu.tw/~hylee/ml/2021-spring.html
B站课程地址:
哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibilispace.bilibili.com/13606211?spm_id_from=333.788.b_765f7570696e666f.1
目录:
第一节 机器学习&深度学习介绍
第二节 机器学习攻略
一、机器学习的框架
二、模型训练攻略
三、针对Optimization Issue的优化,类神经网络训练不起来怎么办
(一) 局部最优点和鞍点
(二) 批处理和momentum
(三) 自动调节学习率Learning rate
(四) 损失函数带来的影响
第三节 CNN & Self-Attention
一、卷积神经网络
二、自注意力模型
第四节 Transformer & BN
一、Transformer
二、Batch Normalization
待更新.......
一、Transformer
讲Transformer之前,需要先讲讲seq2seq模型,因为transformer本质上就是一个seq2seq的model,对于一个seq2seq的模型,有下面几种可能的输入输出形式:
输入语音,输出文字(语音辨识,不翻译)
输入文字,输出文字
输入语音,输出文字(语音翻译)
NLP任务中很多问题其实都可以用seq2seq的模型来解决问题,比如下面的语法剖析,输入一段文字,输出这段文字的语法结构:
还有在Multi-label Classification问题上,用seq2seq的方法,让模型自己决定输出多少个类别。
还有就是在目标检测问题上,可以用seq2seq的方法,直接预测出物体的bounding box和class。
seq2seq模型由两个部分组成,一部分是Encoder,还有一部分是Decoder,我们先来看看Encoder部分。
Transformer之Encoder
通常情况下,我们会用RNN或者CNN的方式,对输入进行Encoder,如下所示,通常编码层也会有很多层叠加在一起,即下图中的每个Block,每个Block都是输入一排向量,输出一排向量,而transformer的encoder就是这一个个的Block,只不过它的设计有些特殊,
假如输入是一排vector,输出是一排vector,不过它的输出是先基于self-attention算出每个vector a ,然后采用residual模块得到 a+b ,然后通过Layer Normalization(注意不是batch Normalization),做法是不用考虑batch的信息,而是针对每个vector计算它的mean和standard,然后再标准化输出,然后再经过FC层,这边也会有一层residual层,最后再做一次Layer Normalization得到输出,这个就是整个transformer的encoder的做法(单个Head,多个Head每个Head的做法是一样的),可参考下面两张图。
上面的这种transformer架构设计是最原始的一种,当然也有很多变种,如下图(a)是transformer架构,图(b)是改进后的transformer架构。
2. Decoder之Autoregressive
Decoder要做的事情就是完成模型的最终输出,我们以语音辨识为例,Decoder的输入以Encoder的输出为输入,同时在一开始给定一个【BOS】这样的,类似于开始符这样的special token,然后得到第一个token的输出(向量),然后我们经过softmax的操作得到每个word的分数,然后我们把前面那个word的Decoder输出当做下一个生成word的输入(也就是下图中的“机”字),知道遇到停止符号【EOS】为止,这就是Autoregressive(自回归),这里有个问题就是,其中某一步预测出错都会影响下一步的生成结果。
好,以上讲的是一般情况下的Decoder模型,接下来我们看看Transformer的Decoder部分,先来比较一下Transformer的Encoder部分和Decoder部分的差异,主要的差异就在灰色区域盖住部分,其次是在Decoder部分,attention mask并不是全链接的,而是上三角类型,只能看到前面部分,而看不到后面部分。
3. Decoder之Non-autoregressive
因为autoregressive的方式通常是串行输出,需要知道前一个生成结果,然后再根据前一个生成的结果进行下一个结果的生成,这样通常效率会很低,而NAT就摆脱了这个问题,一次性给入所有的START的输入token,然后一次性输出所有要预测的token,但是这里有个问题,就是不知道输出多长,关于这个问题,有下面两种方法可以解决:
设计一个可以预测输出length的预测器,来告诉Decoder要输出多长
一次性给入Decoder部分很长的输入,然后全部生成,在【EOS】符号处做截断
但是通常情况下,NAT的效果比AT差很多,原因是Multi-modality,更多关于NAT的视频讲解可以参考以下链接:
https://www.youtube.com/watch?v=jvyKmU4OM3cwww.youtube.com/watch?v=jvyKmU4OM3c
4. Transformer 之 Decoder
接下来我们聊聊transformer的decoder是怎么做的,那前面有说,Decoder部分和Encoder部分主要的差别是在中间那块Multi-Head attention部分,这部分在transformer中采用的是Cross-attention,如下图所示,Decoder部分的输出依旧是采用串行的方式输入,(输入方式:会全部给与,但第一次只有START这个输入会去做预测,同时Attention mask保证它看不到后面的单词,当预测完第一个word之后,会把结果作为第二个单词的输入,同样Attention mask只能保证它只能看到前面的单词信息),而Cross-attention的方式就是每次的self-attention的输出都会与encoder部分做attention,然后经过fc层线性层做变换。
关于seq2seq的训练方式,就是采用cross-entropy,但是我们在训练的时候会把正确答案当做Decoder的输入进行预测下一个token,这个方式就是Teacher Forcing,对每个单词都要计算,然后目标就是让这些总的cross-entropy达到最小,在预测的时候是一个一个去预测的。
5. 关于seq2seq模型设计的一些tips
比较有用的就是copy mechanism,guide-attention,Beam search,这部分可以参考我整理的生成模型综述的文章(挖个坑,待补充)
视频最后有讲到,在实际测试的过程中,我们会用到BLEU score作为评判指标,但是在训练的时候,我们则是采用cross-entropy做training的,我们能不能在training的时候直接用BLEU的指标呢,答案是不行的,因为不可导,不过遇到这种情况,遇到optimize不能解决的问题,通常可以用强化学习的方式硬train一发就可以了(口诀),遇到无法optimize的loss function,把它当做是RL的reward把Decoder当做是agnet,把这个问题当做是RL的问题,当然这个比较难了。
二、Batch Normalization
我们在"模型训练攻略"这一节中有讨论到,如果我们模型训练的损失函数在一开始的时候就是比较平滑的,那么模型就不那么容易陷入到局部最优解,也就是说我们希望损失函数的Landaspace 能够越平滑越好。
Honda:李宏毅2021机器学习【week2】:模型训练攻略6 赞同 · 0 评论文章
首先,我们来看一下损失函数曲面出现凹凸不平的原因是什么,假设,现在有一个非常非常简单的model,它的输入是 x1 和 x2 ,模型的输出是 y=w1x1+w2x2+b ,损失函数是 L=Σ(y^−y)2 ,那什么情况下会出现凹凸不平,不太好train的loss呢,一个可能的原因就是, x1 很小, x2 很大,这个时候,当 w1 发生微小的变化的时候, L 也会有一个微小的变化,但是由于 x1 很小,就会导致 L 的变化不是太大,也就是说loss曲面上 w1 方向上曲面的是平滑的,反之 w2 方向上曲面的是陡峭的。
因此,我们会发现,当我们input feature每个维度的值差距很大的时候,就可能产生出loss曲面凹凸不平的现象,那有没有可能我们让不同维度的值都存在一个相同的区间内呢?下面就介绍一常用的方法。通常这类方法有一个专有名词:Feature Normalization
比较常见的做法是对于所有训练资料的feature vector {xi}i=1R ,我们对不同资料的每一维(每一维都是一vector)都进行归一化操作,假设第 i 维的平均值是 mi ,标准差是 σi ,则归一化之后 x~ir←xir−miσi ,对每一维都进行归一化操作,这样的话,每一维最后的平均值都是接近于0,方差都接近于1。
那通常情况下,在深度学习的网络框架下,我们不仅仅需要对输入信号做Feature Normalization,因为层数比较多,每一层做了一次变换,因此对每一层的输出,我们都需要做Feature Normalization,至于Feature Normalization在激活函数之前还是之后都是一样的。
参考下图,我们再来看一下,下图中的每一行都是一个样本资料,图中给了batch=3的情况,假设我们对 z1 做了微小的改动,那本来是只会影响到 a1 的输出,然后由于做了Feature Normalization, μ 和 σ 都会发生相应的变化,这会间接影响到每个 ai 的输出,因此,在做了Feature Normalization之后,每个输入都变得相互关联了,这样的话,我们将所有输入资料和网络看做是一个大的网络,但有时候训练的样本会很多,这个时候就会采用Batch Normalization的方式进行处理, z~i=zi−μσ 。
在Batch Normalization的时候,往往还会多一个步骤,就是会点乘以 γ ,再加上 β , z^=γ⊙z~i+β ,其中 γ 和 β 都是可学习的参数,(这块再补充一下)
那在testing的时候,其实就不需要算每个batch的 μ 和 σ ,在pytorch里面,会自动帮你计算好每个batch下的 μ 和 σ,假如就算出了 t 个batch的 μ 和 σ,那么会先对这 t 个 μ 和 σ取平均,得到 μ¯ 和 σ¯ ,然后通过 μ¯←pμ¯+(1−p)μtσ¯←pσ¯+(1−p)σt
计算出需要存储的 μ¯ 和 σ¯,其中 p 也是超参数,不过一般设定为0.1。
为什么BN会有效呢?
主要的原因还是改变了error surface,使得它不那么崎岖。(这里还可以做些补充)