码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【深度学习】5-从计算图直观认识“激活函数不以零为中心导致收敛变慢”


    ​🚩 前言

    活动地址:CSDN21天学习挑战赛

    “众所周知,激活函数最好具有关于零点对称的特性,不关于零点对称会导致收敛变慢”,这种说法看到几次了,但对于背后的原因却一直比较模糊,今天就来捋一捋。

    为此我阅读了一些文章,其中一篇个人觉得写得很棒(附在文末的参考中),但也花了一些时间才看懂(可能我比较笨?)。后面我发现从计算图来看这个问题会比较直观和容易理解一些。

    如果不了解计算图,可以查阅 齐藤康毅 的 《深度学习入门 基于python的理论与实现》的第五章:误差反向传播法。


    文章目录

    • ​🚩 前言
    • 1. 收敛变慢的原因
    • 2. 为何要“对称”?
    • 3. 与“参数值全相同”情况的对比
      • 3.1. 激活函数输出值全为正
      • 3.2. 参数值全相同


    1. 收敛变慢的原因

    先上计算图(某层神经网络的一小部分):

    在这里插入图片描述

    图中黑色箭头为正向推理,红色箭头为误差的反向传播。因为 s i g m o i d sigmoid sigmoid 函数的输出值都为正,故 x i x_i xi​ 的符号都相同且为正;则参数 w i w_i wi​ 的更新方向(增大\减小) x i a x_ia xi​a 仅由 a a a 决定。

    • 当 a a a 大于 0 ,所有参数更新时都增大
    • 当 a a a 小于 0, 所有参数更新时均减小

    所有参数更新方向始终一致会有什么影响?如果某次迭代收敛到最优参数,一个参数需要增大,另一个需要减小,那我们一致的参数更新方向就无法指向最优点,会形成一种锯齿型的路径,因此收敛到最优点的速度就慢。
    在这里插入图片描述
    图片来源:谈谈激活函数以零为中心的问题

    2. 为何要“对称”?

    前面我们看到,参数更新方向一致将导致锯齿状的更新路径。只要激活函数的值域分布在零的两边,就不会出现更新方向始终一致的问题了。

    那对称的意义是什么?像下图中,函数曲线偏向 y 的正半轴,那么更新参数时参数就更容易增大而不容易减小,但如何确定参数更应该增大还是减小呢?
    在这里插入图片描述

    3. 与“参数值全相同”情况的对比

    下面对比一下两个问题。

    1. 激活函数输出值全为正:参数更新路径为锯齿状,更新慢
    2. 参数值全相同:完全无法正常训练

    3.1. 激活函数输出值全为正

    对于激活函数输出值全为正,以二维的参数空间为例,它失去的是一半的方向。一对参数值更新量 ( Δ w 1 , Δ w 2 ) (\Delta w1, \Delta w2) (Δw1,Δw2) ,虽然 Δ w 1 \Delta w1 Δw1 与 Δ w 2 \Delta w2 Δw2 的符号相同,但参数不同的绝对值仍可以组合出丰富的更新方向,足以抵达这二维空间中的任意一点,因为第二、四象限中的任一个向量,都可以分解为第一、三象限中的两个向量。
    在这里插入图片描述

    3.2. 参数值全相同

    参数值全相同将导致所有参数的更新方向和幅度也相同(可参考:权重参数全相同值初始化,导致无法训练),此时模型完全报废,因为参数更新将只能在同一条直线上移动。
    在这里插入图片描述


    参考

    1. 《深度学习入门 基于python的理论与实现》齐藤康毅
    2. 谈谈激活函数以零为中心的问题

    博主主页:清风莫追_CSDN
    原文链接:http://t.csdn.cn/nIA0d

    ​

  • 相关阅读:
    没有使用IaC的DevOps系统都是耍流氓
    并发编程7:线程池的使用
    NPDP考试倒计时,如何高效提分?
    计算机毕业设计选题推荐-车险理赔信息管理系统-Java项目实战
    Spring 中BeanFactory和FactoryBean有什么不同之处呢?
    libstdc++.so.6: cannot open shared object file: No such file or directory
    python文本转语音
    10.DesignForSymbols\2.CompareLibraryTools...
    ly-tab插件动态更改高度进行多端适配
    linux 系统时间不正确,如何查看ntp是否同步
  • 原文地址:https://blog.csdn.net/m0_63238256/article/details/126448584
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号