修正线性单元(Rectified linear unit,ReLU)


Rectified linear unit

在神经网络中,常用到的激活函数有sigmoid函数f(x)=11+exp(−x)、双曲正切函数f(x)=tanh(x),今天要说的是另外一种activation function,rectified linear function,f(x)=max(0,x),

The rectifier is, as of 2015, the most popular activation function for deep neural networks

它的特点是被认为是more biologically plausible than widely used logistic sigmoid or hyperbolic tangent(双曲正切 tanh),就是说更加符合神经元信号激励原理。采用了rectified linear function作为activation function的unit被称为rectified linear unit。它的一个平滑解析函数为f(x)=ln(1+ex),被称之为softplus function,softplus的微分就是logistic function:f′(x)=ex/(ex+1)=1/(1+e−x)。另外一种函数叫做softmax function或者normalized exponential是logistic function的一个泛化,如下:

σ(z)j=ezj∑Kk=1ezk for j=1,...,K.

the softmax function常被用来various probabilistic multiclass classification methods 比如multinomial logistic regression,multiclass linear discriminant analysis, naive Bayes classifiers and artificial neural networks等。在Andrew Ng的机器学习课程中,softmax regression中就用到了softmax function。这里点一下说明。当然本文的重点还是在rectified linear function上。


有几种变体:

noisy ReLUs

可将其包含Gaussian noise得到noisy ReLUs,f(x)=max(0,x+N(0,σ(x))),常用来在机器视觉任务里的restricted Boltzmann machines中。

leaky ReLUs

允许小的非零的gradient 当unit没有被激活时。

f(x)={x0.01xif x>0otherwise

Advantages

  1. Biological plausibility:单边,相比于反对称结构(antisymmetry)的tanh
  2. Sparse activation:基本上随机初始化的网络,只有有一半隐含层是处于激活状态,其余都是输出为0
  3. efficient gradient propagation:不像sigmoid那样出现梯度消失的问题
  4. efficient computation:只需比较、乘加运算。

    使用rectifier 作为非线性激活函数使得深度网络学习不需要pre-training,在大、复杂的数据上,相比于sigmoid函数等更加快速和更有效率。

    标准的sigmoid输出不具备稀疏性,需要通过惩罚因子来训练一堆接近于0的冗余数据,从而产生稀疏数据,比如L1,L2或者student-t作为惩罚因子,进行regularization。而ReLU为线性修正,是purelin的折线版,作用是如果计算输出小于0,就让它等于0,否则保持原来的值,这是一种简单粗暴地强制某些数据为0的方法,然而经实践证明,训练后的网络完全具备适度的稀疏性,而且训练后的可视化效果和传统pre-training的效果很相似。这说明了ReLU具备引导适度稀疏的能力。

从函数图形上看,ReLU比sigmoid更接近生物学的激活模型。

实际测量数据:纵坐标轴是神经元的放电速率(Firing Rate);横轴是毫秒(ms)

基于生物学的数学规则化激活模型(LIF)

(Softplus是ReLU的圆滑版,公式为:g(x)=log(1+e^x),从上面的结果看,效果比ReLU稍差)

ReLU在经历预训练和不经历预训练时的效果差不多,而其它激活函数在不用预训练时效果就差多了。ReLU不预训练和sigmoid预训练的效果差不多,甚至还更好。

相比之下,ReLU的速度非常快,而且精确度更高。

因此ReLU在深度网络中已逐渐取代sigmoid而成为主流。

ReLU导数(分段):

x <= 0时,导数为0

x > 0时,导数为1

早期多层神经网络如果用sigmoid函数或者hyperbolic tangent作为激活函数,如果不进行pre-training的话,会因为gradient vanishing problem而无法收敛。

而预训练的用处:规则化,防止过拟合;压缩数据,去除冗余;强化特征,减小误差;加快收敛速度。而采用ReLu则不需要进行pre-training。


实践应用

在应用中,把除了最外层输出用的sigmoid函数的其他所有用到sigmoid函数的地方全都改为ReLu函数,同时梯度也改为ReLu的,然后把学习速率调低。

修正线性单元(Rectified linear unit,ReLU)的更多相关文章

  1. ReLu(修正线性单元)、sigmoid和tahh的比较

    不多说,直接上干货! 最近,在看论文,提及到这个修正线性单元(Rectified linear unit,ReLU). Deep Sparse Rectifier Neural Networks Re ...

  2. 从损失函数优化角度:讨论“线性回归(linear regression)”与”线性分类(linear classification)“的联系与区别

    1. 主要观点 线性模型是线性回归和线性分类的基础 线性回归和线性分类模型的差异主要在于损失函数形式上,我们可以将其看做是线性模型在多维空间中“不同方向”和“不同位置”的两种表现形式 损失函数是一种优 ...

  3. Scaled Exponential Linear Unit

    https://www.bilibili.com/video/av9770302/?p=11 Relu Leaky Relu Parametric Relu就是把leaky部分的斜率学出来,而不是指定 ...

  4. Java实现线性阈值模型(Linear Threshold Model)

    影响力传播的线性阈值模型: 网络中连接任意两个节点u,v之间的边都有权重,任意一个节点它的各个邻居节点的边的权重之和为1,即 N(v):neighbors of v. 网络中的节点分为已激活节点和未激 ...

  5. 线性判别分析(Linear Discriminant Analysis,LDA)

    一.LDA的基本思想 线性判别式分析(Linear Discriminant Analysis, LDA),也叫做Fisher线性判别(Fisher Linear Discriminant ,FLD) ...

  6. 感知机和线性单元的C#版本

    本文的原版Python代码参考了以下文章: 零基础入门深度学习(1) - 感知器 零基础入门深度学习(2) - 线性单元和梯度下降 在机器学习如火如荼的时代,Python大行其道,几乎所有的机器学习的 ...

  7. 用线性单元(LinearUnit)实现工资预测的Python3代码

    功能:通过样本进行训练,让线性单元自己找到(这就是所谓机器学习)工资计算的规律,然后用两组数据进行测试机器是否真的get到了其中的规律. 原文链接在文尾,文章中的代码为了演示起见,仅根据工作年限来预测 ...

  8. (2)Deep Learning之线性单元和梯度下降

    往期回顾 在上一篇文章中,我们已经学会了编写一个简单的感知器,并用它来实现一个线性分类器.你应该还记得用来训练感知器的『感知器规则』.然而,我们并没有关心这个规则是怎么得到的.本文通过介绍另外一种『感 ...

  9. ReLu(Rectified Linear Units)激活函数

    论文参考:Deep Sparse Rectifier Neural Networks (很有趣的一篇paper) 起源:传统激活函数.脑神经元激活频率研究.稀疏激活性 传统Sigmoid系激活函数 传 ...

随机推荐

  1. Win32 Error

    一.Win32错误 也就是Win32子系统产生的错误.当我们在自己的代码里调用Windows系统的API函数,系统执行API内部代码,当API内部代码出现错误,会将预先定义好的错误代码写到调用这个AP ...

  2. GDB的安装

    1.下载GDB7.10.1安装包 #wget http://ftp.gnu.org/gnu/gdb/gdb-7.10.1.tar.gz或者可以远程看下有哪些版本 http://ftp.gnu.org/ ...

  3. C二维数组用指针地址遍历

    #include <stdio.h> #include <stdlib.h> int main(){ int a = 100; void *p = &a; printf ...

  4. 洛谷 P3979 遥远的国度

    题目描述 修改某条路径上的值以及询问子树的最小值都最树剖的基础操作,那么如何实现换根呢? 考虑一下三种情况: 1.rot=询问的子树x,答案就是整棵树的最小值 2.rot在x的子树里,只有rot到x这 ...

  5. vim的四大模式

    vim的四大模式 总结了下我经常使用的模式中的一些基本命令 正常模式 通过vim进入到界面, 首次即为正常模式 编辑模式 (i,a,o,s,I,A,S) i: 当前节点插入光标点 a: 下一个字母后插 ...

  6. 重写mybatis的字符串类型处理器

    1.简介 无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型. St ...

  7. 小程序在选择某一个东西的时候,可以用if,else 来做

    <view class='fake-select-item-text brand-selected' wx:if='{{selectedBrandName}}'> {{selectedBr ...

  8. springcloud config自动刷新中文乱码问题

    摘录一段网上盛传的,如下: 在使用 spring cloud config 时,如果在 properties 文件里面有中文的话,会出现乱码. 乱码的原因是:spring 默认使用org.spring ...

  9. c++ 标准 字符串转换为时间 时间大小比较 判断有效期 简洁办法

    c# php delphi java 等各种语言 对字符串转换为日期 然后与当前日期进行比较 是非常容易的 因为有现成的函数可用 标准 c++ 硬是找不到 合适的代码可用 于是 百度了很多 没百出个结 ...

  10. 解决Wireshark安装Npcap组件失败

    解决Wireshark安装Npcap组件失败   从Wireshark 3.0开始,Npcap取代Winpcap组件,成为Wireshark默认的网卡核心驱动.由于该组件属于驱动程序,所以安装时候容易 ...