Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
M
mtbookv2
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
NiuTrans
mtbookv2
Commits
296fdb14
Commit
296fdb14
authored
Aug 20, 2020
by
xiaotong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wording (lm smoothing)
parent
a50b434b
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
13 行增加
和
13 行删除
+13
-13
Chapter2/Figures/figure-word-frequency-distribution.tex
+1
-1
Chapter2/chapter2.tex
+12
-12
没有找到文件。
Chapter2/Figures/figure-word-frequency-distribution.tex
查看文件 @
296fdb14
...
...
@@ -3,7 +3,7 @@
\begin{axis}
[
width=11cm,
height=5.5cm,
xlabel=
{
某语料库
中的词汇
}
,
xlabel=
{
某语料库
上的词表
}
,
ylabel=
{
词汇出现总次数
}
,
xlabel style=
{
xshift=6.2cm,yshift=0.8cm,font=
\footnotesize
}
,
ylabel style=
{
rotate=-90,yshift=2.8cm,xshift=1.2cm,font=
\footnotesize
}
,
...
...
Chapter2/chapter2.tex
查看文件 @
296fdb14
...
...
@@ -557,7 +557,7 @@ F(x)=\int_{-\infty}^x f(x)\textrm{d}x
\subsection
{
参数估计和平滑算法
}
对于
$
n
$
-gram语言模型,每个
$
\funp
{
P
}
(
w
_
m|w
_{
m
-
n
+
1
}
\ldots
w
_{
m
-
1
}
)
$
都可以被看作是模型的
{
\small\bfnew
{
参数
}}
\index
{
参数
}
(Parameter
\index
{
参数
}
)。而
$
n
$
-gram语言模型的一个核心任务是估计这些参数的值,即
{
\small\bfnew
{
参数估计
}}
\index
{
参数估计
}
(Parameter Estimation
\index
{
Parameter Estimation
}
)。通常,参数估计可以通过在数据上的统计得到。
比如,一种最
简单的方法是:给定一定数量的句子,统计每个
$
n
$
-gram 出现的频次,并利用公式
\ref
{
eq:2-22
}
得到每个参数
$
\funp
{
P
}
(
w
_
m|w
_{
m
-
n
+
1
}
\ldots
w
_{
m
-
1
}
)
$
的值。这个过程也被称作模型的
{
\small\bfnew
{
训练
}}
\index
{
训练
}
(Training
\index
{
训练
}
)。对于自然语言处理任务来说,统计模型的训练是至关重要的。在本书后面的内容中也会看到,不同的问题可能需要不同的模型以及不同的模型训练方法。而很多研究工作也都集中在优化模型训练的效果上。
对于
$
n
$
-gram语言模型,每个
$
\funp
{
P
}
(
w
_
m|w
_{
m
-
n
+
1
}
\ldots
w
_{
m
-
1
}
)
$
都可以被看作是模型的
{
\small\bfnew
{
参数
}}
\index
{
参数
}
(Parameter
\index
{
参数
}
)。而
$
n
$
-gram语言模型的一个核心任务是估计这些参数的值,即
{
\small\bfnew
{
参数估计
}}
\index
{
参数估计
}
(Parameter Estimation
\index
{
Parameter Estimation
}
)。通常,参数估计可以通过在数据上的统计得到。
一种
简单的方法是:给定一定数量的句子,统计每个
$
n
$
-gram 出现的频次,并利用公式
\ref
{
eq:2-22
}
得到每个参数
$
\funp
{
P
}
(
w
_
m|w
_{
m
-
n
+
1
}
\ldots
w
_{
m
-
1
}
)
$
的值。这个过程也被称作模型的
{
\small\bfnew
{
训练
}}
\index
{
训练
}
(Training
\index
{
训练
}
)。对于自然语言处理任务来说,统计模型的训练是至关重要的。在本书后面的内容中也会看到,不同的问题可能需要不同的模型以及不同的模型训练方法。而很多研究工作也都集中在优化模型训练的效果上。
\parinterval
回到
$
n
$
-gram语言模型上。前面所使用的参数估计方法并不完美,因为它无法很好的处理低频或者未见现象。比如,在式
\ref
{
eq:2-23
}
所示的例子中,如果语料中从没有“确实”和“现在”两个词连续出现的情况,即
$
\textrm
{
count
}
(
\textrm
{
确实
}
\ \textrm
{
现在
}
)=
0
$
。 那么使用2-gram 计算句子“确实/现在/数据/很多”的概率时,会出现如下情况
\begin{eqnarray}
...
...
@@ -573,12 +573,12 @@ F(x)=\int_{-\infty}^x f(x)\textrm{d}x
\begin{figure}
[htp]
\centering
\input
{
./Chapter2/Figures/figure-word-frequency-distribution
}
\caption
{
词
语
出现频次的分布
}
\caption
{
词
汇
出现频次的分布
}
\label
{
fig:2-11
}
\end{figure}
%---------------------------
\parinterval
为了解决未登录词引起的零概率问题,常用的做法是对模型进行
平滑处理,也就是给可能出现
的情况一个非零的概率,使得模型不会对整个序列给出零概率。平滑可以用“劫富济贫”这一思想理解,在保证所有情况的概率和为1的前提下,使极低概率的部分可以从高概率的部分分配到一部分概率,从而达到平滑的目的。
\parinterval
为了解决未登录词引起的零概率问题,常用的做法是对模型进行
{
\small\bfnew
{
平滑
}}
\index
{
平滑
}
(Smoothing
\index
{
Smoothing
}
),也就是给可能出现零概率
的情况一个非零的概率,使得模型不会对整个序列给出零概率。平滑可以用“劫富济贫”这一思想理解,在保证所有情况的概率和为1的前提下,使极低概率的部分可以从高概率的部分分配到一部分概率,从而达到平滑的目的。
\parinterval
语言模型使用的平滑算法有很多。在本节中,主要介绍三种平滑方法:加法平滑法、古德-图灵估计法和Kneser-Ney平滑。这些方法也可以被应用到其他任务的概率平滑操作中。
...
...
@@ -588,7 +588,7 @@ F(x)=\int_{-\infty}^x f(x)\textrm{d}x
\subsubsection
{
1.加法平滑方法
}
\parinterval
{
\small\bfnew
{
加法平滑
}}
\index
{
加法平滑
}
(Additive Smoothing)
\index
{
Additive Smoothing
}
是一种简单的平滑技术。本小节首先介绍这一方法,希望通过它了解平滑算法的思想。通常情况下,系统研发者会利用采集到的语料库来模拟真实的全部语料库。当然,没有一个语料库能覆盖所有的语言现象。
常见的一个问题是,使用的语料无法涵盖所有的词汇。因此,直接依据这样语料所获得的统计信息来获取语言模型就会产生偏差。假设依据某语料
$
C
$
(从未出现“确实
\
现在”二元语法),评估一个句子
$
S
$
=“确实现在物价很高”的概率。当计算“确实
\
现在”的概率时,
$
\funp
{
P
}
(
S
)
=
0
$
。显然这个结果是不合理的
。
\parinterval
{
\small\bfnew
{
加法平滑
}}
\index
{
加法平滑
}
(Additive Smoothing)
\index
{
Additive Smoothing
}
是一种简单的平滑技术。本小节首先介绍这一方法,希望通过它了解平滑算法的思想。通常情况下,系统研发者会利用采集到的语料库来模拟真实的全部语料库。当然,没有一个语料库能覆盖所有的语言现象。
假设有一个语料库
$
C
$
,其中从未出现“确实
\
现在”这样的2-gram,现在要计算一个句子
$
S
$
=“确实/现在/物价/很高”的概率。当计算“确实
\
现在”的概率时,
$
\funp
{
P
}
(
S
)
=
0
$
,导致整个句子的概率为0
。
\parinterval
加法平滑方法假设每个
$
n
$
-gram出现的次数比实际统计次数多
$
\theta
$
次,
$
0
\le
\theta\le
1
$
。这样,计算概率的时候分子部分不会为0。重新计算
$
\funp
{
P
}
(
\textrm
{
现在
}
|
\textrm
{
确实
}
)
$
,可以得到:
...
...
@@ -598,7 +598,7 @@ F(x)=\int_{-\infty}^x f(x)\textrm{d}x
\label
{
eq:2-25
}
\end{eqnarray}
\noindent
其中,
$
V
$
表示
所有词汇的词表,
$
|V|
$
为词表中单词的个数,
$
w
$
为词典
中的一个词。有时候,加法平滑方法会将
$
\theta
$
取1,这时称之为加一平滑或是拉普拉斯平滑。这种方法比较容易理解,也比较简单,因此也往往被用于对系统的快速原型中。
\noindent
其中,
$
V
$
表示
词表,
$
|V|
$
为词表中单词的个数,
$
w
$
为词表
中的一个词。有时候,加法平滑方法会将
$
\theta
$
取1,这时称之为加一平滑或是拉普拉斯平滑。这种方法比较容易理解,也比较简单,因此也往往被用于对系统的快速原型中。
\parinterval
举一个例子。假设在一个英语文档中随机采样一些单词(词表大小
$
|V|
=
20
$
),各个单词出现的次数为:“look”: 4,“people”: 3,“am”: 2,“what”: 1,“want”: 1,“do”: 1。图
\ref
{
fig:2-12
}
给出了在平滑之前和平滑之后的概率分布。
...
...
@@ -618,9 +618,9 @@ F(x)=\int_{-\infty}^x f(x)\textrm{d}x
\subsubsection
{
2.古德-图灵估计法
}
\vspace
{
-0.5em
}
\parinterval
{
\small\bfnew
{
古德-图灵估计法
}}
\index
{
古德-图灵估计法
}
(Good-Turing Estimate)
\index
{
Good-Turing Estimate
}
是Alan Turing和他的助手I.J.Good开发的,作为他们在二战期间破解德国密码机Enigma所使用的方法的一部分,在1953 年I.J.Good将其发表。这一方法也是很多平滑算法的核心,其基本思路是:把非零的
$
n
$
元语法单元的概率降低匀给一些低概率
$
n
$
元语法单元,以减小最大似然估计与真实概率之间的偏离
\upcite
{
good1953population
}
\upcite
{
gale1995good
}
。
\parinterval
{
\small\bfnew
{
古德-图灵估计法
}}
\index
{
古德-图灵估计法
}
(Good-Turing Estimate)
\index
{
Good-Turing Estimate
}
是Alan Turing和他的助手I.J.Good开发的,作为他们在二战期间破解德国密码机Enigma所使用的方法的一部分,在1953 年I.J.Good将其发表。这一方法也是很多平滑算法的核心,其基本思路是:把非零的
$
n
$
元语法单元的概率降低匀给一些低概率
$
n
$
元语法单元,以减小最大似然估计与真实概率之间的偏离
\upcite
{
good1953population
,
gale1995good
}
。
\parinterval
假定在语料库中出现
$
r
$
次的
$
n
$
-gram有
$
n
_
r
$
个,特别的,出现0次的
$
n
$
-gram(即未登录词及词串)出现的次数为
$
n
_
0
$
个。语料库中全部
词语的
个数为
$
N
$
,显然
\parinterval
假定在语料库中出现
$
r
$
次的
$
n
$
-gram有
$
n
_
r
$
个,特别的,出现0次的
$
n
$
-gram(即未登录词及词串)出现的次数为
$
n
_
0
$
个。语料库中全部
单词的总
个数为
$
N
$
,显然
\begin{eqnarray}
N =
\sum
_{
r=1
}^{
\infty
}{
r
\,
n
_
r
}
\label
{
eq:2-26
}
...
...
@@ -646,7 +646,7 @@ N & = & \sum_{r=0}^{\infty}{r^{*}n_r} \nonumber \\
\label
{
eq:2-29
}
\end{eqnarray}
也就是说,
$
N
$
仍然为这个整个样本分布最初的计数。
样本中所有事件
的概率之和为:
也就是说,
$
N
$
仍然为这个整个样本分布最初的计数。
所有出现事件(即
$
r >
0
$
)
的概率之和为:
\begin{eqnarray}
\funp
{
P
}
(r>0)
&
=
&
\sum
_{
r>0
}{
\funp
{
P
}_
r
}
\nonumber
\\
&
=
&
1 -
\frac
{
n
_
1
}{
N
}
\nonumber
\\
...
...
@@ -686,7 +686,7 @@ N & = & \sum_{r=0}^{\infty}{r^{*}n_r} \nonumber \\
\subsubsection
{
3.Kneser-Ney平滑方法
}
\parinterval
Kneser-Ney平滑方法是由R
.Kneser和H.Ney于1995年提出的用于计算
$
n
$
元语法概率分布的方法
\upcite
{
kneser1995improved
}
\upcite
{
chen1999empirical
}
,并被广泛认为是最有效的平滑方法。这种平滑方法改进了Absolute Discounting
\upcite
{
ney1994on
}
\upcite
{
ney1991on
}
中与高阶分布相结合的低阶分布的计算方法,使不同阶分布得到充分的利用。这种算法也综合利用了其他多种平滑算法的思想。
\parinterval
Kneser-Ney平滑方法是由R
einhard Kneser和Hermann Ney于1995年提出的用于计算
$
n
$
元语法概率分布的方法
\upcite
{
kneser1995improved,chen1999empirical
}
,并被广泛认为是最有效的平滑方法之一。这种平滑方法改进了Absolute Discounting
\upcite
{
ney1994on,
ney1991on
}
中与高阶分布相结合的低阶分布的计算方法,使不同阶分布得到充分的利用。这种算法也综合利用了其他多种平滑算法的思想。
\parinterval
首先介绍一下Absolute Discounting平滑算法,公式如下所示:
\begin{eqnarray}
...
...
@@ -708,7 +708,7 @@ I cannot see without my reading \underline{\ \ \ \ \ \ \ \ }
\parinterval
观察语料中的2-gram发现,“Francisco”的前一个词仅可能是“San”,不会出现“reading”。这个分析证实了,考虑前一个词的影响是有帮助的,比如仅在前一个词是“San”时,才给“Francisco”赋予一个较高的概率值。基于这种想法,改进原有的1-gram模型,创造一个新的1-gram模型
$
\funp
{
P
}_{
\textrm
{
continuation
}}$
,简写为
$
\funp
{
P
}_{
\textrm
{
cont
}}$
。这个模型可以通过考虑前一个词的影响评估当前词作为第二个词出现的可能性。
\parinterval
为了评估
$
\funp
{
P
}_{
\textrm
{
cont
}}$
,统计使用当前词作为第二个词所出现
二元语法的种类,二元语
法种类越多,这个词作为第二个词出现的可能性越高,呈正比:
\parinterval
为了评估
$
\funp
{
P
}_{
\textrm
{
cont
}}$
,统计使用当前词作为第二个词所出现
2-gram的种类,2-gram
法种类越多,这个词作为第二个词出现的可能性越高,呈正比:
\begin{eqnarray}
\funp
{
P
}_{
\textrm
{
cont
}}
(w
_
i)
\varpropto
|w
_{
i-1
}
: c(w
_{
i-1
}
w
_
i )>0|
\label
{
eq:2-32
}
...
...
@@ -726,7 +726,7 @@ I cannot see without my reading \underline{\ \ \ \ \ \ \ \ }
\label
{
eq:2-34
}
\end{eqnarray}
结合基础的
a
bsolute discounting计算公式,从而得到了Kneser-Ney平滑方法的公式
结合基础的
A
bsolute discounting计算公式,从而得到了Kneser-Ney平滑方法的公式
\begin{eqnarray}
\funp
{
P
}_{
\textrm
{
KN
}}
(w
_
i|w
_{
i-1
}
) =
\frac
{
\max
(c(w
_{
i-1
}
,w
_
i )-d,0)
}{
c(w
_{
i-1
}
)
}
+
\lambda
(w
_{
i-1
}
)
\funp
{
P
}_{
\textrm
{
cont
}}
(w
_
i)
\label
{
eq:2-35
}
...
...
@@ -759,7 +759,7 @@ c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll}
\end{eqnarray}
\noindent
其中catcount
$
(
\cdot
)
$
表示的是基于某个单个词作为第
$
n
$
个词的
$
n
$
-gram的种类数目。
\parinterval
Kneser-Ney平滑是很多语言模型工具的基础
\upcite
{
wang-etal-2018-niutrans
}
\upcite
{
heafield-2011-kenlm
}
\upcite
{
stolcke2002srilm
}
。还有很多以此为基础衍生出来的算法,感兴趣的读者可以通过参考文献自行了解
\upcite
{
parsing2009speech
}
\upcite
{
ney1994structuring
}
\upcite
{
chen1999empirical
}
。
\parinterval
Kneser-Ney平滑是很多语言模型工具的基础
\upcite
{
heafield-2011-kenlm,stolcke2002srilm
}
。还有很多以此为基础衍生出来的算法,感兴趣的读者可以通过参考文献自行了解
\upcite
{
parsing2009speech,ney1994structuring,
chen1999empirical
}
。
%----------------------------------------------------------------------------------------
% NEW SECTION
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论