激活函数的建模原理
到目前为止,在隐藏层等一直使用激活函数,最初通过逻辑回归建立新网络,组合多个逻辑回归单元。这表明激活函数在神经网络构建中一直存在,且最初的网络构建方式与逻辑回归相关。实际上,激活函数的种类很多,使用其他激活函数可以使神经网络具备多样性,所以探索不同激活函数是很有必要的。
以需求预测为例,如根据价格、运输成本、营销材料等预测产品是否畅销,假设意识可能是二元的(要么意识到,要么没意识到),但实际上对产品(如T恤)的意识程度可能并非二元,可能存在不同程度的意识,如一点点意识到、非常意识到甚至完全随机扩散。所以不应简单将意识建模为二进制或估计意识概率,而应建模为介于0和1之间的数字,甚至可以是任何非负数,因为意识程度可以有各种非负取值。
以隐私相关为例,第二个隐藏单元的激活使用sigma函数,其值在0到1之间。若想让取值更大,可以换用不同的激活函数。 常见的激活函数是ReLU(修正线性单元)。若输入为Z,其函数特点是在Z小于等于0时,函数值为0;在Z大于0时,函数是一条45度的直线,即函数值等于Z,数学方程为GMZ = max(0, Z)。使用该函数后,激活值可以取零或任何非负值。虽然其名称(修正线性单元)的具体含义无需过于担心,这只是提出该函数的作者所起的名字,大多数深度学习领域的人更多参考GMZ这个表达式。
常用的激活函数除了ReLU,还有线性激活函数,即GMZ = Z。当使用线性激活函数时,若A是G-f-z(G-f-z 等于Z),那么A就等于W导 X加B,就好像没有激活函数的作用一样。所以有时人们会说不使用任何激活函数,但在课程中会表述为使用线性激活函数,而不是没有激活函数,若听到别人说不使用激活函数,通常指的就是线性激活函数。
利用这些激活函数可以构建丰富多样且强大的新网络。在为每个神经元构建新网络时,面临着选择使用哪种激活函数(如病态激活函数、ReLU激活函数、线性激活函数等)的问题,选择时候一定要注意分析。
如何选择激活函数
- 选择激活函数的概述:神经网络中的不同神经元可以选择不同的激活函数,上层(输出层)有上曾的激活函数,隐藏层有隐藏层的激活函数。
- 输出层激活函数的选择:
- 二元分类问题:如果是二元分类问题,即标签 y 只能取 0 或 1,通常最自然的选择是 sigmoid 激活函数。因为这样神经网络可以学习预测 y 等于 1 的概率,就如同在传统处理中所做的那样。所以建议在二元分类问题的输出层使用 sigmoid 激活函数。
- 回归问题:当处理回归问题时,例如预测明天地铁的情况与今天相比的变化,y 值可以是正也可以是负。在这种情况下,建议使用线性激活函数。因为对于线性激活函数,神经网络的输出 FX(经过激活函数处理后)可以取正值或负值,符合回归问题中 y 值可正可负的特点。
- 非负预测问题:若预测的值 y 只能取非负值,比如预测房子的价格(不会为负),最自然的选择是 ReLU(value)激活函数。因为 ReLU 激活函数的取值范围是非负的,即要么为 0,要么为正,能满足这类问题的需求。
- 总结:选择输出层的激活函数通常取决于想要预测的标签的性质,上述是选择输出层激活函数的常用指导方法。
- 隐藏层激活函数的选择:
- 现状:目前许多实践者在训练新网络时,隐藏层最常用的激活函数是 ReLU 激活函数。尽管最初描述新网络时使用的是 sigmoid 激活函数,在新网络发展早期,sigmoid 激活函数使用较多,但现在领域发展趋势是更多使用 ReLU,只有在二元分类问题的输出层才会使用 sigmoid 激活函数。
- 原因:
- 计算效率:ReLU 激活函数计算速度更快,它只需要计算 Max (0, Z),而 sigmoid 函数需要进行指数运算等,效率较低。
- 梯度问题:sigmoid 函数在曲线的两边(左边和右边)都是平坦的,当使用梯度下降法训练神经网络时,函数平坦的地方梯度很小,这会导致学习速度非常慢。虽然是对代价函数 J (W, b) 进行优化,但激活函数是计算的一部分,sigmoid 函数会使代价函数 J (W, b) 中有更多平坦且梯度小的地方,从而减慢学习速度。而 ReLU 函数只在左边部分平坦,使用 ReLU 激活函数可以使新网络学习速度更快一些。所以对于大多数从业者来说,隐藏层选择 ReLU 激活函数已成为最常见的选择。
- 总结激活函数选择建议:
- 输出层:二元分类问题用 sigmoid;y 值可能取负值的回归问题用线性激活函数;y 值只能取非负(正值或零)的情况用 ReLU。
- 隐藏层:建议将 ReLU 作为默认激活函数。例如在实现网络时,隐藏层的第一层、第二层等可以使用 ReLU 激活函数,而输出层根据具体问题选择合适的激活函数(如上述提到的 sigmoid、线性或 ReLU 等)。
- 其他激活函数:除了上述常用的激活函数,研究文献经常有,如 tanh 激活函数、Leaky ReLU 激活函数、Swish 激活函数等。每隔几年研究人员会提出一些有趣的新激活函数,有时它们能有更好的表现。例如在某些工作中,Leaky ReLU 激活函数的效果会比 ReLU 激活函数更好。但对于大多数应用场景,本视频中介绍的激活函数已经足够使用。如果想了解更多其他激活函数的信息,可以在互联网上查阅,在少数情况下,其他激活函数可能会更强大。所以做数据和模型研究的需要更多的研究数学和算法。
为什么不能仅使用线性激活函数
以需求预测为例,如果在神经网络的每个神经元都使用线性激活函数,那么这个大的神经网络本质上和线性回归没有区别。这就失去了使用神经网络的意义,因为它无法拟合比线性回归模型更复杂的关系和数据特征。
- 具体神经网络示例分析:
- 构建一个简单的神经网络示例,输入是一个数字,有一个隐藏单元(参数为
和
,输出
),第二层即输出层也只有一个单元(参数为
和
,输出
,也就是网络的输出
)。
- 当使用线性激活函数时,计算
,根据公式
,由于
,所以
。
- 接着计算,
,将
的表达式代入可得
。
- 进一步化简得到。令
,
,则
,这表明
是输入
的线性函数。
这就说明这个神经网络和直接使用线性回归模型是一样的。
- 从线性代数角度解释,一个线性函数的线性函数本身还是一个线性函数,所以即便神经网络有多个层,如果都使用线性激活函数,也不能计算更复杂的特征或学习更复杂的内容。
- 推广到一般情况:一般情况下,若神经网络有多层,隐藏层和输出层都使用线性激活函数,那么该模型的输出等同于线性回归;若隐藏层使用线性激活函数,输出层使用逻辑激活函数(如sigmoid函数),可以证明这个模型等价于逻辑回归。这意味着这样的神经网络无法实现比线性回归或逻辑回归更强大的功能,也就失去了使用神经网络的优势。
- 激活函数的选择建议:基于上述原因,不建议在神经网络的隐藏层使用线性激活函数,建议使用ReLU(value)激活函数,这样能使神经网络更好地工作,避免出现仅使用线性激活函数带来的局限性。
常用的几种激活函数公式
Sigmoid函数
- 表达式:
。
- 特点:
- 函数的值域在之间,能将任意实数映射到0到1的区间,可用于表示概率。
- 函数具有平滑性,处处可导,其导数为。
- 应用场景:常用于二分类问题的输出层,将输出值转换为概率,以表示属于某一类别的可能性。
Tanh函数(双曲正切函数)
- 表达式:
。
- 特点:
- 值域在之间,输出以0为中心,具有对称性。
- 也是平滑可导的,导数为。
- 应用场景:在一些需要将数据归一化到-1到1区间的场景中较为常用,例如在循环神经网络(RNN)和长短时记忆网络(LSTM)中有时会作为激活函数。
ReLU函数(修正线性单元)
- 表达式:。
- 特点: - 计算简单高效,只需要判断输入是否大于0。
- 能有效缓解梯度消失问题,当x>0时,导数恒为1。
- 缺点是当输入为负数时,导数为0,可能会导致神经元“死亡”,即该神经元在训练过程中不再更新。
- 应用场景:在多层感知机(MLP)、卷积神经网络(CNN)等各种神经网络中被广泛应用于隐藏层。
Leaky ReLU函数
- 表达式:,其中alpha是一个较小的常数,通常取0.01左右。
- 特点:
- 解决了ReLU函数在负半轴导数为0的问题,当x为负数时,仍有一个较小的梯度,避免神经元死亡。
- 与ReLU函数相比,计算量增加不大。
- 应用场景:在一些对ReLU函数改进的场景中使用,尤其是当模型出现神经元死亡现象时,Leaky ReLU可能会有更好的表现。
Softmax函数
- 表达式:对于一个n维向量,
。
- 特点:
- 将n维向量映射为一个概率分布,即输出的每个元素都在(0, 1)之间,且所有元素之和为1。
- 可以用于多分类问题,将模型的输出转换为每个类别的概率。
- 应用场景:常用于多分类问题的输出层,例如在图像分类任务中,用于表示图像属于各个类别的概率。