Word2Vec (上)
2026/9/4 6:44:50 网站建设 项目流程

碎碎语

最近一直在想去学习NLP,但是一直迟迟没有下手,因为实在是不知道从哪里开始学习,最后在朋友的推荐下看了cs224n前两节课(英文课堂实在是折磨呀,好在B站有对应的中文字幕)。对word2vec有了自己的一些了解,故在此留下自己学习过的痕迹,因篇幅有限可能word2vec会分成上下上部分来讲完,这其中会加入我个人的一些看法和间接,同时也会借鉴大佬的博客中的一些内容。

语言模型

语言模型是通过学习语言规律,根据上下文预测后续应该出现什么的一种模型。其本质是根据语言序列(按照一定顺序排列起来的一些语言单位,语言单位在nlp中常指token,也可理解为词或者字,这里不做过多介绍)构造概率模型(即某句话出现的概率)。语言模型分为统计语言模型和神经语言模型。

语言模型的通俗来讲就是挑选尽可能靠谱的句子返回给用户,这其中的统计语言模型是依靠统计词出现的频率来预测后续内容,而神经语言模型是依学习语言规律来预测后续内容。

统计语言模型

那什么是统计语言模型呢?

统计语言模型是指利用已有的语料中的统计信息,估计出语言序列的概率分布,从而计算一个句子出现的概率,并可以预测下一个词。简单点来说就是根据已知计算句子概率的概率模型。计算句子概率的概率模型很多,n-gram模型便是其中的一种。

假设一个句子由n个词组成:

那么这个句子出现的概率是:

一般来说语言模型都是为了让我们这个条件概率出现的可能性最大化,但是呢随着我们上下文越来越长,我们这个条件概率的计算变的会越来越困难,因此我们就产生了著名的N-gram模型。

N-gram模型提出了一个大胆的近视:预测当前词时,不需要知道所有的上下文,只需要知道最近的几个词。这便是所谓的马尔可夫假设

当我们只能看到最近的两个词语是,我们的N-gram模型就变成了Trigram(3-gram),当我们只需要考虑前一个词时,就变成了Bigram(2-gram)。

学到这里的时候我产生了一个疑问。语言模型通过最大化下一个 Token 的条件概率进行训练,那么为什么条件概率较高的 Token 可以被认为是当前上下文下更合理的预测?这种‘概率最大’与‘预测正确’之间是什么关系?

1.条件概率表示“在当前上下文下出现的可能性”

首先条件概率表示的是在训练数据所反映的语言规律下,给定当前上下文之后,各个 Token 作为下一个 Token 出现的相对可能性

就比如假设当前的上下文是:“今天的天气很”。模型需要预测下一个 Token,它可能得到:

所以如果:

那么模型认为,在上下文的预测中,更符合它所学习到的数据分布

2.为什么训练时要最大化这个概率?

假设真实训练文本是:

语言模型希望学习:

也就是:

给定前面的上下文,真实的下一个 Token 应该具有较高的概率。

因此训练时最大化:

这实际上就是最大似然估计(Maximum Likelihood Estimation, MLE)

等价地,也就是最小化交叉熵损失:

所以,如果模型预测的是真实 Token,那么:

也就是说,真实 Token 的概率越高,训练损失越小(这里的C表示的是真实文本)

到了真正预测的时候,假设上下文是C,模型得到整个词表的概率分布:

如果我们采用贪心解码(Greedy Decoding),就选择概率最大的 Token:

因为从模型自己的概率分布来看,概率最大的 Token 是它认为最可能出现的 Token

所以:

概率最大不是说这个 Token “一定正确”,而是说,在模型当前学到的概率分布中,它是最可能成为真实下一个 Token 的候选。

其实除了贪心解码,还有别的解码方式例如Beam Search(束搜索),Random Sampling(随机采样)在这里就不过多的叙述了。

3.概率最大 ≠ 一定正确

假设真实答案是:

“今天天气非常冷。”

但是模型给出的概率是:

那么模型按照最大概率原则会预测:

但真实 Token 是:

所以:

也就是说,概率最大只是模型的最优判断,不是真值保证。

总结:语言模型学习的并不是一个确定性的“正确答案”,而是给定上下文条件下下一个 Token 的概率分布。训练时通过最大化真实 Token 的条件概率,也就是最大化似然,使模型学习训练数据中的语言规律。当给定新的上下文时,模型会计算不同 Token 的条件概率。若采用贪心解码,则选择条件概率最大的 Token,因为在模型当前估计的概率分布下,该 Token 是最可能出现的,因此具有最高的期望预测准确率。

但是,概率最大并不意味着一定正确。因为语言本身具有不确定性,而且模型学习到的概率分布只是对真实数据分布的近似。因此,“概率最大”表示的是模型在当前概率分布下的最优预测,而不是对真实答案的绝对保证。只有当模型能够较好地逼近真实条件概率分布时,最大概率 Token 才能够在统计意义上对应最高的预测正确率。

既然训练目标是最大化真实 Token 的概率,为什么 ChatGPT 推理时不总是选择概率最高的 Token,而是会使用 temperature、top-k、top-p 等采样方法?后面学到gpt的时候也会讲解一下。

N-gram同样有很多的局限性:

1.马尔可夫假设导致上下文有限
N-gram的核心假设是:

但是问题是,自然语言中一个词可能会依赖很久之前的信息,如果我们的N很小,那么我们的模型根本看不到那么远的上下文。

2.N很大时,数据稀疏(Data Sparsity)很严重

当我们的N越大的时候,一个具体的 N-gram 在训练语料中出现的次数就越少。例如我们的N为2时,我们只需要统计两个词的组合,但是当我们的N为5时,我们就需要统计五元组出现的可能性,N 越大,一个具体的 N-gram 在训练语料中出现的次数就越少。

甚至可能出现:

最大似然估计:

3.参数规模会随着 N 爆炸增长

假设我们的词表大小|V|=10000,那么理论上2-gram(Bigram)的组合数最多为=3-gram(Trigram)的组合数最多为=,所以随着N-gram中N的增加,可能的N-gram数量呈指数级上升,这会带来极大的存储和计算成本。虽然我们可以采取稀疏存储、剪枝等方法降低成本,但问题依然存在。

4.无法很好地理解语义

N-gram本质上还是在统计哪些词在上下文中一起出现,他并没有考虑到词与词之间的一个内在联系。因为N-gram本质上将我们的每个单词看作单独的一个词,并没有考虑词与词之间的潜在联系,就比如:P(苹果|我喜欢吃)和P(香蕉|我喜欢吃),模型知道这些词在上下文中经常出现,但是它很难学习到苹果和香蕉之间的关系,

这也是为什么我们后面会引入word embedding,也是后来Word2Vec、神经网络语言模型等方法出现的重要原因之一。

神经网络语言模型(Neural Network Language Model, NNLM)

那什么是神经网络语言模型呢?

神经网络并不是直接“理解”上下文,而是通过训练不断调整参数,使得不同上下文能够产生不同的隐藏表示,并利用这个表示预测下一个 Token。而不是和我们的统计语言模型一样,单纯的统计共现词的频率进而预测。

那神经网络是如何学习给定的上下文进而预测下一个token的呢?

神经网络的学习过程:

1.词变成向量

神经网络不能直接处理文本,所以需要我们将文本或者说token转换成向量,这个过程就叫做embedding,最初我们的embedding向量是随机初始化的,在后续的学习过程中不断的去修改。

例如:

“我” “喜欢” “吃”,我们的第一步就是要将token转换成向量,这个转化的过程就叫做embedding


2.神经网络学习“上下文表示”

我们经过上面的embedding过程之后,我们就已经有了三个向量,神经网络的作用就是将我们这些转化后的向量,转化成一个能表示上下文的隐藏表示。

这其中表示的是我们神经网络的参数,我在后续的讲解中会涉及到。

3.根据上下文表示预测下一个 Token

有了h这个上下文的表示函数,接下来我们就可以通过一个线性层这样计算后,我们就可以得到接下来可能生成的每个token的分数(logit,其实就是神经网络给每个token的一个原始分数),然后经过softmax函数将我们的所有token的分数logit转化成一个合法的概率分布。

softmax这个函数很有意思,soft本意是柔软的,max本意又是最大值。而我们的softmax就是两者的中和,一方面我们的softmax函数使用后很容易知道概率最大的那个token(max),另一方面我们的softmax函数也不会舍弃掉那些概率的很低的token(soft),他俩一结合就变成我们的softmax函数了。

softmax的公式:

:表示的是每个token的得分

T:温度系数,现在不做过多叙述,后面如果我会写LLM推理相关内容,到时候再详细介绍。

到这里我们的神经网络就完成了我们的下一个token的概率预测部分

4.学习和反向传播

在模型的最开始我不是说了随机化我们的token吗,因此在模型开始学习的第一轮我们得到的神经网络预测往往也是随机概率。

例如:我喜欢吃 ——》汽车:0.4

苹果:0.1

香蕉:0.1

火车:0.4

很明显这个概率非常的逆天,毕竟人不太可能喜欢吃汽车和火车吧,这时候我们的训练数据就发挥它的作用了,他会告诉我们的正确答案是什么,然后我们的损失函数就会给我们的模型一定的惩罚。

,又因为我们的P(apple)的概率是0.1,因此他的损失值会很大,这时候我们的神经网络就会根据这个概率太低了而进行反向传播,然后就会使用优化器进行参数更新,就相当于我们人类做错题之后的复盘,在经过过这次反向传播之后我们的模型就会开始变的更加聪明一些。

这时候没有深度学习基础的孩子就会问,哪什么是反向传播和优化器呀?

反向传播(Backpropagation)

反向传播主要是解决我们Loss变大/变小,到底和我们的模型中的哪些参数有关,如果想要改变loss我们又该如何去调整我们的参数。

假设模型里有参数:

最后我们会得到:
反向传播的过程就是对我们的Loss值计算偏导数:

算出来的这几个就叫做梯度

那什么又是梯度呢?

梯度本质就是求导嘛,所以说我们的梯度表示的就是我们的Loss对于参数的一个敏感程度(也就是变化的快慢)和变化的方向。

优化器
Gradient Descent(梯度下降):我认为是比较简单的一个优化器

公式:

其中:

  • w:模型参数
  • L:Loss
  • :梯度
  • :学习率(Learning Rate)

反向传播计算梯度,而我们的优化器使用梯度来对我们的参数进行更新

Loss——>反向传播——>优化器——>更新参数

碎碎语

断断续续写了两天,其实仔细一看,我仅仅写了word2vec的一些前置知识,希望我的word2vec(下)可以完结这一主题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询