斯坦福NLP课程 | 第13讲 - 基于上下文的表征与NLP预训练模型(ELMo, transformer)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
语种识别,语种识别 100万字符
NLP自然语言处理_基础版,每接口每天50万次
简介: NLP课程第13讲介绍了词向量 (word representations) 知识回顾、ELMo模型、ULMfit模型、Transformer结构和BERT等。

ShowMeAI研究中心

作者:韩信子@ShowMeAI,路遥@ShowMeAI,奇异果@ShowMeAI
教程地址http://www.showmeai.tech/tutorials/36
本文地址http://www.showmeai.tech/article-detail/250
声明:版权所有,转载请联系平台与作者并注明出处
收藏ShowMeAI查看更多精彩内容


基于上下文的表征与NLP预训练模型
ShowMeAI斯坦福CS224n《自然语言处理与深度学习(Natural Language Processing with Deep Learning)》课程的全部课件,做了中文翻译和注释,并制作成了GIF动图!视频和课件等资料的获取方式见文末


引言

基于上下文的词嵌入(ELMo,transformer,BERT)

授课计划

授课计划

  • Reflections on word representations / 词向量知识回顾
  • Pre-ELMo and ELMO / ELMo模型
  • ULMfit and onward / ULMfit模型
  • Transformer architectures / Transformer结构
  • BERT / BERT

1.词向量知识回顾

1.1 词向量表征

单词的表示

  • 现在我们可以获得一个单词的表示

    • 我们开始时学过的单词向量

      • Word2vec,GloVe,fastText

1.2 预训练的词向量

预训练的词向量:早期

  • POS和NER两种表征体系
  • 11个词窗,100个隐层神经元,在12w词上训练7周

预训练的词向量:当前 (2014年 -)

  • 我们可以随机初始化词向量,并根据我们自己的下游任务训练它们
  • 但在绝大多数情况下,使用预训练词向量是有帮助的,因为它们本身是自带信息的 (我们可以在更大体量的预训练语料上训练得到它们)

1.3 未知词的词向量应用建议

带词向量的未知词提示

  • 简单且常见的解决方案:
  • 训练时:词汇表 公式

    • 所有罕见的词 (数据集中出现次数小于 5) 都映射为 公式,为其训练一个词向量
  • 运行时:使用 公式 代替词汇表之外的词 OOV
  • 问题

    • 没有办法区分不同 UNK words,无论是身份还是意义

未知词的词向量应用建议

解决方案

  1. 使用字符级模型学习词向量

    • 特别是在 QA 中,match on word identity 是很重要的,即使词向量词汇表以外的单词
  2. 尝试这些建议 (from Dhingra, Liu, Salakhutdinov, Cohen 2017)

    • 如果测试时的 公式 单词不在你的词汇表中,但是出现在你使用的无监督词嵌入中,测试时直接使用这个向量
    • 此外,你可以将其视为新的单词,并为其分配一个随机向量,将它们添加到你的词汇表
    • 帮助很大或者也许能帮点忙
  • 你可以试试另一件事

    • 将它们分解为词类 (如未知号码,大写等等),每种都对应一个 公式

1.4 单词的表示

单词的表示

存在两个大问题

  • 对于一个 word type 总是是用相同的表示,不考虑这个 word token 出现的上下文

    • 我们可以进行非常细粒度的词义消歧
  • 我们对一个词只有一种表示,但是单词有不同的方面,包括语义,句法行为,以及表达 / 含义

1.5 我们一直都有解决这个问题的办法吗?

我们一直都有解决这个问题的办法吗?

  • 在NLM中,我们直接将单词向量 (可能只在语料库上训练) 插入LSTM层
  • 那些LSTM层被训练来预测下一个单词
  • 但这些语言模型在每一个位置生成特定于上下文的词表示

1.6 #论文解读

#论文解读#

1.7 标签语言模型 (Tag LM )

标签语言模型 (Tag LM )

  • 步骤3:在序列标记模型中同时使用单词嵌入和 LM 嵌入
  • 步骤2:为输入序列中的每个标记准备单词嵌入和 LM 嵌入
  • 步骤1:预训练词嵌入和语言模型
  • 与上文无关的单词嵌入 + RNN model 得到的 hidden states 作为特征输入

标签语言模型 (Tag LM )

公式

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

1.8 命名实体识别 (NER)

命名实体识别 (NER)

  • 一个非常重要的NLP子任务:查找分类文本中的实体

1.9 CoNLL 2003命名实体识别 (en news testb)

CoNLL 2003命名实体识别 (en news testb)

1.10 #论文解读

#论文解读#

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

语言模型观察结果

  • 在监督数据集上训练的语言模型并不会受益
  • 双向语言模型仅有助于 forward 过程,提升约 0.2
  • 具有巨大的语言模型设计 (困惑度 30) 比较小的模型 (困惑度 48) 提升约 0.3

任务特定的BiLSTM观察结果

  • 仅使用LM嵌入来预测并不是很好:88.17 F1

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

1.11 #论文解读

#论文解读#

  • 思路:机器翻译是为了保存意思,所以这也许是个好目标?
  • 使用 seq2seq + attention NMT system 中的 Encoder,即 2 层 bi-LSTM,作为上下文提供者
  • 所得到的 CoVe 向量在各种任务上都优于 GloVe 向量
  • 但是,结果并不像其他幻灯片中描述的更简单的 NLM 训练那么好,所以似乎被放弃了

    • 也许NMT只是比语言建模更难?
    • 或许有一天这个想法会回来?

2.ELMo模型

2.1 #论文解读#ELMo

#论文解读#

  • Deep contextualized word representations. NAACL 2018.
  • word token vectors or contextual word vectors 的爆发版本
  • 使用长上下文而不是上下文窗口学习 word token 向量 (这里,整个句子可能更长)
  • 学习深度 Bi-NLM,并在预测中使用它的所有层

#论文解读#

  • 训练一个双向语言模型 (LM)
  • 目标是效果 OK 但不要太大的语言模型 (LM)

    • 使用 2 个 biLSTM 层
    • (仅) 使用字符CNN构建初始单词表示

      • 2048 个 char n-gram filters 和 2 个 highway layers,512 维的 projection
    • 4096 dim hidden/cell LSTM状态,使用 512 dim 的对下一个输入的投影
    • 使用残差连接
    • 绑定 token 的输入和输出的参数 (softmax),并将这些参数绑定到正向和反向语言模型 (LM) 之间

#论文解读#

  • ELMo 学习 biLM 表示的特定任务组合
  • 这是一个创新,TagLM 中仅仅使用堆叠 LSTM 的顶层,ELMo 认为 BiLSTM 所有层都是有用的

公式公式

  • 公式 衡量 ELMo 对任务的总体有用性,是为特定任务学习的全局比例因子
  • 公式 是 softmax 归一化的混合模型权重,是 BiLSTM 的加权平均值的权重,对不同的任务是不同的,因为不同的任务对不同层的 BiLSTM 的

#论文解读#

  • 首先运行 biLM 获取每个单词的表示
  • 然后,让 (无论什么) 最终任务模型使用它们

    • 冻结 ELMo 的权重,用于监督模型
    • 将 ELMo 权重连接到特定于任务的模型中

      • 细节取决于任务

        • 像 TagLM 一样连接到中间层是典型的
        • 可以在生产输出时提供更多的表示,例如在问答系统中

2.2 ELMo在序列标记器中的使用

ELMo在序列标记器中的使用

2.3 CoNLL 2003命名实体识别 (en news testb)

CoNLL 2003命名实体识别 (en news testb)

2.4 ELMo结果:适用于所有任务

ELMo结果:适用于所有任务

2.5 ELMo :层权重

ELMo :层权重

  • 这两个 biLSTM NLM 层有不同的用途 / 含义

    • 低层更适合低级语法,例如

      • 词性标注(part-of-speech tagging)、句法依赖(syntactic dependency)、NER
    • 高层更适合更高级别的语义

      • 情绪、语义角色标记、问答系统、SNLI
  • 这似乎很有趣,但它是如何通过两层以上的网络来实现的看起来更有趣

3.ULMfit模型

3.1 ULMfit

ULMfit

ULMfit

  • 在大型通用领域的无监督语料库上使用 biLM 训练

    • 在目标任务数据上调整 LM
    • 对特定任务将分类器进行微调
  • 使用合理大小的 1 GPU 语言模型,并不是真的很大
  • 在LM调优中要注意很多

    • 不同的每层学习速度
    • 倾斜三角形学习率 (STLR) 计划
  • 学习分类器时逐步分层解冻和STLR
  • 使用 公式 进行分类
  • 使用大型的预训练语言模型,是一种提高性能的非常有效的方法

3.2 ULMfit性能

ULMfit性能

  • 文本分类器错误率

3.3 ULMfit迁移学习

ULMfit迁移学习

  • 迁移学习

3.4 让我们扩大规模

让我们扩大规模

补充说明

  • 如果使用监督数据进行训练文本分类器,需要大量的数据才能学习好

3.5 GPT-2语言模型(cherry-picked)输出

GPT-2语言模型(cherry-picked)输出

补充说明

  • 文本生成的样例

3.6 GPT-2语言模型(cherry-picked)输出

GPT-2语言模型(cherry-picked)输出

4.Transformer结构

4.1 Transformer介绍

Transformer models

  • 所有这些模型都是以Transformer为主结构的,我们应该学习一下Transformer吧

补充说明

  • Transformer 不仅很强大,而且允许扩展到更大的尺寸

4.2 Transformers 动机

Transformers 动机

  • 我们想要并行化,但是RNNs本质上是顺序的
  • 尽管有 GRUs 和 LSTMs,RNNs 仍然需要注意机制来处理长期依赖关系——否则状态之间的 path length 路径长度 会随着序列增长
  • 但如果注意力让我们进入任何一个状态……也许我们可以只用注意力而不需要RNN?

4.3 Transformer 概览

Transformer 概览

  • 序列到序列编码解码模型,但它是非循环非串行结构
  • 任务:平行语料库的机器翻译
  • 预测每个翻译单词
  • 最终成本/误差函数是 softmax 分类器基础上的标准交叉熵误差

4.4 Transformer 基础

Transformer 基础

  • 现在:我们定义 Transformer 网络的基本构建块:第一,新的注意力层

4.5 点乘注意力 Dot-Product Attention

Dot-Product Attention 点乘注意力

  • 输入:对于一个输出而言的查询 公式 和一组键-值对 (公式)
  • Query,keys,values,and output 都是向量
  • 输出值的加权和
  • 权重的每个值是由查询和相关键的内积计算结果
  • Query 和 keys 有相同维数 公式,value 的维数为 公式公式

4.6 点乘注意力矩阵表示法

Dot-Product Attention 矩阵表示法

  • 当我们有多个查询 公式 时,我们将它们叠加在一个矩阵 公式

公式

4.7 缩放点乘注意力

Scaled Dot-Product Attention

  • 问题公式 变大时,公式 的方差增大 → 一些 softmax 中的值的方差将会变大 → softmax 得到的是峰值 → 因此梯度变小了
  • 解决方案:通过 query / key 向量的长度进行缩放

公式

4.8 编码器中的自注意力

编码器中的自注意力

  • 输入单词向量是 queries,keys and values
  • 换句话说:这个词向量自己选择彼此
  • 词向量堆栈= Q = K = V
  • 我们会通过解码器明白为什么我们在定义中将他们分开

4.9 多头注意力

Transformer多头注意力

  • 简单 self-attention 的问题

    • 单词只有一种相互交互的方式
  • 解决方案多头注意力
  • 首先,通过矩阵 公式公式公式公式 映射到 公式 的许多低维空间
  • 然后,应用注意力,然后连接输出,通过线性层

公式公式

4.10 完整的transformer模块

Complete transformer block

  • 每个 Block 都有两个 子层

    • 多头 attention
    • 两层的前馈神经网络,使用 ReLU
  • 这两个子层都

    • 残差连接以及层归一化
    • LayerNorm(x+Sublayer(x))
    • 层归一化将输入转化为均值是 公式,方差是 公式,每一层和每一个训练点 (并且添加了两个参数)

公式

4.11 编码器输入

Encoder Input

  • 实际的词表示是 byte-pair 编码
  • 还添加了一个 positional encoding 位置编码,相同的词语在不同的位置有不同的整体表征

公式

4.12 完整编码器Encoder

Complete Encoder

  • encoder 中,每个 Block 都是来自前一层的 公式公式公式
  • Blocks 被重复 6 次 (垂直方向)
  • 在每个阶段,你可以通过多头注意力看到句子中的各个地方,累积信息并将其推送到下一层。在任一方向上的序列逐步推送信息来计算感兴趣的值
  • 非常善于学习语言结构

4.13 第5层的注意力可视化

Attention visualization in layer 5

  • 词语开始以合理的方式关注其他词语
  • 不同的颜色对应不同的注意力头

4.14 注意力可视化

注意力可视化

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

4.15 Transformer解码器

Transformer解码器

  • decoder 中有两个稍加改变的子层
  • 对之前生成的输出进行 Masked decoder self-attention
  • Encoder-Decoder Attention,queries 来自于前一个 decoder 层,keys 和 values 来自于 encoder 的输出
  • Blocks 同样重复 6 次

4.16 Transformer的技巧与建议

Transformer的技巧与建议

细节(论文/之后的讲座)

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

4.17 Transformer机器翻译实验结果

Experimental Results for MT

4.18 Transformer解析任务实验结果

Experimental Results for Parsing

5.BERT模型

5.1 #论文解读# BERT

#论文解读# BERT

#论文解读# BERT

  • 问题:语言模型只使用左上下文或右上下文,但语言理解是双向的
  • 为什么LMs是单向的?

    • 原因1:方向性对于生成格式良好的概率分布是有必要的 [我们不在乎这个]
    • 原因2:双向编码器中单词可以 看到自己

#论文解读# BERT

  • 单向 与 双向 上下文对比

#论文解读# BERT

  • 解决方案:掩盖 公式 的输入单词,然后预测 masked words
  • 不再是传统的计算生成句子的概率的语言模型,目标是填空

    • 总是使用 公式
  • Masking 太少:训练太昂贵
  • Masking 太多:没有足够的上下文

#论文解读# BERT

  • GPT 是经典的单项的语言模型
  • ELMo 是双向的,但是两个模型是完全独立训练的,只是将输出连接在一起,并没有使用双向的 context
  • BERT 使用 mask 的方式进行整个上下文的预测,使用了双向的上下文信息

5.2 BERT 训练任务:预测下一句

BERT 训练任务:预测下一句

  • 学习句子之间的关系,判断句子 B 是句子 A 的后一个句子还是一个随机的句子。

5.3 BERT 句对编码

BERT 句对编码

  • token embeddings 是 word pieces (paly, ##ingpaly, ##ing)
  • 使用学习好的分段嵌入表示每个句子
  • 位置嵌入与其他 Transformer 体系结构类似
  • 将以上三种 embedding 相加,作为最终输入的表示

5.4 BERT 模型结构与训练

BERT 模型结构与训练

  • Transformer encoder (和之前的一样)
  • 自注意力 ⇒ 没有位置偏差

    • 长距离上下文 机会均等
  • 每层乘法 ⇒ GPU / TPU上高效
  • 在 Wikipedia + BookCorpus 上训练
  • 训练两种模型尺寸

    • BERT-Base: 12-layer, 768-hidden, 12-head
    • BERT-Large: 24-layer, 1024-hidden, 16-head
  • Trained on 4x4 or 8x8 TPU slice for 4 days

5.5 BERT 模型微调

BERT 模型微调

  • 只学习一个建立在顶层的分类器,微调的每个任务

5.6 BERT GLUE多任务结果

BERT GLUE多任务结果

  • GLUE benchmark 是由自然语言推理任务,还有句子相似度和情感
  • MultiNLI

    • Premise: Hills and mountains are especially sanctified in Jainism.
    • Hypothesis: Jainism hates nature.
    • Label: Contradiction
  • CoLa

    • Sentence: The wagon rumbled down the road. Label: Acceptable
    • Sentence: The car honked down the road. Label: Unacceptable

BERT results on GLUE tasks

5.7 CoNLL 2003命名实体识别 (en news testb)

CoNLL 2003命名实体识别 (en news testb)

5.8 BERT在SQuAD问答上的表现

BERT在SQuAD问答上的表现

5.9 BERT预训练任务效果

BERT预训练任务效果

5.10 BERT参数量级对效果影响

BERT参数量级对效果影响

  • 从 119M 到 340M 的参数量改善了很多
  • 随参数量提升还在提高

5.11 推荐阅读

Transformer与BERT推荐资料阅读

6.视频教程

可以点击 B站 查看视频的【双语字幕】版本

7.参考资料

ShowMeAI 系列教程推荐

NLP系列教程文章

斯坦福 CS224n 课程带学详解

ShowMeAI用知识加速每一次技术成长

目录
相关文章
|
11天前
|
机器学习/深度学习 自然语言处理 PyTorch
从零开始构建nlp情感分析模型!
本教程介绍了如何使用PyTorch和Hugging Face的Transformers库构建一个情感分析模型。主要内容包括导入所需库、读取训练数据集、加载预训练的BERT模型和分词器、定义情感数据集类、划分训练集和验证集、创建数据加载器、设置训练参数、训练模型、评估模型性能以及定义和测试预测函数。通过这些步骤,可以实现一个简单而有效的情感分析模型。
40 2
|
1月前
|
自然语言处理 PyTorch 算法框架/工具
掌握从零到一的进阶攻略:让你轻松成为BERT微调高手——详解模型微调全流程,含实战代码与最佳实践秘籍,助你应对各类NLP挑战!
【10月更文挑战第1天】随着深度学习技术的进步,预训练模型已成为自然语言处理(NLP)领域的常见实践。这些模型通过大规模数据集训练获得通用语言表示,但需进一步微调以适应特定任务。本文通过简化流程和示例代码,介绍了如何选择预训练模型(如BERT),并利用Python库(如Transformers和PyTorch)进行微调。文章详细说明了数据准备、模型初始化、损失函数定义及训练循环等关键步骤,并提供了评估模型性能的方法。希望本文能帮助读者更好地理解和实现模型微调。
68 2
掌握从零到一的进阶攻略:让你轻松成为BERT微调高手——详解模型微调全流程,含实战代码与最佳实践秘籍,助你应对各类NLP挑战!
|
1月前
|
机器学习/深度学习 自然语言处理 并行计算
探索深度学习中的Transformer模型及其在自然语言处理中的应用
【10月更文挑战第6天】探索深度学习中的Transformer模型及其在自然语言处理中的应用
85 0
|
1月前
|
人工智能 自然语言处理
【NLP自然语言处理】NLP中的常用预训练AI模型
【NLP自然语言处理】NLP中的常用预训练AI模型
|
1月前
|
机器学习/深度学习 自然语言处理 异构计算
【NLP自然语言处理】初识深度学习模型Transformer
【NLP自然语言处理】初识深度学习模型Transformer
|
1月前
|
机器学习/深度学习 自然语言处理 算法
【NPL自然语言处理】带你迅速了解传统RNN模型
【NPL自然语言处理】带你迅速了解传统RNN模型
|
3月前
|
机器学习/深度学习 自然语言处理 PyTorch
PyTorch与Hugging Face Transformers:快速构建先进的NLP模型
【8月更文第27天】随着自然语言处理(NLP)技术的快速发展,深度学习模型已经成为了构建高质量NLP应用程序的关键。PyTorch 作为一种强大的深度学习框架,提供了灵活的 API 和高效的性能,非常适合于构建复杂的 NLP 模型。Hugging Face Transformers 库则是目前最流行的预训练模型库之一,它为 PyTorch 提供了大量的预训练模型和工具,极大地简化了模型训练和部署的过程。
167 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术在自然语言处理中的应用与挑战
【10月更文挑战第3天】本文将探讨AI技术在自然语言处理(NLP)领域的应用及其面临的挑战。我们将分析NLP的基本原理,介绍AI技术如何推动NLP的发展,并讨论当前的挑战和未来的趋势。通过本文,读者将了解AI技术在NLP中的重要性,以及如何利用这些技术解决实际问题。
|
2月前
|
机器学习/深度学习 数据采集 自然语言处理
深度学习在自然语言处理中的应用与挑战
本文探讨了深度学习技术在自然语言处理(NLP)领域的应用,包括机器翻译、情感分析和文本生成等方面。同时,讨论了数据质量、模型复杂性和伦理问题等挑战,并提出了未来的研究方向和解决方案。通过综合分析,本文旨在为NLP领域的研究人员和从业者提供有价值的参考。
|
1月前
|
自然语言处理 算法 Python
自然语言处理(NLP)在文本分析中的应用:从「被动收集」到「主动分析」
【10月更文挑战第9天】自然语言处理(NLP)在文本分析中的应用:从「被动收集」到「主动分析」
48 4

热门文章

最新文章