目录
前言
Training过程中的两个问题
Q1:Training data上表现不好
Q2:Testing data上表现不好
一、回顾ML训练过程
Step 1. 定义Function set
Step 2. 定义Loss Function评估Function set好坏
Step 3. 根据Training data训练模型
Neural Network很有可能在Training data上就训练不好,这不叫Overfitting,是我们还没有训练好;在Training data上表现好,而在Testing data上表现不好才是Overfitting。
此外,层数多的模型比层数低的在Testing data上表现好,并不一定是Overfitting,要先检查他们在Training data上的结果;可能是层数多的模型在Training data上我们就训练的不好。也不是Underfitting(参数不够多)。
二、针对两个问题的解决方法
Training过程中的两个问题
Q1:Training data上表现不好
① New activation function(新的激活函数)
② Adaptive Learing rate(调整学习率)
Q2:Testing data上表现不好
① Early stopping(提前终止)
② Regularization(正则化)
③ Dropout
1.New activation function
1.1 sigmoid函数
现已不常用,存在Gradient vanishing(梯度消失)问题。
观察sigmoid函数图像,当输入的x变化很大时,y变化很小;Layer越深,对输入的衰减次数越多,输入对输出的影响就越小。
1.2 New activation function
1.ReLU(Rectified Linear Unit 线性整流函数/线性修正单元)
原因:①计算速度快(sigmoid需要指数运算)
②Biological reason
③等同于无穷多个不同bias的sigmoid叠加
④解决梯度消失问题
2.Leakly ReLU&Parametric ReLU
3.Maxout
Maxout可以看做是在深度学习网络中加入一层激活函数层,包含一个参数k。这一层相比ReLU,sigmoid等,其特殊之处在于增加了k个神经元,然后输出激活值最大的值。
隐含层节点的输出表达式为:
假设 w 是 2 维,那么有
ReLU 和 Leaky ReLU 都是它的一个变形。
与常规激活函数不同的是,它是一个可学习的分段线性函数。然而任何一个凸函数,都可以由线性分段函数进行逼近近似。
如何训练Maxout呢,激活哪个就训练哪个,没有被激活的就舍弃掉,就会变成一个thin & linear的网络,比较好训练。
不同的输出data对应不同的网络结构,所以在实际实践中所有的参数都能被训练到。
2.Adaptive Learing rate
1.Adagrad
2.RMSProp(Root Mean Square Propagation)
RMSProp比Adagrad只多了一个超参数,其值通常置为0.9。
α小,倾向于相信新的梯度;反之,倾向于相信旧的梯度。
3.Momentum
动量来源于物理学,当momentum越大时,转换为势能的能量就越大,就越有可能摆脱局部凹区域,从而进入全局凹区域,用表示惯性的大小,综合考虑了梯度下降的方向和上次更新的方向来更新参数。
实际上是到之前所有梯度的加权求和。
4.Adam=RMSPRop+Momentum
3.Early stopping
Validation set(验证集)作为Testing set当Loss最小的时候,training就停止。
之前就建议过可以把Training data分一部分出来当做Testing data可能会训练的更好,当训练的模型用于真正的Testing data时,出现过拟合也没必要再去修改参数,没有意义。
4.Regularization
4.1 L2 regularization
4.2 L1 regularization
补充:符号函数
L1 训练结果:权重会比较稀疏,有的参数很小,接近于0;有的参数很大。
L2 训练结果:平均都比较小。(没听明白这一块)
5.Dropout
5.1 怎么Dropout?
在每次参数更新前,每个神经元有的概率被丢弃,相连的权重也会被丢弃。随着丢弃部分神经元,神经网络的结构发生改变(Thinner!)用这个新的神经网络做训练。
在训练的时候结果会变差,但是对于验证集和测试集,利用dropout后,结果会变好。
测试的时候,不需要 dropout,如果训练时,丢弃神经元的概率是,测试时所有权重都要乘
5.2 为什么Dropout有用?
防止参数过分依赖训练数据,增加参数对数据集的泛化能力。
可以看看这个:理解dropout_张雨石的博客-CSDN博客_dropout
当激活函数是线性的(ReLU,Maxout)的情况下,dropout 效果比较好;
当激活函数是非线性的(sigmoid)的情况下,dropout效果一般。