为了账号安全,请及时绑定邮箱和手机立即绑定

过拟合解决方法之L2正则化和Dropout

什么是过拟合?

    一幅图胜千言万语

https://img1.sycdn.imooc.com//5d2fcff00001a08f02690205.jpg

欠拟合


https://img1.sycdn.imooc.com//5d2fcff300013e9602890214.jpg

正确的拟合


https://img1.sycdn.imooc.com//5d2fcff8000195ee02950209.jpg

过拟合

    过拟合(overfitting):就是对数据的过度严格的拟合。这个经常出现在分类问题上。

怎么解决过拟合呢?

L2正则化

逻辑回归 中L2正则化的过程:

L2正则化是最常用的正则化。

我们先求出代价方程J(w,b)为:

https://img1.sycdn.imooc.com//5d2fcffc0001d06203870070.jpg

代价方程

L2正则化,就是在代价方程后面加个lambda/(2m)参数W范数的平方,下标2表示L2正则化的意思,2是为了接下来的求导好化简而写的,就是个比值而已:

https://img1.sycdn.imooc.com//5d2fcfff0001259b05390088.jpg

L2正则化

其中||w||^2是:


https://img1.sycdn.imooc.com//5d2fd003000182cd03320104.jpg

||w||^2

但是为啥参数W都用上了,为啥不+bias b:

https://img1.sycdn.imooc.com//5d2fd1070001924307090078.jpg


因为,b也是一个参数,而且是一个数,而W是很多个参数,感觉少了b也没啥所以一般不写上b。

这里的lambda是超级参数,跟学习率一样,需要我们自己调。

神经网络 L2回归的过程:

    神经网络其实就是有大于等于1个隐藏层,也就是比逻辑回归多了参数而已:

https://img1.sycdn.imooc.com//5d2fd10b0001e3b807350081.jpg

代价函数

其中||W||为:

https://img1.sycdn.imooc.com//5d2fd1100001f54904220122.jpg

    注:L-1=上一层的大小,L是当前层的大小

该||W||矩阵范式被称为Frobenius norm 即弗罗贝尼乌斯范数,表示为(||W||_F)^2:

https://img1.sycdn.imooc.com//5d2fd113000159d102270100.jpg

2->F

这个矩阵L2范式,也叫弗罗贝尼乌斯范数。

求导:

没有L2正则化以后,导数是这样的,[from backprop: 从反馈传播求得的]:

https://img1.sycdn.imooc.com//5d2fd1160001680b03230132.jpg

而现在有了L2正则以后,就变成了:

https://img1.sycdn.imooc.com//5d2fd11900011d7205060136.jpg

其中可以看出和上面的原本的W^[L]比,缩小成了下面的倍数(其中alpha>1):

https://img1.sycdn.imooc.com//5d2fd15500010da001150071.jpg

这个W的缩小变化使得L2正则化被称为“权重衰退”。

有L2正则化就有L1正则化,但是为啥不用呢?

    L1正则化的||W||为:

https://img1.sycdn.imooc.com//5d2fd15900018a7703780099.jpg

L1正则化||W||

    L1的正则化的||W||会使得W最终变得稀疏,也就是有很多0出现,有助于压缩参数和减小内存,但这也不是我们用L1正则化的目的,不是为了压缩模型。(这个斜体加粗的话我还没弄懂为啥会出现很多0,知道的小伙伴分享下)

Dropout

    Dropout有很多,其中Inverted Dropout 反向随机失活最常用。根据这个翻译的意思,也能大概猜出来Inverted Dropout的意思,也就是从后面随机使一些当前层的神经单元失效。

上图说话:

没Dropout前的网络为:

https://img1.sycdn.imooc.com//5d2fd1630001cca504760231.jpg

开始Dropout操作:

https://img1.sycdn.imooc.com//5d2fd1680001f24804880252.jpg

    注释:红叉的单元是被去除的,也就是该单元权重置为0。

这个dropout操作是从每一层开始的,首先需要设置一个值,keep_prob,就是保留多少,范围0-1。这个例子很明显是0.5。然后在从后往前经过每一层,都把当前层随机流线keep_prob的比例,其他的单元的权重置为零。

代码模拟实现为:

https://img1.sycdn.imooc.com//5d2fd16b0001879506310414.jpg



作者:zenRRan
链接:https://www.jianshu.com/p/c1a334b1a9a6


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消