• Transformer


    2019-10-09 19:54:42

    问题描述:谈谈对Transformer的理解。

    问题求解

    • Transformer 整体架构

    Transformer 是典型的Seq2Seq架构的模型,其核心的骨架依然是encoder-decoder两个模块,和传统的S2S问题不同的地方在于Transformer提出了Self-Attension机制, 并且通过实验发现使用Self-Attension可以很好的替代RNN/LSTM,并且取得STOA的效果。

    Encoder:encoder模块由6个完全一致的layer组成,每个layer又分成两个部分,一层是Self-Attension,后接一层前向传播网络。词的向量化仅仅发生在最底层的编码器的输入时,这样每个编码器的都会接收到一个list(每个元素都是512维的词向量),只不过其他编码器的输入是前个编码器的输出。list的尺寸是可以设置的超参,通常是训练集的最长句子的长度。
    在对输入序列做词的向量化之后,它们流经编码器的如下两个子层。

    Decoder:decoder 模块由6个完全一致layer构成,每个layer相比encoder多了一个结构,就是encoder-decoder attension,这一层的作用是计算decoder中的embedding和encoder中的各个维度的embedding的关联度,另外在self-attension中也引入了一个机制,即mask机制,对于还未解码出来的位置在softmax的时候赋值-INF,我们知道如果是-INF,那么其attension或者说是权重的值几乎为0,也就不会对前面已经出现的数值产生影响。

    【输出】对应i位置的输出词的概率分布。
    【输入】encoder的输出 & 对应i-1位置decoder的输出(所以最开始的attention是self-attention(QKV全是decoder隐层);中间的attention不是self-attention,K,V来自encoder,Q来自上一位置decoder的输出)。
    decoder层中的输入是上一个三个sublayer的作用。

    【sublayer 1】self-attension:计算与已经解码出来的信息的关联度

    【sublayer 2】encoder-decoder attension:计算和输入的序列的关联度

    【sublayer 3】前向传播,同时可以将维度进行调整

     

    • Self-Attension 机制

    Attension本质上就是输入两个vector,输出它们的相似度/关联度。

    在传统的attension机制中我们通常采用的是一个神经网络来计算相似度,在self-attension中我们计算相似度的方式可以说更为直观和简单,直接进行内积操作就可以得到两个输入的vector之间的相似度。

    1. self-attension 建模

    在self-attension中每一个输入的embedding会生成三个向量,分别是query,key,value。

    q query:to match others qi = Wq ai

    k key: to be matched ki = Wk ai

    v value: information extract vi = Wv ai

    self-attension采用了QKV模型,模型输入为q,Memory 中以(k, v)形式存储需要的上下文。

    在这种建模方式下,分为三步:

    • 在memory中找相似 (score function): [公式]
    • 归一化 (alignment function): [公式]
    • 读取内容 (context vector function): [公式]

    2. Self-Attension 和 CNN 的神似性

    self-attention和convolution 有点儿神似,它摒弃了CNN的局部假设,想要寻找长距离的关联依赖。看下图就可以理解 self-attention 的这几个特点:

    • constant path length & variable-sized perceptive field :任意两个位置(特指远距离)的关联不再需要通过Hierarchical perceptive field的方式,它的perceptive field是整个句子,所以任意两个位置建立关联是常数时间内的。
    • parallelize : 没有了递归的限制,就像CNN一样可以在每一层内实现并行。

    3. multi-head attension

    self-attention借鉴CNN中multi-kernel的思想,进一步进化成为multi-head attention。每一个不同的head使用不同的线性变换,学习不同的relationship。

    4.  Scaled Dot-Product Attention

    self-attension中的点积操作并不是直接点乘,而是加入了缩放操作。

    传统的Dot-Product Attention并没有scale factor,self-attension中之所以进行缩放是为了减少点积结果的方差(类似normalize)。

    大方差会导致weight有的大有的小,softmax会导致大的更大,小的更小。

    5. Transformer 中的三种 Attension

    Transformer框架中self-attention本身是一个很大的创新,另一个有意思的是three ways of attention的设计。

    • Encoder self-attention:Encoder 阶段捕获当前 word 和其他输入词的关联;
    • Masked-Decoder self-attention :Decoder 阶段捕获当前 word 与已经看到的解码词之间的关联,从矩阵上直观来看就是一个带有 mask 的三角矩阵;
    • Encoder-Decoder Attention:就是将 Decoder 和 Encoder 输入建立联系,和之前那些普通 Attention 一样;

    6. self-attension 为何 work

    从上面的建模,我们可以大致感受到 Attention 的思路简单,四个字“带权求和”就可以高度概括,大道至简。做个不太恰当的类比,人类学习一门新语言基本经历四个阶段:死记硬背(通过阅读背诵学习语法练习语感)->提纲挈领(简单对话靠听懂句子中的关键词汇准确理解核心意思)->融会贯通(复杂对话懂得上下文指代、语言背后的联系,具备了举一反三的学习能力)->登峰造极(沉浸地大量练习)。

    这也如同attention的发展脉络,RNN时代是死记硬背的时期,attention的模型学会了提纲挈领,进化到transformer,融汇贯通,具备优秀的表达学习能力,再到GPT、BERT,通过多任务大规模学习积累实战经验,战斗力爆棚。

    要回答为什么attention这么优秀?是因为它让模型开窍了,懂得了提纲挈领,学会了融会贯通。那又是如何开窍的?是因为它懂得了"context is everything"。

    Attention背后本质的思想就是:在不同的 context 下,focusing 不同的信息。这本来就是一个普适的准则。所以 Attention 可以用到所有类似需求的地方,不仅仅是 NLP,图像,就看你对 context 如何定义。

    • Positional Encoding 的理解

    RNN是天然有序的,然而Transformer中引入了Self-Attension机制,达到了“天涯若比邻”的效果,原本文本之间的先后顺序信息消失了,Transformer中引入了Positional Encoding来向网络中加入位置信息。

    关于如何在self-attension中加入位置信息其实有两种方案,一个是Facebook的Positional Embedding方案,就是使用神经网络去学习位置向量,这种方案的位置编码是有限维度的。

    另一种就是Google采用的Positional Encoding方案,不用神经网络去学习,而是直接通过公式计算的到结果。

    其中,pos即position,意为token在句中的位置,设句子长度为L ,则 pos = 1, 2, 3, ... , L;i 为向量的某一维度,例如dmodel = 512 时, i = 0, 1, 2, 3, ... , 255。

    借助三角公式,我们可以得到,任意两个相距k的两个位置的位置向量,可以通过线性变化得到,这样的线性组合意味着位置向量中蕴含了相对位置信息。

    • Transforemr、LSTM、CNN 间的区别

    从支持并行性的角度来看,LSTM网络依然是传统的RNN网络的扩展,其中间节点的状态依赖前一个网络的输出,因此无法支持并行性;

    Transformer和CNN均支持并行性,但是在长距离特征捕获能力上,CNN明显偏弱,CNN需要通过分层叠加来达到长距离的特征捕获,而Transformer天然支持长距离的特征捕获。

    由于加入了Multi-head机制,Transformer的特征提取能力非常强悍,完全不若于LSTM和CNN。

  • 相关阅读:
    【LeetCode OJ】Remove Element
    【LeetCode OJ】Remove Duplicates from Sorted Array
    【LeetCode OJ】Swap Nodes in Pairs
    【LeetCode OJ】Merge Two Sorted Lists
    【LeetCode OJ】Remove Nth Node From End of List
    【LeetCode OJ】Two Sum
    【LeetCode OJ】Majority Element
    最长公共子序列问题
    php fopen与file_get_contents的区别
    PHP 技巧集合
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/11644003.html
Copyright © 2020-2023  润新知