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
d487845b
Commit
d487845b
authored
Aug 19, 2020
by
xiaotong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wording (n-gram lm)
parent
171c82b8
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
26 行增加
和
18 行删除
+26
-18
Chapter2/chapter2.tex
+26
-18
没有找到文件。
Chapter2/chapter2.tex
查看文件 @
d487845b
...
...
@@ -139,7 +139,7 @@ F(x)=\int_{-\infty}^x f(x)\textrm{d}x
% NEW SUB-SECTION
%----------------------------------------------------------------------------------------
\subsection
{
链式法则
}
\subsection
{
链式法则
}
\label
{
sec:chain-rule
}
\parinterval
条件概率公式
$
\funp
{
P
}
(
A
\mid
B
)=
\funp
{
P
}
(
AB
)/
\funp
{
P
}
(
B
)
$
反映了事件
$
B
$
发生的条件下事件
$
A
$
发生的概率。如果将其推广到三个事件
$
A
$
、
$
B
$
、
$
C
$
,为了计算
$
\funp
{
P
}
(
A,B,C
)
$
,可以运用两次
$
\funp
{
P
}
(
A
\mid
B
)=
\funp
{
P
}
(
AB
)/
\funp
{
P
}
(
B
)
$
,计算过程如下:
\begin{eqnarray}
...
...
@@ -325,7 +325,7 @@ F(x)=\int_{-\infty}^x f(x)\textrm{d}x
\sectionnewpage
\section
{
掷骰子游戏
}
\parinterval
在阐述统计建模方法前,先看一个有趣的实例(图
\ref
{
fig:2-5
}
)。掷骰子,一个生活中比较常见的游戏,掷一个骰子,玩家猜一个数字,猜中就算赢,按照常识来说,随便选一个数字,获胜的概率是一样的,即所有选择的获胜概率都是
$
1
/
6
$
。因此这个游戏玩家很难获胜,除非运气很好。假设进行一次游戏,玩家随意选了一个数字,比如是1。当投掷30次骰子
,发现运气不错,得到命中
$
7
/
30
>
1
/
6
$
。
\parinterval
在阐述统计建模方法前,先看一个有趣的实例(图
\ref
{
fig:2-5
}
)。掷骰子,一个生活中比较常见的游戏,掷一个骰子,玩家猜一个数字,猜中就算赢,按照常识来说,随便选一个数字,获胜的概率是一样的,即所有选择的获胜概率都是
$
1
/
6
$
。因此这个游戏玩家很难获胜,除非运气很好。假设进行一次游戏,玩家随意选了一个数字,比如是1。当投掷30次骰子
(如图
\ref
{
fig:2-5
}
),发现运气不错,命中7次,好于预期(
$
7
/
30
>
1
/
6
$
)
。
\vspace
{
-0.5em
}
%----------------------------------------------
...
...
@@ -388,7 +388,7 @@ F(x)=\int_{-\infty}^x f(x)\textrm{d}x
\parinterval
与上面这个掷骰子游戏类似,世界上的事物并不是平等出现的。在“公平”的世界中,没有任何一个模型可以学到有价值的事情。从机器学习的角度来看,所谓的“不公平”实际上是客观事物中蕴含的一种
{
\small\sffamily\bfseries
{
偏置
}}
\index
{
偏置
}
(Bias)
\index
{
Bias
}
,也就是很多事情天然地就有对某些情况有倾向。而图像处理、自然语言处理等问题中绝大多数都存在着偏置。比如,当翻译一个英语单词的时候,它最可能的翻译结果往往就是那几个词。设计统计模型的目的正是要学习这种偏置,之后利用这种偏置对新的问题做出足够好的决策。
\parinterval
在处理语言问题时,为了评价哪些词更容易在一个句子中出现,或者哪些句子在某些语境下更合理,常常也会使用统计方法对词或句子出现的可能性建模。与掷骰子游戏类似,词出现的概率可以这样理解:每个单词的出现就好比掷一个巨大的骰子,与前面的例子中有所不同的是:
\parinterval
在处理
自然
语言问题时,为了评价哪些词更容易在一个句子中出现,或者哪些句子在某些语境下更合理,常常也会使用统计方法对词或句子出现的可能性建模。与掷骰子游戏类似,词出现的概率可以这样理解:每个单词的出现就好比掷一个巨大的骰子,与前面的例子中有所不同的是:
\begin{itemize}
\vspace
{
0.5em
}
...
...
@@ -442,11 +442,21 @@ F(x)=\int_{-\infty}^x f(x)\textrm{d}x
\end{figure}
%-------------------------------------------
\parinterval
通过这个学习过程,就可以得到每个词出现的概率,成功使用统计方法对“单词的频率”这个问题进行建模。
\parinterval
通过这个学习过程,就可以得到每个词出现的概率,成功使用统计方法对“单词的频率”这个问题进行建模。
那么该如何计算一个句子的概率呢?在自然语言处理领域中,句子可以被看作是由单词组成的序列,因而句子的概率可以被建模为若干单词的联合概率,即
$
\funp
{
P
}
(
w
_
1
w
_
2
\ldots
w
_
m
)
$
。其中,
$
w
_
i
$
表示句子中的一个单词。
\parinterval
那么该如何计算一个句子的概率呢?在自然语言处理领域中,句子可以被看作是由单词组成的序列,因而句子的概率可以被建模为若干单词的联合概率,即
$
\funp
{
P
}
(
w
_
1
w
_
2
w
_
3
\ldots
w
_
m
)
$
。
\parinterval
为了求
$
\funp
{
P
}
(
w
_
1
w
_
2
\ldots
w
_
m
)
$
,最直接的方式是统计所有可能出现的词串
$
w
_
1
w
_
2
\ldots
w
_
m
$
在数据中出现的次数
$
\textrm
{
count
}
(
w
_
1
w
_
2
\ldots
w
_
m
)
$
,之后利用极大似然估计计算
$
\funp
{
P
}
(
w
_
1
w
_
2
\ldots
w
_
m
)
$
:
\parinterval
其中,
$
w
$
表示句子中的一个单词。此时仍可以使用掷骰子的方式,将骰子的每个面看作一个句子,然后用统计词汇概率的方式统计句子的概率。但是这里存在一个问题,一个句子在指定文本中出现的次数一定比词汇在文本出现的次数低得多,此时通过统计的方式求句子的频率会由于样本数太少,导致无法准确的求出句子的概率,因此对句子的统计建模仍需要更好的方式。
\begin{eqnarray}
\funp
{
P
}
(w
_
1 w
_
2
\ldots
w
_
m)
&
=
&
\frac
{
\textrm
{
count
}
(w
_
1 w
_
2
\ldots
w
_
m)
}{
\sum
_{
w
^{
'
}_
1, w
^{
'
}_
2,...,w
^{
'
}_
m
\in
V
}
\textrm
{
count
}
(w
^{
'
}_
1 w
^{
'
}_
2
\ldots
w
^{
'
}_
m)
}
\label
{
eq:seq-mle
}
\end{eqnarray}
\noindent
其中,
$
V
$
为词汇表。本质上,这个方法和计算单词出现概率
$
\funp
{
P
}
(
w
_
i
)
$
的方法是一样的。但是这里的问题是:当
$
m
$
较大时,词串
$
w
_
1
w
_
2
\ldots
w
_
m
$
可能非常低频,甚至在数据中没有出现过。这时,由于
$
\textrm
{
count
}
(
w
_
1
w
_
2
\ldots
w
_
m
)
\approx
0
$
,公式
\ref
{
eq:seq-mle
}
的结果会不准确,甚至产生0概率的情况。这是观测低频事件时经常出现的问题。对于这个问题,另一种概思路是对多个联合出现的事件进行独立性假设,这里可以假设
$
w
_
1
$
、
$
w
_
2
\ldots
w
_
m
$
的出现是相互独立的,于是
\begin{eqnarray}
\funp
{
P
}
(w
_
1 w
_
2
\ldots
w
_
m)
&
=
&
\funp
{
P
}
(w
_
1)
\funp
{
P
}
(w
_
2)
\ldots
\funp
{
P
}
(w
_
m)
\label
{
eq:seq-independ
}
\end{eqnarray}
\noindent
这样,单词序列的出现的概率被转化为每个单词概率的乘积。由于单词的概率估计是相对准确的,因此整个序列的概率会比较合理。但是,这种方法的独立性假设也破坏了句子中单词之间的依赖关系,造成概率估计结果的偏差。那如何更加合理的计算一个单词序列的概率呢?下面即将介绍的
$
n
$
-gram语言建模方法可以很好地回答这个问题。
%----------------------------------------------------------------------------------------
% NEW SECTION
...
...
@@ -455,7 +465,7 @@ F(x)=\int_{-\infty}^x f(x)\textrm{d}x
\sectionnewpage
\section
{$
n
$
-gram语言模型
}
\parinterval
在骰子游戏中,可以通过一种统计的方式,估计出在文本中词和句子出现的概率。但是在计算句子概率时往往会因为句子的样本过少而无法正确估计出句子出现的
频率,为了能够准确地衡量句子出现的频率,这里引入了计算整个单词序列概率
$
\funp
{
P
}
(
w
_
1
w
_
2
w
_
3
\ldots
w
_
m
)
$
的方法---统计语言模型的概念。并且下面将进一步介绍更加通用的
$
n
$
-gram语言模型,它在机器翻译及其他自然语言处理任务中有更加
广泛的应用。
\parinterval
在骰子游戏中,可以通过一种统计的方式,估计出在文本中词和句子出现的概率。但是在计算句子概率时往往会因为句子的样本过少而无法正确估计出句子出现的
概率。为了解决这个问题,这里引入了计算整个单词序列概率
$
\funp
{
P
}
(
w
_
1
w
_
2
\ldots
w
_
m
)
$
的方法
\ \dash
\
统计语言模型。下面将重点介绍
$
n
$
-gram语言模型。它是一种经典的统计语言模型,而且在机器翻译及其他自然语言处理任务中有非常
广泛的应用。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
...
...
@@ -463,7 +473,7 @@ F(x)=\int_{-\infty}^x f(x)\textrm{d}x
\subsection
{
建模
}
\parinterval
{
\small\sffamily\bfseries
{
语言模型
}}
\index
{
语言模型
}
(Language Model)
\index
{
Language Model
}
的目的是描述文字序列出现的规律
。这个
对问题建模的过程被称作
{
\small\sffamily\bfseries
{
语言建模
}}
\index
{
语言建模
}
(Language Modeling)
\index
{
Language Modeling
}
。如果使用统计建模的方式,语言模型可以被定义为计算
$
\funp
{
P
}
(
w
_
1
w
_
2
\ldots
w
_
m
)
$
的问题,也就是计算整个词序列
$
w
_
1
w
_
2
\ldots
w
_
m
$
出现的可能性大小。具体定义如下,
\parinterval
{
\small\sffamily\bfseries
{
语言模型
}}
\index
{
语言模型
}
(Language Model)
\index
{
Language Model
}
的目的是描述文字序列出现的规律
,其
对问题建模的过程被称作
{
\small\sffamily\bfseries
{
语言建模
}}
\index
{
语言建模
}
(Language Modeling)
\index
{
Language Modeling
}
。如果使用统计建模的方式,语言模型可以被定义为计算
$
\funp
{
P
}
(
w
_
1
w
_
2
\ldots
w
_
m
)
$
的问题,也就是计算整个词序列
$
w
_
1
w
_
2
\ldots
w
_
m
$
出现的可能性大小。具体定义如下,
%----------------------------------------------
% 定义3.1
...
...
@@ -473,7 +483,7 @@ F(x)=\int_{-\infty}^x f(x)\textrm{d}x
\end{definition}
%-------------------------------------------
\parinterval
直接求
$
\funp
{
P
}
(
w
_
1
w
_
2
\ldots
w
_
m
)
$
并不简单,因为如果把整个词串
$
w
_
1
w
_
2
\ldots
w
_
m
$
作为一个变量,模型的参数量会非常大。
$
w
_
1
w
_
2
\ldots
w
_
m
$
有
$
|V|
^
m
$
种可能性,这里
$
|V|
$
表示词汇表大小。显然,当
$
m
$
增大时,模型的复杂度会急剧增加,甚至都无法进行存储和计算。既然把
$
w
_
1
w
_
2
\ldots
w
_
m
$
作为一个变量不好处理,就可以考虑对这个序列的生成过程进行分解。使用链式法则,很容易得到
\parinterval
直接求
$
\funp
{
P
}
(
w
_
1
w
_
2
\ldots
w
_
m
)
$
并不简单,因为如果把整个词串
$
w
_
1
w
_
2
\ldots
w
_
m
$
作为一个变量,模型的参数量会非常大。
$
w
_
1
w
_
2
\ldots
w
_
m
$
有
$
|V|
^
m
$
种可能性,这里
$
|V|
$
表示词汇表大小。显然,当
$
m
$
增大时,模型的复杂度会急剧增加,甚至都无法进行存储和计算。既然把
$
w
_
1
w
_
2
\ldots
w
_
m
$
作为一个变量不好处理,就可以考虑对这个序列的生成过程进行分解。使用链式法则
(见
\ref
{
sec:chain-rule
}
节)
,很容易得到
\begin{eqnarray}
\funp
{
P
}
(w
_
1 w
_
2
\ldots
w
_
m)=
\funp
{
P
}
(w
_
1)
\funp
{
P
}
(w
_
2|w
_
1)
\funp
{
P
}
(w
_
3|w
_
1 w
_
2)
\ldots
\funp
{
P
}
(w
_
m|w
_
1 w
_
2
\ldots
w
_{
m-1
}
)
\label
{
eq:2-20
}
...
...
@@ -483,14 +493,13 @@ F(x)=\int_{-\infty}^x f(x)\textrm{d}x
\parinterval
换一个角度看,
$
\funp
{
P
}
(
w
_
m|w
_
1
w
_
2
\ldots
w
_{
m
-
1
}
)
$
体现了一种基于“历史”的单词生成模型,也就是把前面生成的所有单词作为“历史”,并参考这个“历史”生成当前单词。但是这个“历史”的长度和整个序列长度是相关的,也是一种长度变化的历史序列。为了化简问题,一种简单的想法是使用定长历史,比如,每次只考虑前面
$
n
-
1
$
个历史单词来生成当前单词,这就是
$
n
$
-gram语言模型。这个模型的数学描述如下:
\begin{eqnarray}
\funp
{
P
}
(w
_
m|w
_
1 w
_
2
\ldots
w
_{
m-1
}
)
\approx
\funp
{
P
}
(w
_
m|w
_{
m-n+1
}
\ldots
w
_{
m-1
}
)
\funp
{
P
}
(w
_
m|w
_
1 w
_
2
\ldots
w
_{
m-1
}
)
=
\funp
{
P
}
(w
_
m|w
_{
m-n+1
}
\ldots
w
_{
m-1
}
)
\label
{
eq:2-21
}
\end{eqnarray}
\parinterval
这样,整个序列
$
w
_
1
w
_
2
\ldots
w
_
m
$
的生成概率可以被重新定义为:
%------------------------------------------------------
\begin{table}
[htp]
{
\begin{center}
{
\footnotesize
\begin{tabular}
{
l|l|l l|l
}
...
...
@@ -506,12 +515,11 @@ F(x)=\int_{-\infty}^x f(x)\textrm{d}x
\end{tabular}
}
\end{center}
}
\end{table}
%------------------------------------------------------
\parinterval
可以看到,1-gram语言模型只是
$
n
$
-gram语言模型的一种特殊形式。基于独立性假设,1-gram假定当前
词出现与否与任何历史都无关,这种方法大大化简了求解句子概率的复杂度。但是,实际上句子中的词汇并非完全相互独立的,这种假设并不能完美的描述客观世界的问题。如果需要更精确地获取句子的概率,就需要使用更长的“历史”信息
。
\parinterval
可以看到,1-gram语言模型只是
$
n
$
-gram语言模型的一种特殊形式。基于独立性假设,1-gram假定当前
单词出现与否与任何历史都无关,这种方法大大化简了求解句子概率的复杂度。比如,上一节中公式
\ref
{
eq:seq-independ
}
就是一个1-gram语言模型。但是,句子中的单词并非完全相互独立的,这种独立性假设并不能完美的描述客观世界的问题。如果需要更精确地获取句子的概率,就需要使用更长的“历史”信息,比如,2-gram、3-gram、甚至更高阶的语言模型
。
\parinterval
$
n
$
-gram的优点在于,它所使用的历史信息是有限的,即
$
n
-
1
$
个单词。这种性质也反映了经典的马尔可夫链的思想
\upcite
{
liuke-markov-2004
}
\upcite
{
resnick1992adventures
}
,有时也被称作马尔可夫假设或者马尔可夫属性。因此
$
n
$
-gram也可以被看作是变长序列上的一种马尔可夫模型,比如,2-gram语言模型对应着1阶马尔可夫模型,3-gram语言模型对应着2阶马尔可夫模型,以此类推。
\parinterval
$
n
$
-gram的优点在于,它所使用的历史信息是有限的,即
$
n
-
1
$
个单词。这种性质也反映了经典的马尔可夫链的思想
\upcite
{
liuke-markov-2004
,
resnick1992adventures
}
,有时也被称作马尔可夫假设或者马尔可夫属性。因此
$
n
$
-gram也可以被看作是变长序列上的一种马尔可夫模型,比如,2-gram语言模型对应着1阶马尔可夫模型,3-gram语言模型对应着2阶马尔可夫模型,以此类推。
\parinterval
那么,如何计算
$
\funp
{
P
}
(
w
_
m|w
_{
m
-
n
+
1
}
\ldots
w
_{
m
-
1
}
)
$
呢?有很多种选择,比如:
...
...
@@ -531,17 +539,17 @@ F(x)=\int_{-\infty}^x f(x)\textrm{d}x
\end{itemize}
\vspace
{
0.5em
}
\parinterval
极大似然估计方法和掷骰子游戏中介绍的统计词汇概率的方法是一致的,它的核心是使用
$
n
$
-gram出现的频度进行参数估计。基于人工神经网络的方法在近些年也非常受关注,它直接利用多层神经网络对问题的输入
$
(
w
_{
m
-
n
+
1
}
\ldots
w
_{
m
-
1
}
)
$
和输出
$
\funp
{
P
}
(
w
_
m|w
_{
m
-
n
+
1
}
\ldots
w
_{
m
-
1
}
)
$
进行建模,而模型的参数通过网络中神经元之间连接的权重进行体现。严格意义上了来说,基于人工神经网络的方法并不算基于
$
n
$
-gram的方法,或者说它并没有显性记录
$
n
$
-gram的生成概率,也不依赖
$
n
$
-gram的频度进行参数估计。为了保证内容的连贯性,接下来仍以传统
$
n
$
-gram语言模型为基础进行讨论,基于人工神经网络的方法将会在
{
\chapternine
}
和
{
\chapterten
}
进行详细介绍。
\parinterval
极大似然估计方法和掷骰子游戏中介绍的统计词汇概率的方法是一致的,它的核心是使用
$
n
$
-gram出现的频度进行参数估计。基于人工神经网络的方法在近些年也非常受关注,它直接利用多层神经网络对问题的输入
$
(
w
_{
m
-
n
+
1
}
\ldots
w
_{
m
-
1
}
)
$
和输出
$
\funp
{
P
}
(
w
_
m|w
_{
m
-
n
+
1
}
\ldots
w
_{
m
-
1
}
)
$
进行建模,而模型的参数通过网络中神经元之间连接的权重进行体现。严格意义上了来说,基于人工神经网络的方法并不算基于
$
n
$
-gram的方法,或者说它并没有显性记录
$
n
$
-gram的生成概率,也不依赖
$
n
$
-gram的频度进行参数估计。为了保证内容的连贯性,接下来仍以传统
$
n
$
-gram语言模型为基础进行讨论,基于人工神经网络的方法将会在
{
\chapternine
}
进行详细介绍。
\parinterval
$
n
$
-gram语言模型的使用非常简单。可以直接用它来对词序列出现的概率进行计算。比如,可以使用一个2-gram语言模型计算一个句子出现的概率:
\parinterval
$
n
$
-gram语言模型的使用非常简单。可以直接用它来对词序列出现的概率进行计算。比如,可以使用一个2-gram语言模型计算一个句子出现的概率
,其中单词之间用斜杠分隔,如下
:
\begin{eqnarray}
&
&
\funp
{
P
}_{
2-
\textrm
{
gram
}}{
(
\textrm
{
确实
现在数据
很多
}
)
}
\nonumber
\\
&
&
\funp
{
P
}_{
2-
\textrm
{
gram
}}{
(
\textrm
{
确实
/现在/数据/
很多
}
)
}
\nonumber
\\
&
=
&
\funp
{
P
}
(
\textrm
{
确实
}
)
\times
\funp
{
P
}
(
\textrm
{
现在
}
|
\textrm
{
确实
}
)
\times
\funp
{
P
}
(
\textrm
{
数据
}
|
\textrm
{
现在
}
)
\times
\nonumber
\\
&
&
\funp
{
P
}
(
\textrm
{
很
}
|
\textrm
{
数据
}
)
\times
\funp
{
P
}
(
\textrm
{
多
}
|
\textrm
{
很
}
)
\label
{
eq:2-23
}
\end{eqnarray}
\parinterval
以
$
n
$
-gram语言模型为代表的统计语言模型的应用非常广泛。除了将要在第三章中介绍的全概率分词方法,在文本生成、信息检索、摘要等自然语言处理任务中,语言模型都有举足轻重的地位。包括近些年非常受关注的预训练模型,本质上也是统计语言模型。这些技术都会在后续章节进行介绍。值得注意的是,统计语言模型为解决自然语言处理问题提供了一个非常好的建模思路,即:把整个序列生成的问题转化为逐个生成单词的问题。实际上,这种建模方式会被广泛地用于机器翻译建模,在统计机器翻译和神经机器翻译中都会有
明显
的体现。
\parinterval
以
$
n
$
-gram语言模型为代表的统计语言模型的应用非常广泛。除了将要在第三章中介绍的全概率分词方法,在文本生成、信息检索、摘要等自然语言处理任务中,语言模型都有举足轻重的地位。包括近些年非常受关注的预训练模型,本质上也是统计语言模型。这些技术都会在后续章节进行介绍。值得注意的是,统计语言模型为解决自然语言处理问题提供了一个非常好的建模思路,即:把整个序列生成的问题转化为逐个生成单词的问题。实际上,这种建模方式会被广泛地用于机器翻译建模,在统计机器翻译和神经机器翻译中都会有
具体
的体现。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论