从自然语言模型谈起

1 词向量

1.1词向量

自然语言处理就是将自然语言交给机器的算法来处理,首要的任务就是把语言数字化,词向量就是将词语转换为向量的一种方法。词向量主要有以下两种表示方法。

  • one-hot编码
  • Distribted Representation

one-hot编码是用一整串0 1来表示某个词语,向量到的长度为词典的大小,某个词的词向量只有一个元素位置为1,其余均为0。缺点就是维度太大,而且任意两个向量之间没有任何关系。假设整个语料有两句话,++我爱中国人++和++赵鸿宁爱我++,那么分词之后可能一共有“我,爱,中国,人,赵洪宁”这个5个词,爱这个词的词向量大概是这种形式:

x=[0,1,0,0,0]

x = [0,1,0,0,0]
Distributed Representation方法是用一个普通的向量表示一个词,相对长度要短很多,”我“这个词向量大概长这样:

x=[0.111,0.342,0.4521,0.4311,...]

x = [0.111,0.342,0.4521,0.4311,...]

很明显这种词向量并不能直接由语料得到,必须经过相应的训练和学习得到。但是我们不能随便瞎训练,一个比较好的方式就是相似的词语它们的词向量在空间上也比较接近,这里的接近体现在几何意义上就是向量的欧式距离较小。以二维向量为例,就是他们的夹角越小越好。代表的方法有Bingo发表的NNLM模型和Google的word2Vec模型。

1.2 词袋(bag of words)

词袋是词语的另外一种表示方法,核心思想就是给每个词语一个索引,比如刚刚那个例子,可能会有一个索引{0,1,2,3,4}来表示语料中的5个词语。一般来说可以用hash散列的方式得到某个词的索引,比如可以定义我的索引:index(我) = hashcode(我),当然这种哈希方式会存在冲突,冲突的解决方法就是哈希中的方法了。

2 自然语言模型

上面提到了词向量的Distributed Representation,那么我们怎么能够得到这种向量呢?怎么通过模型的训练得到这种向量呢?这就不得不提到自然语言模型了。首先要明确一点,不管是word2vec还是其他模型得到的词向量,这些==词向量不是模型训练的任务,只是模型训练的附属品。==

2.1 基本概念

在实际的应用中,我们通常需要解决这样的一类问题:如何计算一个句子的概率?比如:

  • 机器翻译:P(high winds tonite)>P(large winds tonite)
  • 语音识别:P(I saw a van)>P(eyes awe of an)

所有的这些问题都可以归结于计算一个由T个单词组成的完整的句子的概率:

P(S)=P(w1,w2,w3,....wn)=P(w1)P(w2|w1)P(w3|w1w2)...P(wn|w1w2..wn−1)

P(S) = P(w_1,w_2,w_3,....w_n)=P(w_1)P(w_2|w_1)P(w_3|w_1w_2)...P(w_n|w_1w_2..w_n-1)

=∏i=1TP(wi|contex(wi))

= \prod_{i=1}^T P(w_i|contex(w_i)) \quad

最原始的做法是基于统计的方式,用现有的语料库去估计给我们的一句话出现的概率。

但是语料库太大,统计起来太麻烦,所以也就有了N-gram模型,它是基于马尔可夫假设,即每个词出现的概率并不是跟它前面的所有词有关,我们只取离它最近的N个词语,也就是:

P(wi|contex(wi))=P(wi|wi−1...wi−1−n)

P(w_i|contex(w_i)) = P(w_i|w_{i-1}...w_{i-1-n})

但是这也带来了问题,因为它是从语料库中数出相应的个数,用count(wi)/count(wi-1….),所以主要有两个缺点:首先是如果N选的太大,语料经常不足,而且语料库太大。其次是可能会出现某些Gram在语料中不存在的情况,这时候概率值相乘就为0,解决方法有两个:平滑法(平滑法,即给分子分母都加1)和回退法(利用n-1元组去估计n元组)。

2.2 模型的问题和目标

如果都是用最原始的直接统计数数的方式去计算,这样的语言模型没有参数,直接计算,但是通常模型是带有参数的,比如n-gram中如果采用平滑法,分子分母分别加上的常数是什么。

另外一种解决方式就是我们是把contex(wi)和wi直接带入到某个函数中求解出来的,不再是数数数出来的概率。一般会基于现有的训练数据样本,用函数去拟合出概率值:

P(wi|contex(wi))

P(w_i|contex(w_i))

优化的思想就是极大似然估计,也就是我们利用极大似然估计作为我们的优化策略,让目标预测值等于实际值的概率尽可能的大,这里的意思是既然某句话已经出现了,那么我们就让这句话出现的概率最大。至于为什么要取对数,一个原因是可能随着自变量的增大,因变量的方差越来越大,我们需要把它拉回到一个正常的数值,数据变得更加平滑。所以,优化的目标是:

f=max∑iTlog(P(wi|contex(wi))

f = max\sum_{i}^T log(P(w_i|contex(w_i))

2.3 NNLM模型

首先介绍2003年Bingo发表的论文中所描述的神经网络模型

一共分为四层:==输入层,投影层,隐藏层,输出层==。输入层输入的是单词wi的上下文,一般会定义一个窗口的大小,假设我们只看每个词的前面四个词,那么投影层,会取出这4个词对应的词向量前后拼接在一起。假设语料库大小为10000,矩阵C的维度为300x10000,其中300代表着每一个词向量的维度。对应的投影层的结果就是4个300维的向量然后经过拼接变成的隐藏层1200维向量。然后隐藏层神经元连接到输出层,输出向量的维度为1w的向量,向量每个位置的数值表示P(w_i|contex(w_i)),因为wi一共有1w中可能,所以向量的维数为1w。

优化的目标函数是:

f=max∑iTlog(P(wi|contex(wi))

f = max\sum_{i}^T log(P(w_i|contex(w_i))

X=(C(wi−1),C(wi−2),...C(wi−n+1))

X = (C(w_{i-1}),C(w_{i-2}),...C(w_{i-n+1}))

y=b+WX+Utanh(HX+d)

y = b + WX + Utanh(HX + d)

P(wi|contex(wi))=eywi∑ieyi

P(w_i|contex(w_i)) = \frac{e^{y_{wi}}}{\sum_ie^{y_i}}

输出层要经过一次softmax,才能变成概率的含义,这样1w维向量每个位置的值就表示为概率。正常来说,语料一般有多句话,每句话都有多个词语,我们的目标函数写的比较简单,实际中应该是每句话的概率都要最大。虽然每句话给进我们的模型中,它的句子不同,上下文也不同,但是大家都有相同的b,W,U,C,d,通过在求解f的过程中,就可以更新出这些参数。

word2Vec基础背景知识相关推荐

  1. word2vec(2) 背景知识

    word2vec 是用来生成词向量的工具,而词向量与语言模型有着密切的关系. 1. 统计语言模型 统计语言模型是NLP的基础.统计语言模型是用来计算一个句子的概率,其通常基于一个语料库D来构建.即判断 ...

  2. Tomcat(一):背景知识和安装tomcat

    1. 基础背景知识 1.1 java和jdk概念 无论是何种程序,要能在计算机上运行,必须能转换为二进制的机器语言才能和硬件进行交互,在机器语言的上层是汇编语言,再上层是C/C++这样较底层的语言,由 ...

  3. Windows_Program_Via_C_Translate_Win32编程的背景知识/基础知识_包括基本输入输出机制介绍...

    Some Basic Background Story of The Win32 APIs Win32 API背景故事/背景知识 The Win32 application programming i ...

  4. word2vec 中的数学原理详解(三)背景知识

    word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Miko ...

  5. 零基础无实物一步一步学PLCS7-1200仿真 背景知识一 低压元器件基础

    学习PLC之前,最好对基本的电气相关控制设备有一个牢固的基础,对于理解PLC乃至未来开发复杂的项目是一个非常好用的背景知识.话不多说,进入正题.本文将讲解电气控制最常见的低压电气元器件,每个元器件遵循 ...

  6. 『Linux基础 - 2 』操作系统,Linux背景知识和Ubuntu操作系统安装

    这篇笔记记录了以下几个知识点: 1.目前常见的操作系统及分类,虚拟机 2.Linux操作系统背景知识,Windows和Linux两个操作系统的对比 3.在虚拟机中安装Ubuntu系统的详细步骤 OS( ...

  7. 零基础无实物一步一步学PLCS7-1200仿真 背景知识三 PLC基础

    一.PLC的历史 经历上一节背景知识,在不引入控制器的情况下,我们可以通过继电器和接触器完成一些简单的线路控制,实现电动机的正转和反转.当我们想实现复杂的功能时候,其实也是可以利用继电器和接触器完成, ...

  8. Visual Studio c++必要的背景知识--链接与编译

    HowTo: 1) 如何创建和编写静态链接库 2) 如何创建可执行文件 3) 如何创建头文件和cpp文件 4) 如何相对路径寻址 5) 如何进行手动静态库链接 6) 如何编译部分或全部程序 在撰写Li ...

  9. 用Python爬网页需要了解什么背景知识

    在知乎上有一位同学提出的问题:用Python爬网页需要了解什么背景知识,恰好我对爬虫有所了解,所以昨天晚上做了回答,今天放到公众号上面希望对大家有所帮助,如有帮助欢迎转发. 文中涉及到一些教程链接在本 ...

  10. ClassLoader背景知识

    前几天想了一下,最近主要学习linux和httpd,所以tomcat源码阅读先放一放,可能到9月份左右再继续.不过先把已经写好的几篇陆续贴上来 tomcat用到很多ClassLoader相关的代码,如 ...

最新文章

  1. 如何用正确的方法来写出质量好的软件的75条体会
  2. Maven_在Eclipse中执行Maven命令
  3. Java读取xml数据
  4. 团队任务3:每日立会(2018-10-25)
  5. STM8单片机低功耗---停机(Halt)模式实现
  6. A1089. 阶乘计算
  7. 信息熵 条件熵 信息增益 信息增益比 GINI系数
  8. Linux安装pyaudio
  9. 西部世界Filecoin双节点设置 大胆玩出圈
  10. Firefox 不知道如何打开此地址,因为协议 (javascrpit) 未和任何程序关联.
  11. 【前端点击穿透】pointer-events属性详解
  12. linux关于压缩解压tar包
  13. Flink on Yarn三部曲之一:准备工作
  14. Python的PyAutoGUI库整理中文文档,可以让所有GUI都实现自动化。
  15. Encoder编码器、Decoder解码器
  16. 【转】利用tmail.exe 命令参数来发送邮件
  17. 模拟电路设计(26)---D/A转换器电路原理
  18. 阵列信号处理及matlab实现_麦克风阵列原理及应用
  19. 10大玄机为你揭开炒土豆丝爽脆的秘密——尖椒土豆丝
  20. 指定ip地址和端口号登录mysql数据库_防火墙规则,指定ip访问mysql数据库3306端口...

热门文章

  1. 什么是虚拟内存?虚拟内存的原理
  2. 基于SSM的网上手机商城购物系统设计与实现 文档+项目源码及数据库文件+运行说明
  3. Go语言之error
  4. 5年从点点点到测开,写给即将进入或者正在做测试的你...
  5. 陈强教授《机器学习及R应用》课程 第五章作业
  6. NYNU开学大作战之补番真开心
  7. linux如何设置root权限,linux设置root权限的方法
  8. extern int a 和int a的区别
  9. 在新加坡旅游过一个令你心跳加速的情人节
  10. 桌面许多快捷方式图标/文件左下角出现绿色对号小图标