【笔记3】动手学深度学习
资料来源:伯禹学习平台。
批量归一化 BatchNormalization和残差网络:
批量归一化的作用:
1、 对输入标准化,使各个特征分布相近,更加容易训练出有效模型
2、 批量归一化:深层模型接近输出层数据变化剧烈,BN使各层输出更稳定
批量归一化应用位置:应用在全连接 或 卷积层之后,**函数之前
BN在训练时:
全连接层是对mxd个值做批量归一化;卷积层是对mxpxq个值做批量归一化,输出的每个通道分别做批量归一化
BN在预测时:用移动平均的方法估算整个数据集样本的均值和方差
移动平均:moving_mean | var = momentum * moving_mean | var + (1-momentum) * mean | var
ResNet
输入可以通过跨层通道更快前向传播
易于捕捉恒等映射的细微波动
DenseNet
和残差网络结构类似,差别在于不是输出和输入求和,而是输出和输入通道数进行concat
包括稠密块和过渡层两部分,稠密块最终的输出维度是in_channels + num_conv*out_channels,过渡层则是通过1x1卷积层减少通道数避免通道数过高
凸优化:
优化方法目标和深度学习的目标不一致:
优化方法:训练集损失函数值
深度学习:测试集损失函数值
优化在深度学习中的挑战:局部最小值、鞍点(一二阶导都为0)
海森矩阵:多变量函数所有二次偏导数组成的矩阵
鞍点以及局部最值与海森矩阵的关系:在一些偏导数为零的点,
如果海森矩阵特征值都为正数,就是局部最小值点
如果海森矩阵特征值都为负数,就是局部最大值点
如果海森矩阵特征值有正有负就是鞍点(函数图像从一个方向看是局部最大值,从另一个方向看是局部最小值)
梯度消失:函数梯度很平稳很小,优化过程非常慢
凸性:
凸集合中任意两点连线上所有点都在集合内
凸集合的交集还是凸集合
凸集合的并集不一定是凸集合
凸函数定义:
凸函数,非凸函数,凸函数
Jensen不等式:
函数值的期望>=期望的函数值
凸函数性质:
1、 无局部最小值
2、 凸集:Sb={x|x∈X and f(x) ≤ b}
3、 凸函数和二阶导数:f’’(x) ≥ 0 <=> f(x)是凸函数
有限制条件的函数优化:
1、 拉格朗日乘子法
2、 加入惩罚项
3、 投影
梯度下降:
沿着梯度反方向移动自变量可以减小函数值
学习率自适应算法 牛顿法:
海森矩阵辅助梯度下降:
海森矩阵辅助梯度下降例子:两个变量,x1∈[-1,1],x2∈[-10, 10],如果η都是0.1,x1优化一次就是0.9,x2是9.9,海森矩阵能够加快x2的优化速度
梯度下降与线性搜索(共轭梯度法):能够加快收敛速度
梯度下降:是使用所有样本的梯度均值对参数进行更新
随机梯度下降(降低时间复杂度):每计算一个样本梯度后都更新参数
小批量随机梯度下降:梯度下降和随机梯度下降的折衷方法
动态学习率:使用随机梯度下降时,减少在最小值点附近的震荡
优化算法进阶:
ill-conditioned Problem:
λmax和λmin分别是海森矩阵的最大和最小特征值,如果condH过大则是一个ill-conditioned problem
在二阶优化中,ill-conditioned problem会导致多个变量所要求的最优学习率不一致
ill-conditioned Problem 解决方法:
1、Preconditioning gradient vector
2、Averaging history gradient
动量法:解决上述ill-conditioned问题
指数加权移动平均:
由指数加权移动平均理解动量法:
在动量法中,自变量在各个方向上的移动幅度不仅取决当前梯度,还取决于过去的各个梯度在各个方向上是否一致
AdaGrad:根据自变量在每个维度的梯度值的大小来调整各个维度上的学习率
使用一个小批量随机梯度gt按元素平方的累加变量st,在时间步0,AdaGrad将s0中每个元素初始化为0。在时间步t,首先将小批量随机梯度gt按元素平方后累加到变量st:
接着,将目标函数自变量中每个元素的学习率通过按元素运算重新调整:
AdaGrad特点:如果目标函数有关自变量中某个元素的偏导数一直都较大,那么该元素的学习率将下降较快;反之,如果目标函数有关自变量中某个元素的偏导数一直都较小,那么该元素的学习率将下降较慢
RMSProp:对AdaGrad算法做了修改,优化AdaGrad在迭代后期学习率过小导致难以优化的问题, 自变量每个元素的学习率在迭代过程中就不会一直降低
RMSProp将梯度按元素平方做指数加权移动平均:
将目标函数自变量中每个元素的学习率通过按元素运算重新调整,然后更新自变量:
AdaDelta:同样针对AdaGrad算法在迭代后期可能较难找到有用解的问题做了改进
使用了小批量随机梯度gt按元素平方的指数加权移动平均变量st,在时间步0,它的所有元素被初始化为0:
与RMSProp算法不同的是,AdaDelta算法还维护一个额外的状态变量Δxt,其元素同样在时间步0时被初始化为0:
Adam:
在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均
使用了动量变量mt和RMSProp算法中小批量随机梯度按元素平方的指数加权移动平均变量vt,并在时间步0将它们中每个元素初始化为0:
和RMSProp算法中一样, 将小批量随机梯度按元素平方后的项gt⊙gt做指数加权移动平均得到vt:
对于任意时间步t,我们可以将mt再除以1−β1t,从而使过去各时间步小批量随机梯度权值之和为1:
Word2Vec: 离散词语转换为连续空间的向量
词嵌入与One-hot: One-hot无法表达不同单词之间的相似度,词嵌入的提出就是为了解决这个问题
词嵌入:将词表达成一定维度向量,并在大量语料上训练
两种模型:skip-gram跳字模型背景词由中心词生成 一到多
CBOW词袋模型中心词由背景词生成,多到一
Skip-gram: 包括中心词和背景词两个词嵌入层
二次采样:对词语索引表进行二次采样,丢弃类似 a、the、in等词,有助于提高效果
负采样近似:因为词表可能很大,softmax的计算量非常大
词嵌入进阶:
子词嵌入:FastText和BPE
GloVe全局向量词嵌入:优化损失函数
GloVe的改进:
1、使用非概率分布的变量 P’ij=Xij 和 q′ij=exp(uj⊤vi),并对它们取对数;
2、为每个词 wi 增加两个标量模型参数:中心词偏差项 bi 和背景词偏差项 ci,松弛了概率定义中的规范性;
3、将每个损失项的权重 xi 替换成函数 h(xij),权重函数 h(x) 是值域在 [0,1] 上的单调递增函数,松弛了中心词重要性与 xi 线性相关的隐含假设;
4、用平方损失函数替代了交叉熵损失函数
近义词:词向量空间中的余弦相似性可以衡量词语含义的相似性
类比词:搜索与 vec(c)+vec(b)−vec(a) 的结果向量最相似的词向量
文本分类:
文本分类也属于词嵌入的下游应用
分本分类步骤:
- 读取数据
- 预处理数据:分词,创建词典,将文本从字符串转换为单词下标序列
- 创建数据迭代器,定义神经网络(循环神经网络|卷积神经网络)
加载预训练的词向量:
预训练词向量的词典及词语索引与使用的数据集并不相同,需要根据目前的词典及索引的顺序来加载预训练词向量
TextCNN模型:
主要使用了一维卷积层和时序最大池化层
TextCNN计算步骤:
- 定义多个一维卷积核,并使用这些卷积核对输入分别做卷积计算。宽度不同的卷积核可能会捕捉到不同个数的相邻词的相关性。
- 对输出的所有通道分别做时序最大池化,再将这些通道的池化输出值连结为向量。
- 通过全连接层将连结后的向量变换为有关各类别的输出。这一步可以使用丢弃层应对过拟合
数据增强:降低过拟合,增加模型泛化能力
图像增强一般包括:为了在预测时得到确定的结果,图像增强只应用在训练过程
主要使用torchvision.transforms模块
- 翻转和裁剪:
左右翻转更常用
池化层和图像随机裁剪让物体以不同比例出现在图像的不同位置,都有利于降低模型对目标位置的敏感性
- 变化颜色:亮度、对比度、饱和度、色调
模型微调:
学习率设置:
输出层设置较大的学习率,从头训练
隐藏层设置较小的学习率,对这些参数进行微调,以保存预训练模型的特征提取能力
数据处理注意点:
使用预训练模型时,一定要与预训练模型做同样的预处理