写在前面

之前写的关于NLP基础词向量的笔记,这次更新一下。从最简单的one-hot到目前效果惊人的BERT进行整理对比,加深对基础的理解。词向量的表示方法由低级至高级可以分为以下几个部分:

  1. Bag of Words模型:one-hot, tfidf等离散表示
  2. 主题模型表示:LDA这一类
  3. 固定词向量模型:Word2vec,glove, fasttext
  4. 动态词向量模型(预训练方式):elmo、gpt、bert

一、离散表示

One-hot独热表示法
  • NLP 中最常用、最传统的词特征表示方式是采用One-Hot 编码,即每一个词特征都被表示成一个很长的向量,其长度等于词表大小,当前词对应位置为1,其他位置为0。
  • 但是这种表示方式存在显而易见的问题:
    • 不同词之间总是正交的,无法衡量不同词之间的相似关系。
    • 只能反映每个词是否出现,但无法突出词之间重要性的区别。
BOW词袋表示法
  1. 在One-Hot 表示法的基础上,对词表中的每一个词在该文本出现的频次进行记录,以表示当前词在该文本的重要程度。
  2. 但这种表示方式只能表达词在当前文本中的重要程度。很多停用词由于频次较高,权重很大。可用TF-IDF进行优化
  3. 存在的问题:
  4. 词之间是独立的,无法提供词序信息和上下文信息。
  5. 数据十分稀疏。

二、基于SVD

这是一种构造词嵌入的方法,首先遍历所有的文本数据,然后统计词出现的次数保存在矩阵X中,然后对X应用奇异值分解:X=USVTX=U S V^{T}X=USVT。然后将U矩阵的行向量作为所有词表中词的词向量。对于矩阵X,有两种选择方式:

词-文档矩阵

这种情况下矩阵X中的每一个元素X[i][j]表示第i个词出现在第j个文本中的次数。最终得到一个庞大的R∣V∣×M\mathbb{R}^{|V| \times M}RV×M矩阵,该方案显然不理想。

基于窗口的共现矩阵

这个方法不再考虑文档的数量,统计两个词在给定窗口中的共现次数。以CS224N课程中例子来说,对于下面三个句子:

  1. I enjoy flying.
  2. I like NLP.
  3. I like deep learning.

共现矩阵为:

可以发现上述矩阵存在非常明显的高纬度和高稀疏性问题。于是首先想到的就是降维。

Python中简单的词向量SVD分解

三、固定词向量模型

3.1 NNLM

Distributed representation 被称为“Word Representation”或“Word Embedding”, 中文也叫“词向量”或“词嵌入”。首先引入词向量概念的是2003年Bengio等人用三层的神经网络构建了统计语言模型的框架,该框架的主要目标是训练语言模型,词向量只是它的副产品。模型的网络结构如下:

3.2 Word2vec

  • 2013年Google 开源了一款直接计算低维词向量的工具 ——Word2Vec,不仅能够在百万级的词典亿级数据集上高效训练,而且能够很好的度量词与词之间的相似性。
  • 对原始NNLM的改进:
    • 移除前向反馈神经网络中的非线性hidden layer,直接将中间层的embedding layer 与 softmax layer 连接。
    • 输入所有词向量到一个embedding layer 中 。
    • 将特征词嵌入上下文环境
    • 后续还在训练方法上进行了优化:层次softmax以及负采样技术

word2vec主要有两种训练方式:Continuous Bag of Words Model(CB)和Skip-Gram
有两种优化方式:hierarchical softmax 和negative sampling
所以说Word2vec一共可以有四种模型。
这里只做简略说明,具体推导可参考word2vec中的数学原理详解

CBOW模型:
  • 损失函数:

L=∑w∈Clog⁡p(w∣Context(w))\mathcal{L}=\sum_{w \in \mathcal{C}} \log p(w | \text {Context}(w)) L=wClogp(wContext(w))

  • 模型框架
Skip-gram模型
  • 损失函数:

L=∑w∈Clog⁡p(Context(w)∣w)\mathcal{L}=\sum_{w \in \mathcal{C}} \log p(\text {Context}(w) | w) L=wClogp(Context(w)w)

  • 模型框架:
用gensim学习word2vec

对于word2vec来说,模型分为CBOW和SG两种,训练方法有Negative Sampling和Hierarchical Softmax两类,总的一共有四种解法。最方便的是选用开源库gensim来使用。

  1. 如果需要自己训练word2vec模型,伪代码如下
import gensim
text = 'your/path/to/training.txt'
model = gensim.models.Word2Vec(min_count=2)
model.build_vocab(text)
model.train(text, total_examples=model.corpus_count, epochs=model.iter)
  1. 如果直接调用以及训练好的模型
model = gensim.models.Word2Vec.load('your/path/to/model')
  1. 获取词向量
>>> model['computer']  # raw NumPy vector of a word
array([-0.00449447, -0.00310097,  0.02421786, ...], dtype=float32)>>> model.wv['word']
  1. 获取词表
model.wv.vocab.keys()
  1. 求词与词之间的相似度
y2=model.similarity(u"好", u"还行")     # 比较两个词的相似
print(y2)for i in model.most_similar(u"滋润"):  # 一个词相似词有哪些print i[0],i[1]

更具体可以参考:【不可思议的Word2Vec】 2.训练好的模型

3.3 Glove

Glove认为Word2vec词向量的视野只有中心词周围的部分词语,缺少全局词语的信息;另外,w2v缺乏对高频词的处理。

glove的思路是将全局词-词共现矩阵进行分解,训练得到词向量。目标函数为:J=∑i,j=1Vf(Xij)(wiTw~j+bi+b~j−log⁡Xij)2J =\sum_{i, j=1}^{V} f\left(X_{i j}\right)\left(w_{i}^{T} \tilde{w}_{j}+b_{i}+\tilde{b}_{j}-\log X_{i j}\right)^{2}J=i,j=1Vf(Xij)(wiTw~j+bi+b~jlogXij)2
其中XijX_{ij}Xij表示单词j出现在单词iii上下文中的次数,f(x)f(x)f(x)表达式为:f(x)={(x/xmax⁡)αif x<xmax⁡1otherwise f(x)=\left\{\begin{array}{cl}{\left(x / x_{\max }\right)^{\alpha}} & {\text { if } x<x_{\max }} \\ {1} & {\text { otherwise }}\end{array}\right.f(x)={(x/xmax)α1ifx<xmaxotherwise

glove实战

比较好的开源库有:maciejkula/glove-python
使用方式与gensim类似,具体可以参考:极简使用︱Glove-python词向量训练与使用

3.4 Fasttext

fasttext模型框架类似于CBOW但是也有区别:

  • 输入:word2vec用的是上下文单词的one-hot编码;fasttext用的是一个sentence的单词向量同时包括subword, 字符级别n-gran向量
  • 中间层:word2vec使用的是求和;fasttext使用的是平均;
  • 输出:cbow输出目标词汇;fasttext输出文本分类标签
  • 与以上两者相比,速度快,使用层次softmax,使用subword对oov友好

关于FastText的原理参考:【论文复现】使用fastText进行文本分类

四、动态词向量模型

虽然前面介绍的几款词向量生成模型可以很有效地应用于各种任务,但是由于其词向量的固定表示导致面对一词多义问题没有很好的效果。于是就出现了一下几款更高级的预训练词向量。

NLP大杀器BERT模型解读里对elmo、gpt、bert等进行了较为high-level的介绍。

建议一定要看原始论文然后对着源码去读!!


以上~

NLP中的词向量总结与实战:从one-hot到bert相关推荐

  1. nlp中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert

    本文以QA形式对自然语言处理中的词向量进行总结:包含word2vec/glove/fastText/elmo/bert. 目录 一.文本表示和各词向量间的对比  1.文本表示哪些方法? 2.怎么从语言 ...

  2. NLP中的词向量及其应用

    https://www.toutiao.com/a6643219722961682947/ 2019-01-06 11:25:24 词向量基本上是一种单词表示形式,它将人类对语言的理解与机器的理解连接 ...

  3. bert获得词向量_NLP中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert

    作者:JayLou,NLP算法工程师 知乎专栏:高能NLP之路 https://zhuanlan.zhihu.com/p/56382372 本文以QA形式对自然语言处理中的词向量进行总结:包含word ...

  4. 词向量与词向量拼接_nlp中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert

    本文以QA形式对自然语言处理中的词向量进行总结:包含word2vec/glove/fastText/elmo/bert. 2020年更新:NLP预训练模型的全面总结JayLou娄杰:史上最全!PTMs ...

  5. BERT中的词向量指南

    2019-11-19 20:50:57 作者:Chris McCormick 编译:ronghuaiyang 导读 在本文中,我将深入研究谷歌的BERT生成的word embeddings,并向你展示 ...

  6. 神经网络 和 NLP —— 语言模型和词向量

    前段时间一口气读完了 NN4NLP,很是畅快,非常喜欢作者行文讲解的口吻和逻辑.大概两周读完,每页都有收获,读完后反而担心有所疏漏,知识太多留不住,索性从头来一遍,把学习过程的知识点和思考记录下来,也 ...

  7. bert获得词向量_BERT中的词向量指南

    作者:Chris McCormick 编译:ronghuaiyang 导读 在本文中,我将深入研究谷歌的BERT生成的word embeddings,并向你展示如何通过BERT生成自己的word em ...

  8. NLP(4) | 用词向量技术简单分析红楼梦人物关系用n-gramma生成词向量word2vect进行模型训练

    NLP(1) | 词向量one hot编码词向量编码思想 NLP(2) | 中文分词分词的概念分词方法分类CRFHMM分词 NLP(3)| seq to seq 模型 前言:出于种种原因,总是不自觉把 ...

  9. 【NLP】fastText词向量与文本分类工具

    一.简介 fastText 是 Facebook 于2016年开源的一个词向量训练与文本分类工具,其典型应用场景是"无监督的词向量学习"和"有监督的文本分类". ...

最新文章

  1. 进一步封装axios并调用其读取数据(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)
  2. 分布式锁-zk临时节点
  3. springboot通过Intellij指定端口
  4. when is backend date format set in Javascript DateFormat
  5. 前端学习(1383):多人管理项目3
  6. 艾宾浩斯记忆表格excel_Excel全年学习复习计划表(艾宾浩斯遗忘曲线)
  7. Python+Selenium+Firefox配置,及可以启动浏览器,不能自动输入地址
  8. 智慧数字门店管理系统、PAD、门店系统、收银开单、预约服务、会员管理、账单管理、数据统计、商品、库存、美容美体、美甲美睫、医疗美容、美发造型、医疗诊所、中医理疗、宠物服务、美业、经营业务、售卡、交班
  9. 模型类型与加速潜力的关系
  10. ios 获取沙盒文件名_IOS获取各种文件目录路径的方法
  11. Pytorch——Window上Pytorch的安装教程
  12. Linux 常用名利总结
  13. Buddy分配器之释放一页
  14. 年度最骚语言之文言文编程!!!
  15. 恢复手机HTML文件,easyrecovery恢复手机误删文件方法
  16. VMware Workstation 蓝屏
  17. 永续合约短线交易技巧?
  18. joda-time 文档的部分翻译
  19. python时间函数纳秒_python 时间 纳秒_Pandas时间序列(翻译)
  20. 《正则表达式深入浅出》开放下载,快快收藏!

热门文章

  1. SAP License:谈对财务人的解惑
  2. SAP License:SAP一个成功的案例之跳槽者必看
  3. 信贷常用风控报表(一)
  4. redis linux中的安装
  5. Hadoop单机环境搭建整体流程
  6. IOS UIImage
  7. 【转】TestNG常用注解
  8. Chrome安装Vue.js devtool 4.1.4_0
  9. Ubuntu-安装MySQL5.7并配置用户名密码
  10. iOS之LLDB常用调试命令