当前位置: 代码迷 >> 综合 >> Shusen Wang NLP课程学习笔记 Transformer + BERT
  详细解决方案

Shusen Wang NLP课程学习笔记 Transformer + BERT

热度:29   发布时间:2024-02-04 22:35:10.0

Transformer

cyq总结,就是博主啦

attention without RNN

Original paper Attention is All You Need. In NIPS, 2017

  • Transformer 是一个 Sep2Sep模型
  • Transformer不是RNN
  • Transformer的效果完胜RNN,业界已经基本不用RNN了

文章目录

  • Transformer
    • Review of Attention on RNN
    • Attention without RNN
      • Attention Layer
        • Key, Vlue, Query
        • Compute weights
        • Compute context vector
        • Output
        • Example
    • Self-Attention without RNN
    • From Shallow to Deep
      • Multi-head Attention
      • Stacked Self-Attention Layers
      • Transformer's Encoder
      • Transformer's Decoder
      • Transformer
  • BERT(Bidirectional Encoder Representations from Transformers)
    • Predict masked words
    • Predict next sentence
    • Combining the two methods
      • Input
      • Training

Review of Attention on RNN

在这里插入图片描述

权重weight计算方法如上图所示,有m个encoder的状态hi,对应的就有m个ki,将这些ki组成矩阵K,K中每一列是一个原来的ki

  • Query q:j = Wqsj (To match others)

  • Key k:i = Wkhi (To be matched)

  • Value v:i = Wvhi (To be weighted averaged)

给出一种新的计算context vector cj的方法如下:

在这里插入图片描述

这种方法和之前的Attention的区别在于,计算的是Value的加权平均,而非状态hi的加权平均

Attention without RNN

Attention Layer

Key, Vlue, Query

在这里插入图片描述

计算第一步如上图所示,WkWv将m个输入xi分别映射到Key和Value向量,这样m个输入向量就对应m个Key和m个Value

用Wq将输出xj’映射到Query q:j,得到t个query向量

这里的Key, Value, Qurey和之前RNN中提到的概念已经有了本质的区别。

这里每一个Key, Value只与当前对应的输入单词有关,而和之前的输入无关

每一个Qurey只与当前对应的输出单词有关,而和之前的输出,以及encoder中的内容无关

Compute weights

在这里插入图片描述

第二步计算权重a如上图所示。

计算权重的时候用到所有的Key和一个Qurey向量,计算出q:1与所有k:i的相关性列在向量a:1中,具体的计算方法为矩阵乘法

注意这里每一个向量都对应且只对应一个词

Compute context vector

在这里插入图片描述

第三步计算context vector如上图所示。

用到所有的Value向量和a:1向量,实际上就是计算所有value向量的加权平均。

可以看到,每计算一个c:j,就要用到所有的Value, 所有的Key,和一个Query向量

Output

重复上述过程直到计算出所有t个Query向量,所有Query向量组成的矩阵即为输出,如下图所示:

在这里插入图片描述

Example

在这里插入图片描述

将context vector c2输入 Softmax Classifier得到概率分布p2, 再根据p2得到下一个预测的单词x3’

在这里插入图片描述

Attention Layer可以抽象成如上图所示,输入为两个向量,输出为一个context vector的集合,其中用到的参数为三个矩阵

Self-Attention without RNN

在这里插入图片描述

self-attention的结构如上图所示,Attn函数和Attention的Attn函数完全相同,只是输入的两个参数都是X,这里的输出中的每一个ci都和所有的xi相关

self-attention的过程和attention的过程完全相同,每次计算context vector ci依赖于所有的Value, Key和一个Query(对每个xi计算相应的Value,Key,Query三个向量,计算方法同上)

From Shallow to Deep

Multi-head Attention

上面所学习的是单头的attention,Multi-head Attention是由l个单头attention组成,它们各自有各自的参数,不共享参数Multi-head Self-Attention结构如下图所示,即把l个单头的结果堆叠:

在这里插入图片描述

Multi-head Attention结构如下图所示,也是单头之间不共享参数,将各自的结果堆叠得到最终结果

在这里插入图片描述

Stacked Self-Attention Layers

搭建全连接层,全连接层的Dense是完全相同的,如下所示:

在这里插入图片描述

搭建深度神经网络的结构如下图所示,类似与RNN中的过程:

在这里插入图片描述

Transformer’s Encoder

在这里插入图片描述

encoder的一层就是一个self-attention layer + dense layer,一个block的输入和输出的大小是一样的,可以用 ResNet中的skip connection将输入加到输出上

总的结构如下图所示,所有的block之间不共享参数

在这里插入图片描述

Transformer’s Decoder

一个block的第一层,是一个Multi-Head Self-Attention:

在这里插入图片描述

第二层如下,是一个Multi-Head Attention,输入是encoder的输出m个向量和decoder的第一层t个向量,输出为t个向量

在这里插入图片描述

最后搭一个全连接层如下:

在这里插入图片描述

上面所描述的是一个block,结构如下图所示:

在这里插入图片描述

Transformer

总的网络就是上面模块的堆叠,如下图所示

在这里插入图片描述

BERT(Bidirectional Encoder Representations from Transformers)

BERT用来预训练Transformer模型的encoder

  • Predict masked word
  • Predict next sentence

Predict masked words

在这里插入图片描述

如图所示,用mask表示遮住一个词,经过embedding后得到向量xm,再经过transformer得到um,这里um知道的是上下文的信息,可以用来预测。再经过classifier得到概率分布p以预测被遮住的单词,我们希望p接近cat的one-hot向量

  • e:one-hot vector of the masked word “cat”
  • p:output probability distribution at masked position
  • Loss = CrossEntropy(e, p)

mask自动生成,不用人工标记,足够训练大型网络

Predict next sentence

在这里插入图片描述

网络结构如上图所示,c对应于[CLS],但是c包含的是两句话的所有信息,所以可以用c来做分类任务。注意这里的数据是带标签的,标签true表示两句话相邻,false表示两句话不相邻

[CLS] is token for classification

[SEP] is for separating sentences

相邻两句话通常有关联,这样训练可以强化这种关联,可以训练self-attention找到正确的相关性

Combining the two methods

Input

在这里插入图片描述

如图所示,input是上面两种任务输入的综合

Training

在这里插入图片描述

损失函数是predict masked words的损失函数和predict next sentence的损失函数的和

优点: 不用人工标注数据,自动生成标签,参数是公开的

缺点: 代价大

  相关解决方案