0.学习路径示意图
Hello,各位小伙伴大家晚上好呀!经过上期的CNN卷积神经网络原理篇的讲解,小伙伴们是不是已经迫不及待地想利用TensorFlow来搭建属于自己的神经网络来训练啦?诶,戳多马爹(且慢)!在组网之前,博主还是有一些东西要给大家交代的。那就是神经网络的超参数(Hyperparameters),记忆力好的小伙伴会发现博主在之前更新的文章中都有提及超参数。
But,这一期分享的超参数设置与往期不同,它是所有网络共有的超参数,也就是说我们不管组什么网络,都可以对这些超参数进行设置。不像上期介绍的CNN网络,它的一些特有超参数如Padding其他网络并不具备。当然了,有些小伙伴可能并没有看过之前的文章,在这博主也给大家说下啥是超参数,通俗易懂来说就是小伙伴们在训练神经网络前必须人工设定的参数。
前期内容
好了,废话不多说,这期我们主要讲这几方面:
1.应对过拟合的两种方案:正则化(Regularization)与Dropout
2.优化器(Optimizer)
3.学习率(Learning Rate)
4.总结
1.应对过拟合的两种方案
在此之前,博主先给大家科普下啥是过拟合。举个最简单的例子,小伙伴们一般在考试前都会做题去复习,假如我们当晚做的题都在第二天考场上见到了,那么咱们的分数就会高很多,但是其实出别的题目,小伙伴们可能就答不上来了,这时候我们就把这种情况叫过拟合,因为小伙伴们只是记住了一些题目的特征,但是并没有很好地了解题目最本质的真理。
这时候博主顺带给小伙伴们科普下泛化性,泛化就像是学神,不管他当晚有没有复习到第二天考试的题目,依旧能拿高分,本质上是学神已经将所有题目最本质的真理都学会了,所以不管出啥题目他都能通过已经掌握的真理去解答,这就是泛化。
那我们训练模型也一样,当然希望我们弄的模型能和学神一般,不管碰到什么题目都能迎刃而解,而不是学渣碰运气,全靠当晚抱佛脚。所以为了保证我们模型的泛化性,通过一定手段去避免过拟合,从而避免我们的模型在努力学习数据的真理时误入歧途当了学渣。
下面博主就给小伙们一一剖析神经网络是如何通过下面两种手段去应对过拟合的,不过在此之前,博主依惯例给小伙伴们上一个过拟合的图片让大家感受下。
1.1正则化(Regularization)
说到正则化,博主先来两个公式,让大家回忆下曾经被数学支配的过往。
正则化有好几种,这里博主主要讲上面这两个L1与L2,其他正则化与它们只是形式上有所区别,本质上数学核心都是一样的。
那好,这时候先认识下公式里面的参数,Co 和博主之前文章提及的损失Loss 是一个东西,不过今天的主角并不是它,而是下面这个权值累加项。
看着这个公式,小伙伴们兴许并没有啥感觉,这时候回忆下博主刚刚说的学神与学渣的故事,学神为什么这么强,因为他掌握了题目最本质的真理,这个真理比学渣做很多很多重复的题目单纯记住题目本身要高效得多。那我们的模型要想跟学神一样强,那就必须得大道至简,掌握数据规律中最基本的真理。
好了,说到这,我们又可以看下公式了,公式有个对权重的累加部分,那我们设想下权重越大,越多,那损失C是不是越大,像不像当年为了考高分疯狂背题的小伙伴们?是的,权值越多,越大说明我们花费了很多时间和精力去记住某个题目的特征,而忽略了题目本身的真理,这样导致我们有可能在盲人摸象,并没有摸透整个大象长什么样。
当然了,假如小伙伴们就是疯狂背题,把所有题目的套路都记住了,那也能高分的,这就是暴力求解法,因为只要我们摸的大象部位越多,那大象的样子迟早有一天会完完整整呈现在脑海里的,但是这就要浪费大量的时间和精力了,这就不是什么人工智能了,因为我们压根就没把智能赋予给机器,只是让机器是无脑算而已。
现在加入这一个权值累加项,就是为了让我们时时刻刻在计算自己的损失,我们知道神经网络的训练是通过梯度下降不断减小Loss的过程,那么加上这一项就可以有“意识”地避开增大w的方向去行走。
那式子中α我们可以理解为惩罚因子,如果我们对下面这个部分越重视,那我们就加大α,迫使它向权值w减小的方向快速移动。
到现在为止,小伙伴们应该明白了正则化的目的就是为了模型的泛化而添加的一个权值累加项。那接下来博主就给大家介绍下L1和L2的区别。现在小伙伴们又可以看下上面的L1和L2的式子了,L1是绝对值,L2是平方,以此类推可以知道L3、L4等等正则项也是这么弄的。L2前面加的那个1/2只是为了求导的时候好削,可以说是一个计算技巧。
现在,上图!
考虑二维情况,在(w1,w2)的权值平面上可视化代价函数的求解过程,圆心为样本值,半径是误差,红色的边界是正则项(权值累加项)的约束条件,两者相交则是整个代价函数Loss的最优解。
小伙伴们可以将整个求解的过程理解为在让w1、w2最小的情况下,让样本与正则项(L1 or L2的权值累加项)相交得到最优解。
我们可以看到的是L2比较圆润(二次项),L1则是方块比较尖(一次绝对值),这样L2与样本相交的时候,最优解(w1,w2)都是有值的,而L1与样本相交得到的最优解(w1, w2)其中w1=0。
所以,L1倾向于更少的特征,其他特征为0,而L2倾向于更多的特征,每个特征都有值。这只是二维情况下,如果在三维甚至更高维度,小伙伴们也可以想象L1为棱角分明的尖物体,而L2为圆润的物体,这样他们与高维的样本相交的时候,生成的最优解也和二维情况一样。而且本质上也符合上面正则化项(权值累加项),尽可能让权值更小,更少,这样我们得到模型泛化性越强。
1.2Dropout
可能有些小伙伴们会说,正则化只是让权值w变小,并没有让权值w的数量减少,因为当整个网络结构确定下来的时候,权值w的数量就已经确定了,而正则化并不能去改变网络结构。这时候Dropout就登场啦,我们在每一轮训练过程中随机放弃一些神经元节点,这样我们一定程度上就相当于减少了权值数量,用更少的权值数量去训练网络,就像我们用最高效的方法去掌握多的题目,本质上就是个加强模型泛化性的过程。
依惯例,上个图让小伙伴们感受下。
2.优化器(Optimizer)
在前几期的文章中,小伙伴们了解到了我们整个网络的训练都是基于梯度下降法去训练的,但是当数据量多的时候,梯度下降法训练就会非常的慢,因为我们每一轮训练都会对所有数据求梯度,这样谁受得住啊?
所以,有一些聪明的小伙伴就提出了优化方法,也就是博主即将介绍的优化器。
2.1 随机梯度下降Stochastic Gradient Decent(SGD)
梯度下降法每次训练都用全部样本,因此这些计算是冗余的,因为我们每次都用同样的样本去计算。而随机梯度下降法(SGD)为此做了些许改变,每次只选择一个样本来更新来更新梯度,这样学习速度肯定非常的快,并且支持对新的数据进行在线更新。
当然了,我们为了速度快,理所应当的要付出一些代价,不像梯度下降法那样每次更新都会朝着Loss不断减小的方向去移动,最后收敛于极值点(凸函数收敛于全局极值点,非凸函数可能会收敛于局部极值点),SGD由于每次选择样本的随机性,会有些许波动,也就是下图的SGD收敛示意图,走的路会比较曲折,有时候会从一个点突然跳到另外一个点去,不过这样也有好处,因为对于非凸Loss函数,我们用梯度下降法很可能收敛在在局部极值点就不动了,但是SGD却能用它的随机选择样本更新梯度的特性跳出局部极值点,很可能在非凸Loss函数中找到全局极值点。
2.2 Momentum
知道了SGD的缺点 ,为了解决他的波动性,有个聪明的小伙伴在SGD的基础上又添加了点东西,从而抑制SGD的震荡。这个添加的东西就是动量,我们先看下Momentum的公式。
我们通过添加γv_t-1这项,让随机梯度下降拥有了动量,这时候小伙伴们要回一下高中物理了,动量是具有惯性的,也就是我们在下山过程中,即使随机走路,但是受限于惯性,我们不可能随便跳来跳去,从而抑制了SGD在梯度下降过程中震荡,为此博主给小伙伴们上个图,让大家有个更直观的理解
从上图我们就可以看出,加入了动量抑制了震荡,走的路至少不这么曲折了,这个方法就是Momentum。
2.3 RMSprop
熟悉TensorFlow调参的小伙伴可能会觉着,学习率(Learning Rate)调参是个比较麻烦的事,为此,自适应的学习率调参方法就出现了,目的是为了减少人工调参的次数(只是减少次数,还是需要人工设定学习率的)。RMSprop就是其中一个比较优秀的自适应学习率方法,公式如下:
使用的是指数加权平均,旨在消除梯度下降中的摆动,与Momentum的效果一样,某一维度的导数比较大,则指数加权平均就大,某一维度的导数比较小,则其指数加权平均就小,这样就保证了各维度导数都在一个量级,进而减少了摆动。允许使用一个更大的学习率η。
2.4 Adaptive Moment Estimation(Adam)
现在我们讲最后一个优化器,Adam,它相当于RMSprop + Momentum,也就是拥有了这两者的优点,因此博主在很多优秀的论文都能看到很多小伙伴都用它来做神经网络的优化器。所以,一般不知道怎么选,那就选最强的就对了。
讲到这了,怎么能不上个优秀的动图来总结下刚刚过的知识点,然后感受下每个优化器在梯度下降的过程呢?
3.学习率(Learning Rate)
细心的小伙伴会发现博主在之前的BP神经网络已经提及了学习率,这里再一次提及只是为了让整个TensorFlow的超参数知识体系更加的完整,避免小伙伴们知一不知二。
我们知道整个训练过程就是梯度下降更新权值的过程,对于学习率的作用,小伙伴们可以通过上面的公式以及下面的示意图可以明白,对于凸函数,大的学习率可能会在学习过程中跳过全局极值点,小的虽然速度慢但是最终能收敛到全局极值点,求得最优解。
但是对于非凸函数,他可能存在许多局部最小值,小伙伴们使用较小的学习率去训练的时候,很可能让整个网络收敛于局部最小值而不是全局最小值,从而得不到最优解。
可能有些小伙伴还不了解啥是非凸函数,博主在这里给大家上个图来感受下,就是存在局部最低点的一个函数。具体的定义小伙伴们可以通过网络资源去了解,大致有个概念就好。
说到这,那我们应该怎么去选择学习率呢?目前业界并没有很好的方法,也就是说怎么优秀怎么来,小伙伴们通过自己调参去将学习率调到最优即可。
4.总结
好啦,到目前为止,博主已经给小伙伴们将整个TensorFlow超参数设定的知识点给讲完了,希望小伙伴能将它们吃透,接下来博主就会通过CNN卷积神经网络的代码实战将这些知识点串起来,到时候小伙伴们就对整个神经网络的知识体系有个相对完善的理解,并以此为基石,去组建属于自己的神经网络,做自己想要做的事~
如果觉得博主写得不错的话,就给微信公众号右下方点个赞吧,小伙伴们的认可是博主持续更新的动力哦~
当然啦,有些小伙伴可能会喜欢通过视频来学习,想看博主原声讲解小视频的小伙伴们,可以
bilibili值得拥有~(っ•̀ω•́)っ✎⁾⁾ 我爱学习
UP主:阿力阿哩哩
博主最近都在鼓捣关于NLP(nature language processing)的项目,更新频率基本会保持在一周一次,在这里说一哈!NLP也是可以用神经网络去处理的噢,待博主捣鼓归来,定将NLP相关的知识点输出给大家学习一波。
(真挚的目光.jpg)
网友评论