码迷,mamicode.com
首页 > 其他好文 > 详细

深度学习性能的提升

时间:2020-02-04 22:07:11      阅读:95      评论:0      收藏:0      [点我收藏+]

标签:算法   text   mit   函数   logs   神经元   出现   alt   计算   

虽然之前已经大概介绍了关于神经网络的基本结构,但是对于神经网络来说,还有很多可以提升的地方,包括不限于:参数的初始化,正则化,检测方式,除了梯度下降以外的优化算法,超参的调试,批量标准化,和TensorFlow等等。下面我们依次来介绍。

参数的初始化

由于梯度消失/爆炸的原因,参数的初始化关系着神经网络模型性能的问题。常见的参数的初始化有以下几种:

  1. 0初始化
  2. 随机初始化
  3. He初始化
0初始化:

所谓0初始化就是将所有的参数都初始化为零,但是由于初始化的值是一样的,它将不能破坏对称,以至于所有同源的参数的值将永远一样。

参数对称性

具有相同激活函数的两个隐藏单元连接到相同单元,那么这些单元必须具有不同的初始参数。一旦他们具有相同的初始参数,然后应用到确定性损失和模型的确定性学习算法将一直以相同的方式更新这两个单元。

随机初始化:

为了破坏对称,我们可以用随机初始化参数。但是随机初始化同样会陷入梯度消失/爆炸的问题,使得学习速率很慢或使得模型准确率下降。

梯度消失/爆炸:

那么什么是梯度消失和梯度爆炸呢?


技术图片
Fig. 1 梯度消失示意图

假设我们有一个很深的神经网络结构,如图Fig.1:假设我们的激励函数是线性的,如\(g^{[l]}(z)=z\),且\(W^{[l]}=\left[\begin{array}{cc} \frac{1}{2} &0\\0 &\frac{1}{2} \end{array}\right]\),那么我们可以得出:
\begin{equation}
\hat{y} = W^{[L]}\left[\begin{array}{cc} \frac{1}{2} &0\0 &\frac{1}{2} \end{array}\right]^{[L-1]}X
\end{equation}
由以上公式我们可以看出\(\hat{y}\)是趋近于0的,假如\(W^{[l]}<I\)那么\(\hat{y}\)则是无穷大的。因此在梯度下降的时候学习速率可能会特别小(梯度消失),或特别大(梯度爆炸)。

He初始化:

He初始化是在随机初始化的基础上,使得每一层的参数\(W^{[l]}\)经过缩放,使得\(A^{[l]}\)\(X\)均值类似,因此随机初始化的方差应为:\(\sqrt{\frac{2}{n^{l-1}}}\)
对于均值类似的原因从直观上来说:\(Z = w_1x_1 + ... + w_n x_n\)因此,当\(n\)越大的时候,\(Z\)的值越大,越容易出现梯度爆炸,因此直观上来说我们可以把\(w\)的方差\(var(w_i) = \frac{1}{n}\),事实上对于\(Relu\)激励函数来说我们常设为\(\frac{2}{n}\)\(n\)是前一层神经元的个数。

正则化

对于正则化我们主要解释两种正则化的方法:L2正则化和Dropout。那么,增加正则化项的目的是什么呢?在此之前,我们介绍一下过度拟合的问题:

过度拟合

我们在Fig. 2 可以看到,拟合状态分为以下三种,分别是:欠拟合,正常拟合和过度拟合。


技术图片
Fig. 2 拟合状态

在欠拟合状态中,由于系统过于简单,使得系统的偏值(bias)很大,导致无论是训练集误差,还是测试集误差都很大。而在过度拟合状态中,又是由于系统过于复杂,使得系统的方差(variance)很大,导致虽然训练集的误差小,但是测试集的误差还是很大。因此,如何平衡系统的复杂程度,使得系统的效果达到最好呢?这时候就用到了L2正则化和Dropout了

L2正则化

我们在神经网络的正向和反向传播中提及了Loss函数是:


\(J = -\frac{1}{m} \sum\limits_{i = 1}^{m} \large{(}\small y^{(i)}\log\left(a^{[L](i)}\right) + (1-y^{(i)})\log\left(1- a^{[L](i)}\right) \large{)} \tag{2}\)

而L2正则化则是在Loss函数的基础上,增加了L2正则化项:

\(J_{regularized} = \small \underbrace{-\frac{1}{m} \sum\limits_{i = 1}^{m} \large{(}\small y^{(i)}\log\left(a^{[L] (i)}\right) + (1-y^{(i)})\log\left(1- a^{[L](i)}\right) \large{)} }_\text{cross-entropy cost} + \underbrace{\frac{1}{m} \frac{\lambda}{2} \sum\limits_l\sum\limits_k\sum\limits_j W_{k,j}^{[l]2} }_\text{L2 regularization cost} \tag{3}\)

我们在成本函数可以看到,当参数值增大的时候成本函数会增加,因此可以用L2正则化来同时限制参数的大小,并且使得模型正确。但是由于成本函数的改变,在计算导数的时候也需要增加L2正则化的项。

Dropout

Dropout是正则化的一种方式,由名字退出(drop out)可以看出,它是以随机除去神经元来使得减少某个神经元的依赖程度,达到可以使用正则化的方式。在应用过程中,我们设置一个新的变量\(D^{[l]} = \left[ d^{[l](1)}\, ... \,d^{[l](m)}\right]\)用以表示第\(l\)个隐藏层的\(D\),其中每一个\(d^{(i)}\)表示在第\(i\)个数据下的\(d\),而\(d\)表示的是该神经元是否隐藏。因此它将是一个由\(0\)\(1\)组成的向量。使用\(d^{[l](i)} = np.random.rand(a^{[l](i)}.shape)<keep\_prob\)来设置\(d\)\(D\)。之后为了使得输出结构的均值保持不变,在使用了Dropout的隐藏层在正向传播求得\(A^{[l]}\)之后还要再除以\(keep\_prob\)。并且在反向传播时也要将\(dA = \frac{dA}{keep\_prob}\)

梯度检查

梯度检查是在检测Bug的过程中查看反向传播是否有错误的方法。使用公式:
\begin{equation}
\frac{\partial J}{\partial \theta} = \lim_{\varepsilon \to 0} \frac{J(\theta + \varepsilon) - J(\theta - \varepsilon)}{2 \varepsilon}
\end{equation}
来进行梯度检查。
\begin{equation}
difference = \frac {\mid\mid grad - gradapprox \mid\mid_2}{\mid\mid grad \mid\mid_2 + \mid\mid gradapprox \mid\mid_2}
\end{equation}
\(gradapprox = \frac{J^+-J^-}{2\varepsilon}\)
\(difference <10^{-7}\)时,我们说梯度计算是正确的。

深度学习性能的提升

标签:算法   text   mit   函数   logs   神经元   出现   alt   计算   

原文地址:https://www.cnblogs.com/x1ao/p/12261592.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!