深度学习通识基础
神经网络的深度和宽度作用
Batch Size
参考资料
神经网络中的Epoch、Iteration、Batchsize
神经网络中epoch与iteration是不相等的
batchsize:中文翻译为批大小(批尺寸)。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练;
iteration:中文翻译为迭代,1个iteration等于使用batchsize个样本训练一次;一个迭代 = 一个正向通过+一个反向通过
epoch:迭代次数,1个epoch等于使用训练集中的全部样本训练一次;一个epoch = 所有训练样本的一个正向传递和一个反向传递
举个例子,训练集有1000个样本,batchsize=10,那么:训练完整个样本集需要:100次iteration,1次epoch。
参考资料
常见的激活函数及其特点
激活函数
Sigmod
Tanh
ReLU
ReLU
ReLU 激活函数为什么比sigmoid和tanh好?
PReLU
RReLU
ELU
ReLU 激活函数为什么能解决梯度消失问题?
ReLU 有哪些变体?
ReLU及其变体
- Leaky ReLU
参考资料
Sigmoid
Sigmoid用作激活函数时,分类为什么要用交叉熵损失,而不用均方损失?
tanh
反向传播(BP)
参考资料
损失函数(Loss)
Cross Entropy Loss(CE)
Hinge Loss
Focal Loss
鞍点的定义和特点
神经网络数据预处理方法有哪些
神经网络怎样进行参数初始化
权重初始化方法
Xavier
学习率如何调整
优化算法
- 随机梯度下降(SGD)
- Mini-Batch
- 动量(Momentum)
- Nesterov 动量
- AdaGrad
- AdaDelta
- RMSProp
- Adam
- Adamax
- Nadam
- AMSGrad
- AdaBound
参考资料
梯度下降法
梯度下降的本质:是一种使用梯度去迭代更新权重参数使目标函数最小化的方法。
缺点:
- 不保证全局最优
- 到极小值附近收敛速度变慢
- 可能出现“之”字型下降
mini-batch梯度下降法
小批量梯度下降算法是折中方案,选取训练集中一个小批量样本(一般是2的倍数,如32,64,128等)计算,这样可以保证训练过程更稳定,而且采用批量训练方法也可以利用矩阵计算的优势。这是目前最常用的梯度下降算法。
批量梯度下降算法
对于批量梯度下降算法,其损失函数是在整个训练集上计算的,如果数据集比较大,可能会面临内存不足问题,而且其收敛速度一般比较慢。
区别点在于:整个训练集做一次损失函数计算还是一个小批量样本做一次损失函数计算
随机梯度下降法(SGD)
SGD每步做什么,为什么能online learning?
随机梯度下降算法是另外一个极端,损失函数是针对训练集中的一个训练样本计算的,又称为在线学习,即得到了一个样本,就可以执行一次参数更新。所以其收敛速度会快一些,但是有可能出现目标函数值震荡现象,因为高频率的参数更新导致了高方差。
区别点在于:训练集中的一个训练样本做一次损失函数计算
动量梯度下降法(Momentum)
引入一个指数加权平均的知识点。也就是下图中的前两行公式。使用这个公式,可以将之前的dW和db都联系起来,不再是每一次梯度都是独立的情况。
参考资料
RMSprop
$$ S_{dW}=\beta S_{dW}+\left ( 1-\beta \right )dW^{2} $$
$$ S_{db}=\beta S_{db}+\left ( 1-\beta \right )db^{2} $$
$$ W=W-\alpha\frac{dW}{\sqrt{S_{dW}}}, b=b-\alpha\frac{db}{\sqrt{S_{db}}} $$
更新权重的时候,使用除根号的方法,可以使较大的梯度大幅度变小,而较小的梯度小幅度变小,这样就可以使较大梯度方向上的波动小下来,那么整个梯度下降的过程中摆动就会比较小
Adagrad
Adam
Adam算法结合了Momentum和RMSprop梯度下降法,是一种极其常见的学习算法,被证明能有效适用于不同神经网络,适用于广泛的结构。 $$ v_{dW}=\beta_{1} v_{dW}+\left ( 1-\beta_{1} \right )dW $$
$$ v_{db}=\beta_{1} v_{db}+\left ( 1-\beta_{1} \right )db $$
$$ S_{dW}=\beta_{2} S_{dW}+\left ( 1-\beta_{2} \right )dW^{2} $$
$$ S_{db}=\beta_{2} S_{db}+\left ( 1-\beta_{2} \right )db^{2} $$
$$ v_{dW}^{corrected}=\frac{v_{dW}}{1-\beta_{1}^{t}} $$
$$ v_{db}^{corrected}=\frac{v_{db}}{1-\beta_{1}^{t}} $$
$$ S_{dW}^{corrected}=\frac{S_{dW}}{1-\beta_{2}^{t}} $$
$$ S_{db}^{corrected}=\frac{S_{db}}{1-\beta_{2}^{t}} $$
$$ W:=W-\frac{av_{dW}^{corrected}}{\sqrt{S_{dW}^{corrected}}+\varepsilon } $$
超参数: $$ \alpha ,\beta {1},\beta{2},\varepsilon $$
t是迭代次数
Adam 优化器的迭代公式
正则化方法
参考资料
深度学习训练中是否有必要使用L1获得稀疏解?
参考资料
归一化方法
Batch Normalization(BN)
BN 原理
为了解决 ICS 的问题,(但是有人求证过了,ICS 的问题并不能完全解决),BN启发于白化操作。
因为深层神经网络在做非线性变换前的激活输入值(就是那个x=WU+B,U是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的.
BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布 ,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,
上面记不住没关系,记住“保持数据同分布”即可
参考资料
手写 BN
的简单计算步骤为:
沿着通道计算每个batch的均值$\mu=\frac{1}{m} \sum_{i=1}^{m} x_{i}$。
沿着通道计算每个$batch$的方差$\delta^{2}=\frac{1}{m} \sum_{i=1}^{m}\left(x_{i}-\mu_{\mathcal{B}}\right)^{2}$。
对x做归一化,
- 加入缩放和平移变量$\gamma$和$\beta$ ,归一化后的值,$y_{i} \leftarrow \gamma \widehat{x}_{i}+\beta$
$BN$适用于判别模型中,比如图片分类模型。因为$BN$注重对每个$batch$进行归一化,从而保证数据分布的一致性,而判别模型的结果正是取决于数据整体分布。但是$BN$对$batchsize$的大小比较敏感,由于每次计算均值和方差是在一个$batch$上,所以如果$batchsize$太小,则计算的均值、方差不足以代表整个数据分布。
BN 的作用?
$BN$加快网络的训练与收敛的速度
在深度神经网络中中,如果每层的数据分布都不一样的话,将会导致网络非常难收敛和训练。如果把每层的数据都在转换在均值为零,方差为1 的状态下,这样每层数据的分布都是一样的训练会比较容易收敛。
控制梯度爆炸防止梯度消失
以$sigmoid$函数为例,$sigmoid$函数使得输出在$[0,1]$之间,实际上当 输入过大或者过小,经过sigmoid函数后输出范围就会变得很小,而且反向传播时的梯度也会非常小,从而导致梯度消失,同时也会导致网络学习速率过慢;同时由于网络的前端比后端求梯度需要进行更多次的求导运算,最终会出现网络后端一直学习,而前端几乎不学习的情况。Batch Normalization (BN) 通常被添加在每一个全连接和激励函数之间,使数据在进入激活函数之前集中分布在0值附近,大部分激活函数输入在0周围时输出会有加大变化。
同样,使用了$BN$之后,可以使得权值不会很大,不会有梯度爆炸的问题。
防止过拟合
在网络的训练中,BN的使用使得一个$minibatch$中所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果,即同样一个样本的输出不再仅仅取决于样本的本身,也取决于跟这个样本同属一个$batch$的其他样本,而每次网络都是随机取$batch$,比较多样,可以在一定程度上避免了过拟合。
【Tips】BN层的作用: (1)加速收敛 //数据同分布,缓解了ICS现象,并且可使用更大的学习率和更多的激活函数。 (2)控制过拟合,可以少用或不用Dropout和正则 //引用均值和方差,增加数据噪声,即数据增强 (3)允许使用较大的学习率 // 数据同分布 在使用BN前,减小学习率、小心的权重初始化的目的是:使其输出的数据分布不要发生太大的变化。
BN 有哪些参数?
γ和β两个尺度变化系数
BN 的反向传播推导
下面来一个背诵版本:
BN 在训练和测试的区别?
BN 是放在激活前面还是后面?
一般是放在激活层前面,但是自己做了一些实验,和网上有大佬的说法结合,放在前后的差别并不大,我做的实验是语音唤醒,非 CV 实验。但是一般使用的时候都是放在前面的。