深入浅出系列1:词向量

0、文章结构

  1. 词向量简介
  2. one-hot编码
  3. 统计语言模型
  4. 分布式表征和SVD分解
  5. 神经网络语言模型
  6. word2vec
  7. fastText(新增文章补充,敬请期待)
  8. GloVe(新增文章补充,敬请期待)
  9. Bert/ELMO/GPT提取词向量(新增文章补充,敬请期待)

1、词向量简介

词向量(word vector/word embedding):为了计算机理解语言,将词映射为实体向量,常见的词向量表示方法有:

  • 词袋模型:one-hot、tf-idf、textrank等
  • 主题模型:LSA(LDA分解)、pLSA等
  • 静态表征的词向量:word2vec、fastText、GloVe等
  • 动态表征的词向量:Bert、GPT、ELMO等

2、one-hot编码

one-hot编码大家一般都是比较熟悉的,词向量的维度等于词汇表大小,每个词都有固定的索引位置,某个词的向量表示为索引位置值为1,其他为0,举个例子:假设词汇表中仅有4个词:我、爱、编、程,那么这四个词的词向量表示分别为:

我:[1, 0, 0, 0]
爱:[0, 1, 0, 0]
编:[0, 0, 1, 0]
程:[0, 0, 0, 1]

从one-hot的原理来看,它主要有以下几个特点:

(1)词与词完全独立,无法计算相似度关系;比如“编”和“我”/“程”的欧式距离都是0,但是实际上“编”和“程”的语义关系应该更接近。

(2)维度灾难:由于向量维度和词汇表大小一样,常见的中文词表大小也有5000多,这样的表示方法会使得下有模型负担很重。

3、统计语言模型

统计语言模型的基本问题是:如何解决一段文本序列在某种语言下出现的概率?用数学公式表示为:
P(s)=P(w1,w2,...,wn)=∑t=1np(wt∣w1,w2,...,wt−1)P(s) = P(w_1, w_2, ..., w_n) = \sum_{t=1}^n p(w_t|w_1,w_2,...,w_{t-1}) P(s)=P(w1,w2,...,wn)=t=1np(wtw1,w2,...,wt1)

sss:句子

wtw_twt:句子中的某个词或者某个字

为了计算联合概率分布p(s)p(s)p(s),我们需要计算条件概率分布:即给定上文的条件下当前词出现的概率:
p(wt∣w1,w2,...,wt−1)p(w_t|w_1,w_2,...,w_{t-1}) p(wtw1,w2,...,wt1)
我们可以知道当依赖的上文长度比较长时,参数是很高的,假设我们只考虑:

  • 已知一个词出现另一个词的条件概率,那么参数大小为N2N^2N2NNN为词表大小)

    怎么理解呢?还是以“我爱编程“为例,假设词表中仅仅包含着4个词,那么要计算上面的条件概率,就需要计算出以下16种情况:
    p(我∣我)、p(我∣爱)、p(我∣编)、p(我∣程)p(爱∣我)、p(爱∣爱)、p(爱∣编)、p(爱∣程)p(编∣我)、p(编∣爱)、p(编∣编)、p(编∣程)p(程∣我)、p(程∣爱)、p(程∣编)、p(程∣程)p(我|我)、p(我|爱)、p(我|编)、p(我|程) \\ p(爱|我)、p(爱|爱)、p(爱|编)、p(爱|程) \\ p(编|我)、p(编|爱)、p(编|编)、p(编|程) \\ p(程|我)、p(程|爱)、p(程|编)、p(程|程) \\ p()p()p()p()p()p()p()p()p()p()p()p()p()p()p()p()

  • 已知两个词出现第三个词的条件概率,那么参数大小为N3N^3N3NNN为词表大小)

    分析参考上面的实例。

所以在实际应用中,通常只利用上文的n个词来计算当前词的条件概率,这就是n-gram:
p(wt∣w1,w2,....,wt−1)≈p(wt∣wt−n+1,...wt−1)p(w_t|w_1,w_2,....,w_{t-1}) \approx p(w_t|w_{t-n+1}, ...w_{t-1}) p(wtw1,w2,....,wt1)p(wtwtn+1,...wt1)

  • n=1n=1n=1:unigram模型,词和词之间完全是独立的,只考虑自身出现的频率。
  • n=2n=2n=2:bigram模型,考虑上文的一个词
  • n=3n=3n=3:trigram模型,考虑上文的两个词(由于模型参数空间以及计算复杂度的限制,实际应用很少有n>3n>3n>3的情况)

通常会用极大似然估计去求解n-gram的参数,其实就是等价于统计每个n-gram出现的条件词频(这就是该语言模型为什么成为”统计“的原因了:统计语言模型)。

4、分布式表征和SVD分解

要了解分布式表征,需要我们看下什么是向量空间模型。

4-1、向量空间模型(VSM:vector space model)

VSM主要是基于两个假设提出来的:

  • 词袋假说(bag of words hypothesis):一篇文档的词频表示了文档的主题(例如出现”药“字的文章的主题很可能属于医疗领域的)
  • 分布假说(distributed hypothesis):出现在相似的上下文中的两个词有相似的语义

基于词袋假说,我们可以构造一个term-document矩阵AAA(即词-文档矩阵)。其中Ai,jA_{i,j}Ai,j表示wiw_iwi在文档DjD_jDj中出现的次数,这样我们简单的提取该矩阵的行向量作为wiw_iwi的表示向量,提取列向量作为文档DjD_jDj的主题向量。

基于分布假说,我们可以构造一个word-context矩阵AAA(即词-上下文矩阵)。其中Ai,jA_{i,j}Ai,j表示词wi,wjw_i,w_jwi,wj在某个指定窗口(例如3)的上下文中共同出现的次数。

因此,我们可以知道:SVD分解来表征词向量的方法是基于词袋模型来做的,而word2vec是基于分布假说来完成的。(不要急,慢慢往下看)

4-2、什么是SVD分解?
  • 特征值分解(对方阵进行分解)
    Av=λvA=QΣQ−1Av = \lambda v \\ A = Q\Sigma Q^{-1} Av=λvA=QΣQ1
    AAA:方阵

    vvv:特征向量

    λ\lambdaλ:特征值

    QQQ:特征向量组成的矩阵

    Σ\SigmaΣ:特征值组成的对角矩阵

  • 奇异值分解
    A=UΣVTA = U\Sigma V^T A=UΣVT
    AAA:mxn;UUU:mxm;Σ\SigmaΣ:mxn;VTV^TVT:nxn。

    其中U/VU/VU/V是正交矩阵,那么特征值分解和奇异值分解的关系是:
    A=UΣVT→AT=VΣUT→ATA=VΣ2VTA=U\Sigma V^T \rightarrow A^T = V\Sigma U^T \rightarrow A^TA=V\Sigma^2 V^T A=UΣVTAT=VΣUTATA=VΣ2VT
    最后一个式子不就是特征值分解吗?这样就能够很方便的求出U和VU和VUV

    通常可以取前10%的奇异值以及对应的奇异向量来描述矩阵AAA,即
    A≈Um∗rΣVr∗nTA \approx U_{m*r} \Sigma V_{r*n}^T AUmrΣVrnT
    奇异值分解的缺点:分解出来的向量不是能够很好地解释,并且svd分解计算复杂度较高。

4-3、基于SVD表征的词向量

假设有以下的term-document矩阵,Am∗nA_{m*n}Amn,表示有m个词n个文档/句子,该矩阵表示如下。

文档1 文档2 文档3 文档4
1 0 1 1
1 0 1 1
1 0 0 1
1 0 0 1
0 1 1 1
0 1 0 1

对上面进行SVD分解,可得:

>>> import numpy as np
>>> A = np.array([[1,0,1,1],[1,0,1,1],[1,0,0,1],[1,0,0,1],[0,1,1,1],[0,1,0,1]], dtype=float)
>>> U,Sigma,V = np.linalg.svd(A)
>>> U
array([[-0.49466625, -0.19734749, -0.3647272 ,  0.61545745,  0.42563459, 0.15290732],[-0.49466625, -0.19734749, -0.3647272 , -0.12309149, -0.70939099, -0.25484553],[-0.37026004, -0.29950169,  0.43574408, -0.24618298,  0.3809445 , -0.61449863],[-0.37026004, -0.29950169,  0.43574408, -0.24618298, -0.0971881 , 0.71643684],[-0.40035037,  0.65831991, -0.27018723, -0.49236596,  0.28375639, 0.10193821],[-0.27594416,  0.55616572,  0.53028406,  0.49236596, -0.28375639, -0.10193821]])
>>> Sigma
array([3.34223380e+00, 1.60644231e+00, 1.11750452e+00, 1.15720168e-16])
>>> V
array([[-5.17573783e-01, -2.02348063e-01, -4.15794633e-01, -7.19921846e-01],[-6.18570836e-01,  7.56009489e-01,  1.64104818e-01, 1.37438653e-01],[ 1.27099046e-01,  2.32747892e-01, -8.94530286e-01, 3.59846939e-01],[ 5.77350269e-01,  5.77350269e-01, -5.55111512e-17, -5.77350269e-01]])

如果只保留前两个特征值和特征向量,那么可得词和文档的表示如下:

左奇异矩阵UUU的每一行代表每个词的表征向量;

右奇异矩阵VVV的每一列代表每个文档的表征向量;

5、神经网络语言模型(NNLM:neural network language model)

提出文献2003:《A neural probabilistic language model》,提出一套用神经网络建立统一语言模型的框架,奠定了后续word2vec等方法的基础。

NNLM的主要思想:

(1)每个词都对应一个连续的特征向量

(2)存在一个连续平滑的概率模型,输入一段词向量序列,可以输出这段序列的联合概率

(3)在学习条件概率的过程中,能够产生词向量的副产物

模型思路:

采用一个简单的前向反馈神经网络F(w1,...,wt−1)F(w_{1}, ...,w_{t-1})F(w1,...,wt1)来拟合当前词wtw_twt的条件概率p(wt∣w1,w2,...,wt−1)p(w_t|w_1,w_2,...,w_{t-1})p(wtw1,w2,...,wt1)。该模型包含三层神经网络:映射层+隐藏层+输出层:

  • 映射层:将词从one-hot映射为词向量,其中网络权值即为我们要求的词向量。
  • 前向反馈神经网络:tanh激活的隐藏层 + softmax输出

该模型解决了两个问题:(1)统计语言模型中关注的条件概率p(wt∣context)p(w_t|context)p(wtcontext)的计算(2)词向量的表示

该模型存在的两个问题:(1)由于NNLM使用全连接层,只能处理定长序列(2)参数空间巨大(参考之前提到的ngram),训练慢

6、word2vec

经过10多年的转变,word2vec被提出来了,word2vec本质上还是语言模型,不过其训练目标就是针对此词向量的。

word2vec主要有几个地方需要搞懂:两种形式 + 两个提速手段

6-1、两种形式:CBOW+Skip-gram

CBOW:输入前后n个词,预测中间词,其模型结构:

  • [x1k,...,xck][x_{1k}, ..., x_{ck}][x1k,...,xck]表示第k个中心词的前后C个上下文的one-hot向量
  • 将one-hot放到词向量矩阵(需要网络不断学习)中进行查表,WV∗NW_{V*N}WVN:V为词表大小,N为词向量维度,通常取300、500等
  • 将查表得到的上下文向量进行直接相加,在通过隐藏层映射到输出层,输出层节点个数为词表大小

CBOW vs NNLM:

(1)对查表之后的向量直接进行相加(NNLM是对输出结果进行拼接)

(2)将下文词加入到上下文环境,而NNLM仅仅考虑了上文

(3)输出层是Huffman树而非线性全连接层,使用了hierarchical softmax + negative sampling

Skip-gram是已知中心词预测上下文,这里不再赘述,模型结构如下:

6-2、两个提速技巧
  • hierarchical softmax:由于softmax层计算需要遍历所有输出节点的值,即时间复杂度为NNN,因此作者提出用分层softmax来加速训练和计算。将时间复杂度从O(N)→O(log(N))O(N)\rightarrow O(log(N))O(N)O(log(N))。由于涉及到Huffman树的原理以及实际的构造细节,所以本篇不再赘述,后续会单独开一篇进行详细介绍。

  • negative sampling(负采样)

    目的:提高训练速度,利用相对简单的随机负采样来大幅提高性能。

    思想:每次训练时只修改部分权重

    如果词表大小为5000,当输入样本为(”我“,”爱“)时(假设为bigram模型),”我“经过one-hot编码之后,我们期望对应”爱“单词的按个神经元节点输出为0,其余4999个节点为0。在这个案例中,这4999个节点对应的单词成为negative words,如果我们每次更新这么多权重的话,训练注定会很慢,一个很简单的想法就是:随机选择一部分negative words,对他们的权重值进行更新就好了。那么问题来了:

    如何随机选择一部分的negative word呢?

    选择某个词的概率和该词出现频率的有关,频率越高,被选择的概率应该越大。
    p(wi)=f(wi)0.75∑j=1nf(wj)0.75p(w_i) = \frac{f(w_i)^{0.75}}{\sum_{j=1}^n f(w_j)^{0.75}} p(wi)=j=1nf(wj)0.75f(wi)0.75

  • word2vec的局限

    (1)只考虑局部context信息,缺少全局信息

    (2)训练后每个词的词向量是固定的,无法捕获在不同上下文环境下的语义。例如”苹果“在不同的上下文中可能说的是水果,也能是手机。

7、其他

由于工作繁忙,每次理解和整理都需要花费闲暇时间完成,请谅解。

本系列待补充文章,敬请期待:

  • 深入浅出Huffman树及应用

  • 深入浅出fastText

  • 深入浅出GloVe

  • 深入浅出深度学习预训练模型

参考链接

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

《A neural probabilistic language model》

深入浅出系列1:词向量相关推荐

  1. 最小熵原理系列:词向量的维度应该怎么选择?

    ©PaperWeekly 原创 · 作者|苏剑林 单位|追一科技 研究方向|NLP.神经网络 随着 NLP 的发展,像 Word2Vec.Glove 这样的词向量模型,正逐渐地被基于 Transfor ...

  2. ​越学越有趣:『手把手带你学NLP』系列项目01 ——词向量应用的那些事儿

    点击左上方蓝字关注我们 课程简介 "手把手带你学NLP"是基于飞桨PaddleNLP的系列实战项目.本系列由百度多位资深工程师精心打造,提供了从词向量.预训练语言模型,到信息抽取. ...

  3. glove中文词向量_Summary系列glove模型解读

    一.Glove模型简介 语义文本向量表示可以应用在信息抽取,文档分类,问答系统,NER(Named Entity Recognition)和语义解析等领域中,大都需要计算单词或者文本之间的距离或者相似 ...

  4. NLP系列(10)_词向量之图解Word2vec

    审校:龙心尘 作者:Jay Alammar 编译:张秋玥.毅航.高延 https://blog.csdn.net/longxinchen_ml/article/details/89077048 原文链 ...

  5. 词向量系列之One-Hot编码详解

    目录 0.前言 1. 独热编码 1.1 独热编码例子 1.2 独热编码的优点 1.3 独热编码的缺点 1.4 独热编码适用的情况 2. 独热编码的实现 2.1 python简单实现one-hot编码 ...

  6. [Pytorch系列-58]:循环神经网络 - 词向量的自动构建与模型训练代码示例

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

  7. PGL 系列(四)词向量 CBOW

    环境 python 3.6.8 paddlepaddle-gpu 2.3.0 numpy 1.19.5 pgl 2.2.4 学习路线 一.CBOW 概念 CBOW:通过上下文的词向量推理中心词 在CB ...

  8. [NLP] 深入浅出 word2vec 词向量详解

    Word2vec 词向量 前置知识:需要理解基本的MLP 多层感知机(全连接神经网络) 和DL.数学相关基础知识 One-hot encoding 独热编码 刚开始,人们用one-hot编码来表示词, ...

  9. 词向量, BERT, ALBERT, XLNet全面解析(ALBERT第一作者亲自讲解)

    Datawhale Datawhale编辑 现在是国家的非常时期,由于疫情各地陆续延迟复工,以及各大院校延期开学.作为一家 AI 教育领域的创业公司,贪心学院筹划了5期NLP专题直播课程,希望在这个非 ...

最新文章

  1. 在C#.net中如何操作XML
  2. Windows 安装 pytorch3d
  3. unsigned int vs. size_t
  4. 1091 N-自守数
  5. pat 乙级 1029 旧键盘(C++)
  6. 哪里有mysql认证_国内哪个城市可以考mysql认证
  7. 哇!单细胞测序-配体受体互作分析原来可以这么简单又高大上!
  8. configure: error: MySQL library not found ,Not found mysqlclient library
  9. 手机鸿蒙系统体验,首位!魅族Lipro智能家居宣布接入鸿蒙系统,魅族手机还会远吗?...
  10. 【21】基于java的旅游信息管理系统
  11. 在windows下使用cmd命令全速下载百度云文件
  12. 如何编写简洁的代码?
  13. 企业自动运行系统——定价策略
  14. 微信、手Q、QQ浏览器userAgent记录
  15. Java——IDEA
  16. uefi +gpt 系统安装 和 传统legacy + mbr 的区别
  17. 【ChatGPT军事专家】岸防炮的射速是多少,如何攻破岸防炮
  18. MySQL数据库入门实战教程
  19. 公司人才中介平台的设计与实现
  20. 02优先队列和索引优先队列-优先队列-数据结构和算法(Java)

热门文章

  1. 开源一个自动录制直播上传投稿的项目
  2. 产品经理到底是做什么的?|️ 什么是产品经理?
  3. 顺序查找 题目编号:517
  4. conda search cuda后没有版本10的问题
  5. 函数原型中int *arr和int arr[]
  6. 购买别人的域名回收别人废弃的域名
  7. 【学习笔记】域名资源记录(Resource Record)
  8. 7. 全概率公式与贝叶斯公式
  9. [4G5G专题-57]:L2 RLC层-详解RLC架构、数据封装、三种模式:透明TM、非确认模式UM、确认模式AM
  10. 小木虫网站无法登陆(账号突然被封禁)的解决办法