| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 神经网络 — 激活函数 -> 正文阅读 |
|
[人工智能]神经网络 — 激活函数 |
生物神经网络是一个复杂的网络结构, 如果允许神经元的计算函数为任意函数,虽然可以设计出灵活、功能强大的模型,但是这样的网络过于复杂且难以训练,而且通用性差。 为了兼顾计算的简单性,以及网络的灵活性,科学家们在设计人工网络时,将神经元的计算分为两步,线性函数加非线性激活函数。 这样的设计可以使得神经网络的运算不会太复杂,同时又具备了非线性计算的能力。为了使神经网络具有良好的表示能力和学习能力,激活函数通常具备以下性质。 1、首先,它应该是一个简单的非线性函数。当激活函数是非线性时,多层神经网络就不再是简单的线性组合,而是可以逼近各种复杂的函数和空间分布。同时激活函数及其导函数还应该尽可能的简单,这样有利于提高网络计算和学习的效率。 神经网络的神奇之处就在于它的每一个神经元都非常简单,但是可以一层一层的堆叠级联,通过这样简单的重复,就可以实现各种复杂的函数或者空间分布,从而解决复杂的问题。 2、其次,激活函数应该是连续可导的,这样就可以使用梯度下降法来更新网络参数。 3、激活函数应该是单调函数,这样才能够保证单层神经网络的损失函数是凸函数,学习算法更容易收敛。 下面,介绍几种在神经网络中,比较常用的激活函数。 早期的神经网络,普遍采用 Sigmoid 函数, 我们在前面介绍的对数几率函数 logistic , 但是在多层神经网络中,上一层的输出是下一层的输入,logistic 函数的输出范围是从 0 到 1 之间,并不是以 0 为中心的,这就会使得它后面一层神经元的输入发生偏离,可能导致梯度下降的收敛速度过慢,为了避免这个问题,在隐含层,可以使用双曲正切函数 Tanh 来代替 logistic 函数, 在 logistic 函数和双曲正切函数 Tanh 中,都需要求逆运算,计算复杂度有些大,采用误差反向传播算法更新网络参数时,所需要的训练时间也会比较长,Sigmoid 函数两端饱和,梯度非常接近于0,即使在中间部分,导数也是很小,下图为 logistic 函数的导函数以及其对应的曲线, 在多层神经网络中,损失函数的梯度信息从输出层反向传播,使用链式法则,在每一层都要乘以这一层激活函数的导数,也就是多个 0 — 0.25 之间的小数相乘,这就会使得误差经过每一层都会不断地衰减。当网络层数较深时,梯度就会趋近于0,参数更新几乎停滞,这被称之为梯度消失问题。 梯度消失问题在过去的二三十年中,一直没有得到有效地解决,是阻碍神经网络发展的重要原因之一。 下图为双曲正切函数的导函数, 最近几年,在多层神经网络和深度学习中,经常使用 ReLU 函数作为隐含层的激活函数, 相对于 Sigmoid 函数的两端饱和, ReLU 函数只有在零点的左边饱和,而在零点的右边,导数恒等于 1, 这样就缓解了梯度消失的问题。 此外, ReLU 函数中不存在幂运算,使用它作为激活函数, 另外,如果输入 z < 0 时,激活函数是 0 ,它的梯度也为 0,会导致无法更新,在以后的训练中,永远无法激活,这称为 ReLU 神经元死亡。 为了解决这个问题,可以采用 Leaky - ReLU 函数,下图为它的定义和函数曲线。 同时, Leaky - ReLU 函数具有线性的特点,使用它作为隐含层的激活函数,神经网络的计算和训练速度也都比 Sigmoid 函数快的多,但是 Leaky - ReLU 函数中的超参数 a 需要人工调整。 除此之外,还有 PReLU 函数和 RReLU 函数, 总的来说,激活函数中包含越充分的梯度信息,就能够从输入的数据中捕获更多的信息,例如,和阶跃函数相比,logistic 函数具有更加丰富的梯度信息,而双曲正切函数 Tanh 又更优于 logistic 函数。 虽然从理论上来说,只要神经网络有足够的深度和宽度,即使使用最简单的阶跃函数,也能够从输入数据中,捕获全部的信息,但是,这就需要更大规模的神经网络,否则丢失的信息将无法弥补,而选择一个好的激活函数,就能够在相同规模的网络下,从输入数据中捕获更多的信息,这也是现在普遍使用 Leaky - ReLU 函数来代替Sigmoid 函数作为隐含层激活函数的原因。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 4:48:58- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |