目录

  • Transformer
    • 引言
    • 解析
      • 整体结构
      • 注意力机制
      • 自注意力
      • 多头注意力
      • Positional Encoding
    • 参考
  • BERT
    • 引言
    • 解析
    • 参考

关于Transformer和BERT,网上已经有了很多的讲解。本博客是笔者阅读论文后,并参考了一些其他博主的思路,结合笔者本人的理解而写。文章的最后会列出一些参考博客(知乎),如有遗漏,烦请提醒。

Transformer

引言

Attention Is All You Need
文章链接
本文出自NIPS2017,一作是Ashish Vaswani,来自Google Brain。Transformer最开始是基于机器翻译任务提出的,打破了传统的RNN框架,完全依赖于注意力机制。能够很容易的并行训练,仅在8个P100上训练了12个小时,就实现了当时的新SOTA。

解析

整体结构

Transformer的结构如下图所示。还是机器翻译领域传统的Encoder-Decoder架构。

Encoder部分使用N=6N=6N=6个Layer组成,每个Layer又包含两个sub-layer,分别是:多头注意力层(Multi-Head Attention)、前向传播层(Feed Forward)。每个sub-layer后面都添加了一个layer normalization层(出自文章),且使用了类似ResNet的跳跃连接。综上,对于输入为xxx的sub-layer,它的输出是:LayerNorm(x+Sublayer(x))\text{LayerNorm}(x+\text{Sublayer}(x))LayerNorm(x+Sublayer(x))

Decoder部分也是使用N=6N=6N=6个Layer组成,每个Layer包含三个sub-layer,分别是:带有掩码的多头注意力层(Masked Multi-Head Attention)、多头注意力层(Multi-Head Attention)、前向传播层(Feed Forward)。

注意力机制

首先介绍基于点积的注意力(Scaled Dot-Product Attention),再引申出本文中用到的自注意力(Self Attention)和多头注意力(Multi-Head Attention)。

基于点积的注意力的网络结构如下图所示,具有三个输入:QQQKKKVVV,分别代表QueryQueryQueryKeyKeyKeyValueValueValue,这三个变量的含义下面会详细介绍。

下面,以机器翻译为例子,详细介绍注意力机制的计算过程。假设,此时模型的输入I="word1word2word3"I="word_1 \space word_2 \space word_3"I="word1word2word3",使用NNN表示单词个数,例子中N=3N=3N=3

  1. Embedding
    对输入的句子III进行word embedding后,可以得到句子的特征EEE,是一个N×DimEN \times Dim^EN×DimE的矩阵。按照下标进行索引即可得到每个单词的特征,这里使用Ei(1≤i≤N)E_i(1 \le i \le N)Ei(1iN)表示单词wordiword_iwordi的特征,每个EiE_iEi的大小均为1×DimE1 \times Dim^E1×DimE
  2. 获取Q,K,VQ, K, VQ,K,V
    使用三个不同的权重矩阵WQ,WK,WVW^Q, W^K, W^VWQ,WK,WV,分别乘以EEE即可得到Q,K,VQ, K, VQ,K,V,大小分别为NQ×DimQ,NK×DimK,NV×DimVN^Q \times Dim^Q, \space N^K \times Dim^K, \space N^V \times Dim^VNQ×DimQ,NK×DimK,NV×DimV
    Q=EWQ,K=EWK,V=EWVQ = E W^Q, \space K = E W^K, \space V = E W^VQ=EWQ,K=EWK,V=EWV
    直观上来看,NQ=NK=NV=NN^Q=N^K=N^V=NNQ=NK=NV=N(实际上不一定,后文会说),下面以这种假设为前提,看一下如何计算Attention。
  3. 计算Attention
    对于单词wordiword_iwordi来说,首先,通过索引得到其对应的查询向量QiQ_iQi。通过矩阵乘法操作Si=QiKTS_i=Q_i K^TSi=QiKT可以得到一个大小为1×N1 \times N1×N的向量SiS_iSi,而Si[j]S_i[j]Si[j]即为wordiword_iwordiwordjword_jwordj的Score。然后,使用softmax\text{softmax}softmax将Score进行归一化,得到Attention Weight WiW_iWi,大小仍是1×N1 \times N1×N,含义仍是Wi[j]W_i[j]Wi[j]表示wordiword_iwordiwordjword_jwordj的相关性。,整个过程可以概括为(初始时QiQ_iQi 的大小为1×DimQ1 \times Dim^Q1×DimQ):
    1×DimQ×KT→1×Nsoftmax→1×N×V→1×DimV1 \times Dim^Q \space \space \space \underrightarrow{\times K^T} \space \space \space 1 \times N \space \space \space \underrightarrow{\text{softmax}} \space \space \space 1 \times N \space \space \space \underrightarrow{\times V} \space \space \space 1 \times Dim^V1×DimQ

    ×KT
    1×
    N

    softmax
    1×
    N

    ×V
    1×
    DimV

    不难发现,对于每一个QiQ_iQi,分别计算再将结果Concatenate和直接使用QQQ进行计算得到的结果是一致的:
    N×DimQ×KT→N×Nsoftmax→N×N×V→N×DimVN \times Dim^Q \space \space \space \underrightarrow{\times K^T} \space \space \space N \times N \space \space \space \underrightarrow{\text{softmax}} \space \space \space N \times N \space \space \space \underrightarrow{\times V} \space \space \space N \times Dim^VN×DimQ

    ×KT
    N×
    N

    softmax
    N×
    N

    ×V
    N×
    DimV

    上述介绍中,笔者实际上省略了论文中的一个重要操作——除以DimK\sqrt{Dim^K}DimK

    ,文中给出的此操作的作用是:作者同时测试了点积注意力和additive attention(出自文章)的表现,在DimKDim^KDimK很小时,两种注意力的性能接近,在DimKDim^KDimK很大时,前者的表现要更出色。而随着DimKDim^KDimK的增加,点积操作QKTQK^TQKT得到的结果会变大,经过softmax\text{softmax}softmax后,反向传播回来的梯度会很小,会对训练过程带来阻碍,故除以DimK\sqrt{Dim^K}DimK

    进行缩放,再进行softmax\text{softmax}softmax。综上,完整的计算Attention的过程为:
    Attention(Q,K,V)=softmax(QKTDimK)V\text{Attention}(Q, K, V)=\text{softmax}(\frac{QK^T}{\sqrt{Dim^K}})VAttention(Q,K,V)=softmax(DimK

    QKT
    )V

现在,总结一下注意力到底做了什么。我觉得用一句话概括,就是:使用K,VK, VK,V来获得QQQ的更优表示。(以下部分参考了[2])

QQQ代表我们想要表达的内容(或序列,暂记为XXX)在高维空间AAA中的表达,KKK代表某内容(或序列,暂记为YYY)在高维空间AAA中的表达,VVV代表某内容(或序列,暂记为YYY)在高维空间BBB中的表达。即:
Q=A(X),K=A(Y),V=B(Y)Q=A(X), \space K=A(Y), \space V=B(Y)Q=A(X),K=A(Y),V=B(Y)
也就是说,通过计算两个不同序列X,YX, YX,Y在同一高维空间AAA的相似度,作为权重作用在序列YYY在另一高维空间BBB上,从而获得序列XXX在高维空间BBB中的表达B(X)B(X)B(X)

由上面这些分析可知,在注意力模块中,必满足以下两个约束:

  1. DimQ=DimKDim^Q = Dim^KDimQ=DimK(即:QQQKKK在同一高维空间中,这样才可以计算相似度)
  2. NK=NVN^K = N^VNK=NV(即:KKKVVV中的“单词”(不一定限定于单词)个数相同,因为他们是同一序列在不同高维空间的表达)

自注意力

其实只有一句话,Q=K=VQ=K=VQ=K=V

多头注意力

这部分也很好理解,就是通过多组不同的Q,K,VQ, K, VQ,K,V分别计算注意力,再Concat一下。这样可以学到不同空间的表示。

Positional Encoding

TO DO.

参考

[1] https://blog.csdn.net/longxinchen_ml/article/details/86533005
[2] https://zhuanlan.zhihu.com/p/104393915

BERT

引言

Pre-training of Deep Bidirectional Transformers for Language Understanding
文章链接

解析

TO DO.

参考

Transformer、BERT学习笔记相关推荐

  1. attention seq2seq transformer bert 学习总结 _20201107

    https://blog.csdn.net/weixin_44388679/article/details/102575223 Seq2Seq原理详解 一文读懂BERT(原理篇) 2018年的10月1 ...

  2. 预训练BERT学习笔记_Storm*Rage的博客

    Transformer的Attention Decoder的结构与Encoder相比多了一个Encoder-Decoder Attention,两个Attention分别用于计算输入和输出的权值: S ...

  3. Transformer论文学习笔记

    <Attention Is All You Need>一文中所提出的Transformer模型,与传统的CNN架构完全不同.Transformer中的注意力机制(attention mec ...

  4. Transformer的学习笔记

    1 前言 Transformer是一个很厉害的模型呀~ 请阅读文章<Attention Is All You Need> 2 Transformer的两大特点 2.1 第一特点--全局感受 ...

  5. Transformer模型学习笔记

    Transformer模型 1 seq2seq方法对比 CNN:将序列分为多个窗口(卷积核),每个窗口具有相同的权重,可以带来平移不变性的好处:卷积核之间可以进行并行计算:根据局部关联性建模,若想获得 ...

  6. BERT通俗笔记:从Word2Vec/Transformer逐步理解到BERT

    前言 我在写上一篇博客<22下半年>时,有读者在文章下面评论道:"july大神,请问BERT的通俗理解还做吗?",我当时给他发了张俊林老师的BERT文章,所以没太在意. ...

  7. 【莫烦Python】机器要说话 NLP 自然语言处理教程 W2V Transformer BERT Seq2Seq GPT 笔记

    [莫烦Python]机器要说话 NLP 自然语言处理教程 W2V Transformer BERT Seq2Seq GPT 笔记 教程与代码地址 P1 NLP行业大佬采访 P2 NLP简介 P3 1. ...

  8. transformer模型的奥秘-学习笔记

          本文主要介绍了transformer模型的大概原理及模型结构.这篇学习笔记的学习资料主要是<Attention is All you Need>这篇神作,还有两位大神的指点(见 ...

  9. 计算机视觉算法——Transformer学习笔记

    算机视觉算法--Transformer学习笔记 计算机视觉算法--Transformer学习笔记 1. Vision Transformer 1.1 网络结构 1.2 关键知识点 1.2.1 Self ...

最新文章

  1. Vue在Element UI下使用富文本框插件quill-editor(我个人不推荐用这个复杂的富文本插件)
  2. Nature:拟南芥根系微生物组的结构
  3. 经济学人使用Golang构建微服务历程回顾
  4. 菜鸟教程之Microsoft Windows Powershell
  5. Keil MDK-ARM下载 安装与和谐教程
  6. php mysql第4版高清_PHP和MySQL WEB开发(中文高清第4版)
  7. 基于容器服务 ACK 发行版打造 CNStack 社区版
  8. 可对Python运行原理进行可视化分析的工具
  9. 如何在硅谷一夜暴富?
  10. 几个例子弄懂JS 的setInterval的运行方式
  11. jdk Arrays类
  12. 【2022.3】尚硅谷Vue.js从入门到精通基础笔记(理论+实操+知识点速查)
  13. APP自动化-显示等待/强制等待/命令等待
  14. linux uwf开放80端口,SELinux - osc_a3uwfsx7的个人空间 - OSCHINA - 中文开源技术交流社区...
  15. 供应链业务架构设计概览
  16. 单片机USB2.0高速接口实现方案
  17. 在vue中使用wow动画插件(下载,配置,使用,参数)
  18. 《博德之门3》的许多设计,还不如上世纪的前作
  19. Pytorch:Unet网络代码详解
  20. SEI文献整理2:A Review of Radio Frequency Fingerprinting Techniques(2020)

热门文章

  1. 【12】 全国外电音DJ 3000首 32G
  2. Java并行有优势吗_Java中不同的并发实现的性能比较
  3. php万年历月份处理_php实现万年历的完整代码
  4. LBP(局部二值模式)特征提取原理
  5. Delphi动态事件
  6. C++中为什么没有try finally的理解
  7. C语言中%c与%s的区别与划分
  8. Python 学习之元组
  9. 任务切换的方法——《x86汇编语言:从实模式到保护模式》读书笔记37
  10. SpringBoot升级到2.3.x后返回message为空