申搏注册

首页 > 正文

神经网络在Keras中不work!但何恺明的初始化方法堪比“还魂丹”

www.autoescolavolante.com2019-07-19
gd平台申搏官网

铜陵从凹寺[

量子产品|公共号码QbitAI

Nathan Hubens,博士TélécomSudParis的学生在培训CNN时遇到了一些困难。

在使用在CIFAR10数据集上训练的VGG16模型的实验期间,进行了50次迭代,最终发现模型没有学到任何东西。

8b445f8f92a2d0883850c9597e30190b.jpeg

可以看出,模型的收敛速度极慢,振荡,过度拟合,为什么会这样?

你有这样的疑惑吗?

这位小弟弟的分享得到了网友们的感谢,并激励了许多研究人员。量子比特整理的重点如下:

实验本身

让我们来看看创建模型的过程:

Def ConvBlock(n_conv,n_out,shape,x,is_last=False): for i in range(n_conv): x=Conv2D(n_out,shape,padding='same',activation='relu')(x)if is_last: Out=layers.GlobalAveragePooling2D()(x)else: out=MaxPooling2D()(x)return out input=Input(shape=(32,32,3))x=ConvBlock(2,64,(3,3),输入)x=ConvBlock(2,128,(3,3),x)x=ConvBlock(3,256,(3,3),x)x=ConvBlock(3,512,(3,3),x) x=ConvBlock(3,512,(3,3),x,is_last=True)x=layers.Dense(num_classes,activation='softmax')(x)

该模型遵循原始的VGG 16架构,但大部分完全连接的层被移除,因此几乎只剩下卷积层。

“车祸现场”的开始可能受到若干操作步骤的影响。

当模型的学习过程出现问题时,研究人员通常会检查梯度性能并获得网络各层的平均值和标准差:

Def get_weight_grad(model,data,labels):表示=[] stds=[] grads=model.optimizer.get_gradients(model.total_loss,model.trainable_weights)symb_inputs=(model._feed_inputs + model._feed_targets + model._feed_sample_weights)f=K.function(symb_inputs,grads)x,y,sample_weight=model._standardize_user_data(data,labels)output_grad=f(x + y + sample_weight)范围内的图层(len(model.layers)): if model.layers [layer] .__ class __.__ name __=='Conv2D': means.append(output_grad [layer] .mean())stds.append(output_grad [layer] .std())return means,stds

看看最终的统计数据:

6cb583d0faa860c2e2c8bf45868bfafe.jpeg

结果有点出乎意料,这意味着此模型中几乎没有渐变。作者说,也许应该检查每个层的激活是如何完成的。

使用以下代码再次获得它们的平均值和标准差:

Def get_stats(model,data):表示=[] stds=[]表示范围内的层(len(model.layers)): if model.layers [layer] .__ class __.__ name __=='Conv2D': m=Model( Model.input,model.layers [layer] .output)pred=m.predict(data)means.append(pred.mean())stds.append(pred.std())return means,stds

结果与以前不同:

ab410ff51fef2feaf3645c41d7481937.jpeg

这不是在正确的轨道上走得更远。

在该步骤中,每个卷积层的梯度计算如下:

9393c9fa0d9d123ade1e9ae0807e15c5.jpeg

其中Δx和Δy分别代表ΔL/Δx和ΔL/Δy,其中反向传播算法和链状规则用于计算梯度,即,它需要从最后一层开始并且向后传播到上一层。 in。

如果激活函数的最后一层的值接近于零,则梯度在任何地方接近零,因此它不能被反向传播并且网络无法学习任何东西。

作者认为,由于没有批量规范化,没有Dropout,也没有数据扩展,猜测问题主要在初始化步骤中。

他阅读了何伟明之前的论文“深入研究整流器:超越ImageNet分类的人类表现”,并想看看他是否能解决他的疑虑。

a8bc0926e94c595c3d64ccdd77380d10.jpeg

论文地址:

初始化方法

初始化一直是深度学习研究的重要领域,特别是随着架构和非线性研究的不断发展,良好的初始化方法可能决定了网络的最终质量。

也就是说,如何使用ReLU激活功能正确初始化卷积网络。这需要一点数学基础,但并不困难。

首先考虑卷积层l的输出模式:

3a83dd5bf4974ab3aa0336474956d327.jpeg

如何将偏差初始化为0,并假设权重w和元素x是独立的并且共享相同的分布,则:

ae367606f3034e638ceb8677a7a6cf65.jpeg

其中n是k的平方乘以c,以及乘积通过自变量的方差公式:

7240cee4ac3f6764a178f1ab591bbecc.jpeg

将上述公式转换为:

31f9e6b63db21d4d0df6b02d423df613.jpeg

如果你将权重w的均值设为0,那么输出:

c0c2c593fa065e8d44e82c6563c5851d.jpeg

利用K?nig-Huygens的特点:

80d748dc07f6821912557a7a79bd07b0.jpeg

最终输出:

4d9efbde94b62df323f613db5afa190c.jpeg

因为使用了ReLU激活功能:

93f5a3d932230ceb8e2a213ab1266d1d.jpeg

所以得到:

6ffcb1f45df5bbb193188fd7bf9de36e.jpeg

上面的公式是单个卷积层输出的方差。如果考虑网络中的所有层,您需要获得它们的产品:

7d63702c561656a88a7cbd321d385246.jpeg

通过该产品,可以看出,如果每层的方差不接近1,则网络将迅速衰减。如果小于1,它将向0消散;如果它大于1,激活值将无限增加。

件:

89b457ead7baeafe028b9d073048e044.jpeg

作者将标准初始化与使用自己的初始化方法进行了比较:

f902ab0bf64f22b68eff86551028339c.jpeg

事实证明,使用Xavier/Glorot初始化训练的网络没有学到任何东西。

默认情况下,在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)

如果我用何明明的方法替换这个初始化方法会怎样?

何玉明的初始化方法

首先重建VGG 16模型,将初始化更改为he_uniform,并在训练模型之前检查激活和渐变。

c611ce919d7f180690e76324337bf7c7.jpeg

使用该初始化方法,激活平均值为0.5,标准偏差为0.8。

17ee892a5451c9aad27f633e1673a868.jpeg

一些渐变出来了,这意味着网络开始工作。以这种方式训练新模型并获得以下曲线:

fdb4cccbee2a35e362be3a20b3e17e63.jpeg

现在我们需要考虑正规化的问题,但总的来说,结果比以前好多了。

结论

在本文中,作者证明初始化是模型构建的一个重要部分,但在正常培训中经常被忽略。

另外,应该注意的是,即使是流行的口碑机器学习库Keras,默认设置也无法在没有调试的情况下使用。

门户[p>

最后,附上文章的原始地址:

- 结束 -

真诚招募

昆腾正在招聘编辑/记者,总部设在北京中关村。我期待有才华和热情的学生加入我们!有关详细信息,请在QbitAI对话界面上回复“招聘”一词。

Qubit QbitAI签名作者

? '?' ?跟踪AI技术和产品动态

热门浏览
热门排行榜
热门标签
日期归档