机器学习笔记之学习率(learning rate)与过拟合(overfitting)

 

 这次的笔记,之所以把学习率和过拟合放在一起讲,是因为,Msc阶段的几个挂掉的入职面试(投的实习,有的直接变成了校招的比如hw和zx,还有ali),问了相关的问题,结果回答地不好,所以在这里把这两个东西放在一块学习学习。

学习率(learning rate)

学习率lr表征了参数每次更新的幅度,

 

设置过大,参数不容易收敛。这个怎么理解呢,因为绝大多数的机器学习问题,不是一个凸优化的问题,很多时候找的解不是全局最优解而是局部最优解。我们需要找loss函数的极小值,(二维图上看来就是找那些’坑'). 所以loss函数的下降过程,是比较wiggly的,曲曲折折的。如果这个时候学习率设置得过大,就可能导致直接从一个坑跳到另一个坑,甚至可能几个坑来回跳,就收敛不了,或者收敛很慢了。

设置过小,参数更新会很慢(时间会很长)。还是上面的例子,如果初始点选的不好,比如选在了一个山头,学习率设置的过小,比如一次一小步,那么训练到走到坑里就要走很长时间。就是参数的更新很慢,需要很多的训练(步数),才能找到合适的参数。

所以在实际的应用中,学习率的选择,一般是先大后小。先大可以让loss函数尽快的往loss小的方向下降,等到了坑里,学习率就要慢慢的减小,防止直接跳出坑。所以最好的方式,就是先比较大,然后慢慢缩减变小。

具体的方法可以参考下面这篇文章:比如离散下降,指数下降,分数下降等等。

https://www.cnblogs.com/lliuye/p/9471231.html

另外有一些自适应(adaptive)学习率的方法,比如说 RMSprop可以代替adam作为求解器。

维基百科上关于这个求解器的定义:RMSprop lies in the realm of adaptive learning rate methods, which have been growing in popularity in recent years, but also getting some criticism. 当然也有一些批评说这种方法不好的云云。。

 

过拟合(over fitting) 这基本上感觉是必考的点啊,面阿里的时候被问到了,可惜当时DS学得不好,在线编字典树没有编出来,给挂了。

基本上大致的意思就是说,首先我们数据集,可以分为训练集,验证集(validation set)以及测试机(test set). 通常的模型会使用n折交叉验证,来进行模型的参数选取(比如学习率啊,batch_size)啊等等。选好了参数之后,进行训练,发现随着迭代次数的升高,模型的loss出现了先降低,后升高的问题,这个就是模型过拟合了。意思就是太过于学习了训练集的分布,从而使得模型的泛化能力变差了。或者说完美拟合了训练集的数据,而对训练集外的数据没有办法分辨。这个问题在深度学习上更加的突出,因为深度学习的拟合能力是更强的。

解决过拟合的方法:#

当时面试的时候,我好像主要focus on 增加数据的量,即扩增数据。好像还说了drop out,但是随后面试官又问我啥事dropout,当时没回答上来(太菜了),言归正传,

1)Add more data.对于解决过拟合,首先增加新的数据是可以的,因为毕竟定义就在那,按照定义解题没问题。

2)Data augmentation. 既然想到了增加新的数据,就应该想到增加新数据的另一种方式,数据增强(data augmentation),意思就是比如一张图片,使用以下操作,rotate(旋转),flip(翻转),translate(平移), add pixel noise(增加噪声), 以及 deform(变形) image,使得一张图片变成多张图片,进而扩增数据集。实际操作起来,使用augmentation之后的模型,确实结果变得更好了。

3)Dropout层。增加dropout层也是可以的,但是很遗憾当时没有回答出来这个是干啥的。但这个应该主要是指的深层神经网络(DNN)中,因为深度学习的拟合能力太强了。所以对于深度神经网络,DCNN,DNN等等增加一个带蒙板的dropout层,设定一个dropout的比率 以及随机种子,比如Dropout Layer(rate=0.5, seed=45) 。使用dropout 可以使得更新的时候强制使某些节点的输出为0,使得某些通路上的梯度不进行更新(也可以帮助缓解梯度消失问题,之前的文章提过另一个方法是在中间层使用relu以及relu相关的激活函数),可以看成一种ensemble的方法,进而提高模型的鲁棒性。但是实际上用起来(比如打比赛的时候),感觉增加dropout层有的时候模型的acc会下降。

4)正则化。我觉得这个肯定是当时面试官想听到的答案(因为一直在追问我还有呢,但是最后还是没答出来。),正则化。添加一些正则项,比如L0-norm,L1-norm或者L2-norm进行计算,这些norm可以在参数更新的时候,防止参数变得过大,从而使得模型的泛化能力得到提升。(这里插一句关于正则化的点,如果是逻辑回归加上L1正则,就是lasso回归,逻辑回归加上L2正则,就是岭回归,加上L0正则,就是OMP,如果去看这些正则参数的效果,就可以知道,调整某些参数,可以使得某些特征的权重decay,甚至有的特征的权重会到0,实际上这些权重到0的过程,就是正则化的过程,防止权重过大,从计算上来看,L2正则实际上是最好求的,因为是弧线,可以求导(海塞矩阵可以求出来),L1和L0正则在计算上实际上会更加复杂)

5)Earlystop.既然模型训练到了一定的程度,loss反而变高了,那么设置一个patience,如果经过patience数量以后的epoch之后,模型的loss基本上不变或者反而变高了,就停止训练了,防止模型进一步过拟合,也是可以的,这个叫做earlystop是可以在tensorflow中设置的。

6)其实第4步讲了,drop层相当于看成一种ensemble集成学习的方法,我觉得如果这样看,单纯的集成学习应该也可以提高模型的鲁棒性,也就是应该也可以对抗过拟合。

 

其他的关于这两点的内容以后想起来再写吧。

 

你可能感兴趣的:(tensorflow,神经网络,机器学习)