| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 从零实现深度学习框架——N-Gram语言模型(二) -> 正文阅读 |
|
[人工智能]从零实现深度学习框架——N-Gram语言模型(二) |
引言
本文接上一篇,主要介绍解决零概率问题的平滑方法。 N的选择N-gram模型依赖于训练语料。随着 N N N的增加,N-gram的表现越来越好。但是 N N N太大会导致计算量非常大,以及零概率项过多的问题。一般取 N = 3 N=3 N=3或 N = 4 N=4 N=4。 零概率上面说的零概率一种可能是有些组合同时出现的频数为0。比如有些零概率项由于在训练集中从未出现过,而只在测试集中出现。那么在测试的时候,就会给它赋予零概率。它们的存在意味着我们低估了可能出现的各种单词的概率。 未登陆词上面我们说的零概率是由于只在测试集中出现的组合。那如果碰到从未见过的单词怎么办? 这里简单介绍两种词汇系统,一种是开放词汇系统,另一种是封闭词汇系统。在封闭词汇系统中,所有的单词都是预先知道的,测试集只包含这些单词,不会有未知的单词。而开放词汇系统,则可能会包含从未见过的单词,一般添加一个伪单词 这种没见过的单词,称为未登陆词(out of vocabulary,OOV)。 有两种方法解决这个问题,一是转换为封闭词汇,通过提前设定一个固定大小的词典:
第二种方法是在我们没有预先词典的情况下,隐式地创建这样一个单词,根据频率用 平滑平滑技术为了解决我们上面说的零概率项问题。不管你的训练语料库有多大,总会有一些从未见过的词。比如只在测试集中从未见过的上下文出现。为了防止语言模型为这些未见过的项分配零概率,我们需要对之前的概率分配进行一定调整,提高零概率,降低高概率。不患寡而患不均,类似劫富济贫的思想。 这种调整被称为平滑。平滑技术主要有三种:
下面一一介绍。 拉普拉斯平滑拉普拉斯平滑(Laplace smoothing)又称为加1平滑(Add-1 smoothing),该方法在归一化概率前,将所有的N-gram计算加 1 1 1。从而避免出现零概率问题。 我们知道归于单词
w
i
w_i
wi?的未平滑Unigram概率的最大似然估计算为,它出现的计数
c
i
c_i
ci?,除以单词总数
N
N
N:
拉普拉斯平滑为每个分子都加
1
1
1。因为词典中共有
V
V
V个单词,每个增加
1
1
1,因此我们也需要调整分母: 查看平滑的一种方法是降低(折扣)一些非零计数,然后分配给零计数。我们可以用相对折扣
d
c
d_c
dc?来描述一种平滑算法,即折扣计数与原始计数的比率: 有一个餐厅对话训练语料,假设下面这些单词的unigram计数为: 然后给出训练语料中一小部分bigram计数,其中大部分bigram计数都为0,从左到右看,比如 在未加入平滑之前,我们可以结合unigram和bigram计数计算出归一化的bigram概率为: 比如(根据公式
(
9
)
(9)
(9))计算
p
(
w
a
n
t
∣
i
)
p(want|i)
p(want∣i): 然后基于词汇表中
V
=
1446
V=1446
V=1446计算拉普拉斯概率: 为了方便地查看平滑算法对原始计数修改了多少,通常可以重构计数表。可以通过下面的公式计算修正后次数: 可以看到拉普拉斯平滑对原始计数进行了较大修改。比如 C ( w a n t ? t o ) C(want \, to) C(wantto)从 609 609 609减少为 238 238 238。也可以从概率空间中看到这一点: p ( t o ∣ w a n t ) p(to|want) p(to∣want)从 0.66 0.66 0.66下降到了 0.26 0.26 0.26。 由于该概率值带来的修改过大,我们可以考虑更加温柔的版本——加K平滑。 加K平滑加K平滑(Add-k smoothing)将加1平滑中增加的计数值由
1
1
1改成一个小于
1
1
1的数
k
k
k(0.5/0.05/0.01)。 我们现在了解的都是折扣法,下面我们来看下回退和插值法。 回退和插值假设我们想计算 P ( w n ∣ w n ? 2 w n ? 1 ) P(w_n|w_{n-2}w_{n-1}) P(wn?∣wn?2?wn?1?),但是没有 w n ? 2 w n ? 1 w n w_{n-2}w_{n-1}w_n wn?2?wn?1?wn?这种trigram样本,那么我们降低要求,使用bigram概率 P ( w n ∣ w n ? 1 ) P(w_n|w_{n-1}) P(wn?∣wn?1?)来估计 P ( w n ∣ w n ? 2 w n ? 1 ) P(w_n|w_{n-2}w_{n-1}) P(wn?∣wn?2?wn?1?),这种方法就叫回退。类似地,如果我们也有 w n ? 1 w n w_{n-1}w_n wn?1?wn?,那么可以直接用unigram概率 P ( w n ) P(w_n) P(wn?)。 在回退中,如果数据充足,我们使用trigram,否则我们使用bigram,甚至使用unigram。即我们没有高阶n-gram的数据时,我们才会回退到低阶n-gram。而插值中,总是混合所有阶的n-gram估计的概率,并进行加权。 在简单的线性插值中,我们通过线性插值来组合不同阶的n-gram。因此,我们通过将unigram、bigram和trigram概率混合在一起来估计trigram概率
P
(
w
n
∣
w
n
?
2
w
n
?
1
)
P(w_n|w_{n-2}w_{n-1})
P(wn?∣wn?2?wn?1?),每个概率都以一个
λ
\lambda
λ权重加权: 在稍微复杂的线性插值版本中,每个
λ
\lambda
λ权重都是以上下文为条件计算的: 我们通过选择 λ λ λ值来最大化保留语料库的似然来做到这一点。也就是说,我们固定n-gram概率,然后搜索插值等式 ( 23 ) (23) (23)时的 λ λ λ值——使得保留集出现最高概率。有多种方法可以找到这套最佳 λ λ λ,比如使用EM算法。 为了让回退模型给出正确的概率分布,我们必须折扣高阶n-gram,为低阶n-gram保留一些概率密度,正如拉普拉斯平滑一。如果高阶n-gram没有折扣,而我们只是使用未折扣的MLE概率,那么一旦我们将有零概率的n-gram替换为低阶n-gram,那么语言模型分配给所有可能字符串的总概率将大于1!除了这个显式折扣系数外,我们还需要一个函数 α α α来将这个概率密度分配到低阶n-gram。 这种折扣的回退也被称为Katz回退。在Katz回退中,如果我们以前见过这个n-gram(即如果我们有非零计数),那么我们依赖折扣概率
P
?
P^*
P?。否则,我们为更短的历史(N-1)-gram递归回退到Katz概率。回退n-gram的概率
P
B
O
P_{BO}
PBO?计算如下: 我们重点来看一下Kneser-Ney平滑。 Kneser-Ney平滑Kneser-Ney平滑方法是一种扩展的绝对折扣方法,采用了一种更精细的方法处理低阶unigram分布。 绝对折扣的意思是让每个计数减去固定(绝对)值 d d d。 为了看到这一点,我们可以使用Church和Gale提出的一个聪明的想法。考虑一个计数为4的n-gram。我们需要给每个计算减去某个数值,那么减去多少呢? Church和Gale想法是看一个保留(held out)的语料库,看看在训练集中计数为 4 4 4的bi-gram计数在保留语料库中是什么。他们从AP newswire的2200万个单词中计算出一个bi-gram语法,然后在另外2200万个单词的保留语料库中检查了这些bi-gram的计数。平均而言,在前2200万个单词中出现4次,在接下来的2200万个单词中出现3.23次。如下图显示了 c c c从0到9的bi-gram的计数。 从上面的统计可以看到,除了 c = 0 c=0 c=0或 c = 1 c=1 c=1,其他所有的在保留集中的bigram计数几乎都比训练集中少 0.75 0.75 0.75。 而绝对折扣将这种直接公式化,通过让每个计数减去固定(绝对)值
d
d
d。对于非常大的计数,减去这么一个小的折扣值不会影响什么。对于低频词更看重unigram的插值。如果将绝对折扣应用到bigram上得到的公式如下: 上面说的是绝对折扣,那么Kneser-Ney平滑在此基础上做了什么呢? 考虑下面这样一个预测下一个单词的例子,假设我们插值一个bigram和unigram模型。
假设现在有替补词汇 因此Kneser-Ney的思想是:低阶模型的概率不应该与其频数成正比,而应该与其能组成的不同词组的种类数成正比。因为假设某个单词能形成的不同词组越丰富,那么该单词越容易与其他单词组成新的词组,因此概率应该越高。 这里定义一个unigram模型称为
P
C
O
N
T
I
N
U
A
T
I
O
N
P_{CONTINUATION}
PCONTINUATION?,表示单词
w
w
w作为新的延续词的可能性。那么我们如何估计单词
w
w
w在未知上下文中作为新延续词的概率呢?Kneser-Ney的做法是基于单词
w
w
w过去在不同上下文中出现的次数,即由它完成的bigram类型数量。如果某个单词过去在更多的不同上下文中出现,那么我们认为它也更可能在新的上下文中出现。单词
w
w
w在新的延续中出现的次数可以表示为: 为了让其变成概率,我们归一化所有的bigram类型数量: 最终Kneser-Ney平滑对bigram的公式为: 总结N-gram模型就介绍这么多,后面依次介绍word2vec、神经网络语言模型、RNN语言模型和BERT语言模型。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/6 17:31:43- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |