如何计算给定一个unigram语言模型_CS224n笔记[5]:语言模型(LM)和循环神经网络(RNNs)...

b99f2527b9d853f1570218886bf84f81.png

CS224n笔记[5]:语言模型(LM)和循环神经网络(RNNs)

作者:郭必扬

许久没更新了,十分惭愧,翻了翻之前的笔记,才之前上一期我们讲的是“依存分析”。本期,我们介绍一下语言模型(Language Model)和循环神经网络(RNNs)的基本知识。

语言模型

语言模型(language models)是NLP的基础技术之一,这个名字听起来总是很玄乎,又因为其不想文本分类、实体识别这些技术这么常用,导致包括我在内的很多人一直对这个玩意儿一知半解。所以今天我们就来一起跟着CS224N网课把这个概念搞清楚。

理解玄乎的理论的最佳方法,就是记住它的一些经典的具体应用。语言模型最典型的应用就是“输入法联想”。 比如我在搜狗输入法里写一个“我”,输入法会给我推荐几个词:“女朋友”、“刚刚”、“的”等等。

18c031f88f8f8bc2fecb0be36ce41b1d.png

为啥会推荐这些词呢,可能是搜狗对我曾经输入过的成百上千句话训练过语言模型,知道了我输入“我”之后,很大概率会接着输入“女朋友”,也有很大概率输入“刚刚”,因此输入法就把这些词给排到了前面。 在一些社交平台上,我们也会经常玩一个游戏:“给定一个初始词,不断通过自己输入法的联想词来造句,看看会造出什么句子来”,往往我们发现可以构成一个完整的说得通的句子,甚至还能暴露出我们个人的一些习惯。

这些我们每天都在使用的功能,实际上都在默默地使用语言模型的技术。下面我们来给语言模型下一个定义。

语言模型其实可以从两个角度去理解,因此我们给出两种定义:

❝ 定义一:语言模型(LM)的任务就是预测一段文字接下来会出现什么词。

即一个语言模型应该有能力计算下面这个公式的值:

翻译过来就是,在已知一句话的前t个词的基础上,通过LM可以计算出下一个词是某个词的概率。

❝ 定义二:语言模型(LM)给一段文本赋予一个概率。

即对于一段文字

,LM可可以计算出这句话出现的概率:

其中

就是LM可以计算出来的。

所以回头看,这两种定义是一回事儿。

如何学习语言模型

首先再介绍一个概念:N-gram。 所谓的N-gram,就是指一堆连续的词,根据这一堆词的个数,我们可以分为unigram,bigram,trigram等等。

如果我们需要得到一个N-gram的LM,它的意思就是希望我们可以通过N-1个词预测第N个词的概率。

那么如何学习得到一个N-gram的LM呢?一个直接的思路就是,我们可以收集关于语料中的各个N-gram出现的频率信息。

对于一个N-gram的LM,我们需要做一个假设:

❝ Assumption:某个词出现的概率只由其前N-1个词决定。

比如我们想得到一个3-gram的LM,那么就是说想预测一段文本的下一个词是什么的话,只用看这个词前面2个词即可。

还是用输入法联想中的例子:

4a81ce95108dcf8ce44bdf7d752cb28c.png

要根据“罗永浩是什么”的下一个字是什么,如果我们设定的是3-gram,则我们只使用图中蓝色的“什么”二字来预测,而不看前面黑色的字。

N-gram的LM用公式表达即为:

公式的第一个等式,就是使用了我们前面的假设,第二个等式就是条件概率的计算方法。 (2)式的分子就是代表这个由N个词构成的N-gram出现的概率,分母则是一个(N-1)-gram出现的概率。

如何计算得到这些概率值呢?————数它就完事儿了! 我们就在语料中去count,用频率来估计这些概率。

「显然,由于这是一个分式,会有分母分子为0的可能,这些特殊情况是我们需要考虑的:」

比如分子,它为0的可能性其实很大,因为随机给定一个N-gram,它真的会在语料中出现的概率其实很小,多数可能都不存在,这个时候,我们就需要使用一个很小的数来补到分子上。

分母是一个(N-1)-gram,也很有可能不存在,导致分母为0,这个时候,我们就采用回退(back-off)的策略,转而统计(N-2)-gram的个数,N越小,其出现的概率实际上越大,所以不断回退,总可以找到不为0的情况。

通过上面的说明,我们发现学习一个N-gram的LM其实很简单,就是数数问题。数完了这些数儿,就得到了LM。但是从上面的分析过程,我们也不难发现这样得到的LM的一些严重问题:

  1. 「稀疏性问题」。我们前面提到过分子分母很容易为0,就是由于N-gram的稀疏性造成的,N越大,这种稀疏性的问题就越严重,很可能你统计的大多数N-gram都不存在。
  2. 「存储问题」。虽然这种基于计数的LM的很简单,但是我们必须穷举出预料中所有可能的N-gram,并逐一去计数、保存,N一旦大起来的话,模型的大小就会陡增。
  3. N太大了会有过于稀疏、难以保存的问题,相反,N太小了,模型的预测「准确率」就会明显降低。

我们知道,语言模型最直接的用途,就是文本联想,和文本生成了。 对于文本联想,这种基于计数的LM也不是不能用,毕竟联想出来的词确实在统计意义上是更加频繁的,所以用户直接感受不出它的缺点。

但对于文本生成来说,这种基于计数的LM则有很大问题了。这里拿CS224N的PPT上的一个例子来说明:

5a193225cec2ff83e764c3c604a1190d.png

这段文字中高亮的"today the"是预先给定的文本,后面则是通过LM一个字一个字预测出来形成的文本。 这段文本,牛逼之处在于,它的语法基本没啥错,可以我们读完之后,完全不知道在讲啥,因为它说着说着就说偏了,再说一会又偏了,导致整个文本没有一个清晰的主题。很明显,这里训练的LM采用的N-gram一定不大。但是N一大起来,训练起来又很困难。这就是基于计数的LM的困境。

不过,这玩意儿来做一个bullshit-generator还是挺不错的!

RNN和基于RNN的语言模型

前面讲到的基于计数的LM的缺点,主要就是由它的N-gram的N不能太大又不能太小的限制造成的。 如果能有一个结构,可以处理任意长度的输入,而不是要固定一长度的话,那就可以解决这个问题了。

在这样的启发下,RNN被提出了。

一个经典的RNN结构可以这样表示:

f81c1a9e65dfd36fd892c9a5d661512a.png

RNN即循环神经网络,为何叫循环呢?因为不管RNN有多长,它实际上都是在「同一个神经网络中不断循环」,例如图中话的4个隐层神经网络,实际上都是同一个,因此他们的「权重都是一样」的,只是根据输入的不同,而产生不同的输出。

有了这样的结构,使得RNN具有以下这些优点:

  1. 可以处理任意长度的输入
  2. 模型的大小不随输入长度的增加而增大
  3. 后面步骤的处理过程可以利用到前面的信息
  4. 每一步具有相同的权重矩阵,使得网络可以利用不同输入的相似性

然而,RNN也有其缺点:

  1. 计算慢。这是由于它必须在处理完上一步后才能进行下一步的计算。
  2. 当输入过长的时候,难以捕捉长距离依赖。

当然,这些问题都是后话了,后面我们学习的GRU,LSTM乃至Transformer都是在不断改进RNN的种种缺点。

如何训练一个基于RNN的LM呢?

首先,我们收集一大批语料,这些语料是由很多个序列(句子、短语等等)组成的。 我们把序列作为输入,输入到RNN网络中,每一步都可以得到一个输出,这个输出即为当前步的下一个词的概率分布。我们使用这个概率分布可以和真实的概率分布(其实就是一个one-hot向量)计算一个损失。明确了损失函数,我们就很容易去训练了。CS224N中的一张图描绘地很清晰:

35f815128c4f7eb0040a9cd06f5b0045.png

一图胜前言,这里就不再赘述了。

训练好RNN了之后,如何进行文本生成呢?

输入一个词,每一步的输出都作为下一步的输入,这样就可以通过一个词不断进行文本生成了。

如何评价一个语言模型呢?

使用「Perplexity」(困惑度):

e03b89c0840b6f91793ab2ab6fb61f23.png

这个公式计算出来的结果越大,就说明你这个模型越让人“困惑”,也就是不好了。

通过公式的变形,我们可以发现这个困惑度,等价于交叉熵损失函数:

所以,我们在优化RNN LM的时候,就是在使劲降低perplexity。

为何语言模型很重要

语言模型(LM)对于许多学习NLP的同学来说,是一个熟悉的陌生人,因为很多时候我们并不会去专门做一个语言模型,不像文本分类这种任务,任何学习NLP的同学都会去通过文本分类来练手。

但语言模型依然是十分重要的,主要体现在下面两个方面:

  1. 它是检测NLP模型是否理解了语言的一个基准任务(benchmark task);
  2. 它是很多NLP任务的基础子模块,尤其是涉及到文本生成、文本联想的任务。例如输入法预测、拼写检查、语音识别、手写文字识别、机器翻译、摘要生成、写作风格鉴定等等。随着NLP学习的深入,我们会越来越发现LM的重要性。

>欢迎订阅我的Hello NLP系列文章(不断更新中):

CS224n笔记[1]:Word2Vec从何而来
CS224n笔记[2]:Word2Vec算法推导&实现
CS224n笔记[3]:共现矩阵、SVD与GloVe词向量
CS224n笔记[4]:自然语言中的依存分析(Dependency Parsing)
CS224n笔记[5]:语言模型(LM)和循环神经网络(RNNs)
CS224n笔记[6]:更好的我们,更好的RNNs
CS224n笔记[7]:机器翻译和seq2seq>我的其他高赞文章,总有一款是你的菜:

何时能懂你的心——图卷积神经网络(GCN)
GraphSAGE:我寻思GCN也没我牛逼
【DL笔记8】如果你愿意一层一层剥开CNN的心
【DL笔记6】从此明白了卷积神经网络(CNN)
一条龙搞定情感分析:文本预处理、加载词向量、搭建RNN
Docker,救你于「深度学习环境配置」的苦海>更多精彩,欢迎订阅我的公众号:SimpleAI

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么从计算机上删除东西吗,怎么在电脑中删除不想要的软件

在电脑中删除不想要的软件该怎么操作呢,那么怎么在电脑中删除不想要的软件的呢?下面是学习啦小编收集整理的怎么在电脑中删除不想要的软件,希望对大家有帮助~~在电脑中删除不想要的软件的方法工具/原料笔记本电脑 或者台式电脑方法/步骤用鼠标点击选择电…

js输出100以内的质数_Python 计数质数

一个很经典的问题,从 2 到 N ,一共有多少个质数??一个非常 Naive 的方法,从 2 到 N,判断每个数是不是质数只判断一个数是不是质数,需要 的时间,现在有 N 个数,那么就是 埃…

计算机通信常用的纠错方式,纠错

纠错是指一种用于纠正在传送或存储数据期间产生的出错数据的方法。纠错可以有几种方法,其中最常见的方法是重传纠错和前向纠错。中文名纠错外文名error correcting所属学科通信原理与基本技术功 能纠正产生的出错数据常见方法重传纠错、前向纠错等应 用现代数…

word总积分怎么算计算机,Word文档怎么计算积分

回答:1、求和:作一表格,填入一系列数字,光标定位于最后一格中,点击表格工具栏中的∑,即可求得总和;2、求平均数:填入一系列数字,光标定位于最后一格中,点击菜单中的“表格”-“公式”,在弹出对话框中填入公式“AVERAGE…

kmeans算法中的sse_聚类算法入门:k-means

一、聚类定义聚类分析(cluster analysis)就是给你一堆杂七杂八的样本数据把它们分成几个组,组内成员有一定的相似,不同组之间成员有一定的差别。区别与分类分析(classification analysis) 你事先并不知道有哪几类、划分每个类别的标准。比如垃圾分类就是…

win7局域网计算机 慢,Win7系统开机宽带连接很慢怎么办?

Win7系统用户在使用电脑系统上网时,都需要对宽度进行连接,但有用户反映在开机时机宽带连接非常缓慢,甚至要等上十来分钟,这使用户非常苦恼,那么Win7系统开机宽带连接很慢应该怎么办呢?接下来下面就来教大家…

小天才被限定使用时长的应用_家庭腕上社交新场景,OPPO Watch、小天才开启暖心联动...

说到小天才手表,相信家长朋友们都或多或少的听说过,或者正在给孩子使用。可爱的造型和实用的功能还有亲民的价格,让小天才手表成为青少年智能穿戴领域的热门产品。特别是对于正在上幼儿园和小学阶段的小朋友来说,支持通话和定位功…

ef 多个左联接查询_.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记...

2.4.5 EF Core -- 查询关联数据加载客户端与服务端运算跟踪与不跟踪复杂查询运算原生 SQL 查询全局查询筛选器关联数据加载学员和助教都在项目分组中&#xff0c;调整模型&#xff0c;删除 AssistantProjectGroup 添加 Member 列表public List<Member> Members { get; se…

用友 无法正确解析服务器,用友T3软件登陆软件时提示:“可能无法正确解析服务器名称或者相应的端口被禁用,请尝试输入服务器的IP地址”?...

你好&#xff01;现在想要建立2015年的年度账&#xff0c;但新建年度账 是2016年 怎么解决&#xff1f; 你好&#xff01;现在想要建立2015年的年度账&#xff0c;但新建年度账 是2016年 怎么解决&#xff1f;[]您账才 做到2014年&#xff0c;要建立2015年度账&#xff1f;服务…

来自网页的消息服务器繁处理忙,EventSource 对象用于接收服务器发送事件通知,是网页自动获取来自服务器的更新...

//--------------------------------客户端代码-----------------------------if(typeof(EventSource) ! "undefined") {var source new EventSource("../api/v1/event.source");source.onmessage function(event) {$("#content_event").html(…

linux定向查日志_linux日志查找技巧

基础命令# 查询日志尾部最后10行的日志;tail -n 10 test.log#查询10行之后的所有日志;tail -n 10 test.log# 查询日志文件中的头10行日志;head -n 10 test.log# 查询日志文件除了最后10行的其他所有日志;head -n -10 test.log# 查看日志的尾部&#xff0c;并刷新显示日志变动。…

三国杀服务器改名 插图修改,《三国杀》大幅修改的武将——新旧两版,你更喜欢哪一位...

三国杀中&#xff0c;某些武将因为太强或者太弱&#xff0c;不能适应游戏环境&#xff0c;都会进行修改&#xff0c;例如&#xff1a;李丰、马良、伏皇后、曹冲等等&#xff0c;但这些武将修改之后&#xff0c;原有武将就淘汰了。其实&#xff0c;还有一类武将&#xff0c;技能…

php开源mvccms_轻松理解MYSQL MVCC 实现机制

1. MVCC简介1.1 什么是MVCCMVCC是一种多版本并发控制机制。1.2 MVCC是为了解决什么问题?大多数的MYSQL事务型存储引擎,如,InnoDB&#xff0c;Falcon以及PBXT都不使用一种简单的行锁机制.事实上,他们都和MVCC–多版本并发控制来一起使用.大家都应该知道,锁机制可以控制并发操作…

苹果电脑mac_清理Mac苹果电脑DNS缓存

说到清理苹果电脑想必不少网友会说苹果电脑不需要清理&#xff0c;但事实情况是现在对于“苹果电脑清理”的这个话题一直在不断地热议中&#xff0c;虽说Mac OS X系统它的优化比较好&#xff0c;很多小的无效数据文件会自动归类清除&#xff0c;但很多时候一些稍大的数据文件仍…

学python需要记笔记吗_开始学python,一些笔记

想想其实应该还是像在linux下一样在命令行下测试的&#xff0c;但是先跟着一个教程在IDE上试试手吧。1. 中文编码&#xff0c;我用的是python2.6.9 加两行注释&#xff1a;#!/usr/bin/python2.6# -*- coding: utf-8 -*-我原以为第一行是Python的安装目录&#xff0c;所以找了很…

鼠标追踪没用_【擺评】赛睿里最好用的小手鼠标---Rival 3

拿到这鼠标真的是有段时间了&#xff0c;深度体验了一个多月。先说&#xff0c;这是我用过所有赛睿鼠标里最喜欢的鼠标&#xff0c;虽然它不贵&#xff0c;虽然它是有线的&#xff0c;但真的舒服&#xff01;可能我也没用过几个赛睿的鼠标&#xff0c;仅有以下几款&#xff0c;…

java代码ftp重命名未生效_java使用apache commons连接ftp修改ftp文件名失败原因

今天被ftp上中文名修改坑了好久项目用的是 apache commons 里的 FtpClient 实现的对ftp文件的上传下载操作&#xff0c;今天增加了业务要修改ftp上的文件名&#xff0c;然后就一直的报错&#xff0c;问题是它修改名字的方法只返回一个boolean&#xff0c;没有异常&#xff0c;这…

zynq中mgtx应用_Zynq7000系列之芯片引脚功能综述

很多人做了很久的FPGA&#xff0c;知道怎么去给信号分配引脚&#xff0c;却对这些引脚的功能及其资源限制知之甚少&#xff1b;在第一章里对Zynq7000系列的系统框架进行了分析和论述&#xff0c;对Zynq7000系列的基本资源和概念有了大致的认识&#xff0c;然而要很好地进行硬件…

mysql存储过程触发器_MySQL存储过程及触发器

一、存储过程存储过程的基本格式如下&#xff1a;-- 声明结束符-- 创建存储过程DELIMITER $ -- 声明存储过程的结束符CREATE PROCEDURE pro_test() --存储过程名称(参数列表)BEGIN-- 可以写多个sql语句; -- sql语句流程控制SELECT * FROM employee;END $ -- 结束 结束符-- 执行…

mysql 扩展存储过程_MySQL4:存储过程和函数

什么是存储过程简单说&#xff0c;存储过程就是一条或多条SQL语句的集合&#xff0c;可视为批文件&#xff0c;但是起作用不仅限于批处理。本文主要讲解如何创建存储过程和存储函数以及变量的使用&#xff0c;如何调用、查看、修改、删除存储过程和存储函数等。使用的数据库和表…