神经网络的优化(4)----正则化

                                                                                                                                         点击此处返回总目录

 

 

下面开始讲regularization。

                           

 

Regularization是什么呢?我们重新定义了我们要去minimize的那个loss function。

                                   

我们原来呢,要minimize的loss function是是定义在你的training data上的,比如说minimize 均方误差,minimize 交叉熵损失 。

                                                               

在做regularization的时候呢,我们会再加一个Regularization的term,比如参数的2范式。2范式是什么意思呢?假设参数theta里面呢,有w1,w2,...。二范式就是平方和。因为我们现在用二范式来做regularization,所以称为L2正则。我们之前也讲过,在做regularization的时候呢,一般是不会考虑bias这一项。因为我们讲过,我们加regularization的目的是,让我们的function更平滑。而表示跟function的平滑程度是没有关系的。所以通常在算regularization的时候,不会把biase考虑进来。

                                           

 

我们对新的Loss  function 做微分的话,会得到:

                                            

所以,现在update的式子会变成下面这样。根据这个式子,可以得到,每次在update之前把w乘以(1-ηλ)。η通常是learning rate,是一个很小的值。λ通常也会设一个很小的值,比如说0.001之类的。所以ηλ是一个很小的,1-ηλ通常是一个接近1的值,比如说0.99。所以,只看update的式子的话,每次更新参数之前,部分青红皂白,先乘0.99再说。也就说是,每次让你的参数越来越接近0。有人会说,越来越接近0,最后不都是统统变成0么?其实不会所有的参数都变成0,因为后面还有从微分得到的这一项,这一项会跟前面最后取得平衡。所以,并不会最后所有的参数都变成0.

因为我们使用L2正则化的时候,我们每次都会让weight小一点。所以这一招呢,叫weight decay。

                                  

其实,跟其他方法比如SVM比起来,在deep learning里面,regularization虽然有帮助,但是它的重要性并没有那么高。regularization的帮助往往没有那么显著。我觉得一个可能的原因是,如果你看前面的early stopping,我们可以决定什么时候training应该被停下来。因为我们在做神经网络的时候,通常初试参数的时候,都是从一个很小的值,接近0的值开始初试参数。你在做update的时候,通常就是让参数离0越来越远。而做regularization这件事情,他要达到的目的就是希望我们的参数不要离0太远。离0不要太远,加上regularization的效果可能跟减少参数更新次数的效果是很像的。所以,做early stopping,减少参数更新次数,其实也可以避免参数离0太远。这跟regularization做的事情可能是很接近的。所以在deep learning里面,regularization虽然也有帮助,但是没有那么重要。不像SVM,在SVM中是吧regularization明确的写在它的函数里面的,因为在做SVM的时候,他其实是要解一个凸优化问题,实际上,它解的时候不一定会有迭代的过程,它一步就解出那个最好的结果了,它不想deep learning一样,有early stopping这件事,因为可能一步就走到结果了。所以没有early stopping来防止离0太远,所以必须要把regularization 明确地加到Loss function里面去。

 

 

有人说,为什么要L2正则化。当然可以用别的,比如可以用L1正则。

                                                   

此时,损失函数为:  

                                                 

微分得到:

                                                   

有的人觉得绝对值不能微分。最简单的回答就是,这个东西在TensorFlow,Keras上都实现了,没有问题。所以显然是可以微分的。实际的回答是,w的绝对值的微分是1和-1,不能微的地方只有0的地方,就不要管它。真的出现0的时候,就胡乱给一个值,比如给个0就好了。sgn(w)的意思是,如果w是正数,sgn(w)就是1;如果w是负数,sgn(w)就是-1。

参数更新的式子为:

                         

这个式子,告诉我们,我们在每次update参数的时候,我们都不管三七二十一都要减去ηλsgn(w)。当参数是正的,就减掉一些。当参数是负的,就加上一些。跟参数的大小没有关系。

 

我们把这个式子跟L2做一下比较的话,就会发现。他们同样都是让参数变小,但是他们做的事情是略有不同的。L1是每次都减到一个固定的值,L2是每次都乘上一个小于的1的固定值。而使用L1,不管w是100万还是0.1,下降的都是一样的。所以如果w是一个很大的正值的话,使用L2会下降很快,使用L1就下降的很慢。如果w是一个很小的值,使用L2就下降的很慢,使用L1就下降的很快。在L2里面,train出来以后,会保留很多接近0的值。但L1每次都下降一个固定的值,在 L1里面不会保留很多很小的值。所以在用L1做training的时候,得到的结果就是比较分散的,这里面有很多接近0的值,也有很多比较大的值。如果L2做的话,结果是平均的都比较小。所以,他们learn出来的结果是略有差异的。

                            

 

 

 

最后,再胡乱讲一个东西。weight Decay(权值衰减)。我们在人脑里面也会做weight decay。左边是刚出生的人的脑子。6岁的时候胡,会有很多很多的神经,但是到14岁的时候,神经间的连接又减少了。神经网络也会做很类似的事情,如果有一些weight,你都没有去update它,它每次都会越来越小,之后就接近0,就不见了。这跟人脑的运作有异曲同工之妙。

 

                                 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值