转载自:https://wmathor.com/index.php/archives/1438/

Transformer 是谷歌大脑在 2017 年底发表的论文 attention is all you need 中所提出的 seq2seq 模型。现在已经取得了大范围的应用和扩展,而 BERT 就是从 Transformer 中衍生出来的预训练语言模型

这篇文章分为以下几个部分

Transformer 直观认识

  1. Positional Encoding
  2. Self Attention Mechanism
  3. 残差连接和 Layer Normalization
  4. Transformer Encoder 整体结构
  5. Transformer Decoder 整体结构
  6. 总结
  7. 参考文章

1. Transformer 直观认识

Transformer 和 LSTM 的最大区别,就是 LSTM 的训练是迭代的、串行的,必须要等当前字处理完,才可以处理下一个字。而 Transformer 的训练时并行的,即所有是同时训练的,这样就大大增加了计算效率。Transformer 使用了位置嵌入 (Positional Encoding) 来理解语言的顺序,使用自注意力机制(Self Attention Mechanism)和全连接层进行计算,这些后面会讲到

Transformer 模型主要分为两大部分,分别是 EncoderDecoderEncoder 负责把输入(语言序列)隐射成隐藏层(下图中第 2 步用九宫格代表的部分),然后解码器再把隐藏层映射为自然语言序列。例如下图机器翻译的例子

本篇文章大部分内容在于解释 Encoder 部分,即把自然语言序列映射为隐藏层的数学表达的过程。理解了 Encoder 的结构,再理解 Decoder 就很简单了

上图为 Transformer Encoder Block 结构图,注意:下面的内容标题编号分别对应着图中 1,2,3,4 个方框的序号

1. Positional Encoding

由于 Transformer 模型没有循环神经网络的迭代操作,所以我们必须提供每个字的位置信息给 Transformer,这样它才能识别出语言中的顺序关系

现在定义一个位置嵌入的概念,也就是 Positional Encoding,位置嵌入的维度为 [max_sequence_length, embedding_dimension], 位置嵌入的维度与词向量的维度是相同的,都是 embedding_dimensionmax_sequence_length 属于超参数,指的是限定每个句子最长由多少个词构成

注意,我们一般以为单位训练 Transformer 模型。首先初始化字编码的大小为 [vocab_size, embedding_dimension]vocab_size 为字库中所有字的数量,embedding_dimension 为字向量的维度,对应到 PyTorch 中,其实就是 nn.Embedding(vocab_size, embedding_dimension)

论文中使用了 sin 和 cos 函数的线性变换来提供给模型位置信息:

上式中pos指的是一句话中某个字的位置,取值范围是

i指的是字向量的维度序号取值范围是 ,指的是embedding_dimension的值

详细可以看https://blog.csdn.net/qq_33932925/article/details/108619971

下面画一下位置嵌入,纵向观察,可见随着embedding dimension序号增大,位置嵌入函数的周期变化越来越平缓

    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    import math

    def get_positional_encoding(max_seq_len, embed_dim):
        # 初始化一个positional encoding
        # embed_dim: 字嵌入的维度
        # max_seq_len: 最大的序列长度
        positional_encoding = np.array([
            [pos / np.power(10000, 2 * i / embed_dim) for i in range(embed_dim)]
            if pos != 0 else np.zeros(embed_dim) for pos in range(max_seq_len)])
        
        positional_encoding[1:, 0::2] = np.sin(positional_encoding[1:, 0::2])  
        # dim 2i 偶数
        positional_encoding[1:, 1::2] = np.cos(positional_encoding[1:, 1::2])  
        # dim 2i+1 奇数
        return positional_encoding

    positional_encoding = get_positional_encoding(max_seq_len=100, embed_dim=16)
    plt.figure(figsize=(10,10))
    sns.heatmap(positional_encoding)
    plt.title("Sinusoidal Function")
    plt.xlabel("hidden dimension")
    plt.ylabel("sequence length")

效果图:

    plt.figure(figsize=(8, 5))
    plt.plot(positional_encoding[1:, 1], label="dimension 1")
    plt.plot(positional_encoding[1:, 2], label="dimension 2")
    plt.plot(positional_encoding[1:, 3], label="dimension 3")
    plt.legend()
    plt.xlabel("Sequence length")
    plt.ylabel("Period of Positional Encoding")

 

 


待续

更多相关推荐

Transformer架构解析

1.Transformer总体架构图Transformer总体架构可分为四个部分:输入部分输出部分编码器部分解码...

继续阅读

详解Transformer

文章目录参考文章前言采用attention机制的原因1RNN无法并行处理2CNN需要堆叠层数过深3transfor...

继续阅读

Transformer

【1】https://blog.csdn.net/weixin_45875127/article/details/108572928  【2】https://zhuan...

继续阅读

史上最全从零解读Transformer

麻烦大家收藏的时候点个赞!!点下面这个链接,直接下载所有答案合辑就可以了:万字长文全面解...

继续阅读

transformer bert使用教程

http://www.360doc.com/content/19/0722/20/46368139_850400193.shtml 下面图的网址是上面这个...

继续阅读

transformer详解(2)---使用自己...

1.环境自定义训练数据训练transformer,实现中文到英文的翻译环境:tensorflow1.14python3.6.xt...

继续阅读

transformer源码详解

更多机器学习、深度学习、NLP知识请参考我的个人网站:http://www.kexue.love点我一、背景介绍N...

继续阅读

Transformer-XL框架

引入Transformer-XL超长上下文的注意力模型,出自CMU和GoogleBrain在2019年1月发表的论文:《T...

继续阅读

Transformer-self attention

详见知乎~感恩~小白记录贴,侵删~感恩Encoder包括Multi-headselfattention,Skipconnection...

继续阅读

学习transformer框架以及bert应...

01总结概括本周主要是复习了Transformer的代码,知道了transformer的编码层和解码层的内部原理...

继续阅读