pytorch深度学习实战lesson27

第二十七课 批量归一化

       下面来讲批量归一化,现在几乎所有主流的卷积神经网络都是或多或少的用了批量归一化这个层。虽然我们之前看到的那些层比如 pooling 或 convolution,其实他们在80年代就出现过了,只是现在我们把它做得更深更大。批量归一化虽然思想不新,但是这个特定的层确是最近几年才出来的,大家发现效果很好,特别是做很深的神经网络的时候,这个是不能避免的一个层。

目录

理论部分

实践部分

从零开始实现:

简洁实现:


理论部分

批量归一化解决的问题:

pytorch深度学习实战lesson27_第1张图片

        当神经网络特别深的时候,梯度在上面的时候会比较大,到下面的时候就容易变小。因为在反向传播的时候是N个很小的数相乘,一直乘到最后梯度就变得比较小了,他的问题就是上面的梯度大,那么每一次更新的时候,上面梯度就会不断去更新。因为学习率是固定的。所以下面的层会因为梯度比较小,对权重的更新就比较小。

        上面收敛比较快,下面变化又比较慢,这就导致每一次下面一变,上面就得重新开始训练,底层的信息都变了,那么上面的那些权重就白学了。

        所以那么我们要解决的问题就是能不能在学习底部的时候,能够避免顶部会不断的重新训练,这是批量规划所要考虑的一个问题。

pytorch深度学习实战lesson27_第2张图片

       它的设计思路就是不管每一层的输出也好,梯度也好,假设都符合某一个分布,那么相对来说它就是比较稳定的。也就是说整体来看整个分布的区间固定后不会带来一个特别大的转变就可以了。

       给定一个 xi 是输入的话,那么我这个批量规划的输出就是对里面的每一个样本减去均值,除以方差,然后再乘以一个伽马,再加上一个贝塔。其中uB 和 Sigma B 是根据当前数据算出来的。伽马和beta 是可以学习的参数。

       那么它的作用可以认为是假设这个分布就是均值为0方差为1,如果这个分布不是那么的适合的话,那么我可以通过去学习一个新的均值和一个新的方差来使得学习出来的值对神经网络更好一点。

pytorch深度学习实战lesson27_第3张图片

批量归一化是线性变换。

       对全链阶层,它作用在特征维上面。那对全链接层的话,它是对每一个特征计算一个均值,标量的方差,然后把特征变成均值为0,方差为1。它会对每一个全链接的输出或者输入都做这个事情,而不是只作用在数据上面。另外的话它也会去用自己学到的一个伽马和贝塔重新作用一下,把均值和方差再做一次校验。

       那么对于卷积层的话,它是作用在通道维上面,这怎么理解呢?对于卷积层来讲假设你的输入是批量大小乘以高乘以宽,再乘以通道数的话,那么样本数就是批量大小乘以高和乘以宽。也就是说整个批量里面所有的像素都是一个样本,那么它对应的那个通道就是特征。在这里的话一样的,就是说它把所有的像素当作是样本,然后计算它的均值和方差,那么就是只作用在通道层,通道层就是当做是卷积层的一个特征位。

pytorch深度学习实战lesson27_第4张图片

pytorch深度学习实战lesson27_第5张图片

实践部分

从零开始实现:

pytorch深度学习实战lesson27_第6张图片

pytorch深度学习实战lesson27_第7张图片

pytorch深度学习实战lesson27_第8张图片

pytorch深度学习实战lesson27_第9张图片

简洁实现:

pytorch深度学习实战lesson27_第10张图片

pytorch深度学习实战lesson27_第11张图片

你可能感兴趣的:(神经网络,深度学习,pytorch,cnn,python)