最近在家听贪心学院的NLP直播课。都是比较基础的内容。放到博客上作为NLP 课程的简单的梳理。

本节课程主要讲解的是词向量和Elmo。核心是Elmo,词向量是基础知识点。

Elmo 是2018年提出的论文 《Deep contextualized word representtations》,在这篇论文中提出了很重要的思想Elmo,Elmo 是一种基于特征的语言模型,用预训练的语言模型,生成更好的特征。

Elmo是一种新型深度语境化词表征,可对词进行复杂特征(如句法和语义)和词在语言语境中的变化进行建模(即对多义词进行建模)。我们的词向量是深度双向语言模型biLM内部状态的函数,在一个大型文本语料库中预训练而成。

Elmo的主要做法是先训练一个完整的语言模型,再用这个语言模型去处理需要训练的文本,生成相应的词向量,所以在文中一直强调Elmo的模型对同一个字的不同句子中能生成不同的词向量。

在讲ELmo之前 我们先回顾一下词向量和语言模型,因为ELmo的提出 就是因为就语言模型的词向量 有一些缺点(主要是无法解决一词多意的问题),所以提出双向-深度-LSTM 的Elmo模型。这里的‘双向’是一个拼接而已,不是真正意义上的双向,所以XLNET 有permutation的改进实现真正的根据上下文内容的双向, 这里的‘深度’ 是横向和纵向的深度,因为深度 每层可以学习到不同的点,并且越深的层学的东西越具体。

1.词向量与语言模型

NLU 文本的量化表示方式





独热编码:能否表示单词之间的相似度? — 不能。因为通过任何一种方式(余弦相似度等)无法计算两两向量的相似度。

所以我们有了 词向量 (分布式表示的词向量)

独热编码: 稀疏向量,并且都是正交的。

词向量:稠密向量,分布式词向量。



类似的单词 都是聚集在一起的。当我们提取出某些词向量时,我们可以通过可视化来呈现出他们的关系。 可视化 T-SNE (sklearn里面有)这是一种降维的算法(针对词向量一般用TSNE),其他降维算法有PCA 等。







语言模型的目标是最大的话 一句话的 概率的。

基于前面几个单词预测下一个单词 这就是语言模型。



语言模型的基础:链式法则,马尔科夫,N元组,平滑方式,困惑度。



Global 方法:全局方法

Local 方法: 局部方法

基于LM的训练:基于语言模型的训练

基于非LM的训练:基于非语言模型的训练

1 Global vs Local

Global: 优势:全局. 缺点:计算量大,有新的文本的时候 需要更新。

Local: Skip Gram

  1. 基于LM vs 非基于LM



    对于Elmo: 语言模型-NNLM-层次表示-HMM-RNN-LSTM-BiLSTM-DeepBiLSTM-ELMO

    2.学习不同语境下的语义表示





    • 基于Distributional Hypothesis

      – Skip-Gram

      句子: 词向量 训练 方法 有 两种

      单词: W1 W2 W3 W4 W5

      windows = 1

      假设已知 w2, 预测出 w1 和 w3

      目标函数:Maximize P(w2|w1)P(w1|w2)P(w3|w2)P(w2…)

      – CBOW:

      通过 w1 和 w3 预测 w2

      目标函数: Maximize P(w2| w1,w3) P(w3| w2,w4)…

    • Language Model + HMM

      – NNLM:

      目标函数: Maximize P(w2|w1)P(w3|w2)



    上面句子里面的Back 是不同的意思。

    理解词向量 在不同语境下的含义 就是我们的目标。所以有了Elmo,Bert 等模型。



    正确答案是 ABCD。

    A是一种比较直观的 可行方案,每个单词多意,那么可以对应多个词向量。当然方法可行,不过具体执行问题有可能也很懂。

    B和C是相关的。example: I back my car, I heart my back. 首先对back计算一个基准向量 H_back 一对一的,如何计算2个back这个句子里面的含义分别是什么? H_back + ▲(基于上下文的偏移)

    3.基于LSTM 的词向量学习

    1. 基于LSTM 作为基石
    2. 深度,层次

    LSTM 来源于RNN, 因为RNN有些梯度爆咋的问题,所以提出了LSTM。

    目标函数 是一个 语言模型,输出层 通过softmax 获取 期望输出向量,然后 期望输出 和实际值(热独编码) 计算交叉熵,反向传播。



    下面是两个独立的 LSTM。不是一个真正的双向LSTM。



    为什么不是真正的双向 是因为只是把前向和反向 拼接起来的结果,不是完整意义上的双向。 所以后面Permutation(XLNET) 可以认为是真正的双向

    4.深度学习中的层次表示以及Deep BI-LSTM

    深度 : 可以从纵向和横向上深度。

    层次表示 可以看出 每层学出来的结果是不一样的。







    这个就是Deep-bi-LSTM

    基于LM方式来训练。

    5.ELMO模型



    Elmo 使用的是一个双向的LSTM语言模型,由一个前向和一个后向语言模型构成,目标函数就是取这两个方向语言模型的最大似然。

    语言模型的双向体现在对句子的建模:给定一个N个token的句子, t1,t2,t3...tN t_1,t_2,t_3...t_N" role="presentation">t1,t2,t3...tNt1,t2,t3...tN t_1,t_2,t_3...t_Nt1​,t2​,t3​...tN​。

    • 前向语言模型:从历史信息预测下一个词,即从给定的历史信息$(t_1,…,t_{k-1}) $ 建模下一个token 预测 tk t_k" role="presentation">tktk t_ktk​的概率 (这是前向LSTM)



      对于一个L层的LSTM, 设其输入是xkLM x^{LM}_k" role="presentation">xLMkxkLM x^{LM}kxkLM​(token embedding)每一层都会输出一个context-dependent representation (h⃗k,jLM \vec{h}^{LM}_{k,j}" role="presentation">h⃗ LMk,jh⃗k,jLM \vec{h}^{LM}{k,j}hk,jLM​), LSTM的最后一层输出为(h⃗k,LLM \vec{h}^{LM}_{k,L}" role="presentation">h⃗ LMk,Lh⃗k,LLM \vec{h}^{LM}{k,L}hk,LLM​),该输出会在Softmax layer被用来预测下一个token tk+1 t_{k+1}" role="presentation">tk+1tk+1 t_{k+1}tk+1​

    • 后向语言模型:从未来信息预测上一个词,即从给定的未来(tk+1,...tN t_{k+1},...t_N" role="presentation">tk+1,...tNtk+1,...tN t_{k+1},...t_Ntk+1​,...tN​)建模上一个token tk t_k" role="presentation">tktk t_ktk​的概率(反向LSTM)



      对于一个L层的LSTM, 设其输入是xkLM x^{LM}_k" role="presentation">xLMkxkLM x^{LM}kxkLM​(token embedding)每一层都会输出一个context-dependent representation 反向的(h⃗k,jLM \vec{h}^{LM}_{k,j}" role="presentation">h⃗ LMk,jh⃗k,jLM \vec{h}^{LM}{k,j}hk,jLM​), LSTM的最后一层输出为反向的(h⃗k,LLM \vec{h}^{LM}_{k,L}" role="presentation">h⃗ LMk,Lh⃗k,LLM \vec{h}^{LM}{k,L}hk,LLM​),该输出会在Softmax layer被用来预测下一个token tk−1 t_{k-1}" role="presentation">tk−1tk−1 t_{k-1}tk−1​

    双向语言模型是前向、后向的一个综合,通过两个方向的对数极大似然估计来完成:



    其中:

    • Θx \Theta_{x}" role="presentation">ΘxΘx \Theta_{x}Θx​是token embedding
    • Θs \Theta_{s}" role="presentation">ΘsΘs \Theta_{s}Θs​代表softmax layer的参数

    biLM利用了biLSTM,biLSTM在前向和后向两个方向上共享了部分权重

    对于一个token,ELMo会计算2L+1 个representation(输入的一个token embedding和前向、后向的2L个representation):



    其中:



    在下游任务中,ELMo将R的所有层压缩成一个向量ELMok=E(Rk;Θe) ELMo_k=E(R_k;Θe)" role="presentation">ELMok=E(Rk;Θe)ELMok=E(Rk;Θe) ELMo_k=E(R_k;Θe)ELMok​=E(Rk​;Θe) ,在最简单的情况下,也可以只使用最后一层E(Rk)=hk,LLM E(R_k)=h^{LM}_{k,L}" role="presentation">E(Rk)=hLMk,LE(Rk)=hk,LLM E(R_k)=h^{LM}{k,L}E(Rk​)=hk,LLM​



    其中



    可以看出,ELMo是biLM多层输出的线性组合。

    在监督NLP任务中使用Elmo

    在supervised NLP tasks中使用ELMo, 给定N个token的句子,supervised NLP处理的标准过程的输入是context-independent token词向量xk x_k" role="presentation">xkxk x_kxk​,加入ElMo有两种方式:

    1. 直接将ELMo词向量ELMok ELMo_k" role="presentation">ELMokELMok ELMo_kELMok​和普通词向量xk x_k" role="presentation">xkxk x_kxk​ 拼接得到[xk;ELMoktask] [x_k; ELMo_k^{task}]" role="presentation">[xk;ELMotaskk][xk;ELMoktask] [x_k; ELMo_k^{task}][xk​;ELMoktask​],作为模型的输入。
    2. 将ELMo词向量ELMok ELMo_k" role="presentation">ELMokELMok ELMo_kELMok​ 和隐藏层输出hk h_k" role="presentation">hkhk h_khk​ 进行拼接得到[hk;ELMoktask] [h_k; ELMo_k^{task}]" role="presentation">[hk;ELMotaskk][hk;ELMoktask] [h_k; ELMo_k^{task}][hk​;ELMoktask​]

    (一个单词在语境下的表示 就是所有层的加权平均。

    在预训练好这个语言模型之后,ELMo就是根据公式来用作词表示,其实就是把这个双向语言模型的每一中间层进行一个求和。最简单的也可以使用最高层的表示来作为ELMo。然后在进行有监督的NLP任务时,可以将ELMo直接当做特征拼接到具体任务模型的词向量输入或者是模型的最高层表示上。)

    6.总结

    • ELMo的假设前提一个词的词向量不应该是固定的,所以在一词多意方面ELMo的效果一定比word2vec要好。
    • word2vec的学习词向量的过程是通过中心词的上下窗口去学习,学习的范围太小了,而ELMo在学习语言模型的时候是从整个语料库去学习的,而后再通过语言模型生成的词向量就相当于基于整个语料库学习的词向量,更加准确代表一个词的意思。
    • ELMo还有一个优势,就是它建立语言模型的时候,可以运用非任务的超大语料库去学习,一旦学习好了,可以平行的运用到相似问题。

    Bert 是 AutoEncoder 通过上下文来预测中间mask单词,损失函数是ADE的损失函数,不是交叉熵损失。Bert 模型不是基于语言模型的,只是基于ADE。

    Elmo 是基于语言模型的。

第一节——词向量与ELmo(转)的更多相关文章

  1. NLP直播-1 词向量与ELMo模型

    翻车2次,试水2次,今天在B站终于成功直播了. 人气11万. 主要讲了语言模型.词向量的训练.ELMo模型(深度.双向的LSTM模型) 预训练与词向量 词向量的常见训练方法 深度学习与层次表示 LST ...

  2. NLP获取词向量的方法(Glove、n-gram、word2vec、fastText、ELMo 对比分析)

    自然语言处理的第一步就是获取词向量,获取词向量的方法总体可以分为两种两种,一个是基于统计方法的,一种是基于语言模型的. 1 Glove - 基于统计方法 Glove是一个典型的基于统计的获取词向量的方 ...

  3. NLP之词向量

    1.对词用独热编码进行表示的缺点 向量的维度会随着句子中词的类型的增大而增大,最后可能会造成维度灾难2.任意两个词之间都是孤立的,仅仅将词符号化,不包含任何语义信息,根本无法表示出在语义层面上词与词之 ...

  4. 词向量---ELMO

    1.ELMo(Embeddings from Language Models ) RNN-based language models(trained from lots of sentences) E ...

  5. Deep Learning In NLP 神经网络与词向量

    0. 词向量是什么 自然语言理解的问题要转化为机器学习的问题,第一步肯定是要找一种方法把这些符号数学化. NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representati ...

  6. 【paddle学习】词向量

    http://spaces.ac.cn/archives/4122/   关于词向量讲的很好 上边的形式表明,这是一个以2x6的one hot矩阵的为输入.中间层节点数为3的全连接神经网络层,但你看右 ...

  7. 词向量(one-hot/SVD/NNLM/Word2Vec/GloVe)

    目录 词向量简介 1. 基于one-hot编码的词向量方法 2. 统计语言模型 3. 从分布式表征到SVD分解 3.1 分布式表征(Distribution) 3.2 奇异值分解(SVD) 3.3 基 ...

  8. 词向量模型word2vector详解

    目录 前言 1.背景知识 1.1.词向量 1.2.one-hot模型 1.3.word2vec模型 1.3.1.单个单词到单个单词的例子 1.3.2.单个单词到单个单词的推导 2.CBOW模型 3.s ...

  9. 斯坦福NLP课程 | 第1讲 - NLP介绍与词向量初步

    作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/36 本文地址:http://www. ...

随机推荐

  1. 鼠标右键新建Markdown文档

    首先放一张github某项目中.md文件中的内容图片 Windows系统下,使用 Typora 软件来进入Markdown文档的编写非常容易,而且入门门槛非常的低 存在的问题: 习惯了使用Markdo ...

  2. Win10系统下MySQL压缩版安装配置教程

    MySQL分为安装版和压缩.为了以后MySQL出问题想重装时的各种不必要的麻烦,我个人推荐压缩版MySQL.下面进入教程: 进入官网下载MySQL压缩包,并解压如下 配置环境变量---将bin文件的目 ...

  3. 【转】Hibernate面试问题集锦: 概述

    ImportNew注: 本文是ImportNew编译整理的Java面试题系列文章之一.你可以从这里查看全部的Java面试系列. Q.怎么配置Hibernate? A.Configuration类使用配 ...

  4. three.js入门第一个案例

    准备工作 1.运用three.js进行3d开发,其实和页面编程一样,首先需要在html文件中引入three.js.Three.js使用面向对象的方式来构建程序,它包含3个基本对象: 场景(scene) ...

  5. MyEclipse导出war包丢失文件问题解决

    这两天忙于一项目的上线,现总结一下遇到的一个奇怪问题的解决方案. 公司用的是Windows系统的服务器,所以省去了很多linux的繁琐命令.部署工作简单了很多.一切准备结束,放上War包启动服务器后, ...

  6. Java单体应用 - Markdown - 03.高级技巧

    原文地址:http://www.work100.net/training/monolithic-markdown-advance.html 更多教程:光束云 - 免费课程 高级技巧 序号 文内章节 视 ...

  7. Codeforces940掉分记

    掉分经过 难得这次时间比较好,下午17:35开始. 本来还很高兴,心想这回肯定不会犯困,没准排名能再上升一些呢,,可惜事与愿违-- 上来a题,光看懂题就花了一些时间. 然后开始写,结果第一遍CE,第二 ...

  8. 玩转Django2.0---Django笔记建站基础十二(Django项目上线部署)

    第十二章 Django项目上线部署 目前部署Django项目有两种主流方案:Nginx+uWsGI+Django或者Apache+uWSGI+Django.Nginx作为服务器最前端,负责接收浏览器的 ...

  9. 玩转Django2.0---Django笔记建站基础五(模板)

    第五章 模板 Django作为web框架,需要一种很便利的方法去动态地生成HTML网页,因此有了模板这个概念.模板包含所需HTML的部分代码以及一些特殊语法 Django可以配置一个或多个模板引擎(甚 ...

  10. 数据结构与算法 --- js描述栈

    js描述栈及栈的使用 栈的特性就是只能通过一端访问,这一段就是叫做栈顶.咖啡馆内的一摞盘子就是最形象的栈的例子: 根据栈的特性,就可以定义栈的一些特殊属性和方法;用js的描述栈的时候底层数据结构用的是 ...