这里写目录标题
- 一级目录
-
- 1、退化
- 2、伪标签Pseudo-Label
- 3、网格搜索Grid search
- 4、激活函数总结
-
- Relu
- Leaky ReLU
- PRelu(参数化修正线性单元)
- RReLU(随机纠正线性单元)
- ELU (Exponential Linear Units) 函数--指数线性单元
- SELU
- SoftPlus
- Maxout
-
- Swish
- Sigmoid
- tanh
-
- 梯度消失与梯度爆炸
-
- 激活函数选择
- 5、Batchsize
-
- Gradient Descent:
- Stochastic Gradient Descent
- Minibatch Gradient Descent
- batchsize和lr关系:
- 6、Pooling层的作用和缺陷
-
- 7、调参(karpathy)
-
- 1. 了解数据
- 2. 设置端到端的评估框架
- 3. 过拟合
- 4.正则化
- 5.开始调参
- 6.压榨
- 8、模型通用设计准则
- 9、BN
- 10、NAS
- 11、AutoML
- 12、Pytorch六大学习率调整策略
- 13、损失函数总结
-
- 1、0-1损失函数(zero-one loss)
- 2、绝对值损失函数
- 3、log对数损失函数
- 4、平方损失函数
- 5、指数损失函数(exponential loss)
- 6、Hinge 损失函数
- 7、 感知损失(perceptron loss)函数
- 8、 交叉熵损失函数 (Cross-entropy loss function)
- 分类问题为什么要使用交叉熵损失函数而不是均方误差
- 关于交叉熵和sigmoid函数的组合
- 二分类交叉熵求导
- 交叉熵为什么要加softmax
- 9、focal loss
- 14、混淆矩阵
- 15、迁移学习
- 16、优化器算法Optimizer
-
- 1. Batch Gradient Descent (BGD)
- 2.Stochastic Gradient Descent (SGD)
- 3.Mini-Batch Gradient Descent (MBGD)
- 4.Momentum
- 5.Nesterov Accelerated Gradient
- 6.Adagrad (Adaptive gradient algorithm)
- 7.Adadelta
- 8.RMSprop
- 9.Adam:Adaptive Moment Estimation
- 如何选择优化算法
- 17.指数加权平均数/偏差修正
- 18.sigmoid 和 softmax
- 19.数据增强Mix_up······
-
- 20.过拟合、权重衰减、学习率衰减
-
- 数据集划分
- 过拟合
-
- 权重衰减weight decay
- L1 regularization
- Dropout
- 数据集扩增(data augmentation)
- 学习率衰减(learning rate decay)
一级目录
二级目录
三级目录
1、退化
随着网络深度的增加,模型会产生退化现象,他不是由过拟合产生,而是由于冗余的网络学习了不是恒等映射的参数造成的。
2、伪标签Pseudo-Label
首先,在标签数据上训练模型,然后使用经过训练的模型来预测无标签数据的标签,从而创建伪标签。此外,将标签数据和新生成的伪标签数据结合起来作为新的训练数据。
具体执行步骤:
- 将有标签部分数据分为两份:train_set&validation_set,并训练出最优的model1
- 用model1对未知标签数据(test_set)进行预测,给出伪标签结果pseudo-labeled
- 将train_set中抽取一部分做新的validation_set,把剩余部分与pseudo-labeled部分融合作为新的train_set,训练出最优的model2
- 再用model2对未知标签数据(test_set)进行预测,得到最终的final result label
3、网格搜索Grid search
Grid Search:一种调参手段;穷举搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果。
- 数据分成训练集和测试集的缺点:
原始数据集划分成训练集和测试集以后,其中测试集除了用作调整参数,也用来测量模型的好坏;这样做导致最终的评分结果比实际效果要好。(因为测试集在调参过程中,送到了模型里,而我们的目的是将训练模型应用在unseen data上)
- 解决方法:
对训练集再进行一次划分,分成训练集和验证集,这样划分的结果就是:原始数据划分为3份,分别为:训练集、验证集和测试集;其中训练集用来模型训练,验证集用来调整参数,而测试集用来衡量模型表现好坏。
- 然而,这种间的的grid search方法,其最终的表现好坏与初始数据的划分结果有很大的关系,为了处理这种情况,我们采用交叉验证的方式来减少偶然性。
- Grid Search with Cross Validation
交叉验证经常与网格搜索进行结合,作为参数评价的一种方法
- Grid Search 调参方法存在的共性弊端就是:耗时;参数越多,候选值越多,耗费时间越长!所以,一般情况下,先定一个大范围,然后再细化。
4、激活函数总结
Relu
Relu(Rectified Linear Unit)——修正线性单元函数:该函数形式比较简单,
公式:relu=max(0, x)
特点:
- ReLU的有效导数是常数1,解决了深层网络中出现的梯度消失问题,也就使得深层网络可训练。
- ReLU又是非线性函数,所谓非线性,就是一阶导数不为常数
- 相比Sigmoid和tanh,ReLU摒弃了复杂的计算,提高了运算速度。
- 解决了梯度消失问题,收敛速度快于Sigmoid和tanh函数,但要防范ReLU的梯度爆炸。
- 容易得到更好的模型,但也要防止训练中出现模型‘Dead’情况。
ReLU在x>0下,导数为常数1的特点:
- 在“链式反应”中不会出现梯度消失,但梯度下降的强度就完全取决于权值的乘积,这样就可能会出现梯度爆炸问题。解决这类问题:一是控制权值,让它们在(0,1)范围内;二是做梯度裁剪,控制梯度下降强度,如ReLU6
ReLU在x<0下,输出置为0的特点:
- ReLU将x<0的输出置为0,就是一个去噪音,稀疏矩阵的过程。而且在训练过程中,这种稀疏性是动态调节的,网络会自动调整稀疏比例,保证矩阵有最优的有效特征。
- 但是ReLU 强制将x<0部分的输出置为0(置为0就是屏蔽该特征),可能会导致模型无法学习到有效特征,所以如果学习率设置的太大,就可能会导致网络的大部分神经元处于‘dead’状态,所以使用ReLU的网络,学习率不能设置太大。
Leaky ReLU
为了防止模型的‘Dead’情况,后人将x<0部分并没有直接置为0,而是给了一个很小的负数梯度值 α \alpha α。
Leaky ReLU中的 α \alpha α为常数,一般设置 0.01。这个函数通常比 Relu 激活函数效果要好,但是效果不是很稳定,所以在实际中 Leaky ReLu 使用的并不多。
PRelu(参数化修正线性单元)
中的 α \alpha α作为一个可学习的参数,会在训练的过程中进行更新。
RReLU(随机纠正线性单元)
也是Leaky ReLU的一个变体。在RReLU中,负值的斜率在训练中是随机的,在之后的测试中就变成了固定的了。RReLU的亮点在于,在训练环节中,aji是从一个均匀的分布U(I,u)中随机抽取的数值。
![深度学习20问--知识点1_第1张图片](http://img.e-com-net.com/image/info8/3ae8e75f9afa44f28e70f0c668e34492.jpg)
ELU (Exponential Linear Units) 函数–指数线性单元
![函数表达式](http://img.e-com-net.com/image/info8/a7f699a7992241eba8703e7b3a5c96d6.png)
![深度学习20问--知识点1_第2张图片](http://img.e-com-net.com/image/info8/8e09021e99c94c38ae21333500a06c87.jpg)
特点:
- ELU有ReLU的基本所有优点
- 不会有Dead ReLU问题
- 输出的均值接近0,zero-centered
- 它的一个小问题在于计算量稍大。
SELU
只需要把激活函数换成SELU就能使得输入在经过一定层数之后变成固定的分布.。
SELU是给ELU乘上系数 λ:
f ( x ) = λ { α ( e x − 1 ) x ≤ 0 x x > 0 f(x)=\lambda \begin{cases} \alpha(e^x-1) & x \le 0 \\ x & x>0 \end{cases} f(x)=λ{α(ex−1)xx≤0x>0
SoftPlus
![在这里插入图片描述](http://img.e-com-net.com/image/info8/9a25c318740946d281db8a96264d26cb.jpg)
![深度学习20问--知识点1_第3张图片](http://img.e-com-net.com/image/info8/e5cb316fcecf439e9c351363eb79b251.png)
与Relu相近,但比较平滑,但指数运算对数计算运算量比较大。
Maxout
Maxout是深度学习网络中的一层网络,就像池化层、卷积层一样等,我们可以把maxout 看成是网络的激活函数层。这一层相比ReLU,sigmoid等,其特殊之处在于增加了k个神经元,然后输出激活值最大的值。
优点:
- Maxout的拟合能力非常强,可以拟合任意的凸函数。
- Maxout具有ReLU的所有优点,线性、不饱和性。
- 同时没有ReLU的一些缺点。如:神经元的死亡。
缺点:
整体参数激增
为什么可以用Maxout
与常规激活函数不同的是,它是一个可学习的分段线性函数.
然而任何一个凸函数,都可以由线性分段函数进行逼近近似。其实我们可以把以前所学到的激活函数:ReLU、abs激活函数,看成是分成两段的线性函数。
实验结果表明Maxout与Dropout组合使用可以发挥比较好的效果。
Swish
f ( x ) = x ⋅ sigmoid ( β x ) f(x) = x · \text{sigmoid}(βx) f(x)=x⋅sigmoid(βx)
- β是个常数或可训练的参数.Swish 具备无上界有下界、平滑、非单调的特性。
- Swish 在深层模型上的效果优于 ReLU。
- Swish函数可以看做是介于线性函数与ReLU函数之间的平滑函数。
Sigmoid
函数表达式
σ ( x ) = 1 1 + e − x \sigma(x) ={1\over 1+e^{-x}} σ(x)=1+e−x1
梯度计算方便:
∇ σ = e − x ( 1 + e − x ) 2 = ( 1 + e − x − 1 1 + e − x ) ( 1 1 + e − x ) = σ ( x ) ( 1 − σ ( x ) ) \nabla\sigma = {e^{-x}\over(1+e^{-x})^2}=({1+e^{-x}-1\over 1+e^{-x}})({1\over 1+e^{-x}})= \sigma(x)(1-\sigma(x)) ∇σ=(1+e−x)2e−x=(1+e−x1+e−x−1)(1+e−x1)=σ(x)(1−σ(x))
优点:
- 优势是能够控制数值的幅度,在深层网络中可以保持数据幅度不会出现大的变化;而ReLU不会对数据的幅度做约束。
- 梯度计算方便
缺点:
- 饱和的神经元会"杀死"梯度,指离中心点较远的x处的导数接近于0,停止反向传播的学习过程.
- sigmoid的输出不是以0为中心,而是0.5,这样在求权重w的梯度时,梯度总是正或负的.
- 指数计算耗时
tanh
tanh ( x ) = e x − e − x e x + e − x \tanh(x) ={e^x-e^{-x}\over e^x+e^{-x}} tanh(x)=ex+e−xex−e−x
- 以0点为中心。取值范围为 [-1,1]
- tanh 是对 sigmoid 的平移和收缩: tanh ( x ) = 2 ⋅ σ ( 2 x ) − 1 \tanh \left( x \right) = 2 \cdot \sigma \left( 2 x \right) - 1 tanh(x)=2⋅σ(2x)−1
为什么平移后还要压缩:可能是应为tanh更出名吧
为什么tanh相比sigmoid收敛更快:
梯度消失与梯度爆炸
浅层的梯度计算需要后面各层的权重及激活函数导数的乘积,因此可能出现前层比后层的学习率小(vanishing gradient)或大(exploding)的问题,所以具有不稳定性。
梯度消失发生时,接近输出层的隐藏层由于梯度相对正常,所以权重更新也相对正常, 但是靠近输入层的隐层权值更新缓慢或停止更新,这导致训练时,只等价于后边几层的浅层网络的学习。
解决办法
需要考虑几个方面:
- 权重初始化
使用合适的方式初始化权重, 如ReLU使用MSRA的初始化方式, tanh使用xavier初始化方式.
- 激活函数选择
激活函数要选择ReLU等梯度累乘稳定的.
- 学习率
一种训练优化方式是对输入做白化操作(包括正规化和去相关), 目的是可以选择更大的学习率. 现代深度学习网络中常使用Batch Normalization(包括正规化步骤,但不含去相关).
- resnet残差网络
- LSTM结构
- 预训练加fine-tunning。基本思想, 每次训练完一层隐藏层节点,将上一层隐藏层输出作为输入,而本层的输出作为下一层的输入,这是逐层预训练。
梯度爆炸:
- 而梯度爆炸需要采用梯度裁剪、BN、设置较小学习率等方式解决。
激活函数选择
- 首先尝试ReLU,速度快,但要注意训练的状态.
- 如果ReLU效果欠佳,尝试Leaky ReLU或Maxout等变种。
- 尝试tanh正切函数(以零点为中心,零点处梯度为1)
- sigmoid/tanh在RNN(LSTM、注意力机制等)结构中有所应用,作为门控或者概率值.
- 在浅层神经网络中,如不超过4层的,可选择使用多种激励函数,没有太大的影响。
5、Batchsize
大小影响模型优化的程度和速度,可以确定的是,batch size 绝非越大越好。
- 因为 batch size 的极限是训练集样本总个数。GD
- 没有batchsize-GD梯度,用于小样本
- batchsize = 1,SGD不准确难收敛
- batchsize增大,梯度变准确
- batchsize再增大,梯度已经足够准确,再增大也没用
Gradient Descent:
所有样本算出的梯度的平均值来更新每一步。
- 虽然从直觉上,Gradient Descent 可以快速准确的将训练集的 loss 降低到最小,但实际上很容易陷入局部最小值或鞍点
- 而且 GD 每一步的计算量巨大。
- 训练集表现好,测试集表现差的过拟合 (overfitting) 并不是我们想要的。
Stochastic Gradient Descent
一个样本算出的梯度来更新每一步
- 随机性有利于跳出鞍点,又具有加强普遍性 (测试集上表现优秀) 的作用。
- 计算快,适用于Online-learning数据流式到达现场
- 可惜训练耗时,同时过大的样本差异会使训练比较震荡
- 梯度往往不准确,所以得用很小的lr
Minibatch Gradient Descent
是以 N个样本算出的梯度的平均值来更新每一步。
- 不过在计算机视觉中,由于 batch normalization 的帮助,可以使用极大的 batch size,这时的 batch size 往往是受限于 GPU 的显存大小。
- 大 batch size 限于空间,小 batch size 苦于时间。
batchsize和lr关系:
- 从方差的角度上看,更大的batch意味着一个mini-batch中样本的方差更小,也同时意味着一个mini-batch带来的梯度方差也更小,梯度更加可信,噪声给模型带来的影响也会相应减少,在可信的梯度下,我们可以使用更大的learning rate来更新参数,提高收敛速度是可行的。
- 适当的增大learning rate还可以有效避免模型走到一个比较差的local minima,大lr可有效逃离并收敛到更好的地方。但也不是可以无限增大learning rate,由于一般NN的优化平面都是坑坑洼洼的,不平滑,太大的learing rate容易引起振荡,可能会错过较好的局部最优,而收敛了一个差的局部最优。
- 当batchsize变大后,得到好的测试结果所能允许的lr范围在变小,也就是说,当batchsize很小时,比较容易找打一个合适的lr达到不错的结果,当batchsize变大后,可能需要精细地找一个合适的lr才能达到较好的结果
- Batchsize设置较大时,一般学习率要增大。通常当我们增加batchsize为原来的N倍时,要保证经过同样的样本后更新的权重相等,按照线性缩放规则,学习率应该增加为原来的N倍。在初始训练阶段,一般不会直接将lr增大为n倍,而是从baseline的lr慢慢warmup到n倍。(n为batchsize增加的倍数)
建议:
- 如果增加了学习率,那么batch size最好也跟着增加,这样收敛更稳定。
- 尽量使用大的学习率,因为很多研究都表明更大的学习率有利于提高泛化能力。如果真的要衰减,可以尝试其他办法,比如增加batch size,学习率对模型的收敛影响真的很大,慎重调整。
6、Pooling层的作用和缺陷
两个作用:
- invariance(不变性),这种不变性包括translation(平移),rotation(旋转),scale(尺度)
- 保留主要的特征同时减少参数(降维,效果类似PCA)和计算量,防止过拟合,提高模型泛化能力
卷积核能够看到更多的信息,是不是提取特征越准确啊。那我为了增大感受野,我一开始就用跟图像一样大的卷积核,那不就感受野更大了?
A:不行,因为卷积层越深模型的表征能力越强,即卷积次数越多越好,你用跟图像一样大的,得到了1X1的feature map,但是一下降维这么多,会导致很多重要信息丢失,你再进行卷积的时候效果就每那么好了。
pooling的缺点:
pooling能够增大感受野,让卷积看到更多的信息,但是它在降维的过程中丢失了一些信息(因为毕竟它变小了嘛,只留下了它认为重要的信息),所以pooling增大感受野的前提是丢失了一些信息(即降低了分辨率),这对segmentation要求的精确度location有一定的影响。
Max Pooling和 Average Pooling的区别,使用场景分别是什么?
- 一般在卷积层后面都会接一个池化操作,但是近些年比较主流的ImageNet上的分类算法模型都是使用的max-pooling,很少使用average-pooling
- pooling的主要作用一方面是去掉冗余信息,一方面要保留feature map的特征信息,同时降低参数量
- 通常来讲,max-pooling的效果更好,虽然max-pooling和average-pooling都对数据做了下采样,但是max-pooling感觉更像是做了特征选择,选出了分类辨识度更好的特征,提供了非线性。
- average-pooling更强调对整体特征信息进行一层下采样,在减少参数维度的贡献上更大一点,更多的体现在信息的完整传递这个维度上,在一个很大很有代表性的模型中,比如说DenseNet中的模块之间的连接大多采用average-pooling,在减少维度的同时,更有利信息传递到下一个模块进行特征提取。
- max-pooling和average-pooling的使用性能对于我们设计卷积网络还是很有用的,虽然池化操作对于整体精度提升效果也不大,但是在减参,控制过拟合以及提高模型性能,节约计算力上的作用还是很明显的,所以池化操作时卷积设计上不可缺少的一个操作。
7、调参(karpathy)
神经网络的训练会无声的失败!!!
所以写代码的时候一定要考虑各种可能的情况,并且做测试,一旦检测出来不符合要求,立马raise_error.
1. 了解数据
训练之前彻底检查数据集。
一旦从数据中发现规律,可以编写一些代码对他们进行搜索、过滤、排序。把数据可视化能帮助我们发现异常值,而异常值总能揭示数据的质量或预处理中的一些错误。
2. 设置端到端的评估框架
下一步是建立一个完整的训练+评估框架。
我们选择一个简单又不至于搞砸的模型,比如线性分类器、CNN,可视化损失。获得准确度等衡量模型的标准,用模型进行预测。
这个阶段的技巧有:
- 固定随机种子
- 简单化,例如关闭数据增强
- 在评估是尽量准确,在绘制测试集损失时,对整个测试集进行评估,不要只绘制批次测试损失图像。
- 验证损失函数。看自己的loss_function是否以正确的损失开始。
- 正确初始化
- 人工评测。监控除人为可解释和可检查的损失之外的指标,例如准确性。
- 指定和数据无关的标准。最简单的方法是将所有输入设置为零,看看模型是否学会从输入中提取任何信息。
- 在少量数据上过拟合。看看模型是否能够在少数几个数据上过拟合。并验证可以达到的可实现的最低损失。
- 验证减少训练损失。尝试稍微增加容量,然后看看你的训练损失是否随之下降了。
- 在训练模型前进行数据可视化。将原始张量的数据和标签可视化,可以节省了调试次数,并揭示了数据预处理和数据扩增中的问题。
- 可视化预测动态。在训练过程中对固定测试批次上的模型预测进行可视化。
- 使用反向传播来绘制依赖关系。梯度值可以提供网络中关键内容的信息,这对调试很有用。
3. 过拟合
我用来寻找高质量模型的方法就是两步:
- 首先找一个过拟合的模型(比如说,过拟合的判定标准可以是训练损失)
- 然后我对这个模型进行规范化(regularize)处理从而使这个过拟合的模型变成一个高质量的模型(以降低部分训练损失的代价提高验证损失的质量——即以提高一点训练误差的代价降低较多的验证误差)。
这一步的一些提示与技巧:
- 挑选模型。简简单单地查查和自己项目相关的论文,然后把他们模型的简化版应用在自己的项目来取得较好的性能。
- Adam优化是靠谱的。在最初的训练阶段,我会使用学习速率为3e-4的Adam作为网络参数的优化/迭代方法。对于ConvNets(卷积神经网络)而言,精准调参的随机梯度下降(Stochastic Gradient Descent)会比Adam拥有更好地性能,但是最优学习速率的区间会更窄,对于不同的问题会有不同的最优学习速率区间。
- 提高模型复杂程度时,每次只改动一处。如果你有多个想要加入到分类器里的东西,我建议你依次加入它们(比如先加入dropout再加入batch normalization),来保证你得到你期待的性能。
- 不要相信默认的学习速率衰减率。对于特定的问题,衰减速率应当基于当前的epoch数(epoch number),这会基于你当前数据集的尺寸。不同的问题不仅希望使用不同的衰减策略,同时因为epoch不同,衰减过程也不一样。
4.正则化
我们现在已经拥有一个有效的模型,至少对于训练集来说是有效的。现在是时候放弃一些训练精度,使它更规范并且具有更高的测算精度了。
下面是一些提示和技巧:
-
获取更多数据。首先,目前为止,在任何实际环境中规范模型的最佳和首选方法是添加更多真实的训练数据。
-
数据扩增。除了真正数据,你还可以使用半真半假的数据-尝试更具有挑战性的数据增强。
-
创意性地造数据。如果半真半假的数据不起作用,那么可以尝试假数据。人们正在寻找扩展数据集的创造性方法;例如,域随机化、模拟、甚至是GAN。
-
预训练。即使你有足够的数据,如果可以的话,建议使用一个经过预先训练的网络。
-
坚持有监督学习。不要太执着于无监督的预先训练。
-
减小输入维度。删除可能包含虚假信号的输入。如果数据集很小,任何的伪输入都将是一个过拟合的机会。同样,如果低层次的细节不太重要,尝试输入较小的图像。
-
缩减模型大小。在许多情况下,你可以使用域知识来约束并缩减模型大小。
-
减小batch大小。由于batch内部的规范化,较小的batch在一定程度上对应着较强的规范化。这是因为相对于完全平均值-标准差比,batch的经验平均值-标准差比更加有效,所以比例和偏移对于你的batch影响更大。
-
防止过拟合。添加dropout。不过使用需谨慎,因为这种操作似乎跟批量归一化不太合得来。
BN和Dropout单独使用都能减少过拟合并加速训练速度,但如果一起使用的话并不会产生1+1>2的效果,相反可能会得到比单独使用更差的效果。
作者采用了两种策略来探索如何打破这种局限。一个是在所有 BN 层后使用 Dropout,另一个就是修改 Dropout 的公式让它对方差并不那么敏感,就是高斯Dropout。
- 第一个方案比较简单,把Dropout放在所有BN层的后面就可以了,这样就不会产生方差偏移的问题,但实则有逃避问题的感觉。
- 第二个方案来自Dropout原文里提到的一种高斯Dropout,是对Dropout形式的一种拓展。作者进一步拓展了高斯Dropout,提出了一个均匀分布Dropout,这样做带来了一个好处就是这个形式的Dropout(又称为“Uout”)对方差的偏移的敏感度降低了,总得来说就是整体方差偏地没有那么厉害了。
-
权重衰减。增加权重衰减惩罚力度。
-
及时停止训练。基于已测量验证的损失,及时停止训练,防止模型过拟合。
-
尝试大一点的模型。更大的模型最终会有更大程度的过拟合,但它们的“及时停止”性能往往比较小的模型好得多。
-
最后,为了让你更确信自己的神经网络已经是一个合理的分类器了,我建议你可视化网络的第一层权重,并确保你的结果是有意义的。如果你的第一层过滤器看起来像噪音,那么也许哪里是有问题的。同样,网络内的激活函数有时会显示奇怪的效应,你可以利用这些信息去追踪问题所在。
5.开始调参
- 随机网格搜索。为了同时调整多个超参数,使用网格搜索来确保能够覆盖所有设置参数,这显然听起来很诱人,但请记住,最好使用随机搜索。
- 超级参数优化。
6.压榨
- 集合/合并。模型集合是一种非常有保证非常靠谱的方法,可以在任何事情上提升2%的精度。如果你在测试时无法承受计算的成本,请考虑使用“黑匣子”进行整体提升。
- 自行训练。把模型放在一边然后让它自己一直训练。有些人在模型的验证损失几乎趋于平稳时就直接停止了训练。这是不对的,根据我的经验,模型的网络可以长时间不间断地进行训练并不断优化提升。
8、模型通用设计准则
该模块参考于此,侵删–InceptionV3的解释
- 慎用Bottleneck:
在模型的早期阶段,尽量避免使用bottleneck模块。作者们认为CNN模型本质上是一个DAG(有向无环图),其上信息自底向上流动,而每一个bottleneck的使用都会损失一部分信息,因此当我们出于计算与存储节省而使用bottleneck时,一定要下手轻些(不要一下子使用1x1 conv缩减过多的feature maps的channels数目,如果一定要用reduction模块也要在模型较靠后的几层使用)。
- 增加网络的宽度是有用的:
撇开计算与内存开销增加的负面因素不谈,每个Conv层的kernels数目增加对于模型处理局部信息,进而更有效地对其表达还是有好处的。竟多些参数就可使得每层获得多些的表达能力,它还可使得模型收敛得更快。
- 适当的维度的压缩不会损失特征表达能力:
对于网络后面的feature maps可以使用像bottleneck那样的模块对其进行channels数目缩减再进行3x3 conv这样的较大计算。在其中1x1 conv reduction op的使用不仅不会影响模型精度,反而还能使其收敛速度加快。他们给出的猜测性解释是,后期较小size的feature maps之上的相邻units(即channels)之间具有更加的关联性(即冗余信息不少),因此可使输出的channels变少, 而不担心信息丢失(反而信息被梳理的更清晰、有效)。
- 平衡网络的深度和宽度:
一个成功的CNN网络设计一定要将深度与宽度同时增加,瘦高或矮胖的CNN网络都不如一个身材匀称的网络的效果好。但要考虑计算复杂度的问题。
原文链接:https://blog.csdn.net/weixin_42615068/article/details/97816070
9、BN
该模块参考此文章,且文章写得很好,如果你们需要看BN内容,请直接移步,侵删
这个也非常的好,可以看一下
另一种说法,这么多链接,说明自己没好好看,以后一定看一下,删减一下
Batch Normalization是数据归一化方法,往往用在深度神经网络中激活层之前。其作用可以加快模型训练时的收敛速度,使得模型训练过程更加稳定,避免梯度爆炸或者梯度消失。并且起到一定的正则化作用,几乎代替了Dropout,同时提升准确率。
目的:
- 使我们的一批(Batch)feature map满足均值为0,方差为1的分布规律。
- 注意这里所说满足分布规律并不是指某一个feature map的数据要满足分布规律,理论上是指整个训练样本集所对应feature map的数据要满足分布规律
- 计算出整个训练集的feature map然后在进行标准化处理,对于一个大型的数据集明显是不可能的,所以论文中说的是Batch Normalization,也就是我们计算一个Batch数据的feature map然后在进行标准化(batch越大越接近整个数据集的分布,效果越好)。
- 我们在训练过程中要去不断的计算每个batch的均值和方差,并使用移动平均(moving average)的方法记录统计的均值和方差,在我们训练完后我们可以近似认为我们所统计的均值和方差就等于我们整个训练集的均值和方差。然后在我们验证以及预测过程中,就使用我们统计得到的均值和方差进行标准化处理。
BN优势:
- 减少数据inner covariance shift
- 选择学习率是可稍微大一点
- Bn后的数据被限制在0附近,因此激活函数可以有更多的选择
BN计算公式:
![深度学习20问--知识点1_第4张图片](http://img.e-com-net.com/image/info8/9a85968295594af4bfeb32e304f1aa0b.jpg)
- 均值的计算,就是在一个批次内,将每个通道中的数字单独加起来,再除以 N X H X W。
- 可训练参数 β \beta β和 γ \gamma γ 的维度等于张量的通道数
- μ \mu μ和 σ \sigma σ2在正向传播过程中统计得到
- β \beta β和 γ \gamma γ在反向传播过程中训练得到
- γ \gamma γ用来调整数值分布的方差大小(默认1), β \beta β 是用来调节数值均值的位置(默认0)
均值、方差计算:
- 训练时,均值、方差分别是该批次内数据相应维度的均值与方差;
- 推理时,均值、方差是基于所有批次的期望计算所得
同时为了避免占用内存过大,使用了滑动平均,储存固定个数Batch的均值和方差,不断迭代更新推理时需要的 E(x)与Var(x).
需要注意的几点:
- beta、gamma在训练状态下,是可训练参数,在推理状态下,直接加载训练好的数值。
- moving_mean、moving_var在训练、推理中都是不可训练参数,只根据滑动平均计算公式更新数值,不会随着网络的训练BP而改变数值;在推理时,直接加载储存计算好的滑动平均之后的数值,作为推理时的均值和方差。
- batchsize尽量大一点,因为越大越接近整个训练集均值和方差
使用BN:
- BN一般加载非线性层之前,在加了bn之后原来全连接层的bias也可不用,相当于呗 β \beta β替代了。
- 加入BN时作者想保留卷积网络的平移不变性,所以在做BN时,同一个Feature Map都被看做同一个维度。
缺点:
- batch_size较小的时候,效果差。在batch_size 较小的时候,模拟出来的肯定效果不好,所以记住,如果你的网络中加入了BN,batch_size最好调参的时候调大点。
- BN 在RNN中效果比较差。这一点和第一点原因很类似,不过我单挑出来说一下。
- 训练集和测试集的均值和方差相差比较大,那么训练集的均值和方差就不能很好的反应你测试数据特性,效果就会差。
BN为什么可以增加训练速度:
因为深层神经网络在做非线性变换前的激活输入值随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因
BN的本质是对于每个隐层神经元,把逐渐向非线性函数映射后向取值区间极限饱和区靠拢的输入分布强制拉回到均值为0方差为1的比较标准的正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。
因为梯度能保持比较大的状态,所以对神经网络的参数调整效率比较高,也就是说收敛地快,经过BN后,目前大部分Activation的值落入非线性函数的线性区内,其对应的导数远离导数饱和区,这样来加速训练收敛过程。
BN为什么可以提高网络泛化能力
不用理会拟合中的droupout、L2正则化项的参数选择,采用BN算法可以省去这两项或者只需要小的L2正则化约束。原因,BN算法后,参数进行了归一化,原本经过激活函数没有太大影响的神经元分布变得明显,经过一个激活函数以后,神经元会自动削弱或者去除一些神经元,就不用再对其进行dropout。另外就是L2正则化,由于每次训练都进行了归一化,就很少发生由于数据分布不同导致的参数变动过大,带来的参数不断增大。
BN并不能阻止过拟合,在某些情况下可以抑制
BN的本意是为了加速训练和收敛过程,而不是过拟合
在训练中,BN的使用使得一个mini-batch中的所有样本都被关联在了一起,一个batch数据中每张图片对应的输出都受到一个batch所有数据影响,这样相当于一个间接的数据增强,达到防止过拟合作用.
10、NAS
参考该链接,侵删—可直接进该链接看,讲的十分清晰
设计神经网络架构,能称得上机器学习过程中门槛最高的一项任务了。想要设计出好架构,需要专业的知识技能,还要大量试错。NAS就为了搞定这个费时费力的任务而生。
工作流程;
- 定义一组神经网络可能会用到的“建筑模块”,其中包含了多种卷积和池化模块。
-
- NAS算法用一个循环神经网络(RNN)作为控制器,从这些模块中挑选,然后将它们放在一起,来创造出某种端到端的架构。
- 这个架构,通常会呈现出和ResNet、DenseNet等最前沿网络架构一样的风格,但是内部模块的组合和配置有所区别。一个架构的好坏,往往就取决于选择的模块和在它们之间构建的连接。
- 接下来,就要训练这个新网络,让它收敛,得到在留出验证集上的准确率。这个准确率随后会用来通过策略梯度更新控制器,让控制器生成架构的水平越来越高。
所以,他们做出了一个假设:如果一个神经网络能在结构相似的小规模数据集上得到更好的成绩,那么它在更大更复杂的数据集上同样能表现得更好。
在深度学习领域,这个假设基本上是成立的。
上面还提到了一个限制,这指的是搜索空间其实很有限。他们设计NAS,就要用它来构建和当前最先进的架构风格非常类似的网络。
NAS领域最新的研究,就都在想方设法让这个架构搜索的过程更高效。
- 渐进式神经架构搜索(PNAS),
建议使用名叫“基于序列模型的优化(SMBO)”的策略,来取代NASNet里所用的强化学习。用SMBO策略时,我们不是随机抓起一个模块就试,而是按照复杂性递增的顺序来测试它们并搜索结构。这种PANS方法比原始的NAS效率高5到8倍,也便宜了许多。
- 高效神经架构搜索(ENAS)
作者假设NAS的计算瓶颈在于,需要把每个模型到收敛,但却只是为了衡量测试精确度,然后所有训练的权重都会丢弃掉。
在研究和实践中已经反复证明,迁移学习有助在短时间内实现高精确度。因为为相似任务训练的神经网络权重相似,迁移学习基本只是神经网络权重的转移。
ENAS算法强制将所有模型的权重共享,而非从零开始训练模型到收敛,我们在之前的模型中尝试过的模块都将使用这些学习过的权重。因此,每次训练新模型是都进行迁移学习,收敛速度也更快。
11、AutoML
AutoML的理念就是把深度学习里那些复杂的部分都拿出去,你只需要提供数据,随后就让AutoML在神经网络设计上尽情发挥吧。这样,深度学习就变得像插件一样方便,只要有数据,就能自动创建出由复杂神经网络驱动的决策功能。
12、Pytorch六大学习率调整策略
大佬链接,直接转,超级详细
PyTorch学习率调整策略通过torch.optim.lr_scheduler接口实现。PyTorch提供的学习率调整策略分为三大类,分别是
- 有序调整:等间隔调整(Step),按需调整学习率(MultiStep),指数衰减调整(Exponential)和 余弦退火CosineAnnealing。
- 自适应调整:自适应调整学习率 ReduceLROnPlateau。
- 自定义调整:自定义调整学习率 LambdaLR。
13、损失函数总结
该链接损失函数详解,建议直接转,侵删
Pytorch的Loss函数及其用法
损失函数用来评价模型的预测值和真实值不一样的程度,损失函数越好,通常模型的性能越好。不同的模型用的损失函数一般也不一样。
损失函数分为经验风险损失函数和结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别,结构风险损失函数是指经验风险损失函数加上正则项。
没有一个损失函数可以适用于所有类型的数据。损失函数的选择取决于许多因素,包括是否有离群点,机器学习算法的选择,运行梯度下降的时间效率,是否易于找到函数的导数,以及预测结果的置信度。
典型的多分类一般是softmax和交叉熵,二分类就是sigmoid和交叉熵
典型的回归用linear线性激活函数,loss用mse或者余弦距离
分类一般使用交叉熵,回归一般使用均方根误差。
1、0-1损失函数(zero-one loss)
0-1损失是指预测值和目标值不相等为1, 否则为0
特点:
- 0-1损失函数直接对应分类判断错误的个数,但是它是一个非凸函数,不太适用.
- 感知机就是用的这种损失函数。但是相等这个条件太过严格,因此可以放宽条件,即只要在一个浮动范围内时就认为相等
2、绝对值损失函数
绝对值损失函数是计算预测值与目标值的差的绝对值
3、log对数损失函数
特点:
- log对数损失函数能非常好的表征概率分布,在很多场景尤其是多分类,如果需要知道结果属于每个类别的置信度,那它非常适合。
- 健壮性不强,相比于hinge loss对噪声更敏感。
- 逻辑回归的损失函数就是log对数损失函数。
4、平方损失函数
特点:
5、指数损失函数(exponential loss)
特点:
- 对离群点、噪声非常敏感。经常用在AdaBoost算法中。
6、Hinge 损失函数
特点:
- hinge损失函数表示如果被分类正确,损失为0,否则损失就为1-yf(x) 。SVM就是使用这个损失函数。
- 一般的 F(x)是预测值,在-1到1之间, y是目标值(-1或1)。其含义是,F(x)的值在-1和+1之间就可以了,并不鼓励 |F(x)|>1 ,即并不鼓励分类器过度自信,让某个正确分类的样本距离分割线超过1并不会有任何奖励,从而使分类器可以更专注于整体的误差。
- 健壮性相对较高,对异常点、噪声不敏感,但它没太好的概率解释。
7、 感知损失(perceptron loss)函数
特点:
- 是Hinge损失函数的一个变种,Hinge loss对判定边界附近的点(正确端)惩罚力度很高。而perceptron loss只要样本的判定类别正确的话,它就满意,不管其判定边界的距离。它比Hinge loss简单,因为不是max-margin boundary,所以模型的泛化能力没 hinge loss强。
8、 交叉熵损失函数 (Cross-entropy loss function)
讲解的比较清楚,可以直接转,侵删
在机器学习中,我们希望模型在训练数据上学到的预测数据分布与真实数据分布越相近越好,上面讲过了,用相对熵,但是为了简便计算使用交叉熵就可以了。
交叉熵损失函数一般用来代替均方差损失函数与sigmoid激活函数组合。
- 交叉熵就是用来判定实际的输出与期望的输出的接近程度
- 交叉熵刻画的是实际输出(概率)与期望输出(概率)的距离,也就是交叉熵的值越小,两个概率分布就越接近。假设概率分布p为期望输出,概率分布q为实际输出,H(p,q)为交叉熵,则:
![在这里插入图片描述](http://img.e-com-net.com/image/info8/aeea42efdbfd481992a259c70143a34b.jpg)
![在这里插入图片描述](http://img.e-com-net.com/image/info8/bc6ce88fffc549fa8c6e17bc9129b7ee.jpg)
特点:
- 本质上也是一种对数似然函数,可用于二分类和多分类任务中。
- 当使用sigmoid作为激活函数的时候,常用交叉熵损失函数而不用均方误差损失函数,因为它可以完美解决平方损失函数权重更新过慢的问题,具有“误差大的时候,权重更新快;误差小的时候,权重更新慢”的良好性质。
- 对数损失函数和交叉熵损失函数应该是等价的!!!
![深度学习20问--知识点1_第5张图片](http://img.e-com-net.com/image/info8/24f4151a92354233a66984a4e8c8fa42.jpg)
分类问题为什么要使用交叉熵损失函数而不是均方误差
- 交叉熵使得梯度与绝对误差成正比,二范数导致梯度变得扭曲
- 神经网络中如果预测值与实际值的误差越大,那么在反向传播训练的过程中,各种参数调整的幅度就要更大,从而使训练更快收敛,如果预测值与实际值的误差小,各种参数调整的幅度就要小,从而减少震荡。
- 使用平方误差损失函数,误差增大参数的梯度会增大,但是当误差很大时,参数的梯度就会又减小了。
- 使用交叉熵损失是函数,误差越大参数的梯度也越大,能够快速收敛。
均方差对参数的偏导:
![深度学习20问--知识点1_第6张图片](http://img.e-com-net.com/image/info8/70bba04b301b4e358e8c97b7a09f781d.png)
交叉熵对参数的偏导:
![深度学习20问--知识点1_第7张图片](http://img.e-com-net.com/image/info8/5a1d14c856294ee28bc70ee5c5aff24d.png)
注:为了简洁,以上公式中用 z 代替了 wx+b
均方差的图像:
![深度学习20问--知识点1_第8张图片](http://img.e-com-net.com/image/info8/58499f3081dd4a8eb564030835d94d00.jpg)
关于交叉熵和sigmoid函数的组合
侵删
在神经网络的训练中,当使用的激活函数为sigmoid函数时,选择的代价函数一般为交叉熵,而不是二次代价函数。
在均方差中:
根据偏导数的结果,w和b的梯度跟激活函数的梯度成正比,激活函数的梯度越大,w和b的大小调整得越快,训练收敛得就越快。
![深度学习20问--知识点1_第9张图片](http://img.e-com-net.com/image/info8/329beadc8bee48e5b7c5d58b1560be58.jpg)
假设目标是收敛到1,A为0.82,距离目标较远,梯度较大,权值调整较大,权值调整比较大;B为0.98,距离目标较近,梯度小,权值调整比较小。方案合理。
假设目标是收敛到0,A为0.82,距离目标较近,梯度较大,权值调整较大,权值调整比较大;B为0.98,距离目标较远,梯度小,权值调整比较小。方案不合理。
在交叉熵中:
可见,权值和偏置的偏导数与代价函数的导数无关,只与输出值和实际值的差值有关。当误差越大时,梯度越大,w和b的调整越快,训练的速度也就越快。
因此,如果输出神经元是线性的,那么二次代价函数合适。如果输出神经元是s型函数,则损失函数适合交叉熵。
二分类交叉熵求导
![深度学习20问--知识点1_第10张图片](http://img.e-com-net.com/image/info8/f6f5b8d682534c7683ed8510045d7eb3.jpg)
交叉熵为什么要加softmax
在神经网络中怎样把前向传播得到的结果也变成概率分布呢?Softmax回归就是一个非常有用的方法。
这就是Softmax层的作用,假设神经网络的原始输出为y1,y2,….,yn,那么经过Softmax回归处理之后的输出为:
![深度学习20问--知识点1_第11张图片](http://img.e-com-net.com/image/info8/15f79a6eefc84703b93ae83619189a55.jpg)
而单个节点的输出变成的一个概率值,经过Softmax处理后结果作为神经网络最后的输出。
9、focal loss
该链接还有一些别的函数,可以自行转过去看
Focal loss主要是为了解决one-stage目标检测中正负样本比例严重失衡的问题。该损失函数降低了大量简单负样本在训练中所占的权重,也可理解为一种困难样本挖掘。
Focal loss是在交叉熵损失函数基础上进行的修改,首先回顾二分类交叉上损失:
![在这里插入图片描述](http://img.e-com-net.com/image/info8/d6ac860c04d04eadbdd5f00350fdcf8b.jpg)
Focal loss
![在这里插入图片描述](http://img.e-com-net.com/image/info8/fb3dade11d2f4e1cacda824c490aaf3a.jpg)
首先在原有的基础上加了一个因子,其中gamma>0使得减少易分类样本的损失。使得更关注于困难的、错分的样本。
所以更加关注于这种难以区分的样本。这样减少了简单样本的影响,大量预测概率很小的样本叠加起来后的效应才可能比较有效。
此外,加入平衡因子alpha,用来平衡正负样本本身的比例不均:文中alpha取0.25,即正样本要比负样本占比小,这是因为负例易分。
![在这里插入图片描述](http://img.e-com-net.com/image/info8/5a54537577ec49e39d43e5e3de78ff87.jpg)
- 只添加alpha虽然可以平衡正负样本的重要性,但是无法解决简单与困难样本的问题。
- gamma调节简单样本权重降低的速率,当gamma为0时即为交叉熵损失函数,当gamma增加时,调整因子的影响也在增加。实验发现gamma为2是最优
focal loss为凯明大神的大作,可用于解决多分类任务中样本不平衡的现象,可以获得比softmax_cross_entropy更好的分类效果。
论文中α=0.25,γ=2效果最好。
14、混淆矩阵
侵删,多个概念解释
侵删,讲解清晰,补充
混淆矩阵(confusion matrix)衡量的是一个分类器分类的准确程度。对于k元分类,对应一个k*k的表格
![深度学习20问--知识点1_第12张图片](http://img.e-com-net.com/image/info8/09b2b6e06a114f9789bb7924c42eac92.png)
重要概念:
第一个字母T/F表示判断是否正确,第二个字母P/N表示模型预测的最终结果
- 真阳性(True Positive,TP):样本的真实类别是正例,并且模型预测的结果也是正例
- 真阴性(True Negative,TN):样本的真实类别是负例,并且模型将其预测成为负例
- 假阳性(False Positive,FP):样本的真实类别是负例,但是模型将其预测成为正例
- 假阴性(False Negative,FN):样本的真实类别是正例,但是模型将其预测成为负例
混淆矩阵延伸出的各个评价指标
- 正确率(Accuracy):被正确分类的样本比例或数量(TP+TN)/Total
- 错误率(Misclassification/Error Rate):被错误分类的样本比例或数量(FP+FN)/Total
- 真阳率(True Positive Rate)召回率(recall):分类器预测为正例的样本占实际正例样本数量的比例,也叫敏感度(sensitivity),描述了分类器对正例类别的敏感程度。TP/ actual yes TP/TP+FN
- 假阳率(False Positive Rate):分类器预测为正例的样本占实际负例样本数量的比例。FP/actual no
- 特异性(Specificity):实例是负例,分类器预测结果的类别也是负例的比例。TN/actual no
- 精度(Precision):在所有判别为正例的结果中,真正正例所占的比例。TP/predicted yes TP/TP+FP
- 流行程度(Prevalence):正例在样本中所占比例。Actual Yes/Total
- F-Measure:
![在这里插入图片描述](http://img.e-com-net.com/image/info8/c6b1cac561904f03a5835991ac1fe24f.png)
15、迁移学习
可以看这篇文章,讲的十分细致,侵删
背景:
- 对机器学习模型来说要求快速构建,强泛化
- 对于数据来说,大部分数据没有标签
所以收集标签数据和从头开始构建一个模型都是代价高昂的,需要对模型和带有标签的数据进行重用
目标:
将某个领域或任务上学习到的知识或模式应用到不同但相关的领域或问题中。
优势:
- 快速训练一个理想结果
- 数据集较小时也能训练出理想效果
注意:
使用别人预训练模型参数时,要注意别人的预训练处理方式
常见的迁移学习方式:
- 载入权重后训练所有参数
- 载入权重后只训练最后几层参数
- 载入权重后在原网络基础上在再添加一层全连接层,仅训练最后一个全连接层
16、优化器算法Optimizer
详解,可直接转,侵删
1. Batch Gradient Descent (BGD)
BGD 采用整个训练集的数据来计算 cost function 对参数的梯度:
![在这里插入图片描述](http://img.e-com-net.com/image/info8/738fc79ff17a46e2a87663317d113313.jpg)
缺点:
由于这种方法是在一次更新中,就对整个数据集计算梯度,所以计算起来非常慢,遇到很大量的数据集也会非常棘手,而且不能投入新数据实时更新模型。
Batch gradient descent 对于凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。
2.Stochastic Gradient Descent (SGD)
SGD 一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。
![在这里插入图片描述](http://img.e-com-net.com/image/info8/8415a69af5c944bb9730d531bbfe1b60.jpg)
缺点:
- 是SGD的噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。所以虽然训练速度快,但是准确度下降,并不是全局最优。虽然包含一定的随机性,但是从期望上来看,它是等于正确的导数的。
- SGD 因为更新比较频繁,会造成 cost function 有严重的震荡。
- BGD 可以收敛到局部极小值,当然 SGD 的震荡可能会跳到更好的局部极小值处。
- 当我们稍微减小 learning rate,SGD 和 BGD 的收敛性是一样的。
3.Mini-Batch Gradient Descent (MBGD)
MBGD 每一次利用一小批样本,即 n 个样本进行计算,这样它可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。
![在这里插入图片描述](http://img.e-com-net.com/image/info8/51f7116064c74384894e2c3a5577ece7.jpg)
缺点:(两大缺点)
- 不过 Mini-batch gradient descent 不能保证很好的收敛性,learning rate 如果选择的太小,收敛速度会很慢,如果太大,loss function 就会在极小值处不停地震荡甚至偏离。(有一种措施是先设定大一点的学习率,当两次迭代之间的变化低于某个阈值后,就减小 learning rate,不过这个阈值的设定需要提前写好,这样的话就不能够适应数据集的特点。)对于非凸函数,还要避免陷于局部极小值处,或者鞍点处,因为鞍点周围的error是一样的,所有维度的梯度都接近于0,SGD 很容易被困在这里。(会在鞍点或者局部最小点震荡跳动,因为在此点处,如果是训练集全集带入即BGD,则优化会停止不动,如果是mini-batch或者SGD,每次找到的梯度都是不同的,就会发生震荡,来回跳动。)
- SGD对所有参数更新时应用同样的 learning rate,如果我们的数据是稀疏的,我们更希望对出现频率低的特征进行大一点的更新。LR会随着更新的次数逐渐变小。
4.Momentum
- SGD 在 ravines 的情况下容易被困住, ravines 就是曲面的一个方向比另一个方向更陡,这时 SGD 会发生震荡而迟迟不能接近极小值:
- Momentum 通过加入 γv_t−1 ,可以加速 SGD, 并且抑制震荡
- 加入的这一项,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。
5.Nesterov Accelerated Gradient
- 用 θ−γv_t−1 来近似当做参数下一步会变成的值,则在计算梯度时,不是在当前位置,而是未来的位置上
- Momentum ,会先计算当前的梯度,然后在更新后的累积梯度后会有一个大的跳跃。
- 而 NAG 会先在前一步的累积梯度上(brown vector)有一个大的跳跃,然后衡量一下梯度做一下修正(red vector),这种预期的更新可以避免我们走的太快。
6.Adagrad (Adaptive gradient algorithm)
- 这个算法就可以对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了 SGD 的鲁棒性,例如识别 Youtube 视频里面的猫,训练 GloVe word embeddings,因为它们都是需要在低频的特征上有更大的更新。
- Adagrad 的优点是减少了学习率的手动调节
- 超参数设定值:一般η选取0.01
- 缺点:它的缺点是分母会不断积累,这样学习率就会收缩并最终会变得非常小。
7.Adadelta
这个算法是对 Adagrad 的改进,和 Adagrad 相比,就是分母的 G 换成了过去的梯度平方的衰减平均值,指数衰减平均值
8.RMSprop
RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的,
RMSprop 与 Adadelta 的第一种形式相同:(使用的是指数加权平均,旨在消除梯度下降中的摆动,与Momentum的效果一样,某一维度的导数比较大,则指数加权平均就大,某一维度的导数比较小,则其指数加权平均就小,这样就保证了各维度导数都在一个量级,进而减少了摆动。允许使用一个更大的学习率η)
9.Adam:Adaptive Moment Estimation
这个算法是另一种计算每个参数的自适应学习率的方法。相当于 RMSprop + Momentum
除了像 Adadelta 和 RMSprop 一样存储了过去梯度的平方 vt 的指数衰减平均值 ,也像 momentum 一样保持了过去梯度 mt 的指数衰减平均值:
实践表明,Adam 比其他适应性学习方法效果要好。
如何选择优化算法
- 如果数据是稀疏的,就用自适用方法,即 Adagrad, Adadelta, RMSprop, Adam。
- RMSprop, Adadelta, Adam 在很多情况下的效果是相似的。
- Adam 就是在 RMSprop 的基础上加了 bias-correction 和 momentum,
- 随着梯度变的稀疏,Adam 比 RMSprop 效果会好。
- 整体来讲,Adam 是最好的选择。
- 很多论文里都会用 SGD,没有 momentum 等。SGD 虽然能达到极小值,但是比其它算法用的时间长,而且可能会被困在鞍点。
- 如果需要更快的收敛,或者是训练更深更复杂的神经网络,需要用一种自适应的算法。
17.指数加权平均数/偏差修正
指数加权平均数,直接转,侵删
偏差修正,直接转,侵删
指数加权平均,在统计学中也叫做指数加权移动平均。它可以根据观察期近期的观察值进行预测,可以反映近期的变化趋势。
指数加权平均数公式的好处之一就在于,它占用极少内存,电脑内存只占用一行数字而已,然后把最新数据带入公式,不断覆盖就可以了。当然,它不是最精准的计算平均数的方法,如果要计算移动平均值,直接算出过去10天,过去50天的总和,除以10和50即可,如此往往会得到更好的估测,但缺点时,如果保存所有最近的数据,必须要占用更多的内存,执行更加复杂,计算成本也会更高。
每个最新数据值,依赖于以前的数据结果。
一般令第一个数值为0,即v0=0;但此时初期的几个计算结果就会与真实的平均值有较大偏差,
所以对数据进行偏差修正。
18.sigmoid 和 softmax
具体看这个连接
两个函数都可将分类器的原始输出映射为概率
- sigmoid 会分别处理各个原始输出值,因此其结果互相独立,概率总和不一定为1
- softmax 函数的输出值相互关联,其概率总和始终为1
sigmoid可以用于多标签分类问题,因为有多个正确答案
softmax互斥输出
sigmoid是一种特殊的softmax
![深度学习20问--知识点1_第13张图片](http://img.e-com-net.com/image/info8/5b29d6a38b9c46b08d2394b7ba0d910e.jpg)
![深度学习20问--知识点1_第14张图片](http://img.e-com-net.com/image/info8/47959ec9b753472cac1580a8fada3700.jpg)
19.数据增强Mix_up······
参考该连接
- Mixup:将随机的两张样本按比例混合,分类的结果按比例分配;
- Cutout:随机的将样本中的部分区域cut掉,并且填充0像素值,分类的结果不变;
- CutMix:就是将一部分区域cut掉但不填充0像素而是随机填充训练集中的其他数据的区域像素值,分类结果按一定的比例分配
![深度学习20问--知识点1_第15张图片](http://img.e-com-net.com/image/info8/b71521e75b9c47b4b1dcfd1ad0719b00.jpg)
作用:
- CutMix的操作使得模型能够从一幅图像上的局部视图上识别出两个目标,提高训练的效率。
- Cutout能够使得模型专注于目标较难区分的区域(腹部),但是有一部分区域是没有任何信息的,会影响训练效率
- Mixup的话会充分利用所有的像素信息,但是会引入一些非常不自然的伪像素信息。
- mixup 可以在几乎无额外计算开销的情况下稳定提升1个百分点的图像分类精度。
区别:
- cutout和cutmix就是填充区域像素值的区别;
- mixup和cutmix是混合两种样本方式上的区别:mixup是将两张图按比例进行插值来混合样本,cutmix是- 采用cut部分区域再补丁的形式去混合图像,不会有图像混合后不自然的情形
- cutmix是效果最好的一个
Mixup原理详解
该模块参考此处
直接看上边原链接公式了解原理及实现
可以在这看分析,真正了解该算法作用
- mixup相当于一个正则项,它希望模型尽可能往线性函数靠近,也就是说,既保证模型预测尽可能准确,又让模型尽可能简单。
- 所以,mixup就是一个很强悍的模型过滤器:在所有效果都差不多的模型中,选择最接近线性函数的那一个。
- 实际上是通过数据扩增的形式来给模型增加正则项,或者说对模型进行剪枝。
- 因此,我们就不需要纠结“相加后的图像都已经不是一幅合理的“图像”了,数据扩增为啥还会有效”的问题了,因为它不是数据扩增
步骤:
- 取两张图片按融合比例 λ \lambda λ把对应的像素值相加
- 得到的混合张量传递给模型,得到outputs
- 对两个图片的标签分别计算损失,然后按比例 λ \lambda λ加权求和
20.过拟合、权重衰减、学习率衰减
数据集划分
我们常常将原始数据集分为三部分:training data、validation data,testing data。
- training data的作用是计算梯度更新权重
- validation data其实就是用来避免过拟合的,在训练过程中,我们通常用它来确定一些超参数(比如根据validation data上的accuracy来确定early stopping的epoch大小、根据validation data确定learning rate等等)。
- testing data则给出一个accuracy以判断网络的好坏。
过拟合
过拟合及解决办法,及权重衰减
在训练数据不够多时,或者overtraining时,常常会导致overfitting(过拟合)。
其直观的表现如下图所示,随着训练过程的进行,模型复杂度增加,在training data上的error渐渐减小,但是在验证集上的error却反而渐渐增大——因为训练出来的网络过拟合了训练集,对训练集外的数据却不work。
避免过拟合的方法有很多:early stopping、数据集扩增(Data augmentation)、正则化(Regularization)包括L1、L2(L2 regularization也叫weight decay),dropout。
权重衰减weight decay
L2 regularization(权重衰减)
L2正则化就是在代价函数后面再加上一个正则化项:![C0代表原始的代价函数,后面那一项就是L2正则化项,](http://img.e-com-net.com/image/info8/90f1f1267a334f51ba7a982418b5eb8d.jpg)
- 所有参数w的平方的和,除以训练集的样本大小n。λ就是正则项系数,权衡正则项与C0项的比重。另外还有一个系数1/2,1/2经常会看到,主要是为了后面求导的结果方便,后面那一项求导会产生一个2,与1/2相乘刚好凑整。
- 可以发现L2正则化项对b的更新没有影响,但是对于w的更新有影响
L2正则化项是怎么避免overfitting的呢?
![深度学习20问--知识点1_第16张图片](http://img.e-com-net.com/image/info8/128b3d4f4c8b43e58c5ffb49d89a7421.jpg)
![深度学习20问--知识点1_第17张图片](http://img.e-com-net.com/image/info8/637c7660324d4a9c8766bc0fd968c7c7.jpg)
在不使用L2正则化时,求导结果中w前系数为1,现在w前面系数为 1−ηλ/n ,因为η、λ、n都是正的,所以 1−ηλ/n小于1,它的效果是减小w,这也就是权重衰减(weight decay)的由来。当然考虑到后面的导数项,w最终的值可能增大也可能减小。
基于mini-batch的随机梯度下降,w和b更新的公式跟上面给出的有点不同:
![后面那一项变了,变成所有导数加和,乘以η再除以m,m是一个mini-batch中样本的个数。](http://img.e-com-net.com/image/info8/57d3ed2557ea46269455ce2858b1bfb2.jpg)
**拟合过程中通常都倾向于让权值尽可能小,最后构造一个所有参数都比较小的模型。**因为一般认为参数值小的模型比较简单,能适应不同的数据集,也在一定程度上避免了过拟合现象。
- 过拟合的时候,拟合函数的系数往往非常大,过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。
- 正则化是通过约束参数的范数使其不要太大,所以可以在一定程度上减少过拟合情况。
L1 regularization
![深度学习20问--知识点1_第18张图片](http://img.e-com-net.com/image/info8/f8f5ee294d1d4a0f9daa7e6274a3363c.jpg)
![深度学习20问--知识点1_第19张图片](http://img.e-com-net.com/image/info8/c3028f746a14435194892e60154294fd.jpg)
比原始的更新规则多出了η * λ * sgn(w)/n这一项。当w为正时,更新后的w变小。当w为负时,更新后的w变大——因此它的效果就是让w往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合。
稀疏矩阵指的是很多元素为0,只有少数元素是非零值的矩阵,即得到的线性回归模型的大部分系数都是0.
当w为0时怎么办?当w等于0时,|W|是不可导的,所以我们只能按照原始的未经正则化的方法去更新w,这就相当于去掉ηλsgn(w)/n这一项,所以我们可以规定sgn(0)=0,这样就把w=0的情况也统一进来了。
![深度学习20问--知识点1_第20张图片](http://img.e-com-net.com/image/info8/833b33392dea46edae3325924b59fc6c.jpg)
为什么要稀疏?参数稀疏有什么好处呢?
-
特征选择(Feature Selection):
- 稀疏规则化关键原因在于它能实现特征的自动选择。一般来说,xi的大部分元素(特征)都是和最终的输出yi没有关系或者不提供任何信息的,在最小化目标函数的时候考虑xi这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,这些没用的信息反而会被考虑,从而干扰了对正确yi的预测。稀疏规则化算子的引入就是为了完成特征自动选择的使命,它会学习去掉这些没有信息的特征,把这些特征对应的权重置为0。
-
可解释性(Interpretability):
- 另一个好处是参数变少可以使整个模型获得更好的可解释性。
- 例如患某种病的概率是y,然后我们收集到的数据x是1000维的,也就是我们需要寻找这1000种因素到底是怎么影响患上这种病的概率的。假设我们这个是个回归模型:y=w1x1+w2x2+…+w1000x1000+b(当然了,为了让y限定在[0,1]的范围,一般还得加个Logistic函数)。通过学习,如果最后学习到的w就只有很少的非零元素,例如只有5个非零的wi,那么我们就有理由相信,这些对应的特征在患病分析上面提供的信息是巨大的,决策性的。也就是说,患不患这种病只和这5个因素有关,那医生就好分析多了。但如果1000个wi都非0,医生面对这1000种因素,累觉不爱。
Dropout
- L1、L2正则化是通过修改代价函数来实现的,而Dropout则是通过修改神经网络本身来实现的,它是在训练网络时用的一种技巧(trike)
- 其破坏神经元之间的联合适应性,起到了模型集成和数据增强的作用。
- 它为什么有助于防止过拟合呢?可以简单地这样解释,运用了dropout的训练过程,相当于训练了很多个只有半数隐层单元的神经网络(后面简称为“半数网络”),每一个这样的半数网络,都可以给出一个分类结果,这些结果有的是正确的,有的是错误的。随着训练的进行,大部分半数网络都可以给出正确的分类结果,那么少数的错误分类结果就不会对最终结果造成大的影响。
数据集扩增(data augmentation)
可以做一些类内变化和类间融合
数据扩增详细讲解链接
学习率衰减(learning rate decay)
- 在训练模型的时候,通常会遇到这种情况:我们平衡模型的训练速度和损失(loss)后选择了相对合适的学习率(learning rate),但是训练集的损失下降到一定的程度后就不在下降了
- 遇到这种情况通常可以通过适当降低学习率(learning rate)来实现。但是,降低学习率又会延长训练所需的时间。
- 学习率衰减(learning rate decay)就是一种可以平衡这两者之间矛盾的解决方案。学习率衰减的基本思想是:学习率随着训练的进行逐渐衰减。
- 学习率衰减基本有两种实现方法:
- 线性衰减。人为经验进行设定,如到达多少轮后,设定具体的学习率为多少。例如:每过5个epochs学习率减半。
- 指数衰减。例如:随着迭代轮数的增加学习率自动发生衰减,每过5个epochs将学习率乘以0.9998。