【学术】如何在神经网络中选择正确的激活函数
在神经网络中,激活函数是必须选择的众多参数之一,以通过神经网络获得最优的成果和性能。
在这篇文章中,我将假设你已经理解了神经网络工作的基本原理,并将详细介绍涉及激活的过程。在前馈过程中,每个神经元取上一层取神经元的总和(乘以它们的连接权值)。例如:
n5 = (n1 * w1) + (n2 * w2) + (n3 * w3) + (n4 * w4)
n6 = (n1 * w5) + (n2 * w6) + (n3 * w7) + (n4 * w8)
n7 = (n1 * w9) + (n2 * w10) + (n3 * w11) + (n4 * w12)
每个神经元的值都需要被最小化,因为原始的输入数据可能是非常多样化的,而且可能是不成比例的。在进一步前馈前,必须激活n5,n6,n7。简单地说,你可以使用一系列函数来作为到达神经元的值的线性或非线性阈值(比如n5、n6和n7)。
A()是激活函数,通常用来将它的输入压缩为更符合的比例值(取决于你选择的函数)。它通常是0到1之间的小数值。但是,如何才能做到压缩输入,并且应该使用什么样的函数来完成这个任务呢?
步骤函数是最简单的。它指出静态阈值通常为0.5(但也可能为0),并根据输入值大于或小于阈值来决定输出1或0。要记住,输入值几乎总是在0到1之间(或者可能是-1,1),因为权值总是像第一层的神经元一样。
def step(input): return 1 if (input > 0.5) else 0
这本质上是一种二进制的方法,当输入数据为二进制分类问题时,可以使用这种方法,在训练模型或者函数的例子中:
0,1 = 11,0 = 10,0 = 01,1 = 0
该模型将有两个输入神经元,隐藏层层大约四个神经元,输出层有一个神经元。在每一层上,由于问题是二进制的,步骤函数都是激活所需的全部。
最常用的激活函数是sigmoid函数(蓝色),与步骤函数(橙色)相比,它在图上是这样的:
无论输入值高或低,它都将被压缩成0到1之间的比例值。它被认为是一种将值转化为概率的方法,它反映了神经元的权值或置信度。这就解释了模型的非线性特征,使它能够更深入地学习观察结果。默认情况下,你可以使用这个sigmoid函数来解决任何问题,并可以得到一些结果。
输出永远不可能是1,因为1是上水平渐近线。同样地,对于0,输出也总是趋向于它而不到达它。当然,在程序中,将会有一个点,输出是四舍五入的。
这里有一些示例的输入和输出,你可以准确地看到正在发生的事情:
显然,S()是sigmoid函数。当反向传播时,需要在单个权值中找到误差范围,并且需要通过它的推导来返回Sigmoid函数:
Tanh函数与sigmoid函数非常相似。然而,它的范围更大。它不返回0和1之间的值,而是给出-1和1的范围。这强调了观察结果,更加具体。因此,它适用于分类不同且门槛较低的更复杂的问题。如果你的数据相对简单,这会导致过度学习。正如你所看到的,TanH的方程与Sigmoid非常相似。
TanH函数的推导是:
ReLU激活函数是深度学习中最常用且最成功的函数。乍一看,这似乎有些令人惊讶,因为迄今为止,非线性函数似乎更有效。ReLU的好处在反向传播中得以体现。有一种常见的经验法则是,神经网络上的层越多,就会更容易成功,然而这产生了一个著名的问题:消失梯度下降(vanishing gradient descent),许多非线性激活技术,如Sigmoid和Tanh。它单独地破坏了深度学习(有许多层)提供的巨大机会。
如果我们看一下一个小的神经网络的水平切片,也许只有一个隐藏层,消失梯度下降不会是太大的问题:
正如你所看到的,在每个神经元上,S()被再次调用。也就是S(S(x)),你一次又一次地压缩这个值。请记住,为了简单,我忽略了与其他神经元权值相乘的过程。层次越多,结果就越糟糕。现在,从0.68997到0.665961可能没问题,但请想象一下:
S(S(S(S(S(S(S(S(S(S(S(x)))))))))))
…你会得到一个意义与完整性已经消失了的值,此时igmoid函数推导过程为:
ReLU的优点是它不会压缩数值,因为它使用一种非常简单的静态方法:
R(x)= max(0,x)
它只是将任何负值映射为零,同时保留所有的正值。这就是为什么ReLU被用于更复杂的神经网络,如深度卷积网络。ReLU没有层限制。然而,ReLU失去了压缩数值的优势,但是避免了超限或放大问题。换句话说,它不能处理非常大的值,因为它不能压缩它们。ReLU的另一个问题是,在一些更极端的情况下,它可以消灭一个神经元。想象一下,在多次反向传播之后,一个特定的权值会随着时间的推移而调整为一个非常大的负值。反过来,这个值会乘以之前的神经元,并不断地产生一个负数作为下一个神经元的输入。因此,R(x)每次都会输出0,这是一个即将消失的神经元(注意,从技术上讲,它还有恢复的机会,它不是一个消失的神经元)。因此,有更有见解的ReLU版本,如参数化和漏型的直线单元(Leaky Rectified Linear Unit),(或PReLU和LReLU),它们都不只是将任何负值映射到0,而是(绿色):
- 每天学习一点儿算法--二分查找
- IntelliJ IDEA两种keymap快捷键方案Mac OS X和Mac OS X 10.5+的区别
- Apache Avro是什么干什么用的(RPC/序列化)
- 萌新刷题(十二)二叉树的前序遍历
- 轻松掌握ES6中集合Set的用法
- 萌新刷题(十三)买卖股票的最佳时机
- 萌新刷题(十一)有效数字
- Hive性能优化统计每日IP CREATE TABLE ip_2014_12_29 AS SELECT COUNT(DISTINCT ip) AS IP FROM logdfs WHERE logda
- 算法中描述复杂度的大O是什么意思?
- 优化Mysql:3个简单的调整
- Redis的5个常见应用场景
- Mysql 索引你了解多少?
- Mysql 8 新特性 window functions 有什么用?
- 用两张图告诉你,为什么你的App会卡顿?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Yii 使用intervention/image拓展实现图像处理功能
- PHP常用的类封装小结【4个工具类】
- 微信公众号之主动给用户发送消息功能
- laravel异步监控定时调度器实例详解
- python按顺序重命名文件并分类转移到各个文件夹中的实现代码
- Python实现删除某列中含有空值的行的示例代码
- python打开音乐文件的实例方法
- PHP基础之输出缓冲区基本概念、原理分析
- 基于python实现删除指定文件类型
- sync-player:使用websocket实现异地同步播放视频
- CentOS7.0下安装PHP5.6.30服务的教程详解
- PHP实现微信提现功能
- PHP实现SMTP邮件的发送实例
- php实现有序数组旋转后寻找最小值办法
- PHP APP微信提现接口代码