keras系列(一):参数设置
常用的 权重/偏置 初始化
常数初始化
为了在伪代码中形象化,让我们考虑一个具有64个输入和32个输出的神经网络的任意一层。
W = np.zeros((64, 32))
W = np.ones((64, 32))
W = np.ones((64, 32)) * C
虽然常量初始化很容易理解和理解,但使用这种方法的问题是,我们几乎不可能打破激活的对称性。因此,它很少被用作神经网络的权重初始化器。
均匀/正态分布
W = np.random.uniform(low=-0.05, high=0.05, size=(64, 32))
W = al(0.0, 0.5, size=(64, 32))
在神经网络中,均匀分布和正态分布都可以用来初始化权值;然而,我们通常使用各种启发式来创建更好的初始化方案。
LeCun 均匀/正态分布
在这里,作者定义了一个参数Fin(称为fan in,或者是层的输入数)和Fout(称为fan out,或层的输出数)。使用这些值,我们可以应用统一的初始化。
F_in = 64
F_out = 32
limit = np.sqrt(3 / float(F_in))
W = np.random.uniform(low=-limit, high=limit, size=(F_in, F_out))
我们也可以用正态分布。Keras库使用一个截断的正态分布来构造上下限,以及零均值。
F_in = 64
F_out = 32
limit = np.sqrt(1 / float(F_in))
W = al(0.0, limit, size=(F_in, F_out))
Glorot/Xavier 均匀/正态分布
在Keras库中使用的默认权值初始化方法称为Glorot初始化或Xavier初始化。
对于正态分布,其极限值是由平均的Fin和Fout组合而成,然后取平方根。然后使用一个零中心(均值为0)。
F_in = 64
F_out = 32
limit = np.sqrt(2 / float(F_in + F_out))
W = al(0.0, limit, size=(F_in, F_out))
对于均匀分布,同样可以这样做,但一般在limit上给予更强的限制。
F_in = 64
F_out = 32
limit = np.sqrt(6 / float(F_in + F_out))
W = np.random.uniform(low=-limit, high=limit, size=(F_in, F_out))
学习使用这种初始化方法是非常有效的,我推荐它适用于大多数神经网络。
He et al. / Kaiming / MSRA 均匀/正态分布
我们通常在训练非常深的神经网络时使用这种方法,这种神经网络使用类似于relu的激活函数(特别是,一个’ PReLU ',或Parametric Rectified Linear Unit)。
F_in = 64
F_out = 32
正则匹配浮点数
limit = np.sqrt(6 / float(F_in))
W = np.random.uniform(low=-limit, high=limit, size=(F_in, F_out))
对于正态分布可以设置均值为0,方差为 2/Fin 开方,如下:
F_in = 64
F_out = 32
limit = np.sqrt(2 / float(F_in))
W = al(0.0, limit, size=(F_in, F_out))
其中在Keras通常设置如下:
random_uniform:
权值被初始化为一致随机的小数值(-0.05,0.05)。换句话说,给定区间内的任何值都可能被取得。
random_normal:
根据高斯函数初始化权值,均值为零,标准差为0.05。
zero:
所有权重初始化为0。
完整的可选列表在链接如下:
keras权重和偏置初始化
激活函数
左上:Step函数
右上:Sigmoid函数
左中:tanh函数
右中:Relu函数
左下:Leaky Relu函数(Relu变种)
右下:ELU函数(Relu变种)
Step函数
step函数是最简单的激活函数,形式如下:
然而,虽然这一阶跃函数是直观且易于使用的,但它是不可微的,当应用梯度下降和训练我们的网络时,它会导致问题。
Sigmoid函数
如下图所示,当输入变化时,它的输出变化很小(0,1)。从数学上讲,函数是连续的。典型的sigmoid函数在下图中表示:
一个神经元可以使用sigmoid来计算非线性函数 F(z = wx + b)。请注意,如果z = wx + b的值是非常大的且为正的,那么F(z = wx + b)趋于0,如果z = wx + b的值是非常大的且为负的,那么F(z = wx + b)趋于1。换句话说,具有sigmoid激活的神经元具有类似于感知器的行为,但变化是渐进的,输出值(如0.5539或0.123191)是完全可行的。
Tanh函数
tanh函数以零为中心,但当神经元饱和时,梯度仍然会消失。
ReLU函数
sigmoid并不是用于神经网络的唯一一种平滑激活函数。最近,一个非常简单的函数称为整流线性单元(ReLU)变得非常流行,因为它能产生非常好的效果。
一个ReLU被简单地定义为 F(x) = max(0,x),而非线性函数在下图中表示。正如你在下面的图中所看到的,负值的函数为零,它在正值方向线性增长。
截止到2015年,Relu函数是深度学习中最流行的激活函数,但是问题是当有一个值为0时,梯度就无法取得。
Leaky Relus函数
一种名为Leaky ReLUs的ReLUs变体,当该神经元未激活时,允许有一个小的、非零的梯度。
我们可以看到,这个函数确实被允许带有负值,而传统的ReLUs则是从0开始输出。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论