2018-12-04 简化DNN结构,提高训练效率

本笔记是针对李宏毅教授在b站上的视频《ML Lecture 9-1:Tips for Training DNN》的学习笔记的下半半部分。

1.正则化(Regularization)

引申:人脑中的正则化,人的大脑中的神经连接数也是先增加后减少,我们可以猜测这是因为更精简的模型可以带来更好的表现。

我们重新定义一下要去最小化的损失函数:在原来的损失函数上加上正则项。

L是范数符号,L2正则化:

而(1−ηλ)每次都是一个小于1的数,所以其实每一次更新都会使参数衰减一点,最终会衰减到0,但是因为有后项最终w只会得到一个很小的值但是不会为0。

上面是L2正则化,下面看看L1正则化:

如上图,我们可以看到L1与L2作参数更新时的差别:L1是每次参数多减去一个固定值,而L2是每次对参数进行乘以一个小于1的正值的衰减,因此L1最后会得到比较多的0值(更稀疏),而L2会得到比较多的较小但非0的值。

2.Dropout

做法:训练过程中,每一次更新参数前,我们对网络中的每个神经元做一次sampling,即令每个神经元有p%的概率被丢弃掉,然后只更新余下的神经元的参数。

注意:dropout只有在训练的时候才会使用。

测试时怎么做呢:不做dropout!!!并对参数乘以(100-p)%。

为什么要乘以(100-p)%?

用dropout训练时,期望每次会有p%的神经元未得到训练。而在测试集上,每次都是所有的神经元都参与了工作,所以在计算z值时,会是原来训练时的100%−p倍,因此需要在测试时乘以(100-p)%。

为什么Dropout会有效呢?

小李训练时会绑沙袋,而一放下沙袋,束缚束缚,能力就会增强。

Dropout是一种ensemble


因为每次用一个minibatch的数据对NN进行训练时,由于dropout,每次都相当于训练了一个新结构的网络,那么当我们整个NN中有M个神经元时,我们最多可以训练处2M

个可能的网络,而最终测试时,也就相当于这些网络合力给出结果。

也不用担心说一个网络只用一个batch来训练,效果会不会很差,因为神经元的参数是共享的,大家其实可以整体看做还是在合力使得彼此的能力都变得更强。

那么按理来说,我们如果这样做ensemble(集成),

最后应该把所有的网络都输入测试数据x,再取所有输出的平均作为结果

但是因为网络数量太多,这样做不太实际。而神奇的就是:当我们把所有的网络参数乘以(100-p)%,然后把测试数据x输入到原本的网络中,它的输出结果就和ensemble的结果很接近!!!

为什么呢?

用一下一个单一的神经元的例子就可以看出来:


你可能感兴趣的:(2018-12-04 简化DNN结构,提高训练效率)