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
23144b61
Commit
23144b61
authored
Aug 27, 2020
by
单韦乔
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
第二章语言修正
parent
0ef35cf4
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
6 行增加
和
7 行删除
+6
-7
Chapter2/chapter2.tex
+6
-7
没有找到文件。
Chapter2/chapter2.tex
查看文件 @
23144b61
...
...
@@ -539,7 +539,7 @@ 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
}
进行详细介绍。
\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语言模型计算一个句子出现的概率,其中单词之间用斜杠分隔,如下:
\begin{eqnarray}
...
...
@@ -840,7 +840,7 @@ c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll}
\parinterval
在这种序列生成方式的基础上,实现搜索通常有两种方法
\ \dash\
深度优先遍历和宽度优先遍历
\upcite
{
DBLP:books/mg/CormenLR89
}
。在深度优先遍历中,每次从词表中可重复地选择一个单词,然后从左至右地生成序列,直到<eos>被选择,此时一个完整的单词序列被生成出来。然后从<eos>回退到上一个单词,选择之前词表中未被选择到的候选单词代替<eos>,并继续挑选下一个单词直到<eos>被选到,如果上一个单词的所有可能都被枚举过,那么回退到上上一个单词继续枚举,直到回退到<sos>,这时候枚举结束。在宽度优先遍历中,每次不是只选择一个单词,而是枚举所有单词。
有一个
一个
简单的例子。假设词表只含两个单词
\{
a, b
\}
,从<sos>开始枚举所有单词,有三种可能:
有一个简单的例子。假设词表只含两个单词
\{
a, b
\}
,从<sos>开始枚举所有单词,有三种可能:
\begin{eqnarray}
\text
{
\{
<sos> a, <sos> b, <sos> <eos>
\}
}
\nonumber
\end{eqnarray}
...
...
@@ -868,7 +868,7 @@ c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll}
\parinterval
当任务对单词序列长度没有限制时,上述两种方法枚举出的单词序列也是无穷无尽的。因此这两种枚举策略并不具备完备性而且会导致枚举过程无法停止。由于日常生活中通常不会见到特别长的句子,因此可以通过限制单词序列的最大长度来避免这个问题。一旦单词序列的最大长度被确定,以上两种枚举策略就可以在一定时间内枚举出所有可能的单词序列,因而一定可以找到最优的单词序列,即具备最优性。
\parinterval
此时上述生成策略虽然可以满足完备性和最优性,但其仍然算不上是优秀的生成策略,因为这两种算法在时间复杂度和空间复杂度上的表现很差,如表
\ref
{
tab:2-3
}
所示。其中
$
|V|
$
为词表大小,
$
m
$
为序列长度值得注意的是,在之前的遍历过程中,除了在序列开头一定会挑选<sos>之外,其他位置每次可挑选的单词并不只有词表中的单词,还有结束符号<eos>,因此实际上生成过程中每个位置的单词候选数量为
$
|V|
+
1
$
。
\parinterval
此时上述生成策略虽然可以满足完备性和最优性,但其仍然算不上是优秀的生成策略,因为这两种算法在时间复杂度和空间复杂度上的表现很差,如表
\ref
{
tab:2-3
}
所示。其中
$
|V|
$
为词表大小,
$
m
$
为序列长度
。
值得注意的是,在之前的遍历过程中,除了在序列开头一定会挑选<sos>之外,其他位置每次可挑选的单词并不只有词表中的单词,还有结束符号<eos>,因此实际上生成过程中每个位置的单词候选数量为
$
|V|
+
1
$
。
\vspace
{
0.5em
}
%------------------------------------------------------
...
...
@@ -922,7 +922,7 @@ c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll}
\end{figure}
%-------------------------------------------
\parinterval
这样,语言模型的打分与解空间树的遍历就融合
了在一起
。于是,序列生成的问题可以被重新描述为:寻找所有单词序列组成的解空间树中权重总和最大的一条路径。在这个定义下,前面提到的两种枚举词序列的方法就是经典的
{
\small\bfnew
{
深度优先搜索
}}
\index
{
深度优先搜索
}
(Depth-first Search)
\index
{
Depth-first Search
}
和
{
\small\bfnew
{
宽度优先搜索
}}
\index
{
宽度优先搜索
}
(Breadth-first Search)
\index
{
Breadth-first Search
}
的雏形
\upcite
{
even2011graph,tarjan1972depth
}
。在后面的内容中可以看到,从遍历解空间树的角度出发,可以对原始这些搜索策略的效率进行优化。
\parinterval
这样,语言模型的打分与解空间树的遍历就融合
在一起了
。于是,序列生成的问题可以被重新描述为:寻找所有单词序列组成的解空间树中权重总和最大的一条路径。在这个定义下,前面提到的两种枚举词序列的方法就是经典的
{
\small\bfnew
{
深度优先搜索
}}
\index
{
深度优先搜索
}
(Depth-first Search)
\index
{
Depth-first Search
}
和
{
\small\bfnew
{
宽度优先搜索
}}
\index
{
宽度优先搜索
}
(Breadth-first Search)
\index
{
Breadth-first Search
}
的雏形
\upcite
{
even2011graph,tarjan1972depth
}
。在后面的内容中可以看到,从遍历解空间树的角度出发,可以对原始这些搜索策略的效率进行优化。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
...
...
@@ -962,7 +962,7 @@ c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll}
\end{figure}
%-------------------------------------------
\parinterval
上面描述的两个改进后的搜索方法属于
{
\small\bfnew
{
无信息搜索
}}
\index
{
无信息搜索
}
(Uninformed Search
\index
{
Uninformed Search
}
)
\upcite
{
sahni1978fundamentals
}
,因为它们依赖的信息仍然来源于问题本身而不是问题以外。改进后的方法虽然有机会更早
的
找到分数最高的单词序列(也就是最优解)。但是由于没有一个通用的办法来判断当前找到的解是否为最优解,这种策略不会在找到最优解后自动停止,因此最终仍然需要枚举所有可能的单词序列,寻找最优解需要的时间复杂度没有产生任何改变。尽管如此,如果只是需要一个相对好的解而不是最优解,改进后的搜索策略仍然是比原始的枚举策略更优秀的算法。
\parinterval
上面描述的两个改进后的搜索方法属于
{
\small\bfnew
{
无信息搜索
}}
\index
{
无信息搜索
}
(Uninformed Search
\index
{
Uninformed Search
}
)
\upcite
{
sahni1978fundamentals
}
,因为它们依赖的信息仍然来源于问题本身而不是问题以外。改进后的方法虽然有机会更早
地
找到分数最高的单词序列(也就是最优解)。但是由于没有一个通用的办法来判断当前找到的解是否为最优解,这种策略不会在找到最优解后自动停止,因此最终仍然需要枚举所有可能的单词序列,寻找最优解需要的时间复杂度没有产生任何改变。尽管如此,如果只是需要一个相对好的解而不是最优解,改进后的搜索策略仍然是比原始的枚举策略更优秀的算法。
\parinterval
此外,由于搜索过程中将语言模型的打分作为搜索树的节点权重,另一种改进思路是:能否借助语言模型的特殊性质来对搜索树进行
{
\small\bfnew
{
剪枝
}}
\index
{
剪枝
}
(Pruning)
\index
{
Pruning
}
,从而避免在搜索空间中访问一些不可能产生比当前解更好的结果的区域,提高搜索策略在实际运用当中的效率。简单来说,剪枝是一种可以缩小搜索空间的手段,比如,在搜索的过程中,动态的“丢弃”一些搜索路径,从而减少搜索的总代价。剪枝的程度在一定范围内影响了搜索系统的效率,剪枝越多搜索效率越高,一般找到最优解的可能性也越低;反之,搜索效率越低,但是找到最优解的可能性越大。在本章后面即将介绍的贪婪搜索和束搜索都可以被看作是剪枝方法的一种特例。
...
...
@@ -975,7 +975,6 @@ 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
)
$
最大的候选进行扩展,从而大大提高搜索的效率。这时,模型得分可以被定义为:
\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}
...
...
@@ -1050,7 +1049,7 @@ c_{\textrm{KN}}(\cdot) = \left\{\begin{array}{ll}
\vspace
{
0.5em
}
\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,koehn2007factored
}
。此外,如何使用超大规模数据进行语言模型训练也是备受关注的研究方向。比如,有研究者探索了对超大语言模型进行压缩和存储的方法
\upcite
{
federico2007efficient,federico2006how,heafield2011kenlm
}
。另一个有趣的方向是,利用随机存储算法对大规模语言模型进行有效存储
\upcite
{
talbot2007smoothed,talbot2007randomised
}
,比如,在语言模型中使用Bloom
\
Filter等随机存储的数据结构。
\item
除了平滑方法,也有很多工作对
$
n
$
-gram语言模型进行改进。比如,对于形态学丰富的语言,可以考虑对单词的形态学变化进行建模。这类语言模型在一些机器翻译系统中也体现出了很好的潜力
\upcite
{
kirchhoff2005improved
,
sarikaya2007joint,koehn2007factored
}
。此外,如何使用超大规模数据进行语言模型训练也是备受关注的研究方向。比如,有研究者探索了对超大语言模型进行压缩和存储的方法
\upcite
{
federico2007efficient,federico2006how,heafield2011kenlm
}
。另一个有趣的方向是,利用随机存储算法对大规模语言模型进行有效存储
\upcite
{
talbot2007smoothed,talbot2007randomised
}
,比如,在语言模型中使用Bloom
\
Filter等随机存储的数据结构。
\vspace
{
0.5em
}
\item
本章更多地关注了语言模型的基本问题和求解思路,但是基于
$
n
$
-gram的方法并不是语言建模的唯一方法。从现在自然语言处理的前沿看,端到端的深度学习方法在很多任务中都取得了领先的性能。语言模型同样可以使用这些方法
\upcite
{
jing2019a
}
,而且在近些年取得了巨大成功。例如,最早提出的前馈神经语言模型
\upcite
{
bengio2003a
}
和后来的基于循环单元的语言模型
\upcite
{
mikolov2010recurrent
}
、基于长短期记忆单元的语言模型
\upcite
{
sundermeyer2012lstm
}
以及现在非常流行的Transformer
\upcite
{
vaswani2017attention
}
。 关于神经语言模型的内容,会在
{
\chapternine
}
进行进一步介绍。
\vspace
{
0.5em
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论