机器学习—非零中心化、非零中心化会带来的问题

2023-10-31

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

 神经元模型

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

图1 经典神经元模型

图1来自:聊一聊深度学习的activation function - 知乎

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

Sigmoid 函数

Sigmodid 函数表达式:\sigma(x)=\tfrac{1}{1+e^{-x}}

图2 Sigmoid函数图像及其导函数图像

        Sigmoid函数是深度学习领域开始时使用频率最高的activation function。它是便于求导的平滑函数,其导数为\sigma (x)(1-\sigma(x)),这是优点。然而,Sigmoid有三大缺点:

  • 容易出现gradient vanishing
  • 函数输出并不是zero-centered
  • 幂运算相对来讲比较耗时

Gradient Vanishing

        优化神经网络的方法是Back Propagation,即导数的后向传递:先计算输出层对应的loss,然后将loss以导数的形式不断向上一层网络传递,修正相应的参数,达到降低loss的目的。
        Sigmoid函数在深度网络中常常会导致导数逐渐变为0,使得参数无法被更新,神经网络无法被优化。原因在于两点:
(1) 在上图中容易看出,当σ(x) 中 x 较大或较小时,导数接近0,而后向传递的数学依据是微积分求导的链式法则,当前层的导数需要之前各层导数的乘积,几个小数的相乘,结果会很接近0。
(2) Sigmoid导数的最大值是0.25,这意味着导数在每一层至少会被压缩为原来的1/4,通过两层后被变为1/16,…,通过10层后为1/1048576。请注意这里是“至少”,导数达到最大值这种情况还是很少见的。

输出不是zero-centered

        Sigmoid函数的输出值恒大于0,这会导致模型训练的收敛速度变慢。举例来讲,对\sigma \left ( \sum_{i}{w}_{i}*{x}_{i}+b \right ),如果所有{x}_{i} 均为正数或负数,那么其对{w}_{i}的导数总是正数或负数,这会导致如下图红色箭头所示的阶梯式更新,这显然并非一个好的优化路径。深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。

图3 阶梯式更新参数

幂运算相对耗时

        相对于前两项,这其实并不是一个大问题,我们目前是具备相应计算能力的,但面对深度学习中庞大的计算量,最好是能省则省 。

参考自:

聊一聊深度学习的activation function - 知乎
谈谈激活函数以零为中心的问题 | 始终
cs231n_激活函数_unit gaussian_zone_chan的博客-CSDN博客
【深度学习】5-从计算图直观认识“激活函数不以零为中心导致收敛变慢”_收敛的很慢_清风莫追的博客-CSDN博客
【深度学习】1-权重参数全相同值初始化,导致无法训练_深度学习所有参数初始化一致有什么问题_清风莫追的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习—非零中心化、非零中心化会带来的问题 的相关文章

随机推荐

  • TCP快速重传为什么是三次冗余ack

    先理解ACK的基本工作原理 当发送端发送第N 1个包后 接收端答复的ACK序列号实际上跟发送端发送下一个包 也就是第N个包的序列号一致 重复ACK是指在接收方收到乱序报文时 所发出的一类TCP报文 TCP使用报文头的序列号和确认号以有效保证
  • python绘制正弦函数和余弦函数

    题目 根据如下绘图写出相应代码 1 绘图函数 y sin x y cos x x np linspace np pi np pi 256 endpoint True 2 绘制填充区域 紫色区域 2 5
  • PARL与强化学习笔记

    PARL与强化学习笔记 1 预习 1 1MNIST手写识别 1 2 python基础知识 1 3paddle基础知识 1 3 1计算常量的加法 1 1 1 3 2计算变量的加法 1 1 1 3 3使用PaddlePaddle做线性回归 满足
  • Python 基础合集12:os库文件操作

    一 前言 本小节梳理了os常用的一些方法 并介绍一个小案例 环境说明 Python 3 6 windows11 64位 二 os常用方法 注意 使用方法前需要先调用os库 即import os os getcwd 获取当前目录 os chd
  • apache-commons目录大全

    主页推荐 BCEL 字节码工程库 分析 创建和操作Java类文件 BeanUtils 围绕Java反射和自省api的易于使用的包装器 BSF Bean脚本框架 脚本语言的接口 包括JSR 223 Chain 责任链模式的实施 CLI 命令行
  • 基于单片机的照明灯智能控制器系统(设计报告+电路原理图+程序)

    摘要 本文设计了一种基于单片机的照明灯智能控制器系统 该系统通过使用单片机与光照传感器和人体感应器进行通信 实时感知环境光照和人的存在情况 并根据预设的控制策略控制灯光亮度和开关 通过适当的算法和控制逻辑 实现了对照明灯的智能控制 实验结果
  • C++卷积神经网络实例:tiny_cnn代码详解(8)——partial_connected_layer层结构类分析(上)

    在之前的博文中我们已经将顶层的网络结构都介绍完毕 包括卷积层 下采样层 全连接层 在这篇博文中主要有两个任务 一是整体贯通一下卷积神经网络在对图像进行卷积处理的整个流程 二是继续我们的类分析 这次需要进行分析的是卷积层和下采样层的公共基类
  • CSDN如何解决复制后代码格式错乱问题?

    不要直接用鼠标选择代码复制粘贴 要用代码块右侧的复制按钮进行复制
  • Cannot prepare internal mirrorlist: No URLs in mirrorlist

    我是在执行 yum install dnf plugins core 这个命令报的错误 问题 在CentOS 8中 使用yum时出现错误 镜像列表中没有url 类似如下 Error Failed to download metadata f
  • canvas 刻度尺

    参考链接 https codepen io luren pen yEagYO 画布
  • 拆书领读

    来源于课程学习笔记 一 为什么拆书 赚钱 自我提升 看书 二 如何拆书 1 平台及类型 听书 用一篇文章的长度 5000 8000字 告诉你一本书的精华内容 拆书 用5 10篇文章的长 2 听书 采用总分总的套路 第一部分 总领全文 看书的
  • 锂离子电池保护板你懂多少呢?

    锂离子电池保护板你懂多少呢 电子设备通常用的是聚合物电池和锂电池 但是聚合物电池容易鼓包 随着锂离子电池的出现 由于其能量密度高 充电效率高 而且对环境 友好 故得到制造商的垂爱 但是用锂电池必须对过压和过流进行检测 以保护锂离子电池 不然
  • 静态方法访问非静态变量

    使用态方法需要访问非静态变量会出现图中的问题 其解决方法有两种 1 将要访问的非静态变量改成静态的 2 使用类对象来访问 public class Main String string 1111111123456 public static
  • LocalDateTime和Date的比较(JDK8新特性:时间日期API)

    最近在项目升级框架查资料会涉及到LocalDateTime 当时看到这个觉得为什么大家都在用这个 为什么 说到这里我们要知道这个LocalDateTime来自哪里 实际上这个LocalDateTime是JDK8的新特性之一 JDK8发布了新
  • opencv 手势识别 【附源代码】

    我使用OpenCV2 4 4的windows版本 Qt4 8 3 VS2010的编译器做了一个手势识别的小程序 本程序主要使到了Opencv的特征训练库和最基本的图像处理的知识 包括肤色检测等等 废话不多 先看一下基本的界面设计 以及主要功
  • 程序分析-klee工具分析

    一 klee介绍 1 1 简单介绍 Klee是一个LLVM IR符号执行工具 OSDI 08 Paper地址 能够自动生成测试 实现对各种复杂且环境密集型程序的高覆盖率 klee有2个目标 命中目标程序中的每一行代码 检测到每一个危险操作
  • C++代码静态检测

    C 代码静态检测一 CppCheck二 TscanCode三 PVS studio 代码静态检测 指的是程序在非运行状态下 对代码进行语法分析 检测其规范性和语法错误的一种操作 主要借助的都是一些第三方工具 比如CppCheck Tscan
  • Ubuntu20.04正确的开启方式(美化+软件安装)

    目录 1 什么都没有的ubuntu20 04 第一步 系统设置 第二步 美化 1 安装gnome software和chrome gnome shell 2 安装dash to dock 3 打开插件和主题 第三步 软件安装 1 什么都没有
  • Unity3D——射箭游戏

    先上游戏截图 把靶子调远一点 风力的影响会很明显 编码过程 1 利用一个空对象包含五个同心圆柱构建靶子 空对象的参数 一个同心圆柱的参数 其他的类似 然后构造箭矢并制成预制 就是一个黄色的棍子 2 建立构造箭矢的工厂 这段代码根据之前的打飞
  • 机器学习—非零中心化、非零中心化会带来的问题

    众所周知 激活函数最好具有关于零点对称的特性 不关于零点对称会导致收敛变慢 这种说法看到几次了 但对于背后的原因却一直比较模糊 今天就来捋一捋 神经元模型 如图1所示是神经网络中一个典型的神经元设计 它完全仿照人类大脑中神经元之间传递数据的