修正了部分文档中的笔误
This commit is contained in:
parent
a60f599d95
commit
c1b4fcd1ca
|
|
@ -17,11 +17,13 @@
|
|||
|
||||
### 工作原理
|
||||
|
||||
我们先设计一个最简单的神经网络模型,它只有一层输入和一层输出,该模型会根据输入($\small{X}$)去预测输出($\small{y}$),而输出又满足下面的公式:
|
||||
我们先设计一个最简单的神经网络模型,它只有一层输入和一层输出,该模型会根据输入( $\small{X}$ )去预测输出( $\small{y}$ ),而输出又满足下面的公式:
|
||||
|
||||
$$
|
||||
y = aX_{1} + bX_{2} + cX_{3} + d
|
||||
$$
|
||||
其中,$\small{a, b, c, d}$ 都是模型的参数(权重和偏置),那么我们的神经网络模型应该是如下图所示的结构。
|
||||
|
||||
其中, $\small{a, b, c, d}$ 都是模型的参数(权重和偏置),那么我们的神经网络模型应该是如下图所示的结构。
|
||||
|
||||
<img src="res/08_one_layer_nn.png" style="zoom:55%;">
|
||||
|
||||
|
|
@ -30,65 +32,73 @@ $$
|
|||
<img src="res/08_multi_layer_nn.png" style="zoom:58%;">
|
||||
|
||||
接下来,我们看看神经网络的工作原理。每个神经元的计算过程可以表示为:
|
||||
|
||||
$$
|
||||
y = f \left( \sum_{i=1}^{n}w_{i}x_{i} + b \right)
|
||||
$$
|
||||
其中,$\small{x_{1}, x_{2}, \dots, x_{n}}$ 是输入特征,$\small{w_1, w_2, \dots, w_n}$ 是与输入对应的权重;$\small{b}$ 是偏置项;$\small{f}$ 是激活函数,通常是非线性函数,如 Sigmoid、ReLU、Tanh 等。激活函数一个方面是引入非线性变换,增加了神经网络的表达能力,使得它可以模拟任意复杂的函数关系;另一方面,在训练神经网络时会使用反向传播来更新权重,激活函数的非线性属性使得梯度传递更有效,让神经网络收敛得更快,提高训练效率。下面我们对常用的激活函数做一个简要的介绍。
|
||||
|
||||
其中, $\small{x_{1}, x_{2}, \dots, x_{n}}$ 是输入特征, $\small{w_1, w_2, \dots, w_n}$ 是与输入对应的权重; $\small{b}$ 是偏置项; $\small{f}$ 是激活函数,通常是非线性函数,如 Sigmoid、ReLU、Tanh 等。激活函数一个方面是引入非线性变换,增加了神经网络的表达能力,使得它可以模拟任意复杂的函数关系;另一方面,在训练神经网络时会使用反向传播来更新权重,激活函数的非线性属性使得梯度传递更有效,让神经网络收敛得更快,提高训练效率。下面我们对常用的激活函数做一个简要的介绍。
|
||||
|
||||
1. Sigmoid 函数
|
||||
|
||||
|
||||
$$
|
||||
f(x) = \frac{1}{1 + e^{-x}}
|
||||
$$
|
||||
<img src="res/08_sigmoid_function.png" style="zoom:62%;">
|
||||
$$
|
||||
f(x) = \frac{1}{1 + e^{-x}}
|
||||
$$
|
||||
|
||||
- **特点**:Sigmoid 函数将输入值映射到$\small{(0, 1)}$的范围内,呈现出平滑的 S 型曲线。
|
||||
- **优点**:特别适用于概率预测,因为输出在$\small{(0, 1)}$之间,可以理解为概率值。
|
||||
- **缺点**:对于较大的正值或负值,梯度会变得很小,导致梯度消失问题,从而影响深层网络的训练。除此以外,由于输出非零中心,这会导致梯度更新不对称,可能使得收敛变慢。
|
||||
<img src="res/08_sigmoid_function.png" style="zoom:62%;">
|
||||
|
||||
- **特点**:Sigmoid 函数将输入值映射到$\small{(0, 1)}$的范围内,呈现出平滑的 S 型曲线。
|
||||
- **优点**:特别适用于概率预测,因为输出在$\small{(0, 1)}$之间,可以理解为概率值。
|
||||
- **缺点**:对于较大的正值或负值,梯度会变得很小,导致梯度消失问题,从而影响深层网络的训练。除此以外,由于输出非零中心,这会导致梯度更新不对称,可能使得收敛变慢。
|
||||
|
||||
2. Tanh 函数(双曲正切函数)
|
||||
$$
|
||||
f(x) = tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}
|
||||
$$
|
||||
<img src="res/08_tanh_function.png" style="zoom:62%;" />
|
||||
|
||||
- **特点**:Tanh 函数将输入映射到$\small{(-1, 1)}$的范围内,也是 S 型曲线,但中心对称。
|
||||
- **优点**:与 Sigmoid 类似,但输出在$\small{(-1, 1)}$之间,这样的零中心输出使得梯度更新更对称,更适合用于深层网络。
|
||||
- **缺点**:在极值附近,梯度仍会趋向于零,导致梯度消失问题。
|
||||
$$
|
||||
f(x) = tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}
|
||||
$$
|
||||
|
||||
<img src="res/08_tanh_function.png" style="zoom:62%;" />
|
||||
|
||||
- **特点**:Tanh 函数将输入映射到$\small{(-1, 1)}$的范围内,也是 S 型曲线,但中心对称。
|
||||
- **优点**:与 Sigmoid 类似,但输出在$\small{(-1, 1)}$之间,这样的零中心输出使得梯度更新更对称,更适合用于深层网络。
|
||||
- **缺点**:在极值附近,梯度仍会趋向于零,导致梯度消失问题。
|
||||
|
||||
3. ReLU 函数(Rectified Linear Unit)
|
||||
$$
|
||||
f(x) = max(0, x)
|
||||
$$
|
||||
|
||||
- **特点**:ReLU 将输入小于零的部分设为零,而大于零的部分保持不变,因此其输出范围是$\small{[0, +\infty]}$。
|
||||
- **优点**:计算简单,有效避免了梯度消失问题,因此被广泛应用于深层网络。能够保持稀疏性,许多神经元的输出为零,有利于网络简化计算。
|
||||
- **缺点**:当输入为负数时,ReLU 的梯度为零。若输入长期为负数,神经元可能“死亡”并停止更新。
|
||||
$$
|
||||
f(x) = max(0, x)
|
||||
$$
|
||||
|
||||
- **特点**:ReLU 将输入小于零的部分设为零,而大于零的部分保持不变,因此其输出范围是$\small{[0, +\infty]}$。
|
||||
- **优点**:计算简单,有效避免了梯度消失问题,因此被广泛应用于深层网络。能够保持稀疏性,许多神经元的输出为零,有利于网络简化计算。
|
||||
- **缺点**:当输入为负数时,ReLU 的梯度为零。若输入长期为负数,神经元可能“死亡”并停止更新。
|
||||
|
||||
4. Leaky ReLU 函数
|
||||
$$
|
||||
f(x) = \begin{cases} x & (x \gt 0) \\ {\alpha}x & (x \le 0)\end{cases}
|
||||
$$
|
||||
|
||||
- **特点**:Leaky ReLU 是对 ReLU 的改进,它为输入小于零的部分引入了一个小的负斜率(通常取值$\small{\alpha = 0.01}$),使得梯度不为零。
|
||||
- **优点**:通过允许负值的输出,避免了死神经元问题,使得网络更健壮。
|
||||
$$
|
||||
f(x) = \begin{cases} x & (x \gt 0) \\ {\alpha}x & (x \le 0)\end{cases}
|
||||
$$
|
||||
|
||||
- **缺点**:虽然 Leaky ReLU 能缓解死神经元问题,但其负值斜率的选择对网络性能会有一些影响,且对模型的非线性表示能力没有显著提升。
|
||||
- **特点**:Leaky ReLU 是对 ReLU 的改进,它为输入小于零的部分引入了一个小的负斜率(通常取值$\small{\alpha = 0.01}$),使得梯度不为零。
|
||||
- **优点**:通过允许负值的输出,避免了死神经元问题,使得网络更健壮。
|
||||
- **缺点**:虽然 Leaky ReLU 能缓解死神经元问题,但其负值斜率的选择对网络性能会有一些影响,且对模型的非线性表示能力没有显著提升。
|
||||
|
||||
在一个包含多个层的神经网络中,信息会一层一层的进行传递。假设第 $\small{l}$ 层的输出是 $\small{\mathbf{a}^{[l]}}$ ,按照上面神经元计算公式,有:
|
||||
|
||||
在一个包含多个层的神经网络中,信息会一层一层的进行传递。假设第 $\small{l}$ 层的输出是 $\small{\mathbf{a}^{[l]}}$,按照上面神经元计算公式,有:
|
||||
$$
|
||||
\mathbf{a}^{[l]} = f \left( \mathbf{W}^{[l]} \mathbf{a}^{[l-1]} + \mathbf{b}^{[l]} \right)
|
||||
$$
|
||||
其中,$\small{\mathbf{W}^{[l]}}$ 是第 $\small{l}$ 层的权重矩阵,$\small{\mathbf{a}^{[l-1]}}$ 是是第 $\small{l - 1}$ 层的输出,$\small{\mathbf{b}^{[l]}}$ 是第 $\small{l}$ 层的偏置项,$\small{f}$ 是激活函数。神经网络最终的输出是通过最后一层的激活函数得到的,这个过程叫做前向传播(forward-propagation)。
|
||||
|
||||
其中, $\small{\mathbf{W}^{[l]}}$ 是第 $\small{l}$ 层的权重矩阵, $\small{\mathbf{a}^{[l-1]}}$ 是是第 $\small{l - 1}$ 层的输出, $\small{\mathbf{b}^{[l]}}$ 是第 $\small{l}$ 层的偏置项, $\small{f}$ 是激活函数。神经网络最终的输出是通过最后一层的激活函数得到的,这个过程叫做前向传播(forward-propagation)。
|
||||
|
||||
对于神经网络模型来说,还有一个极其重要的操作就是通过计算损失函数相对于每个权重和偏置的梯度来更新神经网络的参数(权重和偏置),这一过程通常称为反向传播(back-propagation)。反向传播有两个要点,一个是损失函数,一个是梯度下降法,前者用于衡量预测值与真实值之间的差距,常用的损失函数有均方误差(回归任务)和交叉熵损失函数(分类任务),后者通过更新参数 $\small{\theta}$(权重和偏置),使得损失函数最小化,即:
|
||||
|
||||
$$
|
||||
\theta^{\prime} = \theta - \eta \nabla L(\theta) \\
|
||||
\theta = \theta^{\prime}
|
||||
$$
|
||||
|
||||
其中,$\small{\eta}$ 是学习率,$\small{\nabla L(\theta)}$ 是损失函数相对于参数的梯度,跟我们讲解回归模型时使用的方法是一致的。
|
||||
其中, $\small{\eta}$ 是学习率, $\small{\nabla L(\theta)}$ 是损失函数相对于参数的梯度,跟我们讲解回归模型时使用的方法是一致的。
|
||||
|
||||
### 代码实现
|
||||
|
||||
|
|
|
|||
|
|
@ -158,15 +158,19 @@ print('词频向量:\n', X.toarray())
|
|||
词向量的维度通常是一个超参数,需要根据实际情况来选择。通常,常见的维度范围为 50 到 300 之间,但有时可以更高或更低。较低的维度可能无法捕捉到词汇的丰富语义信息,但会减少计算复杂度,适用于训练数据比较少或对精度要求不高的场景;较高的维度可以捕捉更多的语义特征,适用于大规模数据集,但计算成本也会增加。
|
||||
|
||||
一旦词向量被训练出来,它们就能捕捉到词汇之间的多种关系。最常见的方式是通过计算词向量之间的距离或相似度来理解它们的关系。计算两个词向量之间的余弦相似度是最常用的方式,余弦相似度的公式我们之前提到过,如下所示。
|
||||
|
||||
$$
|
||||
\text{Cosine Similarity}(\bold{A}, \bold{B}) = \frac{\bold{A} \cdot \bold{B}}{\lVert \bold{A} \rVert \lVert \bold{B} \rVert}
|
||||
$$
|
||||
|
||||
其中,$\small{\bold{A}}$ 和 $\small{\bold{B}}$ 是两个词的词向量,$\small{\cdot}$ 是向量的点积运算,$\small{\lVert \bold{A} \rVert}$ 和 $\small{\lVert \bold{B} \rVert}$ 是它们的模长。余弦相似度的值介于 -1 到 1 之间,值越大表示两个词越相似,越小则表示越不相似。
|
||||
|
||||
另一方面,我们可以研究词向量的空间关系并完成一些有趣的运算。例如,如果我们想知道`'king'`(国王)和`'queen'`(王后)之间的关系,可以通过这样的方式来探索:
|
||||
|
||||
$$
|
||||
\text{king} − \text{man} + \text{woman} \approx \text{queen}
|
||||
$$
|
||||
|
||||
这个式子表示,`'king'`去掉`'man'`(男人)的部分,再加上`'woman'`(女人)的部分,得到的结果约等于`'queen'`。这样的运算可以捕捉到性别上的相似性。此外,利用词向量我们还可以进行聚类分析、词义消歧(通过上下文和相似度判断词在特定场景中的意思)、文本分类、情感分析等操作。
|
||||
|
||||
我们用下面的代码为大家展示词向量的构建以及词与词相似性的度量,这里需要安装一个名为`gensim`的三方库。
|
||||
|
|
@ -279,20 +283,21 @@ Transformer 架构如上图所示,它也是一个编码器-解码器结构,
|
|||
|
||||
3. 自注意力机制:允许模型在每个时间步根据输入序列中的所有其他词来计算每个词的表示。这样每个词都能关注到序列中其他位置的信息,而不依赖于输入的顺序。自注意力机制的原理是:对每个输入的词,通过嵌入层计算三个向量,分别是:**查询向量**(Q)、**键向量**(K)、**值向量**(V)。
|
||||
|
||||
- 查询向量:用来查询其他词信息的向量,它代表我们关注的内容,每个输入词都会有一个对应的查询向量。
|
||||
- 查询向量:用来查询其他词信息的向量,它代表我们关注的内容,每个输入词都会有一个对应的查询向量。
|
||||
|
||||
- 键向量:根据输入序列中每个元素生成的一个向量,它与查询向量进行对比,计算每个词与其他词的注意力分数,这个分数决定了当前词和其他词的相关性,计算公式如下:
|
||||
$$
|
||||
\text{Attention Score}(Q, K) = \frac{Q \cdot K^{T}}{\sqrt{d_{k}}}
|
||||
$$
|
||||
其中,$\small{d_{k}}$ 是键向量的维度,这里除以 $\small{\sqrt{d_k}}$ 的操作是为了防止点积值过大。
|
||||
- 键向量:根据输入序列中每个元素生成的一个向量,它与查询向量进行对比,计算每个词与其他词的注意力分数,这个分数决定了当前词和其他词的相关性,计算公式如下,其中, $\small{d_{k}}$ 是键向量的维度,这里除以 $\small{\sqrt{d_k}}$ 的操作是为了防止点积值过大。
|
||||
|
||||
- 值向量:实际的信息载体。在计算出注意力分数后,通过加权和运算得到的就是每个词的最终表示,这个最终表示是该词的上下文相关的向量,反映了该词在上下文中的重要性。
|
||||
$$
|
||||
\text{Output} = \sum_{i} \text{softmax} \left( \frac{Q \cdot K^{T}}{\sqrt{d_{k}}} \right) \cdot V_{i}
|
||||
$$
|
||||
$$
|
||||
\text{Attention Score}(Q, K) = \frac{Q \cdot K^{T}}{\sqrt{d_{k}}}
|
||||
$$
|
||||
|
||||
这里,我们得到的某个词的最终表示,不仅仅是它自身的语义,还包含了它与其他词的关系和上下文信息。
|
||||
- 值向量:实际的信息载体。在计算出注意力分数后,通过加权和运算得到的就是每个词的最终表示,这个最终表示是该词的上下文相关的向量,反映了该词在上下文中的重要性。
|
||||
|
||||
$$
|
||||
\text{Output} = \sum_{i} \text{softmax} \left( \frac{Q \cdot K^{T}}{\sqrt{d_{k}}} \right) \cdot V_{i}
|
||||
$$
|
||||
|
||||
这里,我们得到的某个词的最终表示,不仅仅是它自身的语义,还包含了它与其他词的关系和上下文信息。
|
||||
|
||||
4. 多头注意力:在标准的自注意力机制中,Q、K、V 向量都是通过同一个线性变换得到的,但这可能会限制信息的捕获。多头注意力通过使用多个并行的注意力头来解决这个问题,每个头使用不同的线性变换来捕捉不同的特征或关系。
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue