今天的深度神经网络可以处理高度复杂的数据集。例如,物体检测器已经可以实时预测各种对象的位置;时间序列模型已经能够同时处理许多变量,还有许多其他的应用可以想象。
问题是这些网络如何处理这种复杂性?更具体地说,它们是如何做到之前机器学习模型较难完成的任务?
这个问题有两个答案。主要的答案在于更深的网络可以处理更复杂的数据。然而,另一部分答案则在于各种激活函数的应用,尤其是现在常用的几种非线性激活函数(如ReLU、Sigmoid、Tanh和Softmax等)。
我们在这次博客里将聊聊几件事。
- 什么是激活函数;
- 为什么要有激活函数;
- Sigmoid激活函数简介;
- Tanh(或双曲正切)激活函数简介;
- ReLU(即修正线性单元)激活函数简介;
- Softmax激活函数简介;
准备好了没?走啦!
激活函数是什么?你肯定还记得这样的结构,用深度学习的术语来说,它是由全连接层,也就是密集连接层组成的。
在此网络中,每个神经元包含一个权重向量和一个偏置值。当输入一个新向量时,计算权重向量与输入向量的点积,加上偏置,并输出标量。
…直到它不管用了。
这个问题可以非常简单地理解:点积和标量加都是线性运算。
因此,当你把每个神经元的输出都设为这个值时,你就得到了一个线性行为的系统。
而且正如你所知,大多数数据具有高度非线性特征。由于线性神经网络在这种情况下无法生成决策边界,因此在生成预测模型时应用它们就没有意义了。
因此,这个整体系统必须是非线性的。
输入激活函数的命令。
此功能位于每个神经元的后面,它以线性神经元的输出作为输入,并根据输入生成一个非线性的输出,通常是非线性的,而且是确定性的,即输入相同的值两次,你会得到相同的结果。
这样一来,每个神经元实际上生成一个虽然线性但具有非线性特性的输出,系统因此表现出非线性特性。
输出激活随输入增多神经网络受到了人脑的启发,尽管非常简单,它们类似于人类神经元的工作方式:神经元也属于大型神经网络的一部分,其间有突触。当接收到神经输入时,神经元会被激活,并传递信号给其他神经元。
整个系统造就了我们所了解的人类脑力。
如果你希望在神经网络的激活函数中模仿这种行为模式,你也需要模仿人类神经元的激活方式。显然的是,当神经元接收到更多刺激时,人类神经元的输出通常会随着刺激增加而增加。同样地,在人工神经网络中这种情况也很常见。
所以,我们正在寻找能够将线性输入产生非线性的输出,并且随时间推移增长或保持稳定的数学公式。
面向今日常用的激活函数有许多激活函数,其中一些我们在之前的博客中已经介绍过,未来我们还会介绍更多。今天,三种最常用的激活函数是:Sigmoid 函数、tanh 函数和 ReLU 单元。接下来,我们会详细介绍它们。
Sigmoid请看下面,你将看到一个通用的 S 型函数,也叫作逻辑斯谛曲线:
稍作修改来自 https://tex.stackexchange.com/questions/536102/how-to-make-sigmoid-function-at-tikz
用数学的方式来表示就是:
使用Code Cogs生成
如您所见,在该图中,函数随时间缓慢上升,但在 x = 0 附近上升幅度最大。函数的范围是 (0, 1),因此当 x 值较大时,函数会逐渐逼近 1,但永远不会等于 1。
Sigmoid函数可以做很多事情。首先,由于我们知道真正的Rosenblatt感知机无法在Keras中实现(参考此处),那些古早感知机中使用的阶梯函数不可微,因此无法应用梯度下降法进行优化。其次,当你自己实现Rosenblatt感知机时,你会发现,在二分类问题中,决策边界是逐神经元进行优化的,会找到存在的边界之一。相比之下,使用Sigmoid函数会更简单,因为它更平滑,更容易优化(Majidi, n.d.)。
此外,或许更重要的是我们使用Sigmoid函数,因为它的输出范围是(0, 1]。当估计概率时,这非常适合,因为概率的范围也是[0, 1](Sharma, 2019)。尤其是在二分类问题中,当我们有效估计输出属于某一类的概率时,Sigmoid函数可以让我们给出一个非常加权的概率估计。输出为0.623,表示“稍微多一点倾向于B”。如果使用阶跃函数,输出将会是1,这样细微的差别就会消失。
双曲正切(简称Tanh) Tanh(双曲正切)另一种常用的激活函数是双曲正切/tanh函数,通常表示为tanh函数。
参考来源:https://www.researchgate.net/figure/Example-2-The-comparison-between-the-numerical-solution-and-the-reference-solution-on_fig4_321482939 (示例2的比较结果图表)
从代数的角度来看,这可以表示为:
这是通过CodeCogs(https://editor.codecogs.com/)做的
这种函数类似于Sigmoid函数,但存在一些差异。
当接近 x = 0 时,输出的变化加速,这与 Sigmoid 函数的行为相似。
它也像 Sigmoid 一样具有相同的渐近性质:虽然当 x 的值非常大时,函数会越来越接近 1,但永远不会真正等于 1。
然而,在域的下侧,我们发现最小值接近-1,而不是0。
《S形函数和Tanh函数之间的主要区别》你现在可能在想tanh和Sigmoid之间的区别是什么。我也有同样的困惑。
很明显,激活函数的值域不同:(0, 1) 对比 (-1, 1),正如我们之前提到的。
尽管这种差异看起来很小的,但它可能对模型性能产生很大影响;具体来说,它会影响模型收敛到最优解的速度(根据LeCun等人1998年的研究)。
这是由于它们关于原点对称。因此,接近零的输出是最好的:在优化时,它们引起的权重变化最小,从而使模型更快收敛。当你的模型特别大时,这将特别有用。
正如我们所见,tanh函数在原点处对称,而Sigmoid函数则不具备这种性质。那么我们是否应该无例外地选择tanh呢?
不——它带来了一堆问题,或者说更积极地说,一系列的挑战。
Sigmoid和Tanh函数面临的挑战LeCun等人的这篇论文于1998年撰写,自那时以来,深度学习领域已经有了很大的进展,发现了一系列必须解决的问题等等,以推动深度学习领域向前发展。
首先,我们需要谈一谈 model sparsity (DaemonMaker,n.d.)。在优化时,模型越不复杂,收敛就越快,就越有可能及时找到数学上的最优解。
复杂程度可以理解为你的模型中还保留的多余的不起眼的神经元数量。这样的神经元越少,你的模型就越简洁——或者说,越稀疏。
Sigmoid 和 Tanh 实际上生成的都是非稀疏模型,因为它们的神经元几乎总是生成一个输出值:当它们的输出范围分别是 (0, 1) 和 (-1, 1) 时,输出几乎总是不为零,即使为零的概率也非常低。
因此,如果某些神经元的权重不那么重要,它们也不能被“删除”,模型也就不能变得稀疏。
另一个可能的问题是这些激活函数的输出范围可能会出现所谓的梯度消失问题 (vanishing gradients problemDaemonMaker, 未注明日期)。在优化过程中,数据被输入模型,然后将其输出结果与实际目标值进行比较。这被称为损失。由于损失可以被视为一个可优化的数学函数,我们可以计算梯度,以达到零导数,即数学上的最优状态。
然而,神经网络由许多层的神经元组成。我们需要对每层重复这一过程,并相对其下游层进行。然后将这些层连接起来。这正是反向传播的过程。然后我们可以使用梯度下降或类似优化器来优化模型。
当神经元输出非常小时(即,-1 < 输出 < 1),优化过程中产生的链会逐渐变小,一直影响到前层。这将使得它们的学习变得非常缓慢,并且让人怀疑它们是否能收敛到最优解。这就是所谓的“梯度消失”问题。
整流线性单元(ReLU)为了改善这些观察结果,引入了另一种激活函数。这种名为ReLU(整流线性单元)的激活函数现在大多数深度学习项目都更倾向于选择它。它对上述问题的敏感度大大降低,从而大大改善了训练过程。
它看起来像这样
ReLU. 来源链接:https://www.linkedin.com/pulse/activation-functions-neural-networks-juan-carlos-olamendy-turruellas
可以如下用代数表示
用CodeCogs做的(来自CodeCogs编辑器)[https://editor.codecogs.com/]
或者用简单的话来说,它对所有小于零的输入输出零;对于其他所有输入则输出 x。因此,对于所有小于或等于零的输入,它都会输出零。
聊聊稀疏这大大提高了稀疏性:现在,几乎有一半的神经元不再放电。这样,当神经元对模型预测能力的贡献不再那么重要时,就可以将它们关闭。
减少梯度消失现象这也有助于减少梯度消失的问题,因为梯度总是常数:例如,函数 f(x) = 0 的导数是 0,而 f(x) = x 的导数是 1。这样模型就能更快且更均匀地学习。
关于计算的需求此外,相比于 Sigmoid 和 Tanh 函数,ReLU 需要的计算资源更少(Jaideep, n.d.)。ReLU 实际上只需要执行一个最大值函数:max(0, x),当 x 小于 0 时返回 0,x 大于等于 0 时返回 x。这就是所说的 ReLU!
现在将这与上面给出的Sigmoid和tanh函数的公式进行比较:那些公式中含有指数。计算ReLU函数的输出要简单得多,也比计算指数函数的输出更省计算资源。单次计算时,这点差异不大,但要注意在深度学习中,这样的计算会进行很多次。因此,ReLU能节省不少计算资源。
ReLU激活函数也带来了一些特有的挑战这并不表示ReLU本身完全没有挑战,
- 首先,由于其在定义域上端无界的特性,ReLU可能会产生非常大的数值(Jaideep, n.d.)。理论上,无限输入会生成无限输出。
- 其次,你会遇到ReLU死亡神经元问题(Jaideep, n.d.)。如果一个神经元的权重趋向于零输出,它们可能再也无法恢复。特别是当你的网络初始化不当,或者数据归一化不佳时,因为最初的优化轮次会生成较大的权重波动。当太多神经元输出零时,最终你将得到一个“死掉”的神经网络——这就是ReLU死亡神经元问题。
- 再次,即使是较小的数值,甚至是负数,也可能有价值,因为它们有助于捕获数据集中的模式。然而,ReLU无法做到这一点,因为所有小于零的输出都被设置为零。
- 最后,从f(x)=0到f(x)=x的过渡点不够平滑。这将影响优化期间的损失景观,使其也不平滑。这可能会稍微影响模型的优化并减慢其收敛速度。
仅举几个例子。
幸运的是,新的激活函数已经被设计出来以克服这些问题,尤其是在非常大的或非常深的网络中。Swish 是这样的函数的一个典型例子;另一个例子是 Leaky ReLU。我们将在以后的文章中详细介绍这些内容。
softmax函数这里要简短介绍的是最后一个激活函数,即著名的Softmax 激活函数。该函数在另一篇文章中有更详细的介绍这里。
softmax可以表示为如下:
来源:ResearchGate
softmax函数是一种在机器学习和深度学习中常用的神奇工具,它能将一串数字转换成概率向量。
这可以这样用代数表达式来表示:
用 Codecogs 编辑器制作的
通常,我们在神经网络的最后一层使用此功能来计算该事件在n个不同事件中的概率分布情况。该函数的主要优势在于它可以处理多个类。
当我们比较sigmoid和softmax这两种激活函数时,它们会有不同的输出。
Sigmoid 输入值几个示例为:-0.5, 1.2, -0.1, 2.4
Sigmoid 输出结果 0.37,0.77,0.48,0.91
然而
SoftMax 输入值: -0.5, 1.2, -0.1, 2.4
SoftMax输出值:0.04,0.21,0.05,0.70
Sigmoid 输出的概率是独立的,彼此之间没有关联。此外,它们并不受总和为一的限制:0.37 + 0.77 + 0.48 + 0.91 = 2.53。这是因为 Sigmoid 模型对每个原始输出值进行独立处理。相比之下,Softmax 的输出则是相互关联的。Softmax 概率设计成总是总和为一:0.04 + 0.21 + 0.05 + 0.70 = 1.00。在这种情况下,如果我们想增加一个类别的概率,其他类别的概率必须相应减少,以保证总和不变。
如果您想了解更多关于 softmax 的内容,我强烈推荐我之前写的文章《softmax 激活函数与 Keras 的应用》点击这里查看我的文章。
摘要
在这篇博客中,我们探讨了一些当今的标准激活函数及其优点和可能的缺点。你现在应该能够决定使用哪个激活函数。不过,通常最好从ReLU开始;然后尝试tanh和Sigmoid;接下来可以尝试新的激活函数。这样,你可以通过实验找出哪个函数最适合。然而,注意你需要的资源,因为你可能无法尝试所有选项。
希望你今天从这篇文章中学到一些东西。任何评论、问题或建议我们都非常欢迎。谢谢你的阅读,祝你在机器学习和人工智能的研究道路上一帆风顺。
参考文献Panchal, S. (n.d.). 使用 sigmoid 函数有哪些好处?详见 https://stackoverflow.com/a/56334780
Majidi, A. (未注明日期). 使用 Sigmoid 函数的好处有哪些?来自 https://stackoverflow.com/a/56337905
沙尔玛, S. (2019年2月14日). 神经网络中的激活函数。访问日期:https://towardsdatascience.com/activation-functions-neural-networks-1cbd9f8d91d6
LeCun, Y., 博托, L., 奥尔, G. B., & 米勒, K. - -. (1998). 高效反向传播 (Gāoxiào fǎnxiàng chuǎn bābō). 计算机科学讲义 (Jìsuànjī kēxué jiǎngyì) , 9–50. doi:10.1007/3540494308_2
DaemonMaker(作者). (日期不详). 在深度神经网络中,ReLU相比Sigmoid函数有什么优势?来自 https://stats.stackexchange.com/a/126362
Jaideep. (日期不详)。ReLU 相比于 Sigmoid 函数,在深度神经网络中的优势有哪些?参见这个链接 https://stats.stackexchange.com/questions/126238/what-are-the-advantages-of-relu-over-sigmoid-function-in-deep-neural-networks
共同学习,写下你的评论
评论加载中...
作者其他优质文章