基础
batch:分组
update:每一个batch更新一次
epoch:所有的batch更新一次
Activate function(激活函数):最终决定了是否传递信号以及要发射给下一个神经元的内容。分为线性激活函数和非线性激活函数(比如Sigmoid、Tanh、ReLU、LReLU、PReLU、Swish 等
overfitting(过拟合):训练集上的表现比较好,但是在测试集上的表现并不好就是出现了过拟合现象。
Deep leaning深度学习:many hidden layers
Neural Network:连续的矩阵形式,更好的利用GPU进行运算
深度学习基础
局部极小值与鞍点
局部最小值:所在的位置已经是损失的最低点,往四周损失都会比较高
鞍点:鞍点其实就是梯度是零且区别于局部极小值和局部极大值的点. 鞍点的梯度为零,但它不是局部极小值。鞍点还是可以让损失更低的,只要逃离鞍点就可能让损失更低
梯度为零的点统称临界点
判断临界值种类的方法
若 H 的所有特征值都是正的,H 为正定矩阵,则 vTHv > 0,临界点是局部极小 值. 若 H 的所有特征值都是负的,H 为负定矩阵,则 vTHv < 0,临界点是局部极大值. 若
H 的特征值有正有负,临界点是鞍点.
总结:鞍点并不可怕,说明还有可以下降的方向可以做优化
逃离鞍点的方法
维度越高,其实就有非常多路可以走。越靠近右侧代表临界点“看起来越像”局部极小值,但是这些点都不是真正的局部 极小值. 所以从经验上看起来,局部极小值并没有那么常见. 多数的时候,我们训练到一个梯 度很小的地方,参数不再更新,此时,我们往往只是遇到了鞍点.
批量和动量
批量大小对梯度下降法的影响
batch size 越大,验证集表现越不好
大的批量更新比较稳定,小的批量的梯度的方向是比较有噪声的(noisy)。但实际上有 噪声的的梯度反而可以帮助训练,如果拿不同的批量来训练模型来做图像识别问题,实验结 果如图 3.11 所示,横轴是批量大小,纵轴是正确率。
动量法momentum
是另外一个可以对抗鞍点或者局部最小值的方法。
一般的梯度下降示意图,初始参数,计算完梯度后,往梯度的反方向去更新参数,有了新的参数后重复进行。
引入动量后,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定移动方向
一般梯度下降走到一个局 部最小值或鞍点时,就被困住了。但有动量还是有办法继续走下去,因为动量不是只看梯度, 还看前一步的方向。即使梯度方向往左走,但如果前一步的影响力比梯度要大,球还是有可能 继续往右走,甚至翻过一个小丘,也许可以走到更好的局部最小值,这就是动量有可能带来的好处。
自适应学习率
在梯 度下降里面,所有的参数都是设同样的学习率,这显然是不够的,应该要为每一个参数定制 化学习率,即引入自适应学习率(adaptive learning rate)的方法,给每一个参数不同的学习率。
AdaGrad
能够根据梯度大小自动调整学习率,可以做到梯度比较大的时候学习率就减小,梯度比较小的时候,学习率就放大。
可以做到在纵向的方向上做到调整,但是水平无法调整
因此同一个参数的同个方向,学习率也是需要动态调整的,于 是就有了一个新的方法———RMSprop。
RMSprop
球就从 A 走到 B,AB 段的路很平坦,g 很小,更新参数的时候,我们会走比较大的步伐。
走到BC段后梯度变大了,AdaGrad 反应比较慢,而 RMSprop 会把 α 设小一点,让新的、刚看到的梯度的影响比较大,很快地让 σti 的值变大,很快地让步伐变小,RMSprop 可以很快地 “踩刹车”。如果走到 CD 段,CD 段是平坦的地方,可以调整 α,让其比较看重最近算出来的 梯度,梯度一变小,σ i t 的值就变小了,走的步伐就变大了。
Adam
Adam 可以看作 RMSprop 加上动量,其使用动量作为参数更新方向,并且能够自适应调整学习率。
PyTorch 里面已经写好了 Adam 优化器,这个优化器里面有一些超参数需要人为决定,但是往往用 PyTorch 预设的参数就足够好了。
学习率调度
之前的学习率调整方法 中 η 是一个固定的值,而在学习率调度中 η 跟时间有关。最常见的策略是学习率衰减(learning rate decay),也称为学习率退火(learning rate annealing)。随着参数的不断更新,让η 越来越小
分类classification
CNN
将图片变成向量,作为network的输入,而这个向量里面每一维里面存的数值是某一个像素在某一个通道下的颜色强度。
更多的参数为模型带来了更好的弹性和更强的能力,但也增加了过 拟合(overfftting)的风险。模型的弹性越大,就越容易过拟合。为了避免过拟合,在做图像识别的时候,考虑到图像本身的特性,并不一定需要全连接,即不需要每个神经元跟输入的每个维度都有一个权重。
- 检测模式不需要整张图像
这些神经元不需要把整张图像当作输入, 只需要把图像的一小部分当作输入,就足以让它们检测某些特别关键的模式是否出现
- 感受野
卷积神经网络会设定一个区域叫做感受野(receptive ffeld),每个神经元都只关心自己的感受野里面发生的事情,感受野是由我们自己决定的。影像辨识中常见的大多数做3X3。
移动的量叫做步幅(stride),因为希望感受野跟感受野之间是有重叠的,所以步幅 往往不会设太大,一般设为 1 或 2。
超出范围就做填充(padding),填充就是补值,一般使用零填充(zero padding),超出范围就补 0,如果感受野有一部分超出图像的范围 之外,就当做那个里面的值都是 0。其实也有别的补值的方法,比如补整张图像里面所有值的平均值或者把边界的这些数字拿出来补没有值的地方。
- 共享参数(parameter sharing)
每个卷积核通过同一个滤波器
总结:
- pooling
下采样不影响模式检测,把一张比较大的图像做下采样(subsampling),把 图像偶数的列都拿掉,奇数的行都拿掉,图像变成为原来的 1/4,但是不会影响里面是什么东西。可以减少计算量,但是对性能还是会受影响。
自注意力模型self-attention
输入是向量序列的情况
类型1:输入和输出数量相同
类型2:输入是一个序列,输出是一个标签
类型3:序列到序列seq to seq
自注意力的运作原理
encoder提供了更多的数据给到decoder,encoder会把所有的节点的hidden state提供给decoder,而不仅仅只是encoder最后一个节点的hidden state。
新得到的这 4 个向量都是考虑整个序列以后才得到的,所以输出的向量有一个黑色的框,代表它不是一个普通的向量,它是考虑了整个句子以后才得到的信息。自注意力模型不是只能用一次,可以叠加很多次。
自注意力机制的目的是考虑整个序列,但是又不希望把整个序列所有的信息包含在一个窗口里面,所以有一个特别的机制,根据每一个向量找到整个很长的序列里哪一个部分是重要的,每一个向量和该向量的关联程度可以用数值α来表示。
通过自注意力模块自动确定两个向量之间的关联程度,模块使用两个向量作为输入,直接输出α的值。
其中矩阵 WQWKWV是学习出来的,我们试图去学习三个矩阵 WQWKWV,与 Embedding 向量相乘后得到 Query,Key,Value 向量。而期望得到的 Query,Key,Value 向量最契合当前的任务。因为矩阵 WQWKWV是学习出来的,所以得到的 Query,Key,Value 向量是比较抽象的。在这里,我认为WQWKWV 矩阵的功能相当于抽取特征。
如果 a1跟 a2的关联性很强,即 α`1,2的值很大。在做加权和(weighted sum)以后,得到 的 b1的值就可能会比较接近 v2,所以谁的注意力的分数最大,谁的 v 就会主导(dominant) 抽出来的结果。
从矩阵角度来看就是通过矩阵转置后进行运算
向量化思想,将不同的矩阵叠加起来;
多头自注意力multi-head self-attention
自注意力机制的缺陷就是:模型在对当前位置的 信息进行编码时,会过度的将注意力集中于自身的位置,因此作者提出了通过多 头注意力机制来解决这一问题。同时,使用多头注意力机制还能够给予注意力层 的输出包含有不同子空间中的编码表示信息,从而增强模型的表达能力。
“多头”机制能让模型考虑到不同位置的Attention,另外“多头”Attention可以在不同的子空间表示不一样的关联关系,使用单个Head的Attention一般达不到这种效果。能够使信息更加丰富。
其实就是将一个大的高维单头拆分成了多个头,所以,当模型的维度 确定时,一定程度上h 越大,整个模型的表达能力就越强,越能提高模型对于注意力权重的合理分配。
截断自注意力
在做自注意力的时候,也许没有必要让自注意力考虑一整个句子,只需要考虑一个小范围就好,这样就可以加快运算的速度。 这就是截断自注意力。
自注意力与卷积神经网络对比
比较卷积神经网络 跟自注意力会发现,卷积神经网络可以看作是一种简化版的自注意力,因为在做卷积神经网 络的时候,只考虑感受野里面的信息。而在做自注意力的时候,会考虑整张图像的信息。
图神经网络GNN
Transformer
Transformer 是一个序列到序列(Sequence-to-Sequence,Seq2Seq)的模型。输入和输出的都是一个序列,长度都是未知的,由机器自己决定。仅仅依赖于注意力机制就可处理序列数据。
模型应用
语音识别、机器翻译、语音翻译
Transformer 结构
编码器负责处理输入的 序列,再把处理好的结果“丢”给解码器,由解码器决定要输出的序列。
Transformer 编码器Encoder
对于 Encoder 部分来说其内部主要由两部分网络所构成:多
头注意力机制和两层前馈神经网络。对于这两部分网络来说都加入了残差连接,并且在残差连接后还进行了层归一化操作。
编码器要做的事情就是给一排向量,输出另一排向量,使用自注意力,输出另一排相同长度的向量。编码器中会分成很多的块(block),输入的原始向量经过加权之后的结果,每个输出向量都含有所有的输入向量的相关信息,但是相应的结果信息所占的比重更高。
Transformer 解码器Decoder
Decoder 中的模块和 Encoder 中的模块类似,都是 Attention 层、前馈网络层、融合归一化层,不同的是 Decoder 中多了一个 Encoder-Decoder Attention 层。
要让解码器产生输出,首先要先给它一个代表开始的特殊符号<BOS> ,即 Begin Of Sequence,这是一个特殊的词元(token)。在机器学习里面,假设要处理自然语 言处理的问题,每一个词元都可以用一个独热的向量来表示。独热向量其中一维是 1,其他都是 0,所以 也是用独热向量来表示,其中一维是 1,其他是 0。
序列到序列模型训练常用技巧
复制机制(copy mechanism)
机器只要复述这一段它听不懂 的话,它不需要从头去创造这一段文字,它要学的是从用户的输入去复制一些词汇当做输出。
引导注意力
引 导注意力会强迫注意力有一个固定的样貌,如果我们对这个问题本身就已经有理解,知道对 于语音合成这样的问题,注意力的位置都应该由左向右,不如就直接把这个限制放进训练里 面,要求机器学到注意力就应该要由左向右。
束搜索
加入噪声
对于语音合成或句子完成任务,解码器找出最好的结果不一 定是人类觉得最好的结果,反而是奇怪的结果,加入一些随机性的结果反而会是比较好的。
强化学习训练
生成模型Generative model
生成对抗网络基础
具体来说,在模型输入时会将一个随机变量 z 与原始输入 x 一并输入到模型中,这个变量是从随机分布中采样得到。输入时可以采用向量拼接的方式将 x 和 z 一并输入,或在 x、z 长度一样时,将二者的和作为输入。这个变量 z 特别之处在于其非固定性,即每一次我们使用网络时都会从一个随机分布中采样得到一个新的 z。
通常,我们对于该随机分布的要求是其足够简单,可以较为容易地进行采样,或者可以直接写出 该随机分布的函数,例如高斯分布(Gaussian distribution)、均匀分布(Uniform distribution) 等等。
所以每次有一个输入 x 的同时,我们都从随机分布中采样得到 z,并得到最终的输出 y。随着采样得到的 z 的不同,我们得到的输出 y 也会不一样。
同理,对于网络来说,其输出 也不再固定,而变成了一个复杂的分布,我们也将这种可以输出一个复杂分布的网络称为生成器(Generator)。生成器就是希望模型可以有创造力,不同的答案都是正确的。
总结:
GAN 算法的两个步骤。步骤一,固定生成器训练辨别器;步骤二,固定辨别 器训练生成器。接下来就是重复以上的训练,训练完辨别器固定住辨别器训练生成器。训练完生成器以后再用生成器去产生更多的新图片再给辨别器做训练。训练完辨别器后再训练生成 器,如此反覆地去执行。当其中一个进行训练的时候,另外一个就固定住,期待它们都可以在 自己的目标处达到最优。
GAN 的理论介绍及 WGAN 算法
GAN包含有两个模型,一个是生成模型(generative model),一个是判别模型(discriminative model)。生成模型的任务是生成看起来自然真实的、和原始数据相似的实例。判别模型的任务是判断给定的实例看起来是自然真实的还是人为伪造的(真实实例来源于数据集,伪造实例来源于生成模型)。G和D构成了一个动态的“博弈过程”
理论
基本流程
- 初始化判别器D的参数和生成器G的参数。
- 从真实样本中采样m个样本,从先验分布噪声中采样m个噪声样本 并通过生成器获取m个生成样本 。固定生成器G,训练判别器D尽可能好地准确判别真实样本和生成样本,尽可能大地区分正确样本和生成的样本。
- 循环k次更新判别器之后,使用较小的学习率来更新一次生成器的参数,训练生成器使其尽可能能够减小生成样本与真实样本之间的差距,也相当于尽量使得判别器判别错误。
- 多次更新迭代之后,最终理想情况是使得判别器判别不出样本来自于生成器的输出还是真实的输出。亦即最终样本判别概率均为0.5。
图中的黑色虚线代表真实的样本分布情况,蓝色虚线表示判别器判别概率的分布情况,绿色实线表示生成样本的分布。GAN的目标就是使用生成样本去拟合真实的样本分布,以达到欺骗判别器的目的
理论基础
常见的交叉熵
当前的模型中判别器为二分类问题,因此交叉熵展开后为
推广到N个样本后表达式为
对于GAN中的样本点xi对应两个出处,要么来自于真实的样本要么来自于生成器生成的样本
这里的z是服从于投到生成器中的噪声分布。
- V(G,D)相当于表示真实样本和生成样本的差异程度。
- 意思是固定生成器G,尽可能地让判别器能够最大化地判别出样本来自于真实数据还是生成的数据。
- 再将后面部分看成一个整体 ,看 是在固定判别器D的条件下得到生成器G,这个G要求能够最小化真实样本与生成样本的差异。
- 通过上述min max的博弈过程,理想情况下会收敛于生成分布拟合于真实分布。
WGAN
GAN训练过程中遇到的问题:
- 训练一段时间后准确率都会变为100%但是实际上并不能由此来判别模型的效果好坏。需要有一个可解释的指标 可以告诉我们有关训练的进度。
- 模式崩溃,生成器生成非常窄的分布,仅覆盖数据分 布中的单一模式。 模式崩溃的含义是生成器只能生成非常相似的样本(例如 ,MNIST中的单个数字),即生成的样本不是多样的。
判别器越好,生成器梯度消失越严重。
WGAN主要从损失函数的角度进行改进
在最优判别器的下,我们可以把原始GAN定义的生成器loss 等价变换为最小化真实分布与生成分布之间的JS散度。 我们越训练判别器,它就越接近最优,最小化生成器的loss也 就会越近似于最小化真实分布与生成分布之间的JS散度。
关键点就在于如何评价生成图片和真实图片之间的距离
用 Wasserstein 距离来取代 JS 距离的时候,这个 GAN 就叫做 WGAN。WGAN本作引入了Wasserstein距离,由于它相对KL散度与JS 散度具有优越的平滑特性,理论上可以解决梯度消失问题。接 着通过数学变换将Wasserstein距离写成可求解的形式,利用 一个参数数值范围受限的判别器神经网络来较大化这个形式, 就可以近似Wasserstein距离。
GAN 的性能评估以及条件式生成
自监督学习(Self-Supervised Learning,SSL)
从数据本身产生某种形式的标签并训练神经网络,来解决某些特定任务或学习通用的图像、视频、语言的特征表达。
主要介绍典型的自监督学习模型:BERT .
BERT
BERT的全称为Bidirectional Encoder Representation from Transformers,是一个预训练的语言表征模型。它强调了不再像以往一样采用传统的单向语言模型或者把两个单向语言模型进行浅层拼接的方法进行预训练,而是采用新的masked language model(MLM),以致能生成深度的双向语言表征。
【单向的Transformer一般被称为Transformer decoder,其每一个token(符号)只会attend到目前往左的token。而双向的Transformer则被称为Transformer encoder,其每一个token会attend到所有的token。】
BERT 网络结构整体上就是由多层的 Transformer Encoder 堆叠所形成。
通常,对于模型的保存与加载会出现在以下 3 个场景中:
1)模型推理过程;一个网络模型在完成训练后通常都需要对新样本进行推理预 测,此时只需要构建模型的前向传播过程,然后载入已训练好的参数初始化 网络即可。
2)模型再训练过程;模型在一批数据上训练完成之后需要将其保存到本地,并 且可能过了一段时间后又收集到了一批新的数据,因此这个时候就需要将之 前的模型载入进行在新数据上进行增量训练(或者是在整个数据上进行全量 训练)。
3)模型迁移学习;这个时候就是将别人已经训练好的预模型拿过来,作为你自 己网络模型参数的一部分进行初始化。例如:你在 BERT 模型的基础上加了 几个全连接层来做分类任务,那么你就需要将原始 BERT 模型中的参数载入 并以此来初始化你的网络中的 BERT 部分的权重参数。
在训练时,让 BERT 学习两个任务:
• 把一些字符掩盖起来,让它做填空题,补充掩码的字符.
• 预测两个句子是否有顺序关系(两个句子是否应该接在一起)
给 BERT 一些有标注的数据,它可以学习各种任务,将 BERT 分化并用于各种任务称为微调(ffne-tune). 所以微调 BERT,也就是对 BERT 进行微调,让它可以做某种任务. 与 微调相反,在微调之前产生此 BERT 的过程称为预训练(pre-train). 所以产生 BERT 的 过程就是自监督学习,也可以将其称为预训练.