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
29939616
Commit
29939616
authored
Aug 21, 2020
by
xiaotong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wording (sec 2 finished)
parent
b0524902
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
24 行增加
和
12 行删除
+24
-12
Chapter2/chapter2.tex
+24
-12
没有找到文件。
Chapter2/chapter2.tex
查看文件 @
29939616
...
...
@@ -899,7 +899,15 @@ c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll}
\end{figure}
%-------------------------------------------
\parinterval
从这个角度来看,在树的遍历中,可以很自然地引入语言模型打分:在解空间树中引入节点的权重
\ \dash\
将当前节点
$
i
$
的得分重设为语言模型打分
$
\log
\funp
{
P
}
(
w
_
i | w
_
1
w
_
2
\ldots
w
_{
i
-
1
}
)
$
,其中
$
w
_
1
w
_
2
\ldots
w
_{
i
-
1
}$
是该节点的全部祖先。与先前不同的是,由于在使用语言模型打分时,词的概率通常小于1,因此句子很长时概率会非常小,容易造成浮点误差,所以这里使用概率的对数形式
$
\log
\funp
{
P
}
(
w
_
i | w
_
1
w
_
2
\ldots
w
_{
i
-
1
}
)
$
代替
$
\funp
{
P
}
(
w
_
i | w
_
1
w
_
2
\ldots
w
_{
i
-
1
}
)
$
。此时对于图中一条包含<eos>的完整序列来说,它的最终得分为
$
\log
\funp
{
P
}
(
w
_
1
w
_
2
\ldots
w
_
m
)
=
\sum
_{
i
=
1
}^{
m
}
\log
\funp
{
P
}
(
w
_
i | w
_
1
w
_
2
\ldots
w
_{
i
-
1
}
)
$
。如图
\ref
{
fig:2-15
}
所示,可知红线所示单词序列“<sos>
\
I
\
agree
\
<eos>”的得分为:
\parinterval
从这个角度来看,在树的遍历中,可以很自然地引入语言模型打分:在解空间树中引入节点的权重
\ \dash\
将当前节点
$
i
$
的得分重设为语言模型打分
$
\log
\funp
{
P
}
(
w
_
i | w
_
1
w
_
2
\ldots
w
_{
i
-
1
}
)
$
,其中
$
w
_
1
w
_
2
\ldots
w
_{
i
-
1
}$
是该节点的全部祖先。与先前不同的是,由于在使用语言模型打分时,词的概率通常小于1,因此句子很长时概率会非常小,容易造成浮点误差,所以这里使用概率的对数形式
$
\log
\funp
{
P
}
(
w
_
i | w
_
1
w
_
2
\ldots
w
_{
i
-
1
}
)
$
代替
$
\funp
{
P
}
(
w
_
i | w
_
1
w
_
2
\ldots
w
_{
i
-
1
}
)
$
。此时对于图中一条包含<eos>的完整序列来说,它的最终得分
$
\textrm
{
score
}
(
\cdot
)
$
可以被定义为:
\begin{eqnarray}
\textrm
{
score
}
(w
_
1 w
_
2
\ldots
w
_
m)
&
=
&
\log
\funp
{
P
}
(w
_
1 w
_
2
\ldots
w
_
m)
\nonumber
\\
&
=
&
\sum
_{
i=1
}^{
m
}
\log
\funp
{
P
}
(w
_
i | w
_
1 w
_
2
\ldots
w
_{
i-1
}
)
\end{eqnarray}
通常,
$
\textrm
{
score
}
(
\cdot
)
$
也被称作
{
\small\bfnew
{
模型得分
}}
\index
{
模型得分
}
(Model Score
\index
{
Model Score
}
)。如图
\ref
{
fig:2-15
}
所示,可知红线所示单词序列“<sos>
\
I
\
agree
\
<eos>”的模型得分为:
\begin{eqnarray}
&&
\textrm
{
score(<sos>
\
I
\
agree
\
<eos>)
}
\nonumber
\\
&
=
&
\log
\funp
{
P
}
(
\textrm
{
<sos>
}
) +
\log
\funp
{
P
}
(
\textrm
{
I
}
|
\textrm
{
<sos>
}
) +
\log
\funp
{
P
}
(
\textrm
{
agree
}
|
\textrm
{
<sos>
\
I
}
) +
\log
\funp
{
P
}
(
\textrm
{
<sos>
}
|
\textrm
{
<sos>
\
I
\
agree
}
)
\nonumber
\\
...
...
@@ -969,9 +977,13 @@ c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll}
\parinterval
在搜索问题中,一个单词序列的生成可以分为两部分:已生成部分和未生成部分。既然最终目标是使得一个完整的单词序列得分最高,那么关注未生成部分的得分也许能为搜索策略的改进提供思路。
\parinterval
但是,问题在于未生成部分来自搜索树中未被搜索过的区域,因此也无法直接计算其得分。既然仅依赖于问题本身的信息无法得到未生成部分的得分,那么是否可以通过一些外部信息来估计未生成部分的得分呢?在前面所提到的剪枝技术中,借助语言模型的特性可以使得搜索变得高效。与其类似,利用语言模型的其他特性也可以实现对未生成部分得分的估计。这个对未生成部分得分的估计通常被称为
{
\small\bfnew
{
启发式函数
}}
\index
{
启发式函数
}
(Heuristic Function)
\index
{
Heuristic Function
}
。在扩展假设过程中,可以优先挑选当前得分
$
\log
\funp
{
P
}
(
w
_
1
w
_
2
\ldots
w
_
m
)
$
和启发式函数值
$
h
(
w
_
1
w
_
2
\ldots
w
_
m
)
$
最大的候选进行扩展,从而大大提高搜索的效率。这种基于启发式函数的一致代价搜索通常也被称为
$
\textrm
{
A
}^{
\ast
}$
搜索或
{
\small\bfnew
{
启发式搜索
}}
\index
{
启发式搜索
}
(Heuristic Search)
\index
{
Heuristically Search
}
\upcite
{
hart1968a
}
。
\parinterval
但是,问题在于未生成部分来自搜索树中未被搜索过的区域,因此也无法直接计算其得分。既然仅依赖于问题本身的信息无法得到未生成部分的得分,那么是否可以通过一些外部信息来估计未生成部分的得分呢?在前面所提到的剪枝技术中,借助语言模型的特性可以使得搜索变得高效。与其类似,利用语言模型的其他特性也可以实现对未生成部分得分的估计。这个对未生成部分得分的估计通常被称为
{
\small\bfnew
{
启发式函数
}}
\index
{
启发式函数
}
(Heuristic Function)
\index
{
Heuristic Function
}
。在扩展假设过程中,可以优先挑选当前得分
$
\log
\funp
{
P
}
(
w
_
1
w
_
2
\ldots
w
_
m
)
$
和启发式函数值
$
h
(
w
_
1
w
_
2
\ldots
w
_
m
)
$
最大的候选进行扩展,从而大大提高搜索的效率。这时,模型得分可以被定义为:
\begin{eqnarray}
\textrm
{
score
}
(w
_
1 w
_
2
\ldots
w
_
m) =
\log
\funp
{
P
}
(w
_
1 w
_
2
\ldots
w
_
m) + h(w
_
1 w
_
2
\ldots
w
_
m)
\end{eqnarray}
\parinterval
通常可以把启发式函数看成是计算当前状态跟最优解的距离的一种方法,并把关于最优解的一些性质的猜测放到启发式函数里。比如,在序列生成中,一般认为最优序列应该在某个特定的长度附近,那么就可以把启发式函数定义成该长度与当前单词序列长度的差值。这样,在搜索过程中,启发式函数会引导搜索优先生成当前得分高且序列长度接近预设长度的单词序列。
\parinterval
这种基于启发式函数的一致代价搜索通常也被称为
$
\textrm
{
A
}^{
\ast
}$
搜索或
{
\small\bfnew
{
启发式搜索
}}
\index
{
启发式搜索
}
(Heuristic Search)
\index
{
Heuristic Search
}
\upcite
{
hart1968a
}
。
通常可以把启发式函数看成是计算当前状态跟最优解的距离的一种方法,并把关于最优解的一些性质的猜测放到启发式函数里。比如,在序列生成中,一般认为最优序列应该在某个特定的长度附近,那么就可以把启发式函数定义成该长度与当前单词序列长度的差值。这样,在搜索过程中,启发式函数会引导搜索优先生成当前得分高且序列长度接近预设长度的单词序列。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
...
...
@@ -1008,7 +1020,7 @@ c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll}
\parinterval
贪婪搜索会产生质量比较差的解是由于当前单词的错误选择造成的。既然每次只挑选一个单词可能会产生错误,那么可以通过同时考虑更多候选单词来缓解这个问题,也就是对于一个位置,可以同时将其扩展到若干个节点。这样就扩大了搜索的范围,进而使得优质解被找到的概率增大。
\parinterval
常见的做法是每一次生成新单词的时候都挑选得分最高的前
$
B
$
个单词,然后扩展这
$
B
$
个单词的
$
V
$
个孩子节点,得到
$
BV
$
条新路径,最后保留其中得分最高的
$
B
$
条路径。从另外一个角度理解,它相当于比贪婪搜索看到了更多的假设
,因而它更有可能找到好的解。这个方法通常被称为
{
\small\bfnew
{
束搜索
}}
\index
{
束搜索
}
(Beam Search)
\index
{
Beam Search
}
。图
\ref
{
fig:2-19
}
展示了一个束大小为3的例子,其中束大小代表每次选择单词时保留的词数。比起贪婪搜索,束搜索在实际表现中非常优秀,它的时间、空间复杂度仅为贪婪搜索的常数倍,也就是
$
\textrm
{
O
}
(
Bm
)
$
。
\parinterval
常见的做法是每一次生成新单词的时候都挑选得分最高的前
$
B
$
个单词,然后扩展这
$
B
$
个单词的
$
T
$
个孩子节点,得到
$
BT
$
条新路径,最后保留其中得分最高的
$
B
$
条路径。从另外一个角度理解,它相当于比贪婪搜索看到了更多的路径
,因而它更有可能找到好的解。这个方法通常被称为
{
\small\bfnew
{
束搜索
}}
\index
{
束搜索
}
(Beam Search)
\index
{
Beam Search
}
。图
\ref
{
fig:2-19
}
展示了一个束大小为3的例子,其中束大小代表每次选择单词时保留的词数。比起贪婪搜索,束搜索在实际表现中非常优秀,它的时间、空间复杂度仅为贪婪搜索的常数倍,也就是
$
\textrm
{
O
}
(
Bm
)
$
。
%----------------------------------------------
\begin{figure}
[htp]
...
...
@@ -1019,11 +1031,11 @@ c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll}
\end{figure}
%-------------------------------------------
\parinterval
束搜索也有很多的改进版本。
比如
,在无信息搜索策略中可以使用剪枝技术来提升搜索的效率。而实际上,束搜索本身也是一种剪枝方法。因此有时也把束搜索称作
{
\small\bfnew
{
束剪枝
}}
\index
{
束剪枝
}
(Beam Pruning)
\index
{
Beam Pruning
}
。在这里有很多其它的剪枝策略可供选择,例如可以只保留与当前最佳路径得分相差在
$
\theta
$
之内的路径,也就是搜索只保留得分差距在一定范围内的路径,这种方法也被称作
{
\small\bfnew
{
直方图剪枝
}}
\index
{
直方图剪枝
}
(Histogram Pruning)
\index
{
Histogram Pruning
}
。
\parinterval
束搜索也有很多的改进版本。
回忆一下
,在无信息搜索策略中可以使用剪枝技术来提升搜索的效率。而实际上,束搜索本身也是一种剪枝方法。因此有时也把束搜索称作
{
\small\bfnew
{
束剪枝
}}
\index
{
束剪枝
}
(Beam Pruning)
\index
{
Beam Pruning
}
。在这里有很多其它的剪枝策略可供选择,例如可以只保留与当前最佳路径得分相差在
$
\theta
$
之内的路径,也就是搜索只保留得分差距在一定范围内的路径,这种方法也被称作
{
\small\bfnew
{
直方图剪枝
}}
\index
{
直方图剪枝
}
(Histogram Pruning)
\index
{
Histogram Pruning
}
。
\parinterval
对于语言模型来说,当
进行搜索时正在搜索的多个路径中最高得分比当前搜索到的最好的解的得分低时,可以立刻停止搜索。因为此时序列越长语言模型得分
$
\log
\funp
{
P
}
(
w
_
1
w
_
2
\ldots
w
_
m
)
$
会越低,继续扩展这些路径不会产生更好的结果。这个技术通常也被称为
{
\small\bfnew
{
最佳停止条件
}}
\index
{
最佳停止条件
}
(Optimal Stopping Criteria)
\index
{
Optimal Stopping Criteria
}
。
\parinterval
对于语言模型来说,当
多个路径中最高得分比当前搜索到的最好的解的得分低时,可以立刻停止搜索。因为此时序列越长语言模型得分
$
\log
\funp
{
P
}
(
w
_
1
w
_
2
\ldots
w
_
m
)
$
会越低,继续扩展这些路径不会产生更好的结果。这个技术通常也被称为
{
\small\bfnew
{
最佳停止条件
}}
\index
{
最佳停止条件
}
(Optimal Stopping Criteria)
\index
{
Optimal Stopping Criteria
}
。类似的思想也被用于机器翻译等任务
{
\color
{
red
}
(此处引用liang huang的论文)
}
。
\parinterval
总的来说,虽然局部搜索由于没有遍历完整的解空间,使得这类方法无法保证找到最优解。但是,局部搜索算法大大降低了搜索过程的时间、空间复杂度。因此在语言模型生成和机器翻译的解码过程中常常使用局部搜索算法。在
{
\chapterseven
}
、
{
\chapterten
}
、
{
\chaptereleven
}
中还将介绍这些算法的具体应用。
\parinterval
总的来说,虽然局部搜索由于没有遍历完整的解空间,使得这类方法无法保证找到最优解。但是,局部搜索算法大大降低了搜索过程的时间、空间复杂度。因此在语言模型生成和机器翻译的解码过程中常常使用局部搜索算法。在
{
\chapterseven
}
、
{
\chapterten
}
中还将介绍这些算法的具体应用。
%----------------------------------------------------------------------------------------
% NEW SECTION
...
...
@@ -1032,20 +1044,20 @@ c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll}
\sectionnewpage
\section
{
小结及深入阅读
}
\label
{
sec2:summary
}
\parinterval
本章重点介绍了如何对自然语言处理问题进行统计建模,并从数据中自动学习统计模型的参数,最终使用学习到的模型对新的问题进行处理。之后,将这种思想应用到语言建模任务中,该任务与机器翻译有着紧密的联系。通过系统化的建模,可以发现:经过适当的假设和化简,统计模型可以很好的描述复杂的自然语言处理问题。相关概念和方法也会在后续章节的内容中被广泛使用。
\parinterval
本章重点介绍了如何对自然语言处理问题进行统计建模,并从数据中自动学习统计模型的参数,最终使用学习到的模型对新的问题进行处理。之后,将这种思想应用到语言建模任务中,该任务与机器翻译有着紧密的联系。通过系统化的建模,可以发现:经过适当的假设和化简,统计模型可以很好的描述复杂的自然语言处理问题。
进一步,本章对面向语言模型预测的搜索方法进行了介绍。
相关概念和方法也会在后续章节的内容中被广泛使用。
\parinterval
此外,有几方面内容,读者可以继续深入了解:
\begin{adjustwidth}
{
1em
}{}
\begin{itemize}
\vspace
{
0.5em
}
\item
在
本章介绍的
$
n
$
-gram语言模型中,通过对语料库中词汇频率进行统计,进而计算句子的概率。但是由于语料中存在大量的低频词汇以及未登录词,这些概率为0或接近0的词汇将导致语言模型无法给出合理的句子概率。因此本章介绍了三种平滑方法,以解决上述问题。实际上,平滑方法是语言建模中的重要研究方向。除了上述三种方法之外,还有Jelinek–Mercer平滑
\upcite
{
jelinek1980interpolated
}
、Katz平滑
\upcite
{
katz1987estimation
}
以及Witten–Bell平滑等等
\upcite
{
bell1990text
}
\upcite
{
witten1991the
}
。相关工作也对这些平滑方法进行了详细对比
\upcite
{
chen1999an
}
\upcite
{
goodman2001a
}
。
\item
在
$
n
$
-gram语言模型中,由于语料中往往存在大量的低频词以及未登录词,模型会产生不合理的概率预测结果。因此本章介绍了三种平滑方法,以解决上述问题。实际上,平滑方法是语言建模中的重要研究方向。除了上述三种方法之外,还有Jelinek–Mercer平滑
\upcite
{
jelinek1980interpolated
}
、Katz 平滑
\upcite
{
katz1987estimation
}
以及Witten–Bell平滑等等
\upcite
{
bell1990text,witten1991the
}
。 相关工作也对这些平滑方法进行了详细对比
\upcite
{
chen1999an,
goodman2001a
}
。
\vspace
{
0.5em
}
\item
除了平滑方法,也有很多
对
$
n
$
-gram语言模型的改进工作。比如,对于形态学丰富的语言,可以考虑对单词的形态学变化来进行建模。这类语言模型在一些机器翻译系统中也体现出了很好的潜力
\upcite
{
kirchhoff2005improved
}
\upcite
{
sarikaya2007joint
}
\upcite
{
koehn2007factored
}
。此外,如何使用超大规模数据进行语言模型训练也是备受关注的研究方向。比如,有研究者探索了对超大语言模型进行压缩和存储的方法
\upcite
{
federico2007efficient
}
\upcite
{
federico2006how
}
\upcite
{
heafield2011kenlm
}
。另一个有趣的方向是,利用随机存储算法对大规模语言模型进行有效存储
\upcite
{
talbot2007smoothed
}
\upcite
{
talbot2007randomised
}
,比如,在语言模型中使用Bloom
\
Filter等随机存储的数据结构。
\item
除了平滑方法,也有很多
工作对
$
n
$
-gram语言模型进行改进。比如,对于形态学丰富的语言,可以考虑对单词的形态学变化进行建模。这类语言模型在一些机器翻译系统中也体现出了很好的潜力
\upcite
{
kirchhoff2005improved
}
\upcite
{
sarikaya2007joint,koehn2007factored
}
。此外,如何使用超大规模数据进行语言模型训练也是备受关注的研究方向。比如,有研究者探索了对超大语言模型进行压缩和存储的方法
\upcite
{
federico2007efficient,federico2006how,heafield2011kenlm
}
。另一个有趣的方向是,利用随机存储算法对大规模语言模型进行有效存储
\upcite
{
talbot2007smoothed,
talbot2007randomised
}
,比如,在语言模型中使用Bloom
\
Filter等随机存储的数据结构。
\vspace
{
0.5em
}
\item
本章更多地关注了语言模型的基本问题和求解思路,但是基于
$
n
$
-gram的方法并不是语言建模的唯一方法。从现在自然语言处理的前沿看,
基于端到端学习的深度学习方法在很多任务中都取得了领先的性能。语言模型同样可以使用这些方法
\upcite
{
jing2019a
}
,而且在近些年取得了巨大成功
\upcite
{
DBLP:conf/nips/BengioDV00
}
。例如,最早提出的前馈神经语言模型
\upcite
{
bengio2003a
}
和后来的基于循环单元的语言模型
\upcite
{
mikolov2010recurrent
}
、基于长短期记忆单元的语言模型
\upcite
{
sundermeyer2012lstm
}
以及现在非常流行的Transformer
\upcite
{
vaswani2017attention
}
\upcite
{
dai2019transformer
}
。
关于神经语言模型的内容,会在
{
\chapternine
}
进行进一步介绍。
\item
本章更多地关注了语言模型的基本问题和求解思路,但是基于
$
n
$
-gram的方法并不是语言建模的唯一方法。从现在自然语言处理的前沿看,
端到端的深度学习方法在很多任务中都取得了领先的性能。语言模型同样可以使用这些方法
\upcite
{
jing2019a
}
,而且在近些年取得了巨大成功。例如,最早提出的前馈神经语言模型
\upcite
{
bengio2003a
}
和后来的基于循环单元的语言模型
\upcite
{
mikolov2010recurrent
}
、基于长短期记忆单元的语言模型
\upcite
{
sundermeyer2012lstm
}
以及现在非常流行的Transformer
\upcite
{
vaswani2017attention
}
。
关于神经语言模型的内容,会在
{
\chapternine
}
进行进一步介绍。
\vspace
{
0.5em
}
\item
最后,本章结合语言模型的序列生成任务对搜索技术进行了介绍。类似地,机器翻译任务也需要从大量的翻译后选中快速寻找最优译文。因此在机器翻译任务中也使用了搜索方法,这个过程通常被称作
{
\small\bfnew
{
解码
}}
\index
{
解码
}
(Decoding)
\index
{
Decoding
}
。例如,有研究者在基于词的翻译模型中尝试使用启发式搜索
\upcite
{
DBLP:conf/acl/OchUN01,DBLP:conf/acl/WangW97
}
以及贪婪搜索方法
\upcite
{
germann2001fast
}
\upcite
{
germann2003greedy
}
,也有研究者在基于短语的栈解码中使用
$
\textrm
{
A
}^{
\ast
}$
搜索
\upcite
{
tillmann1997a
}
\upcite
{
wang1997decoding
}
。此外,解码方法还包括有限状态机解码
\upcite
{
bangalore2001a
}
\upcite
{
bangalore2000stochastic
}
以及基于语言学约束的解码
\upcite
{
venugopal2007an
}
\upcite
{
huang2007forest
}
。相关内容将在
{
\chaptereight
}
和
{
\chapterfourteen
}
进行介绍。
\item
最后,本章结合语言模型的序列生成任务对搜索技术进行了介绍。类似地,机器翻译任务也需要从大量的翻译后选中快速寻找最优译文。因此在机器翻译任务中也使用了搜索方法,这个过程通常被称作
{
\small\bfnew
{
解码
}}
\index
{
解码
}
(Decoding)
\index
{
Decoding
}
。例如,有研究者在基于词的翻译模型中尝试使用启发式搜索
\upcite
{
DBLP:conf/acl/OchUN01,DBLP:conf/acl/WangW97
,tillmann1997a
}
以及贪婪搜索方法
\upcite
{
germann2001fast
}
\upcite
{
germann2003greedy
}
,也有研究者研究基于短语的栈解码方法
{
\color
{
red
}
(引用Moses)
}
。此外,解码方法还包括有限状态机解码
\upcite
{
bangalore2001a
}
\upcite
{
bangalore2000stochastic
}
以及基于语言学约束的解码
\upcite
{
venugopal2007an
}{
\color
{
red
}
(找SAMT、树到串、串到树翻译、Hiero的论文)
}
。相关内容将在
{
\chaptereight
}
和
{
\chapterfourteen
}
进行介绍。
\vspace
{
0.5em
}
\end{itemize}
\end{adjustwidth}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论