29、自然语言理解与生成中的深度学习:梯度下降与激活函数解析

自然语言理解与生成中的深度学习:梯度下降与激活函数解析

1. 线性回归与梯度下降编码

在开始深入探讨梯度下降之前,我们先来看看相关的代码部分。首先是计算平方误差和的代码片段,它为后续的计算奠定了基础。

接下来,我们进入核心部分——计算梯度下降。使用误差函数,我们可以判断是否需要更新直线以得到最佳拟合直线,但具体如何更新直线是我们接下来要探讨的内容。

1.1 梯度下降的基本概念

为了更好地理解梯度下降,我们借助一个三维图形。这个图形展示了斜率 (m)、(y) 截距 (b) 和误差的所有可能值。在这个图形中,(x) 轴代表斜率值,(y) 轴代表 (y) 截距,(z) 轴代表误差值。我们的目标是找到误差最小的点,这个点在机器学习中被称为局部最小值。

在简单数据集里,通常只有一个局部最小值;而在复杂的高维数据集中,可能会存在多个局部最小值。此时,可能需要进行二阶优化来选择更合适的局部最小值以提高准确性,但这里暂不涉及二阶优化。

当我们从图形中直观地找到误差最小的点时,也就得到了理想的 (y) 截距 (b) 和斜率 (m) 的值。将这些值代入 (y = mx + c) 方程,就能得到最佳拟合直线。

1.2 如何到达最小误差点

虽然我们能从图形中看到最小误差点,但如何到达这个点呢?答案是计算梯度。梯度也被称为斜率,但这里的斜率与 (m) 不同。梯度表示的是朝着最小误差点的方向的斜率。

我们从初始的 (b) 和 (m) 值开始,在每次迭代中,通过计算梯度和误差来更新 (b) 和 (m) 的值,逐步向最小误差点靠近。在三维图形中,就像是从曲线的顶部开始,每次迭代都根据梯度的方向向下移动,直到到达曲线的底部。

1.3 梯度下降的计算公式

梯度下降的计算公式实际上是误差函数的偏导数。我们对平方误差和方程分别关于 (m) 和 (b) 求偏导数,得到两个方程,通过这两个方程可以更新 (b) 和 (m) 的值。

需要注意的是,误差函数必须是可微的,即要有偏导数,否则无法计算梯度。另外,这里使用的是线性方程,如果处理高维数据,在知道误差函数的情况下,也可以使用非线性函数。

1.4 学习率的重要性

在代码中,我们将 (m) 梯度和 (b) 梯度乘以学习率。学习率是一个重要的超参数,选择时需要谨慎。如果学习率过高,模型可能根本无法训练;如果学习率过低,训练时间会很长,并且可能会出现过拟合的情况。

1.5 梯度下降的类型

梯度下降有多种类型,如带有动量的梯度下降、Adagrad、Adam 等。如果你想深入了解,可以参考这个链接: https://www.analyticsvidhya.com/blog/2017/03/introduction-to-gradient-descent-algorithm-along-its-variants/

以下是一个简单的流程图,展示了梯度下降的基本流程:

graph TD;
    A[初始化 m 和 b] --> B[计算误差];
    B --> C[计算梯度];
    C --> D[更新 m 和 b];
    D --> E{是否达到最小误差或最大迭代次数};
    E -- 否 --> B;
    E -- 是 --> F[输出最佳 m 和 b];

2. 激活函数

2.1 激活函数的作用

在人工神经网络(ANN)中,激活函数起着关键作用。在讨论感知机时,我们知道神经网络会根据是否超过某个阈值来输出 1 或 0,而这个计算阈值并根据阈值生成输出的机制就是由激活函数完成的。

激活函数能够提供介于 0 和 1 之间的值,结合阈值,我们可以生成最终的输出值 1 或 0。例如,当阈值为 0.777,激活函数输出为 0.457 时,最终输出为 0;当激活函数输出为 0.852 时,最终输出为 1。

2.2 激活函数在 ANN 中的工作原理

在神经网络中,每个神经元都有特定的权重和输入值,将它们求和得到加权和。当这些加权和通过非线性函数时,该非线性函数会激活一定数量的神经元,以完成复杂任务的输出。这个使用非线性数学函数激活神经元的过程就是激活函数或传递函数。

激活函数的目的是在神经网络中引入非线性,原因在于没有非线性,ANN 无法产生解决复杂任务所需的复杂行为。在深度学习中,大多数情况下使用非线性激活函数来获得复杂行为,同时也希望以非线性方式将输入映射到输出。

2.3 ANN 的结构与激活函数的关系

ANN 的结构可以分为三个部分:
- 架构 :决定神经元和层的排列方式。
- 活动 :涉及神经元之间如何相互响应以产生复杂行为,激活函数就属于这一部分。
- 学习规则 :当 ANN 生成输出时,需要在每个时间戳更新权重以优化输出。

如果不使用非线性激活函数,对于复杂任务,ANN 无法提供大量有用的输出。因为使用线性激活函数时,多层 ANN 的输出只是各层输入值、权重和偏置的总和,相当于将多层 ANN 的行为转化为单层 ANN,这种行为对于解决复杂任务没有帮助。

2.4 激活函数的相关组成部分

我们将介绍与激活函数相关的三个部分:
- 传递势函数 :聚合输入和权重,通常是输入与连接权重的内积求和,也可以使用其他数学方程,如多二次函数。
- 激活函数 :以传递势函数的输出为输入,应用非线性数学变换。通常使用可微的非线性函数,如常用的 sigmoid 函数。
- 阈值函数 :根据激活函数的输出,决定是否激活神经元。

2.5 常用的激活函数

有多种激活函数可供选择,这里介绍三种在深度学习中广泛使用的激活函数:
| 激活函数 | 特点 | 问题 |
| ---- | ---- | ---- |
| Sigmoid | 将输入压缩到 [0, 1] 范围内,产生 S 形曲线,可解释为神经元的 firing rate | 梯度消失问题、收敛速度慢、非零中心函数 |
| Tanh | | 后续会详细介绍 |
| ReLU 及其变体 | | 后续会详细介绍 |

2.6 Sigmoid 函数的问题

Sigmoid 函数虽然易于理解,但存在一些问题:
- 梯度消失问题 :在使用基于梯度的方法训练 ANN 时,尤其是在使用反向传播的 ANN 中,这个问题会导致很难学习和调整早期层的参数。随着网络层数的增加,问题会更加严重。
梯度消失问题的本质是,当输入参数的梯度过小时,参数的变化对 ANN 输出的影响非常小,经过多次迭代后,ANN 无法有效地学习参数,无法按预期收敛。对于 Sigmoid 函数,它将输入非线性地压缩到一个小范围内,输入空间的大部分区域被映射到一个非常小的输出范围,即使输入参数有很大变化,输出的变化也很小,因为该区域的梯度很小。当神经元接近 0 或 1 时,该区域的梯度接近 0,在反向传播过程中,这个局部梯度会与每层输出门的梯度相乘,导致后续层的输出变化越来越小。

以下是一个简单的流程图,展示了激活函数在 ANN 中的工作流程:

graph TD;
    A[输入值和权重] --> B[传递势函数];
    B --> C[激活函数];
    C --> D[阈值函数];
    D --> E[输出结果];

2.7 Tanh 函数

Tanh 函数即双曲正切函数,其数学表达式为 (tanh(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}})。它将输入值映射到 ([-1, 1]) 的范围内,输出呈 S 形曲线。

2.7.1 特点

  • 零中心性 :与 Sigmoid 函数不同,Tanh 函数的输出范围关于零对称,这使得在神经网络训练中,参数更新更加平衡,有助于缓解梯度消失问题。
  • 非线性映射 :和 Sigmoid 函数一样,Tanh 函数也是非线性的,能够在神经网络中引入非线性因素,从而使网络可以学习到复杂的模式和特征。

2.7.2 问题

  • 梯度消失问题 :虽然 Tanh 函数在一定程度上缓解了 Sigmoid 函数的梯度消失问题,但当输入值非常大或非常小时,函数的梯度仍然会趋近于零。在深度神经网络中,经过多层的反向传播,梯度会变得越来越小,导致网络难以训练。

2.7.3 应用场景

Tanh 函数常用于循环神经网络(RNN)中,特别是在处理序列数据时,由于其零中心性,能够更好地处理正负值,使得网络在学习序列中的模式时更加有效。

2.8 ReLU 及其变体

2.8.1 ReLU 函数

ReLU(Rectified Linear Unit)即修正线性单元,其数学表达式为 (f(x)=max(0, x))。它是深度学习中最常用的激活函数之一。

特点
  • 计算简单 :ReLU 函数的计算只涉及到取最大值操作,计算速度快,能够显著提高神经网络的训练效率。
  • 缓解梯度消失问题 :当输入值大于 0 时,ReLU 函数的梯度为 1,不会出现梯度消失的问题,使得网络在训练过程中能够更快地收敛。
  • 稀疏激活 :对于小于 0 的输入,ReLU 函数的输出为 0,这使得网络中的神经元具有稀疏性,有助于减少过拟合的风险。
问题
  • 神经元死亡问题 :如果输入值一直小于 0,那么该神经元的梯度将始终为 0,导致该神经元在后续的训练中不再更新,即“死亡”。

2.8.2 Leaky ReLU 函数

Leaky ReLU 是 ReLU 的一种变体,其数学表达式为 (f(x)=max(\alpha x, x)),其中 (\alpha) 是一个小的正数,通常取 0.01。

特点
  • 解决神经元死亡问题 :当输入值小于 0 时,Leaky ReLU 函数的输出不为 0,而是一个很小的负数,这样可以避免神经元死亡的问题。

2.8.3 ELU 函数

ELU(Exponential Linear Unit)即指数线性单元,其数学表达式为:
[
f(x)=\begin{cases}
x, & x\geq0\
\alpha (e^{x}-1), & x < 0
\end{cases}
]
其中 (\alpha) 是一个正数,通常取 1。

特点
  • 零中心输出 :ELU 函数在输入小于 0 时,输出为负数,使得函数的输出具有零中心性,有助于提高网络的训练效果。
  • 缓解梯度消失问题 :和 ReLU 及其变体一样,ELU 函数在输入大于 0 时,梯度为 1,能够缓解梯度消失问题。

以下是 ReLU 及其变体的对比表格:
| 激活函数 | 表达式 | 特点 | 问题 |
| ---- | ---- | ---- | ---- |
| ReLU | (f(x)=max(0, x)) | 计算简单,缓解梯度消失,稀疏激活 | 神经元死亡问题 |
| Leaky ReLU | (f(x)=max(\alpha x, x)) | 解决神经元死亡问题 | |
| ELU | (\begin{cases}x, & x\geq0\\alpha (e^{x}-1), & x < 0\end{cases}) | 零中心输出,缓解梯度消失 | |

2.9 激活函数的选择

在选择激活函数时,需要考虑以下因素:
- 问题类型 :对于二分类问题,Sigmoid 函数通常是一个不错的选择;对于多分类问题,Softmax 函数(是 Sigmoid 函数在多分类情况下的扩展)更为合适。
- 网络结构 :在深度神经网络中,ReLU 及其变体通常更受欢迎,因为它们能够缓解梯度消失问题,提高训练效率。
- 计算资源 :如果计算资源有限,ReLU 函数由于其计算简单,可能是更好的选择。

以下是一个简单的流程图,展示了选择激活函数的基本思路:

graph TD;
    A[问题类型] --> B{二分类?};
    B -- 是 --> C[Sigmoid];
    B -- 否 --> D{多分类?};
    D -- 是 --> E[Softmax];
    D -- 否 --> F[网络深度];
    F --> G{深度网络?};
    G -- 是 --> H[ReLU 及其变体];
    G -- 否 --> I[根据计算资源选择];

综上所述,梯度下降和激活函数在自然语言理解与生成的深度学习中都起着至关重要的作用。梯度下降帮助我们找到最佳拟合直线,而激活函数则为神经网络引入了非线性,使得网络能够处理复杂的任务。在实际应用中,我们需要根据具体的问题和数据特点,选择合适的梯度下降方法和激活函数,以提高模型的性能。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值