文章目录
词的表示
- 到目前为止,我们基本上说我们有一个词的表示
- 之前学的: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次的word全映射成 ,只为其训练一个词向量
- 运行时:当出现OOV词汇(未登录词)时使用
- 问题:
- 没有方法区分UNK words,身份和含义都无法区分
- 解决方法
- 使用我们刚学的char-level models
尤其在类似QA的应用中match on word identity 是很重要的,即使词向量词汇表以外的单词 - 尝试下面的技巧(from Dhingra, Liu, Salakhutdinov, Cohen 2017)
a. 如果测试时的 单词不在你的词汇表中,但是出现在你使用的无监督词嵌入中,测试时直接使用这个向量
b.此外,你可以将其视为新的单词,并为其分配一个随机向量,将它们添加到你的词汇表。
- 使用我们刚学的char-level models
- a确实帮助很大,b可能有点帮助
- 你可以尝试的其他方法:
- 将它们分解为词类(如未知号码,大写等等),每种都对应一个
- 存在两个问题
- 无论单词标记出现在什么上下文中,对于一个单词类型总是相同的表示形式
- 我们可能需要非常精细的词义消歧
- 我们对一个单词只有一个表示形式,但是单词有不同的方面,包括语义、句法行为和表达/含义
- 无论单词标记出现在什么上下文中,对于一个单词类型总是相同的表示形式
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 作为特征输入
- 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个标记
,forward language model学习的是根据
的信息推测
的概率:
而 backward language model学习的是依据 的信息推测 的概率:
而bidirectional LSTM就是将两者结合起来,其目标是最大化:
对于k位置的标记,ELMO模型用2L+1个向量来表示,其中1个是不依赖于上下文的表示,通常是用之前提及的word embedding或者是基于字符的CNN来得到 ,L层forward LSTM每层会产生一个依赖于上文的表示 。L层backward LSTM没层会产生一个依赖于上下文表示的
可将其记为:
衡量ELMo对任务的总体有用性,是为特定任务学习的全局比例因子
是 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
- 使用 进行分类
- 详细介绍:https://www.jianshu.com/p/5b680f4fb2f2
ULMfit performance
- ULMfit迁移学习
深度学习中的半监督:https://zhuanlan.zhihu.com/p/33196506
将模型规模扩大
- 其中后三个使用了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有相同的维度
,value的维度为
Dot-Product Attention –Matrix notation - 当我们有多个query q时,将其stack到一个矩阵Q中:
- 的结果为:第 i 行数字表示 和所有key的内积,经过softmax就得到每个value的
Scaled Dot-Product Attention
- 问题:当 变大时, 的方差也或变大–》在softmax中的某些值增大–》softmax得到的是峰值–》因此它的梯度将变小(不太懂)
- 解决方法:通过query/key向量的长度进行缩放
Self-attention in the encoder
- 输入的词向量是queries,keys和values
- 换句话说:这些词向量自己相互选择
- 词向量堆栈 = Q = K = V
- 我们将在decoder中看到,我们为什么在定义中将它们分开
Multi-head attention
self-attention中的问题:
- 对词来说只有一种方式与其他词交互
- 解决方法:Multi-head attention
- 首先使用一些矩阵将 映射到 h = 8 的许多低维空间
- 然后使用attention,最后将输出拼接在一起通过一个线型层
Complete transformer block
- 每个block都有两个子层
- 多头注意力
- 两层的前馈神经网络(使用ReLU)
- 两个子层都含有
- 残差连接和层归一化,Residual (short-circuit) connection and LayerNorm
LayerNorm(x + Sublayer(x))
在每层和每个训练点(增加两个参数),层归一化将输入转化为平均值为0,方差为1
其中 是第l层,第 i 个输入, 为第l层输入的平均值, 是第l层输入的方法,最后一个式子中b是偏置, 是在非线性激活函数之前对归一化激活进行缩放的增益参数。
归一化简介:https://www.jiqizhixin.com/graph/technologies/edceaca3-7a3d-42b3-9189-d80b8b99a6ad
层归一化:https://arxiv.org/pdf/1607.06450.pdf
- 残差连接和层归一化,Residual (short-circuit) connection and LayerNorm
Encoder Input
- 实际中,词表示是byte-pair encodings
- 也加入了位置编码,所以相同的词在不同的位置有不同的整体表示
Complete Encoder
- 对于encoder,在每个block中,我们使用相同的 ,来自上一层
- 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)