赞
踩
本专栏将重点介绍自然语言处理技术中的深度学习方法,而不涉及传统的机器学习方法。后续会再出一个专栏更新。
在之前的博客中介绍了图神经网络(Graph Neural Networks, GNNs)的内容,旨在帮助初学者快速掌握这一复杂领域,以便于读者迅速投入到科研工作中去。在浏览这些图神经网络相关的资料时,读者经常会遇到一个关键术语 —— “嵌入表示”(Embedding),该术语用于描述图结构中单个节点的特征信息。尽管许多初学者可能对这个概念感到陌生,但它实际上起源于自然语言处理(NLP)领域。
为了深入理解"嵌入表示"这一概念,拥有NLP背景知识显得尤为重要。近来,在大模型(massive models)和多模态技术(multimodal technologies)飞速发展的大背景下,大多数技术的高阶目标正是为了产生更优秀的嵌入表示。因此,对于那些渴望深入理解这一领域的读者来说,认识到这部分知识的重要性不言而喻。更为关键的是,当前的大规模模型建构都是建立在Transformer架构的基础之上,这是NLP领域里一项真正意义上的革命性技术。
本文的宗旨在于为想学习NLP领域技术的初学者拨开这层面纱,以直观易懂的方式阐释这些革命性技术及其背后的深层次意义。通过回顾模型的基本理念,理解新兴技术的演进过程,读者将能在科研道路上行走得更加稳健,并在这一宏大的技术舞台上找到自己的位置和方向。
提示:本章节主要讲解N-gram模型和NNLM模型
在本文中,将进行对若干小而精的技术概念进行简要解读,使得每个模型都能在一篇短小精悍的博文中被概述。对于那些更为核心和重要的技术,将专门撰写单独的文章来进行深入介绍,从而便于读者的阅读和查询。
在图神经网络的博文中对神经网络的内容进行引入,本文将对神经网络的基本概念进行一次概要复习,以确保读者能够清楚地理解其与后续技术内容的关系。在其最核心的层面,神经网络模型主要是利用一系列参数和激活函数来拟合数据,目的是为了在分类或回归任务中实现精准的数据预测。这一过程通过梯度优化技术来调整参数,使得在有监督学习的框架中模型得以迭代和优化。简单来说,深度学习的基石便是这些神经网络结构,它们是实现复杂学习任务的动力引擎。
在上图展示的是一个典型的三层前馈神经网络架构,包括输入层、隐藏层和输出层。输入向量 X X X 定义为 X = [ x 1 , x 2 , … , x K ] X = [x_1, x_2, \ldots, x_K] X=[x1,x2,…,xK],这里的 K K K 代表了输入特征的维数。在网络的首个处理阶段,输入向量 X X X 与权重矩阵 W k i W_{ki} Wki 进行矩阵乘法运算,其中 W k i W_{ki} Wki 的每一项都代表了从输入层到隐藏层之间的权重值。这种乘法的结果会传递至非线性激活函数,得到隐藏层输出 h h h。隐藏层到输出层的传递过程遵循同样的模式,包括权重运算及激活函数的应用。
神经网络从宏观上看这个操作第一层本质上就是一个特征提取层,或者是输入向量映射到另一个维度空间的转换过程,通过运用深度网络结构和非线性激活函数,可以更贴近地近似数据的概率分布,进而对数据进行深度操作和处理。
在开始之前先来了解下什么是语言模型呢?
先来看下wiki的定义:
图中对语言模型的定义颇为复杂,但归根结底,不过是一种处理条件概率的工具。简单来说,语言模型能够评估构成句子的相同单词序列的概率,不同的单词排列会导致不同的概率,而概率最高的序列通常是最符合自然语言规律的。
考虑两个语句:
虽然两个句子使用了相同的词汇,“猫坐在垫子上”这句更符合中文的句子结构,因此更加通顺。因此,模型会计算两个句子的概率,并得出: P ( 猫坐在垫子上 ) > P ( 坐猫在垫子上 ) P(猫坐在垫子上) > P(坐猫在垫子上) P(猫坐在垫子上)>P(坐猫在垫子上)。这表示在中文语境中,“猫坐在垫子上”出现的可能性要大于“坐猫在垫子上”,模型的预测也会相应地偏向于第一个句子。
语言模型要做的就是这部分工作,目标是计算一个句子或一系列词的概率:
c
o
m
p
u
t
e
:
p
(
s
)
=
p
(
w
1
,
w
2
,
.
.
.
,
w
n
)
compute: p(s) = p(w_1, w_2, ... , w_n)
compute:p(s)=p(w1,w2,...,wn)
Chain Rule一种计算上述概率的方法是通过应用概率论中的链式法则(chain rule),联合概率在事件之间存在相关性的情况下是,是通过条件概率得到的:
p
(
w
1
,
w
2
,
.
.
.
,
w
n
)
=
p
(
w
1
)
⋅
p
(
w
2
∣
w
1
)
⋅
p
(
w
3
∣
w
1
,
w
2
)
⋅
.
.
.
⋅
p
(
w
n
∣
w
1
,
w
2
,
.
.
.
,
w
n
−
1
)
p(w_1, w_2, ..., w_n) = p(w_1) \cdot p(w_2 | w_1) \cdot p(w_3 | w_1, w_2) \cdot ... \cdot p(w_n | w_1, w_2, ..., w_{n-1})
p(w1,w2,...,wn)=p(w1)⋅p(w2∣w1)⋅p(w3∣w1,w2)⋅...⋅p(wn∣w1,w2,...,wn−1)
这些条件概率可以通过统计语料库中的词语组合频率 (词频)来计算得到。然而,这种方法存在一个问题: 如果分析的句子很长,那么需要计算的词组也将变得很长,而在实际的语料库中,大部分这样的长词组是不存在的,这就造成了数据的严重稀疏性问题。 即那就会出现概率为0的情况,因此整个概率计算就出现了问题。
举个例子,“我喜欢吃螺蛳粉和牛肉饭以及臭豆腐”。这么长的句子在各种文献中出现相同的概率很低,难道这句话不符合人类语言的习惯吗?显然不是,但是这会被上述计算方式的语言模型判断概率为0,因此显然是不合理的。
因此,为了解决这一问题,采纳了马尔可夫假设作为一种缓解策略。
马尔可夫假设是指,在一定的条件概率计算中,仅考虑有限的前置词语;也就是说,一个词的出现仅受其前面一定数量的词的影响。这大大简化了复杂性问题,因为它减少了必需观测和计算的词语组合的数量。因此出现了第一个语言模型N-Gram模型。
https://web.stanford.edu/~jurafsky/slp3/3.pdf N-gram原论文地址
N-gram模型是一种基本的统计语言模型,它依据统计数据来确定各个单词的出现概率。在这个框架下,一个句子的总体概率被解释为构成这个句子的单个单词概率的联合产物。但是由于上文中说到的数据稀疏问题,对模型进行设计只考虑当前词和距离较近的单词相关。这也相对来说比较符合人类的直觉。通常这个数值不超过5。对于一个句子中的词序列 w 1 , w 2 , … , w n w_1, w_2, \ldots, w_n w1,w2,…,wn,N-gram模型的概率可以用下面的公式来表示:
P ( w 1 , w 2 , … , w n ) = ∏ i = 1 n P ( w i ∣ w i − ( N − 1 ) , … , w i − 1 ) P(w_1, w_2, \ldots, w_n) = \prod_{i=1}^{n} P(w_i | w_{i-(N-1)}, \ldots, w_{i-1}) P(w1,w2,…,wn)=i=1∏nP(wi∣wi−(N−1),…,wi−1)
其中, P ( w i ∣ w i − ( N − 1 ) , … , w i − 1 ) P(w_i | w_{i-(N-1)}, \ldots, w_{i-1}) P(wi∣wi−(N−1),…,wi−1) 是在已知前 N − 1 N-1 N−1 个词的条件下,词 w i w_i wi 出现的条件概率。在实际应用中,由于计算上和数据的可获取性的限制,通常N的取值为2(bigram模型)或3(trigram模型)。
即使这样还会存在一些词组不存在的问题,,因此为了解决在语料库中不存在的词组合问题, N-gram模型通常会采用一种称为平滑(Smoothing)或拉普拉斯平滑(Laplace Smoothing)的技巧。平滑的基本思想是给语料库中未出现的词组合赋予一个小的概率值,而不是零概率,这样可以避免计算联合概率时出现零概率的情况。
例如,加一平滑(也称作Laplace平滑)是最简单的平滑方法,它通过在所有可能的词组合计数上加一来实现,对于bigram模型来说,加一平滑的条件概率计算公式为:
P Laplace ( w i ∣ w i − 1 ) = C ( w i − 1 , w i ) + 1 C ( w i − 1 ) + V P_{\text{Laplace}}(w_i | w_{i-1}) = \frac{C(w_{i-1}, w_i) + 1}{C(w_{i-1}) + V} PLaplace(wi∣wi−1)=C(wi−1)+VC(wi−1,wi)+1
其中:
通过这种方法,即使某个词组合在训练集中没有出现,也可以赋予它一个非零的概率,从而使模型能够处理那些在训练阶段未观察到的词组合。然而这种方式一定程度上会降低原本存在组合的置信度。
加一平滑(Laplace Smoothing)会对频繁出现的词组合的概率产生负面影响,这可能会导致模型的性能下降。因此,为了更精细地平衡未知词组合的概率与已知词组合的概率,插值(Interpolation)技术被提出。
插值技术的思想是组合不同阶的N-gram模型来预测词的概率,即同时考虑unigram、bigram、trigram等的信息。这样做的好处是,即使一个特定的N-gram没有在训练集中出现,模型仍然可以利用低阶N-gram给出一个概率估计。
假设使用bigram和unigram的插值(unigram为N=1。bigram为N=2 ,为在N-gram模型中N得取值),那么条件概率计算公式可以表示为:
P Interpolation ( w i ∣ w i − 1 ) = λ P bigram ( w i ∣ w i − 1 ) + ( 1 − λ ) P unigram ( w i ) P_{\text{Interpolation}}(w_i | w_{i-1}) = \lambda P_{\text{bigram}}(w_i | w_{i-1}) + (1 - \lambda)P_{\text{unigram}}(w_i) PInterpolation(wi∣wi−1)=λPbigram(wi∣wi−1)+(1−λ)Punigram(wi)
其中:
通过调节参数 λ \lambda λ,可以控制模型在未知词组合和已知词组合之间的平衡。
N-gram是自然语言处理中的一种基础统计语言模型,它在某些情况下表现良好,但是也存在一些局限性,这主要来源于统计模型的假设情况,将所有单词孤立对待,只考虑其出现次数,忽略了单词的深层次信息予以关系和文本的真实语境。
假设有两个句子:
如果在训练语料中看到了很多类似于第一个句子的句子,但没有类似于第二个句子的句子,人类仍然可以从 “boy” 和 “girl”、“bicycle” 和 “bike” 之间的相似性推测出第二个句子的可能性。这是因为这两个句子在结构上非常相似,只是使用了不同的词汇。但是N-gram模型无法捕捉到这种推理能力,因为它只能根据前面的n个词来计算概率,无法理解词汇之间的语义关系。因此,在语料库不足的情况下,N-gram模型可能会给第二个句子赋予很低的概率。
在统计模型中,通常会使用独热编码(One-Hot Encoding)来表示单词。独热编码是一种将每个单词表示为一个稀疏向量的方法,其中向量的长度等于词汇表中的单词数量,向量中的每个元素都是0,除了表示单词的索引处为1。这样做的好处是可以将单词表示为一个固定长度的向量,使得它们可以被统计模型轻松地处理。
cat | dog | the | is | on | under | table | walks | |
---|---|---|---|---|---|---|---|---|
cat | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
dog | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
the | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
is | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
on | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
under | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 |
table | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
walks | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
对于独热编码中的每个向量,只有一个元素是1,其余都是0,因此每个单词都可以在向量空间中被唯一地表示。这使得模型能够区分不同的单词,并将它们用作特征来预测下一个单词或者进行其他类型的自然语言处理任务。
虽然独热编码提供了一种简单而有效的方法来表示单词,但它也存在一些问题,例如当词汇表非常大时,独热编码会导致非常稀疏的向量,增加了存储和计算的复杂性。但是这种对每个单词的编码无法体现出上文中描述的"boy" 和 "girl"这种语境下是相似单词的情况 **。故此这种方式没办法表示单词隐含的语义信息。**
在下文中,基于深度学习的神经网络语言模型(NNLM)将传统的单词孤立对待的独热编码,利用神经网络模型学习出能反映单词语义特性的词嵌入表示(Embedding)。
https://www.jmlr.org/papers/volume3/bengio03a/bengio03a.pdf NNLM原论文地址
神经网络语言模型(NNLM)代表了自然语言处理领域的一个重要进步,它首次由Yoshua Bengio教授及其团队在2003年发表的里程碑式论文《A Neural Probabilistic Language Model》中提出。**这种模型采用了神经网络,引入了分布式词表示的概念,即每个词由一个实值向量表示,从而捕获了词与词之间的细微关系和语义信息。
在实际应用中,通常会将每个不同的单词从原始的独热编码表示转换为一个连续的、低维度的实数向量,这个过程被称为词嵌入(Word Embedding)。词嵌入的主要目的是将单词映射到一个线性空间中,在这个空间中,具有相似语义的两个单词会被映射到空间中的两个点更接近一些。在这个表示中,每个单词都被表示为一个实数向量,这个向量被称为单词的特征向量或词嵌入向量。通过这种方式,模型可以更好地理解单词之间的语义关系。而本小结讨论的NNLM模型的副产物就是词向量。
从全局的结构看NNLM模型是通过输入前文单词预测后文单词的概率,即输入部分是句子中全部单词的独热编码,一个单词序列 w 1 ⋅ ⋅ ⋅ w T w_1 ···w_T w1⋅⋅⋅wT,其中每个单词 w t w_t wt 属于一个大但有限的词汇集 V V V。输入部分是整个单词序列的独热编码,即将每个单词表示为词汇表大小的向量,其中只有单词对应的索引位置为1,其他位置都为0。这个独热编码序列作为输入被送入神经网络中进行处理,以学习单词之间的语义关系和上下文之间的依赖关系。
用一个简单的例子来说明一下,假设有一个词汇表
V
V
V 包含以下单词:
V
=
{
The, cat, is, chasing, the, dog
}
V = \{ \text{The, cat, is, chasing, the, dog} \}
V={The, cat, is, chasing, the, dog}
现在有一个句子:
“The cat is chasing the dog”
可以将这个句子表示为一个单词序列
w
1
,
w
2
,
.
.
.
,
w
T
w_1, w_2, ..., w_T
w1,w2,...,wT,其中
T
T
T 是句子中的单词数量。对于这个例子,
T
=
6
T = 6
T=6,有:
w
1
=
T
h
e
,
w
2
=
c
a
t
,
w
3
=
i
s
,
w
4
=
c
h
a
s
i
n
g
,
w
5
=
t
h
e
,
w
6
=
d
o
g
w_1 = The , w_2 = cat , w_3 = is , w_4 = chasing, w_5 = the , w_6 = dog
w1=The,w2=cat,w3=is,w4=chasing,w5=the,w6=dog
然后,可以将每个单词表示为词汇表大小的独热编码向量。例如,使用词汇表中单词的索引顺序作为编码,那么 “cat” 的独热编码向量可能如下所示:
"cat" = [ 0 , 1 , 0 , 0 , 0 , 0 ] \text{"cat"} = [0, 1, 0, 0, 0,0] "cat"=[0,1,0,0,0,0]
这里,向量的第二个元素为1,表示 “cat” 在词汇表中的索引位置为2。同样的,可以为句子中的每个单词生成对应的独热编码向量。然后,将这些向量串联起来形成整个句子的输入。(之所以串联是为了保留句子中单词的顺序信息,比如我爱你和你爱我,这样不同顺序表示的意义就不同)
这个输入序列会被送入神经网络中进行处理,神经网络会学习单词之间的语义关系和上下文之间的依赖关系,从而预测下一个单词的概率分布。
独热编码和权重矩阵W,做乘积会是什么样子呢?
假设有一个简单的词汇表,其中包含4个单词:{apple, banana, cat, dog}。然后我们使用独热编码来表示这些单词。独热编码矩阵 X X X 的形状将是 ( 4 , 4 ) (4, 4) (4,4),因为有4个单词,每个单词用4维的独热编码表示。
假设独热编码矩阵 X X X 如下所示:
X
=
[
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
]
X =
这表示每个单词分别是第一个、第二个、第三个和第四个单词。
现在banana的独热编码就是
x
2
=
[
0
1
0
0
]
x_2 =
假设权重矩阵 W W W 是一个 ( 4 , n ) (4, n) (4,n) 的矩阵,比如:
W
=
[
w
11
w
12
w
13
w
14
w
21
w
22
w
23
w
24
w
31
w
32
w
33
w
34
w
41
w
42
w
43
w
44
]
W =
那么将 x 2 x_2 x2 与 W W W 相乘的结果将是矩阵 W W W 中的第二列:
x
2
×
W
=
[
0
1
0
0
]
×
[
w
11
w
12
w
13
w
14
w
21
w
22
w
23
w
24
w
31
w
32
w
33
w
34
w
41
w
42
w
43
w
44
]
=
[
w
21
w
22
w
23
w
24
]
x_2 \times W =
故每一个独热编码和权重矩阵做乘积会得到权重矩阵的一行,因此称这个权重矩阵
W
W
W的第二行是banana这个单词的词嵌入表示(Embedding),所以每个单词的独热编码进行乘积就会获得对应的嵌入表示,而这个嵌入表示会作为神经网路中当前单词的特征向量,送入模型进行分类任务。而NNLM是一个多分类任务,就是
V
V
V单词表中有多少个单词进行多少次分类预测,最终输出对目标单词的预测概率。从而不断的迭代训练优化权重矩阵的单词向量表示。
上图展示了模型的整体流程。接下来,分部分进行讲解整体模型的流程。
第一部分
首先通过 w w w的索引,就是对应单词独热编码和权重矩阵 C C C进行乘积得到不同单词的特征向量表示,为了保留词序信息进行对全部特征向量按照句子顺序拼接,最后送入激活函数进行非线性映射,即上图中的tanh下。
第二部分
那么整体模型架构中存在的绿色虚线是干什么的呢?
实际上就是一个残差连接,将通过非线性映射的句子特征和原始的特征信息进行拼接,作为最终的句子的特征向量。文中给出了具体的公式表示:
y = b + W x + U tanh ( d + H x ) y = b + Wx + U \tanh(d + Hx) y=b+Wx+Utanh(d+Hx)
其中:
x
是整个句子的特征向量。W
和向量 b
结合进行了线性特征转换。d
和矩阵 H
共同定义了另一个线性特征转换,该转换后的结果经过 tanh
函数进行非线性映射。U
对经过激活函数的结果进行再一次的特征选择。这样一方面通过矩阵W
直接对特征向量x
进行线性变换,另一方面通过矩阵H
和非线性函数tanh
处理序列提取的特征,然后再用矩阵U
进行变换,最终将这两个部分求和。这样的处理能够使得模型捕捉到不同层次的语义信息,从而得到相同句子的不同特征表示的,以得到能够更好地表示句子含义的向量,进而提高下游分类任务的性能。
训练数据的核心是由大规模文本语料库组成。经过训练后,所得的语言模型可以使用前面的词序列 w t − ( n − 1 ) , … , w t − 2 , w t − 1 w_{t-(n-1)}, \ldots, w_{t-2}, w_{t-1} wt−(n−1),…,wt−2,wt−1 来预测下一词 w t w_t wt 的出现概率。通过提升分类的准确率,可以优化模型参数,进而提高模型的整体性能。有趣的是,在这个过程中,还获得了单词的向量表示,这可以被视为训练语言模型时的附带成果。总体而言,这些词向量是语言模型训练时产生的有益副产品。
NNLM模型即神经网络语言模型,虽然相比于传统统计模型有显著提升,特别是在语义捕获方面,但仍有以下缺点:
计算开销大
训练难度
泛化能力
长期依赖问题
数据要求高
本章节主要介绍了传统的基于统计学的N-gram模型以及基于深度学习算法的NNLM模型,这两种算法分别代表了自然语言处理领域中两个非常重要的时期和方法。N-gram模型作为一种早期的语言模型,依赖于统计学原理,通过计算词汇序列(词组)在语料库中出现的频率来预测文本中下一个词的出现概率。它简单、直接且易于实现,但是由于依靠固定大小的窗口来考虑上下文,N-gram模型很难捕捉更长范围内的依赖关系,导致处理自然语言的能力有限。
相对于N-gram模型,基于深度学习的NNLM模型引入了神经网络的概念,特别是使用了一个隐藏层来学习单词的分布式表示,即词嵌入。NNLM模型不仅能够表示给定序列中前几个单词的复杂关系,还能通过学习单词的连续空间表示捕捉单词间的相似性。词嵌入允许模型理解单词间的语义关系,从而在预测下一个单词时考虑更广泛的上下文。
但是由于NNLM模型训练复杂的问题,为了简化训练进而设计了Word2vec。Word2vec是一种轻量级的词嵌入学习工具,它摒弃了传统NNLM模型密集的网络结构,转而采用两种高效的模型架构:连续词袋(CBOW)和跳跃式gram(skip-gram)。这两种方法都使用简单的一层神经网络,但不同于NNLM的是,它们避免了昂贵的矩阵和向量乘法运算。
本文为了后续的便于检索,以及Word2vec所涉及到的技术比较多,因此在下一个章节对Word2vec进行详细的讲解。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。