全文共 2174字,预计学习时长 4分钟
本文作者将用实际的案例,带你深入探究CNN初始化。
![8ac8c8cb1b1d3cb6174011908b2b253d.png](https://i-blog.csdnimg.cn/blog_migrate/eb0fae25b4f7bfc43824872e0691c03d.jpeg)
上周,我用在CIFAR10数据集上训练的VGG16模型进行了一些实验。由于模型需要从头开始训练,所以我并未采用ImageNet的预训练模型。
我设置了训练50个epoch,然后去喝了杯咖啡。回来之后,却发现学习曲线变成了这样:
![0503f792fd6251efddbf83580d4b8d78.png](https://i-blog.csdnimg.cn/blog_migrate/361416fe7619491805c6e7fba86805ab.jpeg)
![cd875ab8495d36efef3a3ffa9e0ef68d.png](https://i-blog.csdnimg.cn/blog_migrate/844368513733ea2c608c5fcf3e27bbdb.jpeg)
这个模型没有学到任何东西!
我见过收敛得很慢的网络,也见过振荡、过度拟合、发散的网络,但像这种什么也没有学到的模型还是头一次见。于是,我深入研究了一下其中的原因。
![0e9df8d3e4cd1698c2d005b5de7df2f5.png](https://i-blog.csdnimg.cn/blog_migrate/6ef1cf85d2003ce0cf1f2baf4602b44c.jpeg)
实验
建立模型时,我遵循了原始的VGG16结构,但移除了大多数完全连接的层,因此几乎只剩下卷积层。
![cf823b55abe3c2ba3b82ad86cedb3be4.png](https://i-blog.csdnimg.cn/blog_migrate/fb152a74a23581ce7ab5f568bcb12aac.jpeg)
要找到上述训练曲线出现的原因,还需要知道:当模型学习不佳时,往往可以从梯度找到原因。以下方法可以得到每层的平均值和标准偏差:
![61e439245be431b59a045a16aae6b892.png](https://i-blog.csdnimg.cn/blog_migrate/94e17692642b84e01b0056ec2226170c.jpeg)
转换为图表如下:
![c05e9b4d5d6b9d5c41e0a025e5df776b.png](https://i-blog.csdnimg.cn/blog_migrate/ea8c28fedfe23ac62657e4c07758cb5e.jpeg)
![1dda01827a699df680987c903f4c8e07.png](https://i-blog.csdnimg.cn/blog_migrate/1e5cb8721b60be526afe39aba55c20f2.jpeg)
使用Xavier初始化的 VGG16 梯度统计值
哦,原来我的模型梯度为0……或许我们应该检查激活值在各层变化的过程。通过以下方法可以得到它们的平均值和标准差:
![39ced38a9ea21412a1bb5408de1c9615.png](https://i-blog.csdnimg.cn/blog_migrate/288af4957f9440bdad6b4180adb7a10c.jpeg)
转化为图表形式如下:
![3af8a6e2ff5b21cf01537cf6ac0596ba.png](https://i-blog.csdnimg.cn/blog_migrate/d20100cf06d893590da2800ba8f1fc87.jpeg)
![1afc15671ea8e552e8f7cf732779b63e.png](https://i-blog.csdnimg.cn/blog_migrate/e6218ef029af4c7a0e4ff0c0448acaf5.jpeg)
使用Glorot均匀分布初始化的 VGG16 梯度统计值
原来问题出在这里!
给你一点小提示,计算每个卷积层梯度的函数如下:
![040b52f9c202df19e0fd25ae3aa5336e.png](https://i-blog.csdnimg.cn/blog_migrate/0767e7a7832768e86de13d16112284e8.jpeg)
其中Δx和Δy表示梯度∂L/∂x和∂L/∂y。计算梯度用到了反向传播算法(BP算法)和链式法则,也就是说,要从最后一层开始,反向传播到前面的层。那么,如果最后一层的激活值接近0会发生什么呢?确切地说,在我的模型里,任何地方的梯度都等于0,无法反向传播,该网络也因此无法学习任何东西。
由于我的网络非常简单 (没有批标准化,没有Dropout算法,没有数据扩充,…...),所以问题的根源很可能是初始化不佳,因此我翻阅了何恺明(Kaiming He)的论文,下面简单介绍其主要内容。
论文传送门:https://arxiv.org/pdf/1502.01852.pdf
![0e9df8d3e4cd1698c2d005b5de7df2f5.png](https://i-blog.csdnimg.cn/blog_migrate/6ef1cf85d2003ce0cf1f2baf4602b44c.jpeg)
初始化方式
初始化向来是深度学习的重要研究领域。随着神经架构和非线性的不断发展,其重要性也不断提高。良好的初始化是我们能够训练深度神经网络的原因。
以下内容为何恺明论文的中心思想,展示了使以ReLU为激活函数的CNN(卷积神经网络)初始化良好所应具备的条件。这需要一点数学基础,相信你能掌握要点。
先来看卷积层l的输出:
![b8052b7b4b86e02a361887c957df0ddd.png](https://i-blog.csdnimg.cn/blog_migrate/2f7702a66d13c9d24a93a407e6b2400b.jpeg)
假设权重w和元素x相互独立且分布相同,如果偏差被初始化为0,那么:
![2eb0d0bf9bf1772d3f3cd22efd61f4d6.png](https://i-blog.csdnimg.cn/blog_migrate/a905ed14d68a8cd3749d7be31f13f4ff.jpeg)
n表示一个层中的权重数(即n = k²c)。经过下列独立变量乘积的方差表达式:
![fa043f4dfdbd26f3b4208358e83f8d80.png](https://i-blog.csdnimg.cn/blog_migrate/ec3d07aa800f34975cf71b9d94840ef7.jpeg)
然后是:
![c28d36ed4125118495419ba44a51a654.png](https://i-blog.csdnimg.cn/blog_migrate/7a263177e9999d1e1cd9a3725a045fa5.jpeg)
如果权重w的平均值为0,则:
![b74076460af106f494fb4cf6de0d9855.png](https://i-blog.csdnimg.cn/blog_migrate/46afd00aaf84bb13cef29113e680d474.jpeg)
经过König-Huygens性质:
![59f9fa62e8972143d2733d0bedabaa30.png](https://i-blog.csdnimg.cn/blog_migrate/5c803a48c08f9f4b4b378fa097736af8.jpeg)
最终得到:
![e5ff128106c24870c565d79cd7b501ca.png](https://i-blog.csdnimg.cn/blog_migrate/361c43b1fc20646129143907908f934a.jpeg)
然而,由于使用的是ReLU激活函数,于是:
![9f47e904721bd37ca6b9e8136ba9fa8a.png](https://i-blog.csdnimg.cn/blog_migrate/ca8cdee7a3c45ef3205f54157f674a09.jpeg)
因此:
![4a54b8a762da4c35ce98645e640d81bd.png](https://i-blog.csdnimg.cn/blog_migrate/d85e47fe808656ce12e510747208b661.jpeg)
这是单个卷积层输出的方差。如果要计算所有层,则要用到所有单层方差的乘积,则:
![5ea1c033ab4d9044b16ed1bfd24d696d.png](https://i-blog.csdnimg.cn/blog_migrate/9ddcc53d4199f37582148431a441ee06.jpeg)
由于结果为乘积,很容易看出,如果每层的方差不接近1,那么该网络会迅速衰减。如果小于1,则将迅速消失至0;而如果大于1,那么激活值将无限增长,最终结果甚至无法显示在计算机上(NaN)。因此,要得到一个表现良好的ReLU CNN,必须严格遵守:
![5621c8752551dbde446e8f279c1311a2.png](https://i-blog.csdnimg.cn/blog_migrate/facede914e943e74a3013b748c1af303.jpeg)
Xavier和Glorot对比了使用标准初始化和他们设计的初始化方案训练深度CNN所出现的情况。
传送门:http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf
![6dcfe17402f2c63cb0d693ec810fbc5a.png](https://i-blog.csdnimg.cn/blog_migrate/c1c06ab3fece808ff12e5aa2f9be6eb5.jpeg)
对比Xavier / Glorot初始化(蓝色)及Kaiming初始化(红色)的22层ReLU CNN训练
这张图是不是很眼熟?没错,这正是开头提到的情况。使用Xavier / Glorot初始化的网络没有学到任何东西。
你觉得哪一条表示Keras的默认初始化?
没错!在Keras的默认情况下,卷积层按照Glorot均匀分布进行初始化:
keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', data_format=None, dilation_rate=(1, 1), activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
那么,如果改为Kaiming 均匀分布会发生什么?
![0e9df8d3e4cd1698c2d005b5de7df2f5.png](https://i-blog.csdnimg.cn/blog_migrate/6ef1cf85d2003ce0cf1f2baf4602b44c.jpeg)
使用Kaiming初始化
重新创建VGG16模型,这一次将初始化更改为he_uniform。
训练模型之前,先检查激活值和梯度。
![805b1d9cee471329cbcda408e96d3857.png](https://i-blog.csdnimg.cn/blog_migrate/f8eb56dbc9925ccf6ad349e71233ef8a.jpeg)
![a786f80064f176b0eb614e6b7df7fa3f.png](https://i-blog.csdnimg.cn/blog_migrate/74bbf8b27b32517ebd1c63a2f2d256d4.jpeg)
经过Kaiming初始化,现在的激活平均值约为0.5,标准偏差约为0.8。
![6b34c94fb3cba89f2bd8c66488befd7c.png](https://i-blog.csdnimg.cn/blog_migrate/9c4ab3932b19bf3e1e7e8d2bf9257a6a.jpeg)
![86c6954bbf09ba13154fce150647a69c.png](https://i-blog.csdnimg.cn/blog_migrate/ea4eace4a78843fed978866b43fff86a.jpeg)
可见现在的模型有了一定梯度,能够学到一定内容。
如果训练新模型,会得到下列曲线:
![d1ca2e32675e106943a054764104e77e.png](https://i-blog.csdnimg.cn/blog_migrate/4ad0cf9d4dd21df5a628df3ecc26d723.jpeg)
![0384faca13d9ead0fa75e7445c0ccdcf.png](https://i-blog.csdnimg.cn/blog_migrate/5b9753c39deacf740df7a39ec60b3dde.jpeg)
尽管可能需要增加一定正则化,但总归比之前有进步,对吧?
![0e9df8d3e4cd1698c2d005b5de7df2f5.png](https://i-blog.csdnimg.cn/blog_migrate/6ef1cf85d2003ce0cf1f2baf4602b44c.jpeg)
结论
本文表明,初始化是模型中极为重要的一部分,而其重要性往往会被忽略。此外,即使是Keras这样优秀的学习库,其默认的库连接也不应忽视。
![7a246609538a8dc17697e1fe705cf665.png](https://i-blog.csdnimg.cn/blog_migrate/9ff806ab8beb123c7ceb3361ea33c1fd.jpeg)
留言 点赞 关注
我们一起分享AI学习与发展的干货
编译组:王泽泽、安然
相关链接:
https://towardsdatascience.com/why-default-cnn-are-broken-in-keras-and-how-to-fix-them-ce295e5e5f2
如需转载,请后台留言,遵守转载规范