2018-12-04 简化DNN结构,提高训练效率
本笔记是针对李宏毅教授在b站上的视频《ML Lecture 9-1:Tips for Training DNN》的学习笔记的下半半部分。
1.正则化(Regularization)
引申:人脑中的正则化,人的大脑中的神经连接数也是先增加后减少,我们可以猜测这是因为更精简的模型可以带来更好的表现。
![](https://img.haomeiwen.com/i8878185/43f103726eaee7f2.png)
我们重新定义一下要去最小化的损失函数:在原来的损失函数上加上正则项。
L是范数符号,L2正则化:
![](https://img.haomeiwen.com/i8878185/00421291da354594.png)
而(1−ηλ)每次都是一个小于1的数,所以其实每一次更新都会使参数衰减一点,最终会衰减到0,但是因为有后项最终w只会得到一个很小的值但是不会为0。
![](https://img.haomeiwen.com/i8878185/63fd7c6c87abe982.png)
上面是L2正则化,下面看看L1正则化:
![](https://img.haomeiwen.com/i8878185/114c88a09cf8fcb6.png)
如上图,我们可以看到L1与L2作参数更新时的差别:L1是每次参数多减去一个固定值,而L2是每次对参数进行乘以一个小于1的正值的衰减,因此L1最后会得到比较多的0值(更稀疏),而L2会得到比较多的较小但非0的值。
2.Dropout
做法:训练过程中,每一次更新参数前,我们对网络中的每个神经元做一次sampling,即令每个神经元有p%的概率被丢弃掉,然后只更新余下的神经元的参数。
注意:dropout只有在训练的时候才会使用。
![](https://img.haomeiwen.com/i8878185/f8251453e0e61a97.png)
![](https://img.haomeiwen.com/i8878185/a1c17632e800481f.png)
测试时怎么做呢:不做dropout!!!并对参数乘以(100-p)%。
![](https://img.haomeiwen.com/i8878185/804e2846f74bb789.png)
为什么要乘以(100-p)%?
用dropout训练时,期望每次会有p%的神经元未得到训练。而在测试集上,每次都是所有的神经元都参与了工作,所以在计算z值时,会是原来训练时的100%−p倍,因此需要在测试时乘以(100-p)%。
![](https://img.haomeiwen.com/i8878185/640bfb11f327da54.png)
为什么Dropout会有效呢?
![](https://img.haomeiwen.com/i8878185/2eab7daf2642a673.png)
小李训练时会绑沙袋,而一放下沙袋,束缚束缚,能力就会增强。
![](https://img.haomeiwen.com/i8878185/ef8b44d81041750c.png)
Dropout是一种ensemble
![](https://img.haomeiwen.com/i8878185/360f65fd29159ab7.png)
![](https://img.haomeiwen.com/i8878185/f004650dfb95389b.png)
因为每次用一个minibatch的数据对NN进行训练时,由于dropout,每次都相当于训练了一个新结构的网络,那么当我们整个NN中有M个神经元时,我们最多可以训练处2M
个可能的网络,而最终测试时,也就相当于这些网络合力给出结果。
也不用担心说一个网络只用一个batch来训练,效果会不会很差,因为神经元的参数是共享的,大家其实可以整体看做还是在合力使得彼此的能力都变得更强。
![](https://img.haomeiwen.com/i8878185/eb102402abab8de1.png)
那么按理来说,我们如果这样做ensemble(集成),
最后应该把所有的网络都输入测试数据x,再取所有输出的平均作为结果
但是因为网络数量太多,这样做不太实际。而神奇的就是:当我们把所有的网络参数乘以(100-p)%,然后把测试数据x输入到原本的网络中,它的输出结果就和ensemble的结果很接近!!!
![](https://img.haomeiwen.com/i8878185/1b93abd335f50299.png)
为什么呢?
用一下一个单一的神经元的例子就可以看出来:
![](https://img.haomeiwen.com/i8878185/9f489df46c027c0b.png)