谈谈激活函数以零为中心的问题

简介: 谈谈激活函数以零为中心的问题

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

神经元image.jpeg

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

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

Sigmoid 与 tanh

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

Sigmoid 函数

Sigmoid 函数的一般形式是

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

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

Sigmoid 函数的导数很好求

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

tanh 函数

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

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

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

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

image.jpeg

一些性质

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

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

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

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

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

收敛速度

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

参数更新

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

w←w−η⋅∂L∂w.

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

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

因此,对于参数 wi 来说,

∂L∂wi=∂L∂f∂f∂z∂z∂wi=xi⋅∂L∂f∂f∂z.

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

wi←wi−ηxi⋅∂L∂f∂f∂z.

更新方向

由于 wi 是上一轮迭代的结果,此处可视为常数,而 η 是模型超参数,参数 wi 的更新方向实际上由 xi⋅∂L∂f∂f∂z 决定。

又考虑到 ∂L∂f∂f∂z 对于所有的 wi 来说是常数,因此各个 wi 更新方向之间的差异,完全由对应的输入值 xi 的符号决定。

以零为中心的影响

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

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

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

{w0<w0∗,w1⩾w1∗.

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

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


tt.png

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

目录
相关文章
|
1月前
|
机器学习/深度学习 Java 网络架构
YOLOv5改进 | TripletAttention三重注意力机制(附代码+机制原理+添加教程)
YOLOv5改进 | TripletAttention三重注意力机制(附代码+机制原理+添加教程)
213 0
|
11天前
|
机器学习/深度学习 计算机视觉
【保姆级教程|YOLOv8添加注意力机制】【2】在C2f结构中添加ShuffleAttention注意力机制并训练
【保姆级教程|YOLOv8添加注意力机制】【2】在C2f结构中添加ShuffleAttention注意力机制并训练
|
26天前
|
机器学习/深度学习 算法 计算机视觉
YOLOv8改进 | 注意力机制 | 添加全局注意力机制 GcNet【附代码+小白必备】
本文介绍了如何在YOLOv8中集成GcNet,以增强网络对全局上下文的捕获能力。GcNet通过全局上下文模块、通道和空间注意力机制提升CNN对全局信息的利用。教程详细阐述了GcNet的原理,并提供了将GcNet添加到YOLOv8的代码实现步骤,包括创建ContextBlock类、修改init.py、task.py以及配置yaml文件。此外,还提供了训练和运行示例代码。完整代码和更多进阶内容可在作者的博客中找到。
|
27天前
|
机器学习/深度学习 算法 计算机视觉
YOLOv8 | 卷积模块 | 提高网络的灵活性和表征能力的动态卷积【附代码+小白可上手】
本教程介绍了如何在YOLOv8中使用动态卷积提升网络性能和灵活性。动态卷积利用注意力机制动态选择和组合卷积核,适应输入数据特征,解决了轻量级CNN的局限。文中提供了详细步骤教读者如何添加和修改代码,包括在`conv.py`中添加`Dynamic_conv2d`模块,更新`init.py`、`task.py`和`yaml`配置文件。此外,还分享了完整代码和进阶技巧,帮助深度学习初学者实践目标检测。参考[YOLOv8改进](https://blog.csdn.net/m0_67647321/category_12548649.html)专栏获取更多详情。
|
1月前
|
机器学习/深度学习 数据挖掘 算法框架/工具
想要了解图或图神经网络?没有比看论文更好的方式,面试阿里国际站运营一般会问什么
想要了解图或图神经网络?没有比看论文更好的方式,面试阿里国际站运营一般会问什么
|
1月前
|
机器学习/深度学习 监控 Python
【顶刊2023】重新审视Dropout层的作用,不止可有效防止过拟合!来源:《Dropout Reduces Underfitting》
【顶刊2023】重新审视Dropout层的作用,不止可有效防止过拟合!来源:《Dropout Reduces Underfitting》
43 1
【顶刊2023】重新审视Dropout层的作用,不止可有效防止过拟合!来源:《Dropout Reduces Underfitting》
|
1月前
|
机器学习/深度学习 Python
【初窥CBAM】实操版即插即用的注意力机制模块
【初窥CBAM】实操版即插即用的注意力机制模块
71 0
【初窥CBAM】实操版即插即用的注意力机制模块
|
1月前
|
监控 算法 数据可视化
BN层迎来升级版MABN | 轻轻松松几行代码帮你解决跨域问题,同时顺手涨点
BN层迎来升级版MABN | 轻轻松松几行代码帮你解决跨域问题,同时顺手涨点
60 0
BN层迎来升级版MABN | 轻轻松松几行代码帮你解决跨域问题,同时顺手涨点
|
1月前
|
机器学习/深度学习 算法 文件存储
QuadraNet部署之星 | 从神经元重构到结构和整个模型的全面设计
QuadraNet部署之星 | 从神经元重构到结构和整个模型的全面设计
45 0
|
1月前
|
机器学习/深度学习 Java 网络架构
YOLOv8改进 | TripletAttention三重注意力机制(附代码+机制原理+添加教程)
YOLOv8改进 | TripletAttention三重注意力机制(附代码+机制原理+添加教程)
300 0