深度学习笔记之递归网络(二)基于统计算法的语言模型-爱代码爱编程
深度学习笔记之递归网络——基于统计算法的语言模型
引言
上一节介绍了包含序列特征的数据,并介绍了处理序列数据的一些模型思想。本节从文本这类序列数据的角度,介绍学习文本特征的基于统计算法的语言模型。
回顾:序列特征与文本特征
序列特征
序列特征是以时间/顺序为媒介的一类特征信息。某个随机变量集合
X
\mathcal X
X描述一段时间/序列中包含的特征信息,假设序列中包含
T
\mathcal T
T个时刻,每个时刻各包含
1
1
1个随机变量
x
t
(
t
=
1
,
2
,
⋯
,
T
)
x_t(t=1,2,\cdots,\mathcal T)
xt(t=1,2,⋯,T):
X
=
{
x
1
,
x
2
,
⋯
,
x
T
}
\mathcal X = \{x_1,x_2,\cdots,x_{\mathcal T}\}
X={x1,x2,⋯,xT}
已知一个具体样本
x
(
i
)
x^{(i)}
x(i),它的样本特征具体表示为如下形式:
x
(
i
)
=
(
x
1
(
i
)
,
x
2
(
i
)
,
⋯
,
x
T
(
i
)
)
T
×
1
T
x^{(i)} = (x_1^{(i)},x_2^{(i)},\cdots,x_{\mathcal T}^{(i)})_{\mathcal T \times 1}^T
x(i)=(x1(i),x2(i),⋯,xT(i))T×1T
很明显,
x
t
(
i
)
(
t
=
1
,
2
,
⋯
,
T
)
x_t^{(i)}(t=1,2,\cdots,\mathcal T)
xt(i)(t=1,2,⋯,T)是对应随机变量
x
t
x_t
xt的一个取值结果;并且由于序列特征的性质,导致各随机变量之间可能并不相互独立。因此,我们需要对各随机变量的联合概率分布进行求解:
P
(
X
)
=
P
(
x
1
,
x
2
,
⋯
,
x
T
)
\mathcal P(\mathcal X) = \mathcal P(x_1,x_2,\cdots,x_{\mathcal T})
P(X)=P(x1,x2,⋯,xT)
语言特征
语言特征作为序列特征的一种情况,我们可以给随机变量赋予实际意义。这里以汉语为例,每一个随机变量描述一个词语/词组;也有可能描述一个文字。
因而,一个样本,它可能是若干个词组成的长词组。例如:美丽漂亮的姑娘:
x
(
i
)
=
(
x
1
(
i
)
⏟
美丽
,
x
2
(
i
)
⏟
漂亮
,
x
3
(
i
)
⏟
的
,
x
4
(
i
)
⏟
姑娘
)
T
x^{(i)} = (\underbrace{x_1^{(i)}}_{美丽},\underbrace{x_2^{(i)}}_{漂亮},\underbrace{x_3^{(i)}}_{的},\underbrace{x_4^{(i)}}_{姑娘})^T
x(i)=(美丽
x1(i),漂亮
x2(i),的
x3(i),姑娘
x4(i))T
它也可能是一个完整句子。例如:今天早上吃锅包肉:
x
(
j
)
=
(
x
1
(
j
)
⏟
今天
,
x
2
(
j
)
⏟
早上
,
x
3
(
j
)
⏟
吃
,
x
4
(
j
)
⏟
锅包肉
)
T
x^{(j)} = (\underbrace{x_1^{(j)}}_{今天},\underbrace{x_2^{(j)}}_{早上},\underbrace{x_3^{(j)}}_{吃},\underbrace{x_4^{(j)}}_{锅包肉})^T
x(j)=(今天
x1(j),早上
x2(j),吃
x3(j),锅包肉
x4(j))T
关于语言特征的联合概率分布,也就是整个文本序列出现的联合概率结果。
语言模型
语言模型的应用任务场景
-
预训练 ( Pre-Training ) (\text{Pre-Training}) (Pre-Training)模型:
预训练的任务目标在于:从文本数据 D \mathcal D D中学习并归纳出文本特征的概率分布 P m o d e l ( X ) \mathcal P_{model}(\mathcal X) Pmodel(X)。
在
直面配分函数——随机最大似然中介绍过,可以将
D \mathcal D D看作是从真实分布
P d a t a ( X ) \mathcal P_{data}(\mathcal X) Pdata(X)中采集样本得到的样本集合;而模型
m o d e l model model对
D \mathcal D D的特征进行学习,从而得到与真实分布
P d a t a ( X ) \mathcal P_{data}(\mathcal X) Pdata(X)近似的模型分布
P m o d e l ( X ) \mathcal P_{model}(\mathcal X) Pmodel(X),陌生样本
x ^ \hat x x^通过模型产生的文本特征结果
P m o d e l ( x ^ ) \mathcal P_{model}(\hat x) Pmodel(x^)。
这种特征也被称作幻想粒子
( Fantasy Particle ) (\text{Fantasy Particle}) (Fantasy Particle)——因为这个特征并不是真实分布
P d a t a ( x ^ ) \mathcal P_{data}(\hat x) Pdata(x^)的结果,仅是
P m o d e l ( x ^ ) \mathcal P_{model}(\hat x) Pmodel(x^)产生的近似结果。
D ∼ P d a t a ( X ) ⟹ Learning P m o d e l ( X ) \mathcal D \sim \mathcal P_{data}(\mathcal X) \overset{\text{Learning}}{\Longrightarrow} \mathcal P_{model}(\mathcal X) D∼Pdata(X)⟹LearningPmodel(X)
例如一些大型生成模型如 BERT(Bidirectional Encoder Representations from Transformers),GPT-3 \text{BERT(Bidirectional Encoder Representations from Transformers),GPT-3} BERT(Bidirectional Encoder Representations from Transformers),GPT-3等。预训练属于语言模型的核心任务,可以将预训练分布结果作为输入,对其他下游任务做微调 ( Fine-Tunning ) (\text{Fine-Tunning}) (Fine-Tunning)。 -
生成文本:
和我们输入法中的提示词有一些类似。给定前面的若干个词 x 1 , x 2 , ⋯ , x t x_1,x_2,\cdots,x_t x1,x2,⋯,xt,通过模型学习出分布 P ( x t + 1 ∣ x 1 , x 2 , ⋯ , x t ) \mathcal P(x_{t+1} \mid x_1,x_2,\cdots,x_{t}) P(xt+1∣x1,x2,⋯,xt),并从该分布中采样得到 x t + 1 x_{t+1} xt+1的结果:
x t + 1 ∼ P m o d e l ( x t + 1 ∣ x 1 , x 2 , ⋯ , x t ) x_{t+1} \sim \mathcal P_{model}(x_{t+1} \mid x_1,x_2,\cdots,x_{t}) xt+1∼Pmodel(xt+1∣x1,x2,⋯,xt)
例如某样本 x ( i ) x^{(i)} x(i)给定一些词: x 1 ( i ) = x_1^{(i)}= x1(i)= 今天 x 2 ( i ) = x_2^{(i)}= x2(i)= 早上 x 3 ( i ) = x_3^{(i)}= x3(i)= 吃;下一时刻存在某两个样本: x 4 ( k ) = x_4^{(k)}= x4(k)= 黑板; x 4 ( j ) = x_4^{(j)}= x4(j)= 锅包肉。从人思考的角度观察,基于给定词组成的语义信息,下一个词后验分布的特性需要和食物相关。因而有:
而这个分布特性需要模型学习出来,并在
P m o d e l \mathcal P_{model} Pmodel中体现。
P ( x 4 ( j ) ∣ x 1 ( i ) , x 2 ( i ) , x 3 ( i ) ) > P ( x 4 ( k ) ∣ x 1 ( i ) , x 2 ( i ) , x 3 ( i ) ) \mathcal P(x_4^{(j)} \mid x_1^{(i)},x_2^{(i)},x_3^{(i)}) > \mathcal P(x_4^{(k)} \mid x_1^{(i)},x_2^{(i)},x_3^{(i)}) P(x4(j)∣x1(i),x2(i),x3(i))>P(x4(k)∣x1(i),x2(i),x3(i))
从而不断执行这个操作,从而将后续的文本信息补全出来。
需要模型的性能优秀。在每一次后验的采样过程中出现误差,误差会随着采样过程进行累积。最终可能出现‘生成的文本信息’与期望结果相差很远。
-
判断常见的文本序列:
例如如下两个文本序列:
{ S 1 = to recognize a speech ⏟ 去识别一段语音 S 2 = to wreck a nice beach ⏟ 去破坏一个美丽的海滩 \begin{cases} \mathcal S_1 = \underbrace{\text{to recognize a speech}}_{去识别一段语音} \\ \mathcal S_2 = \underbrace{\text{to wreck a nice beach}}_{去破坏一个美丽的海滩} \end{cases} ⎩ ⎨ ⎧S1=去识别一段语音 to recognize a speechS2=去破坏一个美丽的海滩 to wreck a nice beach
这两段序列的读音非常相似。如果使用一个语音转换文字模型得到 P ( S 1 ∣ ∗ ) \mathcal P(\mathcal S_1 \mid *) P(S1∣∗)和 P ( S 2 ∣ ∗ ) \mathcal P(\mathcal S_2 \mid *) P(S2∣∗)的结果都不低,此时我们需要去判别哪个文本序列更加常见,或者更加符合当前语义环境。
这里的
∗ * ∗表示语音特征,上面的英语是翻译软件翻译的,老美可能不会这么说话~
统计算法——使用计数进行建模
场景构建:
假设要求的文本序列长度
=
2
=2
=2,给定包含
n
n
n个文本的数据集
D
\mathcal D
D,想要求解:某文本
x
x
x和相邻文本
x
′
x'
x′构成的序列在
D
\mathcal D
D中的出现次数。
这里的文本
x
,
x
′
x,x'
x,x′可能不仅是一个具体的词,它是一个随机变量。
- 这个序列的联合概率分布可表示为:
其中
n ( x ) n(x) n(x)表示满足随机变量
x x x条件的文本的数量;同理,
n ( x , x ′ ) n(x,x') n(x,x′)表示满足'随机变量
x , x ′ x,x' x,x′先后出现'条件的序列的数量。
P ( x , x ′ ) = P ( x ) ⋅ P ( x ′ ∣ x ) = n ( x ) n ⋅ n ( x , x ′ ) n ( x ) \mathcal P(x,x') = \mathcal P(x) \cdot \mathcal P(x' \mid x) = \frac{n(x)}{n} \cdot \frac{n(x,x')}{n(x)} P(x,x′)=P(x)⋅P(x′∣x)=nn(x)⋅n(x)n(x,x′) - 同理,我们可以调整序列长度,从而获取满足条件序列的联合概率分布:
文本长度
= 3 =3 =3的情况。
P ( x , x ′ , x ′ ′ ) = P ( x ) ⋅ P ( x ′ ∣ x ) ⋅ P ( x ′ ′ ∣ x , x ′ ) = n ( x ) n ⋅ n ( x , x ′ ) n ( x ) ⋅ n ( x , x ′ , x ′ ′ ) n ( x , x ′ ) \begin{aligned} \mathcal P(x,x',x'') & = \mathcal P(x) \cdot \mathcal P(x' \mid x) \cdot \mathcal P(x'' \mid x,x') & = \frac{n(x)}{n} \cdot \frac{n(x,x')}{n(x)} \cdot \frac{n(x,x',x'')}{n(x,x')} \end{aligned} P(x,x′,x′′)=P(x)⋅P(x′∣x)⋅P(x′′∣x,x′)=nn(x)⋅n(x)n(x,x′)⋅n(x,x′)n(x,x′,x′′)
这种做法显然过于简单:
一旦 序列过长,并且数据集
D
\mathcal D
D的文本量不够多 的情况下,导致序列
(
x
,
x
′
,
x
′
′
)
(x,x',x'')
(x,x′,x′′)在数据集
D
\mathcal D
D内出现出现的次数极少甚至没有出现过——
P
(
x
,
x
′
,
x
′
′
)
⇒
0
\mathcal P(x,x',x'') \Rightarrow 0
P(x,x′,x′′)⇒0。这种做法自然是不准确的。
统计算法——基于马尔可夫假设的 N-Gram \text{N-Gram} N-Gram语言模型
针对序列过长产生的情况,可以使用马尔可夫假设缓解该问题:
P
(
x
t
∣
x
t
−
1
,
x
t
−
2
,
⋯
,
x
1
)
=
P
(
x
t
∣
x
t
−
1
,
x
t
−
2
,
⋯
,
x
t
−
τ
⏟
τ
个随机变量
)
\mathcal P(x_t \mid x_{t-1},x_{t-2},\cdots,x_1) = \mathcal P(x_t \mid \underbrace{x_{t-1},x_{t-2},\cdots,x_{t - \tau}}_{\tau 个随机变量})
P(xt∣xt−1,xt−2,⋯,x1)=P(xt∣τ个随机变量
xt−1,xt−2,⋯,xt−τ)
1-Gram
\text{1-Gram}
1-Gram语言模型:某随机变量
x
t
x_t
xt的条件概率结果仅和
x
t
x_t
xt自身相关。这意味着被作为条件约束的随机变量数量
τ
=
0
\tau=0
τ=0。对应序列的联合概率分布表示为如下形式:
相当于随机变量之间‘相互独立’。
P
(
x
1
,
x
2
,
⋯
,
x
T
)
=
P
(
x
1
)
⋅
∏
t
=
2
T
P
(
x
t
∣
x
t
−
1
,
⋯
,
x
1
)
=
∏
t
=
1
T
P
(
x
t
)
=
∏
t
=
1
T
n
(
x
t
)
n
\begin{aligned} \mathcal P(x_1,x_2,\cdots,x_{\mathcal T}) & = \mathcal P(x_1) \cdot \prod_{t=2}^{\mathcal T} \mathcal P(x_t \mid x_{t-1},\cdots,x_1) \\ & = \prod_{t=1}^{\mathcal T} \mathcal P(x_t) \\ & = \prod_{t=1}^{\mathcal T} \frac{n(x_t)}{n} \end{aligned}
P(x1,x2,⋯,xT)=P(x1)⋅t=2∏TP(xt∣xt−1,⋯,x1)=t=1∏TP(xt)=t=1∏Tnn(xt)
同理,
N-Gram
\text{N-Gram}
N-Gram语言模型表示:某随机变量
x
t
x_t
xt的条件概率结果不仅与自身相关,并且与基于顺序相邻的
N
−
1
N-1
N−1个随机变量相关。此时的
τ
=
N
−
1
\tau=N-1
τ=N−1。这里以
3-Gram
\text{3-Gram}
3-Gram语言模型为例,其联合概率分布表示如下:
很明显,前两个随机变量的条件数量不足。
P
(
x
1
,
x
2
,
⋯
,
x
T
)
=
P
(
x
1
)
⋅
∏
t
=
2
T
P
(
x
t
∣
x
t
−
1
,
⋯
,
x
1
)
=
P
(
x
1
)
⋅
P
(
x
2
∣
x
1
)
⋅
∏
t
=
3
T
P
(
x
t
∣
x
t
−
1
,
x
t
−
2
)
=
n
(
x
1
)
n
⋅
n
(
x
1
,
x
2
)
n
(
x
1
)
⋅
∏
t
=
3
T
n
(
x
t
,
x
t
−
1
,
x
t
−
2
)
n
(
x
t
−
1
,
x
t
−
2
)
\begin{aligned} \mathcal P(x_1,x_2,\cdots,x_{\mathcal T}) & = \mathcal P(x_1) \cdot \prod_{t=2}^{\mathcal T} \mathcal P(x_t \mid x_{t-1},\cdots,x_1) \\ & = \mathcal P(x_1)\cdot \mathcal P(x_2 \mid x_1) \cdot \prod_{t=3}^{\mathcal T} \mathcal P(x_t \mid x_{t-1},x_{t-2}) \\ & = \frac{n(x_1)}{n} \cdot \frac{n(x_1,x_2)}{n(x_1)} \cdot \prod_{t=3}^{\mathcal T} \frac{n(x_{t},x_{t-1},x_{t-2})}{n(x_{t-1},x_{t-2})} \end{aligned}
P(x1,x2,⋯,xT)=P(x1)⋅t=2∏TP(xt∣xt−1,⋯,x1)=P(x1)⋅P(x2∣x1)⋅t=3∏TP(xt∣xt−1,xt−2)=nn(x1)⋅n(x1)n(x1,x2)⋅t=3∏Tn(xt−1,xt−2)n(xt,xt−1,xt−2)
N-Gram
\text{N-Gram}
N-Gram语言模型的优势在于:基于该假设,我们能够处理较长的序列(序列长度和马尔可夫假设关系不大,我们仅观察局部的序列信息)。并且随着局部范围内
N
N
N越大,它的统计精度就越高。
相反, N-Gram \text{N-Gram} N-Gram的劣势就在于 N N N上面:
-
以 2-Gram \text{2-Gram} 2-Gram语言模型为例,如果数据集 D \mathcal D D对应的字典(对数据集 D \mathcal D D所有词语进行收集)中包含 1 , 000 1,000 1,000个词,在 2-Gram \text{2-Gram} 2-Gram条件下,一共包含 1 , 000 × 1 , 000 = 1 , 000 , 000 1,000 \times 1,000 = 1,000,000 1,000×1,000=1,000,000种序列组合。
这个序列组合是随机组合,并且是有序的。例如
( x i , x j ) (x_i,x_j) (xi,xj)与
( x j , x i ) (x_j,x_i) (xj,xi)均算作不同的序列组合。
当然,上述的随机组合必然不会全部出现在 D \mathcal D D中,仅需要统计各组合出现的频数,在计算 P ( x 1 , x 2 , ⋯ , x T ) \mathcal P(x_1,x_2,\cdots,x_{\mathcal T}) P(x1,x2,⋯,xT)中,仅需要查表即可。
这里需要强调的是:相比于计数建模,
N-Gram \text{N-Gram} N-Gram语言模型的时间复杂度有明显提升。我们不需要将
D \mathcal D D执行一次又一次的遍历,仅需要查找‘组合表’中对应结果的频数即可。
-
上述是 2-Gram \text{2-Gram} 2-Gram的情况。那么 N N N的数值较大时,上述组合数量有 1 , 00 0 N 1,000^N 1,000N种,这个指数关系会导致内存的负担。
它的‘空间复杂度’是指数级的。