Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

深度前馈网络与Xavier初始化原理

前言

基本的神经网络的知识(一般化模型、前向计算、反向传播及其本质、激活函数等)小夕已经介绍完毕,本文先讲一下深度前馈网络的BP过程,再基于此来重点讲解在前馈网络中用来初始化model参数的Xavier方法的原理。

前向

前向过程很简单,每一层与下一层的连接边(即参数)构成了一个矩阵(即线性映射),每一层的神经元构成一个激活函数阵列(即非线性映射),信号便从输入层开始反复的重复这两个过程直到输出层,也就是已经在神经网络激活函数中详细讲过的线性与非线性交替映射的过程:

反向

误差反向传播的过程也很简单,其本质就是基于链式求导+梯度下降,原因已在《BP算法的本质》中讲解,这里就重点讲解一下BP算法的过程。

首先往上翻一翻,记住之前说过的前馈网络无非就是反复的线性与非线性映射。然后:

首先,假设某个神经元的输入为z,经过激活函数f1(·)得到输出a。即函数值a=f1(z)。如果这里的输入z又是另一个函数f2的输出的话(当然啦,这里的f2就是线性映射函数,也就是连接某两层的权重矩阵),即z=f2(x),那么如果基于a来对z中的变量x求导的时候,由于 

显然只要乘以激活函数f1的导数,就不用操心激活函数的输出以及更后面的事儿了(这里的“后面”指的是神经网络的输出端方向),只需要将精力集中在前面的东西,即只需要关注z以及z之前的那些变量和函数就可以了。因此,误差反向传播到某非线性映射层的输出时,只需要乘上该非线性映射函数在z点的导数就算跨过这一层啦。

而由于f2(·)是个线性映射函数,即 f_2(x)=w\cdot x ,因此

因此,当误差反向传播到线性映射层的输出时,若想跨过该层,只需要乘以线性映射函数的参数就可以啦~即乘上w。

而这里的x,又是更前面的非线性映射层的输出,因此误差在深度前馈网络中反向传播时,无非就是反复的跨过非线性层和线性层,也就是反复的乘以非线性函数的导数(即激活函数的导数)和线性函数的导数(即神经网络参数/权重/连接边)。

也就是下面这张图啦(从右往左看):

(图片来自中科院自动化所赵军老师的课件)

Xavier

前向与反向都讲解完了,下面就是更加实用的工程tricks。提起tricks,先想到参数的初始化啦。如果无脑的将model的参数初始化成全0,那训练到天荒地老也是个废猫倒了。

而为什么初始化成全0就不行了呢?这个不用讲啦,全0的时候每个神经元的输入和输出没有任何的差异,换句话说,根据前面BP算法的讲解,这样会导致误差根本无法从后一层往前传(乘以全0的w后误差就没了),这样的model当然没有任何意义。

那么我们不把参数初始化成全0,那我们该初始化成什么呢?换句话说,如何既保证输入输出的差异性,又能让model稳定而快速的收敛呢?

要描述“差异性”,首先就能想到概率统计中的方差这个基本统计量。对于每个神经元的输入z这个随机变量,根据前面讲BP时的公式,它是由线性映射函数得到的,

也就是 z=\sum\limits_{i=1}^nw_ix_i ,其中n是上一层神经元的数量。因此,根据概率统计里的两个随机变量乘积的方差展开式:

可以得到,如果E(xi)=E(wi)=0(可以通过批量归一化Batch Normalization来满足,其他大部分情况也不会差太多),那么就有:

Var(z)= \sum\limits_{i=1}^nVar(xi)Var(wi)

如果随机变量xi和wi再满足独立同分布的话:

Var(z)= \sum\limits_{i=1}^nVar(xi)Var(wi)=nVar(w)Var(x)

好了,这时重点来了。试想一下,根据文章《激活函数》,整个大型前馈神经网络无非就是一个超级大映射,将原始样本稳定的映射成它的类别。也就是将样本空间映射到类别空间。试想,如果样本空间与类别空间的分布差异很大,比如说类别空间特别稠密,样本空间特别稀疏辽阔,那么在类别空间得到的用于反向传播的误差丢给样本空间后简直变得微不足道,也就是会导致模型的训练非常缓慢。同样,如果类别空间特别稀疏,样本空间特别稠密,那么在类别空间算出来的误差丢给样本空间后简直是爆炸般的存在,即导致模型发散震荡,无法收敛。因此,我们要让样本空间与类别空间的分布差异(密度差别)不要太大,也就是要让它们的方差尽可能相等

因此为了得到Var(z)=Var(x),只能让n*Var(w)=1,也就是Var(w)=1/n。

同样的道理,正向传播时是从前往后计算的,因此 Var(w)=1/(n_{in}) ,反向传播时是从后往前计算的,因此 Var(w)=1/(n_{out}) 。然而 n_{in} 和 n_{out} 往往不相等啊,怎么办呢?所以就取他们的均值就好啦~即:

Var(w)=\frac{2}{n_{in}+n_{out}}假设w为均匀分布的话,由w在区间[a,b]内均匀分布时的方差为

代码前面的Var(w)公式解得参数a和b,即得:

w\sim U[-\frac{\sqrt 6}{\sqrt {n_{in}+n_{out}}},\frac{\sqrt6}{\sqrt {n_{in}+n_{out}}}]

(让w在这个区间里均匀采样就好啦)

得到的这个结论就是Xavier初始化方法。这就是为什么使用Xavier初始化这个trick经常可以让model的训练速度和分类性能取得大幅提高啦~所以在使用前馈网络时,除非你的网络设计的明显不满足xavier的假设,否则使用xavier往往不会出错。当然,另一方面来说,也很少有场合可以完全迎合xavier假设,因此时间充裕的话,改改分子,甚至去掉n_out都有可能带来意想不到的效果。

参考文献:Glorot X, Bengio Y. Understanding the difficulty of training deep feedforward neural networks[J]. Journal of Machine Learning Research, 2010, 9:249-256.

本文转载自【夕小瑶的卖萌屋】,据说每个想学机器学习的人到这里都停不下来了~

夕小瑶的卖萌屋
夕小瑶的卖萌屋

转自微信公众号【夕小瑶的卖萌屋】,几个有颜有料的小仙女分享机器学习干货的公众号,专注于NLP、搜索与推荐技术前沿

入门深度前馈网络Xavier
1
相关数据
激活函数技术

在 计算网络中, 一个节点的激活函数定义了该节点在给定的输入或输入的集合下的输出。标准的计算机芯片电路可以看作是根据输入得到"开"(1)或"关"(0)输出的数字网络激活函数。这与神经网络中的线性感知机的行为类似。 一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

收敛技术

在数学,计算机科学和逻辑学中,收敛指的是不同的变换序列在有限的时间内达到一个结论(变换终止),并且得出的结论是独立于达到它的路径(他们是融合的)。 通俗来说,收敛通常是指在训练期间达到的一种状态,即经过一定次数的迭代之后,训练损失和验证损失在每次迭代中的变化都非常小或根本没有变化。也就是说,如果采用当前数据进行额外的训练将无法改进模型,模型即达到收敛状态。在深度学习中,损失值有时会在最终下降之前的多次迭代中保持不变或几乎保持不变,暂时形成收敛的假象。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

梯度下降技术

梯度下降是用于查找函数最小值的一阶迭代优化算法。 要使用梯度下降找到函数的局部最小值,可以采用与当前点的函数梯度(或近似梯度)的负值成比例的步骤。 如果采取的步骤与梯度的正值成比例,则接近该函数的局部最大值,被称为梯度上升。

映射技术

映射指的是具有某种特殊结构的函数,或泛指类函数思想的范畴论中的态射。 逻辑和图论中也有一些不太常规的用法。其数学定义为:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素x,B中总有有唯一的一个元素y与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,y称为元素x在映射f下的象,记作:y=f(x)。x称为y关于映射f的原象*。*集合A中所有元素的象的集合称为映射f的值域,记作f(A)。同样的,在机器学习中,映射就是输入与输出之间的对应关系。

神经元技术

(人工)神经元是一个类比于生物神经元的数学计算模型,是神经网络的基本组成单元。 对于生物神经网络,每个神经元与其他神经元相连,当它“兴奋”时会向相连的神经元发送化学物质,从而改变这些神经元的电位;神经元的“兴奋”由其电位决定,当它的电位超过一个“阈值”(threshold)便会被激活,亦即“兴奋”。 目前最常见的神经元模型是基于1943年 Warren McCulloch 和 Walter Pitts提出的“M-P 神经元模型”。 在这个模型中,神经元通过带权重的连接接处理来自n个其他神经元的输入信号,其总输入值将与神经元的阈值进行比较,最后通过“激活函数”(activation function)产生神经元的输出。

前馈神经网络技术

前馈神经网络(FNN)是人工智能领域中最早发明的简单人工神经网络类型。在它内部,参数从输入层经过隐含层向输出层单向传播。与递归神经网络不同,在它内部不会构成有向环。FNN由一个输入层、一个(浅层网络)或多个(深层网络,因此叫作深度学习)隐藏层,和一个输出层构成。每个层(除输出层以外)与下一层连接。这种连接是 FNN 架构的关键,具有两个主要特征:加权平均值和激活函数。

推荐文章
暂无评论
暂无评论~