李宏毅教授的机器学习教程学习笔记
本节课程是针对模型在数据集上结果不好,损失大问题的一些常用处理方法
结果不好的问题分为两种,第一种是在training set上结果不好,第二种是在testing set上结果不好
第一种情况的处理方法有改变激活函数、调整超参数(以学习率为例
第二种 情况的处理方法有early stop、regularization、drop out
文章目录
笔记
深度学习步骤
以keras给出的mnist手写数字识别示例分析为例:
构建模型:使用tf.keras.Sequential()
model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10)
])
为训练定义损失函数
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
配置和编译模型:设置参数更新方法,损失函数计算和模型评估指标
model.compile(optimizer='adam', loss=loss_fn, metrics=['accuracy'])
训练并评估模型
# 训练模型
model.fit(x_train, y_train, epochs=5)
# 评估模型
model.evaluate(x_test, y_test, verbose=2)
对应accuracy on training data
对应accuracy on testing data/ validating data(有标签的数据)
当accuracy on training data低时
new activation function
-
sigmoid作为激活函数
- 问题——vanishing Gradient Problem
深度学习一般具有多层网络,当求解最终层对前面各层的梯度时,由于Sigmoid导数取值范围为[0, 025], 并且由于神经网络反向传播时的“链式反应”,很容易出现“梯度消失”现象。当出现“梯度消失”或者求解得到的梯度很小时,训练过程就将停止,此时并没有达到model在training set上的最好训练结果。例如对于一个10层的网络, 根据 0.2 5 10 ≈ 0.000000954 0.25^{10} \approx0.000000954 0.2510≈0.000000954,第10层的误差相对第一层卷积的参数 W 1 W_1 W1的梯度将是一个非常小的值,即所谓的“梯度消失”
-
ReLU作为激活函数
r e l u ( x ) = m a x ( 0 , x ) relu(x) = max(0, x) relu(x)=max(0,x)- 优点
- 函数形式简单,运算速度快
- ReLU在x>0下,导数为1,解决了梯度消失问题
- 参考资料1中提到ReLU在x<0下,导数为0, 一定程度上将包含大量参数的密集神经网络转化为了稀疏矩阵,可以理解为一个去噪的过程,给模型带来了鲁棒性。但另一方面,也需要通过设置好lr,防止lr过大网络的大部分神经元处于‘dead’状态——“ReLU神经元死亡”问题
- 优点
-
ReLU variant
给x<0下的一个小的梯度值α-
Leaky ReLU:α值固定
-
Parametric ReLU:α值在训练过程中更新
-
-
Maxout激活函数
Maxout激活函数可以表示任意多线性函数的凸组合
对于将Maxout作为激活函数的模型训练:
一组input,只会对应每个group中的一个参数的训练过程,于是这在一定程度上是进行了去噪处理,提高了accuracy on validating set
Adaptive Learning Rate
- Adagrad:利用了前面的所有梯度均方误差来修正当前的lr
- RMSProp:有偏好地利用前面的梯度均方误差进行lr修正,通过设置α的值来体现偏好性
- Momentum的思想:同时利用上一次的梯度下降方向和这一次的梯度来确定本次梯度下降方向(类似物理中的惯性,与之对应的是又一超参数的引入α
- Adam:结合了RMSProp和Momentum思想的梯度下降方法
当accuracy on validating data低时
Early Stopping
如果只使用training set来训练模型,loss on training set不断下降,但最后的accuracy on testing set是没有保证的,为了避免“过拟合”现象,使用Validating data来确定训练的终止点
Regularization
更改loss function,让最终训练得到的参数w比较小,即weight decay,使得模型比较平滑
- 这里还有关于L1、L2 regularization如何选择的问题,L1比L2更sparse一些
L1正则化结果会有更多的权重为零,产生更稀疏的解,这对于特征选择和模型的可解释性很有用
L2正则化结果会更加均衡,达到“平滑”模型的效果,适合数据中特征存在相关性的情况
李宏毅教授在课程中解释道,Regularization在深度学习中的效果并没有在传统机器学习方法如SVM中效果好。因为从深度学习的训练过程来看,先随机挑选一些接近0的值作为参数初始值,通过梯度下降更新参数,得到最终的模型。采用regularization的目的是得到较小的参数,这个目的可以直接通过Early stop达到。
Dropout
针对模型中的input层、隐藏层中的参数进行p%的随机关闭
Dropout is a kind of ensemble. Dropout中利用了集成学习的思想。李宏毅教授的解释是当将所有数据都用于训练一个模型时,得到的模型会有更小的bias误差和更大的variance误差;这里的dropout将数据进行分散,得到了多个有更大bias误差和更小variance误差的模型,通过average来减小总体的bias误差,从而得到一个效果更好的模型。
Using one mini-batch to train one network
Some parameters in the network are shared. 因此对于一个参数的训练而言,其数据量也是不止一个mini-batch的
在testing data上通过multiply 1-p%来集成所有模型,从linear network的角度是equivalent的(是一个均摊的思想,每个参数在训练得到的过程中均只是所有参数的1-p%),但对于非线性的激活函数所有模型的testing结果的average值和简单的1-p%模型集成testing结果是有出入的。
由于这个等价,使得dropout方法的使用是与激活函数的选择有适配性的,若使用的激活函数是如ReLU、Maxout等linear network,得到的效果会更好
参考资料
- 关于各种激活函数:https://blog.sciencenet.cn/blog-3428464-1285447.html