当前位置: 首页 > news >正文

神经网络深度学习(二)激活函数

 

一、激活函数的作用

激活函数的作用是:引入非线性因素,提高了模型的表达能力。

如果没有激活函数,那么模型就只有线性变换,可想而知线性模型能表达的空间是有限的。而激活函数引入了非线性因素,比线性模型拥有更大的模型空间。

二、激活函数详解

激活函数

公式

图形

适用范围

tanh

 

导数

 

 

tanh激活函数是0均值的,tanh激活函数相比sigmoid函数更'陡峭'了,对于有差异的特征区分得更开了,tanh也不能避免梯度消失问题。

softmax

(分布也是指数)

 

softmax函数常用在分类网络的最后一层,把网络输出转化为各类别的概率。

sigmoid

导数:

 

 

优点:sigmoid函数可以将实数映射到 (0,1) 区间内。平滑、易于求导。

缺点:1. 激活函数含有幂运算和除法,计算量大;2. 反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练;3. sigmoid的输出不是0均值的,这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。

ReLU

优点:1.计算量小;2.激活函数导数维持在1,可以有效缓解梯度消失和梯度爆炸问题;3.使用Relu会使部分神经元为0,这样就造成了网络的稀疏性,并且减少了参数之间的相互依赖关系,缓解了过拟合问题的发生。

缺点:输入激活函数值为负数的时候,会使得输出为0,那么这个神经元在后面的训练迭代的梯度就永远是0了(由反向传播公式推导可得),参数w得不到更新,也就是这个神经元死掉了。这种情况在你将学习率设得较大时(网络训练刚开始时)很容易发生(波浪线一不小心就拐到负数区域了,然后就拐不回来了)。

解决办法:一些对Relu的改进,如ELU、PRelu、Leaky ReLU等,给负数区域一个很小的输出,不让其置0,从某种程度上避免了使部分神经元死掉的问题。

LeakyReLU

LeakyReLU在神经元未激活时,它仍允许赋予一个很小的梯度,避免ReLU死掉的问题。值得注意的是LeakyReLU是确定的标量,不可学习。

注意区分PReLU和LeakyReLU,PReLU的 alpha 是一个可学习的数组,尺寸与 x 相同。

PReLU是针对ReLU的一个改进型,在负数区域内,PReLU有一个很小的斜率,这样也可以避免ReLU死掉的问题。相比于ELU,PReLU在负数区域内是线性运算,斜率虽然小,但是不会趋于0,这算是一定的优势

hard_sigmoid

特点:计算量小,非平滑。

ELU

优点:右侧线性部分使得elu能够缓解梯度消失,而左侧软饱部分能够让ELU对输入变化或噪声更鲁棒。elu的输出均值接近于零。

GELUGELU(x)=x∗Φ(x)

就是我们常说的高斯误差线性单元,它是一种高性能的神经网络激活函数,因为gelu的非线性变化是一种符合预期的随机正则变换方式

Maxout

 

三、激活函数常见问题

1 transformer FFN层用的激活函数是什么?为什么?

ReLU.

2 出现死神经元的原因及解决方案:

  • 初始化参数的问题。 --> 采用Xavier初始化方法。

  • learning rate太高导致在训练过程中参数更新太大 。==>避免将learning rate设置太大,或者使用Adam等自动调节learning rate的方法。

  • 更换激活函数。 --> Leaky ReLU、PReLU、ELU等都是为了解决死神经元的问题。

3 Bert、GPT、GPT2中用的激活函数是什么?为什么?

Gelu.

使用Gelu时,一般优化器都会选择动态更新lr的方法。Bert、GPT、GPT2、RoBERTa、ALBERT都是用的Gelu。

GeLU

 

直观理解:x做为神经元的输入,P(X<=x)越大,x就越有可能被保留;否则越小,激活函数输出就趋近于0.

 

 

 参考文献: 

1 算法面试问题二(激活函数相关)【这些面试题你都会吗】 - 知乎

 

 

 

相关文章:

  • Java_Servlet处理请求流程
  • cadence SPB17.4 - allegro - modify shape
  • AJAX详细教程
  • 关于 在国产麒麟系统上使用QProcess配合管道命令执行shell命令获取预期结果输出失败 的解决方法
  • docker进阶——docker网络简解
  • 2022/09/01 day01:Git概述
  • 2022/09/02 day02:连接远程仓库,推送、克隆
  • 第18章linux系统-备份与恢复
  • 2022/09/03 day03:搭建私有git服务器与IDEA中使用Git
  • VScode+esp-idf:例程(esp32-web-camera)保存图片到sd卡
  • 读书笔记<高速上手C11 14 17>
  • Transformer,浅析归纳偏置对模型缩放的影响
  • 两款Java中小医院信息管理系统源码
  • CS:GO开服架设服务器搭建游戏配置方法教程教学插件配置下载资源配置
  • 微服务分布式架构中,如何实现优雅发版?
  • 【Leetcode】101. 对称二叉树
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • Akka系列(七):Actor持久化之Akka persistence
  • Angular 响应式表单之下拉框
  • Bootstrap JS插件Alert源码分析
  • co.js - 让异步代码同步化
  • Codepen 每日精选(2018-3-25)
  • css的样式优先级
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 浏览器缓存机制分析
  • 入手阿里云新服务器的部署NODE
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 提醒我喝水chrome插件开发指南
  • 学习Vue.js的五个小例子
  • 用jQuery怎么做到前后端分离
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • # include “ “ 和 # include < >两者的区别
  • #1015 : KMP算法
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (1)虚拟机的安装与使用,linux系统安装
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (力扣)1314.矩阵区域和
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)Google的Objective-C编码规范
  • (转)创业的注意事项
  • ***测试-HTTP方法
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net 受管制代码
  • .Net 应用中使用dot trace进行性能诊断
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NetCore项目nginx发布
  • .NET成年了,然后呢?
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [BJDCTF2020]The mystery of ip1
  • [C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改
  • [c++] 自写 MyString 类