| |
|
开发:
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 |
明年开学就要进入一个新的学习阶段了,从9月底以来就比较自由,现在开始想着要多学一点,用笔记的方式记录一下个人理解,也督促一下自己。第一次发博文,如有冒犯或错误,请指正! 这篇学习笔记是参考了知乎上的前辈“爱罗月”的文章,链接是NLP入门系列之语言模型 - 知乎。前辈已经讲得很清楚,我就简单顺一下逻辑,也期望自己能向“爱罗月”前辈学习! 除此之外,“一只松鼠”前辈的NLP基础之语言模型1 - 知乎也是非常非常好的参考! 我们时常需要解决这样一个问题:如何挑选一个概率尽可能大的句子?那么,句子的概率该如何计算呢?这就要讲起语言模型了。 什么是语言模型LM?1.为单词序列分配概率的模型就叫做语言模型。即对于单词序列(w1,w2,w3,…,wn),计算P(w1,w2,w3,…,wn)的模型就是语言模型。2.通俗来说,语言模型就是“对于任意的单词序列,模型能够计算出这个单词序列是一句有意义的语句的概率,或者说语言模型能预测单词序列的下一个单词是什么。 那么这个概率P(w1,w2,w3,…,wn)如何计算呢?首先用频率估计概率的思想,假设存在一个足够大的语料库(e.g.网络上的所有中文或英文网页)。可以统计出单词序列(w1,w2,w3,…,wn)出现的次数n,而所有的单词序列的个数记为N,则P(w1,w2,w3,…,wn)=n/N 。 该模型存在问题:在这种模型中,单词序列被视作不可分割的,也就是说每个单词序列都是独立无关的,即使某两个单词序列之间仅有一个单词不同。一旦某个单词序列没有在test set中出现过(即使与某个出现过的单词序列仅一个单词的区别),模型的输出概率就是0,这是不合理的,因为语言是具有任意性的。考虑一个可能:在一个语料库中"My name is cb"出现了很多次,"My name is zc"在该语料库中从未出现,那么后者是一句有意义的语句的概率由模型看来就是0,但其实不然。用这种方式计算一个特定单词序列的概率,需要预料库足够大才有实际意义。 所以这种方法并不够好,从另一个角度看P(w1,w2,w3,…,wn):根据条件概率的链式法则,即P(x1,x2,x3,…,xn)=P(x1)P(x2|x1)P(x3|x2,x1)…,可见语言模型其实是在计算P(wt|wt-1,…,w3,w2,w1),即预测下一个单词wt。这样以后,单词序列就变成了单词之间的有序串联,P(w1,w2,w3,…,wn)的计算也就变成了计算P(w1)与P(w2|w1)与P(w3|w2,w1)与…与P(wn|wn-1,…,w3,w2,w1)的乘积。那么,P(wt|wt-1,…,w3,w2,w1)又该如何计算呢?,可以统计出count(w1,w2,w3,…,wt)和count(w1,w2,w3,…,wt-1),根据条件概率的链式法则和简单的分子分母约分,可知P(wt|wt-1,…w3,w2,w1)约等于count(w1,w2,w3,…,wt)/count(w1,w2,w3,…,wt-1)。但是这又回到了刚才的问题,语言是具有任意性的,任何特定的单词序列也许在语料中从未出现过,也就是说 (w1,w2,w3,…,wt) 可能从没在语料库中出现过。 此时,就想到:如果单词序列(w1,w2,w3,…,wn)不一定会在语料库中出现过,那么它的子单词序列(w2,w3,w4,…,wn)呢?(w3,w4,...,wn)呢?实在不行,(wn-2,wn-1,wn)呢?是不是单词序列越短,出现在语料库中的概率就会越大呢? 现在来看n-gram模型: Definition: A n-gram is a chunk of n consecutive words. 1. uni-gram: “the”, “students”, “opened”, “their” 2. bi-gram: “the students”, “students opened”, “open their ” 3. tri-gram: “the students opened”, “students opened their” 4. 4-gram: “the students opened their” n-gram模型进行了一个假设(近因效应),单词wt+1出现的概率只取决于它前面的n-1个词,即有 可以看出,n-gram模型可以缓解单词序列没有在test set中出现过而引起的问题,即数据稀疏问题,因为减小了所需的特定单词序列的长度。?原先计算P(wt+1|wt,wt-1,...,w1)时,需要单词序列(wt+1,wt,wt-1,...,w1)在语料库中出现过;现在,在n-gram模型中只需要单词序列(wt+1,wt-1,wt,...,wt-n+2)在语料库中出现过。是不是这时候的特定单词序列在语料库中出现过的概率就大了很多了? 那么,如何计算前面公式中的P(wt+1, wt, wt-1, …, wt-n+2)和P(wt, wt-1, …, wt-n+2)呢? 和之前一样,统计count(wt+1, wt, wt-1,…, wt-n+2)和count(wt, wt-1,…, wt-n+2)。为什么刚才不行,现在就可以了呢?因为特点单词序列的长度短了很多,在语料库中出现的概率大大增大了 ( n越小,特定单词序列在语料库中出现的概率越大,但同时存在一个问题 )。结果约等于count(wt+1, wt, wt-1,…, wt-n+2)/count(wt, wt-1,…, wt-n+2),为什么是约等于呢?因为是统计近似。 现在来谈谈刚才说到的关于n的问题:n越小,这个单词序列在语料库中出现的概率就越大,然而相应的,语义损失也越大,因为考虑的这个单词wt的上文(上下文中的上文)太短了。n越大,包含的语义自然越多,但是相应的,数据稀疏问题会越严重。通常,n不能大于5,常取3。除此之外,n-gram还会造成curse of dimensionality等问题,于是有了之后的NNLM。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 4:18:34- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |