文章目录
1. 为什么需要非线性激活函数?
⾮线性激活函数在神经网络中的作⽤非常重要,主要有以下几个原因:
-
增加模型的表达能⼒:如果神经网络中使⽤线性激活函数(如线性恒等激活函数),那么整个网络将等效于单个线性变换。这意味着即使有多层网络,也只能学习线性关系,限制了模型的表达能⼒。⾮线性激活函数可以引⼊⾮线性性质,使得神经网络能够学习复杂的函数关系。
-
模型逼近能⼒:⾮线性激活函数使得神经网络能够逼近任意复杂的函数,这是著名的⼯数近似定理的基础之⼀。这意味着神经网络在⼀定规模的情况下,可以逼近任何连续函数,只要有足够多的隐藏单元。
-
特征提取:⾮线性激活函数有助于提取和学习数据中的有⽤特征。在深度学习中,底层隐藏单元可以学习检测数据的低级特征,⽐如边缘、纹理等,⽽随着层次的加深,隐藏单元可以进⼀步组合这些低级特征,从⽽学习更高级别的特征。
-
解决梯度消失问题:⾮线性激活函数可以帮助缓解梯度消失问题,这是在深度神经网络中训练时常出现的问题。线性激活函数会导致梯度在反向传播过程中不断缩⼩,从⽽限制了深层网络的学习能⼒。⾮线性激活函数使得梯度可以在网络中传播,有助于更有效地训练深度网络。
常⻅的⾮线性激活函数包括sigmoid、ReLU(Rectified Linear Unit)、tanh(双曲正切函数)等,它们在不同情境下被应⽤,具有不同的特性。选择适当的激活函数通常依赖于特定任务和神经网络的架构。
2. 常⻅的激活函数及图像
以下是一些常见的激活函数及其图像:
- Sigmoid激活函数:
- 公式: f ( x ) = 1 1 + e − x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+e−x1
- 图像:Sigmoid函数的输出范围在0到1之间,呈S形曲线,常用于二元分类问题。
-
ReLU (Rectified Linear Unit) 激活函数:
- 公式: f ( x ) = max ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x)
- 图像:ReLU函数在
x
>
0
x>0
x>0时输出
x
x
x,在
x
≤
0
x\leq0
x≤0时输出0,是深度学习中最常用的激活函数。
-
Leaky ReLU激活函数:
- 公式: f ( x ) = { x , if x > 0 α x , if x ≤ 0 f(x) = \begin{cases}x, & \text{if } x > 0\\ \alpha x, & \text{if } x \leq 0\end{cases} f(x)={x,αx,if x>0if x≤0,其中 α \alpha α是一个小的正数(通常很小,如0.01)。
- 图像:Leaky ReLU与ReLU类似,但对于
x
≤
0
x\leq0
x≤0时有一个小的斜率,以解决ReLU可能出现的神经元"死亡"问题。
-
Tanh(双曲正切函数)激活函数:
- 公式: f ( x ) = e x − e − x e x + e − x f(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}} f(x)=ex+e−xex−e−x
- 图像:Tanh函数在
x
>
0
x>0
x>0时接近1,在
x
<
0
x<0
x<0时接近-1,中间在0附近有一个过渡,输出范围在-1到1之间。
-
Softmax激活函数(通常用于多类别分类):
- 公式: f ( x ) i = e x i ∑ j = 1 n e x j f(x)_i = \frac{e^{x_i}}{\sum_{j=1}^{n} e^{x_j}} f(x)i=∑j=1nexjexi,其中 x i x_i xi是输入向量中的第 i i i个元素。
- 图像:Softmax函数将一组输入转化为概率分布,通常用于多类别分类问题。
这些激活函数在神经网络中扮演不同的角色,根据具体任务和网络结构的需求选择适当的激活函数是很重要的。
3. 激活函数有哪些性质?
激活函数在神经网络中具有多种性质,这些性质在选择和设计激活函数时都很重要。以下是一些常见的激活函数性质:
-
非线性性:激活函数是非线性的,允许神经网络学习复杂的非线性关系。这是激活函数最基本的性质,区别于线性函数。
-
可微性:大多数情况下,激活函数应该是可微的,因为在反向传播(用于训练神经网络)中需要计算梯度。可微性允许我们计算梯度,进而进行参数的更新。
-
单调性:单调性表示激活函数的输出随输入的增加而单调递增或单调递减。这有助于简化网络的学习过程。
-
有界性:一些激活函数在输入的负无穷和正无穷处有上下界,有界性有助于限制神经元的输出范围,使得梯度稳定,有助于训练。
-
饱和性:饱和性指的是激活函数在某些输入范围内,导数非常小,接近于零,这会导致梯度消失问题。一些激活函数如Sigmoid和Tanh在输入较大或较小时容易出现饱和性,而ReLU等激活函数部分解决了这个问题。
-
连续性:激活函数通常应该是连续的,以便能够计算梯度。不连续的激活函数可能导致数值不稳定性。
-
可微性和次可微性:可微性是指激活函数的导数存在。有些激活函数(如ReLU)在某些点上不可微,但通常可微性是一个重要的性质。次可微性是指激活函数的导数也是可微的,这有助于保持梯度的稳定性。
-
输出范围:不同激活函数的输出范围不同。例如,Sigmoid的输出范围在0到1之间,Tanh的输出范围在-1到1之间,而ReLU的输出范围为0到正无穷。输出范围的选择取决于具体的任务需求。
这些性质对于选择适当的激活函数以及了解神经网络的行为非常重要。不同的性质适用于不同的情况,因此在设计和训练神经网络时需要仔细考虑激活函数的选择。
4. 如何选择激活函数?
选择适当的激活函数是神经网络设计的重要组成部分,它可以影响网络的学习能力和训练效果。以下是一些建议和指导,帮助你选择合适的激活函数:
-
任务需求:首先,考虑你的任务类型。不同的任务可能需要不同类型的激活函数。例如,对于二元分类问题,Sigmoid函数通常是一个好选择,而对于多类别分类问题,Softmax函数可能更合适。对于回归问题,线性激活函数可能足够。
-
非线性性:神经网络需要至少一个非线性激活函数,以便能够学习复杂的非线性关系。因此,避免使用线性激活函数,如恒等函数。
-
梯度消失问题:如果你的网络很深,考虑使用一些不容易导致梯度消失问题的激活函数。ReLU和其变种(如Leaky ReLU)通常在这方面效果较好,因为它们在正区间不饱和,梯度较大。
-
输出范围:考虑你的激活函数的输出范围是否适合你的任务。Sigmoid和Tanh激活函数的输出在有界范围内,适用于某些场景,而ReLU等激活函数的输出范围在某种程度上是无界的。
-
计算效率:一些激活函数的计算成本比其他的要高。ReLU是计算效率较高的激活函数,因为它只需要一个简单的阈值比较。考虑网络的规模和性能需求,选择适当的激活函数。
-
经验和实验:根据以往的经验和实验,一些激活函数在特定类型的问题上表现更好。因此,查阅相关文献和尝试不同的激活函数,可以帮助你找到最适合你的问题的激活函数。
-
集成多种激活函数:有时,将不同的激活函数结合在一起可以带来好处。例如,使用深度残差网络(ResNet)时,每个残差块内部可以包括多种激活函数,以综合它们的性质。
-
正则化:某些激活函数本身具有正则化性质,如Dropout或Batch Normalization。这些激活函数可以帮助提高网络的泛化性能。
最终的选择可能需要通过实验来确定,包括尝试不同的激活函数并监测其对模型性能的影响。在深度学习中,激活函数通常被认为是一种超参数,需要进行调优以获得最佳的性能。
5. 使用Relu激活函数的优点?
使用ReLU(Rectified Linear Unit)激活函数的主要优点包括:
-
非线性:ReLU是一个非线性激活函数,可以使神经网络模型学习复杂的非线性关系,因此适用于各种复杂的任务。
-
梯度稳定性:相对于某些传统的激活函数(如Sigmoid和Tanh),ReLU在正区间(即 x > 0 x>0 x>0)是非常平稳的,导数为1,不会引起梯度消失问题。这有助于更有效地进行梯度下降优化,特别是在深度神经网络中。
-
计算效率:ReLU的计算非常简单,它只需要进行一个阈值比较。相比于某些激活函数,如Sigmoid和Tanh,它的计算更加高效,特别在大型神经网络中的训练速度更快。
-
稀疏激活性:ReLU在负区间上输出为0,这意味着神经元可以变得稀疏,即在某些情况下,只有一部分神经元被激活,从而降低模型的复杂性,减少过拟合的风险。
-
抑制过度激活:ReLU可以抑制某些神经元的过度激活问题,因为当输入值为负时,输出一直为零,防止神经元发生过度激活,有助于提高模型的泛化能力。
-
用于深度网络:ReLU在深度学习中非常受欢迎,因为它有助于缓解梯度消失问题,允许更深的神经网络能够更好地训练。
尽管ReLU具有许多优点,但它也有一些缺点,如容易出现"神经元死亡"问题(在负区间上输出恒定为零),因此它的变种,如Leaky ReLU和Parametric ReLU(PReLU),已经被提出来解决这些问题。选择激活函数通常依赖于具体的任务需求和网络结构。
6. Softmax 定义及作⽤
Softmax函数是一种常用的激活函数,通常用于多类别分类问题,用于将原始分数(或称为logits)转化为类别概率分布。Softmax函数的定义如下:
给定输入向量 z = ( z 1 , z 2 , … , z n ) z = (z_1, z_2, \ldots, z_n) z=(z1,z2,…,zn),其中 z i z_i zi 表示第 i i i 个类别的原始分数或得分,Softmax函数将这些分数转化为类别的概率分布 p = ( p 1 , p 2 , … , p n ) p = (p_1, p_2, \ldots, p_n) p=(p1,p2,…,pn),其中:
p i = e z i ∑ j = 1 n e z j ,对于 i = 1 , 2 , … , n p_i = \frac{e^{z_i}}{\sum_{j=1}^n e^{z_j}} \text{,对于 } i = 1, 2, \ldots, n pi=∑j=1nezjezi,对于 i=1,2,…,n
Softmax函数的作用包括:
-
将分数转化为概率:Softmax将原始分数转化为每个类别的概率,使得它们之和等于1。这使得模型的输出可以被解释为每个类别的概率,通常用于多类别分类问题,如图像分类、语音识别等。
-
多类别分类:Softmax是多类别分类问题中最常用的激活函数。它将模型的输出转化为一个概率分布,然后可以使用交叉熵损失函数来衡量模型的预测与实际标签之间的差异,从而进行训练和优化。
-
输出类别选择:Softmax函数将输入分数映射到概率分布后,可以选择概率最高的类别作为模型的最终预测结果。这对于多类别分类任务中的类别选择非常有用。
-
反向传播和训练:由于Softmax函数的可微性,可以使用反向传播算法来计算梯度,从而训练神经网络模型。这使得模型可以根据损失函数的梯度来不断调整参数,提高分类性能。
总之,Softmax函数是一种用于多类别分类的关键工具,它将原始分数映射到概率分布,使得神经网络可以进行有效的多类别分类和训练。
7. 交叉熵代价函数定义及其求导推导
交叉熵代价函数(Cross-Entropy Cost Function),也称为对数损失函数(Log Loss),通常用于衡量分类模型的性能,尤其在多类别分类问题中。假设我们有一个分类问题,其中有 n n n 个类别,交叉熵代价函数的定义如下:
假设我们有一个真实的标签分布 y = ( y 1 , y 2 , … , y n ) y = (y_1, y_2, \ldots, y_n) y=(y1,y2,…,yn),其中 y i y_i yi 表示样本属于第 i i i 个类别的概率(通常为0或1,一个类别为1,其余类别为0)。同时,我们有一个模型的预测概率分布 p = ( p 1 , p 2 , … , p n ) p = (p_1, p_2, \ldots, p_n) p=(p1,p2,…,pn),其中 p i p_i pi 表示模型预测样本属于第 i i i 个类别的概率。
交叉熵代价函数的定义如下:
H ( y , p ) = − ∑ i = 1 n y i log ( p i ) H(y, p) = -\sum_{i=1}^n y_i \log(p_i) H(y,p)=−i=1∑nyilog(pi)
其中 H ( y , p ) H(y, p) H(y,p) 表示真实标签分布 y y y 和模型预测分布 p p p 之间的交叉熵。这个损失函数测量了两个分布之间的差异,用于衡量模型的性能。交叉熵越小,模型的预测越接近真实标签分布,表示模型性能越好。
为了求解交叉熵代价函数的导数,我们可以对 H ( y , p ) H(y, p) H(y,p) 分别对 p i p_i pi 求导。假设 H i H_i Hi 表示 i i i 个类别的交叉熵损失:
H i ( y , p ) = − y i log ( p i ) H_i(y, p) = -y_i \log(p_i) Hi(y,p)=−yilog(pi)
然后,对 H i H_i Hi 对 p i p_i pi 求导:
∂ H i ∂ p i = − y i p i \frac{\partial H_i}{\partial p_i} = -\frac{y_i}{p_i} ∂pi∂Hi=−piyi
接下来,我们可以使用链式法则计算 H H H 对 p i p_i pi 的导数:
∂ H ∂ p i = ∑ j = 1 n ∂ H ∂ H j ∂ H j ∂ p i \frac{\partial H}{\partial p_i} = \sum_{j=1}^n \frac{\partial H}{\partial H_j} \frac{\partial H_j}{\partial p_i} ∂pi∂H=j=1∑n∂Hj∂H∂pi∂Hj
由于 H j H_j Hj 只与 p j p_j pj 有关,我们可以写成:
∂ H ∂ p i = ∂ H ∂ H i ∂ H i ∂ p i \frac{\partial H}{\partial p_i} = \frac{\partial H}{\partial H_i} \frac{\partial H_i}{\partial p_i} ∂pi∂H=∂Hi∂H∂pi∂Hi
将之前的结果代入:
∂ H ∂ p i = − y i p i \frac{\partial H}{\partial p_i} = -\frac{y_i}{p_i} ∂pi∂H=−piyi
所以,交叉熵代价函数对于模型输出分布 p i p_i pi 的导数是 − y i p i -\frac{y_i}{p_i} −piyi。这对于反向传播算法非常重要,因为它使我们能够计算出模型输出对于损失函数的梯度,从而进行参数的更新。