深度学习的核心思想是通过多层次的神经网络结构,逐步抽取和表示数据中的高级特征,从而实现对复杂数据模式的学习和识别。
神经网络结构: 深度学习使用多层次的神经网络,包括输入层、隐藏层和输出层。这些网络结构允许模型自动学习数据中的特征层次。
反向传播算法: 反向传播是一种优化算法,用于调整神经网络中连接权重,以使模型的预测结果更加准确。它通过计算损失函数对权重的梯度,并使用梯度信息来更新权重。
大规模数据和计算能力: 深度学习模型通常需要大量的数据来训练,以及强大的计算资源来进行复杂的计算。随着大数据和GPU等硬件的发展,深度学习在实际应用中取得了显著的进展。
预训练和迁移学习: 预训练模型可以在大规模数据上进行预训练,然后在特定任务上进行微调,从而加速模型训练和提高性能。这种迁移学习的方法在很多领域都取得了良好的效果。
激活函数是神经网络中的一个关键组件,它决定了神经元是否被激活(激活值大于某个阈值)并传递信息给下一层。激活函数引入非线性性质,使得神经网络能够表示更加复杂的函数关系。
1.Sigmoid函数(Logistic函数)
Sigmoid 函数将输入值压缩到 0 和 1 之间,曲线形状平滑,适合用于较浅的网络层或二元分类问题。然而,Sigmoid 函数在输入较大或较小的情况下容易出现梯度消失的问题,限制了其在深层网络中的应用。
Sigmoid函数的数学表达式为: f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x}} f(x)=1+e−x1 其中 x x x 是输入值, e e e 是自然对数的底。这个函数将任意实数映射到一个范围在 0 到 1 之间的值,具有如下特点:
- 当 x x x 趋近于正无穷大时, f ( x ) f(x) f(x) 趋近于 1;
- 当 x x x 趋近于正无穷小时, f ( x ) f(x) f(x) 趋近于 0;
- 在 x = 0 x=0 x=0 处, f ( x ) f(x) f(x) 的值为 0.5,即中间值。
Sigmoid函数也存在一些问题:
- 梯度消失: 在输入较大或较小的区域,Sigmoid函数的梯度接近于零,这会导致反向传播时梯度逐渐消失,影响深层网络的训练。
- 输出不是零中心: Sigmoid函数的输出在大部分情况下是正的,这可能导致在网络训练过程中的参数更新不均匀。
- 计算代价高: 计算Sigmoid函数的指数运算较为昂贵,可能影响网络的计算效率。
2.ReLU函数(Rectified Linear Unit)
ReLU函数在输入大于零时输出输入值本身,否则输出0。它简单且计算高效,在深度学习中广泛使用。但是,ReLU函数在负数区域输出为0,可能导致神经元"死亡",即不再激活,从而影响网络的训练。
ReLU函数的数学表达式为: f ( x ) = max ( 0 , x ) f(x)=\max(0,x) f(x)=max(0,x)其中, x x x 是输入值, f ( x ) f(x) f(x) 是激活后的输出值。具有如下特点:
- 当 x x x 大于等于 0 时, f ( x ) = x f(x) = x f(x)=x,即输出等于输入;
- 当 x x x 小于 0 时, f ( x ) = 0 f(x)=0 f(x)=0,即输出为零。
ReLU函数的优势包括:
- 非线性: 尽管ReLU在负数区域输出为零,但在正数区域仍然是非线性的,能够引入神经网络的非线性能力,使其能够表示更加复杂的函数关系。
- 计算高效: ReLU的计算非常简单,只需要比较输入值和零的大小,相对于其他一些激活函数,计算成本更低。
- 避免梯度消失: 在正数区域,ReLU函数的梯度为1,不会出现梯度消失问题,有助于在深层网络中传播梯度。
ReLU函数存在的一些问题:
- 死亡神经元问题: 当某个神经元在训练过程中始终输出为负数,其梯度为零,导致它的权重无法更新,即"死亡"。这种情况下,神经元将不再对网络的学习产生影响;
- 不是零中心: 当输入为负数时,ReLU的输出为零,这可能导致网络的激活分布不是零中心,可能对训练造成一些影响。
3.Leaky ReLU
Leaky ReLU是 ReLU 的变体,允许负数区域的斜率不为零,从而避免了死亡神经元问题。Leaky ReLU在负数区域保留一些激活,有助于减轻梯度消失问题。
Leaky ReLU函数的数学表达式为: f ( x ) = { x if x ≥ 0 b x if x ≤ 0 f(x) = \begin{cases} x &\text{if } x \geq 0 \\ bx &\text{if } x \leq 0 \end{cases} f(x)={xbxif x≥0if x≤0其中, x x x 是输入值,b 是一个小于 1 的超参数,通常在训练过程中固定为一个较小的正数,如0.01。具有如下特点:
- 当 x x x 大于等于零时, f ( x ) = x f(x)=x f(x)=x,即输出等于输入,与普通的ReLU相同;
- 当 x x x 小于零时, f ( x ) = a x f(x)=ax f(x)=ax,即引入一个小的斜率 b 来保证负数区域不完全为零。
Leaky ReLU的优势包括:
- 避免死亡神经元问题: 引入了一个小的斜率 aa,使得在负数区域仍然具有非零的输出,从而减轻了死亡神经元问题。
- 计算简单: Leaky ReLU的计算非常简单,与ReLU相似,只需要比较输入值和零的大小。
Leaky ReLU 存在的一些问题:
-
需要调参: 超参数 b 需要手动设定,虽然通常取较小的值(如0.01)能够在大多数情况下工作,但仍然需要调参。
-
不自适应: Leaky ReLU的斜率在负数区域是固定的,而PReLU则能够通过学习自适应地确定斜率
4.PReLU(Parametric ReLU)
PReLU是 Leaky ReLU 的一种扩展形式,它引入了一个可学习的参数,允许网络自动学习在负数区域的斜率,从而更好地适应不同的数据分布。
PReLU函数的数学表达式为: f ( x ) = { x if x ≥ 0 a x if x ≤ 0 f(x) = \begin{cases} x &\text{if } x \geq 0 \\ ax &\text{if } x \leq 0 \end{cases} f(x)={xaxif x≥0if x≤0其中, x x x 是输入值,a 是一个可学习的参数,通常在训练过程中通过反向传播进行更新。当 a 为 0 时,PReLU退化为普通的ReLU函数。当 a 大于 0 时,PReLU在负数区域引入了一个斜率,使得负数值也能够有非零的输出,从而避免死亡神经元问题。
PReLU函数的优势包括:
- 自适应斜率: PReLU通过学习参数 a 来自适应地确定负数区域的斜率,可以根据数据的分布和任务的需求来调整激活函数的形状。
- 减轻死亡神经元问题: 通过在负数区域引入斜率,PReLU有助于激活那些在训练过程中可能变得非激活的神经元,从而减轻了死亡神经元问题。
- 提高模型表达能力: PReLU的自适应斜率使得神经网络能够学习更加复杂的函数关系,提高了模型的表达能力。
PReLU函数存在的一些问题:
- 需要更多的参数进行学习,可能会增加模型的复杂度和训练时间。
Leaky ReLU 和 PReLU 都在负数区域引入了斜率,从而在一定程度上改进了ReLU的问题。Leaky ReLU的斜率通常是固定的超参数,而PReLU则通过学习参数来自适应地确定斜率。选择使用哪种激活函数取决于具体问题的需求和实验结果。
5.Tanh函数(双曲正切函数)
Tanh 函数将输入值映射到 -1 和 1 之间,类似于Sigmoid函数,但范围更大。它在某些情况下能够更好地处理输入数据的对称性,但也会存在梯度消失问题。
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其中, x x x 是输入值, e e e 是自然对数的底。Tanh函数将任意实数映射到范围在 -1 到 1 之间的值,具有如下特点:
- 当 x x x 趋近于正无穷大时, f ( x ) f(x) f(x) 趋近于 1;
- 当 x x x 趋近于正无穷小时, f ( x ) f(x) f(x) 趋近于 -1;
- 在 x = 0 x=0 x=0 处, f ( x ) f(x) f(x) 的值为 0。
Tanh 函数的优势包括:
- 零中心性: Tanh函数的输出在大部分情况下是零中心的,相对于ReLU等激活函数,更有助于训练稳定性;
- 非线性: Tanh函数是非线性的,能够引入神经网络的非线性能力,使其能够表示更加复杂的函数关系。
Tanh函数存在的一些问题:
- 梯度消失: 在输入较大或较小的区域,Tanh函数的梯度接近于零,可能导致梯度消失问题,特别是在深层网络中。
6. Swish函数
Swish 函数是一种类似于 ReLU 的激活函数,它将输入值与 Sigmoid 函数的乘积作为输出。
Swish函数的数学表达式如下: f ( x ) = x ⋅ σ ( β x ) f(x)=x\cdot \sigma(\beta x) f(x)=x⋅σ(βx)其中, x x x 是输入值, σ σ σ 是Sigmoid函数, β β β 是一个可调参数。Swish函数通过在输入值上引入Sigmoid函数,实现了在正数区域保留线性特性,同时在负数区域引入非线性的特性。
Swish函数的特点包括:
- 非线性性质: 在负数区域,Swish 函数的输出呈现非线性特性,有助于引入神经网络的非线性能力,使其能够表示更加复杂的函数关系。
- 自动缩放: 当输入为较大的正数时,Swish 函数趋近于线性,不会出现梯度爆炸问题。这有助于模型的稳定性。
- 适用范围广: Swish 函数在一些任务中表现出色,尤其在较大的模型中(如深度神经网络)可能表现良好。
Swish函数存在的一些问题:
- 计算开销: Swish函数的计算相对于ReLU等简单激活函数更复杂,需要涉及Sigmoid函数的计算。
- 不适用于所有情况: 尽管在某些情况下表现出色,Swish函数并不一定在所有任务和网络结构中都能取得最佳性能。
7. ELU(Exponential Linear Unit)
ELU是一种具有平滑非线性特性的激活函数。在正数区域,ELU函数与ReLU相似;而在负数区域,它的曲线更平滑,有助于减轻梯度消失问题。此外,ELU在负数区域的输出不仅不是0,还具有一个负值,有助于缓解神经元死亡问题。
ELU的数学表达式为: f ( x ) = { x if x ≥ 0 α ( exp ( x ) − 1 ) if x ≤ 0 f(x) = \begin{cases} x &\text{if } x \geq 0 \\ \alpha(\exp (x)-1) &\text{if } x \leq 0 \end{cases} f(x)={xα(exp(x)−1)if x≥0if x≤0
其中, x x x 是输入值, α α α 是一个可调参数,通常取一个较大的正数,如1。ELU函数通过在负数区域引入指数函数,实现了在负数区域具有非线性的平滑特性。
ELU函数的优势有:
- 平滑非线性性质: 在负数区域,ELU函数的输出是平滑的非线性特性,相对于ReLU等函数,能够更好地拟合复杂的函数关系。
- 避免死亡神经元问题: ELU在负数区域不会输出零,因此能够避免死亡神经元问题。
- 零中心性: ELU函数在大部分情况下是零中心的,有助于训练稳定性。
- 自适应斜率: 通过调整参数 α α α 的值,可以自适应地调整负数区域的斜率,使得ELU能够适应不同的数据分布和任务需求。
ELU 存在的一些问题:
- 计算开销: ELU函数的计算相对于ReLU等简单激活函数较为复杂,涉及指数函数的计算。
- 参数调整: 参数 α α α 的选择可能需要进行调参,不同的数据和任务可能需要不同的参数值。
8.SELU(Scaled Exponential Linear Unit)
SELU是ELU的扩展,它在一定条件下能够使得网络在前向传播时自我规范化。这意味着在使用SELU激活函数时,网络的每一层的输出的均值和方差能够保持稳定。这一性质有助于训练更深的网络,而无需过多的批标准化等技巧。
SELU函数的数学表达式如下: f ( x ) = λ { x if x ≥ 0 β ( exp ( x ) − 1 ) if x ≤ 0 f(x) =\lambda \begin{cases} x &\text{if } x \geq 0 \\ \beta (\exp (x)-1) &\text{if } x \leq 0 \end{cases} f(x)=λ{xβ(exp(x)−1)if x≥0if x≤0其中, x x x 是输入值, β \beta β 是一个超参数(通常设置为1.6733), λ λ λ 是一个超参数(通常设置为1.0507)。SELU函数通过引入尺度参数 λ λ λ,使得输出值在正数区域逐渐缩放,从而实现网络自我规范化。
SELU函数的特点和优势包括:
- 自我规范化: 在一定条件下,使用SELU激活函数可以使得每一层的输出的均值和方差保持稳定,从而减轻梯度爆炸和梯度消失问题。
- 允许深层网络: 由于自我规范化的特性,SELU函数允许构建更深的神经网络,无需使用复杂的正则化技巧,如批标准化。
- 默认初始化: 在一些特定条件下,SELU激活函数使用零均值和单位方差的初始化可以保持自我规范化的特性。
SELU函数 存在的问题:
- 不适用于所有情况: SELU函数在某些情况下表现出色,但并不一定在所有任务和网络结构中都能取得最佳性能。
- 需要满足条件: 自我规范化的特性需要满足一定的条件,包括输入数据的分布和权重的初始化方式等。
9.Maxout
Maxout函数是一种通用的激活函数,它不是像ReLU或Sigmoid那样固定的形式,而是一种更为灵活的结构。Maxout函数的主要思想是让每个神经元学习多个线性函数的最大值,从而能够逼近更加复杂的非线性函数。Maxout可以视为ReLU和线性激活函数的泛化,它可以学习各种形状的非线性函数。然而,Maxout的参数量较大,可能需要更多的参数调整。
Maxout函数的数学表达式如下: f ( x ) = max ( w 1 T x + b 1 , w 2 T x + b 2 ) f(x) = \max(w_1^Tx+b_1,w_2^Tx+b_2) f(x)=max(w1Tx+b1,w2Tx+b2)其中, x x x 是输入向量, w 1 , w 2 w_1,w_2 w1,w2 是权重向量, b 1 , b 2 b_1,b_2 b1,b2 是偏置。。Maxout函数中有两个分支,每个分支都由一个线性变换 w T x + b w^Tx+b wTx+b 组成,然后选择两者中的最大值作为输出。Maxout函数可以扩展到具有更多分支的情况。
Maxout函数的特点和优势包括:
- 灵活性: Maxout函数允许每个神经元学习多个线性函数的最大值,因此在逼近各种不同形状的非线性函数时具有灵活性。
- 适应性: 每个分支都可以学习数据的不同特征,从而在不同的输入区域自适应地选择最佳的线性函数。
- 抗过拟合: Maxout网络通常具有更多的参数,这有助于防止过拟合,尤其是在训练数据有限的情况下。
Maxout 存在的一些问题:
- 参数量大: Maxout网络的参数量较大,可能需要更多的训练数据和计算资源来训练。
- 计算成本: Maxout函数的计算成本较高,因为每个神经元有多个分支,每个分支都需要进行线性变换和比较操作。
- 复杂性: Maxout网络的结构较为复杂,可能需要更多的调参和实验来找到最佳的网络结构。
10.Softmax函数
Softmax函数常用于多分类问题的输出层,将一组原始分数(也称为"logits")转化为表示各类别概率的概率分布。Softmax函数能够将任意实数值映射到一个范围在0到1之间,并且保证所有类别的概率之和为1。
Softmax函数的数学表达式如下: softmax ( x i ) = e x i ∑ j = 1 N e x j \text{softmax}{(x_i)}=\frac{e^{x_{i}}}{\sum_{j=1}^{N}e^{x_j}} softmax(xi)=∑j=1Nexjexi其中, x i x_i xi 是原始分数中的第 i i i 个元素, N N N 是类别的数量, e e e 是自然对数的底。Softmax函数将每个原始分数进行指数化,并将指数化后的值除以所有指数化值的和,以获得每个类别的概率。
Softmax函数的特点和应用包括:
- 概率分布: Softmax函数的输出是一个概率分布,对于多类别分类问题,每个类别的输出表示为属于该类别的概率。
- 归一化: Softmax函数将原始分数进行指数化和归一化,使得网络的输出具有一定的可解释性和意义。
- 多类别分类: Softmax函数通常用于多类别分类问题,例如图像识别、文本分类等。
Softmax函数存在的一些问题:
- 数值稳定性: 当原始分数较大时,指数运算可能导致数值溢出问题。为了提高数值稳定性,通常会在计算Softmax时减去分数中的最大值。
- 互斥假设: Softmax函数假设每个样本只属于一个类别,不适用于多标签分类问题。
- 类别数限制: Softmax函数在处理大量类别时可能会引入计算和存储的问题,特别是在输出层的类别数量较大时。
11.GELU
GELU 在正数区域类似于 ReLU,在负数区域则具有平滑的 S 形曲线。GELU 在一些任务上表现出色,并且相对简单,没有额外的超参数。结合了线性和非线性特性,同时在计算效率和性能之间取得了一定的平衡。GELU函数的设计旨在尝试克服ReLU等函数的一些问题,如梯度饱和和死亡神经元问题。
GELU函数的数学表达式如下: GELU ( x ) = 1 2 x ( 1 + tanh ( 2 π ( x + 0.044715 x 3 ) ) ) \text{GELU}(x)=\frac{1}{2}x(1+\tanh (\sqrt{\frac{2}{\pi}}(x+0.044715x^{3}))) GELU(x)=21x(1+tanh(π2 (x+0.044715x3)))其中, x x x 是输入值, t a n h tanh tanh 是双曲正切函数。GELU函数的形式结合了线性函数和双曲正切函数,使得在输入的正负两个区域都有非线性的输出。
GELU函数的特点和优势包括:
- 平滑非线性性质: GELU函数在整个输入范围内都有非线性的输出,相对于ReLU等函数,能够更好地拟合复杂的函数关系。
- 减轻梯度饱和问题: GELU函数在输入为正数区域具有线性的输出,能够减轻梯度饱和问题,有助于提高训练效率。
- 避免死亡神经元问题: GELU函数在负数区域也具有非零输出,能够避免死亡神经元问题。
- 计算效率: 相对于一些复杂的激活函数,GELU的计算相对较快,特别是与Sigmoid和双曲正切等函数相比。
GELU函数存在的问题:
- 可能在某些情况下不如其他激活函数表现出色,具体效果可能会因问题的性质和数据分布而有所不同。