[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

Deep learning

  深度学习其实就是使用多层的神经网络模型来进行机器学习。神经网络也有很多种,最基本的全连接前馈神经网络的原理其实并不复杂,就是多个线性函数加一个**函数构成一个个神经元,神经元的左边是线性函数的输入,神经元的输出是线性函数经过**函数后的值,每层有多个神经元,如果将**函数选为 sigmoid 函数的话,每个神经元的输入输出其实就是前面所讲的 logistic regression 的输入输出,每层的多个神经元的关系其实就是多个 Logistic Regression 的关系。层与层之间的关系是前一层的输出是后一层的输入。其结构如下所示,红框就是一个神经元:

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

  全连接前馈神经网络的最后一层会是一个 softmax 层,这个和多分类任务中最后要通过一个 softmax 函数是一样的。多分类(N 分类)任务中,其实就是训练了 N 个分类器,每个类一个分类器,最后将一个待预测的样本分别输入到这 N 个分类器中得到 N 个结果,softmax做了一个放大的作用,使大的更大小的更小,最后的结果其实就是这个样本分别属于某个类的概率。例如第 n n n 分类器的输出为 x n x_n xn ,则该样本属于第 n n n 类的概率是:
y n = e x n ∑ i = 1 N e x i y_n = \frac {e^{x_n}} {\sum_{i=1}^Ne^{x_i}} yn=i=1Nexiexn

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

  如果只看神经网络的倒数第二层和最后的输出层,其实这就是一个普通的多分类 Logistic regression ,只不过输入的不是原来的 x \boldsymbol x x 了,而是经过了多个隐藏层变换后的 x 1 , . . . , x K x_1, ... ,x_K x1,...,xK 。在很多应用上,中间的隐藏层取代了原来需要人为设计的特征工程的部分,原来的特征提取是依靠人对某一个专门的应用来实现的。现在就交给了隐藏层自己去寻找。但其实,隐藏层的结构还是需要人自主去设计的,所以对于一个问题,使用深度学习其实并不能算是简化了问题的难度,而是把一个问题变成了另一个问题,即把原来需要人来进行特征提取的难题变成了如何设计神经网络的结构的问题。如果对设计网络结构更有经验的话,那么可能直接使用一个神经网络来完成某个问题的效果会更好,而如果对特征变换掌握的更好的话,运用特征变换的方法可能效果会更好。比如在语音辨识问题上,现在的深度学习网络能够替代原先的很多人为设计的特征变换的模块,但依旧无法取代离散傅里叶变化那部分,至少仅仅只能达到相似的效果,这可能说明,离散傅里叶变换还是很有效的特征变换方式。直接使用这个变换而非想要训练一个网络来替代至少目前来说还是更有效的。

Neural network

  神经网络的训练步骤和前面所学的线性回归、Logistic Regression 并没有什么区别,第一步都是确定你的函数集或者说你的模型是什么样的,在神经网络中具体就是你使用什么网络(全连接前馈神经网络?卷积神经网络?反馈神经网络?),每个层有几个神经元,准备设几个层。

  第二步是决定怎么度量你的模型的好坏,比如在线性回归中采用的模型的输出与标签差值的平方作为损失值,而 Logistic Regress 中采用的是交叉熵,在神经网络中进行分类任务时也是采用的交叉熵来度量模型在训练集上的表现,其公式为:
C ( y , y ^ ) = − ∑ i = 1 N y i ^ ln ⁡ y i C(y,\hat {y}) = -\sum_{i=1}^N \hat{y_i} \ln y_i C(y,y^)=i=1Nyi^lnyi
  在所有训练集样本上的损失就是每个样本的交叉熵的和或均值。

  第三步就是决定采用什么方法来寻找损失值最小时的模型参数,也就是优化问题,在神经网络上采用的依旧是前面用到的梯度下降的方法来进行,不同的是,由于神经网络非常的复杂,像原来一样通过公式计算梯度的表达式是一件不太现实的事,神经网络是通过 Backpropagation 来实现的。

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

Backpropagation

  反向传播的数学原理就是微积分中的链式法则 (Chain rule) ,也就是复合函数的求导法则。具体有两种情况:

  Case 1 : y = g ( x ) 、 z = h ( y ) y = g(x)、z=h(y) y=g(x)z=h(y) ,则有
d z d x = d z d y d y d x \frac {dz} {dx} = \frac {dz} {dy}\frac {dy} {dx} dxdz=dydzdxdy
  Case 2 : x = g ( s ) 、 y = h ( s ) 、 z = f ( x , y ) x=g(s)、y=h(s)、z=f(x,y) x=g(s)y=h(s)z=f(x,y) ,则有
d z d s = ∂ z ∂ x d x d s + ∂ z ∂ y d y d s \frac {dz} {ds} = \frac {\partial z} {\partial x}\frac {dx} {ds}+\frac {\partial z} {\partial y}\frac {dy} {ds} dsdz=xzdsdx+yzdsdy
  对应到神经网络中,我们想要训练的参数是网络中的每条线上的权重值,例如对下图中任意一个神经元,我们想要算其中一个权重参数 w 1 w_1 w1 的偏导 ∂ C ∂ w 1 \frac {\partial C} {\partial w_1} w1C ,其中 C C C 是度量神经网络好坏的交叉熵函数:

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

  那么由链式法则(case 1中的原理):
∂ C ∂ w 1 = ∂ C ∂ z ∂ z ∂ w 1 = ∂ C ∂ a ∂ a ∂ z ∂ z ∂ w 1 \begin{aligned} \frac {\partial C} {\partial w_1} &= \frac {\partial C} {\partial z}\frac {\partial z} {\partial w_1} \\ &=\frac {\partial C} {\partial a}\frac {\partial a} {\partial z}\frac {\partial z} {\partial w_1} \end{aligned} w1C=zCw1z=aCzaw1z
  其中 z = w 1 x 1 + w 2 x 2 、 a = 1 1 + exp ⁡ ( − z ) z=w_1x_1+w_2x_2、a=\frac {1} {1+\exp{(-z)}} z=w1x1+w2x2a=1+exp(z)1 ,所以:
∂ z ∂ w 1 = x 1 ∂ a ∂ z = σ ( z ) ( 1 − σ ( z ) ) \frac {\partial z} {\partial w_1} = x_1 \\ \frac {\partial a} {\partial z} = \sigma(z)(1-\sigma(z)) w1z=x1za=σ(z)(1σ(z))
   x 、 z x、z xz 都是在前向传播中算出来的,其实是常数,所以未知的就是 ∂ C ∂ a \frac {\partial C} {\partial a} aC 这一项了。而根据链式法则的 Case 2 的原理:
∂ C ∂ a = ∂ C ∂ z ′ ∂ z ′ ∂ a + ∂ C ∂ z ′ ′ ∂ z ′ ′ ∂ a = ∂ C ∂ z ′ w 3 + ∂ C ∂ z ′ ′ w 4 \begin{aligned} \frac {\partial C} {\partial a} &= \frac {\partial C} {\partial z'}\frac {\partial z'} {\partial a}+\frac {\partial C} {\partial z''}\frac {\partial z''} {\partial a} \\ &=\frac {\partial C} {\partial z'}w_3+\frac {\partial C} {\partial z''}w_4 \end{aligned} aC=zCaz+zCaz=zCw3+zCw4
  问题又变成了上式中的两项偏导是未知的了,但如果上式的 z ′ 、 z ′ ′ z'、z'' zz 是最后一层的输出 y 1 , y 2 y_1,y_2 y1,y2 那么上式就是可以求出来的。那么导数第二次的偏导也就可以求了,依次类推,从后往前可以求出每个 w w w 的偏导,这样就可以进行梯度下降了。

  正是因为梯度是从后往前算的,计算前面的梯度需要用到后面的,所以被称为反向传播。计算每一层的输出值是从前往后的,被称为前向传播。

Why deep learning?

  深度学习是多层的神经网络,那么层数是越多越好吗?其实已经有人证明了,任何连续的方程都能只用一个隐藏层的神经网络构建,只要神经元的个数足够多,那么还有必要弄很多层吗?

  是有必要的。因为在参数差不多的条件下,一层的神经网络是矮胖型的,深层神经网络是瘦高型的,在实际使用中,在这个条件下,瘦高型的神经网络的准确率要比矮胖型的高很多。怎么来理解这种现象呢?你可以想象分层后的神经网络是模块化后的网络,就像编程中,我们不可能将一个上千行的代码只用一个main函数实现,肯定是要编写很多函数的,函数还可能调用其他函数。而且模块化后的神经网络还能只需要更少的数据集。例如在一个长短发、男女生的分类任务中,单层的网络需要为每个类别训练一个分类器,并且即使有部分特性相同数据集也无法公用,因为还有一部分不同,而两层的神经网络可以在第一层将任务分成两个,再根据这两个分类器的结果输出最后的结果,这样数据集也只需更少就能达到更好的效果。

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)
[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)
[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

Convolutional Neural Network

  卷积神经网络是层与层之间的神经元部分连接,并共享权值的全连接神经网络。还要一点不同的是,在某一层中有多个卷积核的话,相当于那一层有多层神经元叠在一起,最后的结果是同一个位置不同层的神经元的求和。除了卷积层外,卷积神经网络中一般还有池化层(Max pooling),用于减少参数。使用卷积神经网络是为了解决图像识别中的两个问题,第一个问题是某一个特征一般只会出现在图片的局部不用看整张图片,并且同一个特征在不同图片上可能存在不同的位置,使用全连接网络的话就需要设置多个神经元来分别检测。

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

  第二个问题是,即使对图片进行欠采样,也不会理解人们对图片的理解,就像下图,即使去掉四分之一三的像素点也能看出这是只鸟。

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

  经过多次卷积、池化后,将所有的参数拉成一个向量(flatten)再输出到一个全连接神经网络中就构成了CNN的整个结构了。

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

什么时候用 CNN ?

  卷积神经网络在图像处理中很常用,在一些其他任务上也有很广泛的应用。那么我们应该怎么用,什么时候用呢?正确答案是观察你所要处理的问题是否具有 CNN 满足的特性,而不可直接简单的套用。例如在图片识别中,降采样也不会丢失图片的类别信息,所以池化层的存在是合理的。而在 Alpha Go 中,棋盘上的每个格子的信息都是有用的,降采样就会丢失信息,再降采样就不太可能得到好的结果了,事实也是,虽然 Alpha Go 使用了 CNN ,但没用池化层。再比如在语言识别上,可以将一段声音短时傅里叶变换得到一个光谱图。在移动卷积核的时候,在时间上移动往往没有什么效果,而在频率轴上移动会有更好的效果,因为不同人对同一句话的发音的模式可能是相同的,而音调可能不同,造成频率不同。这与一张图上某一个特征可能出现在不同位置的原理是相同的。

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

  综上,一定要根据任务数据的特性和实际含义以及各种网络各自的特性来挑选“工具”,才能得到不错的效果,而不会白费功夫。

Tips for deep learning

  训练好一个神经网络后,你的网络可能在训练集上的表现就不是很好,也可能在训练集上的表现还行,但在测试集上的表现不好。有各种原因会造成这两种情况。首先来看训练集上的表现不是很好应该怎么办,训练集上不好并不意味着是欠拟合(模型不够复杂造成的表现不好),有可能是你的模型没有训练好久停下来了,这个时候你得去检查你的模型有没有问题,或者使用其他**函数或使用其他的动态调整学习率的方法来改进模型。

  当你的模型能够在训练集上表现的不错后,再来看测试集上表现差的问题。这个时候才有可能是模型过拟合了,这里值得注意的是不要一看到测试集上表现的不好就认为是过拟合了,也许在测试集上表现的也不好,所以要先去做上面那步。过拟合的解决方法有早停、正则化和 dropout 这三种。这两个调制模型的步骤如下图所示:

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

New activation function

  前面所讲的**函数是 sigmoid function ,然而这个**函数其实会有问题,使用这个**函数的时候,当增加层数的时候,模型在测试集上的表现反而会变差。这是由于这个**函数有梯度消失问题(Vanishing Gradient problem) 这个问题是在训练一个网络的时候,如果层数很深的话,靠近输入层的参数还没怎么更新,靠近输出层的参数已经更新了很大了,这个时候靠近输出层的参数已经训练好了,而靠近输入层的参数还是几乎是初始的时候随机设置的。

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

  为什么会造成这个问题呢?其实是由 sigmoid function 的特性决定的,因为这个方程将原来的线性输出从值域是无穷的范围内压缩到了 [ 0 , 1 ] [0,1] [0,1] ,这样当靠近前面层的权重更新一个 d w dw dw ,经过一个 sigmoid function 后,会被衰减一次,经过的层数越多,衰减的越多,所以前面的参数即使变得很大,对最后的输出的影响也很小,这样前面的梯度更新时并不会引起输出的很大变化,就会被误认为是已经到了最小值点了,实际可能还没有。

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

Rectified Linear Unit (ReLU)

  为了解决上面所说的梯度消失的问题,可以使用一种新的**函数 R e L U \rm ReLU ReLU,他在小于 0 0 0 的时候恒等于 0 0 0,大于 0 0 0 的时候就还是线性的,输入等于输出。
R e L U ( x ) = { x if  x ≥ 0 0 otherwise {\rm ReLU} (x) = \begin{cases} x & \text{if $x \ge 0$} \\ 0 & \text{otherwise} \end{cases} ReLU(x)={x0if x0otherwise

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

  你可能会担心这个函数是不可微的,但是在梯度下降中是要算微分的,其实不用担心这个问题,因为只有 0 0 0 这个点是不可微的,然而基本不会正好为 0 0 0 的,就算真的取到 0 0 0 了,随便给个 0 0 0 作为他的微分就好,这不是什么大问题。使用 R e L U \rm ReLU ReLU 后,如果输出为 0 0 0 的话,其实就相当于那些神经元被拿掉了。这里可能还会有一个问题,那就是 R e L U \rm ReLU ReLU 是线性的,那神经网络会不会变成了一个线性的呢?其实是不会的,我的理解是在某一个神经元是线性的,但是前一层的输出是下一层的输入,两层的线性函数符合在一起就不是线性的了,变成了多项式函数,如果层数很多的话次数就更高了,变成了非线性的,这是我的理解,还有很多别的解释(老师课上的解释我没听懂。。。)

ReLU 变体

  在 R e L U \rm ReLU ReLU 的基础上还有一些变体,比如说 L e a k y   R e L U \rm Leaky\ ReLU Leaky ReLU 是在小于 0 0 0 的部分不是恒等于 0 0 0 ,而是一个斜率为 0.01 0.01 0.01 的直线,更广泛一点的是 P a r a m e t r i c   R e L U \rm Parametric\ ReLU Parametric ReLU (好像也叫 P − R e L U \rm P-ReLU PReLU)是一条斜率为 $\alpha $ 的斜线,这个 α \alpha α 是需要自己设的,是一个超参数。

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

Maxout

  也有人提出一种叫做 M a x o u t \rm Maxout Maxout的方法,这个方法是取一组神经元(一组有几个神经元需要自己设定)的最大值作为输出。这种方法的好处是可以自学习**函数的样子,其实上面的 R e L U \rm ReLU ReLU 都可以由 M a x o u t \rm Maxout Maxout 得到,比如取两个神经元为一组进行 M a x o u t \rm Maxout Maxout ,其实就是将两个神经元对应的线性函数放在一起,取其最大的部分。

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

  比如一条线是 y = x y=x y=x ,另一条是 y = 0 y = 0 y=0 ,那么这两条线 M a x o u t \rm Maxout Maxout 后就是 R e L U \rm ReLU ReLU 了。由于可以放更多的神经元为一组,所以还可以是三折线、四折线、更多折。

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

  那么怎么来训练使用这种**函数方式的网络呢,训练的方法和原来的没有什么不同,只是进行梯度下降的时候 M a x o u t \rm Maxout Maxout 会只更新取了最大值的神经元的权重参数,其余的都不会更新,相当于网络变小了。那么你可能会有疑惑,那不更新那些没有取到最大值的权重,那还要这些神经元干嘛,这么做不会有问题吗?其实不用担心,那些神经元只是在这一个样本上没有被取到,换一个样本可能就换了一个最大值的神经元,也就换了权重可以更新,最后总体所有权重还是基本都会被更新到的(个人猜想:还是有可能有的神经元一直更新不到)。

  这里再谈一点点自己的小发现,就是如果想要达到同样的 R e L U \rm ReLU ReLU 的效果的话, M a x o u t \rm Maxout Maxout 需要使用两倍的神经元个数,如果折数更多的话,那就是成倍的增长神经元的个数,这可能是一个劣势吧,不过 M a x o u t \rm Maxout Maxout 能够为“每个神经元私人定值**函数”(一组神经元可以等价于一个特定的折线形的**函数)应该还是会有很好的表现吧。

Adaptive Learning Rate (自适应学习率)

  前面讲过一种自适应学习率的方法叫做 A d a g r a d e \rm Adagrade Adagrade ,在 L o g i s t i c   R e g r e s s i o n \rm Logistic\ Regression Logistic Regression 那种损失函数曲面上能够很好的工作,但这种方法在神经网络上其实已经不够用了。替代的方法有 R M S P r o p \rm RMSProp RMSProp M o m e n t u m \rm Momentum Momentum 还有他两的结合版 A d a m \rm Adam Adam A d a g r a d e \rm Adagrade Adagrade 的更新方法如下:
w t + 1 = w t − η ∑ i = 0 t ( g i ) 2 g t w^{t+1} = w^t- \frac {\eta} {\sqrt {\sum_{i=0}^t}(g^i)^2}g^t wt+1=wti=0t (gi)2ηgt

RMSProp

   A d a g r a d \rm Adagrad Adagrad 中,过去的梯度值对现在更新的大小还是有比较大的影响的, R M S P r o p \rm RMSProp RMSProp 中就削弱了过去的梯度对现在梯度更新大小的影响,他的更新方法是:
w 1 ← w 0 − η σ 0 g 0 σ 0 = g 0 w 2 ← w 1 − η σ 1 g 1 σ 1 = α ( σ 0 ) 2 + ( 1 − α ) ( g 1 ) 2 ⋮ w t + 1 ← w t − η σ t g t σ t = α ( σ t − 1 ) 2 + ( 1 − α ) ( g t ) 2 \begin{aligned} &w^1 \leftarrow w^0 - \frac {\eta} {\sigma^0}g^0 &\sigma^0=g^0 \\ &w^2 \leftarrow w^1 - \frac {\eta} {\sigma^1}g^1 &\sigma^1=\sqrt {\alpha(\sigma^0)^2+(1-\alpha)(g^1)^2} \\ \end{aligned} \\ \vdots \\ \begin{aligned} &w^{t+1} \leftarrow w^{t} - \frac {\eta} {\sigma^t}g^{t} &\sigma^t=\sqrt {\alpha(\sigma^{t-1})^2+(1-\alpha)(g^t)^2} \\ \end{aligned} w1w0σ0ηg0w2w1σ1ηg1σ0=g0σ1=α(σ0)2+(1α)(g1)2 wt+1wtσtηgtσt=α(σt1)2+(1α)(gt)2
  其中 α \alpha α 是需要自己设定的。

Momentum

   M o m e n t u m \rm Momentum Momentum 是借鉴了物理中运动的惯性的原理。每次更新权重时,不仅考虑在这一点的梯度方向,还考虑上一次更新的方向,两个向量综合起来才是实际的更新方向。如下图所示,红线是梯度方向,绿线是上次更新的方向,蓝线是实际更新的方向。

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

  这样做的好处是即使当前这个点的梯度很小,我们任然有可能由于惯性继续更新位置,这样就能摆脱很缓的地方而提前停止梯度下降,甚至还可能翻阅局部最小点去一个更小的地方。当然也有风险,可能翻过去了结果那里的局部最小点更大,结果翻不回来了,因为过去的更新方向的影响是在衰减的。

Adam

  这个其实就是上面两个的综合版,过程如下:(还没细看,所以不做具体解释了)

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

Early Stop (早停)

  接下来是一些处理训练好的神经网络在训练集上表现很好而在测试集上表现不好的过拟合问题。第一个方法就是早停。想法也很简单,随着不停的迭代,在训练集上的损失值是不断下降的,而在训练集上应该是先下降(模型逐渐从欠拟合变好),再增大(开始过拟合了)的,那么在训练集上表现开始增大的时候停止迭代,这就是早停。值得注意的是,在寻找什么时候停止的时候,不能适用测试集来做这件事,应该另外划分一个验证集来做,因为如果把测试集放进来,其实你的模型已经开始去拟合训练集了,这样的模型在实际使用还是有过拟合的问题。

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

Regularization

  正则化在前面的 L o g i s t i c   R e g r e s s i o n \rm Logistic\ Regression Logistic Regression 已经有使用过了,一种常见的正则化方式是 L 2   r e g u l a r i z a t i o n \rm L2\ regularization L2 regularization ,他就是在损失函数后面加了一项正则化项,最后的效果就是每次更新前先让权重按比例缩小一点,再更新原来那么多的步长。使用 L 1 \rm L1 L1 的话就是每次先减去一个固定值,在更新原来的步长。在有的算法中比如说 S V M \rm SVM SVM 中,正则化的效果很好,在神经网络中,正则化的效果和早停的效果其实差不多,因为神经网络是从一个很小的初始化权重去增大权重而训练模型的,早停也就是提前结束增大的过程,所以正则化在神经网络中不是很有效。其增加的损失为:
∣ ∣ θ ∣ ∣ L 2 = λ ∑ i = 1 n ( θ i ) 2 ∣ ∣ θ ∣ ∣ L 1 = λ ∑ i = 1 n ∣ θ i ∣ ||\theta||_{L2}=\lambda\sum_{i=1}^n(\theta_i)^2 \\ ||\theta||_{L1}=\lambda\sum_{i=1}^n|\theta_i| \\ θL2=λi=1n(θi)2θL1=λi=1nθi

Dropout

  首先来说以下 D r o p o u t \rm Dropout Dropout 怎么运作的吧,首先你会设置一个神经元 dropout 的概率 p p p ,在训练时,每次更新参数之前,先将所有的神经元以 p p p 的概率丢掉一些,这样神经网络中的部分神经元就不会参与下一次的权重更新了,相当于每次更新都会使用一个不同的神经网络来进行训练。

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

  在进行预测的时候呢,是要使用所有的神经元的,但是所有的权重都要进行缩放,缩放的比例是 w a f t e r = w b e f o r e ( 1 − p ) w_{after}=w_{before}(1-p) wafter=wbefore(1p) ,这一步很重要,如果没做的话预测的效果会很不好。

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

  接下来解释为什么要这么做,这其实和集成学习 (Ensemble) 的思想有点像。(我不太记得每次更新的时候需不要要像随机森林那样取训练集的一部分数据来进行训练,下次再随机取另一部分)。每次更新的时候模型都会改变,类似于训练了多个模型,但最后预测的时候使用全部模型的结果,只是这不是真的训练了很多网络,而是把多个网络放在一个网络里训练,共享了很多的权重。

  置于为什么预测的时候要先对权重进行缩放呢?是因为你一次的训练只用了部分的神经元,相当于线性函数中有的 w x wx wx 没了,但是最后的 y y y 还是要按照 targe 的方向训练的,比如两个输出的神经元 y = w 1 x 1 + w 2 x 2 y=w_1x_1+w_2x_2 y=w1x1+w2x2,如果 dropout其中一个 那么式子变成 y = w 1 x 1 y=w_1x_1 y=w1x1 ,训练的时候目标是让输出尽可能等于标签的,比如一个样本是 ( 2 , 1 ) (2,1) (2,1) 那么, w 1 w_1 w1 就倾向于变成 0.5 0.5 0.5 ,如果 dropout 另一个的话,对于这个样本 w 2 w_2 w2 也倾向于变成 0.5 0.5 0.5 ,由于预测的时候是使用全部神经元的,所以使用的是整个公式 y = w 1 x 1 + w 2 x 2 y=w_1x_1+w_2x_2 y=w1x1+w2x2 ,这时再代入那个样本,输出变成了 2 2 2 ,远远偏离了标签 1 1 1 ,所以需要对权重进行缩放。

[李宏毅 机器学习] 深度学习笔记(DNN, RNN, Backpropagation, ReLU, Maxout, RMSProp, Momentum, Adam, 早停, Dropout)

  如果**函数是线性的,那么使用这种方式缩放是合理的,但是其实在 sigmoid 这种非线性函数上使用这样的缩放方式也能改善输出结果的表现。不过改善的幅度还是没有线性的大的。