zoukankan      html  css  js  c++  java
  • 谈谈激活函数以零为中心的问题

    转自: https://liam0205.me/2018/04/17/zero-centered-active-function/

    今天在讨论神经网络中的激活函数时,陆同学提出 Sigmoid 函数的输出不是以零为中心的(non-zero-centered),这会导致神经网络收敛较慢。关于这一点,过去我只是将其记下,却并未理解背后的原因。此篇谈谈背后的原因。

    神经元

    图片来自:https://zhuanlan.zhihu.com/p/25110450

    如图是神经网络中一个典型的神经元设计,它完全仿照人类大脑中神经元之间传递数据的模式设计。大脑中,神经元通过若干树突(dendrite)的突触(synapse),接受其他神经元的轴突(axon)或树突传递来的消息,而后经过处理再由轴突输出。

    在这里,诸 xixi 是其他神经元的轴突传来的消息,诸 wiwi 是突触对消息的影响,诸 wixiwixi 则是神经元树突上传递的消息。这些消息经由神经元整合后(z(x⃗ ;w⃗ ,b)=iwixi+bz(x→;w→,b)=∑iwixi+b)再激活输出(f(z)f(z))。这里,整合的过程是线性加权的过程,各输入特征 xixi 之间没有相互作用。激活函数(active function)一般来说则是非线性的,各输入特征 xixi 在此处相互作用。

    Sigmoid 与 tanh

    此篇集中讨论激活函数输出是否以零为中心的问题,因而不对激活函数做过多的介绍,而只讨论 Sigmoid 与 tanh 两个激活函数。

    Sigmoid 函数

    Sigmoid 函数的一般形式是

     

    σ(x;a)=11+eax.σ(x;a)=11+e−ax.

    这里,参数 aa 控制 Sigmoid 函数的形状,对函数基本性质没有太大的影响。在神经网络中,一般设置 a=1a=1,直接省略。

    Sigmoid 函数的导数很好求

     

    σ(x)=σ(x)(1σ(x)).σ′(x)=σ(x)(1−σ(x)).

    图片来自:https://zhuanlan.zhihu.com/p/25110450

    tanh 函数

    tanh 函数全称 Hyperbolic Tangent,即双曲正切函数。它的表达式是

     

    tanh(x)=2σ(2x)1=exexex+ex.tanh⁡(x)=2σ(2x)−1=ex−e−xex+e−x.

    双曲正切函数的导数也很好求

     

    tanh(x)=1tanh2(x).tanh′⁡(x)=1−tanh2⁡(x).

    图片来自:https://zhuanlan.zhihu.com/p/25110450

    一些性质

    Sigmoid 和 tanh 两个函数非常相似,具有不少相同的性质。简单罗列如下

    • 优点:平滑
    • 优点:易于求导
    • 缺点:幂运算相对耗时
    • 缺点:导数值小于 11,反向传播易导致梯度消失(Gradient Vanishing)

    对于 Sigmoid 函数来说,它的值域是 (0,1)(0,1),因此又有如下特点

    • 优点:可以作为概率,辅助模型解释
    • 缺点:输出值不以零为中心,可能导致模型收敛速度慢

    此篇重点讲 Sigmoid 函数输出值不以零为中心的这一缺点。

    收敛速度

    这里首先需要给收敛速度做一个诠释。模型的最优解即是模型参数的最优解。通过逐轮迭代,模型参数会被更新到接近其最优解。这一过程中,迭代轮次多,则我们说模型收敛速度慢;反之,迭代轮次少,则我们说模型收敛速度快。

    参数更新

    深度学习一般的学习方法是反向传播。简单来说,就是通过链式法则,求解全局损失函数 L(x⃗ )L(x→) 对某一参数 ww 的偏导数(梯度);而后辅以学习率 ηη,向梯度的反方向更新参数 ww。

     

    wwηLw.w←w−η⋅∂L∂w.

    考虑学习率 ηη 是全局设置的超参数,参数更新的核心步骤即是计算 Lw∂L∂w。再考虑到对于某个神经元来说,其输入与输出的关系是

    f(x⃗ ;w⃗ ,b)=f(iwixi+b).f(x→;w→,b)=f(∑iwixi+b).

    因此,对于参数 wiwi 来说,

     

    Lwi=Lffwi=xiLf.∂L∂wi=∂L∂f∂f∂wi=xi⋅∂L∂f.

    因此,参数的更新步骤变为

    wiwiηxiLf.wi←wi−ηxi⋅∂L∂f.

    更新方向

    又考虑到对于所有的求导部分来说是常数,因此各个$w_i$更新方向之间的差异,完全由对应的输入值$x_i$的符号决定。

    以零为中心的影响

    至此,为了描述方便,我们以二维的情况为例。亦即,神经元描述为

    f(x⃗ ;w⃗ ,b)=f(w0x0+w1x1+b).f(x→;w→,b)=f(w0x0+w1x1+b).

    现在假设,参数 w0w0, w1w1 的最优解 w0w0∗, w1w1∗ 满足条件

    {w0<w0,w1w1.{w0<w0∗,w1⩾w1∗.

    这也就是说,我们希望 w0w0 适当增大,但希望 w1w1 适当减小。考虑到上一小节提到的更新方向的问题,这就必然要求 x0x0 和 x1x1 符号相反。

    但在 Sigmoid 函数中,输出值恒为正。这也就是说,如果上一级神经元采用 Sigmoid 函数作为激活函数,那么我们无法做到 x0x0 和 x1x1 符号相反。此时,模型为了收敛,不得不向逆风前行的风助力帆船一样,走 Z 字形逼近最优解。

    如图,模型参数走绿色箭头能够最快收敛,但由于输入值的符号总是为正,所以模型参数可能走类似红色折线的箭头。如此一来,使用 Sigmoid 函数作为激活函数的神经网络,收敛速度就会慢上不少了。

  • 相关阅读:
    PHP 将二维数组中某列值作为数组的键名
    MySQL 8下忘密码后重置密码
    单一职责原则
    Linux下安装SVN服务端小白教程
    go 代码玩耍
    centos7 docker开启认证的远程端口2376配置教程
    Dockerfile RUN,CMD,ENTRYPOINT命令区别
    wait-for-it.sh脚本控制docker-compose启动顺序详解
    阿里云服务器漏洞修复_2020.5.22
    Let's Encrypt 免费通配符 SSL 证书申请教程
  • 原文地址:https://www.cnblogs.com/ying-chease/p/9492849.html
Copyright © 2011-2022 走看看