文章目录
Mini-batch SGD(最小批量随机梯度下降)的整个过程:
- 对数据进行连续的批量抽样
- 通过计算图或神经网络将数据进行正向传播,最终得到损失值
- 通过整个网络反向传播计算梯度
- 使用梯度来更新网络中的参数或者权重
Activation Functions(激活函数)
输入数据,在全连接层或者卷积层将输入乘以一个权重值,然后将结果输入一个激活函数或者非线性单元。
Sigmoid
从这个函数,我们可以知道:
- 对于输入,每个输出都被压缩到[0,1]范围内
- Sigmoid在某种意义上可以被看作是一种饱和的“firing rate”(只要范围在[0,1]之间的都可以叫做“firing rate”)
Problems:
- 饱和神经元将使梯度消失:
从图像可以看出,当x的绝对值很大或者很小的时候,图像位于平滑区,梯度接近于0。 - Sigmoid函数是一个非零中心的函数:
由于d(f)/d(w) = x,当输入x均为正时,对w的梯度就为正,当输入x均为负时,对w的梯度就为负,他们总是朝着同一个方向移动,当我们在做参数更新时,可以选择用同一个正数(负数)或者不同的正数(负数)去增加(减小)所有的w值,但是这种方法对于梯度更新来说是十分低效的。
例如上图右边的部分:假设w是二维的,那么只能沿着两个方向更新,要么正向增加,要么负向减少,如果最优的w是蓝色的方向,那么我们只能在允许的两个方向做梯度更新,即图中沿红色箭头的方向,这就是我们一般使用输入x的均值为0的数据的原因,这样我们就能得到正的和负的数值,而不至于使梯度更新只沿着一个方向移动。 - 使用了指数函数的计算代价会比较高
tanh
从tanh激活函数我们可以知道:
- tanh的取值范围是[-1,1]
- 以0为中心的(zero centered)
- tanh在饱和的时候仍然会出现梯度消失的问题
ReLU
从ReLU激活函数我们可以知道:
- 该函数在正方向上不会达到饱和,所以我们在输入空间的一半都不会存在饱和现象
- 计算成本不高,计算高效,只有简单的max函数
- 一般情况下使用ReLU比较多,它比sigmoid/tanh函数都收敛得更快,大约快6倍
- 比sigmoid函数更具备生物学上的合理性
ReLU存在的问题:
- Not zero-centered,sigmoid和ReLU都存在这个问题,tanh不存在这个问题
- 在x>0的区域中,梯度正常;x<0的区域中,梯度消失;x=0的时候,梯度不确定,在实际中,一般取0
Leaky ReLU
从Leaky ReLU我们可以发现:
- 这个函数没有饱和的概念
- 没有涉及到exp的计算,计算高效
- 比sigmoid/tanh函数收敛快,大约是其6倍
- 没有"die"的问题
PReLU
![](https://i-blog.csdnimg.cn/blog_migrate/8438fc37e5935b59e958acbe2586531c.png)
这个激活函数和Leaky ReLU很相似,不同之处在于其负区间的梯度是由 α \alpha α参数确定的,所以我们不需要指定它,不用硬编码它,而是把它当作一个可以反向传播和学习的参数,相比之前的激活函数更加灵活。
ELU
我们可以发现ELU:
- 具有所有ReLU的优点
- 输出接近于0均值
- 相对于Leaky ReLU,ELU在负区间没有倾斜,这实际上是一个负饱和的机制,这样使模型对噪声具有更强的鲁棒性
- 使用到exp的计算,计算更加复杂
Maxout “Neuron”
从Maxout "Neuron"我们可以发现:
- 没有先做点积运算,而是把元素级的非线性特征提前
- 泛化了ReLU和Leaky ReLu,因为这个激活函数只是提取了这两个线性函数的最大值
存在的问题:
会把每个神经元的参数数量翻倍,若每个神经元原来有权重集W,但是现在有了
W
1
W_1
W1和
W
2
W_2
W2,相当于原来的两倍。
一般我们在考虑激活函数时,最好的经验法则是使用ReLU,然后调整学习率,也可以尝试着使用Leaky ReLU、Maxout、ELU三种激活函数,这些激活函数可以用于实验,但是实用性比较弱,也可以尝试着使用tanh,但是不是经常使用,一般不会使用sigmoid函数,这是最原始的激活函数之一。
Data Preprocessing(数据预处理)
一般数据预处理的过程主要有:zero-centered data和normalized data,也可能会用到PCA和Whitening。
数据预处理一般是只做zero-centered,主要有两种思路:(1)减去所有训练集图像的均值。(2)减去训练集图像的单通道均值,如RGB图像,有三个通道,每个通道有一个均值,我们用输入图片的三个通道分别减去对应通道的均值。
Weight Initialization(权重初始化)
问题1:如果我们把所有的参数都设置为0
所有的神经元都在你的输入数据上做相同的事情,然后输出相同的数值,并且得到相同的梯度,然后用相同的方式更新,最后得到完全相同的神经元。当我们用相同的值去初始化所有的参数时,就会出现这样的问题。
解决措施1:将所有权重设为一个小的随机数,可以从一个概率分布中抽样。这种方法在比较小的网络中适用,但是在比较深的网络中不适用。
如果增大W的值,使用tanh激活函数的话,参考tanh的图像,终会达到饱和,不管是正方向还是负方向,梯度都会变为0,使权值得不到更新。
因此,权值的初始化是一个比较复杂的问题,初始值太小,网络容易崩溃,初始值太大,网络容易达到饱和。经过研究发现,一个很好的初始化经验是Xavier初始化:思想是我们需要从高斯分布中抽样,然后根据根据我们拥有的输入量,来进行缩放。
具体操作是:要求输入的方差等于输出的方差,推到出权重应该是多少。直觉上来说,如果输入量较小,我们需要较大的权重,反之,如果输入量较大,我们需要较小的权重
Batch Normalization(批量归一化)
对输入数据做了归一化处理,就是将每个特征在所有样本上的值转归一化成均值0方差1。这样我们保证训练数据里数值都同样量级上,从而使得训练的时候数值更加稳定。假设训练样本总数为N,每个训练样本有D维,那么首先,单独地计算每个维度的均值和方差;然后利用公式进行归一化。
一般来说,Batch Normalization是插入在全连接层或者卷积层之后,而在非线性层(激活函数)之前的。
完成归一化之后,我们可以对归一化后的结果进行一定程度的缩放,先使用
γ
\gamma
γ进行缩放,再用
β
\beta
β进行平移。若
γ
\gamma
γ,为方差,
β
\beta
β,为均值。这样就可以恢复恒等映射,就像没有进行归一化一样,这个过程其实就是归一化公式的变形。
总结批量归一化的思想:
我们计算输入的mini-batch的均值和方差,通过均值和方差进行归一化,然后还有额外的缩放和平移因子,从而改进了整个网络的梯度流,具有更高的鲁棒性,可以使网络在更广泛的学习率和不同的初始值下工作,使用了归一化之后训练更加容易。另一个角度来看,归一化也是正则化的一种方法。
Babysitting the Learning Process(训练过程监控)
学习率(learning rate):即步长stride,是反向传播中的η:
学习率大小:
学习率大 | 学习率小 | |
---|---|---|
学习速度 | 快 | 慢 |
使用时间点 | 刚开始训练时 | 一定轮数过后 |
副作用 | 1.易损失值爆炸;2.易振荡。 | 1.易过拟合;2.收敛速度慢。 |
Hyperparameter Optimization(超参数优化)
超参数优化,我们一般采用的策略是:交叉验证(cross-validation)
是一种统计学上将数据样本切割成较小子集的实用方法。于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证。 一开始的子集被称为训练集。而其它的子集则被称为验证集或测试集。交叉验证是一种评估统计分析、机器学习算法对独立于训练数据的数据集的泛化能力。
交叉验证一般要满足:
- 训练集的比例要足够多,一般大于一半
- 训练集和测试集要均匀抽样