封面图
1 Regression(回归)
1.1 机器学习
机器学习就是让机器具备找一个函数的能力
1.2 不同的函数
- 回归(连续)
- 分类(离散)
- 结构化学习 (StructuredLearning)
1.3 例子
例子:找一个函数,这个函数的输入是youtube上面,youtube后台是我的资讯,输出就是隔天这个频道会有的总观看的次数
1.3.1 写出含有未知参数的函数
,而b跟w是未知的参数,带有未知参数的函数称作模型
1.3.2 定义训练数据的loss
估计预测值和训练数据的值差值,然后将其全部加起来得到总loss,总loss越大越不好
- MAE(mean absolute error)
- MSE(mean square error)
- 如果y和为概率,则使用cross-entropy(交叉熵损失)
1.3.2.1 等高线图
在这个等高线图上面,越偏红色系,代表计算出来的Loss越大,就代表这一组w跟b越差;如果越偏蓝色系,就代表Loss越小,就代表这组w和b越好
1.3.3 优化
为学习率,是一个超参数
1.3.3.1 什么时候停下来
两种情况
- 设定epoch次数
- 理想状态下,loss达到0
1.3.3.2 更新多个参数
1.4 线性模型
1.5 使用非线性模型
1.5.1 sigmoid
1.5.2 使用新模型拟合
通过矩阵运算
再通过激活函数
1.5.3 新模型的优化
1.5.3.1 使用多个batch更新参数
完成所有的batch算作1次epoch
1.5.4 ReLU
1.5.4.1 ReLU的叠加
通过三次ReLU后,loss会下降
1.6 深度
1.7 过拟合
例子中,作为预测模型需要选3层的那个
2 机器学习任务
2.1 模型偏差
选用更加复杂的模型
2.2 如何判断是模型偏差还是优化问题
- 比较不同的模型表现
- 训练一些比较简单的模型
- 在训练集中深层网络无法获得更小的loss,这是一个优化的问题
2.3 过拟合
解决方法:
- 增加训练数据(可以使用数据增强)
- 少参数,或者共用参数
- 少特征
- early stopping
- 正则化
- dropout
2.4 交叉验证
取平均
2.5 Mismatch(不匹配)
mismatch是指训练集跟测试集它们的分布是不一样的
3 神经网络训练不起来怎么办
- 局部最小值(local minima)与鞍点(saddle point)
- 批次 (batch) 与动量 (momentum)
- 自动调整学习速率 (Learning Rate)
- 损失函数 (Loss) 也可能有影响
- 批次标准化 (Batch Normalization) 简介
3.1 局部最小值(local minima)与鞍点(saddle point)
不仅仅只有在局部最小的时候才会出现梯度为零的情况,也有可能是鞍点(上图鞍点,左右为最低点,但前后为最高点)
3.1.1 如何知道是局部最小还是鞍点?
3.1.1.1 Tayler Series Approximation(泰勒级数近似法)
其中g是梯度,H为海瑟矩阵,整个第三项在加上gradient后就真正抵消了L(θ')与L(θ)之间的差距。H里放的是L的二次微分
当来到驻点(critical point)时,g项为0,只剩下后面一项,通过这一项可以判断是local min、local max还是saddle point
上述的三种情况,在线性代数中,如果对所有的v,都大于零,那这种矩阵叫做positive definite(正定矩阵),这类矩阵的所有的eigen value(特征值)都是正的
- 如果你发现海瑟矩阵的所有特征值都是正的,即,也就代表这是一个local minima
- 如果hessian metric的所有特征值都是负的,即,也就代表这是一个local maxima
- 那如果特征值有正有负,那就代表是saddle point
3.1.1.2 例子
举一个极其简单的例子,函数,只有一条数据x=1,,可以得出误差曲面,计算loss,计算出海瑟矩阵,然后计算其特征值,发现是有正有负,说明,对应的点是鞍点
因为从中心到左上角和右下角都是loss增加,中心到左下角和右上角是loss减少可以达到minima
3.1.2 如何解决鞍点问题
沿着为负的方向更新参数,按照之前的例子,顺着为负的特征向量u的方向更新参数(但实际过程中,几乎没有使用这种方法去做,因为要二次微分,涉及到的运算量巨大)(介于实际情况,所以只是提供一个思路证明鞍点问题并没有那么困难解决)
3.1.3 鞍点vs局部极小值
每个点代表一个训练模型的结果,卡在驻点的时候,绘制到图上,可以看到几乎不会达到局部最小值,横轴为正的特征值/所有的特征值的比值(全正代表是局部最小值,有正有负代表鞍点)
所以几乎不会达到局部最小值
3.2 批次 (batch) 与动量 (momentum)
3.2.1 优化中的batch
不会拿所有的数据算出loss,而是一个一个batch算出loss更新参数,所有的batch算作一个epoch(注:每个epoch的时候batch是会打乱(shuffle)的)
3.2.2 为什么要用batch
使用整个数据,更相信速度慢但稳定;使用batch,更新比较快,但是不稳定
由于GPU可以平行运算,较大的batch_size会更有效率
3.2.3 大的batch vs 小的batch
实验证明大的batch效果会更差,原因是优化问题
- 小的batch会有更好的表现
- “噪声”更相信在训练中更有帮助
原因:大的batch更新时,对L梯度下降,有可能卡在saddle point就停止了。小的batch更新时,每个Loss都不太一样,比如L1算梯度时,梯度为0卡住了,但对L2算梯度可能不会卡住,可以继续更新
3.2.4 在测试集上的结果
由于训练集和测试集的分布可能有些许差异,平滑的沟壑为小的 batch训练得来的loss,而悬崖式的loss为大的batch带来的,分布有偏移或者差异时,Flat minima表现会更好
3.2.5 比较结果
3.2.6 动量
不仅仅沿着梯度方向更新,而是沿着动量和梯度同时考虑更新
3.3 自动调整学习速率 (Learning Rate)
3.3.1 Root Mean Square
动态调整学习率,梯度小,学习率就大,梯度大,学习率就小
3.3.2 RMSProp
是一个超参,判断哪个梯度比较重要
3.3.3 Adam
Adam 为 RMSProp + Momentum
3.4 损失函数 (Loss) 也可能有影响
3.4.1 分类
softmax和sigmoid在二分类上效果是一模一样的
最小化交叉熵等价于极大似然估计,其中极大似然估计:我们有若干未知的参数 ,现在想对其进行估计,那么抽取一个样本 ,计算在参数 下这个样本被抽取出来的概率。这个概率是参数 的函数,称之为似然函数,当似然函数(或对数似然函数)取到最大值时,对应的参数值就是我们的估计值
参考
交叉熵比均方误差(MSE)更常用在分类上
3.5 批次标准化(Batch Normalization)简介
一种将误差曲面弄得平坦的技术(有理论也有实验的支持)
3.5.1 算出均值和标准差
3.5.2 一个值的变化会引起最后结果值的变化
只会算每个batch中的均值和标准差,所以叫batch normalization,适用于batch比较大的时候
3.5.3 可以学的参数
3.5.4 在没有一个batch的情况下,测试集上做BN
实际情况下,可能达不到一个batch的时候就要做BN(pytorch已经处理好了)
解决方法:训练的时候得到的t个均值使用上述的更新
$$
\bar{\mu} = p \bar{\mu} + (1-p) \mu^2
\bar{\mu} = p \bar{\mu} + (1-p) \mu^3
$$
最后使用替代测试集上的均值和标准差
4 CNN
4.1 卷积过程
有多少个filter就会产生多少个channels
4.2 下采样
4.3 有的不适合pooling
举了Alpha Go的例子
5 self-attention
1 动机
帮助目前词考虑整个上下文的信息
图中的两个saw,一个是动词,一个是名词,可能跟人较近的是动词,较远的是名词
2 自注意力结构
2.1 多层注意力
也可以将上次层的注意力输出当做输入,输入到下个自注意力层中,FC为全连接层
2.2 考虑上下文
例如是考虑了所有的a才生成出来的,以此类推
3 自注意力计算
3.1 计算相关性
计算与其他上下文哪些是重要的,哪些跟判断是哪个label是有关系的
采取以下计算方式,点乘的方式等:
同时还有以下方法计算相关性
$$
\operatorname{attn}(\boldsymbol{q}, \boldsymbol{k})=\left{\begin{array}{l}
\boldsymbol{w}^{\top} \tanh (\boldsymbol{W}[\boldsymbol{q} ; \boldsymbol{k}]) ;多层感知器\
\boldsymbol{q}^{\top} \boldsymbol{W} \boldsymbol{k} ;双线性\
\boldsymbol{q}^{\top} \boldsymbol{k} ;点积\
\frac{\boldsymbol{q}^{\top} \boldsymbol{k}}{\sqrt{d}} ;避免因为向量维度d过大导致点积结果过大
\end{array}\right.
$$
3.2 注意力分数
针对于当前词,自己与(需要学习)相乘生成一个作为query查询,其他的词与(需要学习)相乘生成一个作为key,两者相乘得到注意力分数(一般也会和自己的相乘)
得到分数进行softmax,softmax也可以是其他方法,比如说ReLu等,但通常用softmax
3.3 抽取信息
针对于当前词,自己与(需要学习)相乘生成一个作为value,然后与注意力分数相乘再做sum得到
结论:如果和关联性很强,与的结果将会很接近
3.4 注
如果注意力矩阵过大,可以选择缩小范围,不注意整句话
4 拼起来计算
4.1 计算Q、K、V
为了计算方便,将词的序列拼起来得到I与W相乘,得到Q、K、V
4.1 计算注意力分数
4.2 计算结果b
4.3 计算总结
其中、、需要学习
5 多头注意力
得到的b再和相乘得到最终的
多头操作与多分支卷积(TextCNN模型)技术非常相似。按照多分支卷积的角度来理解,多头注意力机制可以被解释为:
(1) 每一次的注意力机制运算,都会使原数据中某个方面的特征发生注意力转换(得到局部注意力特征)
(2) 在进行多次注意力机制运算后,会得到更多方向的局部注意力特征
(3) 将所有的局部注意力特征合并起来,再通过模型将其转换为整体特征,从而达到拟合的效果
6 位置编码
除了sin、cos以外,还可以以其他学习的方式计算位置编码,比如RNN等
7 与RNN区别
RNN很大部分可以被self-attention取代
- self-attention考虑到了整个input,RNN只考虑了左边输入的input,虽然可以有双向RNN,但是考虑最两边的input很困难,但是对于self-attention,只要最左边输入一个query,最右边输入一个key,就可以轻易地抽取信息
- RNN无法平行化处理,self-attention可以,所以更有效率
8 其他
对比CNN,CNN可以看做简化版的self-attention
其他扩展
6 Transformer
1 简介
Transformer是一个Seq2seq的模型,事实证明很多任务都可以用Seq2seq的方法硬解
2 Encoder
Encoder包含了很多Block
2.1 Block架构
2.2 Block细节
输入进行了self-attention得到a,做残差得到a+b,再进行layer norm得到结果(深蓝色),做完全连接再做残差,再进行layer norm得到一个Block的输出结果
2.3 layer norm
输入一个向量,输出一个向量,计算input的平均值m和标准差,通过公式求出结果(上图)
2.4 最终结构
2.5 扩展
注:可能有更多不同的架构对Transformer进行改进
3 Decoder
有两种decoder
4 Autoregressive(自回归) Decoder
将Encoder的输出加上BOS(begin)加入到Decoder中,再把输出当成接下来的输入
4.1 Decoder结构
4.2 Masked Self-attention
只能考虑当前和之前的输入的信息,计算的时候也同理
decoder是一个个产生的,只能考虑之前的信息,所以mask
4.3 输出长度
由于输入长度和输出长度不是相同的,且输出长度未知,所以需要加入stop token
一般BEGIN和END的标志是一样的
5 Non-autoregressive(NAT) Decoder
1.如何计算NAT decoder的输出长度?
- 其他的分类器来决定输出长度(分类器输出一个数值)
- 输出一个非常长的序列,用END截断
2.优势:平行计算,可控输出长度
3.效果不如AT
参考
https://www.youtube.com/watch?v=jvyKmU4OM3c
6 Encoder与Decoder的传递
Cross attention
将mask的self-attention作为query去计算
剩下的同理
7 训练
计算交叉熵损失,使得损失最小,且将答案作为输入(Teacher Forcing)
Teacher Forcing
每次不使⽤上⼀个state的输出作为下⼀个state的输⼊,⽽是直接使⽤训练数据的标准答案(ground truth)的对应上⼀项作为下⼀个state的输⼊
8 训练的Tips
不仅限于Transformer,针对于Seq2Seq模型训练的Tips
8.1 复制机制(Copy Mechanism)
例如聊天机器人中,从使用者的对话中复制一些词汇;文章摘要等
8.2 Guided Attention
要求机器做attention时有固定的方式
例如语音合成时,attention需要有固定的顺序,而不是跳着进行
8.3 Beam Search
需要创造性(随机性)的任务不适合
8.4 使用BLEU score
BLEU score是判断两句话
学习的时候是一个字一个字的做交叉熵损失
8.5 scheduled sampling
会在测试时加入一些错误(噪声)
7 生成式对抗网络(GAN)
7.1 生成网络基本概念(Generation)
输入x + 简单分布z ——生成——> 输出y(复杂的分布)
7.1.1 为什么输出是一个分布
例子中的吃豆豆的主角某些情况下会往左走,某些情况下会往右走,所以让网络输出不再是一个单一的输出,而是输出一个概率
例如:z为一个二值变量,z采样为1的时候向左转,z采样为0的时候向右转
7.1.2 什么时候需要的是一个分布
特别是任务需要创造力的时候,例如:绘画、对话
7.2 生成式对抗网络(Generative Adversarial Network)(GAN)
7.2.1 unconditional generation
没有输入x,只有普通的分布z输入到generator中,所以采样到不同的z会生成不同的图片
7.2.2 Discriminator 鉴别器(需要训练)
例如输入一个图片,通过Discriminator(也是一个NN),输出是一个数字,数字越大输出越真实
注:generation和discriminator都是NN,架构都可以自己选定,可以用CNN也可以用Transformer等
7.2.3 例子
首先生成器v1用随机的初始参数生成一组图片,鉴别器v1去分辨,生成结果;生成器调整后成为v2,鉴别器v2再去分辨,生成结果,以此往复
7.2.4 算法细节
生成器和鉴别器是两个NN
7.2.4.1 第一步
- 初始化NN的参数
- 固定住生成器G,更新鉴别器D
采样以后,可以用分类的问题来做,也可以当做回归的问题来做
7.2.4.2 第二步
更新生成器G,固定住鉴别器D
7.2.4.3 反复执行
7.2.4.4 结果
7.2.5 机器可以生成图片
7.3 理论介绍与WGAN
7.3.1 目标函数
通过正常分布采样的数据vector交给生成器,生成器生成,而为真实的数据分布,目标函数即为最小化两者的差异
7.3.2 采样
虽然我们不知道两个分布,但是我们可以从中采样。所以我们从普通分布中采样一些vector给生成器得到,从数据中采样
7.3.3 鉴别器鉴别
真实的数据给高分,生成的数据给低分
使用JS散度(JS divergence)去计算
7.3.4 训练
差异较大时,目标函数较小,反之较大
7.3.5 最终目标函数
GAN不太容易训练
7.3.6 GAN训练技巧
起初的GAN我们需要最小化JS散度(JS divergence)
7.3.6.1 JS散度是不合适的
- 大部分情况,和重合的部分都很少,重合部分可以忽略
- 假如和,如果两个分布采样的点不够多,重叠的部分也会很少
7.3.6.2 JS散度的问题
准确率或者loss对于GAN训练没有参考意义
7.3.6.3 Wasserstein distance(计算两个分布之间的距离)
使用Wasserstein distance取代JS散度(JS divergence)
7.3.7 WGAN
D为足够平滑的函数,公式为真实数据的期望 - 生成数据的期望,目标函数max的值就是Wasserstein distance
7.4 生成器效能评估与条件式生成
7.4.1 用GAN生成文字
在decoder参数有小的变化时,输出的分布也会有小的变化,但是max的token是同一个,所以discriminator输出结果是不会变化的,造成无法梯度下降(一般无法用梯度下降的问题,就可以用强化学习RL)
但是RL本身是很难训练的,GAN也是很难训练的
7.4.2 完整参考
7.4.2.1 生成模型
https://www.youtube.com/playlist?list=PLJV_el3uVTsMq6JEFPW35BCiOQTsoqwNw
7.4.2.2 VAE
7.4.2.2 FLOW-based Model
7.4.3 生成器评估
7.4.3.1 人工评估
以生成图片为例,人工评价是一种方法,另外一种方法是将图片输入到一个图片分类器中,结果如果是集中的分布(某个分类几率较大),效果越好
7.4.3.2 差异 - mode collapse(模式坍塌)
指的是生成器产生的结果很单一,仅仅只是为了得到最低的判别器损失loss,却忽视了数据集的分布
7.4.3.3 差异 - mode dropping
生成的总是几种模式变化,不具有太多的多样性
7.4.3.4 如何评估多样性
- 丢入分类器,相加后求平均,如果比较集中则多样性不够,如果平坦则多样性足够
- 使用Inception Score(IS)为评价指标,质量高,多样性多,则IS越大
- 存在问题(例如产生的图片头发颜色不同,但人脸是一样的,这样多样性并不大),所以使用(Frechet Inception Distance)FID为评价指标,越小越好
7.4.4 生成GAN可能存在的问题
生成的图片和真实的图片相同或者相似,所以评估是比较困难的,评估方法可以参考[链接][89]
7.5 条件式生成(Conditional Generation)
7.5.1 文字生成图片过程
比如在文字到图片的这种方式中,x为一段文字
训练
不仅仅要输入y,还要输入x,Conditional GAN一般是需要有训练标注的
(比如:(red eyes, [图片])label1)
7.5.2 图片生成图片过程
7.6 Cycle GAN
如何在非监督学习上进行
例子:图片风格转换,输入一堆x,输出一堆y,x和y不是成对的,x为一个领域的分布,y是另外一个领域的分布
7.6.1 Cycle GAN
因为没有成对的label(类比conditional GAN),且输出需要和原有的x产生关联,所以使用Cycle GAN
还原的结果和最初的输入越相似越好
也可以是双向的
8 自监督学习(Self-supervised Learning)
8.1 芝麻街的模型
参数规模
模型 | 参数大小 |
---|---|
ELMO | 94M |
BERT | 340M(3.4亿的参数) |
GPT-2 | 1542M |
Megatron | 8B(80亿的参数) |
T5 | 11B |
Turing NLG | 17B |
GPT-3 | 175B |
8.2 BERT简介
BERT网络结构是多层transformer Encoder叠加
8.2.1 自监督学习
注:可以看做是一种非监督学习的方法(因为没有label),但由于非监督学习是一个大的类别,里面有很多不同的方法,为了更加明确,所以将这种方法叫做自监督学习
监督学习是有label的,自监督学习是将输入分成和,将输入到模型中得到y,让y与越接近越好
8.2.2 训练BERT的两个任务
BERT为Transformer架构的Encoder部分
8.2.2.1 Masked Language Modeling (MLM)
随机的将一些输入的token进行mask(用mask token代替或者用随机的字代替),将对应被mask的输入所产生的输出通过一个线性模型再经过softmax得到一个分布,这个分布是所有元素的分布
然后使用一个真实的one-hot向量与分布计算cross entropy loss,实际上是做一个分类的问题,将盖住的地方分到“湾”这个类别,类别数目为所有汉字的数目
注:BERT的参数和线性模型的参数都需要训练
8.2.2.2 Next Sentence Prediction(NSP)
输入一段话,将开头加入[CLS],用[SEP]将两句话分隔开,只看[CLS]的输出,如果两句话是相邻的就输出yes,否则是no,由于这个任务较为简单,所以大家认为BERT没有学到什么内容(没用)
但是后面的工作SOP这种方法(应用在ALBERT上),分辨是“句子1,句子2”这种顺序还是“句子2,句子1”这种顺序,这种方法是有用的
8.2.3 如何使用BERT
训练的时候的两个任务
- Masked token prediction(mask一些词汇,将mask的token补回来,“做填空题”)
- Next Sentence Prediction(预测两个句子能否接在一起)
可以通过微调(Fine-tune)进行下游的任务,甚至这些任务跟“做填空题”没有关系,但BERT可以做各式各样的下游任务(例如胚胎干细胞能分化成心脏细胞,肌肉细胞等),但需要一些标注数据
产生BERT的自监督学习叫做预训练(Pre-train)
8.2.4 任务集GLUE
例如将BERT分别微调在这些任务上,得到这些任务的表现
8.2.5 BERT的使用-case1
输入为一个序列(sequence),输出是一个类别,例如:情感分类任务,将一个[CLS]和序列进BERT,拿到[CLS]的输出,通过线性模型,再softmax得到一个类别
注:线性模型是随机初始化参数,但是BERT的参数不是随机初始化的,而是用会“做填空题”的参数当做初始化的参数
各个任务上的结果表示,pre-train的参数比随机初始化参数的效果更好
pre-train加下游任务fine-tune是半监督学习(semi-supervised learning)
8.2.6 BERT的使用-case2
输入为一个序列(sequence),输出是一个序列,例如:词形标注任务,将一个[CLS]和序列输入进BERT,拿到每个token的输出,通过线性模型,再softmax得到一个标注类别
8.2.7 BERT的使用-case3
输入为两个序列(sequence),输出是一个类别,例如:自然语言推理任务,前提和假设输入进模型,模型判断前提和假设是否是矛盾的,将一个[CLS]一个[SEP]和两个序列输入进BERT,只拿到[CLS]的输出,通过线性模型,再softmax得到一个类别,类别是矛盾的还是不矛盾的
8.2.8 BERT的使用-case4
例如问答系统任务,输入是一个文章序列D,和问题序列Q,如果是中文的话,序列为每个字,输出为两个数字s,e,答案就是两个数字所对应的文字片段
随机初始化两个向量,维度是和BERT的输出是一样的,做内积,再做softmax,记录对应的位置即可
注:BERT的输入长度理论上没有限制,但实际上有,但是要做self-attention,运算较大,所以一般最大输入长度为512
8.2.9 训练BERT
8.2.9.1 训练BERT是很困难的
训练数据有30亿个词
8.2.9.2 BERT胚胎学(BERT的训练细节)
https://arxiv.org/abs/2010.02480
观察BERT训练的时候做了些什么(结论是反直觉的)
8.2.10 pre-train seq2seq 模型
对于Encoder的输入进行扰动(corrupted),期望Decoder输出的句子和扰动前的句子是一样的,train下去就是一个seq2seq 模型
扰动(corrupted)的方法:可以盖起来,弄乱,删除等
8.3 为什么BERT能work
8.3.1 词向量相似度计算
输入一串文字,输出一串embedding向量,BERT可以考虑上下文,比如说“喝苹果汁”和“苹果电脑”的“果”的词向量是不同的
例子:选5句和苹果(水果)相关的,选5句和Apple相关的,计算相似度出一个矩阵,黄色的值是越大,发现前5个果和前5个果的相似度较高,后5个果和后5个果的相似度较高,而前5个果和后5个果的相似度低
结论:输出的结果就可以代表mask的那个字的意思,BERT产生的词向量实际上是一个deep的CBOW,并且同一个词汇不同上下文对应的词向量不同,抽取出来的词向量又叫做Contextualized word embedding
8.3.2 BERT其他的变形
[BERT(Part1)][120]
https://youtu.be/1_gRK9EIQpc
[BERT(Part2)][121]
https://youtu.be/Bywo7m6ySlk
8.3.3 多语言的BERT(Multi-lingual BERT)
实验发现,BERT中语言与语言之间存在联系
8.4 GPT
GPT是一种Transformer的Decoder,是做masked-attention
GPT就是输入一个token,预测下一个token,然后通过一个线性模型,softmax后求交叉熵损失
8.4.1 使用GPT
例如:做翻译,有“Few-shot Learning”,“One-shot Learning”,“Zero-shot Learning”,且没有调参,但正确率较低
8.4.2 更多的参考
[链接][127]
https://youtu.be/DOG1L9lvsDY
9 自编码器(Auto-encoder)
Auto-encoder为self-supervised一种方法
不需要任何的标注
9.1 Auto-encoder
过程:将一张图片(或者是向量)输入到encoder中得到一个向量再通过decoder进行重建(reconstruction),思想是和Cycle GAN是一样的;中间的这个向量(降维后,一般维数较小)一般叫做embedding,representation,code等
下游任务:将中间的向量作为新的输入用作下游任务
降维参考:[PCA][https://youtu.be/iwh5o_M4BNU],[t-SNE][https://youtu.be/GBUEjkpoxXc]
9.2 为什么使用Auto-encoder
例子:图片的变化是有限的,例如只有两种类型的图片就能用2维的向量所表示
9.3 De-noising Auto-encoder
加入噪音后的Auto-encoder,目标是加入噪音前和decoder重建后的尽可能相近
BERT实际上也是一个加噪声后的auto-encoder
9.4 Feature Disentangle
由于一个降维后的vector的所有信息(例如:图片包含目标、纹理;文本包含句法、语义等)纠缠在一个向量里面,如何分辨出哪些维度代表哪些内容,这个技术就是Feature Disentangle
9.5 Feature Disentangle的应用
变声器的例子
可以通过Feature Disentangle找出某些维度代表文字,某些维度代表说话的特征,只需要把两者结合起来就可以得到结果
9.6 discrete latent representation(离散潜伏式表示)
中间的vector可以是二值,或者独热向量
9.6.1 VQVAE(vector quantized variational auto-encoder)
有一个codebook,里面是学到的向量集(实际上就是限定了取值范围),将encoder得出的vector与向量集中的向量做相似度,找到最相似的vector作为decoder的输入
9.6.2 Text as Representation
例如做文本摘要,是一个文档输入,中间为一个序列交给GAN的discriminator,同时交给decoder输出,实际上整个过程就是一个cycle GAN
结果:
9.6.3 Anomaly Detection(异常检测)
对比输入和重建的输出区别
异常检测参考
- Part 1: https://youtu.be/gDp2LXGnVLQ
- Part 2: https://youtu.be/cYrNjLxkoXs
- Part 3: https://youtu.be/ueDlm2FkCnw
- Part 4: https://youtu.be/XwkHOUPbc0Q
- Part 5: https://youtu.be/Fh1xFBktRLQ
- Part 6: https://youtu.be/LmFWzmn2rFY
- Part 7: https://youtu.be/6W8FqUGYyDo
10 Adversarial Attack(恶意攻击)
10.1 动机
是否我们的神经网络具有鲁棒性,识别欺骗的行为(例如垃圾邮件分类)
10.2 攻击例子
一张图片,分解成一个向量,向量每个维度都加上小的噪声(一般小到肉眼不可见),攻击方有两类target
- Non-targeted,只要答案不是猫
- Targeted,输出不是猫且是海星
加入噪声后被resnet识别成为了海星
两张图片相减乘以50倍,就变为了噪声
加入了肉眼课件的噪声,网络却可以给出相应有根据的答案
10.3 如何攻击
分为两种方式,无目标和有目标攻击,Non-targeted 希望输出与cat的分布越远越好(红线),Targeted 希望输出与目标(例如fish)越近越好,也是解一个优化问题(其中,与小于一个数值,人们就不可观察,与是不同的输入)
10.3.1 计算与的距离
与为图片,为向量,可以用L2-norm,L-infinity(计算变化最大值)
注意:上部的图片是每个pixel都进行了小的改变,下面的图片是右下角的pixel进行了大的改变,结果是L2-norm计算是相同的,下面图片的L-infinity更大,所以在训练时,要使得L-infinity越小越好
10.3.2 训练
11 Explainable ML(机器学习模型的可解释性)
12 领域自适应
13 强化学习(Reinforcement Learning,RL)
当人类也不知道正确答案是什么的时候,适合用RL,机器知道哪一步是合适的
13.1 什么是RL
13.1.1 第一步:Function with unknown
以空间入侵游戏为例:
输入的是游戏画面,Actor为Policy Network,输出是不同行为的概率(不是取最大的,而是随机采样,相同的输入可能有不同的输出,输出具有随机性)
13.1.2 第二步:定义损失函数
看到一个游戏画面会产生行为然后会产生游戏的reward,再接下去另一个游戏画面输出行为,一直持续到游戏结束,将所有的reward相加,并且最大化reward,RL的loss函数为负的Total reward
13.1.3 第三步:Optimization
环境env会产生一个observation为s1,s1输入给actor,actor会给出一个动作(action)a1(a1为采样出来的),通过s1和a1通过reward函数产生得分r1,总的损失函数就是让R(t)越大越好(其中Actor是Network,Env和Reward是黑盒子)
14 机器终身学习(Life Long Learning,LL)
15 神经网络压缩(Network Compression)
动机:将机器学习模型部署在资源有限的环境下
15.1 网络剪枝(Network Pruning)
15.1.1 概念
动机
由于网络中的参数有些是冗余的,减掉Network中的一些没有用的参数
如何评估要修剪的内容
- 参数(weight):评估绝对值(绝对值越大的可能对整个Network的影响越大),life long等方法
- 神经元(neuron):例:神经元输出不为零的次数
修剪之后
修剪之后对神经网络会有损伤,准确率会掉,需要重新训练一下,可以再评估一次,根据情况,是否需要再次修剪
注:下面几种压缩模型的技术并不是互斥的,可以同时使用
15.1.2 参数剪枝
在实现中,难以完成,因为一般定义都是多少个输入多少个输出,而且不方便用GPU加速,因为GPU加速实际上加速的是矩阵的运算,不规则的不容易实现。所以实际上不是纯剪掉,而是将减掉的分支置0,但Network并没有减小
结果
实验证明,参数的剪枝会使得训练的速度变慢
15.1.3 神经元剪枝
好实现,只需要修改层的维度即可
15.1.4 为什么剪枝,为什么不直接训练一个小的网络
答案
因为大模型会好训练一些,如果直接训练小的模型,往往准确率都会很低,达不到从大模型剪枝到小模型的准确率
大乐透假说
大的网络可以看做由小的网络组成,大的网络训练完成实际上是小的网络(sub-network)训练完成
剪枝后相同规模的小模型X,如果随机初始化X的参数,直接训练是训练不起来的,如果X初始化大模型对应的参数,就可以训练起来,使用大乐透假说可理解为保留的红色的参数是可训练起来的子网络
其中,假说证明,是否改变weight的正负号是是否能够初始化参数的关键
15.2 知识蒸馏(Knowledge Distillation)
15.2.1 概念
由一个老师模型(Teacher Net)和学生模型(Student Net)组成,学生模型直接学习老师模型的输出分布,越接近越好
老师模型不必是一个模型,也可以是集成模型,成百上千的模型的综合输出分布交给学生模型进行学习
15.2.2 温度
在分类任务中,网络的最后一般有个softmax函数,在知识蒸馏中,对softmax进行调整,Temperature,一般是一个大于1的数,它的作用是使得Teacher Net输出的属于各个类别的置信度更加接近(因为直接让学生模型学1,0,0的标签和直接自己学没有区别)
15.3 量化参数(parameter quantization)
15.3.1 概念
- 使用更小的存储去表示一个值(例:16bit改成8个bit)
- 权重的聚类
相近数值的权重使用一个平均替代,进而压缩结果
3.常用的使用更少的bit表示,不常用的用更多的bit表示(比如哈夫曼编码)
4.采用binary connect来设置权重,即权重都是+1或者-1
15.4 结构设计(architecture design)
15.4.1 概念
调整神经网络的架构设计,减少所需要的参数数量(在实战中最有效的做法
- depth separable convolution
- squeezeNet
- mobileNet
- shuffleNet
- Xception
15.4.2 depth separable convolution
普通的卷积以及dsp
结果参数对比
扩展:减少参数常用的做法
最终输出
15.4.3 其他方法
- [SqueezeNet][https://arxiv.org/abs/1602.07360]
- [MobileNet][https://arxiv.org/abs/1704.04861]
- [ShuffleNet][https://arxiv.org/abs/1707.01083]
- [Xception][https://arxiv.org/abs/1610.02357]
- [GhostNet][https://arxiv.org/abs/1911.11907]
15.5 动态计算(dynamic computation)
15.5.1 概念
希望神经网络自由调整运算量
15.5.2 动态深度或者宽度
首先训练一个多重分类器,然后在选择其中某一层的输出根据不同的环境情况作为最终的分类器
16 元学习
元学习(Meta Learning):学习如何去学习,learn to learn
16.1 机器学习总结
找一个function
16.1.1 定义一个带有未知参数的函数
16.1.2 定义误差函数
16.1.3 优化
目前使用的梯度下降
16.2 元学习
16.2.1 motivation
16.2.2 步骤一
什么是可以学习的?
- 网络架构
- 初始参数
- 学习率
...
16.2.3 步骤二
准备一些训练任务(包含训练集和测试集),为“学习算法”,将训练集输入到“学习算法”中,得到一个分类器,使用测试集计算出loss
计算n个训练任务的loss累积
注:一般机器学习中都是用训练集计算loss,但是元学习中计算loss使用的是测试集,因为元学习的学习是以任务为单位
16.2.4 步骤三
优化部分,如果可以微分就能使用梯度下降,但有些网络架构等是无法计算的,当无法计算时,就用RL或者进化算法(Evolutionary Algorithm)硬做
16.2.5 框架
将无关的任务(例如:各种不同的二分类任务)作为训练任务,学习得到”学习算法“,将目标任务(例如:二分类)作为测试任务,训练获得分类器
16.2.6 元学习和few-shot learning
few-shot learning为期待机器达成的目标,只用一点点训练资料就可以训练出训练的结果,meta learning学习如何去学习,但few-shot learning的演算法往往都是meta learning学出来的
16.3 元学习与机器学习
16.3.1 目标区别
16.3.2 训练数据区别
一般将训练任务中的训练集称为support set,测试集称为query set
16.3.3 训练区别
- 机器学习中的训练叫做within-task training,手动构造神经网络
- 元学习中的训练叫做across-task training,学习出“学习算法”
16.3.4 测试区别
16.3.5 loss区别
16.3.6 训练过程
需要计算一次,首先要经过一次within-task training,然后经过一次within-task testing,才能计算出,这整个过程叫做一个across-task training
16.3.7 相同点
- 过拟合
- 收集更多的训练任务改进性能
- 数据增强
- 也需要调参
- 需要有dev task
16.4 如何找到合适参数
找到适合训练的参数MAML和Reptile(MAML的变形)
16.4.1 MAML和pre-training的区别
[链接][https://youtu.be/vUwOA3SNb_E]
16.4.2 MAML为什么好
16.4.3 更多
- [More mathematical details behind MAML][https://youtu.be/mxqzGwP_Qys]
- [First order MAML(FOMAML)][https://youtu.be/3z997JhL9Oo]
- [Reptile][https://youtu.be/9jJe2AD35P8]
16.5 训练出参数
16.5.1 训练出超参数
比如:学习“学习率”,“optimizer”等
16.5.2 训练出网络架构
训练网络架构的方法就叫NAS
当网络架构这种类型无法做微分的时候,使用RL去硬做
其中为agent的参数,agent的输出就是网络架构相关的超参数(比如:滤波器的宽、高,滤波器个数等)
可以微分的方法:DARTS,将网络架构转成可以微分的形式
16.5.3 训练出数据增强
16.6 Learning to compare
将训练和测试丢进去,直接的出结果(而不是得到参数重新训练分类器得出结果)
16.7 元学习的应用
16.7.1 小样本图像分类
Omniglot数据集
16.7.2 其他文本应用
[链接][http://speech.ee.ntu.edu.tw/~tlkagk/meta_learning_table.pdf]