• 深度学习中Xavier初始化


    “Xavier”初始化方法是一种很有效的神经网络初始化方法,方法来源于2010年的一篇论文《Understanding the difficulty of training deep feedforward neural networks》。

    文章主要的目标就是使得每一层输出的方差应该尽量相等。下面进行推导:每一层的权重应该满足哪种条件才能实现这个目标。

    和方差相关的定理

    假设有随机变量x和w,它们都服从均值为0,方差为σ的分布,且独立同分布,那么:

    • wx就会服从均值为0,方差为σσ的分布
    • wx+wx就会服从均值为0,方差为2σσ的分布

    文章实验用的激活函数是tanh激活函数,函数形状如下左图,右图是其导数的函数形状。

    激活函数

    从上图可以看出,当x处于0附近时,其导数/斜率接近与1,可以近似将其看成一个线性函数,即f(x)=x。

    假设输入数据的均值为o,方差为(delta_x),如果第一层是卷基层,卷基层共n个参数,(n=C*k_h*k_w),于是有:

    [z_j= sum_{i}^{n}{w_i*x_i} ]

    其中,忽略偏置b

    假设x和w是独立同分布,则(Var(z)=n*delta_x*delta_w),为了更好地表达,将层号放在变量上标处:

    [delta_x^2=n^1*delta_x^1*delta_w^1 ]

    全连接和卷积层都可以看做是n个参数的线性变换,进而有:(delta_x^3=n^2*delta_x^2*delta_w^2),如果k层的网络,有:

    [delta_x^k=n^{k-1}*delta_x^{k-1}*delta_w^{k-1} =n^{k-1}*n^{k-2}*delta_x^{k-2}*delta_w^{k-2}*delta_w^{k-1} =delta_x^1*prod_{i=1}^{k-1}{(n^i*delta_w^i)}]

    从上式中可以看出,后面的连乘是很危险的,如果(n^i*delta_w^i)总是大于1,最后的方差为越来越大;如果乘机小于1,最后的方差就越来越小。所以我们回头再看第一个公式:

    [delta_x^2=n^1*delta_x^1*delta_w^1 ]

    如果满足(delta_x^2=delta_x^1),即保证输出方差和输出方差一直便可以避免上述问题,得到:

    [delta_w^1=frac{1}{n^1} ]

    对于任意一层i,应该满足:

    [delta_w^i=frac{1}{n^i} ]

    (n^i)是w参数的输入层。

    反向传播的情况

    假设第k层的梯度为(frac{partial{Loss}}{partial{x_j^k}}),对于第k-1层,有:

    [frac{partial{Loss}}{partial{x_j^{k-1}}} = sum_{i=1}^{n}{frac{partial{Loss}}{partial{x_i^k}}*w_j^{ki}} ]

    这里的参数n表示的是输出端的数目。

    如果每层的方差服从均值为o,方差为某值的分布,有:

    [Var(frac{partial{Loss}}{partial{x_j^{k-1}}})= n^k*Var(frac{partial{Loss}}{partial{x_i^k}})*delta_w^k]

    对于k层的网络,可以推导得到:

    [Var(frac{partial{Loss}}{partial{x_j^{1}}} =Var(frac{partial{Loss}}{partial{x_i^k}})* prod_{2}^{k}{(n^i*delta_w^i)} ]

    上式的连乘同样危险,所以我们取(Var(frac{partial{Loss}}{partial{x_j^{k-1}}}) = Var(frac{partial{Loss}}{partial{x_i^k}}))
    故:

    [delta_w^k = frac{1}{n^k} ]

    这里的n表示输出的维度

    为了均衡考虑,我们设置方差应该满足

    [delta_w^k=frac{2}{n^k+n^{k+1}} ]

    实际应用

    论文提出使用均匀分布进行初始化,我们设定权重要初始化的范围是[-a,a]。而均匀分布的方差为:

    [Var(uniform)=frac{(a-(-a))^2}{12}=frac{a^2}{3}=delta_w^k ]

    所以:

    [a=sqrt{frac{6}{n^k+n^{k+1}}} ]

    这就是xavier初始化方法,即把参数初始化成下面范围内的均匀分布:

    [[-sqrt{frac{6}{n^k+n^{k+1}}}, sqrt{frac{6}{n^k+n^{k+1}}}] ]

  • 相关阅读:
    Spark 之 内存模型
    Python 之 windows上安装和pycharm 使用
    Kafka之 kafka消费->SparkStreaming|写入->Kafka|kafka消费->hbase
    SparkStreaming之 任务失败后,自动重启
    微信小程序常用赋值方法小结
    eclipse中xml文件Ctrl+左键不跳转解决办法
    SpringCloud简介以及相关组件
    spring怎么设置定时任务
    Http协议请求的不同类型
    Spring各个jar包作用
  • 原文地址:https://www.cnblogs.com/houkai/p/10160682.html
Copyright © 2020-2023  润新知