xlog2n@home:~$

大模型学习笔记

1. 简单语言模型N-Gram

1.1 N-Gram原理

N-Gram 是一种统计语言模型,通过考虑文本中连续 N 个词出现的概率来建模。N-Gram 模型的主要目标是预测一个词在给定前面 N-1 个词的情况下出现的概率。公式如下:

\[\mathbf{P} = ( w_i \;|\; w_{i-(N-1)}, ......, w_{i-1} )\]

常见的 N-Gram 包括:

  • Unigram(1-Gram):单个词或字符
  • Bigram(2-Gram):连续两个词或字符
  • Trigram(3-Gram):连续三个词或字符

在Bigram模型中,预测词出现的概率仅依赖于前一个词 。在Trigram模型中,预测词出现的概率依赖于前两个词和。因此Unigram无法进行预测。句子”Money is my best friend”的Unigram、Bigram和Trigram分别为:

  • Unigram [“Money”, “is”, “my”, “best”, “friend”]
  • Bigram [“Money is”, “is my”, “my best”, “best friend”]
  • Trigram [“Money is my”, “is my best”, “my best friend”]

1.2 N-Gram优缺点

优点:N较小时简单高效、无监督学习、局部上下文支持。 缺点:长距离依赖无法解决、无法获取除N之外的更广泛上下文信息、模型参数空间随N的增加剧烈膨胀。

1.3 N-Gram适用场景

适用场景N-Gram模型常用于自然语言处理任务,如输入法提示、拼写纠正、语音识别、配合ES分词检索等。

1.3.1 构造数据集

[
    "I like to eat apples",
    "I like to eat oranges",
    "I like to eat bananas",
    "I don't like to eat watermelons",
    "She likes to eat apples",
    "She doesn't like to eat bananas",
    "She doesn't like to eat apples",
    "He doesn't like to eat apples"
]

1.3.2 分词并计算gram词频

{
    "I": {"like": 3, "don't": 1},
    "like": {"to": 3},
    "to": {"eat": 4},
    "eat": {"apples": 3, "oranges": 1, "bananas": 1, "watermelons": 1},
    "don't": {"like": 3},
    "She": {"likes": 1, "doesn't": 2},
    "likes": {"to": 1},
    "doesn't": {"like": 3},
    "He": {"doesn't": 1}
}

1.3.3 计算gram概率

{
    "I": {"like": "0.75", "don't": "0.25"},
    "like": {"to": "1.0"},
    "to": {"eat": "1.0"},
    "eat": {"apples": "0.5", "oranges": "0.125", "bananas": "0.25", "watermelons": "0.125"},
    "don't": {"like": "1.0"},
    "She": {"likes": "0.33", "doesn't": "0.67"},
    "likes": {"to": "1.0"},
    "doesn't": {"like": "1.0"},
    "He": {"doesn't": "1.0"}
}

1.3.4 基于Bigram概率模型生成

[
    {"输入": "I",   "输出": "I like to eat apples"},
    {"输入": "She", "输出": "She doesn't like to eat apples"},
    {"输入": "He",  "输出": "He doesn't like to eat apples"},
    {"输入": "She likes", "输出": "She likes to eat apples"}
]

2. 简单文本表示——BoW

2.1 BoW原理

Bag of Words(词袋模型)是一种常用于自然语言处理和文本挖掘的技术。它的基本原理是将文本转换为词的集合,即词袋,在这个集合中不考虑词的顺序和语法,只关注词的出现频率。词袋模型不属于语言模型,严格来说它只是一种文本表示方法。

2.2 BoW模型优缺点

2.3 BoW模型适用场景

2.4 余弦相似度算法

余弦相似度是一种衡量两个向量之间相似度的常用方法,特别适用于高维空间中的文本相似度计算。它通过计算两个向量夹角的余弦值来表示它们的相似度,值域在 [-1, 1] 之间。

2.4.1 余弦相似度算法定义

对于两个向量A和B,它们的余弦相似度定义为:

\[\text{cosine similarity}(\mathbf{A}, \mathbf{B}) = \frac{\mathcal{A} \cdot \mathcal{B}}{||\mathcal{A}|| \cdot ||\mathcal{B}||}\]

2.4.2 余弦相似度算法推演

为什么余弦相似度是向量A和B的点积比范数?假设有二维向量u和v如下:

\[\mathbf{u} = \begin{bmatrix}a\\b\end{bmatrix},\quad \mathbf{v} = \begin{bmatrix}c\\d\end{bmatrix}\]

计算向量u减向量v,得出向量w。这里的u-v其实可以理解成u+(-v),之所以要减是为了直角坐标系形成一个闭合三角形方便计算。当然如果计算向量u和v的和也是可以的,参看图1。

\[\mathbf{w} = \mathbf{u} - \mathbf{v} = \begin{bmatrix}a\\b\end{bmatrix} - \begin{bmatrix}c\\d\end{bmatrix} = \begin{bmatrix}a-c\\b-d\end{bmatrix}\]

向量u、v、w在直角坐标系表示如图1所示,三个向量组成了一个三角形:

根据勾股定理可以计算向量u、v、w的模长,如图2所示做辅助线:

\[\begin{align} \mathbf{u} &= \sqrt{a^2+b^2}\\ \mathbf{v} &= \sqrt{c^2+d^2}\\ \mathbf{w} &= \sqrt{(b-d)^2+(a-c)^2} \end{align}\]

根据余弦定理可知:

\[\begin{align} \|\mathbf{w}\|^2 &= \|\mathbf{u}\|^2 + \|\mathbf{v}\|^2 - 2 \|\mathbf{u}\| \|\mathbf{v}\| \cos \theta\\ \|\mathbf{u}\| \|\mathbf{v}\| \cos \theta &= \frac{\|\mathbf{u}\|^2 + \|\mathbf{v}\|^2 - \|\mathbf{w}\|^2}{2}\\ \quad \|\mathbf{u}\| \|\mathbf{v}\| \cos \theta &= \frac{(a^2 + b^2) + (c^2 + d^2) - [(a-c)^2 + (b-d)^2] }{2}\\ \quad \color{red} \|\mathbf{u}\| \|\mathbf{v}\| \cos \theta \color{white} &= \color{green} ac + bd \end{align}\]

根据余弦相似度公式可知:

\[\text{cosine similarity} (\mathbf{u}, \mathbf{v}) = \frac{\mathbf{u} \cdot \mathbf{v}}{||\mathbf{u}|| ||\mathbf{v}||} = \frac{\color{green}ac + bd}{||\mathbf{u}||||\mathbf{v}||} = \frac{\color{red}||\mathbf{u}||||\mathbf{v}|| \cos \theta}{||\mathbf{u}||||\mathbf{v}||} = \cos \theta\]

2.4.3 余弦相似度算法总结

至此,就可以明白为什么余弦相似度公式的分子是向量的点积,分母是向量模长(范数)的乘积。因为向量u和v的点积\(ac + bd\)等价于\(||\mathbf{u}||||\mathbf{v}|| \cos \theta\),而向量u和v的模长乘积是\(||\mathbf{u}||||\mathbf{v}||\),分子和分母化简后就只剩下了\(\cos \theta\),余弦相似度就是求两个向量的夹角的余弦值,向量的余弦相似度结果在 -1 到 1之间,1表示最相似,参考下表。

向量夹角θ 求余弦 余弦值v 描述
θ = 0° \(\cos \theta\) v = 1 u和v、w组成的角形退化成一条直线,完全相似
θ < 90° \(\cos \theta\) v < 1 u和v,相似
θ = 90° \(\cos \theta\) v = 0 u和v垂直,不相似
θ > 90° \(\cos \theta\) v > -1 u和v为相反向量,不相似

3. 词向量表示——Word2Vec和Embedding

3.1 Xxx

3.2 Softmax函数

Softmax 函数之所以被称为激活函数,是因为它在神经网络的输出层中使用,用于将网络的输出转换为概率分布。具体来说,Softmax 函数将一个实数向量转换为一个概率向量,使得每个元素的值在 0 到 1 之间,并且所有元素的和为 1,这也被称作归一化。

3.2.1 Softmax函数定义

给定一个长度为n的输入向量\(z = [z_1, z_2, ..., z_n]\),Softmax函数的输出为:

\[\text{softmax}(z_i) = \frac{e^{z_i}} {\sum_{j=1}^{n} e^{z_j}}\]

3.2.2 Softmax函数推演

在计算 Softmax 函数时,我们需要对输入向量的每个元素取指数。如果输入向量中的元素很大,那么取指数后的结果可能会非常大,从而导致数值溢出。假设我们有一个很大的输入\(z = [10000, 10001, 10002]\),那么\(e^{10000}\)是一个非常大的数。所以Softmax函数在计算之前需要进行数值稳定性处理,对输入向量进行平移,使其最大值为 0。具体做法是从每个输入元素中减去输入向量的最大值:

\[\begin{align} z_1 &= 10000 - 10002 = -2 \\ z_2 &= 10001 - 10002 = -1 \\ z_3 &= 10002 - 10002 = 0 \end{align}\]

其余过程非常简单,略…

思考:为什么要用e而不是π或者其他?
使用自然常数\(e\)的指数函数\(e^x\)的导数是自身,即\(\frac{d}{dx}e^x = e^x\)。这一性质在优化算法中非常有用,尤其是在反向传播算法中计算梯度时,能够简化计算。 自然常数\(e\)出现在许多概率模型中,这使得使用\(e\)能与这些数学模型保持一致

4. 循环神经网络

5. 编码器解码器

6. 注意力机制

7. Transformer

8. 训练一个自己的模型