目录
2.1 Natural Language Tasks:Syntactic Tasks(句法任务)
2.2 Natural Language Tasks:Semantic Tasks(语义任务)
2.3 Natural Language Tasks:Pragmatics/Discourse Tasks(语用学/话语任务)
2.4 Natural Language Tasks:Other Tasks
3.2 马尔可夫假设(The Markov Assumption)
四、Smoothed n-grams(平滑处理)- 给之前没有见过的事件赋予概率(重点)
4.2 计算公式(以bigrams 为例)- 拉普拉斯平滑(“加一” 平滑)
4.3 计算公式(以unigram 为例)- 拉普拉斯平滑(“加一” 平滑)
一、自然语言处理简史
1.1 1950 年代
- Computing Machinery and Intelligence(计算机器与智能), Alan Turing
- Turing test(图灵测试):通过一个对话测试来测量机器智能
- Syntactic Structures(句法结构), Noam Chomsky
- Formal language theory(形式语言理论):使用代数和集合论将形式语言定义为符号序列
- 例如:Colourless green ideas sleep furiously.(无色的绿色思想激烈地沉睡。)
- 该句子从意义上讲不通
- 但它的语法似乎还不错
- 强调了语义(含义)和句法(句子结构)二者的区别
1.2 1960-1970 年代
- Symbolic paradigm(符号范式)
- Generative grammar(生成式语法):发现生成语法句子的规则系统
- Parsing algorithms(解析算法)
- Stochastic paradigm(随机范式)
- 贝叶斯方法用于光学字符识别(optical character recognition, OCR)和作者身份署名(authorship attribution)
- 第一个在线语料库:Brown corpus of American English(美式英语布朗语料库)
- 100 万个单词,覆盖 500 种不同类型的文档(新闻、小说等等)
1.3 1970-1980 年代
- Stochastic paradigm(随机范式)
- Hidden Markov models(隐马尔可夫模型)、noisy channel decoding(噪声信道解码)
- Speech recognition and synthesis(语音识别与合成)
- Logic-based paradigm(基于逻辑的范式)
- 更多的语法系统:例如,Lexical functional Grammar(词汇功能语法)
- Natural language understanding(自然语言理解)
- Terry Winograd 教授 在 MIT 人工智能实验室创建的 SHRDLU(积木世界)系统
- 嵌入玩具积木世界的机器人
- 程序采用自然语言命令,例如:
move the red block to the left of the blue block(将红色块移动到蓝色块的左侧) - 激发了对 semantics(语义)和 discourse(话语)领域的研究
1.4 1980-1990 年代
- Finite-state machines(有限状态机)
- Phonology(语音学)、morphology(词法)和 syntax(句法)
- Return of empiricism(经验主义的回归)
- IBM 为语音识别开发的概率模型
- 在 part-of-speech tagging(词性标注)、parsing(解析)和 semantics(语义)方面启发了其他的数据驱动方法
- 基于 held-out data(保留数据)、quantitative metrics(定量指标),以及和最新技术进行比较的经验主义评估
1.5 1990-2000 年代:机器学习的崛起
- 更好的计算能力
- 逐渐减少 Chomskyan theories of linguistics(乔姆斯基语言学理论)的主导地位
- 开发了更多的语料库
- Penn Treebank, PropBank, RSTBank 等
- 涵盖各种形式的 syntactic(句法)、semantic(语义)和 discourse annotations(话语注释)的语料库
- 来自机器学习社区的更好的模型:支持向量机、Logistic 回归
1.6 2000 年代:深度学习
- 深度神经网络(即具有许多层的网络)的出现
- 从计算机视觉社区开始进行图像分类
- 优势:使用原始数据作为输入(例如仅是文字和文档),而无需开发手动特征工程
- 计算上昂贵:依靠 GPU 在大型模型和训练数据上进行扩展
- 促进了我们现在正在经历的 AI 浪潮
- 家庭助理和聊天机器人
二、语言模型可以用于哪些任务
2.1 Natural Language Tasks:Syntactic Tasks(句法任务)
- Word Segmentation(单词分割)
- Morphological Analysis(形态分析)
- Part of Speech (POS) Tagging(词性 (POS) 标记)
- Phrase Chunking(短语分块)
- Syntactic Parsing(句法分析)
2.2 Natural Language Tasks:Semantic Tasks(语义任务)
- Word Sense Disambiguation (WSD)(词义消歧)
- Semantic Role Labeling (SRL)(语义角色标签)
- Semantic Parsing(语义解析)
- Textual Entailment/Natural Language Inference(文本蕴涵/自然语言推理)
2.3 Natural Language Tasks:Pragmatics/Discourse Tasks(语用学/话语任务)
- Anaphora / Co-reference Resolution(回指/共同参考分辨率)
- Ellipsis Resolution(省略号分辨率)
- 光学字符识别(Optical character recognition)
2.4 Natural Language Tasks:Other Tasks
- Information Extraction (IE)(信息提取)
- Question Answering(问答)
- Reading Comprehension(阅读理解)
- Text Summarization(文本摘要)
- Text Classification(文本分类)
- Machine Translation (MT)(机器翻译)
- 对话系统(Dialogue systems)
三、N-gram 语言模型(重点)
3.1 链式法则(chain rule)
- The chain rule - example
3.2 马尔可夫假设(The Markov Assumption)
目前,这仍然是一个比较棘手的问题,因为随着上下文的不断增加,我们构建的模型中将包含越来越多的参数。所以这里,我们采用一种称为 “马尔可夫假设” 的简化假设:某个单词出现的概率不再依赖于全部上下文,而是取决于离它最近的 n 个单词。因此,我们得到:
对于某个很小的 n:
-
当 n=1 时,一个 unigram 模型:
在 unigram 模型中,我们假设一个句子出现的概率等于其中每个单词单独出现的概率的乘积,这意味着每个单词出现的概率之间相互独立,即我们并不关心每个单词的上下文。
如何计算概率:
其中,C 是一个计数函数,C(wi) 表示单词 wi 在语料库中出现的次数,M 表示语料库中所有单词 tokens 的数量。
-
当 n=2 时,一个 bigram 模型:
在 bigram 模型中,我们假设句子中每个单词出现的概率都和它前一个单词出现的概率有关。
如何计算概率:
其中,C(wi−1,wi) 表示单词 wi−1 和单词 wi 前后相邻一起出现的次数。
-
当 n=3 时,一个 trigram 模型:
在 trigram 模型中,我们假设句子中每个单词出现的概率都和它前两个单词出现的概率有关。
如何计算概率:
对于一个语句而言我们采用用三种gram进行计算:
3.3 N-gram的例子
- 列出unigrams, bigrams and trigrams
- 计算概率(以bigrams 为例)
语料库:
计算公式:
3.4 N-gram 语言模型的一些问题
-
语言通常具有长距离效应 —— 需要设置较大的 n 值
有些词对应的上下文可能出现在句子中距离该词很远的地方,这意味着如果我们采用固定长度的上下文(例如:trigram 模型) ,我们可能无法捕捉到足够的上下文相关信息。例如:在上面的句子中,假如我们要决定系动词 be 是应该用第三人称单数形式 was 还是复数形式 were,我们需要回头看句子开头的主语是 lecture 还是 lectures。可以看到,它们之间的距离比较远,如果我们采用 bigram 或者 trigram 模型,我们无法得到相关的上下文信息来告诉我们当前位置应该用 was 还是 were。这是所有有限上下文语言模型(finite context language models)的一个通病。
-
计算出的结果的概率通常会非常小
你会发现,一连串条件概率项连乘得到的结果往往会非常小,对于这个问题,我们可以采用取对数计算 log 概率来避免数值下溢(numerical underflow)。 -
对于不存在于语料库中的词,无法计算其出现概率
如果我们要计算概率的句子中包含了一些没有在语料库中出现过的单词(例如:人名),我们应该怎么办?
一种比较简单的技巧是,我们可以用某种特殊符号(例如:<UNK>)来表示这些所谓的 OOV 单词(out-of-vocabulary,即不在词汇表中的单词),并且将语料库中一些非常低频的单词都替换为这种表示未知单词的特殊 token。 -
出现在新的上下文(context)中的单词
默认情况下,任何我们之前没有在语料库中见过的 n-gram 的计数都为 0,这将导致计算出的 整个句子的概率为 0。这个问题和前面的 OOV 单词的问题类似,我们的语料库中可能已经包含了这些单词,但是并没有包含该单词在新句子中对应的特定的 n-gram(即上下文信息)。这意味着该单词在新的句子中对应 n-gram 对于语言模型来说是全新的,而且因为 n-gram 的组合存在如此多的可能性,以至于语料库很难将所有的可能性都覆盖到。
例如:假设我们构建了一个 five-gram 语言模型,我们的语料库中一共有 20000 个词汇,那么一共存在多少种可能的 five -gram 组合?
答案是:200005。这是一个非常非常大的数字,以至于无论我们的训练语料库有多大,都不可能捕捉到所有的可能性组合。
这是一个相当常见的问题,并且很重要。如果我们回顾一下链式法则,可以看到所有的条件概率都连乘在一起,所以只要其中某一项在计算子序列时 n-gram 的计数为 0,那么最终 计算出的整个句子的概率就会为 0。
为此,我们需要对语言模型进行 平滑处理(smoothing)。
四、Smoothed n-grams(平滑处理)- 给之前没有见过的事件赋予概率(重点)
4.1 平滑处理的种类
- 拉普拉斯平滑(Laplacian smoothing,又称 Add-one smoothing,即 “加一” 平滑)- 课件里提及的平滑处理的方法
- “加 k” 平滑(Add-k smoothing)
- Jelinek-Mercer 插值(又称 线性插值平滑)
- 卡茨回退法(Katz backoff)
- 绝对折扣(Absolute discounting)
- Kneser-Ney
4.2 计算公式(以bigrams 为例)- 拉普拉斯平滑(“加一” 平滑)
- 原来的计算公式(MLE):
添加平滑处理后的公式:
这里的V表示单词的总个数。
- 下面看一个平滑操作的例子:
4.3 计算公式(以unigram 为例)- 拉普拉斯平滑(“加一” 平滑)
五、评估语言模型
5.1 评估
语言模型的评估通常有两种范式:
- 外部的(Extrinsic)
这种评估范式常见于下游应用中,我们根据其反馈来评估语言模型的表现。比如对于机器翻译中的某些任务,我们可以比较不同语言模型在完成该任务上的表现。- 例如:拼写纠错、机器翻译
- 内部的(Intrinsic)
在这种评估范式下,我们不依赖任何下游应用,而是观察我们的语言模型在保留测试集上的 Perplexity。- 在保留测试集(held-out test set)上的 Perplexity
- Perplexity(困惑) 衡量的是我们对于模型在测试数据上给出的预测的置信度。置信度越高,对应的 Perplexity 就越低,代表我们的模型越好。
5.2 Perplexity
- 整个测试集的逆概率(Inverse probability)
- 通过单词 tokens(包括结束标记 </s>)的数量实现归一化(Normalization)
-
假设我们保留的测试集语料库是一个由 m 个单词 w1,w2,…,wm 组成的序列,我们用 PP 表示 Perplexity。从下面的公式可以看到,它是通过对整个测试集的概率 P(w1,w2,…,wm) 取倒数,然后再开 m 次方得到的:
等同于 :
如果我们遇到未知单词(OOV),我们通常是直接忽略掉,因为我们没有办法表示它们。
- Perplexity 越低,模型表现越好。
假如我们模型的 Perplexity 只有 1,那么这是最好的情况。因为当我们的测试集语料库上的概率 P(w1,w2,…,wm)=1 时,PP(w1,w2,…,wm)==1。而对于一个非常差的语言模型,可能在测试集上的概率 P(w1,w2,…,wm)=0,此时模型的 Perplexity 将趋近 ∞。所以,最理想的情况是 Perplexity 等于 1,当然,我们永远不可能达到这个值。
5.3 Perplexity 得分的例子
让我们来看一个关于 Perplexity 得分的例子:
Unigram | Bigram | Trigram | |
---|---|---|---|
Perplexity | 962 | 170 | 109 |
- 语料库:Wall Street Journal(华尔街日报)
- 训练区:3800 万个单词 tokens,接近 2 万个单词 types(即词汇表)
- 测试区:150 万个单词 tokens
我们训练了三个模型:unigram、bigram 和 trigram 模型。语料库来自 Wall Street Journal。其中,相比训练集中的 3800 万个单词 tokens,测试数据包含的单词 tokens 比较少,只有 150 万个,这属于正常情况。
可以看到,对于 unigram 模型,Perplexity 得分非常高,到达了 962,这不是我们希望看到的情况。在模型阶数从 unigram 增加到 bigram,再增加到 trigram 的过程中,模型的 Perplexity 得分也在逐渐降低。当模型的复杂度增加时,即 n-gram 模型中的 n 增大时,我们将得到一个更好的语言模型。
六、总结
-
N-gram 模型在捕捉语言的可预测性方面是一种简单且高效的方法。
模型的构建很容易:我们只需要一个大的语料库,并且对单词和上下文进行计数即可。 -
信息可以通过无监督的方式推导得出,可以扩展到大型语料库。
-
由于稀疏性的存在,需要进行平滑处理才能保证有效性。
我们需要一些工程上的技巧处理稀疏性问题,例如:smoothing、back-off、interpolation 等。
虽然 n-gram 模型非常简单,但是它在实践中的效果非常好。所以,在构建语言模型时,我们通常会选择将 n-gram 模型作为 baseline,尽管目前有很多模型都采用了深度学习。