李宏毅机器学习(六) 神经网络训练技巧(3)
神经网络训练技巧(3)
分类
- 可以将分类任务看作回归任务

我们只需要将类别设置为数字,然后使用回归来拟合这个数字,从而达到分类的目的。
但是单纯的将每一个分类设为一个数字,数字之间所包含的大小信息被包含了进来,这不是我们想要的结果,所以我们将类别设为one-hot向量,去掉数值大小带来的噪声。
原本的Class转化为one-hot向量后,网络的输出也可以改为多个预测0和1的输出,数量和one-hot维度相同。
更改后的模型如下图所示。

- 损失函数
损失函数一般有两种:Mean Square Error (MSE,均方根误差) 和 Cross-entropy(交叉熵),对于分类任务而言,交叉熵更适合。

使用交叉熵作为损失函数,其error surface相较于使用MSE更平滑,更容易训练。
Batch Normalization
参考资料:
- Batch Normalization 学习笔记
- 《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》
作者:hjimce
Batch Normalization:在神经网络每一步中对数据进行归一化,有利于网络学习数据分布。
我们知道在神经网络训练开始前,都要对输入数据做一个归一化处理,那么具体为什么需要归一化呢?归一化后有什么好处呢?原因在于神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。
————————————————
版权声明:本文为CSDN博主「hjimce」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hjimce/article/details/50866313
Internal Covariate Shift:前层网络参数更新,导致后层输入数据分布情况改变。
我们知道网络一旦train起来,那么参数就要发生更新,除了输入层的数据外(因为输入层数据,我们已经人为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。以网络第二层为例:网络的第二层输入,是由第一层的参数和input计算得到的,而第一层的参数在整个训练过程中一直在变化,因此必然会引起后面每一层输入数据分布的改变。我们把网络中间层在训练过程中,数据分布的改变称之为:“Internal Covariate Shift”。
————————————————
版权声明:本文为CSDN博主「hjimce」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hjimce/article/details/50866313
数据预处理:
\(E[x^{(k)}]\):每一批训练数据神经元\(x^{(k)}\)的平均值
\(\sqrt{Var[x^{(k)}]}\):每一批数据神经元xk激活度的一个标准差
-
如果只是这样在每一层都这样简单的预处理,并不妥当
其实如果是仅仅使用上面的归一化公式,对网络某一层A的输出数据做归一化,然后送入网络下一层B,这样是会影响到本层网络A所学习到的特征的。打个比方,比如我网络中间某一层学习到特征数据本身就分布在S型激活函数的两侧,你强制把它给我归一化处理、标准差也限制在了1,把数据变换成分布于s函数的中间部分,这样就相当于我这一层网络所学习到的特征分布被你搞坏了
————————————————
版权声明:本文为CSDN博主「hjimce」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hjimce/article/details/50866313
变换重构:为了解决简单预处理带来的问题,作者提出变换重构,引入了可学习参数\(\gamma\)、\(\beta\), 让我们的网络可以学习恢复出原始网络所要学习的特征分布。
其中\(\gamma\)、\(\beta\) 取值
更新过程:

m: mini-batch size
实际使用:
测试阶段我们一般只输入一个测试样本,看看结果而已。因此测试样本,前向传导的时候,上面的均值u、标准差σ 要哪里来?其实网络一旦训练完毕,参数都是固定的,这个时候即使是每批训练样本进入网络,那么BN层计算的均值u、和标准差都是固定不变的。我们可以采用这些数值来作为测试样本所需要的均值、标准差,于是最后测试阶段的u和σ 计算公式如下:
\[\begin{aligned} \mathrm{E}[x] & \leftarrow \mathrm{E}_{\mathcal{B}}\left[\mu_{\mathcal{B}}\right] \\ \operatorname{Var}[x] & \leftarrow \frac{m}{m-1} \mathrm{E}_{\mathcal{B}}\left[\sigma_{\mathcal{B}}^{2}\right] \end{aligned} \]
上面简单理解就是:对于均值来说直接计算所有batch \(\mu\)值的平均值;然后对于标准偏差采用每个batch \(\sigma_B\)的无偏估计。最后测试阶段,BN的使用公式就是:
\[y=\frac{\gamma}{\sqrt{\operatorname{Var}[x]+\epsilon}} \cdot x+\left(\beta-\frac{\gamma \mathrm{E}[x]}{\sqrt{\operatorname{Var}[x]+\epsilon}}\right) \]————————————————
版权声明:本文为CSDN博主「hjimce」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hjimce/article/details/50866313

浙公网安备 33010602011771号