UP | HOME

Dropout的瑜亮之争

Table of Contents

一 导言

类神经网络是由一系列的 connectionnode 组成,某一层的 node 数量越多,与它相关的 connection 的数量通常也会随着增加。当网络叠深、变复杂的时候,参数的数量也会大量增加,这时候就需要考虑 over-fitting 的问题。

传统的机器学习常会使用 regularization term 来维护 validationtesting 的品质。在深度学习中,除了 regularizationdropoutdrop-connect 也是常见的架构。

dropout 1的概念,在于训练时以一定机率(drop-rate)把网络中的某些 node 的数值舍弃,即归零。 drop-connect 也使用相似的方法,但它舍弃的是 connection 而非=node= 。上述两个方法,都有随机的成份在,亦即当 drop-rate 定好之后,每个 nodeconnection ,都有可能被舍弃,不论它们的数值大小、正负。

针对这一个部分,另一个架构: Dense-Sparse 2给了不一样的观点。 connection 的绝对值大小,其实某种程度上说明了它的重要性,代表该层的 node 对下一层某个 node 的影响程度。既然我为了避免 over-fitting ,需要减少 connection 的数量,那么何不直接去掉 影响程度较低 的那些 connection 呢?比起 随机丢弃 ,丢弃较不重要的部分可能会是一个更好的作法。经过实验之后, Dense-Sparse 确实能够在减少 connection 的状态下,训练集错误率不至于上升而且 validation 的表现更好一些。

既然 connection 不需要随机丢弃,那么 node 是不是也能用类似的方法,取代= 随机= 舍弃呢?此外,除了探讨 dropoutdrop-connect 的随机性之外,我也想尝试一些 dropout 的其他方法,看看能不能让表现更好, 比如:

  1. 是否只有 fully-connect 层适合使用 dropoutover-fittingearly-stopping 呢 ?
  2. 如 果让 drop-rate 随着 epoch 增加而增加,会不会又有更好的表现?
  3. 既然 drop-rate 只是一个数值,能否用另一个类神经网络或函数,来"学"出某一层的 drop-rate ?比起自己调整,让网络变成 end-to-end 训练会不会更好?

二 相关技术

2.1 DropConnect(ICML 2013)3

http://fastml.com/regularizing-neural-networks-with-dropout-and-with-dropconnect/

经过上面介绍可知Dropout是随机丢弃Node,使得随机node输出为零,而DropConnect则是随机丢弃link使得某node的输入的某些权值为零,示意如下:

screenshot_2018-08-09_02-09-02.png

Dropout的公式:

\(r = m\dot{ a }(Wv)\)

Drop-Connect公式:

\(r = a((M \dot { W })v)\)

其中

参数 说明
m 该node要不要被drop值为0或1; W0为bias
W 该layer的weight
x 上一层全部node所结合成的vector
M 为一个mask决定哪些weight该被drop
a 为activation function.

在training方面与Dropout很相似,流程如下:

screenshot_2018-08-09_02-10-51.png

因为Drop Connect建议只使用在Fully Connected Layer,若是整个Neural Network含有 Convolution Layer 或是Pooling Layer的话,该层应该放在Extract feature的地方。

在Inference方面,Dropout是把剩余node的weight全部scale up一个系数,例如:假设Keep Probability为0.8,亦即有20%的node的输出会归零,他scale up的方式就是剩余node的输出会在除以0.8,这样可以保持整层layer的输出期望值与未dropout前一样。

而Drop Connect则是对每个input权重采用高斯抽样,过程如下:

screenshot_2018-08-09_02-11-18.png

从inference的算法可以轻易看出,每次inference需要对每个权重进行sample,故Drop Connect速度会慢一些。

2.2 Dense-Sparse-Dense training(ICLR 2017)4

https://arxiv.org/pdf/1607.04381.pdf

其架构如下:

screenshot_2018-08-09_02-16-55.png

它分为三个步骤

  1. Dense: 这一步骤跟原始neural network 一样,你原本怎么train你的network,就怎么 train,直至收敛.
  2. Sparse: 这一步骤是把每一层的weight取绝对值,把小的prune掉,这是因为作者认为值较小的weight会导致model over-fitting,接下来一样把model train到收敛.
  3. Re Dense: 把在Sparse step prune掉的weight补回来,继续把model train到收敛。

详细算法如下:

screenshot_2018-08-09_02-17-39.png

作者在Paper中,以google net作实验,把weight画出图如下:

screenshot_2018-08-09_02-18-01.png

我的想法也是由此而来,如果在training的时候,train了一定的epoch数但还没converge前,就渐渐prune掉weight值较小的weight是不是可以类似regularization的效果,或是在 converge后,Sparse step照着normal distribution去掉weight而不是只拿掉小的,会达到一样的效果.

2.3 Adaptive dropout5

https://papers.nips.cc/paper/5032-adaptive-dropout-for-training-deep-neural-networks.pdf

这篇是在说要不要用某些方法学出dropout_rate,原本的dropout公式如下:

\begin{equation} a_j=m_jg(\sum_{i}^{\mathit{i}<{j}}w_{j,i}a_i) \end{equation}

其中:

参数 说明
w weight,
ai 上一层某个node的output,
g activation function,
mj 这个node该不该drop,

作者把 mj = 1 的probability写成如下:

\begin{equation} P(m_j=1|{a_i:\mathit{i}<{j}})=f(\sum_i^{\mathit{i}<{j}}\pi_{j,i}a_i) \end{equation}
参数 说明
ai dropout公式中的ai,
f sigmoid function
pi 要learn的权重

所以可以把dropout公式改写如下:

\begin{equation} \mathbb{E}[a_j]=f(\displaystyle\sum_i^{\mathit{i}<{j}}\pi_{j,i}a_i) g(\displaystyle\sum_{i}^{\mathit{i}<{ j }}w_{j,i}A_I) \end{equation}

三 实验设计

测试数据集:Cifar10

预处理

先取20000笔data做为一个epoch的data,并将他随机调亮、翻转、裁剪,在每train完一个 epoch后,他会将原本20000笔data再随机调亮、翻转、裁剪,因此每一个epoch的资料并不完全一样,而他的training loss也是根据一个一个batch去算,因此实验结果的横轴指的是step(train了几个batch),并非epoch。

架构

  • 两层convolution layer,两层fully connected layer
  • 第一层convolution layer为kernel 5*5 filter 64
  • 第二层convolution layer为kernel 5*5 filter 64
  • 第三层fully connected layer为压平后转成384维
  • 第四层fully connected layer为384转成192维
  • 最后一层即是192维转成10维的output

描述

我是基于tensorflow tutorial code去做修改,其中实验结果表一是在fully connect的 layer上加dropout 实验结果表二是在train到converge后,我把weight小的丢弃再train 到收敛,也就是Related work第二项DSD中的前两个步骤。在这个实验中我是在除了第一层外的其他层都做pruning,因为在第一层的convolution layer因为只有3个channel,随意拿掉任一weight会太敏感,所以不适合拿掉weight。

使用方法

实验一&二:

python cifar10_train_DSD.py $1 $2 $3 $4
  • $1 :你要存放model的资料夹(可以使用tensorboard view详细情况)
  • $2 :你想要存放record的地方
  • $3 : Dropout ratio(Fully Connected Layer的Keep probability)
  • $4 : Sparse ratio(在Sparse step的sparsity)

实验三:

python cifar10_train_combine.py $1 $2 $3 $4 $5
  • $1 :你要存放model的资料夹(可以使用tensorboard view详细情况)
  • $2 :你想要存放record的地方
  • $3 : Dropout ratio(Fully Connected Layer的Keep probability)
  • $4 : Sparse ratio(在Sparse step的sparsity)
  • $5 : step(你想在第几个step开始做sparse step)

四 实验结果

实验一

实际探讨 dropout 的表现,并尝试不同的 keep_probperformance 的影响

screenshot_2018-08-09_02-28-11.png

Figure 7: 图一与图二 \({1. 横轴为step,也就是已经train了几个batch\\ 2. 不同的颜色代表不同的keep_probability,亦即fc-layer保留多少比率的node\\ 3. 图一纵轴的accuracy为10000笔testing(validation) data的accuracy\\ 4. 图二纵轴的loss为batch loss(cross entropy)}\)

实验二

这部分我实现了 Dense-Sparse 的架构。之所以放弃 Re-Dense 的步骤,是因为它与这次探讨的内容,即 Dropout/Drop-Connect 较不相关,单纯只是藉由反覆的训练以提升准确率。在这个实验中,我探讨了 Dense-Sparse 的可行性,以及 Dense 转 =Sparse=的过程中 舍弃的比例 对准确率的影响。

screenshot_2018-08-09_02-29-03.png

Figure 8: 图三:\({1. 蓝色的线是指 Dense 阶段最后达到的 Validation Accuracy\\ 2. 绿色的线是指 Dense-Sparse 完整训练完之后,所能达到的 Validation Accuracy\\ 3. 横轴的数字为 keep_probability ,亦即每个 layer 保留多少比率的 weights\\ 4. baseline 是没用 Dense-Sparse 框架时的表现,即正常、简单地训练这个 CNN\\ 5. 此实验只套用 Dense-Sparse 的框架,没有使用 Dropout}\)

实验三

前一部分,我已经发现 Dense-Sparse 确实有可能表现得更好,而且参数量还可以大量减少。但是,原本的架构中,在 Dense 阶段需要把模型训练到完全收敛(Validation的表现不再上生),才能进入 Sparse 的阶段。如果提早进入 Sparse ,会不会有不一样的结果,还是会更差? 我尝试提前让模型进入 Sparse 的阶段,并观察最后模型的表现。(原本的架构, Dense 要训练约90000个 batch 才收敛,我试了只训练22500/45000/67500个=batch= 就进入 Sparse 的版本)

screenshot_2018-08-09_02-29-58.png

Figure 9: 图四: \({1. 横轴代表不同的keep_probability,亦即fc-layer保留多少比率的node\\ 2. 不同的颜色代表不同的版本,即 Dense 阶段训练了22500/45000/67500个 batch\\ 3. 纵轴的accuracy为10000笔testing(validation) data的accuracy\\ 4. baseline 是没用 Dense-Sparse 框架时的表现,即正常、简单地训练这个 CNN}\)

五 结论

第一个实验,我发现 Dropout 并不一定能提升 accuracy 。我认为,这和资料集以及模型复杂度有关系, Cifar10trainvalidation 的数据集分布差异并不大,且 tutorial 的模型参数并不多,本来就不至于有 over-fitting 的问题, dropout 的帮助自然不大。我有使用比较复杂的模型(较深层的CNN,或增加CNN每个layer的单元数量)但 dropout的表现变化不大。

而在改良 Dense-Sparse-Dense 的实验中,因 Re-Dense 和目标无关,我实现的是 Dense-Sparse 的部分:先把网络训练到收敛,然后把网络中较低的 Weight 归零,之后再继续训练到收敛。在这个尝试中, Validation 的表现相当好, Sparse 的模型参数数量较原本的模型少了许多,训练集的损失还能降到差不多的地步,说明了Dense-Sparse 的可行性和潜力。

我猜测, Dropout 有可能使模型 under-fit ,就像我的实验,加了 Dropout 之后,表现普遍不好,但也说明了 Dropout 确实有避免 over-fit 的效果。但使用 Dense-Sparse 来缩减参数的话,就算我 mask 掉大部分的=weight= ,模型的表现都不至于变差。简言之, Dropout 的随机性是有其必要的,而 固定Drop掉Weight小的部分 充其量只能做为压缩模型的一种手段而已,无法有效解决 over-fit 的问题。

六 附录

下图是我的模型中 fully-connected layer 在不同时间的 weight 分布图

主要在三个时间点纪录了 weight 的状态

screenshot_2018-08-09_02-31-13.png

Figure 10: 图一: Dense 阶段收敛时

screenshot_2018-08-09_02-31-27.png

Figure 11: 图二: Sparse 阶段开始时

screenshot_2018-08-09_02-31-42.png

Figure 12: 图三: Sparse 阶段再次收敛时

小结:

可以发现,如 paper 所示,数值较小的 weight 们被 Drop 掉的时候,相当于有许多的 weight 变为0,而随着模型继续训练, =weight = 的分布会更进一步往中间集中。

七 索引

Footnotes:

1

N. Srivastava, G. Hinton, A Krizhevsky, I. Sutskever and R. Salakhutdinov. Dropout: A Simple Way to Prevent Neural Networks from Overfitting

2

S. Han, J. Pool, J. Tran and W.J. Dally. Learning both Weights and Connections for Efficient Neural Networks

3

L. Wan, M. Zeiler, S. Zhang,Y. LeCun and R. Fergus. Regularization of Neural Networks using DropConnect

4

S. Han, J. Pool, J. Tran and W.J. Dally. DSD: Dense-Sparse-Dense training for deep neural networks

5

L.J. Ba and B. Frey. Adaptive dropout for training deep neural networks.