一、深度学习建模与调试流程

先看训练集上的结果怎么样(有些机器学习模型没必要这么做,比如决策树、KNN、Adaboost 啥的,理论上在训练集上一定能做到完全正确,没啥好检查的)

Deep Learning 里面过拟合并不是首要的问题,或者说想要把神经网络训练得好,至少先在训练集上结果非常好,再考虑那些改善过拟合的技术(BN,Dropout 之类的)。否则的话回去检查三个 step 哪里有问题。

 深度学习模型训练技巧  Tips for Deep Learning

Deep Learning 中的方法为了解决两个主要问题而提出:1.训练集做得不好;2.训练集做得好,测试集做得不好

实际应用的时候搞清楚自己面对的问题,选择对应的技巧。

 

二、激活函数

1. sigmoid

梯度消失:网络很深的时候,靠近输入的 hidden layers 的梯度对损失函数影响很小, 参数更新的就很慢;靠近输出的情况反之。前面几层的参数都还没怎么更新的时候就收敛了。

原因也比较简单,反向传播的时候每经过一层,都会乘上小于 1 的数(sigmoid 函数 会把输入压到 0~1 之间),结果就越来越衰减。

早期用 RBM ,先训练好前面几层。

 

2. ReLU

计算快;有些生物学的来源;相当于无穷多个不同偏置的sigmoid函数叠加;不存在梯度消失

输出要么是0,要么是输入本身,相当于把原来的网络变成一个 thinner linear network。
 
这样网络还是非线性的吗? —— 是。只要输入的变化比较大,跨越函数分段,网络依旧具有非线性。
好像不可微? —— 确实。但做浮点运算也几乎不会正好要在原点处计算微分,所以直接忽略这个问题。
 
一些变种,亲测过确实会有提升。
深度学习模型训练技巧  Tips for Deep Learning
 

3. maxout network

每个神经元的激活函数的具体形式,是可以学习来的(不一定非得像 ReLU 那样在原点分段):

深度学习模型训练技巧  Tips for Deep Learning

哪些神经元要被 group 起来是事先决定的(比如随机2个或者3个一组之类的,几个一组也可以作为一个参数来学习)。

深度学习模型训练技巧  Tips for Deep Learning

 

ReLU 就是特殊情况下的 maxout ;但 maxout 可以实现更多可能的激活函数(具体是什么样的函数,根本上是由参数 w 决定的)。

 

怎么训练?—— 给定一个输入,是能够知道每次取 max,留下的是哪一条路径。训练去掉不作用的神经元之后的“瘦长”的线性网络就行了。
怎么保证参数都能被更新?—— 训练的时候每次给不同的输入数据,去掉的神经元是不一样的。所以一直给不同的输入,差不多每个参数都会被更新到。

 

三、梯度下降的改进

1. Adagrad 

在梯度下降中已经总结过,在不同方向上需要不同的学习率。

学习率时间衰减 + 从开始到当前时刻的梯度平方和求平均来估计二阶微分的大小趋势

深度学习模型训练技巧  Tips for Deep Learning

 

2. RMSProp

error surface 非常复杂,即使在同一个方向上,学习率也需要不断调整。进阶版 Adagrad,动态调整学习率。

深度学习模型训练技巧  Tips for Deep Learning
深度学习模型训练技巧  Tips for Deep Learning

在 decaying 累计的先前梯度,通过调整alpha的大小,来选择是考虑先前的梯度(t 时刻之前的累积)多一些,还是当前的梯度(t时刻的)多一些

真的会卡在 local minima 吗?
实际这种情况下的几率很小(by lecun)如果是 local minima 的话,那在每一个方向上都得是“谷底”,参数越多这个几率就越小。
 

3. Momentum

解决一点 local minima 和 plateau 的问题

每次移动的方向不仅考虑当前时刻的梯度,也考虑之前移动的方向(惯性)。
用 vt 来记录 t 时刻移动的方向,v0 = 0;参数更新的公式为:
vt+1  = λv- ηgt
θt+1  = θ+ vt+1
例如:第一次更新 θ = θ+ v= θ+ λv- ηg0 = θ- ηg0
   第二次更新 θ2  = θ+ v= θ+ λv- ηg1 = θ1 + (λ)2v- ληg0 - ηg1 = θ1 - ληg0 - ηg1
 
所以化简的递推公式为  θt+1 = θt - ηgt - ληgt-1 - ... - (λ)tηg0
  
深度学习模型训练技巧  Tips for Deep Learning 
深度学习模型训练技巧  Tips for Deep Learning
另一个角度理解 v:把公式展开,v 其实就是以往所有时刻梯度的 weighted sum,只不过越往前的初始时刻的梯度被考虑的越少( 每往前一个时刻就多乘一个λ),但也依旧对当前要更新的方向存在影响。
深度学习模型训练技巧  Tips for Deep Learning

4. Adam 

RMSProp + Momentum,利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。

 深度学习模型训练技巧  Tips for Deep Learning

其中,在迭代初始阶段,m和 v有一个向初值的偏移(过多的偏向了 0),因此可以对一阶和二阶动量做偏置校正 (bias correction),这样每次迭代学习率都有一个确定的范围,参数更新比较平稳。

 

四、正则化

1. Early Stopping 

机器学习中比较常见的技巧

深度学习模型训练技巧  Tips for Deep Learning

 

2. Dropout

神经网络中才会用

随机 kill 掉一定比例的神经元。测试的时候不做,而且还要补偿参数。

深度学习模型训练技巧  Tips for Deep Learning

深度学习模型训练技巧  Tips for Deep Learning
为什么要这么做?
如果不乘以 1 - dropout rate,参数其实是比较大的:
深度学习模型训练技巧  Tips for Deep Learning

 

Dropout 可以理解成是一种 Ensemble,因为训练时每次都随机干掉一部分网络,但测试时要综合起来全部都用。
深度学习模型训练技巧  Tips for Deep Learning