[toc]
1.训练集上表现不佳
梯度爆炸问题
- 多层神经网络在靠近输入层的地方梯度较小,在靠近输出层的地方梯度较大。
- 这会导致在求导时,输入层变化步长很小,输出层变化步长很大。
-
当输入层还处于随机变化状态时,输出层已经收敛。出现了梯度爆炸问题
1.1 调整网络架构
1.2 设置新的激活函数
1.2.1 Sigmod函数的不足
- 对于Sigmod函数来说,输入变化很大,输出变化很小
- 如果网络中的激活函数都是Sigmod函数,输入层的参数经过多层Sigmod函数衰减后,输入层的变化对输出几乎没有影响
1.2.2 ReLU函数 Rectified Linear Unit
- ReLU函数的输出要么是0,要么是线性的
- 对于输出为0的神经元,其对输出层没有影响
- 剩下的输出为线性的神经元,假如输入有变化,输出可响应其变化
- 对于ReLU的非线性:
- 假如输入变化很小,ReLU为线性
- 假如输入变换很大,ReLU的作用范围由线性区域变到了其他区域,即非线性的
- 不可微问题 跳过z=0的点 小于0微分为0 大于0微分为1
1.2.3 Maxout
- 自动学习激活函数
- 训练技巧
- 只有每个比较组中最大的元素对输出有影响
- 去除其他对输出无影响的值,模型变成了一个线性模型
- 给定不同的输入值,每组选的最大值不一样,网络结构会发生改变,随着输入样本的增多,可以使网络中的参数都得到训练
1.3 改进梯度求解算法
1.3.1 Adagrad不足
w^{t+1}\gets w^t-\frac{\eta}{\sqrt{\sum_{i=0}^t(g^i)^2}}g^t
- 对于梯度较大的区域会计算得到较小的学习率
- 对于梯度较小的区域会计算得到较大的学习率
神经网络中的优化函数有时非常复杂,学习率调整需要更加迅速
1.3.2 RMSProp(改进的Adagrad)
- 可以通过调整
$\alpha$
使学习率更加考虑新求得的梯度
1.3.3 Momenteum 梯度下降
- 针对有时出现局部最小值或者导数为0导致无法进行求解的问题,提出了Momenteum方法
- 现在的梯度加上前一个时间移动的方向(相当于考虑了惯性)
1.3.4 Adam (Momenteum+RMSProp)
2.测试集(valid set)上表现不佳
上述测试集指的是自己分割出的validation set
2.1 Early Stopping 提前停止
2.2 Regularization 正则化
重新定义Loss Function
- L2 范数正则化项
L'(\theta)=L(\theta)+\lambda \frac{1}{2}\|\theta\|_2\\[0.4em] \|\theta\|_2=(w_1)^2+(w_2)^2+...\\[0.6em] \frac{\partial L'}{\partial w}=\frac{\partial L}{\partial w}+\lambda w\\[0.4em] Update:w^{t+1}\gets w^t - \eta \frac{\partial L'}{\partial w}\\[0.5em] =(1-\eta \lambda)w^t-\eta \frac{\partial L}{\partial w}
- L1 范数正则化项
L'(\theta)=L(\theta)+\lambda \frac{1}{2}\|\theta\|_1\\[0.4em] \|\theta\|_1=|w_1|+|w_2|+...\\[0.6em] \frac{\partial L'}{\partial w}=\frac{\partial L}{\partial w}+\lambda sgn(w)\\[0.4em] Update:w^{t+1}\gets w^t - \eta \frac{\partial L'}{\partial w}\\[0.5em] =w^t-\eta \frac{\partial L}{\partial w}-\eta \lambda sgn(w^t)
- 实际都是改变原有的参数
- L1范数产生的结果是Sparse的,有一些很大的值,有一些很小的值
- L2范数产生的结果是平均都比较小
2.3 Dropout
- 训练时
- 在每次更新参数前每个神经元有
$p\%$
的概率被丢掉(dropout) - 此时网络结构会发生改变,使用新的网络进行训练
- 会导致在training set上的结果变差,但会在testing set上的结果变好
- 在每次更新参数前每个神经元有
- test时
- 不做dropout
- 所有的权重乘上
$(1-p\%)$
- 原因
- 训练时负重训练,测试时重拳出击