Datawhale八月组队学习--NLP入门之transformer--Day04-05

提示:本篇博客主要针对BERT、GPT模型的原理展开(模型详细细节请看论文),并针对下列问题给出自己的看法。
参考:参考原址

  • 问题一:BERT预训练时mask的比例,可以mask更大的比例吗?
  • 问题二:BERT如何进行tokenize操作?有什么好处?
  • 问题三:BERT模型特别大,单张GPU训练仅仅只能放入1个batch的时候,怎么训练?
  • 问题四:BERT训练的时候mask单词的比例可以特别大(大于80%)吗?
  • 问题五:BERT预训练是如何做mask的?
  • 问题六:GPT如何进行tokenize操作?和BERT的区别是什么?
  • 问题七:word2vec到BERT改进了什么?

文章目录

  • 一、BERT原理
    • 1.1 模型架构
    • 1.2 模型输入
    • 1.3 模型输出
  • 二、GPT原理
    • 2.1 了解GPT2
    • 2.2 输入编码
  • 三、问题回答
    • 1. BERT预训练时mask的比例,可以mask更大的比例吗?
    • 2. BERT如何进行tokenize操作?有什么好处?
    • 3. BERT模型特别大,单张GPU训练仅仅只能放入1个batch的时候,怎么训练?
    • 4. BERT训练的时候mask单词的比例可以特别大(大于80%)吗?
    • 5. BERT预训练是如何做mask的?
    • 6. GPT如何进行tokenize操作?和BERT的区别是什么?
    • 7. word2vec到BERT改进了什么?
  • 总结


一、BERT原理

提示:原文链接
   代码链接

1.1 模型架构

Datawhale八月组队学习--NLP入门之transformer--Day04-05_第1张图片
两种模型:

  • BERT-base:(L=12, H=768, A=12, Total Param-eters=110M)
  • BERT-large:(L=24, H=1024,A=16, Total Parameters=340M)
  • 2 种不同大小规模的 BERT 模型都有大量的 Encoder 层(论文里把这些层称为 Transformer Blocks)- BASE 版本由 12 层 Encoder,Large 版本有 20 层 Encoder。同时,这些 BERT 模型也有更大的前馈神经网络(分别有 768 个和 1024 个隐藏层单元)和更多的 attention heads(分别有 12 个和 16 个),超过了原始 Transformer 论文中的默认配置参数(原论文中有 6 个 Encoder 层, 512 个隐藏层单元和 8 个 attention heads)。

1.2 模型输入

  • 第一个输入的 token 是特殊的 [CLS],它 的含义是分类(class的缩写)
  • 第二个输入的token是第一个句子的Embedding,注:BERT 实际上使用了 WordPieces 作为 token,而不是使用单词本身。在 WordPiece 中,有些词会被拆分成更小的部分。
  • 第三个输入的token是特殊的[SEP],用来分隔两个句子

1.3 模型输出

  • 对于句子分类的例子,我们只关注第一个位置的输出(输入是 [CLS] 的那个位置)。这个输出的向量现在可以作为后面分类器的输入。论文里用单层神经网络作为分类器,取得了很好的效果。

二、GPT原理

2.1 了解GPT2

提示:论文链接
   代码链接

  • GPT-2,和后来的一些模型如 TransformerXL 和 XLNet,本质上都是自回归的模型。
  • GPT-2 能够处理 1024 个 token。每个 token 沿着自己的路径经过所有的 Decoder 模块。运行一个训练好的 GPT-2 模型的最简单的方法是让它自己生成文本(这在技术上称为 生成无条件样本)。或者,我们可以给它一个提示,让它谈论某个主题(即生成交互式条件样本)。在漫无目的情况下,我们可以简单地给它输入初始 token,并让它开始生成单词(训练好的模型使用 <|endoftext|> 作为初始的 token。我们称之为 )。
  • 模型只有一个输入的 token,因此只有一条活跃路径。token 在所有层中依次被处理,然后沿着该路径生成一个向量。这个向量可以根据模型的词汇表计算出一个分数。

2.2 输入编码

  • 在开始时,我们会在嵌入矩阵查找第一个 token 的 embedding,在把这个 embedding 传给模型的第一个模块之前,我们需要融入位置编码,这个位置编码能够指示单词在序列中的顺序。
  • 向上流动:第一个模块现在可以处理 token,首先通过 Self Attention 层,然后通过神经网络层。一旦 Transformer 的第一个模块处理了 token,会得到一个结果向量,这个结果向量会被发送到堆栈的下一个模块处理。每个模块的处理过程都是相同的,不过每个模块都有自己的 Self Attention 和神经网络层。

三、问题回答

1. BERT预训练时mask的比例,可以mask更大的比例吗?

  BERT采用的Masked LM,会选取语料中所有词的15%进行随机mask,论文中表示是受到完形填空任务的启发,但其实与CBOW也有异曲同工之妙。从CBOW的角度,这里 p = 15 % p = 15\% p=15%有一个比较好的解释是:在一个大小为 1 / p = 100 / 7 ≈ 5 1/p = 100/7\approx5 1/p=100/75的窗口中随机选一个词,类似CBOW中滑动窗口的中心词,区别是这里的滑动窗口是非重叠的。那从CBOW的滑动窗口角度,10%~20%都是还ok的比例。
答案原链接

2. BERT如何进行tokenize操作?有什么好处?

  BERT 实际上使用了 WordPieces 作为 token,而不是使用单词本身。在 WordPiece 中,有些词会被拆分成更小的部分。比如"loved",“loving”,"loves"这三个单词。其实本身的语义都是“爱”的意思,但是如果我们以单词为单位,那它们就算不一样的词,在英语中不同后缀的词非常的多,就会使得词表变的很大,训练速度变慢,训练的效果也不是太好。但很明显对于中文这种优势就不存在了。
参考链接

3. BERT模型特别大,单张GPU训练仅仅只能放入1个batch的时候,怎么训练?

  google 官方bert本身不支持分布式训练,因此有其他用户自己修改了一个版本分支,官方bert也接受了:
分支地址
代码地址
上述答案出自:此处

4. BERT训练的时候mask单词的比例可以特别大(大于80%)吗?

  不可以,
  上述答案出自:此处

5. BERT预训练是如何做mask的?

  1. 用一个特殊的符号替换句子中的一个词,我们用 "MASK "标记来表示这个特殊符号,你可以把它看作一个新字,这个字完全是一个新词,它不在你的字典里,这意味着mask了原文。
  2. 随机把某一个字换成另一个字。中文的 "湾"字被放在这里,然后你可以选择另一个中文字来替换它,它可以变成 "一 "字,变成 "天 "字,变成 "大 "字,或者变成 "小 "字,我们只是用随机选择的某个字来替换它。
    上述答案出自:此处

6. GPT如何进行tokenize操作?和BERT的区别是什么?

  GPT-2是:token embedding + prosition embedding;Bert是: token embedding + position embedding + segment embedding。

7. word2vec到BERT改进了什么?

   1. BERT根据上下文来学习对应的词嵌入,这样既能捕捉单词的语义信息,又能捕捉上下文的语义信息;
   2. ELMo 预训练词嵌入使用的是双向的LSTM模型,后transformer超越LSTM,能够更好的支持长句子的依赖;
   3. BERT采用transformer结构实现了并行计算,缩短了模型训练时长;
   4.NLP可以像计算机视觉领域那样进行迁移学习了。

总结

  通过对问题的回答,加深了对BERT、GPT模型的理解,之后的学习中应该学习一下这种学习方式,多问自己几个“为什么?”,最后感谢datawhale的开源学习。
请大家多多指正~

你可能感兴趣的:(pytorch学习,深度学习,自然语言处理,bert,gpt)