Word Vectors

课堂笔记

word representation

How do we represent words in NLP models?

N-gram

定义：n-gram 是指从给定的文本或语音序列中连续取出的 n 个元素的序列。在自然语言处理领域，这些元素通常是单词。n-gram 模型是一种概率语言模型，用于估计给定文本序列出现的概率。它基于这样一个假设：一个单词出现的概率只取决于它前面的 n-1 个单词。例如，在二元语法（bigram，即 n=2 的 n-gram）模型中，“我 爱 自然语言处理” 这句话会被分解为 “我 爱”“爱 自然”“自然 语言”“语言 处理” 这样的二元词组，模型会学习每个二元词组出现的概率，比如 “爱 自然” 这个组合在语料库中出现的频率等，以此来预测文本的可能性或者进行语言生成等任务。

Copy P(w 1,w 2,...,wn)=∏i=1 n P(wi∣w i−1)P(wi∣w i−1)=C(w i−1,wi)+αC(w i−1)+α∣V∣P(w_1,w_2,...,w_n) = \prod_{i=1}^{n}P(w_i|w_{i-1})\\ P(w_i|w_{i-1})=\frac{C(w_{i-1},w_i)+\alpha}{C(w_{i-1})+\alpha|V|}P(w1​,w2​,...,wn​)=i=1∏n​P(wi​∣wi−1​)P(wi​∣wi−1​)=C(wi−1​)+α∣V∣C(wi−1​,wi​)+α​

第一个公式表示一个单词序列 w 1,w 2,...,wn w_1,w_2,...,w_nw1​,w2​,...,wn​ 的联合概率。它通过将每个单词wi w_iwi​出现的概率（条件于前一个单词 w i−1 w_{i-1}wi−1​）相乘来计算整个序列的概率。这种分解方式称为链式法则（chain rule）。
第二个公式这个公式计算给定前一个单词w i−1 w_{i-1}wi−1​ 时，当前单词 wi w_iwi​出现的条件概率。公式中的各个部分解释如下：

C(w i−1,wi)C(w _{i−1} ,w_{i} )C(wi−1​,wi​)：表示在训练数据中，单词对 (w i−1,wi)(w_{i-1},w_i)(wi−1​,wi​) 出现的次数。

C(w i−1)C(w_{i−1} )C(wi−1​)：表示单词 w i−1 w_{i-1}wi−1​在训练数据中出现的次数。

∣V∣：表示词汇表的大小，即词汇表中不同单词的数量。

α：是一个平滑参数，用于避免零概率问题。它是一个介于 0 和 1 之间的值，通常用于调整未见过的单词对的概率。

具体细节

Definition: An n-gram is a chunk of n consecutive words.
•unigrams: “the”, “students”, “opened”, ”their”
•bigrams: “the students”, “students opened”, “opened their”
•trigrams: “the students opened”, “students opened their”
•four-grams: “the students opened their”
理念：收集不同 n-gram 出现的频率，并使用这些数据预测下一个单词。

First we make a Markov assumption: xn x^nxn depends only on the preceding n-1 words

我们如何获取这些 n 元组和 (n-1) 元组的概率？回答：通过在一些大型文本语料库中计数它们！

示例

假设我们正在学习一个 4-gram 语言模型：

稀疏问题（Sparsity Problems）

n-gram 模型是自然语言处理中用于预测文本序列的一种方法，它基于假设一个词的出现只依赖于它前面的 n-1 个词。然而，当 n 的值较大时，稀疏问题会变得更加严重，因为可能存在许多未见过的 n-gram 组合。

稀疏问题 1（Sparsity Problem 1）：
问题：
如果某个特定的词或词组（如 “students opened their w”）在训练数据中从未出现过，那么根据 n-gram 模型，这个词或词组的概率将为 0。这会导致模型无法为这些未见过的词或词组分配任何概率。
部分解决方案：
平滑（Smoothing）：为了解决这个问题，可以在每个词的计数中添加一个小的值 δ。这样即使某个词或词组在数据中从未出现过，它的概率也不会是 0。平滑技术可以确保所有词都有一个非零的概率，从而避免概率为 0 的情况。
稀疏问题 2（Sparsity Problem 2）：
问题：
如果一个更长的 n-gram（如 “students opened their”）在数据中从未出现过，那么模型将无法计算任何跟随这个词组的词（如 w）的概率。
部分解决方案：
回退（Backoff）：在这种情况下，可以回退到一个更短的 n-gram（如 “opened their”）来计算概率。这种方法允许模型在遇到未见过的长 n-gram 时，使用更短的 n-gram 来估计概率。
注意事项：
增加 n 的影响： 增加 n（n-gram 的长度）会使稀疏问题更加严重。通常，我们不能让 n 大于 5，因为随着 n 的增加，未见过的 n-gram 组合的数量会急剧增加，导致更多的稀疏问题。
通过这些方法，n-gram 语言模型可以在一定程度上缓解稀疏问题，提高模型的泛化能力和预测准确性。然而，这些方法也有其局限性，例如平滑可能会引入一些噪声，而回退可能会丢失一些上下文信息。因此，在实际应用中，选择合适的 n 值和平滑技术是非常重要的。

Storage Problems

存储需求：n-gram 模型需要存储在训练语料库中观察到的所有 n-grams 的计数。这意味着模型的大小与训练数据中不同 n-grams 的数量成正比。
模型大小的影响因素：

增加 n：n-gram 的长度 n 增加时，模型需要存储更多的 n-grams 计数，因为更长的 n-grams 组合数量会急剧增加。

增加语料库：训练语料库的增加也会增加模型的大小，因为更多的文本意味着更多的 n-grams 组合。
解决方案和挑战：

存储优化：由于 n-gram 模型的存储需求随着 n 的增加和语料库的扩大而增加，因此需要有效的存储优化技术，如压缩、哈希表等，来减少存储空间。

模型简化：可以通过限制 n-gram 的长度、使用更高效的数据结构或算法来简化模型，以减少存储需求。

稀疏性问题：随着 n 的增加，稀疏性问题（即许多 n-grams 在训练数据中从未出现）变得更加严重，这需要使用平滑技术来解决。

替代模型：可以考虑使用更先进的模型，如神经网络模型（如 Transformer），这些模型通常更紧凑，能够以更少的参数学习更复杂的语言模式。

朴素贝叶斯

朴素贝叶斯是一种基于贝叶斯定理的简单概率分类器，它假设特征之间相互独立。在文本分类任务中，朴素贝叶斯模型可以用于计算给定类别 cj​ 下单词 wi​ 出现的概率。
公式如下：
P(ˆ wi​∣cj​)=Count(wi​,cj​)+α​Σ w∈V​Count(w,cj​)+α∣V∣P\^(w_i​∣c_j​)=\frac{Count(wi​,cj​)+α​}{\Sigma_{w∈V}​Count(w,c_j​)+α∣V∣}P(ˆ​wi​​∣cj​​)=Σw∈V​​Count(w,cj​​)+α∣V∣Count(wi​,cj​)+α​​
公式解释：

P(ˆ wi​∣cj​)P\^(wi​∣cj​)P(ˆ​wi​∣cj​)：表示在给定类别 cj​ 的条件下，单词 wi​ 出现的概率。这是模型预测的估计概率。

Count (wi​,cj​)：表示在类别 cj​ 中，单词 wi​ 出现的次数。

∑w∈V​Count(w,cj​)∑_{w∈V​}Count(w,cj​)∑w∈V​​Count(w,cj​)：表示在类别 cj​ 中，所有单词出现次数的总和。这里 V 是词汇表，表示所有可能的单词。

α：是平滑参数，用于处理数据稀疏问题，避免出现零概率。它是一个介于 0 和 1 之间的值。

∣V∣：表示词汇表的大小，即词汇表中不同单词的数量。
平滑技术：
在朴素贝叶斯模型中，平滑技术同样用于处理数据稀疏问题。具体来说，公式中的平滑技术通过在分子和分母中都加上 α 来实现：

在分子中加上 α：Count (wi​,cj​)+α，这表示即使单词 wi​ 在类别 cj​ 中没有出现过，它的概率也不会是零，而是 α。

在分母中加上 α∣V∣：∑w∈V​Count(w,cj​)+α∣V∣∑_{w∈V​}Count(w,cj​)+α∣V∣∑w∈V​​Count(w,cj​)+α∣V∣，这表示即使某些单词在类别 cj​ 中没有出现过，它们的概率也不会是零，而是被均匀分配。

为什么需要在 NLP 模型关注语义？

如果用文字：a feature is a word identity (= string)
比如说上一个词是‘terrible’，需要在测试集和训练集中有完全相同的 'terrible'。
但如果能将语义转化为向量：

previous word was vector [35, 22, 17, …]

Now in the test set we might see a similar vector [34, 21, 14, …]

We can generalize to similar but unseen words!!!

在传统的 NLP 中，我们把单词视作离散的向量，用 one-hot 向量表示，向量维度 = 词汇表中单词数量。但这种方法没有提供自然相似度的办法。

分布语义学：一个词的意义由经常出现在其附近的词给出

When a word w appears in a text, its context is the set of words that appear nearby(within a fixed-size window). We use the many contexts of w to build up a representation of w。

我们可以用向量表示一个词的上下文！

What do words mean?

同义词：couch/sofa, car/automobile, filbert/hazelnut

反义词：dark/light, rise/fall, up/down

一些词不是同义词，但他们共享一些意义元素，如：cat/dog, car/bicycle, cow/horse

一些词不相似，但他们是相关的：coffee/cup, house/door, chef/menu
The big idea: model of meaning focusing on similarity
相似词语是 “在向量空间中附近

词嵌入过程

Goal: represent words as short (50-300 dimensional) & dense (real-valued) vectors！

基于计数的方法（Count-based approaches）：
使用历史：这种方法自 90 年代以来一直在使用。
共现矩阵：构建一个稀疏的词 - 词共现（PPMI，Positive Pointwise Mutual Information）矩阵，该矩阵记录了不同词在文本中共同出现的频率。
SVD 分解：使用奇异值分解（SVD）对共现矩阵进行分解，以获得词的低维向量表示。

基于预测的方法（Prediction-based approaches）：
机器学习问题：将词嵌入问题表述为一个机器学习问题，通过预测上下文中的词来学习词的表示。
Word2vec：由 Mikolov 等人在 2013 年提出，Word2vec 通过预测给定词的上下文词或通过上下文词预测中心词来学习词向量。
GloVe：由 Pennington 等人在 2014 年提出，GloVe（Global Vectors for Word Representation）利用全局词 - 词共现信息来学习词向量。

Word embeddings: the learning problem

从文本中学习向量来表示单词。
输入：
一个大型文本语料库（text corpus）和词汇表 V。
向量维度 d（例如，300 维）。
输出：
一个函数 f→Rd，它将词汇表中的每个词映射到一个 d 维的实数向量空间中。
学习过程：
词嵌入的学习过程通常涉及优化一个目标函数，该函数衡量模型在预测任务（如预测上下文中的词）上的性能。
通过训练，模型学习到的词向量能够捕捉词与词之间的关系，例如同义词、反义词、词的类别等。
基本属性：

相似词语具有相似向量 argmaxcos (e (w),w (w*))

“man”（男性）和 “woman”（女性）之间的关系，以及 “king”（国王）和 “queen”（王后）之间的关系。在词嵌入空间中，这两个关系是相似的，即 vman​−vwoman​≈vking​−vqueen​。这意味着从 “man” 到 “woman” 的向量与从 “king” 到 “queen” 的向量相似。

动词时态（Verb tense）：如 “walk”（走）、“walked”（走过）、“swim”（游泳）和 “swam”（游过）。这些关系在词嵌入空间中也是相似的，即 vwalking​−vwalked​≈vswimming​−vswam​。

国家 - 首都（Country-Capital）：如 “France”（法国）和 “Paris”（巴黎）、“Italy”（意大利）和 “Rome”（罗马）。这些关系在词嵌入空间中也是相似的，即 vParis​−vFrance​≈vRome​−vItaly​。

解决类比问题的方法：通过计算向量的差和余弦相似度来找到类比词。具体步骤如下：
定义类比关系：给定一个类比关系 a:a∗::b:b∗a:a^∗:: b : b^∗a:a∗::b:b∗，其中 a 和 b 是已知词，a∗ 和 b∗ 是需要找到的类比词。
计算向量差：计算 e (a∗)−e (a)+e (b)，其中 e (w) 表示词 w 的向量表示。
寻找最相似的词：在词汇表 V 中找到与 e (a∗)−e (a)+e (b) 余弦相似度最大的词 b∗，即 b∗=argmaxw∈V​cos (e (w),e (a∗)−e (a)+e (b))。

这张图展示了通过神经网络学习语言模型（LMs）的过程，特别是如何引入词嵌入（word embedding）的概念。图中描述的模型是神经概率语言模型（Neural Probabilistic Language Model），由 Yoshua Bengio、Réjean Ducharme、Pascal Vincent 和 Christian Jauvin 在 2003 年提出。
图中元素解释：

输入层（Index for wt−n+1​, wt−2​, wt−1​）：
这些是前 n 个词的索引，表示上下文。每个词通过查找表（Table look-up）映射到一个向量表示，即词嵌入。

词嵌入层（C(wt−n+1​), C(wt−2​), C(wt−1​)）：
每个词的索引通过查找表映射到一个向量，这些向量是共享的参数（shared parameters across words），表示词嵌入。

隐藏层（tanh）：
词嵌入向量被连接起来，并通过一个非线性激活函数（如 tanh）处理。这一步是模型中计算量最大的部分。

输出层（softmax）：
隐藏层的输出通过 softmax 函数转换为概率分布，表示在给定上下文下每个可能的下一个词的概率。

输出（t-th output = P(wt​=i∣context)）：
最终输出是给定上下文条件下，第 t 个词为某个特定词 i 的概率。

word2vec

skip-gram

Skip-gram 模型的目标是使用每个词来预测其上下文中的其他词。
假设：
我们有一个大型文本语料库w 1​,w 2​,...,wT∈V w1_​,w_2​,...,w_T \in Vw1​​,w2​​,...,wT​∈V​
关键思想：
使用每个词来预测其上下文中的其他词。这是一个分类问题，因为模型需要从词汇表中选择正确的上下文词。
上下文：
上下文定义为一个固定大小的窗口，大小为 2m（图中例子中 m=2）。这意味着对于每个中心词，模型会考虑其前后各 m 个词作为上下文。
概率计算：
给定中心词 a，模型需要计算其他词 b 成为上下文词的概率 P (b∣a)。
这个概率分布 P (⋅∣a) 定义为 ∑w∈V​P (w∣a)=1，即所有可能的上下文词的概率之和为 1。
图中展示了一个中心词 "into"，其上下文窗口大小为 2，包括前后各一个词，即 "problems"、"turning"、"banking"、"crises" 和 "as"。
模型需要学习如何根据中心词预测这些上下文词。
Skip-gram 模型的原理：
目标：对于每个中心词，模型的目标是最大化其上下文词的概率。
损失函数：通常使用交叉熵损失函数来训练模型，即最小化预测概率分布与实际上下文词分布之间的差异。
优化：通过梯度下降或其他优化算法来调整模型参数，以最小化损失函数。

这张图进一步解释了 Skip-gram 模型的训练过程，展示了如何将文本数据转换成模型可以处理的格式，并说明了模型的训练目标。
上下文窗口：
图中展示了一个大小为 2 的固定窗口，这意味着对于每个中心词（图中红色标记的词），模型会考虑其前后各两个词作为上下文。
概率计算：
对于每个中心词，模型需要计算其上下文词的概率。例如，给定中心词 "into"，模型需要计算 "problems"、"turning"、"banking"、"crises" 和 "as" 成为上下文词的概率。
训练数据转换：
图中右侧展示了如何将原始文本数据转换成模型训练所需的格式。例如，对于中心词 "into"，模型会生成训练样本 (into, problems)、(into, turning)、(into, banking)、(into, crises) 等。
训练目标：
模型的训练目标是找到一组参数，这些参数能够最大化上下文词的概率。换句话说，模型试图学习到的词向量能够最好地预测给定中心词的上下文词。
目标函数：

如何定义P(w t+j∣wt;θ)P(w_{t+j}|w_t;\theta)P(wt+j​∣wt​;θ)？
这是通过使用词向量和 Softmax 函数来实现的。
两组向量：
对于词汇表 V 中的每个词，使用两组向量：
ua​∈Rd：中心词 a 的向量，对于所有 a∈V。
vb​∈Rd：上下文词 b 的向量，对于所有 b∈V。
内积：
使用内积 ua​⋅vb​ 来衡量中心词 a 与上下文词 b 一起出现的可能性。
Softmax 函数：
使用 Softmax 函数将内积转换为概率分布。这是通过将内积的指数与所有可能的上下文词的指数和进行归一化来实现的。
概率分布：
P (⋅∣wt​) 是一个定义在词汇表 V 上的概率分布，表示给定中心词 wt​ 时，每个可能的上下文词出现的概率。

vs Multinomial Logistic Regression

多项式逻辑回归：
公式：
多项式逻辑回归用于多分类问题，其公式为：
P(y=c∣x)=∑j=1m​exp(wj​⋅x+bj​)exp(wc​⋅x+bc​)​
其中，y 是类别标签，c 是其中一个类别，x 是输入特征向量，wc​ 和 bc​ 分别是类别 c 的权重向量和偏置项，m 是类别总数。
解释：
公式中的分子是输入特征向量 x 和类别 c 的权重向量 wc​ 的内积加上偏置项 bc​ 的指数。
分母是所有类别的指数和，用于归一化，使得所有类别的概率之和为 1。

Skip-gram 模型：
公式：
Skip-gram 模型中的概率计算公式为：
P(wt+j​∣wt​)=∑k∈V​exp(uwt​​⋅vk​)exp(uwt​​⋅vwt+j​​)​
其中，wt​ 是中心词，wt+j​ 是上下文词，uwt​​ 和 vwt+j​​ 分别是中心词和上下文词的向量表示，V 是词汇表。
解释：
公式中的分子是中心词 wt​ 和上下文词 wt+j​ 的向量内积的指数。
分母是中心词 wt​ 与词汇表中所有词的向量内积的指数和，用于归一化。

比较：
本质上是 ∣V∣ 路分类问题：Skip-gram 模型可以看作是一个多分类问题，其中 ∣V∣ 是词汇表的大小。
固定 uwt​​ 时：如果固定中心词的向量 uwt​​，那么问题就简化为一个多项式逻辑回归问题。
非凸优化问题：由于需要同时学习中心词和上下文词的向量，训练目标是非凸的，这意味着优化过程可能存在多个局部最优解。

vs 多项逻辑回归

Practise

The answer is (b).
Each word has two d-dimensional vectors, so it is 2 × | V | × d

问：为什么每个词需要两个向量而不是一个？
回答：因为一个词不太可能在其自身的上下文窗口中出现。例如，给定词 "dog" 时，P (dog∣dog) 应该是低的。如果我们只使用一组向量，模型本质上需要最小u dog⋅u dog u_{dog}⋅u_{dog}udog​⋅udog​，这会导致自指向量过于相似，从而影响模型性能。
问：哪组向量用作词嵌入？
回答：这是一个经验性问题。通常，只使用 uw u_wuw​作为词嵌入，但你也可以将两组向量连接起来使用。

Skip-gram with negative sampling (SGNS) 及其他变体

问题描述：
在传统的 Skip-gram 模型中，每次得到一对中心词和上下文词（t,c），都需要用词汇表中的所有词来更新上下文词向量 vk​。这在计算上是非常昂贵的。
负采样方法：
负采样不是考虑词汇表中的所有词，而是随机采样 K 个（通常 K 在 5 到 20 之间）负样本。这意味着我们只从词汇表中随机选择 K 个词作为负样本，而不是使用所有词。
Softmax 和负采样公式：
Softmax：原始的 Skip-gram 模型使用 Softmax 函数来计算概率，公式为：
y=−log(∑k∈V​exp(ut​⋅vk​)exp(ut​⋅vc​)​)
负采样：负采样方法将 Softmax 替换为一个更简单的公式，公式为：
y=−log(σ(ut​⋅vc​))−i=1∑K​Ej∼P(w)​log(σ(−ut​⋅vj​))
其中，σ(x)=1+exp (−x) 1​ 是 sigmoid 函数，用于将内积转换为概率。

关键思想：
将原本的 ∣V∣- 路分类问题（其中 ∣V∣ 是词汇表的大小）转换为一组二元分类任务。
每次得到一对词 (t,c) 时，模型不是在词汇表中的所有词中预测 c，而是预测 (t,c) 是一个正样本对，而 (t,c′) 是一个负样本对，其中 c′ 是从一个小的采样集合中随机选择的。
正样本和负样本：
正样本：例如，对于中心词 "apricot" 和上下文词 "tablespoon"，这是一个正样本对。
负样本：例如，对于中心词 "apricot" 和随机选择的词 "aardvark"，这是一个负样本对。
损失函数：
损失函数 y 被定义为：
y=−log(σ(ut​⋅vc​))−i=1∑K​Ej∼P(w)​log(σ(−ut​⋅vj​))
其中，σ(x)=1+exp (−x) 1​ 是 sigmoid 函数，K 是负样本的数量，P (w) 是根据词的频率进行采样的概率分布。
概率计算：
给定中心词 t 和上下文词 c 的概率 P (y=1∣t,c) 通过 σ(ut​⋅vc​) 计算。
给定中心词 t 和负样本 c′ 的概率 P (y=0∣t,c′) 通过 1−σ(ut​⋅vc′​)=σ(−ut​⋅vc′​) 计算。
优化：
类似于二元逻辑回归，但需要同时优化中心词向量 ut​ 和上下文词向量 vc​。

Practise

d。

中心词 t 的向量 u t（维度为 d。

正样本上下文词 c 的向量 v c（维度为 d。

K 个负样本词的向量（每个维度为 d。

Continuous Bag of Words (CBOW）

GloVe: Global Vectors

这张图介绍了 GloVe（Global Vectors for Word Representation）模型，这是一种用于生成词嵌入的算法。GloVe 通过利用词的全局共现统计信息来学习词向量，与基于窗口的 Skip-gram 和 CBOW 方法不同，GloVe 直接利用整个语料库的共现矩阵来学习词向量。
关键思想：
直接使用词的共现计数来近似词向量之间的点积（ui​⋅vj​）。
全局共现统计：
模型使用全局共现统计 Xij​，即词 i 和词 j 在语料库中共同出现的频率。
损失函数 J(θ)：
GloVe 的损失函数定义为：
J(θ)=i,j∈V∑​f(Xij​)(ui​⋅vj​+bi​+b~j​−logXij​)2
其中，f (Xij​) 是一个权重函数，用于调整共现频率较低的词对的影响；ui​ 和 vj​ 分别是词 i 和词 j 的向量表示；bi​ 和 bj​ 是偏置项；Xij​ 是词 i 和词 j 的共现频率。
训练速度和可扩展性：
GloVe 模型训练更快，可以扩展到非常大的语料库。
权重函数 f：
图中右下角的图示展示了权重函数 f 的形状，它通常是一个平滑的递增函数，用于减少低频共现词对的影响。
GloVe 的优势：
全局信息：GloVe 利用整个语料库的共现信息，这使得它能够捕捉更广泛的语义关系。
训练效率：由于其矩阵分解的形式，GloVe 在训练时比基于窗口的方法更高效。
可扩展性：GloVe 可以处理非常大的语料库，这使得它在大规模数据集上表现良好。

FastText

这张图介绍了 FastText 模型中的子词嵌入（Subword Embeddings），这是一种改进的词嵌入方法，它通过将单词分解为子词（n-grams）来捕捉更细粒度的语义信息。
子词嵌入：
FastText 模型类似于 Skip-gram 模型，但它将单词分解为 n-grams（子词），其中 n 的范围是 3 到 6。
这种方法可以捕捉单词内部的语义信息，例如，单词 “where” 可以分解为子词 “wh”、“her”、“ere” 等。
示例：
图中给出了单词 “where” 的分解示例：
3-grams（三元组）：<wh, whe, her, ere, re>
4-grams（四元组）：<whe, wher, here, ere>
5-grams（五元组）：<wher, where, here>
6-grams（六元组）：<where, where>
替换操作：
在计算中心词和上下文词的向量内积时，FastText 模型用子词的向量和来替换原始单词的向量内积。
具体来说，如果 ui​⋅vj​ 是原始单词的向量内积，那么在 FastText 中，这个内积被替换为所有子词向量内积的和：
g∈n-grams(wi​)∑​ug​⋅vj​
其中，g 是单词 wi​ 的一个子词，n-grams (wi​) 表示单词 wi​ 所有可能的子词集合。
FastText 模型的优势：
捕捉内部结构：
通过将单词分解为子词，FastText 能够捕捉单词内部的结构信息，这对于理解词的语义非常有帮助。
处理罕见词和未知词：
子词嵌入可以更好地处理罕见词和未知词，因为即使单词在训练数据中没有出现过，其子词可能已经出现过。
提高泛化能力：
子词嵌入使得模型在面对新词时具有更好的泛化能力，因为它可以利用已知的子词信息来推断新词的语义。

训练好的可用词嵌入

word2vec: https://code.google.com/archive/p/word2vec/

GloVe: https://nlp.stanford.edu/projects/glove

FastText: https://fasttext.cc/

To contextualized word vectors using LMs

这张图展示了 ELMo（Embeddings from Language Models）模型的结构，这是一种用于生成词嵌入的深度学习模型。ELMo 由 Matthew E. Peters 等人在 2018 年提出，其论文《Deep contextualized word representations》详细介绍了该模型的原理和实现。
图中元素解释：

输入层（E1​,E2​,...,EN​）：
这些是词的输入嵌入，通常是词的 one-hot 编码或词频编码。

双向 LSTM 层：
图中展示了两层双向 LSTM（Long Short-Term Memory），每层由前向和后向两个 LSTM 组成。每个 LSTM 单元处理序列数据，能够捕捉词与词之间的长距离依赖关系。
双向 LSTM 能够同时考虑词的前后文信息，从而更好地理解词的上下文含义。

关于双向 LSTM 层的补充说明：

双向长短期记忆网络（Bidirectional Long Short-Term Memory，简称 Bi-LSTM 或双向 LSTM）是一种特殊的循环神经网络（RNN），它通过两个 LSTM 层来处理序列数据，一个层以正向（从序列的开始到结束）处理数据，另一个层以反向（从序列的结束到开始）处理数据。这种结构使得网络能够同时考虑序列中每个元素的前后文信息。

结构：在双向 LSTM 中，对于序列中的每个时间步 t，都有两个 LSTM 单元在工作：
前向 LSTM（Forward LSTM）：这个 LSTM 单元从序列的第一个元素开始，按时间步正向处理序列，直到最后一个元素。对于每个时间步 t，它只考虑从序列开始到当前时间步的信息。
后向 LSTM（Backward LSTM）：这个 LSTM 单元从序列的最后一个元素开始，按时间步反向处理序列，直到第一个元素。对于每个时间步 t，它只考虑从序列结束到当前时间步的信息。

信息流：在每个时间步 t，前向 LSTM 和后向 LSTM 都会产生一个隐藏状态。这两个隐藏状态包含了关于序列中该位置元素的上下文信息，一个来自序列的前面，另一个来自序列的后面。
-** 输出 **：双向 LSTM 的输出可以有几种不同的组合方式：

拼接（Concatenation）：将前向和后向 LSTM 在每个时间步的输出拼接起来，形成一个更长的向量。这种方式保留了序列中每个位置的双向上下文信息。
加和（Summation）：将前向和后向 LSTM 的输出向量在每个时间步相加。这种方式将双向信息合并，但可能会丢失一些细节。

取平均（Averaging）：将前向和后向 LSTM 的输出向量在每个时间步取平均。这种方式也是将双向信息合并，但可能会降低模型对某些特定方向信息的敏感度。

单独使用（Separate Use）：在某些情况下，前向和后向 LSTM 的输出可能会被单独使用，尤其是在模型的不同部分需要不同方向的信息时。

输出层（T1​,T2​,...,TN​）：
这些是经过 LSTM 处理后的词的表示。每个词的表示是其在不同 LSTM 层的输出的加权和。
原理：

词嵌入的上下文化：传统的词嵌入（如 Word2Vec 或 GloVe）是静态的，不考虑词的上下文。而 ELMo 通过使用双向 LSTM，能够生成上下文化的词嵌入，即同一个词在不同上下文中可以有不同的表示。

捕捉长距离依赖：LSTM 特别适合处理序列数据，能够捕捉词与词之间的长距离依赖关系。这对于理解语言中的复杂结构（如句法和语义）非常重要。

双向信息流：通过同时考虑词的前后文信息，ELMo 能够更全面地理解词的含义。这对于处理歧义词和理解上下文非常重要。

Evaluating Word vectors

外在评估

让我们将这些词嵌入到真实的 NLP 中，系统和查看能否提高性能，可能需要很长时间，但仍然是最重要的评估指标

内在评估

评估特定 / 中间子任务

快速计算

不清楚这实际上是否有助于下游任务

词汇表假设：假设存在一个从训练集中构建的包含数万个单词的固定词汇表。在测试时遇到的所有新单词都将被映射到一个单一的 “UNK”（未知词）。
词汇映射示例：
常见词：如 “hat”（帽子）映射到词汇表中的 “pizza”（索引），“learn”（学习）映射到 “tasty”（索引）。
变体、拼写错误、新项：“taaaaaasty”（变体）、“laern”（拼写错误）、“Transformerify”（新项）都被映射到 “UNK”（索引）。
有限词汇表假设的局限性：在许多语言中，有限词汇表假设的意义更小。因为许多语言具有复杂的形态学或词结构，这会导致更多的词类型，但每种词出现的次数更少。

Language Models

Narrow Sense

A probabilistic model that assigns a probability to every finite sequence (grammatical or not)
GPT-3 still acts in this way but the model is implemented as a very large neural network of 175-
billion parameters!

Broad Sense

图中详细展示了三种主要的预训练语言模型架构：仅解码器模型（Decoder-only models）、仅编码器模型（Encoder-only models）和编码器 - 解码器模型（Encoder-decoder models），以及它们的典型应用。

仅解码器模型（Decoder-only models）：
代表模型：GPT-x 模型（如 GPT-2, GPT-3）。这些模型主要用于生成任务，如文本生成、问答等。它们通常使用自回归方法，从左到右生成文本。

仅编码器模型（Encoder-only models）：
代表模型：BERT、RoBERTa、ELECTRA。这些模型通过编码器处理输入文本，生成文本的表示，但不进行文本生成。它们主要用于理解任务，如文本分类、命名实体识别等。BERT 模型使用了掩码语言模型（Mask LM）和下一个句子预测（NSP）作为预训练目标，以学习词的上下文表示。

编码器 - 解码器模型（Encoder-decoder models）：
代表模型：T5、BART。这些模型结合了编码器和解码器，可以处理生成任务和理解任务。编码器生成文本表示，解码器基于这些表示生成输出文本。这种结构使得模型能够处理生成任务和理解任务，如翻译、摘要等。
图中示例解释：

BERT：
BERT 使用了掩码语言模型（Mask LM）和下一个句子预测（NSP）作为预训练目标。图中展示了 BERT 如何处理两个掩码句子（Masked Sentence A 和 Masked Sentence B）以及一个未标记的句子对（Unlabeled Sentence A and B Pair）。

T5：
T5 是一个编码器 - 解码器模型，它使用了一个不同的预训练目标。图中展示了 T5 在不同任务中的应用，包括翻译（将英语翻译成德语）、摘要（对文本进行摘要）、以及文本评估（判断文本的可接受性）。

原理：
掩码语言模型（Mask LM）：在 BERT 中，输入文本中的一些词被随机替换为特殊的 [MASK] 标记，模型需要预测这些被掩盖的词。这种方法使得模型能够学习到词的上下文表示。
下一个句子预测（NSP）：BERT 还使用 NSP 任务来学习句子之间的关系。模型需要预测两个输入句子是否是连续的文本。
编码器 - 解码器结构：在 T5 和 BART 中，编码器首先处理输入文本，生成文本的表示。然后，解码器基于这些表示生成输出文本。这种结构使得模型能够处理生成任务和理解任务。

构建神经语言模型

Approximately: Y. Bengio, et al. (2000/2003): A Neural Probabilistic Language Model

固定窗口神经语言模型的改进：

无稀疏性问题：
神经语言模型不会产生稀疏性问题，因为它不需要计算每个特定 n-gram 的概率，而是通过学习词向量和上下文来预测下一个词。

不需要存储所有观察到的 n-grams：
神经模型不需要像 n-gram 模型那样存储所有在语料库中观察到的 n-grams 及其计数，从而减少了存储需求。

存在的问题：

固定窗口太小：
固定窗口的大小限制了模型能够考虑的上下文范围。

扩大窗口会增加参数数量：
如果尝试扩大窗口以包含更多的上下文信息，模型的参数数量（权重矩阵 W 的大小）也会相应增加，这可能导致过拟合和计算成本增加。

窗口永远不够大：
无论窗口多大，总有一些长距离的依赖关系无法被捕捉。

输入处理缺乏对称性：
在固定窗口模型中，序列中不同位置的词会被不同的权重处理，这缺乏对称性。

解决方案：
循环神经网络（RNN）：
图中指出，需要一种能够处理任意长度输入的神经网络架构。RNN 是解决方案之一，因为它能够通过循环连接处理序列数据，无论序列长度如何。

More On Word Vectors

这张图展示了 MorphTE（一种在张量嵌入中注入形态学的方法）的工作流程，出自论文 “MorphTE: Injecting Morphology in Tensorized Embeddings”（NeurIPS 2022），作者包括 Guobing Gan、Peng Zhang 等。以下是对图中内容的详细解释：

左侧 - 词汇表（Vocabulary）：
展示了一个包含多个单词的词汇表，例如 “kindness”、“unkindly”、“unfeelingly”。这些单词将作为输入进入后续处理步骤。

中间左侧 - 词素分割（Morpheme Segmentation）：
对词汇表中的每个单词进行词素分割。例如，“kindness” 被分割为 “kind” 和 “ness”，“unkindly” 被分割为 “un”、“kind” 和 “ly”，“unfeelingly” 被分割为 “un”、“feel”、“ing” 和 “ly”。分割后的词素排列在一个矩阵中，矩阵的行数为词汇表大小 | V|，列数为单词的词素数量 n。

中间右侧 - 索引（Indexing）：
对分割后的词素进行索引，将每个词素映射到一个唯一的标识符。索引后的结果用于后续的嵌入操作。

右侧 - 词素嵌入矩阵（Morpheme Embedding Matrices）：
包含两个词素嵌入矩阵fl f_lfl​和fr f_rfr​，分别用于处理词素的左侧和右侧部分。这些矩阵将词素索引转换为低维向量表示。

最右侧 - 单词嵌入矩阵（Word Embedding matrix）：
通过将词素嵌入矩阵的结果进行组合（图中显示为加法操作），生成最终的单词嵌入向量。这些向量表示了单词的语义和形态信息。

图中的符号和参数解释如下：

n nn：单词的词素数量（词素顺序）。

q qq：词素向量的维度大小。

∣V∣|V|∣V∣：词汇表的大小。

∣M∣|M|∣M∣：词素词汇表的大小。

整体来看，这张图详细展示了 MorphTE 如何通过词素分割、索引和嵌入操作，将单词转换为包含形态学信息的向量表示。

训练词向量

怎么训练？

Practise

c

compute gradients for word2vec

Overall algorithm

这张图片展示的是一个整体算法，主要用于词嵌入相关任务，以下是详细解释：

输入部分

text corpus：文本语料库，即算法处理的文本数据来源。

embedding size d：嵌入维度大小，决定了每个词最终表示向量的维度。

vocabulary V：词汇表，包含所有可能出现的词。

context size m：上下文窗口大小，用于定义在文本中考虑的上下文范围。

初始化部分

对于词汇表 V 中的每个词 i，随机初始化两个向量ui\mathbf{u}_iui​和vi\mathbf{v}_ivi​。

训练部分

遍历训练语料库，对于每个训练实例(t,c)(t, c)(t,c)（其中t tt是目标词，c cc是上下文词）：

更新目标词向量ut\mathbf{u}_tut​：

公式为ut←ut−η∂y∂ut\mathbf{u}_t \leftarrow \mathbf{u}_t - \eta \frac{\partial y}{\partial \mathbf{u}_t}ut​←ut​−η∂ut​∂y​，其中∂y∂ut=−vc+∑k∈V P(k∣t)vk\frac{\partial y}{\partial \mathbf{u}_t} = -\mathbf{v}_c + \sum_{k \in V} P(k|t)\mathbf{v}_k∂ut​∂y​=−vc​+∑k∈V​P(k∣t)vk​ 。这里η\etaη是学习率，控制每次更新的步长。

更新上下文词向量vk\mathbf{v}_kvk​：

对于词汇表 V 中的每个词k kk，公式为vk←vk−η∂y∂vk\mathbf{v}_k \leftarrow \mathbf{v}_k - \eta \frac{\partial y}{\partial \mathbf{v}_k}vk​←vk​−η∂vk​∂y​ 。

当k=c k = ck=c（即当前上下文词）时，∂y∂vk=(P(k∣t)−1)ut\frac{\partial y}{\partial \mathbf{v}_k} = (P(k|t) - 1)\mathbf{u}_t∂vk​∂y​=(P(k∣t)−1)ut​；当k≠c k \neq ck=c时，∂y∂vk=P(k∣t)ut\frac{\partial y}{\partial \mathbf{v}_k} = P(k|t)\mathbf{u}_t∂vk​∂y​=P(k∣t)ut​ 。P(k∣t)P(k|t)P(k∣t)表示在给定目标词t tt的情况下，词k kk出现的概率。

右侧还展示了将训练数据转换为特定格式的示例，如 (into, problems) 等，体现了目标词和上下文词的组合形式。