本文主要学习神经网络语言模型,并在文末给出简单的代码demo,便于学习,整体上主要是从表示学习的发展方面展开;

一 .表示学习

数据表示

面对复杂的概念,可以找到一个表达,化繁从简。机器学习中,找到对于原始数据更好的表达,方便后续任务(分类、序列标注、匹配等)

 特征学习(feature learning),又叫表示学习(representation learning)或者表征学习,一般指的是自动学习有用的数据特征,采用模型自动学习数据的隐式特征,不依赖专家经验,需要较大的数据训练集

特征工程(feature engineering),主要指对于数据的人为处理提取,依靠专家提取显示特征,特征选取的好坏直接决定数据表示质量,影响后续任务

one-hot编码

前期的统计学习方法中,较为常见的表示是使用离散的符号表示词信息,如独热表示(one-hot)

(1).简单直接,易于计算

(2).矩阵每一个维度的长度等于字典的长度,只有一个1,其他为0,非常稀疏,容易造成维度灾难

(3).只能表示词语本身 ,无法体现单词语义信息,以及单词之间的关系

词嵌入  (word-embedding)

word-embedding 是词的分布式嵌入表示,使用多维度信息联合表示一个词语

(1).多维度联合表示一个词语,每一个维度反应潜在语义信息

(2).语义相似的词在向量空间上也能表现出来

(3).缓解数据稀疏影响,获得更好的泛化能力

二 .语言模型

主要是用来计算一个句子出现的概率

通俗点说,就是计算一句话 看起来是否像人说的话,比如,“我喜欢读书”、“我读书喜欢”。那么后者看起来就不像是一句话,前者计算的概率值较大。上面的计算公式,依据的是条件概率的计算公式。

每一项的P(w)的计算使用的是单词的频率计算,后面会讲到

针对以上问题,引入马尔可夫假设,给定当前知识情况下,过去(即以前的历史状态)对于预测将来(即当前以后的未来状态)是无关的

1.一元语言模型(n = 1),也叫做unigram

当前的word不依赖任何word,每个word 都是独立

2.二元语言模型(n = 2),也叫做bigram

当前的word依赖前一个word

3.三元语言模型(n = 3),也叫做trigram

当前的word依赖前两个word

总结下:

总体来说,bigram 和trigram 语言模型使用较多,unigram 使用很少,基本不怎么使用,主要是一元语言模型相对二元和三元语言模型,很难度量不相似句子

例子:

sentence1 = 我想吃苹果,sentence2 = 我想喝苹果

一元语言模型,计算的 sentence1 结果为 P1= P(我) *  P(想) * P(吃) * P(苹) * P(果)

计算的 sentence2 结果为 P2= P(我) *  P(想) * P(喝) * P(苹) * P(果)

由于都是使用频次统计P的概率,所以最终 P1 和 P2 相等,其实大家知道,sentence1和sentence2的区别还挺大的

二元语言模型例子

利用极大似然估计,得到条件概率计算公式如下:

二元语言模型和三元语言模型能比一元语言模型更好的get到两个词语之间的关系信息

三.神经网络语言模型(NNLM)

利用前n-1个词汇,预测第n个词汇

上图中的最右边的矩阵是通过参数学习获取的

具体的过程是以下几步:

(1). 输入n-1个词语,每一个词语进行one-hot 编码 1xV

(2).每一个词语(1xV) 与矩阵Q相乘得到 1xm 表示

(3).得到所有的词向量 (n-1) x m的矩阵,concat后得到 (n-1)*m x 1的向量x

(4).具体公式如下

四 代码示例

import torch
import torch.nn as nn
import torch.optim as optim
import pdbdef make_batch():input_batch = []target_batch = []for sen in sentences:word = sen.split() # space tokenizerinput = [word_dict[n] for n in word[:-1]] # create (1~n-1) as inputtarget = word_dict[word[-1]] # create (n) as target, We usually call this 'casual language model'input_batch.append(input)target_batch.append(target)return input_batch, target_batch# Model
class NNLM(nn.Module):def __init__(self):super(NNLM, self).__init__()self.C = nn.Embedding(n_class, m)  ### 矩阵Q  (V x m)  V 表示word的字典大小, m 表示词向量的维度self.H = nn.Linear(n_step * m, n_hidden, bias=False)  ### self.d = nn.Parameter(torch.ones(n_hidden))self.U = nn.Linear(n_hidden, n_class, bias=False)self.W = nn.Linear(n_step * m, n_class, bias=False)self.b = nn.Parameter(torch.ones(n_class))def forward(self, X):X = self.C(X) # X : [batch_size, n_step, m]X = X.view(-1, n_step * m) # [batch_size, n_step * m]tanh = torch.tanh(self.d + self.H(X)) # [batch_size, n_hidden]output = self.b + self.W(X) + self.U(tanh) # [batch_size, n_class]return outputif __name__ == '__main__':n_step = 2 # number of steps, n-1 in paper,根据前两个单词预测第三个n_hidden = 2 # number of hidden size, h in paper,隐层个数m = 2 # embedding size, m in paper ,词向量的维度  m =2sentences = ["i like dog", "i love coffee", "i hate milk"] ###训练数据 word_list = " ".join(sentences).split() ###  按照空格分词,统计 sentences的分词的个数word_list = list(set(word_list))    ###  去重 统计词典个数word_dict = {w: i for i, w in enumerate(word_list)}  ### {word : index   ,词典}  number_dict = {i: w for i, w in enumerate(word_list)}  ###  {index : word ,词典}n_class = len(word_dict)  # number of Vocabulary   词典的个数,也是softmax 最终分类的个数# pdb.set_trace()model = NNLM()### 损失函数定义criterion = nn.CrossEntropyLoss()  ### 交叉熵损失函数  ### 采用 Adam 优化算法 学习率定义为   0.001optimizer = optim.Adam(model.parameters(), lr=0.001)input_batch, target_batch = make_batch()  ###构建输入数据和 target labelinput_batch = torch.LongTensor(input_batch)  ### 模型输入 tensor 形式target_batch = torch.LongTensor(target_batch)# Training 迭代 5000次for epoch in range(5000):optimizer.zero_grad()  ###梯度归零  output = model(input_batch)# output : [batch_size, n_class], target_batch : [batch_size]loss = criterion(output, target_batch)if (epoch + 1) % 1000 == 0:print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.6f}'.format(loss))loss.backward()  ### 反向传播计算 每个参数的梯度值optimizer.step() ### 每一个参数的梯度值更新# Predictpredict = model(input_batch).data.max(1, keepdim=True)[1]# Testprint([sen.split()[:2] for sen in sentences], '->', [number_dict[n.item()] for n in predict.squeeze()])

Reference:

https://zhuanlan.zhihu.com/p/28080127

Statistical language model 统计语言模型_a635661820的博客-CSDN博客

语言模型(NNLM)相关推荐

  1. 神经网路语言模型(NNLM)的理解

    用神经网络来训练语言模型的思想最早由百度 IDL (深度学习研究院)的徐伟提出[1],NNLM(Nerual Network Language Model)是这方面的一个经典模型,具体内容可参考 Be ...

  2. 自然网络语言模型(NNLM)

    在一语料库中, 假设有长度为 T 的文本序列 S:=w1,w2,⋯,wTS:=w_{1},w_{2}, \cdots, w_{T}S:=w1​,w2​,⋯,wT​. 如果选子序列 S:=wt−1,wt ...

  3. N-gram和NNLM语言模型

    背景: one-hot:缺点:1.高维稀疏,2.不能体现句子中词的重要性,3.不能体现词与词之间的关系. embedding:1.解决了高维稀疏 tf-idf:2.解决了one-hot中不能体现句子中 ...

  4. 语言模型(二)—— 神经网络语言模型(NNLM)

    n-gram回顾 在上一篇笔记语言模型(一)-- 统计语言模型n-gram语言模型中我们已经了解到了n-gram的不足,在理解神经网络语言模型之前,我们有必要简单地回顾一下n-gram模型的几个特点: ...

  5. 基于神经网络语言模型的词向量生成(NNLM)详解

    深度学习入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删. 目录 一.NNLM的网络结构分析 二.NNLM的代码实现 一.NNLM的网络结构分析 ...

  6. NNLM语言模型(原理、反向传播的推导以及python实现)

    NNLM语言模型(原理.反向传播的推导以及python实现) -1.写这篇博客的目的   因为研究生选择了自然语言处理方向(NLP),之前对此没有过接触,所以在大四阶段准备对NLP方向的一些算法做一些 ...

  7. NLP基础:n-gram语言模型和神经网络语言模型

    文章目录 语言模型的计算 n-gram 语言模型 n-gram 平滑技术 神经网络语言模型(NNLM) 基本思想 神经网络语言模型小结 语言模型评价指标-困惑度 语言模型是自然语言处理中的重要技术,假 ...

  8. 自然语言处理中的语言模型与预训练技术的总结

    目录 0. 背景 1. 统计语言模型(Statistical Language Model) 马尔科夫假设(Markov Assumption) N-Gram模型 拉普拉斯平滑(Laplace Smo ...

  9. 中文信息处理(六)—— 神经语言模型与词表示(word2vec)

    文章目录 1. 基于神经网络语言模型 1.1 几种语言模型对比 1.2 神经网络语言模型 NNLM 第一层(输入层) 第二层(隐藏层) 第三层(输出层) 1.3 小结 2. word2vec 2.2. ...

  10. NLP进化史系列之语言模型

    前言: 从20世纪70年代的统计语言模型,到2003年的神经网络语言模型,再到2018年刷新各种NLP任务记录的BERT,再到今年6月份的XLNet再次刷新各种记录,带你一起领略其中奥妙. 目录 1. ...

最新文章

  1. Windows10+Python3.6(Anaconda3)+OpenCV3.4安装配置
  2. 肠·道 | 刘洋彧:重建肠道菌群生态网络
  3. 当阿里不想赚钱了,生意该怎么做?
  4. Pandas库DataFrame的排序
  5. 设计模式六大原则(5)——迪米特原则
  6. 2012计算机一级考试试题,2012年计算机一级考试试题题库(备考)
  7. maven打包不用eclipse插件
  8. SpringCloud的GateWay网关中怎么debug得到真实的路由地址
  9. 数据结构 之 图的存储和遍历
  10. 在linux下磁盘挂在操作,linux下挂载磁盘操作
  11. 优秀案例|如何让网页首屏更具视觉吸引力?
  12. html5开发播放器,larkplayer: 插件化的 HTML5 播放器
  13. 手把手教你做短视频去水印微信小程序(4-解析结果页)
  14. SQL Server详细教程
  15. 黑苹果 efi如何替换_小白第一次安装黑苹果,然后卡代码,别着急,教你一个通用步骤,一个一个排查,大部分是可以解决的,毕竟安装不是最难的一个步骤...
  16. R语言 蒙特卡洛方法(Monte Carlo)
  17. 怎么把图片格式转换成PDF呢?
  18. 微信小程序并发服务器架构,「系统架构」如何设计一个健壮高效的微信小程序登录方案...
  19. 计数排序:时间复杂度仅为 O(n) 的排序算法
  20. html如何设定盒子的高,css 高度height设置

热门文章

  1. 美哭了,一款面向程序员的开源 Markdown 笔记工具!
  2. 一起学习“秋叶的如何成为PPT高手”
  3. 最全原理图元器件查询
  4. 学生id号码是什么意思_ID是什么意思?
  5. 服务器上Dll文件读取失败,解决开机出现dll文件加载失败的方法
  6. 路由器与计算机的ip地址,路由器ip地址与mac地址绑定
  7. C语言 - 直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序、快速排序、归并排序、基数排序。
  8. TOGAF9.2 第I部分 第1章简介
  9. 禁止cmd dos 窗口被关闭
  10. SAP ABAP 教程大全之 01 面向初学者的 SAP ABAP介绍(含hello world 源码)