lav filters有什么用_用实际的案例,带你深入探究CNN初始化

全文共 2174字,预计学习时长 4分钟

本文作者将用实际的案例,带你深入探究CNN初始化。

8ac8c8cb1b1d3cb6174011908b2b253d.png

上周,我用在CIFAR10数据集上训练的VGG16模型进行了一些实验。由于模型需要从头开始训练,所以我并未采用ImageNet的预训练模型。

我设置了训练50个epoch,然后去喝了杯咖啡。回来之后,却发现学习曲线变成了这样:

0503f792fd6251efddbf83580d4b8d78.png
cd875ab8495d36efef3a3ffa9e0ef68d.png

这个模型没有学到任何东西!

我见过收敛得很慢的网络,也见过振荡、过度拟合、发散的网络,但像这种什么也没有学到的模型还是头一次见。于是,我深入研究了一下其中的原因。

0e9df8d3e4cd1698c2d005b5de7df2f5.png

实验

建立模型时,我遵循了原始的VGG16结构,但移除了大多数完全连接的层,因此几乎只剩下卷积层。

cf823b55abe3c2ba3b82ad86cedb3be4.png

要找到上述训练曲线出现的原因,还需要知道:当模型学习不佳时,往往可以从梯度找到原因。以下方法可以得到每层的平均值和标准偏差:

61e439245be431b59a045a16aae6b892.png

转换为图表如下:

c05e9b4d5d6b9d5c41e0a025e5df776b.png
1dda01827a699df680987c903f4c8e07.png

使用Xavier初始化的 VGG16 梯度统计值

哦,原来我的模型梯度为0……或许我们应该检查激活值在各层变化的过程。通过以下方法可以得到它们的平均值和标准差:

39ced38a9ea21412a1bb5408de1c9615.png

转化为图表形式如下:

3af8a6e2ff5b21cf01537cf6ac0596ba.png
1afc15671ea8e552e8f7cf732779b63e.png

使用Glorot均匀分布初始化的 VGG16 梯度统计值

原来问题出在这里!

给你一点小提示,计算每个卷积层梯度的函数如下:

040b52f9c202df19e0fd25ae3aa5336e.png

其中Δx和Δy表示梯度∂L/∂x和∂L/∂y。计算梯度用到了反向传播算法(BP算法)和链式法则,也就是说,要从最后一层开始,反向传播到前面的层。那么,如果最后一层的激活值接近0会发生什么呢?确切地说,在我的模型里,任何地方的梯度都等于0,无法反向传播,该网络也因此无法学习任何东西。

由于我的网络非常简单 (没有批标准化,没有Dropout算法,没有数据扩充,…...),所以问题的根源很可能是初始化不佳,因此我翻阅了何恺明(Kaiming He)的论文,下面简单介绍其主要内容。

论文传送门:https://arxiv.org/pdf/1502.01852.pdf

0e9df8d3e4cd1698c2d005b5de7df2f5.png

初始化方式

初始化向来是深度学习的重要研究领域。随着神经架构和非线性的不断发展,其重要性也不断提高。良好的初始化是我们能够训练深度神经网络的原因。

以下内容为何恺明论文的中心思想,展示了使以ReLU为激活函数的CNN(卷积神经网络)初始化良好所应具备的条件。这需要一点数学基础,相信你能掌握要点。

先来看卷积层l的输出:

b8052b7b4b86e02a361887c957df0ddd.png

假设权重w和元素x相互独立且分布相同,如果偏差被初始化为0,那么:

2eb0d0bf9bf1772d3f3cd22efd61f4d6.png

n表示一个层中的权重数(即n = k²c)。经过下列独立变量乘积的方差表达式:

fa043f4dfdbd26f3b4208358e83f8d80.png

然后是:

c28d36ed4125118495419ba44a51a654.png

如果权重w的平均值为0,则:

b74076460af106f494fb4cf6de0d9855.png

经过König-Huygens性质:

59f9fa62e8972143d2733d0bedabaa30.png

最终得到:

e5ff128106c24870c565d79cd7b501ca.png

然而,由于使用的是ReLU激活函数,于是:

9f47e904721bd37ca6b9e8136ba9fa8a.png

因此:

4a54b8a762da4c35ce98645e640d81bd.png

这是单个卷积层输出的方差。如果要计算所有层,则要用到所有单层方差的乘积,则:

5ea1c033ab4d9044b16ed1bfd24d696d.png

由于结果为乘积,很容易看出,如果每层的方差不接近1,那么该网络会迅速衰减。如果小于1,则将迅速消失至0;而如果大于1,那么激活值将无限增长,最终结果甚至无法显示在计算机上(NaN)。因此,要得到一个表现良好的ReLU CNN,必须严格遵守:

5621c8752551dbde446e8f279c1311a2.png

Xavier和Glorot对比了使用标准初始化和他们设计的初始化方案训练深度CNN所出现的情况。

传送门:http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf

6dcfe17402f2c63cb0d693ec810fbc5a.png

对比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

使用Kaiming初始化

重新创建VGG16模型,这一次将初始化更改为he_uniform。

训练模型之前,先检查激活值和梯度。

805b1d9cee471329cbcda408e96d3857.png
a786f80064f176b0eb614e6b7df7fa3f.png

经过Kaiming初始化,现在的激活平均值约为0.5,标准偏差约为0.8。

6b34c94fb3cba89f2bd8c66488befd7c.png
86c6954bbf09ba13154fce150647a69c.png

可见现在的模型有了一定梯度,能够学到一定内容。

如果训练新模型,会得到下列曲线:

d1ca2e32675e106943a054764104e77e.png
0384faca13d9ead0fa75e7445c0ccdcf.png

尽管可能需要增加一定正则化,但总归比之前有进步,对吧?

0e9df8d3e4cd1698c2d005b5de7df2f5.png

结论

本文表明,初始化是模型中极为重要的一部分,而其重要性往往会被忽略。此外,即使是Keras这样优秀的学习库,其默认的库连接也不应忽视。

7a246609538a8dc17697e1fe705cf665.png

留言 点赞 关注

我们一起分享AI学习与发展的干货

编译组:王泽泽、安然

相关链接:

https://towardsdatascience.com/why-default-cnn-are-broken-in-keras-and-how-to-fix-them-ce295e5e5f2

如需转载,请后台留言,遵守转载规范

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值