Lecture 13: Contextual Word Representations and Pretraining

在这里插入图片描述

词的表示

  • 到目前为止,我们基本上说我们有一个词的表示
    • 之前学的:Word2vec, GloVe, fastText

Pre-trained word vectors: The early years
Collobert, Weston, et al. 2011 results
在这里插入图片描述
特征是POS的字符后缀和NER的词典

Pre-trained word vectors: Current sense (2014–)

  • 我们可以随机初始化词向量,然后在任务过程中训练它们
  • 但是在大多数情况下,预训练词向量的使用很有帮助,因为我们可以在更多的数据上训练更多的词。
    在这里插入图片描述

Tips for unknown words with word vectors

  • 最简单也最常见的解决方法
    • 训练时:词汇表是 { 5 w o r d s } { < U N K > } \{出现5次以上的words\} \bigcup \{<UNK>\}
    • 将所有的出现次数小于5次的word全映射成 < U N K > <UNK> ,只为其训练一个词向量
    • 运行时:当出现OOV词汇(未登录词)时使用 < U N K > <UNK>
  • 问题:
    • 没有方法区分UNK words,身份和含义都无法区分
  • 解决方法
    1. 使用我们刚学的char-level models
      尤其在类似QA的应用中match on word identity 是很重要的,即使词向量词汇表以外的单词
    2. 尝试下面的技巧(from Dhingra, Liu, Salakhutdinov, Cohen 2017)
      a. 如果测试时的 < U N K > <UNK> 单词不在你的词汇表中,但是出现在你使用的无监督词嵌入中,测试时直接使用这个向量
      b.此外,你可以将其视为新的单词,并为其分配一个随机向量,将它们添加到你的词汇表。
  • a确实帮助很大,b可能有点帮助
  • 你可以尝试的其他方法:
    • 将它们分解为词类(如未知号码,大写等等),每种都对应一个 < U N K c l a s s > <UNK-class>
  • 存在两个问题
    • 无论单词标记出现在什么上下文中,对于一个单词类型总是相同的表示形式
      • 我们可能需要非常精细的词义消歧
    • 我们对一个单词只有一个表示形式,但是单词有不同的方面,包括语义、句法行为和表达/含义

Did we all along have a solution to this problem?

  • 在一个神经语言模型(NLM)中,我们立即将词向量(或许只在预料上训练过)输入到LSTM层中
  • 那些LSTM层被训练来预测下一个词
  • 但这些语言模型在每一个位置生成特定于上下文的词表示

为词向量加入上下文信息

Peters et al. (2017): TagLM–“Pre-ELMo”
https://arxiv.org/pdf/1705.00108.pdf

  • 想法:在上下文中想要单词的意思,但是标准地只在标记了数据的小任务上学习任务RNN(例如,NER)
  • 为什么我们不采用半监督的方法来训练大规模的未标记语料库上的NLM,而不仅仅是词向量呢?

Tag LM

在这里插入图片描述

  • 与上文无关的单词嵌入 + RNN LM 得到的 hidden states 作为特征输入

在这里插入图片描述
h k , 1 = [ h k , 1 ; h k , 1 ; h k L M ] h_{k,1} = [\vec h_{k,1}; h_{k,1} ; h^{LM}_k]

  • Char CNN / RNN + Token Embedding 作为 bi-LSTM 的输入
  • 得到的 hidden states 与 Pre-trained bi-LM(冻结的) 的 hidden states 连接起来输入到第二层的 bi-LSTM 中

Named Entity Recognition (NER)

  • NLP中重要的的子任务之一:找到并分类文本中的names,例如:
    在这里插入图片描述

CoNLL 2003 Named Entity Recognition (ennews testb)
在这里插入图片描述

Peters et al. (2017): TagLM–“Pre-ELMo”

  • 语言模型在“Billion word benchmark”的8亿个训练单词上训练

  • 语言模型的观察结果

    • 在监督数据集上训练的LM并不会受益
    • 双向LM仅有助于 forward 过程,提升约0.2
    • 具有巨大的 LM 设计(困惑度 30) 比较小的模型(困惑度 48)提升约0.3
  • 任务特定的BiLSTM观察结果
    仅使用LM嵌入来预测并不是很好:88.17 F1

    • 远低于仅在标记数据上使用 BiLSTM 标记器

Also in the air: McCann et al. 2017: CoVe
https://arxiv.org/pdf/1708.00107.pdf

  • 同样也有使用训练好的序列模型为其他NLP模型提供上下文的想法
  • 想法:机器翻译意味着保留意义,所以或许这是一个好的目标?
  • 使用一个两层的BiLSTM来为encoder为seq2seq + attention的NMT系统提供上下文语义
  • 所得到的 CoVe 向量在各种任务上都优于 GloVe 向量
  • 但是,结果并不像其他幻灯片中描述的更简单的NLM培训那么好,所以似乎被放弃了
    • 或许NMT比语言建模要难
    • 获取有一天这个想法会重新出现

ELMo

Peters et al. (2018): ELMo: Embeddings from Language Models
Deep contextualized word representations. NAACL 2018. https://arxiv.org/abs/1802.05365

  • 使用长文本(这里是整个句子,甚至更长)而不是context windows学习词向量
  • 学习一个深度Bi-NLM(双向的神经语言模型),并且在预测中使用它的所有层的隐藏状态
  • 目标在于performant(表现)而不是更大的LM
    • 使用2个BiLSTM层
    • 使用character CNN来建立初始词表示(仅使用)
      • 2048 个 char n-gram filters 和 2 个 highway layers,512 维的 projection
    • 4096 dim hidden/cell LSTM状态,使用 512 dim的对下一个输入的投影
    • 使用残差连接
    • 绑定 token 的输入和输出的参数(softmax),并将这些参数绑定到正向和反向LMs之间
  • ELMo学习biLM表示的特定任务组合
  • 这是一个创新,TagLM 中仅仅使用堆叠LSTM的顶层,ELMo 认为BiLSTM所有层都是有用的
  • 详细来说,对于N个标记 ( t 1 , t 2 , t N (t_1,t_2,t_N ,forward language model学习的是根据 ( t 1 , t 2 , , t k 1 (t_1,t_2,···,t_{k-1} 的信息推测 t k t_k 的概率:
    在这里插入图片描述
    而 backward language model学习的是依据 ( t k + 1 , t k + 2 , , t N ) (t_{k+1},t_{k+2},···,t_N) 的信息推测 t k t_k 的概率:
    在这里插入图片描述
    而bidirectional LSTM就是将两者结合起来,其目标是最大化:
    在这里插入图片描述
    对于k位置的标记,ELMO模型用2L+1个向量来表示,其中1个是不依赖于上下文的表示,通常是用之前提及的word embedding或者是基于字符的CNN来得到 x k L M x^{LM}_k ,L层forward LSTM每层会产生一个依赖于上文的表示 h k , j L M , j = 1 , , L \vec h^{LM}_{k,j},j = 1,···,L 。L层backward LSTM没层会产生一个依赖于上下文表示的在这里插入图片描述
    可将其记为:
    在这里插入图片描述
    γ t a s k \gamma^{task} 衡量ELMo对任务的总体有用性,是为特定任务学习的全局比例因子
    s t a s k s^{task} 是 softmax 归一化的混合模型权重,是 BiLSTM 的加权平均值的权重,对不同的任务是不同的,因为不同的任务对不同层的 BiLSTM 的

Peters et al. (2018): ELMo: Use with a task

  • 首先运行biLM获取每个词的表示
  • 然后让最终任务模型使用
    • 冻结ELMo的权重,用于监督模型
    • 将ELMo权重连接到特定于任务的模型中
      • 细节取决与任务
        像 TagLM 一样连接到中间层是典型的
        可以在产生输出时提供更多的表示,例如在问答系统中

ELMo used in a sequence tagger

在这里插入图片描述
在这里插入图片描述
ELMoresults: Great for all tasks
在这里插入图片描述

  • 将ELMo表示加入其他任务模型,使得其他任务上的模型表现也提升了许多

ELMo: Weighting of layers

  • 两层biLSTM NLM有不同的作用
    • 低层更适合低级语法,例如
      词性标注(part-of-speech tagging)、句法依赖(syntacticdependency)、NER
    • 高层更适合更高级别的语义
      情绪、Semantic role labeling 语义角色标记 、question answering、SNLI
  • 这看起来很有意思,但是看看它是如何在两层以上的网络中发展起来的似乎更有趣

ULMfit(NLP中的迁移学习)

Howard and Ruder (2018) Universal Language Model Fine-tuning for Text Classification. https://arxiv.org/pdf/1801.06146.pdf

  • 与迁移NLM知识的一般思路是一样的
  • 这里应用于文本分类
    在这里插入图片描述
  • 在大型通用领域的无监督语料库上使用 biLM 训练
  • 在目标任务数据上调整 LM
  • 对特定任务将分类器进行微调
    在这里插入图片描述
  • ULMfit emphases
    • 使用合理大小的“1 GPU”语言模型,并不是真的很大
    • 在LM调优中要注意很多
      • 不同的每层学习速度
      • 倾斜三角形学习率(STLR)计划
  • 学习分类器时逐步分层解冻和STLR
  • 使用 [ h T , m a x p o o l ( h ) , m e a n p o o l ( h ) ] [h_T, maxpool(h),meanpool(h)] 进行分类
  • 详细介绍:https://www.jianshu.com/p/5b680f4fb2f2

ULMfit performance
在这里插入图片描述

将模型规模扩大

在这里插入图片描述

  • 其中后三个使用了transformer
  • Transformer 不仅很强大,而且允许扩展到更大的尺寸

GPT-2 language model (cherry-picked) output
在这里插入图片描述

Transformers基础

motivation:之前也谈到过。我们想要并行计算,但RNN天生含有序列性。另一个重要的事实是,尽管GRUs和LSTMs能够捕捉到较长距离的依赖关系,但是要想捕捉更远距离的依赖关系则需要attention的帮助。那么,既然attention能够让我们接触到任何时间步的状态(能帮助我们获得远距离依赖),我们或许可以使用attention,而不使用RNN

Transformer Overview

Attention is all you need. 2017. Aswani, Shazeer, Parmar, Uszkoreit, Jones, Gomez, Kaiser, Polosukhin
https://arxiv.org/pdf/1706.03762.pdf
在这里插入图片描述

  • Non-recurrent sequence-tosequence encoder-decoder model
  • 任务:使用平行语料的机器翻译
  • 预测每个翻译单词
  • 最终成本/误差函数是 softmax 分类器基础上的标准交叉熵误差

Transformer Basics
自学材料:http://nlp.seas.harvard.edu/2018/04/03/attention.html
The Annotated Transformer by Sasha Rush

Dot-Product Attention(扩展之前的定义)

  • 输入:a query q and a set of key-value (k-v) pairs to an output
  • Query, keys, values, and output are all vectors
  • 输出(ouput)是values的加权和,每个value的权值通过query和相应的key的内积计算得来(使用了softmax)
  • querys和keys有相同的维度 d k d_k ,value的维度为 d v d_v
    在这里插入图片描述
    Dot-Product Attention –Matrix notation
  • 当我们有多个query q时,将其stack到一个矩阵Q中:
    在这里插入图片描述
  • Q K T QK^T 的结果为:第 i 行数字表示 q i q_i 和所有key的内积,经过softmax就得到每个value的

Scaled Dot-Product Attention
在这里插入图片描述

  • 问题:当 d k d_k 变大时, q T k q^Tk 的方差也或变大–》在softmax中的某些值增大–》softmax得到的是峰值–》因此它的梯度将变小(不太懂
  • 解决方法:通过query/key向量的长度进行缩放
    在这里插入图片描述

Self-attention in the encoder

  • 输入的词向量是queries,keys和values
  • 换句话说:这些词向量自己相互选择
  • 词向量堆栈 = Q = K = V
  • 我们将在decoder中看到,我们为什么在定义中将它们分开

Multi-head attention
在这里插入图片描述
self-attention中的问题:

  • 对词来说只有一种方式与其他词交互
  • 解决方法:Multi-head attention
    • 首先使用一些矩阵将 Q , K , V Q,K,V 映射到 h = 8 的许多低维空间
    • 然后使用attention,最后将输出拼接在一起通过一个线型层
      在这里插入图片描述

Complete transformer block
在这里插入图片描述

  • 每个block都有两个子层
    • 多头注意力
    • 两层的前馈神经网络(使用ReLU)
  • 两个子层都含有
    • 残差连接和层归一化,Residual (short-circuit) connection and LayerNorm
      LayerNorm(x + Sublayer(x))
      在每层和每个训练点(增加两个参数),层归一化将输入转化为平均值为0,方差为1
      在这里插入图片描述
      其中 a i l a^l_i 是第l层,第 i 个输入, μ l \mu^l 为第l层输入的平均值, σ l \sigma^l 是第l层输入的方法,最后一个式子中b是偏置, g i g_i 是在非线性激活函数之前对归一化激活进行缩放的增益参数。
      归一化简介:https://www.jiqizhixin.com/graph/technologies/edceaca3-7a3d-42b3-9189-d80b8b99a6ad
      层归一化:https://arxiv.org/pdf/1607.06450.pdf

Encoder Input

  • 实际中,词表示是byte-pair encodings
  • 也加入了位置编码,所以相同的词在不同的位置有不同的整体表示
    在这里插入图片描述

Complete Encoder
在这里插入图片描述

  • 对于encoder,在每个block中,我们使用相同的 Q , K , V Q,K,V ,来自上一层
  • block重复6次(在垂直方向)
  • 在每个阶段,你可以通过多头注意力看到句子中的各个地方,累积信息并将其推送到下一层。在任一方向上的序列逐步推送信息来计算感兴趣的值
  • 非常善于学习语言结构

Attention visualization in layer 5

  • 词开始以合理的方式关注其他词
  • 不同颜色表示不同注意力头
    在这里插入图片描述

Attention visualization: Implicit anaphora resolution
在这里插入图片描述

  • 对于代词,注意力头学会了如何找到其先行词
  • 在第五层中,从 head 5 和 6 的单词“its”中分离出来的注意力。请注意,这个词的注意力是非常鲜明的。

Transformer Decoder
在这里插入图片描述

  • decoder 中有两个稍加改变的子层
  • 对之前生成的输出进行 Masked decoder self-attention
    在这里插入图片描述
  • Encoder-Decoder 注意力,queries来自前一层的decoder 层,并且keys和values来自encoder的输出
    在这里插入图片描述
  • block同样重复6次

Tips and tricks of the Transformer

一些细节(在论文/或之后的课程中):

  • Byte-pair encodings
  • Checkpoint averaging
  • Adam 优化器控制学习速率变化
  • 训练时,在每一层添加残差之前进行 Dropout
  • 标签平滑
  • 带有束搜索和长度惩罚的 Auto-regressive decoding
  • 虽然 transformer 正在传播开来,但他们很难优化并且不像LSTMs那样开箱即用,他们还不能很好与其他任务的构件共同工作

Experimental Results for MT
在这里插入图片描述
Experimental Results for Parsing
在这里插入图片描述

BERT:

Devlin, Chang, Lee, Toutanova (2018)
BERT (Bidirectional Encoder Representations from Transformers): Pre-training of Deep Bidirectional Transformers for Language Understanding

  • 问题:语言模型通常只使用左边的上下文或右边的上下文,但是语言理解是双向的
  • 语言模型为什么是单向的?
    • reason1:需要方向性来生成一个良好的概率分布。
    • reason2:在一个双向encoder中,词可以”看到自己“,例如右下图中,第二层的"open"以经具有"a"的信息了(从第一层的反向中得来),此时通过第二层的"open"来预测"a"就存在自己看到自己的问题。
      在这里插入图片描述
  • 解决方法:Mask掉k%的输入单词,然后预测这些被mask掉的单词
    k一般取15%
    在这里插入图片描述
    若mask的太少:训练花销太大
    若mask太多:没有足够的上下文信息

架构:
在这里插入图片描述
BERT complication: Next sentence prediction

学习句子之间的关系,预测句子B是句子A的下一句还是随机的句子。
在这里插入图片描述
BERT sentence pair encoding
bert编码句子对
在这里插入图片描述

  • Token embeddings是word pieces(OOV单词会被划分成几部分,如:paly,##ing)
  • 使用学习好的分段嵌入表示每个句子(第一个句子使用一个编码如0,第二个句子使用一个编码如1)
  • 位置嵌入与其他 Transformer 体系结构类似
  • 将以上三种 embedding 相加,作为最终输入的表示

BERT model architecture and training

  • transformer encoder(与之前相同)
  • self-attention–>没有位置偏差
    • 长距离上下文有”相等的机会“
    • 每层单独的乘法–>GPU/TPU上效率高
  • 使用 Wikipedia + BookCorpus 训练
  • 训练两个大小的模型
    • BERT-Base: 12-layer, 768-hidden, 12-head
    • BERT-Large: 24-layer, 1024-hidden, 16-head
  • 在4×4或8×8 TPU片训练4天

BERT model fine tuning
用于下游任务时,简单的在最顶层建立一个与你的任务相关的分类器,然后fine tuning这个分类器即可
在这里插入图片描述
BERT results on GLUE tasks

  • GLUE benchmark以自然语言推理任务为主,同时也具有句子的相似性和情感性
  • MutiNLI(NIL:natural language inference )
    • 前提: Hills and mountains are especially sanctified in Jainism.
    • 假设:Jainism hates nature.
    • 标签 :Contradiction
    • 是一个三分类的任务,标签可能为“与前提矛盾”、“与前提不矛盾”、“与前提无关”
  • Cola
    • Sentence: The wagon rumbled down the road. Label: Acceptable
    • Sentence: The car honked down the road. Label: Unacceptable

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Size matters

  • 模型参数从110M涨到340M表现确实很好
  • 改善还没有接近尾声
    在这里插入图片描述

总结

  • 词表示的发展历程:
    • 使用window context训练词向量
    • 使用RNN-LM训练词向量(获得基于特定上下文的表示)
    • 为词向量加入上下文信息(Tag LM),预训练一个NLM,将NLM得到的上下文表示(顶层)与普通词向量拼接作为最终表示
    • 将预训练的NLM的不同层的隐藏状态都作为表示(ELMo)
    • Transformer:使用注意力来代替RNN
  • Transformer基础
    • 位置编码
    • 多头注意力(将Q,K,V映射到许多不同的低维空间中,然后分别求自注意力表示)
    • Scaled Dot-Product Attention
    • 残差连接和层归一化
  • bert:
    • 使用Transomer作为基础部件
    • 双向LM,使用mask来避免“自己看到自己”的问题
    • 任务:预测mask掉的单词和下一句预测
    • 输入(句子对)有三部分:位置编码、句子编码、词表示(word piece)
发布了30 篇原创文章 · 获赞 10 · 访问量 7209

猜你喜欢

转载自blog.csdn.net/weixin_42017042/article/details/104228394
今日推荐