一、简介

  论文链接:《Attention is all you need》

  由google团队在2017年发表于NIPS,Transformer 是一种新的、基于 attention 机制来实现的特征提取器,可用于代替 CNN 和 RNN 来提取序列的特征。 在该论文中 Transformer 用于 encoder - decoder 架构。事实上 Transformer 可以单独应用于 encoder 或者单独应用于 decoder 。

Transformer = 编码器 + 解码器

  1. 输入自然语言序列到编码器: Why do we work?(为什么要工作);
  2. 编码器输出的隐藏层, 再输入到解码器;
  3. 输入$<start>$(起始)符号到解码器;
  4. 得到第一个字"为";
  5. 将得到的第一个字"为"落下来再输入到解码器;
  6. 得到第二个字"什";
  7. 将得到的第二字再落下来, 直到解码器输出$<end>$(终止符), 即序列生成完成.

Transformer相比较LSTM等循环神经网络模型的优点:

  • 可以直接捕获序列中的长距离依赖关系;
  • 模型并行度高,使得训练时间大幅度降低。

二、编码器

整体结构:

1) 字向量与位置编码:

$X = EmbeddingLookup(X) + PositionalEncoding$
$X \in \mathbb{R}^{batch \ size \ * \ seq. \ len. \ * \ embed. \ dim.} $
2) 自注意力机制:
$Q = Linear(X) = XW_{Q}$
$K = Linear(X) = XW_{K}$
$V = Linear(X) = XW_{V}$
$X_{attention} = SelfAttention(Q, \ K, \ V)$
3) 残差连接与Layer Normalization
$X_{attention} = X + X_{attention}$
$X_{attention} = LayerNorm(X_{attention})$
4) $FeedForward$, 其实就是两层线性映射并用激活函数激活, 比如说$ReLU$:
$X_{hidden} = Activate(Linear(Linear(X_{attention})))$
5) 重复3):
$X_{hidden} = X_{attention} + X_{hidden}$
$X_{hidden} = LayerNorm(X_{hidden})$
$X_{hidden} \in \mathbb{R}^{batch \ size \ * \ seq. \ len. \ * \ embed. \ dim.} $

1.positional encoding位置嵌入(或位置编码)

  由于transformer模型没有循环神经网络的迭代操作, 所以我们必须提供每个字的位置信息给transformer, 才能识别出语言中的顺序关系. 
  现在定义一个位置嵌入的概念, 也就是positional encoding, 位置嵌入的维度为[max sequence length, embedding dimension], 嵌入的维度同词向量的维度, max sequence length属于超参数, 指的是限定的最大单个句长. 
注意, 我们一般以字为单位训练transformer模型, 也就是说我们不用分词了, 首先我们要初始化字向量为[vocab size, embedding dimension], vocab size为总共的字库数量, embedding dimension为字向量的维度, 也是每个字的数学表达. 
  在这里论文中使用了$sine$和$cosine$函数的线性变换来提供给模型位置信息:

$$PE_{(pos,2i)} = sin(pos / 10000^{2i/d_{/text{model}}})$$

$$PE_{(pos,2i+1)} = cos(pos / 10000^{2i/d_{\text{model}}})$$

  上式中$pos$指的是句中字的位置, 取值范围是[0, max sequence length), i指的是词向量的维度, 取值范围是[0, embedding dimension), 上面有$sin$和$cos$一组公式, 也就是对应着embedding dimension维度的一组奇数和偶数的序号的维度, 例如0, 1一组, 2, 3一组, 分别用上面的$sin$和$cos$函数做处理, 从而产生不同的周期性变化, 而位置嵌入在embedding dimension维度上随着维度序号增大, 周期变化会越来越慢, 而产生一种包含位置信息的纹理, 就像论文原文中第六页讲的, 位置嵌入函数的周期从$2 \pi$到$10000 * 2 \pi$变化, 而每一个位置在embedding dimension维度上都会得到不同周期的$sin$和$cos$函数的取值组合, 从而产生独一的纹理位置信息, 模型从而学到位置之间的依赖关系和自然语言的时序特性. 
  下面画一下位置嵌入, 可见纵向观察, 随着embedding dimension增大, 位置嵌入函数呈现不同的周期变化.

注意力矩阵的三维图如下:

字自己本身乘以自己值最高,自己周围的值也很高,随着与当前字的距离越远,相关程度逐渐降低。

2. self attention mechanism自注意力机制

Attention Mask

  注意, 在上面self attention的计算过程中, 我们通常使用mini batch来计算, 也就是一次计算多句话, 也就是X的维度是[batch size, sequence length], sequence length是句长, 而一个mini batch是由多个不等长的句子组成的, 我们就需要按照这个mini batch中最大的句长对剩余的句子进行补齐长度, 我们一般用0来进行填充, 这个过程叫做padding.
  但这时在进行softmax的时候就会产生问题, 回顾softmax函数$\sigma (\mathbf {z} )_{i}={\frac {e^{z_{i}}}{\sum _{j=1}^{K}e^{z_{j}}}}$, $e^0$是1, 是有值的, 这样的话softmax中被padding的部分就参与了运算, 就等于是让无效的部分参与了运算, 会产生很大隐患, 这时就需要做一个mask让这些无效区域不参与运算, 我们一般给无效区域加一个很大的负数的偏置, 也就是:
$z_{illegal} = z_{illegal} + bias_{illegal}$
$bias_{illegal} \to -\infty$
$e^{z_{illegal}} \to 0 $
经过上式的masking我们使无效区域经过softmax计算之后还几乎为0, 这样就避免了无效区域参与计算.

3. 残差连接和Layer Normalization

(1)残差连接

我们在上一步得到了经过注意力矩阵加权之后的$V$, 也就是$Attention(Q, K, V)$, 我们对它进行一下转置, 使其和$X_{embedding}$的维度一致, 也就是[batch size, sequence length, embedding dimension], 然后把他们加起来做残差连接, 直接进行元素相加, 因为他们的维度一致:
$X_{embedding} + Attention(Q, \ K, \ V)$
在之后的运算里, 每经过一个模块的运算, 都要把运算之前的值和运算之后的值相加, 从而得到残差连接, 训练的时候可以使梯度直接走捷径反传到最初始层:
$X + SubLayer(X)$

(2)layer normalization

$Layer Normalization$的作用是把神经网络中隐藏层归一为标准正态分布, 也就是$i.i.d$独立同分布, 以起到加快训练速度, 加速收敛的作用:
$\mu_{i}=\frac{1}{m} \sum^{m}_{i=1}x_{ij}$
上式中以矩阵的行$(row)$为单位求均值;
$\sigma^{2}_{j}=\frac{1}{m} \sum^{m}_{i=1}(x_{ij}-\mu_{j})^{2}$
上式中以矩阵的行$(row)$为单位求方差;
$LayerNorm(x)=\alpha \odot \frac{x_{ij}-\mu_{i}}{\sqrt{\sigma^{2}_{i}+\epsilon}} + \beta$
然后用每一行的每一个元素减去这行的均值, 再除以这行的标准差, 从而得到归一化后的数值, $\epsilon$是为了防止除0;
之后引入两个可训练参数$\alpha, \beta$来弥补归一化的过程中损失掉的信息, 注意$\odot$表示元素相乘而不是点积, 我们一般初始化$\alpha$为全1, 而$\beta$为全0

参考文献:

【1】大师级的a_journey_into_math_of_ml / 04_transformer_tutorial_2nd_part·浓缩咖啡/浓咖啡/ a_journey_into_math_of_ml

【2】The Illustrated Transformer(可视化讲解)

【3】The Annotated Transformer(代码讲解)

Transformer模型---encoder的更多相关文章

  1. Transformer模型---decoder

    一.结构 1.编码器 Transformer模型---encoder - nxf_rabbit75 - 博客园 2.解码器 (1)第一个子层也是一个多头自注意力multi-head self-atte ...

  2. 文本分类实战(八)—— Transformer模型

    1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...

  3. 详解Transformer模型(Atention is all you need)

    1 概述 在介绍Transformer模型之前,先来回顾Encoder-Decoder中的Attention.其实质上就是Encoder中隐层输出的加权和,公式如下: 将Attention机制从Enc ...

  4. transformer模型解读

    最近在关注谷歌发布关于BERT模型,它是以Transformer的双向编码器表示.顺便回顾了<Attention is all you need>这篇文章主要讲解Transformer编码 ...

  5. transformer模型简介

    Transformer模型由<Attention is All You Need>提出,有一个完整的Encoder-Decoder框架,其主要由attention(注意力)机制构成.论文地 ...

  6. Transformer模型总结

    Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并行. 它是由编码组件.解码组件和它们之间的连接组成. 编码组件部分由一堆编码器(6个 enco ...

  7. NLP与深度学习(四)Transformer模型

    1. Transformer模型 在Attention机制被提出后的第3年,2017年又有一篇影响力巨大的论文由Google提出,它就是著名的Attention Is All You Need[1]. ...

  8. Transformer模型详解

    2013年----word Embedding 2017年----Transformer 2018年----ELMo.Transformer-decoder.GPT-1.BERT 2019年----T ...

  9. RealFormer: 残差式 Attention 层的Transformer 模型

    原创作者 | 疯狂的Max 01 背景及动机 Transformer是目前NLP预训练模型的基础模型框架,对Transformer模型结构的改进是当前NLP领域主流的研究方向. Transformer ...

随机推荐

  1. python 绘制词云图

    1. 先下载并安装nltk包,准备一张简单的图片存入代码所在文件目录,搜集英文停用词表 import nltk nltk.download() 2. 绘制词云图 import re import nu ...

  2. fiddler面试题

    1.什么叫断点? Break Point:进行接口测试时,为了测试后端功能而设置的. 2.断点有哪些方式? Before Requests:在请求时,没有达到服务器之前设置断点.     -- 全局断 ...

  3. 第十 构建Web内容的技术

    第十章 构建Web内容的技术 一.HTML HTML(HyperText Markup Language,超文本标记语言)是为了发送Web 上的超文本(Hypertext)而开发的标记语言.超文本是一 ...

  4. python3.8.0 Django 开发后端接口api 部署到 Linux Centos7上

    经历了两天的时候终于把本地使用python3 django开发的接口API部署到服务器上了,还是记录一下,以免之后忘记,哈哈 注意一点,就是,centos7是基于python2的,我这边默认的是pyt ...

  5. ES2019 的新特性

    JavaScript 不断演变,每次迭代都会得到一些新的内部更新.让我们来看看 ES2019 有哪些新的特性,并加入到我们日常开发中 Array.prototype.flat() Array.prot ...

  6. 探索clickout指令实现

    实现一个可复用的点击区域之外方法 随着3大框架的风靡,我们从以前的layer等UI库迁移到了更加强大的UI库,比如vue的好伙伴element,组件库的作用是封装一些常用的功能,将HTML.CSS.J ...

  7. 【半小时大话.net依赖注入】(下)详解AutoFac+实战Mvc、Api以及.NET Core的依赖注入

    系列目录 上|理论基础+实战控制台程序实现AutoFac注入 下|详解AutoFac+实战Mvc.Api以及.NET Core的依赖注入 前言 本来计划是五篇文章的,每章发个半小时随便翻翻就能懂,但是 ...

  8. 物联网架构成长之路(44)-Docker私有仓库Harbor

    0. 前言 安装docker.docker-compose,这些在我以前的博客讲过,这里就不继续说明了,有需要的可以参考我之前的博客. https://www.cnblogs.com/wunaozai ...

  9. IM开发者的零基础通信技术入门(三):国人通信方式的百年变迁

    [来源申明]本文原文来自:微信公众号“鲜枣课堂”,官方网站:xzclass.com,原题为:<中国通信的百年沉浮>,本文引用时已征得原作者同意.为了更好的内容呈现,即时通讯网在收录时内容有 ...

  10. 如何让 C# 在运行时自动选择合适的重载方法?

    如题:假设我们有一段代码: static void Main(string[] args) { ; // 假设这里的 obj 的值来自于外部方法 PrintType(obj); } public st ...