1. 语言模型

完整机器学习实现代码GitHub
欢迎转载,转载请注明出处https://www.cnblogs.com/huangyc/p/9861453.html
欢迎沟通交流: 339408769@qq.com


 


1. 语言模型

2. Attention Is All You Need(Transformer)算法原理解析

3. ELMo算法原理解析

4. OpenAI GPT算法原理解析

5. BERT算法原理解析

6. 从Encoder-Decoder(Seq2Seq)理解Attention的本质

7. Transformer-XL原理介绍

1. 前言

在机器学习领域,语言识别和图像识别都不太需要预处理就能喂给计算机,语音识别的输入数据可以是音频频谱序列向量所构成的矩阵,图像识别的输入数据是像素点向量构成的矩阵。但是文本是一种抽象的东西,显然不能直接把文本数据喂给机器当做输入,因此这里就需要对文本数据进行处理。

2. 语言模型

语言模型是对一段文本的概率进行估计即针对文本X,计算P(X)的概率,对信息检索,机器翻译,语音识别等任务有着重要的作用。语言模型分为统计语言模型神经网络语言模型

3. 统计语言模型

要判断一段文字是不是一句自然语言,可以通过确定这段文字的概率分布来表示其存在的可能性。语言模型中的词是有顺序的,给定m个词看这句话是不是一句合理的自然语言,关键是看这些词的排列顺序是不是正确的。所以统计语言模型的基本思想是计算条件概率。

输入:X=(x1,x2,...,xm)

输出:P(X)的概率

P(X)=P(x1,x2,x3...,xm)=P(x2|x1)P(x3|x1,x2)...P(xm|x1,x2,...xm1)

以上公式就是语言模型的基本定义。这个公式有2个问题。

假设有句子(x1,x2,x3,x4,x5,x6)

P(x6|x1,x2,x3,x4,x5)=count(x1,x2,x3,x4,x5,x6)count(x1,x2,x3,x4,x5)

  • 自由参数数目

假定字符串中字符全部来自与大小为V的词典,上述例子中我们需要计算所有的条件概率,对于所有的条件概率,这里的x都有V种取值,那么实际上这个模型的自由参数数目量级是V6,6为字符串的长度。
从上面可以看出,模型的自由参数是随着字符串长度的增加而指数级暴增的,这使我们几乎不可能正确的估计出这些参数。

  • 数据稀疏性

从上面可以看到,每一个x都具有V种取值,这样构造出了非常多的词对,但实际中训练语料是不会出现这么多种组合的,那么依据最大似然估计,最终得到的概率实际是很可能是0。

3.1 N-gram模型

大家已经知道了语言模型的定义,那首先会遇到一个问题,上面这个公式遇到长句子时计算最后一个词的概率P(xm|x1,x2,...xm1)会变得非常的麻烦,那我们是不是可以进行一定的简化呢?设想一下这句话“今天天气真是不错,现在感觉有点饿,我们去吃饭吧!”当我们预测P("吃饭")的概率时,感觉和最前面描述天气的关系不是很大,而是和比较近的“有点饿”联系比较紧密。所以我们根据一个词会和它附近的词联系比较紧密,那我们就可以简化语言模型的概率公式了。

假设我们定义一个词的概率和它前面的k个词相关,公式改写如下:

P(xi|x1,x2,...xi1)=P(xi|xi(k1),...,xi1)

P(X)=i=1mP(xi|xi(k1),...,xi1)

从模型的效果来看,理论上n的取值越大,效果越好。但随着n取值的增加,效果提升的幅度是在下降的。同时还涉及到一个可靠性和可区别性的问题,参数越多,可区别性越好,但同时单个参数的实例变少从而降低了可靠性。

N-gram比较好解决了自由参数多的问题,但是数据稀疏的问题还是没有呗解决。

3.2 平滑化

假设有一个词组在训练语料中没有出现过,那么它的频次就为0,但实际上能不能认为它出现的概率为0呢?显然不可以,我们无法保证训练语料的完备性。那么,解决的方法是什么?如果我们默认每一个词组都出现1次呢,无论词组出现的频次是多少,都往上加1,这就能够解决概率为0的问题了。

P(x6|x1,x2,x3,x4,x5)=count(x1,x2,x3,x4,x5,x6)+1count(x1,x2,x3,x4,x5)+1

4. 神经网络语言模型

神经网络语言模型的提出解决了N-gram模型当n较大时会发生数据稀疏的问题。与N-gram语言模型相同,神经网络语言模型(NNLM)也是对n元语言模型进行建模,估计P(xi|xin+1,xin+2,...xi1)的概率,与统计语言模型不同的是,神经网络语言模型不通过计数的方法对n元条件概率进行估计,而是直接通过一个神经网络对其建模求解。

image

神经网络语言模型的结构入上图所示,可以分为输入层、投影层、隐藏层和输出层

  1. 输入层:这里就是词x的上下文,如果用N-gram的方法就是词x的前n1个词了。每一个词都作为一个长度为V的one-hot向量传入神经网络中.
  2. 投影层:投影层也叫embedding层,在投影层中,存在一个look-up表CC被表示成一个Vm的自由参数矩阵,其中V是词典的大小,而m代表每个词投影后的维度。表C中每一行都作为一个词向量存在,这个词向量可以理解为每一个词的另一种分布式表示。每一个one-hot向量都经过表C的转化变成一个词向量。n1个词向量首尾相接的拼起来,转化为(n1)m的列向量输入到下一层。
  3. 隐藏层:隐藏层的作用是进行非线性变换。z=tanh(WX+b)
  4. 输出层:用softmax进行概率计算,计算词表V的每个词的概率。P(xi)=softmax(z)

5. 总结

即使使用了神经网络语言模型,本质上仍然是N元语言模型,就是你要预测的当前词只和他前面的N-1个词有关,与更前面的词无关。尽管神经网络这种方法一定程度上解决了数据稀疏的问题,但还是损失了一些信息。如果想要学习前面所有的的词就要涉及s到自然语言处理中的循环神经网络(RNN),我们都知道,循环神经网络的定义是当前的输出不仅和当前的输入有关,还和上一时刻的隐藏层的输出有关,这样讲神经网络展开后就会发现他把序列从开头到结尾全连起来了,十分方便处理序列数据,而这个性质正是我们做语言模型所需要的。

posted @   hyc339408769  阅读(9946)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示