├── .gitignore ├── DL_algorithm ├── Attention_study │ ├── img │ │ ├── 20200916164600.png │ │ ├── 20200916170948.png │ │ ├── 20200916171345.png │ │ ├── 20200916171708.png │ │ ├── 20200916172001.png │ │ ├── 20200916172200.png │ │ ├── 20200916172542.png │ │ ├── 20200916172726.png │ │ ├── 20200916172920.png │ │ ├── 20200916182920.png │ │ ├── 20200916183221.png │ │ ├── 下载.jfif │ │ ├── 微信截图_20210109115925.png │ │ └── 微信截图_20210109120012.png │ └── readme.md ├── readme..md └── transformer_study │ ├── ACL2020_Linformer │ └── readme.md │ ├── Performer │ ├── 2009.14794.pdf │ ├── img │ │ ├── 20201103091756.png │ │ ├── 20201103191549.png │ │ ├── v2-7698eb01869e11a5042e8f1742497f44_b.gif │ │ └── 微信截图_20201103083122.png │ └── readme.md │ ├── SHA_RNN_study │ ├── SHA-RNN.pdf │ └── readme.md │ ├── Style_Transformer │ └── T7_Style_Transformer.pdf │ ├── Survey_on_Long_Text_Modeling_with_Transformers │ └── readme.md │ ├── T3_Transformer_XL │ ├── img │ │ ├── 1.webp │ │ ├── 2b.webp │ │ ├── fun1.png │ │ ├── fun2.png │ │ ├── plm.png │ │ └── two_attention.png │ └── readme.md │ ├── T4_Universal_Transformers │ └── readme.md │ ├── Transformer │ ├── 1706.03762.pdf │ ├── code.docx │ ├── code.md │ ├── img │ │ ├── 1.png │ │ ├── 20200623092901.png │ │ ├── 20200623093042.png │ │ ├── 20200623093217.png │ │ ├── 20200624080740.png │ │ ├── 20200624081753.png │ │ ├── 20200624083258.png │ │ ├── 20200624084515.png │ │ ├── 20200624090026.png │ │ ├── 20200624090034.png │ │ ├── 20200624090357.png │ │ ├── 20201009163936.png │ │ ├── 20201009164019.png │ │ ├── 20201009164053.png │ │ ├── 20201125164433.png │ │ ├── QQ截图20200625101229.png │ │ ├── QQ截图20200625103634.png │ │ ├── QQ截图20200625110603.png │ │ ├── QQ截图20200625110706.png │ │ ├── QQ截图20200626120834.png │ │ ├── QQ截图20200626122726.png │ │ ├── QQ截图20200626152309.png │ │ ├── QQ截图20200626153600.png │ │ ├── QQ截图20200626154711.png │ │ ├── v2-595ce4ebf9b3fccb479f7d234190af35_b.gif │ │ ├── v2-595ce4ebf9b3fccb479f7d234190af35_b.png │ │ ├── 微信截图_20200625082324.png │ │ ├── 微信截图_20200625085139.png │ │ ├── 微信截图_20200625085922.png │ │ ├── 微信截图_20200625090454.png │ │ ├── 微信截图_20200625093537.png │ │ ├── 微信截图_20200625095930.png │ │ ├── 微信截图_20200625101800.png │ │ ├── 微信截图_20210128073806.png │ │ ├── 微信截图_20210128074033.png │ │ └── 微信截图_20210128074300.png │ └── readme.md │ ├── img │ ├── 1.png │ ├── 20200623092901.png │ ├── 20200623093042.png │ ├── 20200623093217.png │ ├── 20200624080740.png │ ├── 20200624081753.png │ ├── 20200624083258.png │ ├── 20200624084515.png │ ├── 20200624090026.png │ ├── 20200624090034.png │ ├── 20200624090357.png │ ├── 20201009163936.png │ ├── 20201009164019.png │ ├── 20201009164053.png │ ├── QQ截图20200625101229.png │ ├── QQ截图20200625103634.png │ ├── QQ截图20200625110603.png │ ├── QQ截图20200625110706.png │ ├── QQ截图20200626120834.png │ ├── QQ截图20200626122726.png │ ├── QQ截图20200626152309.png │ ├── QQ截图20200626153600.png │ ├── QQ截图20200626154711.png │ ├── v2-595ce4ebf9b3fccb479f7d234190af35_b.gif │ ├── v2-595ce4ebf9b3fccb479f7d234190af35_b.png │ ├── 微信截图_20200625082324.png │ ├── 微信截图_20200625085139.png │ ├── 微信截图_20200625085922.png │ ├── 微信截图_20200625090454.png │ ├── 微信截图_20200625093537.png │ ├── 微信截图_20200625095930.png │ └── 微信截图_20200625101800.png │ ├── naacl2021_longformer │ ├── img │ │ ├── 微信截图_20220405204037.png │ │ ├── 微信截图_20220405204314.png │ │ ├── 微信截图_20220405204404.png │ │ ├── 微信截图_20220405204845.png │ │ ├── 微信截图_20220405204906.png │ │ ├── 微信截图_20220405205444.png │ │ └── 微信截图_20220405205528.png │ └── readme.md │ ├── readme.md │ ├── readme.png │ └── transformer_survey │ ├── 2009.06732.pdf │ ├── img │ ├── 2b.png │ ├── 2b.webp │ ├── 微信截图_20210414094103.png │ ├── 微信截图_20210415084208.png │ ├── 微信截图_20210415084222.png │ ├── 微信截图_20210415132355.png │ ├── 微信截图_20210415191251.png │ ├── 微信截图_20210416083414.png │ ├── 微信截图_20210416084725.png │ ├── 微信截图_20210416085747.png │ ├── 微信截图_20210416085959.png │ ├── 微信截图_20210416090045.png │ ├── 微信截图_20210416090444.png │ ├── 微信截图_20210416090637.png │ ├── 微信截图_20210416090713.png │ ├── 微信截图_20210416090729.png │ ├── 微信截图_20210422080707.png │ ├── 微信截图_20210422081746.png │ ├── 微信截图_20210422083332.png │ └── 微信截图_20210422083957.png │ └── readme.md └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Local .terraform directories 2 | **/.terraform/* 3 | **/w2v_model/ 4 | **/saved/ 5 | **/runs/* 6 | **/.idea/ 7 | **/__pycache__/ 8 | **/.ipynb_checkpoints/ 9 | **/summarys/ 10 | model/ 11 | **/model/ 12 | **/models/ 13 | **/outputs/ 14 | **/saved_models/ 15 | version/ 16 | **/version/ 17 | **/gitinfo/ 18 | **/mywork/* 19 | 20 | T1_Relation_Classification_via_CDNN/saved_models/* 21 | 22 | text_simple_study/RE2_study/simple-effective-text-matching-pytorch/* 23 | 24 | # .tfstate files 25 | *.tfstate 26 | *.tfstate.* 27 | *checkpoint 28 | **/model.ckpt* 29 | *.ckpt* 30 | # .tfvars files 31 | *.tfvars 32 | *.all 33 | *.hdf5 34 | task/.idea/* 35 | *.xml 36 | *.zip 37 | *.rar 38 | *.bin 39 | *.vec 40 | *.model 41 | *.gz 42 | *.bz2 43 | *.word 44 | *.pkl 45 | **/mywork/* 46 | 47 | -------------------------------------------------------------------------------- /DL_algorithm/Attention_study/img/20200916164600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/Attention_study/img/20200916164600.png -------------------------------------------------------------------------------- /DL_algorithm/Attention_study/img/20200916170948.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/Attention_study/img/20200916170948.png -------------------------------------------------------------------------------- /DL_algorithm/Attention_study/img/20200916171345.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/Attention_study/img/20200916171345.png -------------------------------------------------------------------------------- /DL_algorithm/Attention_study/img/20200916171708.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/Attention_study/img/20200916171708.png -------------------------------------------------------------------------------- /DL_algorithm/Attention_study/img/20200916172001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/Attention_study/img/20200916172001.png -------------------------------------------------------------------------------- /DL_algorithm/Attention_study/img/20200916172200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/Attention_study/img/20200916172200.png -------------------------------------------------------------------------------- /DL_algorithm/Attention_study/img/20200916172542.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/Attention_study/img/20200916172542.png -------------------------------------------------------------------------------- /DL_algorithm/Attention_study/img/20200916172726.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/Attention_study/img/20200916172726.png -------------------------------------------------------------------------------- /DL_algorithm/Attention_study/img/20200916172920.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/Attention_study/img/20200916172920.png -------------------------------------------------------------------------------- /DL_algorithm/Attention_study/img/20200916182920.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/Attention_study/img/20200916182920.png -------------------------------------------------------------------------------- /DL_algorithm/Attention_study/img/20200916183221.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/Attention_study/img/20200916183221.png -------------------------------------------------------------------------------- /DL_algorithm/Attention_study/img/下载.jfif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/Attention_study/img/下载.jfif -------------------------------------------------------------------------------- /DL_algorithm/Attention_study/img/微信截图_20210109115925.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/Attention_study/img/微信截图_20210109115925.png -------------------------------------------------------------------------------- /DL_algorithm/Attention_study/img/微信截图_20210109120012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/Attention_study/img/微信截图_20210109120012.png -------------------------------------------------------------------------------- /DL_algorithm/Attention_study/readme.md: -------------------------------------------------------------------------------- 1 | # 【关于 Attention 】那些你不知道的事 2 | 3 | > 作者:杨夕 4 | > 5 | > 项目地址:https://github.com/km1994/nlp_paper_study 6 | > 7 | > 个人介绍:大佬们好,我叫杨夕,该项目主要是本人在研读顶会论文和复现经典论文过程中,所见、所思、所想、所闻,可能存在一些理解错误,希望大佬们多多指正。 8 | > 9 | 10 | ## 目录 11 | 12 | - [【关于 Attention 】那些你不知道的事](#关于-attention-那些你不知道的事) 13 | - [目录](#目录) 14 | - [什么 是 Attention?](#什么-是-attention) 15 | - [Attention 的应用领域有哪些?](#attention-的应用领域有哪些) 16 | - [seq2seq (Encoder-Decoder)是什么?](#seq2seq-encoder-decoder是什么) 17 | - [seq2seq 框架 是什么?](#seq2seq-框架-是什么) 18 | - [Encoder 是什么?](#encoder-是什么) 19 | - [Decoder 是什么?](#decoder-是什么) 20 | - [在 数学角度上 的 seq2seq ,你知道么?](#在-数学角度上-的-seq2seq-你知道么) 21 | - [seq2seq 存在 什么 问题?](#seq2seq-存在-什么-问题) 22 | - [Attention 介绍](#attention-介绍) 23 | - [Attention 处理步骤?](#attention-处理步骤) 24 | - [步骤一 执行encoder (与 seq2seq 一致)](#步骤一-执行encoder-与-seq2seq-一致) 25 | - [步骤二 计算对齐系数 a](#步骤二-计算对齐系数-a) 26 | - [步骤三 计算上下文语义向量 C](#步骤三-计算上下文语义向量-c) 27 | - [步骤四 更新decoder状态](#步骤四-更新decoder状态) 28 | - [步骤五 计算输出预测词](#步骤五-计算输出预测词) 29 | - [Attention 常用的 对齐计算函数?](#attention-常用的-对齐计算函数) 30 | - [Attention 作用?](#attention-作用) 31 | 32 | 33 | ## 什么 是 Attention? 34 | 35 | 给一张图片,你第一眼会看哪里? 36 | 37 | ![](img/20200916183221.png) 38 | 39 | 当你第一眼看这张图片时,你最关注的地方就是我们 本次 所要讲的 新内容。 40 | 41 | 注意力机制模仿了生物观察行为的内部过程,即一种将内部经验和外部感觉对齐从而增加部分区域的观察精细度的机制。例如人的视觉在处理一张图片时,会通过快速扫描全局图像,获得需要重点关注的目标区域,也就是注意力焦点。然后对这一区域投入更多的注意力资源,以获得更多所需要关注的目标的细节信息,并抑制其它无用信息。 42 | 43 | 是不是领悟到本篇文章的精髓了?没错,这就是 我们本次要讲的 新 知识点 ———— Attention! 44 | 45 | ## Attention 的应用领域有哪些? 46 | 47 | 随着 Attention 提出 开始,就被 广泛 应用于 各个领域。比如:自然语言处理,图片识别,语音识别等不同方向深度学习任务中。随着 【[Transformer](https://github.com/km1994/nlp_paper_study/tree/master/transformer_study/Transformer) 】的提出,Attention被 推向了圣坛。 48 | 49 | ## seq2seq (Encoder-Decoder)是什么? 50 | 51 | - 介绍:seq2seq (Encoder-Decoder)将一个句子(图片)利用一个 Encoder 编码为一个 context,然后在利用一个 Decoder 将 context 解码为 另一个句子(图片)的过程 ; 52 | - 应用: 53 | - 在 Image Caption 的应用中 Encoder-Decoder 就是 CNN-RNN 的编码 - 解码框架; 54 | - 在神经网络机器翻译中 Encoder-Decoder 往往就是 LSTM-LSTM 的编码 - 解码框架,在机器翻译中也被叫做 [Sequence to Sequence learning](https://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf)。 55 | 56 | ![seq2seq](img/20200916164600.png) 57 | 58 | ## seq2seq 框架 是什么? 59 | 60 | ### Encoder 是什么? 61 | 62 | - 目标:将 input 编码成一个固定长度 语义编码 context 63 | - context 作用: 64 | - 1、做为初始向量初始化 Decoder 的模型,做为 decoder 模型预测y1的初始向量; 65 | - 2、做为背景向量,指导y序列中每一个step的y的产出; 66 | - 步骤: 67 | - 1. 遍历输入的每一个Token(词),每个时刻的输入是上一个时刻的隐状态和输入 68 | - 2. 会有一个输出和新的隐状态。这个新的隐状态会作为下一个时刻的输入隐状态。每个时刻都有一个输出; 69 | - 3. 保留最后一个时刻的隐状态,认为它编码了整个句子的 语义编码 context,并把最后一个时刻的隐状态作为Decoder的初始隐状态; 70 | 71 | ### Decoder 是什么? 72 | 73 | - 目标:将 语义编码 context 解码 为 一个 新的 output; 74 | - 步骤: 75 | - 1. 一开始的隐状态是Encoder最后时刻的隐状态,输入是特殊的; 76 | - 2. 使用RNN计算新的隐状态,并输出第一个词; 77 | - 3. 接着用新的隐状态和第一个词计算第二个词,直到decoder产生一个 EOS token, 那么便结束输出了。; 78 | 79 | ## 在 数学角度上 的 seq2seq ,你知道么? 80 | 81 | - 场景介绍:以 机器翻译 为例,给定 一个 句子集合对 (X 表示 一个 英文句子集合,Y 表示 一个 中文句子集合); 82 | 83 | ![](img/20200916170948.png) 84 | 85 | - 目标:对于 X 中 的 xi,我们需要采用 seq2seq 框架 来 生成 Y 中对应 的 yi; 86 | - 步骤: 87 | 88 | 1. 编码器 encoder:将 输入 句子集合 X 进行编码,也就是将 其 通过 非线性变换 转化为 中间语义编码 Context C 89 | 90 | ![](img/20200916171345.png) 91 | 92 | 2. 解码器 decoder:对中间语义编码 context 进行解码,根据句子 X 的中间语义编码 Context C 和之前已经生成的历史信息 y1,y2,...,yi-1 生成 当前时刻信息 yi 93 | 94 | ![](img/20200916171708.png) 95 | 96 | ## seq2seq 存在 什么 问题? 97 | 98 | - **忽略了输入序列X的长度**:当输入句子长度很长,特别是比训练集中最初的句子长度还长时,模型的性能急剧下降; 99 | - **对输入序列X缺乏区分度**:输入X编码成一个固定的长度,对句子中每个词都赋予相同的权重,这样做没有区分度,往往是模型性能下降。 100 | 101 | ## Attention 介绍 102 | 103 | - **Attention 介绍**:帮助模型对输入的x每部分赋予不同的权重,抽取更重要的信息,使模型做出准确判断。同时,不会给模型计算与存储带来更大开销; 104 | - **Attention 作用**:让神经网络把 “ 注意力 ” 放在一部分输入上,即:区分输入的不同部分对输出的影响; 105 | 106 | ## Attention 处理步骤? 107 | 108 | ### 步骤一 执行encoder (与 seq2seq 一致) 109 | 110 | - 思路:将源数据依次输入Encoder,执行Encoder 111 | - 目标:将源序列的信息,编译成语义向量,供后续decoder使用 112 | 113 | ![](img/20200916172001.png) 114 | 115 | ### 步骤二 计算对齐系数 a 116 | 117 | - 思路:在 decoder 的每个词,我们需要关注源序列的所有词和目标序列当前词的相关性大小,并输出相关(对齐)系数 a; 118 | - 步骤: 119 | - 1. 在decoder输出一个预测值前,都会针对encoder的所有step,计算一个score; 120 | - 2. 将score汇总向量化后,每个decoder step能获得一个维度为[step_len,1]的score向量; 121 | - 3. 计算出score后,很自然地按惯例使用softmax进行归一化,得到对齐向量a,维度也是[step_len,1]; 122 | 123 | ![](img/20200916172200.png) 124 | 125 | ### 步骤三 计算上下文语义向量 C 126 | 127 | 128 | - 思路:对齐系数 a 作为权重,对 encoder 每个 step 的 output 向量进行加权求和(对齐向量a点乘outputs矩阵),得到decoder当前 step 的上下文语义向量 c 129 | 130 | ![](img/20200916172542.png) 131 | 132 | ### 步骤四 更新decoder状态 133 | 134 | - 思路:更新decoder状态,这个状态可以是h,也可以是 s 135 | 136 | ![](img/20200916172726.png) 137 | 138 | ### 步骤五 计算输出预测词 139 | 140 | - 思路:做一个语义向量到目标词表的映射(如果attention用于分类模型,那就是做一个到各个分类的映射),然后再进行softmax就可以了 141 | 142 | ![](img/20200916172920.png) 143 | 144 | ## Attention 常用的 对齐计算函数? 145 | 146 | ![](img/20200916182920.png) 147 | 148 | ## Attention 作用? 149 | 150 | - 从增强字 / 词的语义表示这一角度介绍 151 | - 一个字 / 词在一篇文本中表达的意思通常与它的上下文有关。光看 “ 鹄 ” 字,我们可能会觉得很陌生(甚至连读音是什幺都不记得吧),而看到它的上下文 “ 鸿鹄之志 ” 后,就对它立马熟悉了起来。因此,字 / 词的上下文信息有助于增强其语义表示。同时,上下文中的不同字 / 词对增强语义表示所起的作用往往不同。比如在上面这个例子中, “ 鸿 ” 字对理解 “ 鹄 ” 字的作用最大,而 “ 之 ” 字的作用则相对较小。为了有区分地利用上下文字信息增强目标字的语义表示,就可以用到 Attention 机制。 152 | -------------------------------------------------------------------------------- /DL_algorithm/readme..md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/readme..md -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/ACL2020_Linformer/readme.md: -------------------------------------------------------------------------------- 1 | # 【关于 Linformer 】 那些你不知道的事 2 | 3 | > 作者:杨夕 4 | > 5 | > 项目地址:https://github.com/km1994/nlp_paper_study 6 | > 7 | > 个人介绍:大佬们好,我叫杨夕,该项目主要是本人在研读顶会论文和复现经典论文过程中,所见、所思、所想、所闻,可能存在一些理解错误,希望大佬们多多指正。 8 | > 9 | > 论文标题:《Linformer: Self-Attention with Linear Complexity》 10 | > 11 | > 来源:ACL 2020 12 | > 13 | > 链接:https://arxiv.org/abs/2006.04768 14 | > 15 | > 参考:https://zhuanlan.zhihu.com/p/149890569 16 | -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Performer/2009.14794.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Performer/2009.14794.pdf -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Performer/img/20201103091756.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Performer/img/20201103091756.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Performer/img/20201103191549.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Performer/img/20201103191549.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Performer/img/v2-7698eb01869e11a5042e8f1742497f44_b.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Performer/img/v2-7698eb01869e11a5042e8f1742497f44_b.gif -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Performer/img/微信截图_20201103083122.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Performer/img/微信截图_20201103083122.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Performer/readme.md: -------------------------------------------------------------------------------- 1 | # 【关于 Performer 】 那些你不知道的事 2 | 3 | > 作者:杨夕
4 | > 项目地址:https://github.com/km1994/nlp_paper_study
5 | > 论文:RETHINKING ATTENTION WITH PERFORMERS
6 | > 论文地址:chrome-extension://ikhdkkncnoglghljlkmcimlnlhkeamad/pdf-viewer/web/viewer.html?file=https%3A%2F%2Farxiv.org%2Fpdf%2F2009.14794.pdf
7 | > 论文github:https://github.com/google-research/google-research/tree/master/performer
8 | > 个人介绍:大佬们好,我叫杨夕,该项目主要是本人在研读顶会论文和复现经典论文过程中,所见、所思、所想、所闻,可能存在一些理解错误,希望大佬们多多指正。
9 | 10 | ## 前言 11 | 12 | - Transformer 问题 :有着巨大的内存和算力需求,因为它构造了一个注意力矩阵,需求与输入呈平方关系 13 | - Performer 模型因为随机正正交特性为注意力矩阵构建了一个无偏的估计量,可以获得线性增长的资源需求量。 14 | 15 | ## 动机 16 | 17 | - Transformer: 18 | - 核心:注意力模块 19 | - 思路:计算输入序列中所有位置对的相似度得分 20 | - 问题:随着输入序列长度的增加,注意力机制本身的问题也越来越突出,因为它需要二次方的计算时间来产生所有的相似度得分,用来存储这些得分的内存大小也是如此 21 | - 改进方法:稀疏注意力 22 | - 优点:速度快、空间利用率高 23 | - 局限性: 24 | - 首先,它们需要高效的稀疏矩阵乘法运算,但这并不是所有加速器都能做到的; 25 | - 其次,它们通常不能为自己的表示能力提供严格的理论保证; 26 | - 再者,它们主要针对 Transformer 模型和生成预训练进行优化; 27 | - 最后,它们通常会堆更多的注意力层来补偿稀疏表示,这使其很难与其他预训练好的模型一起使用,需要重新训练,消耗大量能源。 28 | 29 | ![](img/微信截图_20201103083122.png) 30 | 31 | ## 方法介绍 32 | 33 | - Performer 34 | - 方法:使用一个高效的(线性)广义注意力框架(generalized attention framework),允许基于不同相似性度量(核)的一类广泛的注意力机制。 35 | - 该框架通过谷歌的新算法 FAVOR+( Fast Attention Via Positive Orthogonal Random Features)【能够提供注意力机制的可扩展低方差、无偏估计,这可以通过随机特征图分解(常规 softmax-attention)来表达】来实现。 36 | - 优点:该方法在保持线性空间和时间复杂度的同时准确率也很有保证,也可以应用到独立的 softmax 运算。此外,该方法还可以和可逆层等其他技术进行互操作。 37 | 38 | ### 广义的注意力机制 39 | 40 | - 以往的注意力机制: 41 | - 分别对应矩阵行与列的 query 和 key 输入相乘,通过 softmax 计算形成一个注意力矩阵,以存储相似度系数。 42 | - 问题:不能将 query-key 生成结果传递给非线性 softmax 计算之后再将其分解为原始的 query 和 key。【将注意力矩阵分解为原始 query 和 key 的随机非线性函数的乘积是可以的,即所谓的随机特征(random feature),这样就可以更加高效地对相似度信息进行编码。】 43 | 44 | ![](img/20201103091756.png) 45 | 46 | - 广义注意力(generalized attention): 47 | - 思路:首先实现一些更广义的非线性函数,隐式定义 query-key 结果中其他类型的相似性度量或核函数 48 | 49 | ### 新算法 FAVOR+:通过矩阵相关性实现快速注意力 50 | 51 | - 思路: 52 | - 上文描述的分解允许我们以线性而非二次内存复杂度的方式存储隐式注意力矩阵; 53 | - 还可以通过分解获得一个线性时间注意力机制。虽然在分解注意力矩阵之后,原始注意力机制与具有值输入的存储注意力矩阵相乘以获得最终结果,我们可以重新排列矩阵乘法以近似常规注意力机制的结果,并且不需要显式地构建二次方大小的注意力矩阵。 54 | 55 | ![](img/20201103191549.png) 56 | 57 | > 左:标准注意力模块计算,其中通过执行带有矩阵 A 和值张量 V 的矩阵乘法来计算最终的预期结果;
58 | > 右:通过解耦低秩分解 A 中使用的矩阵 Q′和 K′以及按照虚线框中指示的顺序执行矩阵乘法,研究者获得了一个线性注意力矩阵,同时不用显式地构建 A 或其近似。 59 | 60 | 上述分析与双向注意力(即非因果注意力)相关,其中没有 past 和 future 的概念。对于输入序列中没有注意前后 token 的单向(即因果)注意力而言,研究者稍微修改方法以使用前缀和计算(prefix-sum computation),它们只存储矩阵计算的运行总数,而不存储显式的下三角常规注意力矩阵。 61 | 62 | ![](img/v2-7698eb01869e11a5042e8f1742497f44_b.gif) 63 | 64 | > 左:标准单向注意力需要 mask 注意力矩阵以获得其下三角部分;
65 | > 右:LHS 上的无偏近似可以通过前缀和获得,其中用于 key 和值向量的随机特征图的外积(outer-product)前缀和实现动态构建,并通过 query 随机特征向量进行左乘计算,以在最终矩阵中获得新行(new row)。 66 | 67 | 68 | 69 | 70 | ## 参考 71 | 72 | 1. [自己挖坑自己填,谷歌大改Transformer注意力,速度、内存利用率都提上去了](https://zhuanlan.zhihu.com/p/269751265) -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/SHA_RNN_study/SHA-RNN.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/SHA_RNN_study/SHA-RNN.pdf -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/SHA_RNN_study/readme.md: -------------------------------------------------------------------------------- 1 | # 【关于 SHA_RNN】 那些的你不知道的事 2 | 3 | > 作者:杨夕 4 | > 5 | > 面向任务:Language Understanding 6 | > 7 | > 论文名称:Single Headed Attention RNN: Stop Thinking With Your Head 单头注意力 RNN: 停止用你的头脑思考 8 | > 9 | > 【注:手机阅读可能图片打不开!!!】 10 | 11 | 12 | ## Abstract 13 | 14 | The leading approaches in language modeling are all obsessed with TV shows of my youth - namely Transformers and Sesame Street. Transformers this, Transformers that, and over here a bonfire worth of GPU-TPU-neuromorphic wafer scale silicon. We opt for the lazy path of old and proven techniques with a fancy crypto inspired acronym: the Single Headed Attention RNN (SHA-RNN). The author’s lone goal is to show that the entire field might have evolved a different direction if we had instead been obsessed with a slightly different acronym and slightly different result. We take a previously strong language model based only on boring LSTMs and get it to within a stone’s throw of a stone’s throw of state-of-the-art byte level language model results on enwik8. We also achieve state-of-the-art on WikiText-103 - or do we? This work has undergone no intensive hyperparameter optimization and lived entirely on a commodity desktop machine that made the author’s small studio apartment far too warm in the midst of a San Franciscan summer. The final results are achievable in plus or minus 24 hours on a single GPU as the author is impatient. The attention mechanism is also readily extended to large contexts and requires minimal computation. Take that Sesame Street. 15 | -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Style_Transformer/T7_Style_Transformer.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Style_Transformer/T7_Style_Transformer.pdf -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Survey_on_Long_Text_Modeling_with_Transformers/readme.md: -------------------------------------------------------------------------------- 1 | # A Survey on Long Text Modeling with Transformers 2 | 3 | > 论文名称:A Survey on Long Text Modeling with Transformers 4 | > 5 | > 论文地址:https://arxiv.org/abs/2302.14502 6 | 7 | ## 一、动机 8 | 9 | - 长文本建模的三个挑战: 10 | - 长度限制 11 | - 计算效率 12 | - 长文本的独特性质 13 | 14 | 15 | ## 参考 16 | 17 | 1. [最新综述:速览Transformer长文本建模研究进展](https://mp.weixin.qq.com/s/D0ohVoyP7PLQKIoIuYC4NQ) -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/T3_Transformer_XL/img/1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/T3_Transformer_XL/img/1.webp -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/T3_Transformer_XL/img/2b.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/T3_Transformer_XL/img/2b.webp -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/T3_Transformer_XL/img/fun1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/T3_Transformer_XL/img/fun1.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/T3_Transformer_XL/img/fun2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/T3_Transformer_XL/img/fun2.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/T3_Transformer_XL/img/plm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/T3_Transformer_XL/img/plm.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/T3_Transformer_XL/img/two_attention.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/T3_Transformer_XL/img/two_attention.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/T3_Transformer_XL/readme.md: -------------------------------------------------------------------------------- 1 | # 【关于 Transformer-XL】 那些的你不知道的事 2 | 3 | > 作者:杨夕 4 | > 5 | > 项目地址:https://github.com/km1994/nlp_paper_study 6 | > 7 | > 面向任务:Language Understanding 8 | > 9 | > 论文地址:[https://arxiv.org/abs/1901.02860](https://arxiv.org/abs/1901.02860) 10 | > 11 | > 论文代码:[https://github.com/kimiyoung/transformer-xl](https://github.com/kimiyoung/transformer-xl) 12 | > 13 | > 【注:手机阅读可能图片打不开!!!】 14 | 15 | ## 摘要 16 | 17 | Transformer具有学习长程依赖关系的潜力,但是受到语言建模中上下文长度固定的限制。 18 | 19 | 为此,本文提出一种新的神经网络架构Transformer-XL,该网络结构能够在不破坏时间一致性的情况下,学习到超越固定长度的依赖性。该网络结构由片段级的循环机制(segment-level recurrence)和全新的位置编码策略(positional encoding scheme)组成。 其优点是不仅可以捕获更长的依赖关系,还可以解决上下文碎片化(context fragmentation)的问题。 20 | 21 | 从实验结果上来看,Transformer-XL 学习到的依赖性比 RNN 学习到的长 80%,比标准 Transformer 学到的长 450%,无论在长序列还是短序列中都得到了更好的结果,而且在评估时比标准 Transformer 快 1800+ 倍。值得一提的是,Transformer-XL还刷新了 bpc 和perplexity(困惑度)的当前最佳结果:在 enwiki8 上 bpc 从 1.06 提升至 0.99,在 text8 上从 1.13 提升至 1.08;在 WikiText-103 上困惑度从 20.5 提升到 18.3,在 One Billion Word 上从 23.7 提升到 21.8,在宾州树库(不经过微调的情况下)上从 55.3 提升到 54.5。本文模型的代码、预训练模型以及超参数在 TensorFlow 和 PyTorch 中都可以使用。 22 | 23 | ## 动机 24 | 25 | 出发思想比较直接,就是奔着现有序列模型对于超长文本建模不足的问题而来。 26 | 27 | RNN:主要面临梯度消失或爆炸(gradient vanishing and explosion),解决方法集中在优化方法、初始化策略、辅助记忆单元的研究上。 28 | 29 | vanilla Transformer:最长建模长度是固定的,无法捕捉更长依赖关系;等长输入序列的获取通常没有遵循句子或语义边界(出于高效考虑,往往就是将文本按长度一段段截取,而没有采用padding机制),可能造成上下文碎片化(context fragmentation)。 30 | 31 | ## 论文思路 32 | 33 | 为了解决上述问题而提出Transformer-XL(extra long),这其中最关键的两项技术是: 34 | 35 | 引入循环机制(Reccurrence,让上一segment的隐含状态可以传递到下一个segment):将循环(recurrence)概念引入了深度自注意力网络。不再从头计算每个新segment的隐藏状态,而是复用从之前segments中获得的隐藏状态。被复用的隐藏状态视为当前segment的memory,而当前的segment为segments之间建立了循环连接(recurrent connection)。因此,超长依赖性建模成为了可能,因为信息可以通过循环连接来传播。 36 | 37 | 提出一种新的相对位置编码方法,避免绝对位置编码在循环机制下的时序错乱:从之前的segment传递信息也可以解决上下文碎片化的问题。更重要的是,本文展示了使用相对位置而不是用绝对位置进行编码的必要性,这样做可以在不造成时间混乱(temporal confusion)的情况下,实现状态的复用。因此,作为额外的技术贡献,文本引入了简单但有效的相对位置编码公式,它可以泛化至比在训练过程中观察到的长度更长的注意力长度。 38 | 39 | ## 贡献 40 | 41 | (1)在纯粹的自注意力模型中引入了recurrence的概念,即循环连接。 42 | 43 | (2)推导了一种新的位置编码方案。这两种技术构成了一组完整的解决方案,因为其中任何一种单独都不能解决上下文长度固定的问题。 44 | 45 | Transformer-XL是首个从实质上不管是character-level还是word-level都比RNN更优秀的自注意力模型。 46 | 47 | ## Model 48 | 49 | ### Vanilla Transformer 50 | 51 | 普通的Transformer是如何编码的?[2]给了动图,很形象,每个segment分别编码,相互之间不产生任何交互。 52 | 53 | ![](img/1.webp) 54 | 55 | ### segment-level recurrence mechanism 56 | 57 | 为了解决长距离依赖,文章引入一个memory状态。 58 | 59 | 在训练过程中,每个片段的表示为最后的隐层状态​,​表示片段的序号,​表示片段的长度,​表示隐层维度。 60 | 61 | 在计算​片段的表示时,用memory缓存​片段​层的隐层状态​,用来更新​,这样就给下一个片段同了上文,长距离依赖也通过memory保存了下来。并且,最大可能的依赖长度线性增长,达到 $N*L$ 。 62 | 63 | ![](img/2b.webp) 64 | 65 | ### relative position embedding scheme 66 | 67 | 在实现片段级递归时遇到一个问题:如果采用绝对位置编码,不同片段的位置编码是一样的,这很显然是不对的。公式如下: 68 | 69 | $$ 70 | \begin{array}{l}{\mathbf{h}_{\tau+1}=f\left(\mathbf{h}_{\tau}, \mathbf{E}_{\mathbf{s}_{\tau+1}}+\mathbf{U}_{1: L}\right)} \\ {\mathbf{h}_{\tau}=f\left(\mathbf{h}_{\tau-1}, \mathbf{E}_{s_{r}}+\mathbf{U}_{1: L}\right)}\end{array} 71 | $$ 72 | 73 | $E_{s_r}$ 表示片段 $s_r$ 的词向量,$U_{1:L}$ 表示绝对位置向量,可以看出,两个片段之间所用的位置向量是一样的。如果一个词出现在两个片段中 $x_{r:j}$ ​、 $U_{r+1:j}$ ​,按照绝对位置编码方式,它们的表示向量是一样的,难以区分。 74 | 75 | 因此,本文引入相对位置编码机制,计算self-attention公式如下: 76 | 77 | $$ 78 | \begin{aligned} \mathbf{A}_{i, j}^{\mathbf{r}^{\mathrm{I}}} &=\underbrace{\mathbf{E}_{x_{i}}^{\top} \mathbf{W}_{q}^{\top} \mathbf{W}_{k, E} \mathbf{E}_{x_{j}}}_{(a)}+\underbrace{\mathbf{E}_{x_{i}}^{\top} \mathbf{W}_{q}^{\top} \mathbf{W}_{k, R} \mathbf{R}_{i-j}}_{(b)} \\ &+\underbrace{u^{\top} \mathbf{W}_{k, E} \mathbf{E}_{x_{j}}}_{(c)}+\underbrace{v^{\top} \mathbf{W}_{k, R} \mathbf{R}_{i-j}}_{(d)} \end{aligned} 79 | $$ 80 | 81 | 1. 引入相对位置编码​,用的是Transformer里用的sinusoid encoding matrix,不需要学。 82 | ​ 83 | 1. $u$ 和 $v$ ​是需要学习的参数,这是这部分的关键。在计算self-attention时,由于query所有位置对应的query向量是一样的,因此不管的query位置如何,对不同单词的attention偏差应保持相同。 84 | ​ 85 | 1. $W_{k,E}$ 和 $W_{k,R}$ ​也是需要学习的参数,分别产生基于内容的key向量和基于位置的key向量。 86 | 87 | 最后再经过Masked-Softmax、Layer Normalization、Positionwise-Feed-Forward得到最终预测用的​, 88 | 89 | 90 | ## Conclusion 91 | 92 | Transformer-XL从提高语言模型的长距离依赖建模能力出发,提出了片段级递归机制,设计了更好的相对位置编码机制,对长文本的编码更有效。不仅如此,在评估阶段速度更快,很巧妙。在此基础上,XLNet[4]从无监督预训练方法出发,对比自回归语言模型和自编码语言模型的优缺点,设计出了排队语言模型,在自然语言处理下游任务中大放异彩。预训练语言模型属于自监督学习的范畴,这两篇论文从语言模型的根本问题出发(建模长距离依赖/更好地编码上下文),提出一个主要方法(片段级递归机制/排列语言模型),在实现过程中发现需要重新设计子模块(相对位置编码/双流注意力机制),最后完成significant work,使得设计的任务很有说服力,理论性强。 93 | 94 | ## Reference 95 | 96 | [1]. Zihang Dai, Zhilin Yang, Yiming Yang, William W Cohen, Jaime Carbonell, Quoc V Le, and Ruslan Salakhutdinov. Transformer-xl: Attentive language models beyond a fixed-length context. arXiv preprint arXiv:1901.02860, 2019. 97 | 98 | [2] [论文笔记 —— Transformer-XL](https://zhuanlan.zhihu.com/p/70745925) 99 | 100 | [3] [Transformer-XL及XLNet论文笔记](https://www.ramlinbird.com/2019/08/05/transformer-xl及xlnet论文笔记/) 101 | 102 | [4] [文献阅读笔记:Transformer-XL : Attentive Language Models Beyond a Fixed-Length Context](https://blog.csdn.net/ljp1919/article/details/94577523) 103 | 104 | [5] [Transformer-XL解读(论文 + PyTorch源码)](https://blog.csdn.net/magical_bubble/article/details/89060213) 105 | 106 | [6] [transformer-xl](https://github.com/kimiyoung/transformer-xl/tree/master/tf) 107 | -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/T4_Universal_Transformers/readme.md: -------------------------------------------------------------------------------- 1 | # Universal Transformers 2 | 3 | 4 | ## 参考资料 5 | 6 | 1. [【NLP】Universal Transformers详解](https://zhuanlan.zhihu.com/p/44655133) -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/1706.03762.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/1706.03762.pdf -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/code.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/code.docx -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/code.md: -------------------------------------------------------------------------------- 1 | # 【关于 Transformer 代码实战(文本摘要任务篇)】 那些你不知道的事 2 | 3 | > 作者:杨夕 4 | > 5 | > 项目地址:https://github.com/km1994/nlp_paper_study 6 | > 7 | > 个人介绍:大佬们好,我叫杨夕,该项目主要是本人在研读顶会论文和复现经典论文过程中,所见、所思、所想、所闻,可能存在一些理解错误,希望大佬们多多指正。 8 | 9 | ## 目录 10 | 11 | - [【关于 Transformer 代码实战(文本摘要任务篇)】 那些你不知道的事](#关于-transformer-代码实战文本摘要任务篇-那些你不知道的事) 12 | - [目录](#目录) 13 | - [引言](#引言) 14 | - [一、文本摘要数据集介绍](#一文本摘要数据集介绍) 15 | - [二、数据集加载介绍](#二数据集加载介绍) 16 | - [2.1 数据加载](#21-数据加载) 17 | - [2.2 数据字段抽取](#22-数据字段抽取) 18 | - [三、 数据预处理](#三-数据预处理) 19 | - [3.1 summary 数据 处理](#31-summary-数据-处理) 20 | - [3.2 编码处理](#32-编码处理) 21 | - [3.3 获取 encoder 词典 和 decoder 词典 长度](#33-获取-encoder-词典-和-decoder-词典-长度) 22 | - [3.4 确定 encoder 和 decoder 的 maxlen](#34-确定-encoder-和-decoder-的-maxlen) 23 | - [3.5 序列 填充/裁剪](#35-序列-填充裁剪) 24 | - [四、创建数据集 pipeline](#四创建数据集-pipeline) 25 | - [五、组件构建](#五组件构建) 26 | - [5.1 位置编码](#51-位置编码) 27 | - [5.1.1 问题](#511-问题) 28 | - [5.1.2 目的](#512-目的) 29 | - [5.1.3 思路](#513-思路) 30 | - [5.1.4 位置向量的作用](#514-位置向量的作用) 31 | - [5.1.5 步骤](#515-步骤) 32 | - [5.1.6 计算公式](#516-计算公式) 33 | - [5.1.7 代码实现](#517-代码实现) 34 | - [5.2 Masking 操作](#52-masking-操作) 35 | - [5.2.1 介绍](#521-介绍) 36 | - [5.2.3 类别:padding mask and sequence mask](#523-类别padding-mask-and-sequence-mask) 37 | - [padding mask](#padding-mask) 38 | - [sequence mask](#sequence-mask) 39 | - [六、模型构建](#六模型构建) 40 | - [6.1 self-attention](#61-self-attention) 41 | - [6.1.1 动机](#611-动机) 42 | - [6.1.2 传统 Attention](#612-传统-attention) 43 | - [6.1.3 核心思想](#613-核心思想) 44 | - [6.1.4 目的](#614-目的) 45 | - [6.1.5 公式](#615-公式) 46 | - [6.1.6 步骤](#616-步骤) 47 | - [6.1.7 代码实现](#617-代码实现) 48 | - [6.2 Multi-Headed Attention](#62--multi-headed-attention) 49 | - [思路](#思路) 50 | - [步骤](#步骤) 51 | - [代码实现](#代码实现) 52 | - [6.3 前馈网络](#63-前馈网络) 53 | - [思路](#思路-1) 54 | - [目的](#目的) 55 | - [代码实现](#代码实现-1) 56 | - [6.4 Transformer encoder 单元](#64-transformer-encoder-单元) 57 | - [结构](#结构) 58 | - [代码实现](#代码实现-2) 59 | - [6.5 Transformer decoder 单元](#65-transformer-decoder-单元) 60 | - [结构](#结构-1) 61 | - [代码实现](#代码实现-3) 62 | - [七、Encoder 和 Decoder 模块构建](#七encoder-和-decoder-模块构建) 63 | - [7.1 Encoder 模块构建](#71-encoder-模块构建) 64 | - [7.2 Dncoder 模块构建](#72-dncoder-模块构建) 65 | - [八、Transformer 构建](#八transformer-构建) 66 | - [九、模型训练](#九模型训练) 67 | - [9.1 配置类](#91-配置类) 68 | - [9.2 优化函数定义](#92-优化函数定义) 69 | - [9.3 Loss 损失函数 和 评测指标 定义](#93--loss-损失函数-和-评测指标-定义) 70 | - [9.3.1 Loss 损失函数 定义](#931--loss-损失函数-定义) 71 | - [9.4 Transformer 实例化](#94-transformer-实例化) 72 | - [9.5 Mask 实现](#95-mask-实现) 73 | - [9.6 模型结果保存](#96-模型结果保存) 74 | - [9.7 Training Steps](#97-training-steps) 75 | - [9.8 训练](#98-训练) 76 | 77 | ## 引言 78 | 79 | 之前给 小伙伴们 写过 一篇 【[【关于Transformer】 那些的你不知道的事](https://github.com/km1994/nlp_paper_study/tree/master/transformer_study/Transformer)】后,有一些小伙伴联系我,并和我请教了蛮多细节性问题,针对该问题,小菜鸡的我 也 想和小伙伴 一起 学习,所以就 找到了 一篇【[Transformer 在文本摘要任务 上的应用](https://github.com/rojagtap/abstractive_summarizer)】作为本次学习的 Coding! 80 | 81 | ## 一、文本摘要数据集介绍 82 | 83 | 本任务采用的 文本摘要数据集 为 [ Kaggle 比赛 之 Inshorts Dataset](https://www.kaggle.com/shashichander009/inshorts-news-data),该数据集 包含以下字段: 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 |
序号字段名字段介绍 举例
1Headline标题 4 ex-bank officials booked for cheating bank of ₹209 crore
2Short短文 The CBI on Saturday booked four former officials of Syndicate Bank and six others for cheating, forgery, criminal conspiracy and causing ₹209 crore loss to the state-run bank. The accused had availed home loans and credit from Syndicate Bank on the basis of forged and fabricated documents. These funds were fraudulently transferred to the companies owned by the accused persons.
3Source数据来源 The New Indian Express
4Time发表时间 9:25:00
5Publish Date发表日期 2017/3/26
105 | 106 | > 注:这里我们只 用到 Headline[摘要] 和 Short[长文本] 作为 文本摘要任务 实验数据 107 | 108 | ## 二、数据集加载介绍 109 | 110 | ### 2.1 数据加载 111 | 112 | 本文将数据集存储在 Excel 文件中,通过 pandas 的 read_excel() 方法 获取数据集,代码如下: 113 | 114 | ```s 115 | news = pd.read_excel("data/news.xlsx") 116 | ``` 117 | 118 | ### 2.2 数据字段抽取 119 | 120 | 在 [一、文本摘要数据集介绍](#一文本摘要数据集介绍) 中,我们说过,我们只用到 Headline[摘要] 和 Short[长文本] 作为 文本摘要任务 实验数据,所以我们需要 清除 其他字段。代码如下: 121 | 122 | ```s 123 | news.drop(['Source ', 'Time ', 'Publish Date'], axis=1, inplace=True) 124 | ``` 125 | 126 | 可以采用以下命令,查看结果: 127 | 128 | ```s 129 | news.head() 130 | news.shape # (55104, 2) 131 | ``` 132 | 133 | ![](img/20201125164433.png) 134 | 135 | 方便后期操作,我们这里直接 从 DataFrame 中分别抽取 出 Headline[摘要] 和 Short[长文本] 数据: 136 | 137 | ```s 138 | document = news['Short'] 139 | summary = news['Headline'] 140 | document[30], summary[30] 141 | >>> 142 | ('According to the Guinness World Records, the most generations alive in a single family have been seven. The difference between the oldest and the youngest person in the family was about 109 years, when Augusta Bunge's great-great-great-great grandson was born on January 21, 1989. The family belonged to the United States of America.', 143 | 'The most generations alive in a single family have been 7') 144 | ``` 145 | 146 | ## 三、 数据预处理 147 | 148 | ### 3.1 summary 数据 处理 149 | 150 | summary 数据 作为 decoder 序列数据,我们需要做一些小处理【前后分别加一个标识符】,如下所示: 151 | 152 | ```s 153 | # for decoder sequence 154 | summary = summary.apply(lambda x: ' ' + x + ' ') 155 | summary[0] 156 | >>> 157 | ' 4 ex-bank officials booked for cheating bank of ₹209 crore ' 158 | ``` 159 | 160 | ### 3.2 编码处理 161 | 162 | 在 进行 文本摘要任务 之前,我们需要 将 文本进行编码: 163 | 164 | 1. 变量定义 165 | ```s 166 | # since < and > from default tokens cannot be removed 167 | filters = '!"#$%&()*+,-./:;=?@[\\]^_`{|}~\t\n' # 文本中特殊符号清洗 168 | oov_token = '' # 未登录词 表示 169 | ``` 170 | 2. 定义 文本预处理 tf.keras.preprocessing.text.Tokenizer() 编码类【用于后期 文本编码处理】 171 | ```s 172 | document_tokenizer = tf.keras.preprocessing.text.Tokenizer(oov_token=oov_token) 173 | summary_tokenizer = tf.keras.preprocessing.text.Tokenizer(filters=filters, oov_token=oov_token) 174 | ``` 175 | > Tokenizer : 一个将文本向量化,转换成序列的类。用来文本处理的分词、嵌入 。 176 | ```s 177 | keras.preprocessing.text.Tokenizer(num_words=None, 178 | filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n', 179 | lower=True, 180 | split=' ', 181 | char_level=False, 182 | oov_token=None, 183 | document_count=0) 184 | ``` 185 | - 参数说明: 186 | - num_words: 默认是None处理所有字词,但是如果设置成一个整数,那么最后返回的是最常见的、出现频率最高的num_words个字词。一共保留 num_words-1 个词。 187 | - filters: 过滤一些特殊字符,默认上文的写法就可以了。 188 | - lower: 是否全部转为小写。 189 | - split: 分词的分隔符字符串,默认为空格。因为英文分词分隔符就是空格。 190 | - char_level: 分字。 191 | - oov_token: if given, it will be added to word_index and used to replace out-of-vocabulary words during text_to_sequence calls 192 | > 参考文档:[Keras分词器 Tokenizer](http://codewithzhangyi.com/2019/04/23/keras-tokenizer/) 193 | 3. 构建词典库 194 | ```s 195 | # 构建词典库 196 | document_tokenizer.fit_on_texts(document) 197 | summary_tokenizer.fit_on_texts(summary) 198 | ``` 199 | 4. 文本列表 转 序列的列表 【列表中每个序列对应于一段输入文本】 200 | ```s 201 | # 文本列表 转 序列的列表 【列表中每个序列对应于一段输入文本】 202 | inputs = document_tokenizer.texts_to_sequences(document) 203 | targets = summary_tokenizer.texts_to_sequences(summary) 204 | # 举例测试 205 | summary_tokenizer.texts_to_sequences(["This is a test"]) # [[184, 22, 12, 71]] 206 | summary_tokenizer.sequences_to_texts([[184, 22, 12, 71]]) # ['this is a test'] 207 | ``` 208 | 209 | ### 3.3 获取 encoder 词典 和 decoder 词典 长度 210 | ```s 211 | encoder_vocab_size = len(document_tokenizer.word_index) + 1 212 | decoder_vocab_size = len(summary_tokenizer.word_index) + 1 213 | # vocab_size 214 | encoder_vocab_size, decoder_vocab_size 215 | >>> 216 | (76362, 29661) 217 | ``` 218 | 219 | ### 3.4 确定 encoder 和 decoder 的 maxlen 220 | 221 | 1. 分别进行 documents 和 summarys 中每个 序列长度 222 | 223 | ```s 224 | document_lengths = pd.Series([len(x) for x in document]) 225 | summary_lengths = pd.Series([len(x) for x in summary]) 226 | ``` 227 | 2. 对 document_lengths 和 summary_lengths 进行 统计分析 228 | 229 | - 对 document 进行 统计分析 230 | ```s 231 | document_lengths.describe() 232 | >>> 233 | count 55104.000000 234 | mean 368.003049 235 | std 26.235510 236 | min 280.000000 237 | 25% 350.000000 238 | 50% 369.000000 239 | 75% 387.000000 240 | max 469.000000 241 | dtype: float64 242 | ``` 243 | - 对 summary 进行 统计分析 244 | ```s 245 | summary_lengths.describe() 246 | >>> 247 | count 55104.000000 248 | mean 63.620282 249 | std 7.267463 250 | min 20.000000 251 | 25% 59.000000 252 | 50% 63.000000 253 | 75% 69.000000 254 | max 96.000000 255 | dtype: float64 256 | ``` 257 | 3. 确定 encoder 和 decoder 的 maxlen 258 | ```s 259 | # 取值>并同时四舍五入到第75个百分位数,而不会留下高方差 260 | encoder_maxlen = 400 261 | decoder_maxlen = 75 262 | ``` 263 | 264 | ### 3.5 序列 填充/裁剪 265 | ```s 266 | # 对 序列 进行 填充/裁剪 ,是所有序列长度 都 等于 maxlen 267 | inputs = tf.keras.preprocessing.sequence.pad_sequences(inputs, maxlen=encoder_maxlen, padding='post', truncating='post') 268 | targets = tf.keras.preprocessing.sequence.pad_sequences(targets, maxlen=decoder_maxlen, padding='post', truncating='post') 269 | ``` 270 | 271 | ## 四、创建数据集 pipeline 272 | 273 | 对数据集的顺序进行打乱,并 进行分 batch 274 | 275 | ```s 276 | # 数据类型 转为 为 tf.int32 277 | inputs = tf.cast(inputs, dtype=tf.int32) 278 | targets = tf.cast(targets, dtype=tf.int32) 279 | 280 | BUFFER_SIZE = 20000 281 | BATCH_SIZE = 64 282 | 283 | dataset = tf.data.Dataset.from_tensor_slices((inputs, targets)).shuffle(BUFFER_SIZE).batch(BATCH_SIZE) 284 | ``` 285 | 286 | ## 五、组件构建 287 | 288 | ### 5.1 位置编码 289 | 290 | #### 5.1.1 问题 291 | 292 | - 介绍:缺乏 一种 表示 输入序列中 单词顺序 的方法 293 | - 说明:因为模型不包括Recurrence/Convolution,因此是无法捕捉到序列顺序信息的,例如将K、V按行进行打乱,那么Attention之后的结果是一样的。但是序列信息非常重要,代表着全局的结构,因此必须将序列的分词相对或者绝对position信息利用起来 294 | 295 | #### 5.1.2 目的 296 | 297 | 加入词序信息,使 Attention 能够分辨出不同位置的词 298 | 299 | #### 5.1.3 思路 300 | 301 | 在 encoder 层和 decoder 层的输入添加了一个额外的向量Positional Encoding,维度和embedding的维度一样,让模型学习到这个值 302 | 303 | #### 5.1.4 位置向量的作用 304 | 305 | - 决定当前词的位置; 306 | - 计算在一个句子中不同的词之间的距离 307 | 308 | #### 5.1.5 步骤 309 | - 将每个位置编号, 310 | - 然后每个编号对应一个向量, 311 | - 通过将位置向量和词向量相加,就给每个词都引入了一定的位置信息。 312 | 313 | #### 5.1.6 计算公式 314 | 315 | ![](img/QQ截图20200625103634.png) 316 | 317 | - 论文的位置编码是使用三角函数去计算的。好处: 318 | - 值域只有[-1,1] 319 | - 容易计算相对位置。 320 | 321 | ![](img/20200624090357.png) 322 | 323 | > 注:
324 | > pos 表示当前词在句子中的位置
325 | > i 表示向量中每个值 的 index
326 | > 在偶数位置:使用 正弦编码 sin();
327 | > 在奇数位置:使用 余弦编码 cos();
328 | 329 | #### 5.1.7 代码实现 330 | 331 | ```s 332 | # 位置编码 类 333 | class Positional_Encoding(): 334 | def __init__(self): 335 | pass 336 | # 功能:计算角度 函数 337 | def get_angles(self, position, i, d_model): 338 | ''' 339 | 功能:计算角度 函数 340 | input: 341 | position 单词在句子中的位置 342 | i 维度 343 | d_model 向量维度 344 | ''' 345 | angle_rates = 1 / np.power(10000, (2 * (i // 2)) / np.float32(d_model)) 346 | return position * angle_rates 347 | # 功能:位置编码 函数 348 | def positional_encoding(self, position, d_model): 349 | ''' 350 | 功能:位置编码 函数 351 | input: 352 | position 单词在句子中的位置 353 | d_model 向量维度 354 | ''' 355 | angle_rads = self.get_angles( 356 | np.arange(position)[:, np.newaxis], 357 | np.arange(d_model)[np.newaxis, :], 358 | d_model 359 | ) 360 | 361 | # apply sin to even indices in the array; 2i 362 | angle_rads[:, 0::2] = np.sin(angle_rads[:, 0::2]) 363 | 364 | # apply cos to odd indices in the array; 2i+1 365 | angle_rads[:, 1::2] = np.cos(angle_rads[:, 1::2]) 366 | 367 | pos_encoding = angle_rads[np.newaxis, ...] 368 | 369 | return tf.cast(pos_encoding, dtype=tf.float32) 370 | ``` 371 | 372 | ### 5.2 Masking 操作 373 | 374 | #### 5.2.1 介绍 375 | 376 | 掩盖某些值的信息,让模型信息不到该信息; 377 | 378 | #### 5.2.3 类别:padding mask and sequence mask 379 | 380 | ##### padding mask 381 | - 作用域:每一个 scaled dot-product attention 中 382 | - 动机:输入句子的长度不一问题 383 | - 方法: 384 | - 短句子:后面 采用 0 填充 385 | - 长句子:只截取 左边 部分内容,其他的丢弃 386 | - 原因:对于 填充 的位置,其所包含的信息量 对于 模型学习 作用不大,所以 self-attention 应该 抛弃对这些位置 进行学习; 387 | - 做法:在这些位置上加上 一个 非常大 的负数(负无穷),使 该位置的值经过 Softmax 后,值近似 0,利用 padding mask 标记哪些值需要做处理; 388 | - 实现: 389 | ```s 390 | # 功能: padding mask 391 | def create_padding_mask(seq): 392 | ''' 393 | 功能: padding mask 394 | input: 395 | seq 序列 396 | ''' 397 | seq = tf.cast(tf.math.equal(seq, 0), tf.float32) 398 | return seq[:, tf.newaxis, tf.newaxis, :] 399 | ``` 400 | 401 | ##### sequence mask 402 | - 作用域:只作用于 decoder 的 self-attention 中 403 | - 动机:不可预测性; 404 | - 目标:sequence mask 是为了使得 decoder 不能看见未来的信息。也就是对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此我们需要想一个办法,把 t 之后的信息给隐藏起来。 405 | - 做法:产生一个上三角矩阵,上三角的值全为0。把这个矩阵作用在每一个序列上,就可以达到我们的目的 406 | - 实现: 407 | ```s 408 | # 功能:sequence mask 409 | def create_look_ahead_mask(size): 410 | ''' 411 | 功能: sequence mask 412 | input: 413 | seq 序列 414 | ''' 415 | mask = 1 - tf.linalg.band_part(tf.ones((size, size)), -1, 0) 416 | return mask 417 | ``` 418 | 419 | ## 六、模型构建 420 | 421 | ### 6.1 self-attention 422 | 423 | #### 6.1.1 动机 424 | - CNN 所存在的长距离依赖问题; 425 | - RNN 所存在的无法并行化问题【虽然能够在一定长度上缓解 长距离依赖问题】; 426 | #### 6.1.2 传统 Attention 427 | - 方法:基于源端和目标端的隐向量计算Attention, 428 | - 结果:源端每个词与目标端每个词间的依赖关系 【源端->目标端】 429 | - 问题:忽略了 远端或目标端 词与词间 的依赖关系 430 | #### 6.1.3 核心思想 431 | - 介绍: self-attention的结构在计算每个token时,总是会考虑整个序列其他token的表达; 432 | - 举例:“我爱中国”这个序列,在计算"我"这个词的时候,不但会考虑词本身的embedding,也同时会考虑其他词对这个词的影响 433 | #### 6.1.4 目的 434 | 学习句子内部的词依赖关系,捕获句子的内部结构。 435 | #### 6.1.5 公式 436 | ![](img/20200624084515.png) 437 | ![](img/微信截图_20200625082324.png) 438 | #### 6.1.6 步骤 439 | > 建议阅读 [Transformer#self-attention-长怎么样](https://github.com/km1994/nlp_paper_study/tree/master/transformer_study/Transformer#self-attention-长怎么样) 440 | #### 6.1.7 代码实现 441 | ```s 442 | def scaled_dot_product_attention(q, k, v, mask): 443 | # s1:权重 score 计算:查询向量 query 点乘 key 444 | matmul_qk = tf.matmul(q, k, transpose_b=True) 445 | # s2:scale 操作:除以 sqrt(dk),将 Softmax 函数推入梯度极小的区域 446 | dk = tf.cast(tf.shape(k)[-1], tf.float32) 447 | scaled_attention_logits = matmul_qk / tf.math.sqrt(dk) 448 | # s3: 449 | if mask is not None: 450 | scaled_attention_logits += (mask * -1e9) 451 | # s4:Softmax 归一化 452 | attention_weights = tf.nn.softmax(scaled_attention_logits, axis=-1) 453 | # s5:加权求和 454 | output = tf.matmul(attention_weights, v) 455 | return output, attention_weights 456 | ``` 457 | 458 | ### 6.2 Multi-Headed Attention 459 | 460 | #### 思路 461 | - 相当于 $h$ 个 不同的 self-attention 的集成 462 | - 就是把self-attention做 n 次,取决于 head 的个数;论文里面是做了8次。 463 | #### 步骤 464 | - step 1 : 初始化 N 组 $Q,K,V$矩阵(论文为 8组); 465 | - step 2 : 每组 分别 进行 self-attention; 466 | - step 3: 467 | - 问题:多个 self-attention 会得到 多个 矩阵,但是前馈神经网络没法输入8个矩阵; 468 | - 目标:把8个矩阵降为1个 469 | - 步骤: 470 | - 每次self-attention都会得到一个 Z 矩阵,把每个 Z 矩阵拼接起来, 471 | - 再乘以一个Wo矩阵, 472 | - 得到一个最终的矩阵,即 multi-head Attention 的结果; 473 | ![](img/微信截图_20200625101800.png) 474 | #### 代码实现 475 | ```s 476 | class MultiHeadAttention(tf.keras.layers.Layer): 477 | def __init__(self, d_model, num_heads): 478 | super(MultiHeadAttention, self).__init__() 479 | self.num_heads = num_heads 480 | self.d_model = d_model 481 | 482 | assert d_model % self.num_heads == 0 483 | 484 | self.depth = d_model // self.num_heads 485 | # 初始化 Q,K,V 矩阵 486 | self.wq = tf.keras.layers.Dense(d_model) 487 | self.wk = tf.keras.layers.Dense(d_model) 488 | self.wv = tf.keras.layers.Dense(d_model) 489 | 490 | self.dense = tf.keras.layers.Dense(d_model) 491 | 492 | def split_heads(self, x, batch_size): 493 | x = tf.reshape(x, (batch_size, -1, self.num_heads, self.depth)) 494 | return tf.transpose(x, perm=[0, 2, 1, 3]) 495 | 496 | def call(self, v, k, q, mask): 497 | batch_size = tf.shape(q)[0] 498 | # step 1:利用矩阵计算 q,k,v 499 | q = self.wq(q) 500 | k = self.wk(k) 501 | v = self.wv(v) 502 | # step 2: 503 | q = self.split_heads(q, batch_size) 504 | k = self.split_heads(k, batch_size) 505 | v = self.split_heads(v, batch_size) 506 | # step 3:每组 分别 进行 self-attention 507 | scaled_attention, attention_weights = scaled_dot_product_attention( 508 | q, k, v, mask) 509 | # step 4:矩阵拼接 510 | scaled_attention = tf.transpose(scaled_attention, perm=[0, 2, 1, 3]) 511 | concat_attention = tf.reshape(scaled_attention, (batch_size, -1, self.d_model)) 512 | # step 5:全连接层 513 | output = self.dense(concat_attention) 514 | return output, attention_weights 515 | ``` 516 | 517 | ### 6.3 前馈网络 518 | 519 | #### 思路 520 | 521 | 经过一层前馈网络以及 Add&Normalize,(线性转换+relu+线性转换 如下式) 522 | 523 | ![](img/20200624081753.png) 524 | 525 | #### 目的 526 | 527 | 增加非线性的表达能力,毕竟之前的结构基本都是简单的矩阵乘法。若前馈网络的隐向量是512维,则结构最后输出100*512; 528 | 529 | #### 代码实现 530 | 531 | ```s 532 | def point_wise_feed_forward_network(d_model, dff): 533 | return tf.keras.Sequential([ 534 | tf.keras.layers.Dense(dff, activation='relu'), 535 | tf.keras.layers.Dense(d_model) 536 | ]) 537 | ``` 538 | 539 | ### 6.4 Transformer encoder 单元 540 | 541 | #### 结构 542 | 543 | ![](img/20200624080740.png) 544 | 545 | #### 代码实现 546 | 547 | ```s 548 | class EncoderLayer(tf.keras.layers.Layer): 549 | def __init__(self, d_model, num_heads, dff, rate=0.1): 550 | super(EncoderLayer, self).__init__() 551 | 552 | self.mha = MultiHeadAttention(d_model, num_heads) 553 | self.ffn = point_wise_feed_forward_network(d_model, dff) 554 | 555 | self.layernorm1 = tf.keras.layers.LayerNormalization(epsilon=1e-6) 556 | self.layernorm2 = tf.keras.layers.LayerNormalization(epsilon=1e-6) 557 | 558 | self.dropout1 = tf.keras.layers.Dropout(rate) 559 | self.dropout2 = tf.keras.layers.Dropout(rate) 560 | 561 | def call(self, x, training, mask): 562 | # step 1:多头自注意力 563 | attn_output, _ = self.mha(x, x, x, mask) 564 | # step 2:前馈网络 565 | attn_output = self.dropout1(attn_output, training=training) 566 | # step 3:Layer Norml 567 | out1 = self.layernorm1(x + attn_output) 568 | # step 4:前馈网络 569 | ffn_output = self.ffn(out1) 570 | ffn_output = self.dropout2(ffn_output, training=training) 571 | # step 5:Layer Norml 572 | out2 = self.layernorm2(out1 + ffn_output) 573 | 574 | return out2 575 | ``` 576 | 577 | ### 6.5 Transformer decoder 单元 578 | 579 | #### 结构 580 | 581 | ![](img/20200624083258.png) 582 | 583 | #### 代码实现 584 | 585 | ```s 586 | class DecoderLayer(tf.keras.layers.Layer): 587 | def __init__(self, d_model, num_heads, dff, rate=0.1): 588 | super(DecoderLayer, self).__init__() 589 | 590 | self.mha1 = MultiHeadAttention(d_model, num_heads) 591 | self.mha2 = MultiHeadAttention(d_model, num_heads) 592 | 593 | self.ffn = point_wise_feed_forward_network(d_model, dff) 594 | 595 | self.layernorm1 = tf.keras.layers.LayerNormalization(epsilon=1e-6) 596 | self.layernorm2 = tf.keras.layers.LayerNormalization(epsilon=1e-6) 597 | self.layernorm3 = tf.keras.layers.LayerNormalization(epsilon=1e-6) 598 | 599 | self.dropout1 = tf.keras.layers.Dropout(rate) 600 | self.dropout2 = tf.keras.layers.Dropout(rate) 601 | self.dropout3 = tf.keras.layers.Dropout(rate) 602 | 603 | 604 | def call(self, x, enc_output, training, look_ahead_mask, padding_mask): 605 | # step 1:带 sequence mask 的 多头自注意力 606 | attn1, attn_weights_block1 = self.mha1(x, x, x, look_ahead_mask) 607 | attn1 = self.dropout1(attn1, training=training) 608 | # step 2:Layer Norm 609 | out1 = self.layernorm1(attn1 + x) 610 | # step 3:带 padding mask 的 多头自注意力 611 | attn2, attn_weights_block2 = self.mha2(enc_output, enc_output, out1, padding_mask) 612 | attn2 = self.dropout2(attn2, training=training) 613 | # step 4:Layer Norm 614 | out2 = self.layernorm2(attn2 + out1) 615 | # step 5:前馈网络 616 | ffn_output = self.ffn(out2) 617 | ffn_output = self.dropout3(ffn_output, training=training) 618 | # step 6:Layer Norm 619 | out3 = self.layernorm3(ffn_output + out2) 620 | return out3, attn_weights_block1, attn_weights_block2 621 | 622 | ``` 623 | 624 | ## 七、Encoder 和 Decoder 模块构建 625 | 626 | ### 7.1 Encoder 模块构建 627 | 628 | ```s 629 | class Encoder(tf.keras.layers.Layer): 630 | def __init__(self, num_layers, d_model, num_heads, dff, input_vocab_size, maximum_position_encoding, rate=0.1): 631 | super(Encoder, self).__init__() 632 | 633 | self.d_model = d_model 634 | self.num_layers = num_layers # encoder 层数 635 | # 词嵌入 636 | self.embedding = tf.keras.layers.Embedding(input_vocab_size, d_model) 637 | # 位置编码 638 | self.positional_encoding_obj = Positional_Encoding() 639 | self.pos_encoding = self.positional_encoding_obj.positional_encoding(maximum_position_encoding, self.d_model) 640 | # Encoder 模块构建 641 | self.enc_layers = [EncoderLayer(d_model, num_heads, dff, rate) for _ in range(num_layers)] 642 | 643 | self.dropout = tf.keras.layers.Dropout(rate) 644 | 645 | def call(self, x, training, mask): 646 | seq_len = tf.shape(x)[1] 647 | # step 1:词嵌入 648 | x = self.embedding(x) 649 | x *= tf.math.sqrt(tf.cast(self.d_model, tf.float32)) 650 | # step 2:位置编码 651 | x += self.pos_encoding[:, :seq_len, :] 652 | 653 | x = self.dropout(x, training=training) 654 | # step 3:Encoder 模块构建 655 | for i in range(self.num_layers): 656 | x = self.enc_layers[i](x, training, mask) 657 | 658 | return x 659 | 660 | ``` 661 | 662 | ### 7.2 Dncoder 模块构建 663 | 664 | ```s 665 | class Decoder(tf.keras.layers.Layer): 666 | def __init__(self, num_layers, d_model, num_heads, dff, target_vocab_size, maximum_position_encoding, rate=0.1): 667 | super(Decoder, self).__init__() 668 | 669 | self.d_model = d_model 670 | self.num_layers = num_layers # encoder 层数 671 | # 词嵌入 672 | self.embedding = tf.keras.layers.Embedding(target_vocab_size, d_model) 673 | # 位置编码 674 | self.positional_encoding_obj = Positional_Encoding() 675 | self.pos_encoding = self.positional_encoding_obj.positional_encoding(maximum_position_encoding, d_model) 676 | # Dncoder 模块构建 677 | self.dec_layers = [DecoderLayer(d_model, num_heads, dff, rate) for _ in range(num_layers)] 678 | self.dropout = tf.keras.layers.Dropout(rate) 679 | 680 | def call(self, x, enc_output, training, look_ahead_mask, padding_mask): 681 | seq_len = tf.shape(x)[1] 682 | attention_weights = {} 683 | # step 1:词嵌入 684 | x = self.embedding(x) 685 | x *= tf.math.sqrt(tf.cast(self.d_model, tf.float32)) 686 | # step 2:位置编码 687 | x += self.pos_encoding[:, :seq_len, :] 688 | 689 | x = self.dropout(x, training=training) 690 | # step 3:Dncoder 模块构建 691 | for i in range(self.num_layers): 692 | x, block1, block2 = self.dec_layers[i](x, enc_output, training, look_ahead_mask, padding_mask) 693 | 694 | attention_weights['decoder_layer{}_block1'.format(i+1)] = block1 695 | attention_weights['decoder_layer{}_block2'.format(i+1)] = block2 696 | 697 | return x, attention_weights 698 | 699 | ``` 700 | 701 | ## 八、Transformer 构建 702 | 703 | ```s 704 | class Transformer(tf.keras.Model): 705 | def __init__(self, num_layers, d_model, num_heads, dff, input_vocab_size, target_vocab_size, pe_input, pe_target, rate=0.1): 706 | super(Transformer, self).__init__() 707 | # Encoder 模块 708 | self.encoder = Encoder(num_layers, d_model, num_heads, dff, input_vocab_size, pe_input, rate) 709 | # Decoder 模块 710 | self.decoder = Decoder(num_layers, d_model, num_heads, dff, target_vocab_size, pe_target, rate) 711 | # 全连接层 712 | self.final_layer = tf.keras.layers.Dense(target_vocab_size) 713 | 714 | def call(self, inp, tar, training, enc_padding_mask, look_ahead_mask, dec_padding_mask): 715 | # step 1: encoder 716 | enc_output = self.encoder(inp, training, enc_padding_mask) 717 | # step 2:decoder 718 | dec_output, attention_weights = self.decoder(tar, enc_output, training, look_ahead_mask, dec_padding_mask) 719 | # step 3:全连接层 720 | final_output = self.final_layer(dec_output) 721 | 722 | return final_output, attention_weights 723 | ``` 724 | 725 | ## 九、模型训练 726 | 727 | ### 9.1 配置类 728 | 729 | ```s 730 | # hyper-params 731 | class Config(): 732 | def __init__(self): 733 | self.num_layers = 4 # encoder 和 decoder 层数 734 | self.d_model = 128 # 向量维度 735 | self.dff = 512 # 序列维度 736 | self.num_heads = 8 # 多头自注意力 头数 737 | self.EPOCHS = 10 # 训练 次数 738 | config = Config() 739 | ``` 740 | ### 9.2 优化函数定义 741 | 742 | Adam optimizer with custom learning rate scheduling 743 | 744 | ```s 745 | class CustomSchedule(tf.keras.optimizers.schedules.LearningRateSchedule): 746 | def __init__(self, d_model, warmup_steps=4000): 747 | super(CustomSchedule, self).__init__() 748 | 749 | self.d_model = d_model 750 | self.d_model = tf.cast(self.d_model, tf.float32) 751 | 752 | self.warmup_steps = warmup_steps 753 | 754 | def __call__(self, step): 755 | arg1 = tf.math.rsqrt(step) 756 | arg2 = step * (self.warmup_steps ** -1.5) 757 | 758 | return tf.math.rsqrt(self.d_model) * tf.math.minimum(arg1, arg2) 759 | 760 | learning_rate = CustomSchedule(config.d_model) 761 | 762 | optimizer = tf.keras.optimizers.Adam(learning_rate, beta_1=0.9, beta_2=0.98, epsilon=1e-9) 763 | ``` 764 | 765 | ### 9.3 Loss 损失函数 和 评测指标 定义 766 | 767 | #### 9.3.1 Loss 损失函数 定义 768 | 769 | ```s 770 | # 功能:损失函数 定义 771 | def loss_function(real, pred): 772 | mask = tf.math.logical_not(tf.math.equal(real, 0)) 773 | # 稀疏分类交叉熵:将数字编码转化成one-hot编码格式,然后对one-hot编码格式的数据(真实标签值)与预测出的标签值使用交叉熵损失函数。 774 | loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True, reduction='none') 775 | loss_ = loss_object(real, pred) 776 | 777 | mask = tf.cast(mask, dtype=loss_.dtype) 778 | loss_ *= mask 779 | 780 | return tf.reduce_sum(loss_)/tf.reduce_sum(mask) 781 | # 实例化 782 | train_loss = tf.keras.metrics.Mean(name='train_loss') 783 | ``` 784 | 785 | > [稀疏分类交叉熵与稀疏分类交叉熵的使用差异,sparsecategoricalcrossentropy,和,SparseCategoricalCrossentropy,用法,区别](https://www.pythonf.cn/read/111510) 786 | 787 | ### 9.4 Transformer 实例化 788 | 789 | ```s 790 | transformer = Transformer( 791 | config.num_layers, 792 | config.d_model, 793 | config.num_heads, 794 | config.dff, 795 | encoder_vocab_size, 796 | decoder_vocab_size, 797 | pe_input=encoder_vocab_size, 798 | pe_target=decoder_vocab_size, 799 | ) 800 | ``` 801 | 802 | ### 9.5 Mask 实现 803 | 804 | ```s 805 | def create_masks(inp, tar): 806 | enc_padding_mask = create_padding_mask(inp) 807 | dec_padding_mask = create_padding_mask(inp) 808 | 809 | look_ahead_mask = create_look_ahead_mask(tf.shape(tar)[1]) 810 | dec_target_padding_mask = create_padding_mask(tar) 811 | combined_mask = tf.maximum(dec_target_padding_mask, look_ahead_mask) 812 | 813 | return enc_padding_mask, combined_mask, dec_padding_mask 814 | ``` 815 | 816 | ### 9.6 模型结果保存 817 | 818 | ```s 819 | checkpoint_path = "checkpoints" 820 | 821 | ckpt = tf.train.Checkpoint(transformer=transformer, optimizer=optimizer) 822 | 823 | ckpt_manager = tf.train.CheckpointManager(ckpt, checkpoint_path, max_to_keep=5) 824 | 825 | if ckpt_manager.latest_checkpoint: 826 | ckpt.restore(ckpt_manager.latest_checkpoint) 827 | print ('Latest checkpoint restored!!') 828 | ``` 829 | 830 | ### 9.7 Training Steps 831 | ```s 832 | @tf.function 833 | def train_step(inp, tar): 834 | tar_inp = tar[:, :-1] 835 | tar_real = tar[:, 1:] 836 | 837 | enc_padding_mask, combined_mask, dec_padding_mask = create_masks(inp, tar_inp) 838 | 839 | with tf.GradientTape() as tape: 840 | predictions, _ = transformer( 841 | inp, tar_inp, 842 | True, 843 | enc_padding_mask, 844 | combined_mask, 845 | dec_padding_mask 846 | ) 847 | loss = loss_function(tar_real, predictions) 848 | 849 | gradients = tape.gradient(loss, transformer.trainable_variables) 850 | optimizer.apply_gradients(zip(gradients, transformer.trainable_variables)) 851 | 852 | train_loss(loss) 853 | ``` 854 | ### 9.8 训练 855 | ```s 856 | for epoch in range(config.EPOCHS): 857 | start = time.time() 858 | 859 | train_loss.reset_states() 860 | 861 | for (batch, (inp, tar)) in enumerate(dataset): 862 | train_step(inp, tar) 863 | 864 | # 55k samples 865 | # we display 3 batch results -- 0th, middle and last one (approx) 866 | # 55k / 64 ~ 858; 858 / 2 = 429 867 | if batch % 429 == 0: 868 | print (f'Epoch {epoch + 1} Batch {batch} Loss {train_loss.result()}') 869 | 870 | if (epoch + 1) % 5 == 0: 871 | ckpt_save_path = ckpt_manager.save() 872 | print ('Saving checkpoint for epoch {} at {}'.format(epoch+1, ckpt_save_path)) 873 | 874 | print ('Epoch {} Loss {:.4f}'.format(epoch + 1, train_loss.result())) 875 | 876 | print ('Time taken for 1 epoch: {} secs\n'.format(time.time() - start)) 877 | >>> 878 | Epoch 1 Batch 0 Loss 2.4681 879 | Epoch 1 Batch 429 Loss 2.4650 880 | Epoch 1 Batch 858 Loss 2.5071 881 | Epoch 1 Loss 2.5077 882 | Time taken for 1 epoch: 308.9519073963165 secs 883 | 884 | Epoch 2 Batch 0 Loss 2.3482 885 | Epoch 2 Batch 429 Loss 2.4071 886 | Epoch 2 Batch 858 Loss 2.4461 887 | Epoch 2 Loss 2.4464 888 | Time taken for 1 epoch: 299.0744743347168 secs 889 | ... 890 | ``` 891 | 892 | -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/1.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/20200623092901.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/20200623092901.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/20200623093042.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/20200623093042.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/20200623093217.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/20200623093217.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/20200624080740.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/20200624080740.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/20200624081753.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/20200624081753.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/20200624083258.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/20200624083258.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/20200624084515.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/20200624084515.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/20200624090026.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/20200624090026.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/20200624090034.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/20200624090034.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/20200624090357.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/20200624090357.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/20201009163936.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/20201009163936.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/20201009164019.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/20201009164019.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/20201009164053.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/20201009164053.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/20201125164433.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/20201125164433.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/QQ截图20200625101229.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/QQ截图20200625101229.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/QQ截图20200625103634.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/QQ截图20200625103634.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/QQ截图20200625110603.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/QQ截图20200625110603.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/QQ截图20200625110706.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/QQ截图20200625110706.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/QQ截图20200626120834.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/QQ截图20200626120834.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/QQ截图20200626122726.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/QQ截图20200626122726.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/QQ截图20200626152309.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/QQ截图20200626152309.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/QQ截图20200626153600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/QQ截图20200626153600.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/QQ截图20200626154711.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/QQ截图20200626154711.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/v2-595ce4ebf9b3fccb479f7d234190af35_b.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/v2-595ce4ebf9b3fccb479f7d234190af35_b.gif -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/v2-595ce4ebf9b3fccb479f7d234190af35_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/v2-595ce4ebf9b3fccb479f7d234190af35_b.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/微信截图_20200625082324.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/微信截图_20200625082324.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/微信截图_20200625085139.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/微信截图_20200625085139.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/微信截图_20200625085922.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/微信截图_20200625085922.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/微信截图_20200625090454.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/微信截图_20200625090454.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/微信截图_20200625093537.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/微信截图_20200625093537.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/微信截图_20200625095930.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/微信截图_20200625095930.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/微信截图_20200625101800.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/微信截图_20200625101800.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/微信截图_20210128073806.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/微信截图_20210128073806.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/微信截图_20210128074033.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/微信截图_20210128074033.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/img/微信截图_20210128074300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/Transformer/img/微信截图_20210128074300.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/Transformer/readme.md: -------------------------------------------------------------------------------- 1 | # 【关于Transformer】 那些的你不知道的事 2 | 3 | > 作者:杨夕 4 | > 5 | > 项目地址:https://github.com/km1994/nlp_paper_study 6 | > 7 | > 论文链接:https://arxiv.org/pdf/1706.03762.pdf 8 | > 9 | > 【注:手机阅读可能图片打不开!!!】 10 | > 11 | > 个人介绍:大佬们好,我叫杨夕,该项目主要是本人在研读顶会论文和复现经典论文过程中,所见、所思、所想、所闻,可能存在一些理解错误,希望大佬们多多指正。 12 | 13 | ## 引言 14 | 15 | 本博客 主要 是本人在学习 Transformer 时的**所遇、所思、所解**,通过以 **十六连弹** 的方式帮助大家更好的理解 该问题。 16 | 17 | ## 十六连弹 18 | 19 | 1. 为什么要有 Transformer? 20 | 2. Transformer 作用是什么? 21 | 3. Transformer 整体结构怎么样? 22 | 4. Transformer-encoder 结构怎么样? 23 | 5. Transformer-decoder 结构怎么样? 24 | 6. 传统 attention 是什么? 25 | 7. self-attention 长怎么样? 26 | 8. self-attention 如何解决长距离依赖问题? 27 | 9. self-attention 如何并行化? 28 | 10. multi-head attention 怎么解? 29 | 11. 为什么要 加入 position embedding ? 30 | 12. 为什么要 加入 残差模块? 31 | 13. Layer normalization。Normalization 是什么? 32 | 14. 什么是 Mask? 33 | 15. Transformer 存在问题? 34 | 16. Transformer 怎么 Coding? 35 | 36 | ## 问题解答 37 | 38 | ### 一、为什么要有 Transformer? 39 | 40 | 为什么要有 Transformer? 首先需要知道在 Transformer 之前都有哪些技术,这些技术所存在的问题: 41 | 42 | - RNN:能够捕获长距离依赖信息,但是无法并行; 43 | - CNN: 能够并行,无法捕获长距离依赖信息(需要通过层叠 or 扩张卷积核 来 增大感受野); 44 | - 传统 Attention 45 | - 方法:基于源端和目标端的隐向量计算Attention, 46 | - 结果:源端每个词与目标端每个词间的依赖关系 【源端->目标端】 47 | - 问题:忽略了 远端或目标端 词与词间 的依赖关系 48 | 49 | ### 二、Transformer 作用是什么? 50 | 51 | 基于Transformer的架构主要用于建模语言理解任务,它避免了在神经网络中使用递归,而是完全依赖于self-attention机制来绘制输入和输出之间的全局依赖关系。 52 | 53 | ### 三、Transformer 整体结构怎么样? 54 | 55 | 1. 整体结构 56 | 57 | - Transformer 整体结构: 58 | - encoder-decoder 结构 59 | - 具体介绍: 60 | - 左边是一个 Encoder; 61 | - 右边是一个 Decoder; 62 | 63 | ![此次是图片,手机可能打不开](img/20200623092901.png) 64 | 65 | 1. 整体结构放大一点 66 | 67 | 从上一张 Transformer 结构图,可以知道 Transformer 是一个 encoder-decoder 结构,但是 encoder 和 decoder 又包含什么内容呢? 68 | - Encoder 结构: 69 | - 内部包含6层小encoder 每一层里面有2个子层; 70 | - Decoder 结构: 71 | - 内部也是包含6层小decoder ,每一层里面有3个子层 72 | 73 | ![此次是图片,手机可能打不开](img/20200623093042.png) 74 | 75 | 1. 整体结构再放大一点 76 | 77 | 其中上图中每一层的内部结构如下图所求。 78 | - 上图左边的每一层encoder都是下图左边的结构; 79 | - 上图右边的每一层的decoder都是下图右边的结构; 80 | 81 | 具体内容,后面会逐一介绍。 82 | 83 | ![此次是图片,手机可能打不开](img/20200623093217.png) 84 | 85 | ### 四、Transformer-encoder 结构怎么样? 86 | 87 | ![此次是图片,手机可能打不开](img/20200624080740.png) 88 | 89 | - 特点: 90 | - 与 RNN,CNN 类似,可以当成一个特征提取器; 91 | - 组成结构介绍 92 | - embedding 层:将 input 转化为 embedding 向量 $X$; 93 | - Position encodding: input的位置与 input 的 embedding $X$ 相加 得到 向量 $X$; 94 | - self-attention : 将融合input的位置信息 与 input 的 embedding 信息的 $X$ 输入 Self-Attention 层得到 $Z$; 95 | - 残差网络:$Z$ 与 $X$ 相加后经过 layernorm 层; 96 | - 前馈网络:经过一层前馈网络以及 Add&Normalize,(线性转换+relu+线性转换 如下式) 97 | 98 | ![此次是图片,手机可能打不开](img/20200624081753.png) 99 | 100 | - 举例说明(假设序列长度固定,如100,如输入的序列是“我爱中国”): 101 | - 首先需要 **encoding**: 102 | - 将词映射成一个数字,encoding后,由于序列不足固定长度,因此需要padding, 103 | - 然后输入 embedding层,假设embedding的维度是128,则输入的序列维度就是100*128; 104 | - 接着是**Position encodding**,论文中是直接将每个位置通过cos-sin函数进行映射; 105 | - 分析:这部分不需要在网络中进行训练,因为它是固定。但现在很多论文是将这块也embedding,如bert的模型,至于是encoding还是embedding可取决于语料的大小,语料足够大就用embedding。将位置信息也映射到128维与上一步的embedding相加,输出100*128 106 | - 经过**self-attention层**: 107 | - 操作:假设v的向量最后一维是64维(假设没有多头),该部分输出100*64; 108 | - 经过残差网络: 109 | - 操作:即序列的embedding向量与上一步self-attention的向量加总; 110 | - 经过 **layer-norm**: 111 | - 原因: 112 | - 由于在self-attention里面更好操作而已; 113 | - 真实序列的长度一直在变化; 114 | - 经过 **前馈网络**: 115 | - 目的:增加非线性的表达能力,毕竟之前的结构基本都是简单的矩阵乘法。若前馈网络的隐向量是512维,则结构最后输出100*512; 116 | 117 | ### 五、Transformer-decoder 结构怎么样? 118 | 119 | ![此次是图片,手机可能打不开](img/20200624083258.png) 120 | 121 | - 特点:与 encoder 类似 122 | - 组成结构介绍 123 | - masked 层: 124 | - 目的:确保了位置 i 的预测仅依赖于小于 i 的位置处的已知输出; 125 | - Linear layer: 126 | - 目的:将由解码器堆栈产生的向量投影到一个更大的向量中,称为对数向量。这个向量对应着模型的输出词汇表;向量中的每个值,对应着词汇表中每个单词的得分; 127 | - softmax层: 128 | - 操作:这些分数转换为概率(所有正数,都加起来为1.0)。选择具有最高概率的单元,并且将与其相关联的单词作为该时间步的输出 129 | 130 | 131 | ### 六、传统 attention 是什么? 132 | 133 | ![此次是图片,手机可能打不开](img/微信截图_20200625085139.png) 134 | - 注意力机制是什么呢? 135 | - 就是将精力集中于某一个点上 136 | - 举个例子: 137 | - 你在超市买东西,突然一个美女从你身边走过,这个时候你会做什么呢? 138 | - 没错,就是将视线【也就是注意力】集中于这个美女身上,而周围环境怎么样,你都不关注。 139 | - 思路 140 | - 输入 给定 Target 中某个 query; 141 | - 计算权值 Score: 142 | - 计算 query 和 各个 Key 的相似度或相关性,得到每个 Key 对应 value 的权值系数; 143 | - 对 权值 Score 和 value 进行加权求和 144 | - 核心: 145 | - Attention 机制 是对 source 中各个元素 的 value 进行加权求和,而 query 和 key 用于计算 对应 value 的权值系数 146 | 147 | ![此次是图片,手机可能打不开](img/微信截图_20200625085922.png) 148 | 149 | > $L_x=||Source||$代表Source的长度 150 | 151 | - 概念: 152 | - attention 的核心 就是从 大量信息中 筛选出少量的 重要信息; 153 | - 具体操作:每个 value 的 权值系数,代表 其 重要度; 154 | 155 | ![此次是图片,手机可能打不开](img/微信截图_20200625090454.png) 156 | 157 | - 具体流程介绍 158 | - step 1:计算权值系数 159 | - 采用 不同的函数或计算方式,对 query 和 key 进行计算,求出相似度或相关性 160 | - 采用的计算方法: 161 | - 向量点积: 162 | 163 | ![](img/20201009163936.png) 164 | 165 | - Cosine 相似度计算: 166 | 167 | ![](img/20201009164019.png) 168 | 169 | - MLP 网络: 170 | 171 | ![](img/20201009164053.png) 172 | 173 | - step 2: softmax 归一化 174 | - 原因: 175 | 1. score 值分布过散,将原始计算分值整理成所有元素权重之和为1 的概率分布; 176 | 2. 可以通过SoftMax的内在机制更加突出重要元素的权重; 177 | - 公式介绍 178 | 179 | ![此次是图片,手机可能打不开](img/微信截图_20200625093537.png) 180 | 181 | - step 3: 加权求和 182 | - 公式介绍: 183 | - 计算结果 $a_i$ 即为 $value_i$ 对应的权重系数,然后进行加权求和即可得到Attention数值 184 | 185 | ![此次是图片,手机可能打不开](img/微信截图_20200625095930.png) 186 | 187 | - 存在问题 188 | - 忽略了 源端或目标端 词与词间 的依赖关系【以上面栗子为例,就是把注意力集中于美女身上,而没看自己周围环境,结果可能就扑街了!】 189 | 190 | ### 七、self-attention 长怎么样? 191 | 192 | - 动机 193 | - CNN 所存在的长距离依赖问题; 194 | - RNN 所存在的无法并行化问题【虽然能够在一定长度上缓解 长距离依赖问题】; 195 | - 传统 Attention 196 | - 方法:基于源端和目标端的隐向量计算Attention, 197 | - 结果:源端每个词与目标端每个词间的依赖关系 【源端->目标端】 198 | - 问题:忽略了 远端或目标端 词与词间 的依赖关系 199 | - 核心思想:self-attention的结构在计算每个token时,总是会考虑整个序列其他token的表达; 200 | - 举例:“我爱中国”这个序列,在计算"我"这个词的时候,不但会考虑词本身的embedding,也同时会考虑其他词对这个词的影响 201 | - 目的:学习句子内部的词依赖关系,捕获句子的内部结构。 202 | 203 | ![此次是图片,手机可能打不开](img/20200624084515.png) 204 | 205 | ![此次是图片,手机可能打不开](img/微信截图_20200625082324.png) 206 | 207 | - 步骤 208 | - embedding层: 209 | - 目的:将词转化成embedding向量; 210 | - Q,K,V 向量计算: 211 | - 根据 embedding 和权重矩阵,得到Q,K,V; 212 | - Q:查询向量,目标字作为 Query; 213 | - K:键向量,其上下文的各个字作为 Key; 214 | - V:值向量,上下文各个字的 Value; 215 | - 权重 score 计算: 216 | - 查询向量 query 点乘 key; 217 | - 目的:计算其他词对这个词的重要性,也就是权值; 218 | - scale 操作: 219 | - 乘以 $\frac{1}{\sqrt{d_{k}}}$; 220 | - 目的:起到调节作用,使得内积不至于太大。实际上是Q,K,V的最后一个维度,当 $d_k$ 越大, $QK^T$ 就越大,可能会将 Softmax 函数推入梯度极小的区域; 221 | - Softmax 归一化: 222 | - 经过 Softmax 归一化; 223 | - Attention 的输出计算: 224 | - 权值 score 和各个上下文字的 V 向量 的加权求和 225 | - 目的:把上下文各个字的 V 融入目标字的原始 V 中 226 | - 举例 227 | - 答案就是文章中的Q,K,V,这三个向量都可以表示"我"这个词,但每个向量的作用并不一样,Q 代表 query,当计算"我"这个词时,它就能代表"我"去和其他词的 K 进行点乘计算其他词对这个词的重要性,所以此时其他词(包括自己)使用 K 也就是 key 代表自己,当计算完点乘后,我们只是得到了每个词对“我”这个词的权重,需要再乘以一个其他词(包括自己)的向量,也就是V(value),才完成"我"这个词的计算,同时也是完成了用其他词来表征"我"的一个过程 228 | 229 | - 优点 230 | - 捕获源端和目标端词与词间的依赖关系 231 | - 捕获源端或目标端自身词与词间的依赖关系 232 | 233 | ### 八、self-attention 如何解决长距离依赖问题? 234 | 235 | - 引言: 236 | - 在上一个问题中,我们提到 CNN 和 RNN 在处理长序列时,都存在 长距离依赖问题,那么你是否会有这样 几个问题: 237 | - 长距离依赖问题 是什么呢? 238 | - 为什么 CNN 和 RNN 无法解决长距离依赖问题? 239 | - 之前提出过哪些解决方法? 240 | - self-attention 是如何 解决 长距离依赖问题的呢? 241 | 242 | 下面,我们将会围绕着几个问题,进行一一解答。 243 | 244 | - 长距离依赖问题 是什么呢? 245 | - 介绍:对于序列问题,第 $t$ 时刻 的 输出 $y_t$ 依赖于 $t$ 之前的输入,也就是 说 依赖于 $x_{t-k}, k=1,...,t$,当间隔 $k$ 逐渐增大时,$x_{t-k}$ 的信息将难以被 $y_t$ 所学习到,也就是说,很难建立 这种 长距离依赖关系,这个也就是 长距离依赖问题(Long-Term Dependencies Problem)。 246 | - 为什么 CNN 和 RNN 无法解决长距离依赖问题? 247 | - CNN: 248 | - 捕获信息的方式: 249 | - CNN 主要采用 卷积核 的 方式捕获 句子内的局部信息,你可以把他理解为 **基于 n-gram 的局部编码方式**捕获局部信息 250 | - 问题: 251 | - 因为是 n-gram 的局部编码方式,那么当 $k$ 距离 大于 $n$ 时,那么 $y_t$ 将难以学习 $x_{t-k}$ 信息; 252 | - 举例: 253 | - 其实 n-gram 类似于 人的 视觉范围,人的视觉范围 在每一时刻 只能 捕获 一定 范围内 的信息,比如,你在看前面的时候,你是不可能注意到背后发生了什么,除非你转过身往后看。 254 | - RNN: 255 | - 捕获信息的方式: 256 | - RNN 主要 通过 循环 的方式学习(记忆) 之前的信息$x_{t}$; 257 | - 问题: 258 | - 但是随着时间 $t$ 的推移,你会出现**梯度消失或梯度爆炸**问题,这种问题使你只能建立短距离依赖信息。 259 | - 举例: 260 | - RNN 的学习模式好比于 人类 的记忆力,人类可能会对 短距离内发生的 事情特别清楚,但是随着时间的推移,人类开始 会对 好久之前所发生的事情变得印象模糊,比如,你对小时候发生的事情,印象模糊一样。 261 | - 解决方法: 262 | - 针对该问题,后期也提出了很多 RNN 变体,比如 LSTM、 GRU,这些变体 通过引入 门控的机制 来 有选择性 的记忆 一些 重要的信息,但是这种方法 也只能在 一定程度上缓解 长距离依赖问题,但是并不能 从根本上解决问题。 263 | 264 | ![此次是图片,手机可能打不开](img/QQ截图20200626120834.png) 265 | 266 | - 之前提出过哪些解决方法? 267 | - 引言: 268 | - 那么 之前 主要采用 什么方法 解决问题呢? 269 | - 解决方法: 270 | - 增加网络的层数 271 | - 通过一个深层网络来获取远距离的信息交互 272 | - 使用全连接网络 273 | - 通过全连接的方法对 长距离 建模; 274 | - 问题: 275 | - 无法处理变长的输入序列; 276 | - 不同的输入长度,其连接权重的大小也是不同的; 277 | 278 | ![此次是图片,手机可能打不开](img/QQ截图20200626122726.png) 279 | 280 | - self-attention 是如何 解决 长距离依赖问题的呢? 281 | - 解决方式: 282 | - 利用注意力机制来“动态”地生成不同连接的权重,从而处理变长的信息序列 283 | - 具体介绍: 284 | - 对于 当前query,你需要 与 句子中 所有 key 进行点乘后再 Softmax ,以获得 句子中 所有 key 对于 当前query 的 score(可以理解为 贡献度),然后与 所有词 的 value 向量进行加权融合之后,就能使 当前 $y_t$ 学习到句子中 其他词$x_{t-k}$的信息; 285 | 286 | ### 九、self-attention 如何并行化? 287 | 288 | - 引言: 289 | - 在上一个问题中,我们主要讨论了 CNN 和 RNN 在处理长序列时,都存在 长距离依赖问题,以及 Transformer 是 如何解决 长距离依赖问题,但是对于 RNN ,还存在另外一个问题: 290 | - 无法并行化问题 291 | - 那么,Transformer 是如何进行并行化的呢? 292 | - Transformer 如何进行并行化? 293 | - 核心:self-attention 294 | - 为什么 RNN 不能并行化: 295 | - 原因:RNN 在 计算 $x_i$ 的时候,需要考虑到 $x_1 ~ x_{i-1}$ 的 信息,使得 RNN 只能 从 $x_1$ 计算到 $x_i$; 296 | - 思路: 297 | - 在 self-attention 能够 并行的 计算 句子中不同 的 query,因为每个 query 之间并不存在 先后依赖关系,也使得 transformer 能够并行化; 298 | 299 | ### 十、multi-head attention 怎么解? 300 | 301 | - 思路: 302 | - 相当于 $h$ 个 不同的 self-attention 的集成 303 | - 就是把self-attention做 n 次,取决于 head 的个数;论文里面是做了8次。 304 | - 步骤: 305 | - step 1 : 初始化 N 组 $Q,K,V$矩阵(论文为 8组); 306 | 307 | ![此次是图片,手机可能打不开](img/QQ截图20200625101229.png) 308 | 309 | - step 2 : 每组 分别 进行 self-attention; 310 | - step 3: 311 | - 问题:多个 self-attention 会得到 多个 矩阵,但是前馈神经网络没法输入8个矩阵; 312 | - 目标:把8个矩阵降为1个 313 | - 步骤: 314 | - 每次self-attention都会得到一个 Z 矩阵,把每个 Z 矩阵拼接起来, 315 | - 再乘以一个Wo矩阵, 316 | - 得到一个最终的矩阵,即 multi-head Attention 的结果; 317 | 318 | 319 | ![此次是图片,手机可能打不开](img/20200624090026.png) 320 | 321 | 最后,让我们来看一下完整的流程: 322 | 323 | ![此次是图片,手机可能打不开](img/20200624090034.png) 324 | 325 | 换一种表现方式: 326 | 327 | ![此次是图片,手机可能打不开](img/微信截图_20200625101800.png) 328 | 329 | - 动图介绍 330 | 331 | ![此次是图片,手机可能打不开](img/v2-595ce4ebf9b3fccb479f7d234190af35_b.gif) 332 | 333 | ### 十一、为什么要 加入 position embedding ? 334 | 335 | - 问题: 336 | - 介绍:缺乏 一种 表示 输入序列中 单词顺序 的方法 337 | - 说明:因为模型不包括Recurrence/Convolution,因此是无法捕捉到序列顺序信息的,例如将K、V按行进行打乱,那么Attention之后的结果是一样的。但是序列信息非常重要,代表着全局的结构,因此必须将序列的分词相对或者绝对position信息利用起来 338 | - 目的:加入词序信息,使 Attention 能够分辨出不同位置的词 339 | - 思路: 340 | - 在 encoder 层和 decoder 层的输入添加了一个额外的向量Positional Encoding,维度和embedding的维度一样,让模型学习到这个值 341 | - 位置向量的作用: 342 | - 决定当前词的位置; 343 | - 计算在一个句子中不同的词之间的距离 344 | - 步骤: 345 | - 将每个位置编号, 346 | - 然后每个编号对应一个向量, 347 | - 通过将位置向量和词向量相加,就给每个词都引入了一定的位置信息。 348 | 349 | ![此次是图片,手机可能打不开](img/QQ截图20200625103634.png) 350 | 351 | - 论文的位置编码是使用三角函数去计算的。好处: 352 | - 值域只有[-1,1] 353 | - 容易计算相对位置。 354 | 355 | ![此次是图片,手机可能打不开](img/20200624090357.png) 356 | 357 | > 注: 358 | > 359 | > $pos$ 表示当前词在句子中的位置 360 | > 361 | > $i$ 表示向量中每个值 的 index 362 | > 363 | > 在偶数位置:使用 正弦编码 $sin()$; 364 | > 365 | > 在奇数位置:使用 余弦编码 $cos()$; 366 | 367 | ### 十二、为什么要 加入 残差模块? 368 | 369 | - 动机:因为 transformer 堆叠了 很多层,容易 梯度消失或者梯度爆炸 370 | 371 | ### 十三、Layer normalization。Normalization 是什么? 372 | 373 | - 动机:因为 transformer 堆叠了 很多层,容易 梯度消失或者梯度爆炸; 374 | - 原因: 375 | - 数据经过该网络层的作用后,不再是归一化,偏差会越来越大,所以需要将 数据 重新 做归一化处理; 376 | - 目的: 377 | - 在数据送入激活函数之前进行normalization(归一化)之前,需要将输入的信息利用 normalization 转化成均值为0方差为1的数据,避免因输入数据落在激活函数的饱和区而出现 梯度消失或者梯度爆炸 问题 378 | - 介绍: 379 | - 归一化的一种方式 380 | - 对每一个样本介绍均值和方差【这个与 BN 有所不同,因为他是在 批方向上 计算均值和方差】 381 | - 公式 382 | 383 | > BN 计算公式 384 | 385 | ![此次是图片,手机可能打不开](img/QQ截图20200625110603.png) 386 | 387 | > LN 计算公式 388 | 389 | ![此次是图片,手机可能打不开](img/QQ截图20200625110706.png) 390 | 391 | ### 十四、什么是 Mask? 392 | 393 | - 介绍:掩盖某些值的信息,让模型信息不到该信息; 394 | - 类别:padding mask and sequence mask 395 | - padding mask 396 | - 作用域:每一个 scaled dot-product attention 中 397 | - 动机: 398 | - 输入句子的长度不一问题 399 | - 方法: 400 | - 短句子:后面 采用 0 填充 401 | - 长句子:只截取 左边 部分内容,其他的丢弃 402 | - 原因: 403 | - 对于 填充 的位置,其所包含的信息量 对于 模型学习 作用不大,所以 self-attention 应该 抛弃对这些位置 进行学习; 404 | - 做法: 405 | - 在这些位置上加上 一个 非常大 的负数(负无穷),使 该位置的值经过 Softmax 后,值近似 0,利用 padding mask 标记哪些值需要做处理; 406 | - sequence mask 407 | - 作用域:只作用于 decoder 的 self-attention 中 408 | - 动机:不可预测性; 409 | - 目标:sequence mask 是为了使得 decoder 不能看见未来的信息。也就是对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此我们需要想一个办法,把 t 之后的信息给隐藏起来。 410 | - 做法: 411 | - 产生一个下三角矩阵,上三角的值全为0,下三角全是 1。把这个矩阵作用在每一个序列上,就可以达到我们的目的 412 | 413 | ![](img/微信截图_20210128073806.png) 414 | > sequence mask 公式 415 | 416 | ![](img/微信截图_20210128074033.png) 417 | > 注意力矩阵, 每个元素 $a_{ij}$ 代表 第 i 个词和第 j 个词的内积相似度 418 | 419 | ![](img/微信截图_20210128074300.png) 420 | > 下三角矩阵,上三角的值全为0,下三角全是 1 421 | 422 | > 注: 423 | > 424 | > 在 decoder 的 scaled dot-product attention 中,里面的 attn_mask = padding mask + sequence mask 425 | > 426 | > 在 encoder 的 scaled dot-product attention 中,里面的 attn_mask = padding mask 427 | 428 | ### 十五、Transformer 存在问题? 429 | 430 | - 引言 431 | - 居然 Transformer 怎么厉害,那么 是否也存在不足呢? 432 | - 答案: 有的 433 | - 问题一:不能很好的处理超长输入问题? 434 | - 介绍:Transformer 固定了句子长度; 435 | - 举例: 436 | - 例如 在 Bert 里面,输入句子的默认长度 为 512; 437 | - 对于长度长短问题,做了以下处理: 438 | - 短于 512:填充句子方式; 439 | - 长于 512: 440 | - 处理方式一:截断句子方式(Transformer 处理方式); 441 | - 处理方式二:将句子划分为 多个 seg ([Vanilla Transformer](https://aaai.org/ojs/index.php/AAAI/article/view/4182) 处理方式); 442 | - 思路: 443 | - 将文本划分为多个segments; 444 | - 训练的时候,对每个segment单独处理; 445 | - 问题: 446 | - 因为 segments 之间独立训练,所以不同的token之间,最长的依赖关系,就取决于segment的长度 (如图(a)); 447 | - 出于效率的考虑,在划分segments的时候,不考虑句子的自然边界,而是根据固定的长度来划分序列,导致分割出来的segments在语义上是不完整的 (如图(a)); 448 | - 在预测的时候,会对固定长度的 segment 做计算,一般取最后一个位置的隐向量作为输出。为了充分利用上下文关系,在每做完一次预测之后,就对整个序列向右移动一个位置,再做一次计算,这导致计算效率非常低 (如图(b)); 449 | 450 | ![此次是图片,手机可能打不开](img/QQ截图20200626152309.png) 451 | 452 | - 处理方式三:Segment-Level Recurrenc ( [Transformer-XL](https://aaai.org/ojs/index.php/AAAI/article/view/4182) 处理方式); 453 | - 思路: 454 | - 在对当前segment进行处理的时候,**缓存**并利用上一个segment中所有layer的隐向量序列; 455 | - 上一个segment的所有隐向量序列只参与前向计算,不再进行反向传播; 456 | 457 | ![此次是图片,手机可能打不开](img/QQ截图20200626153600.png) 458 | 459 | - 问题二:方向信息以及相对位置 的 缺失 问题? 460 | - 动机: 461 | - 方向信息和位置信息的缺失,导致 Transformer 在 NLP 中表现性能较差,例如在 命名实体识别任务中; 462 | - 举例: 463 | - 如下图,“Inc”单词之前的词很有可能就是机构组织(ORG),“in”单词之后的词,很有可能是时间地点(TIME);并且一个实体应该是连续的单词组成,标红的“Louis Vuitton”不会和标蓝的“Inc”组成一个实体。但是原始的Transformer无法捕获这些信息。 464 | 465 | ![此次是图片,手机可能打不开](img/QQ截图20200626154711.png) 466 | 467 | - 解决方法: 468 | - 可以查看 [TENER: Adapting Transformer Encoder for Name Entity Recognition](https://arxiv.org/pdf/1911.04474.pdf) 【论文后期会做总结】 469 | 470 | - 问题三:缺少Recurrent Inductive Bias 471 | - 动机: 472 | - 学习算法中Inductive Bias可以用来预测从未遇到的输入的输出(参考[10])。对于很多序列建模任务(如需要对输入的层次结构进行建模时,或者在训练和推理期间输入长度的分布不同时),Recurrent Inductive Bias至关重要【可以看论文[The Importance of Being Recurrent for Modeling Hierarchical Structure](https://arxiv.org/abs/1803.03585)】 473 | - 问题四:Transformer是非图灵完备的: 非图灵完备通俗的理解,就是无法解决所有的问题 474 | - 动机: 475 | - 在Transformer中,单层中sequential operation (context two symbols需要的操作数)是$O(1)$ time,独立于输入序列的长度。那么总的sequenctial operation仅由层数$T$决定。这意味着transformer不能在计算上通用,即无法处理某些输入。如:输入是一个需要**对每个输入元素进行顺序处理**的函数,在这种情况下,对于任意给定的深度$T$的transformer,都可以构造一个长度为 $N>T$; 476 | - 问题五:transformer缺少conditional computation 477 | - 动机: 478 | - transformer在encoder的过程中,所有输入元素都有相同的计算量,比如对于“I arrived at the bank after crossing the river", 和"river"相比,需要更多的背景知识来推断单词"bank"的含义,然而transformer在编码这个句子的时候,无条件对于每个单词应用相同的计算量,这样的过程显然是低效的。 479 | - 问题六:transformer 时间复杂度 和 空间复杂度 过大问题 480 | - 动机: 481 | - Transformer 中用到的自注意力与长度n呈现出$O(n^2)$的时间和空间复杂度 482 | - 解决方法: 483 | - [Linformer](https://arxiv.org/abs/2006.04768) 484 | 485 | ### 十六、Transformer 怎么 Coding? 486 | 487 | - 最后的最后,送上 whalePaper 成员 逸神 的 【[Transformer 理论源码细节详解](https://zhuanlan.zhihu.com/p/106867810)】; 488 | 489 | - 理论+实践,干活永不累! 490 | 491 | ## 参考资料 492 | 493 | 1. [Transformer理论源码细节详解](https://zhuanlan.zhihu.com/p/106867810) 494 | 2. [论文笔记:Attention is all you need(Transformer)](https://zhuanlan.zhihu.com/p/51089880) 495 | 3. [深度学习-论文阅读-Transformer-20191117](https://zhuanlan.zhihu.com/p/92234185) 496 | 4. [Transform详解(超详细) Attention is all you need论文](https://zhuanlan.zhihu.com/p/63191028) 497 | 5. [目前主流的attention方法都有哪些?](https://www.zhihu.com/question/68482809/answer/597944559) 498 | 6. [transformer三部曲](https://zhuanlan.zhihu.com/p/85612521) 499 | 7. [Character-Level Language Modeling with Deeper Self-Attention](https://aaai.org/ojs/index.php/AAAI/article/view/4182) 500 | 8. [Transformer-XL: Unleashing the Potential of Attention Models](https://ai.googleblog.com/2019/01/transformer-xl-unleashing-potential-of.html) 501 | 9. [The Importance of Being Recurrent for Modeling Hierarchical Structure](https://arxiv.org/abs/1803.03585) 502 | 10. [Linformer](https://arxiv.org/abs/2006.04768) 503 | 11. [Transformer原理详解](https://zhuanlan.zhihu.com/p/127774251) 504 | 505 | -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/1.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/20200623092901.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/20200623092901.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/20200623093042.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/20200623093042.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/20200623093217.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/20200623093217.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/20200624080740.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/20200624080740.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/20200624081753.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/20200624081753.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/20200624083258.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/20200624083258.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/20200624084515.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/20200624084515.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/20200624090026.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/20200624090026.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/20200624090034.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/20200624090034.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/20200624090357.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/20200624090357.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/20201009163936.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/20201009163936.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/20201009164019.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/20201009164019.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/20201009164053.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/20201009164053.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/QQ截图20200625101229.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/QQ截图20200625101229.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/QQ截图20200625103634.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/QQ截图20200625103634.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/QQ截图20200625110603.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/QQ截图20200625110603.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/QQ截图20200625110706.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/QQ截图20200625110706.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/QQ截图20200626120834.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/QQ截图20200626120834.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/QQ截图20200626122726.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/QQ截图20200626122726.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/QQ截图20200626152309.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/QQ截图20200626152309.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/QQ截图20200626153600.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/QQ截图20200626153600.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/QQ截图20200626154711.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/QQ截图20200626154711.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/v2-595ce4ebf9b3fccb479f7d234190af35_b.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/v2-595ce4ebf9b3fccb479f7d234190af35_b.gif -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/v2-595ce4ebf9b3fccb479f7d234190af35_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/v2-595ce4ebf9b3fccb479f7d234190af35_b.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/微信截图_20200625082324.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/微信截图_20200625082324.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/微信截图_20200625085139.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/微信截图_20200625085139.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/微信截图_20200625085922.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/微信截图_20200625085922.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/微信截图_20200625090454.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/微信截图_20200625090454.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/微信截图_20200625093537.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/微信截图_20200625093537.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/微信截图_20200625095930.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/微信截图_20200625095930.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/img/微信截图_20200625101800.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/img/微信截图_20200625101800.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/naacl2021_longformer/img/微信截图_20220405204037.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/naacl2021_longformer/img/微信截图_20220405204037.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/naacl2021_longformer/img/微信截图_20220405204314.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/naacl2021_longformer/img/微信截图_20220405204314.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/naacl2021_longformer/img/微信截图_20220405204404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/naacl2021_longformer/img/微信截图_20220405204404.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/naacl2021_longformer/img/微信截图_20220405204845.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/naacl2021_longformer/img/微信截图_20220405204845.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/naacl2021_longformer/img/微信截图_20220405204906.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/naacl2021_longformer/img/微信截图_20220405204906.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/naacl2021_longformer/img/微信截图_20220405205444.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/naacl2021_longformer/img/微信截图_20220405205444.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/naacl2021_longformer/img/微信截图_20220405205528.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/naacl2021_longformer/img/微信截图_20220405205528.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/naacl2021_longformer/readme.md: -------------------------------------------------------------------------------- 1 | # 【关于 Longformer】 那些的你不知道的事 2 | 3 | > 作者:杨夕 4 | > 5 | > 项目地址:https://github.com/km1994/nlp_paper_study 6 | > 7 | > NLP 面经地址:https://github.com/km1994/NLP-Interview-Notes 8 | > 9 | > 个人介绍:大佬们好,我叫杨夕,该项目主要是本人在研读顶会论文和复现经典论文过程中,所见、所思、所想、所闻,可能存在一些理解错误,希望大佬们多多指正。 10 | > 11 | > 论文:Longformer: The Long-Document Transformer 12 | > 13 | > 发表会议:naacl2021 14 | > 15 | > 论文地址:https://arxiv.org/abs/2004.05150 16 | > 17 | > github:https://github.com/allenai/longformer 18 | 19 | ## 一、摘要 20 | 21 | Transformer-based models are unable to process long sequences due to their self-attention operation, which scales quadratically with the sequence length. To address this limitation, we introduce the Longformer with an attention mechanism that scales linearly with sequence length, making it easy to process documents of thousands of tokens or longer. Longformer's attention mechanism is a drop-in replacement for the standard self-attention and combines a local windowed attention with a task motivated global attention. Following prior work on long-sequence transformers, we evaluate Longformer on character-level language modeling and achieve state-of-the-art results on text8 and enwik8. In contrast to most prior work, we also pretrain Longformer and finetune it on a variety of downstream tasks. Our pretrained Longformer consistently outperforms RoBERTa on long document tasks and sets new state-of-the-art results on WikiHop and TriviaQA. We finally introduce the Longformer-Encoder-Decoder (LED), a Longformer variant for supporting long document generative sequence-to-sequence tasks, and demonstrate its effectiveness on the arXiv summarization dataset. 22 | 23 | - 动机:基于 Transformer 的模型无法处理长序列,因为它们的 self-attention 操作与序列长度成二次方关系。 24 | - 论文方法:引入了具有注意机制的 Longformer,该机制随序列长度线性缩放,从而可以轻松处理数千个标记或更长的文档。 Longformer 的注意力机制是标准 self-attention 的替代品,它将局部窗口注意力与任务驱动的全局注意力相结合。 25 | - 实验结果:预训练的 Longformer 在长文档任务上的表现始终优于 RoBERTa,并在 WikiHop 和 TriviaQA 上创造了新的最先进的结果。我们最后介绍了 Longformer-Encoder-Decoder (LED),这是一种用于支持长文档生成序列到序列任务的 Longformer 变体,并证明了它在 arXiv 汇总数据集上的有效性。 26 | 27 | ## 二、动机 28 | 29 | - 基于传统Transformer的模型,因为 每一个token都要与其他所有token进行交互,其**self-attention的点积计算量都是 O(n^2)** ,(其中 n 为输入序列长度),因此对于长序列的处理存在内存瓶颈(self-attention的计算可以并行化,所以时间复杂度仍然是 O(n) )。这也是传统Transformer模型把输入长度限制在512个token以内的原因之一。 30 | - 在面对超过长度限制的长文档时,往往需要**进行切片、截断或者抽取重要片段等处理**,这种做法 导致不同的text span之间无法进行交互,因而必然存在大量information loss,**既繁琐又破坏了原始文本的完整性**。 31 | - 通过添加一些其他机制来加强这种text span之间的交互。但这种新增机制实现起来通常比较复杂,而且往往是task-specific的,通用性不强 32 | 33 | ## 三‘论文方法 34 | 35 | 对于每一个token,**只对固定窗口大小的附近token计算local attention**,并结合具体任务,**计算少量的global attention**。该方法的优点包括: 36 | 37 | - 复杂度低,将attention机制的复杂度降至 O(n) 38 | - 通用性强,可用于各类文档级任务 39 | - 部署容易,作者在cuda内核上直接实现了Longformer的attention pattern,并提供了开源代码。 40 | 41 | 42 | - 论文亮点:Longformer的提出就是为了解决这个问题,它**使用滑动窗口注意力(Sliding Window Attention)来代替self-attention**,再**结合task-specific的全局注意力(Global Attention)作为补充**。 43 | 44 | ![](img/微信截图_20220405204037.png) 45 | 46 | > 上图展现了传统Transformer中注意力计算的内存占用随着输入序列长度的增大呈平方上升(右图紫色),而Longformer在长序列处理中具有显著存储优势(右图红色)的同时,处理速度的下降微乎其微(左图红色)。 47 | > 图中作为baseline的Full self-attention就是传统Transformer 中的自注意力;Longformer采用了Naive Pytorch和TVM两种实现方式。Naive Pytorch和Longformer的区别在于:Longformer的实现采用TVM技术将计算自注意力的代码编译为CUDA核,将处理速度提高了6倍左右(左图青色和红色)。 48 | > 49 | ## 四、模型介绍 50 | 51 | ### 4.1 Full Attention 52 | 53 | ![](img/微信截图_20220405204314.png) 54 | 55 | > 传统Transformer中的Self-attention,对序列中每一对token都计算注意力,所以**注意力占用的存储量随序列长度平方增长**。 56 | 57 | ### 4.2 滑窗机制 (Sliding window attention) 58 | 59 | ![](img/微信截图_20220405204404.png) 60 | 61 | 对于每一个 token,**只对其附近的 w 个 token 计算 attention,时间复杂度为 O(n*w)**,其中 n 为文本的长度。作者认为,根据应用任务的不同,可以对 Transformer 每一层施以不同的窗口大小 w 62 | 63 | > 读到这里,大家可能和我一样,误认为这个窗口 w 的值比较小,估计在 8-64 的量级。但看到实验部分会发现,作者在具体实现的时候,设置的窗口大小 w=512,与 BERT 的 input 限制完全一样,所以大家不要存有 "Longformer 比 BERT 更轻量" 的错觉 64 | 65 | ### 4.3 空洞滑窗机制 (Dilated sliding window) 66 | 67 | ![](img/微信截图_20220405204845.png) 68 | 69 | 对每一个 token 进行编码时,普通的滑窗机制只能考虑到长度为 w 的上下文。作者进一步提出空洞滑窗机制(实际上空洞滑窗是 CV 领域中很早就有的一项技术),在不增加计算负荷的前提下,拓宽视野范围。在滑动窗口中,被 attented 到的两个相邻 token 之间会存在大小为 d 的间隙,因此每个 token 的视野范围可达到 d*w。实验表明,由于考虑了更加全面的上下文信息,空洞滑窗机制比普通的滑窗机制表现更佳 70 | 71 | ### 4.4 融合全局信息的滑窗机制 (Global+sliding window) 72 | 73 | ![](img/微信截图_20220405204906.png) 74 | 75 | 我们知道 BERT 类的语言模型在 fine-tune 时,实现方式略有不同。 76 | 77 | > 比如,对于文本分类任务,我们会在整个输入的前面加上 [CLS] 这个 token;而对于 QA 任务,我们则会将问题与文本进行拼接后进行输入。 78 | 79 | 在 Longformer 中,作者也希望能够根据具体任务的不同,**在原本 local attention 的基础上添加少量的 global attention**。 80 | 81 | > 例如,在分类任务中会在 [CLS] 初添加一个 global attention(对应图第一行第一列全绿);而在 QA 任务上会对 question 中的所有 token 添加 global attention。如图所示,对于添加了 global attention 的 token,我们对其编码时要对整个序列做 attention,并且编码其它 token 时,也都要 attend 到它 82 | 83 | ## 五、实验结果 84 | 85 | ![](img/微信截图_20220405205528.png) 86 | 87 | ## 参考 88 | 89 | 1. [Longformer阅读笔记](https://zhuanlan.zhihu.com/p/150509736) 90 | 2. [Longformer 详解](https://wmathor.com/index.php/archives/1509/) 91 | 3. [《Longformer: The Long-Document Transformer》论文笔记](https://zhuanlan.zhihu.com/p/134748587) 92 | 4. [Longformer:超越RoBERTa,为长文档而生的预训练模型_夕小瑶的卖萌屋-程序员秘密](https://www.cxymm.net/article/xixiaoyaoww/107398795) 93 | -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/readme.md: -------------------------------------------------------------------------------- 1 | # 【关于Transformer】 那些的你不知道的事 2 | 3 | > 作者:杨夕 4 | > 5 | > 论文链接:https://arxiv.org/pdf/1706.03762.pdf 6 | > 7 | > 【注:手机阅读可能图片打不开!!!】 8 | 9 | ## 引言 10 | 11 | 本博客 主要 是本人在学习 Transformer 时的**所遇、所思、所解**,通过以 **十六连弹** 的方式帮助大家更好的理解 该问题。 12 | 13 | ## 十六连弹 14 | 15 | 1. 为什么要有 Transformer? 16 | 2. Transformer 作用是什么? 17 | 3. Transformer 整体结构怎么样? 18 | 4. Transformer-encoder 结构怎么样? 19 | 5. Transformer-decoder 结构怎么样? 20 | 6. 传统 attention 是什么? 21 | 7. self-attention 长怎么样? 22 | 8. self-attention 如何解决长距离依赖问题? 23 | 9. self-attention 如何并行化? 24 | 10. multi-head attention 怎么解? 25 | 11. 为什么要 加入 position embedding ? 26 | 12. 为什么要 加入 残差模块? 27 | 13. Layer normalization。Normalization 是什么? 28 | 14. 什么是 Mask? 29 | 15. Transformer 存在问题? 30 | 16. Transformer 怎么 Coding? 31 | 32 | ## 问题解答 33 | 34 | ### 为什么要有 Transformer? 35 | 36 | 为什么要有 Transformer? 首先需要知道在 Transformer 之前都有哪些技术,这些技术所存在的问题: 37 | 38 | - RNN:能够捕获长距离依赖信息,但是无法并行; 39 | - CNN: 能够并行,无法捕获长距离依赖信息(需要通过层叠 or 扩张卷积核 来 增大感受野); 40 | - 传统 Attention 41 | - 方法:基于源端和目标端的隐向量计算Attention, 42 | - 结果:源端每个词与目标端每个词间的依赖关系 【源端->目标端】 43 | - 问题:忽略了 远端或目标端 词与词间 的依赖关系 44 | 45 | ### Transformer 作用是什么? 46 | 47 | 基于Transformer的架构主要用于建模语言理解任务,它避免了在神经网络中使用递归,而是完全依赖于self-attention机制来绘制输入和输出之间的全局依赖关系。 48 | 49 | ### Transformer 整体结构怎么样? 50 | 51 | 1. 整体结构 52 | 53 | - Transformer 整体结构: 54 | - encoder-decoder 结构 55 | - 具体介绍: 56 | - 左边是一个 Encoder; 57 | - 右边是一个 Decoder; 58 | 59 | ![此次是图片,手机可能打不开](img/20200623092901.png) 60 | 61 | 1. 整体结构放大一点 62 | 63 | 从上一张 Transformer 结构图,可以知道 Transformer 是一个 encoder-decoder 结构,但是 encoder 和 decoder 又包含什么内容呢? 64 | - Encoder 结构: 65 | - 内部包含6层小encoder 每一层里面有2个子层; 66 | - Decoder 结构: 67 | - 内部也是包含6层小decoder ,每一层里面有3个子层 68 | 69 | ![此次是图片,手机可能打不开](img/20200623093042.png) 70 | 71 | 1. 整体结构再放大一点 72 | 73 | 其中上图中每一层的内部结构如下图所求。 74 | - 上图左边的每一层encoder都是下图左边的结构; 75 | - 上图右边的每一层的decoder都是下图右边的结构; 76 | 77 | 具体内容,后面会逐一介绍。 78 | 79 | ![此次是图片,手机可能打不开](img/20200623093217.png) 80 | 81 | ### Transformer-encoder 结构怎么样? 82 | 83 | ![此次是图片,手机可能打不开](img/20200624080740.png) 84 | 85 | - 特点: 86 | - 与 RNN,CNN 类似,可以当成一个特征提取器; 87 | - 组成结构介绍 88 | - embedding 层:将 input 转化为 embedding 向量 $X$; 89 | - Position encodding: input的位置与 input 的 embedding $X$ 相加 得到 向量 $X$; 90 | - self-attention : 将融合input的位置信息 与 input 的 embedding 信息的 $X$ 输入 Self-Attention 层得到 $Z$; 91 | - 残差网络:$Z$ 与 $X$ 相加后经过 layernorm 层; 92 | - 前馈网络:经过一层前馈网络以及 Add&Normalize,(线性转换+relu+线性转换 如下式) 93 | 94 | ![此次是图片,手机可能打不开](img/20200624081753.png) 95 | 96 | - 举例说明(假设序列长度固定,如100,如输入的序列是“我爱中国”): 97 | - 首先需要 **encoding**: 98 | - 将词映射成一个数字,encoding后,由于序列不足固定长度,因此需要padding, 99 | - 然后输入 embedding层,假设embedding的维度是128,则输入的序列维度就是100*128; 100 | - 接着是**Position encodding**,论文中是直接将每个位置通过cos-sin函数进行映射; 101 | - 分析:这部分不需要在网络中进行训练,因为它是固定。但现在很多论文是将这块也embedding,如bert的模型,至于是encoding还是embedding可取决于语料的大小,语料足够大就用embedding。将位置信息也映射到128维与上一步的embedding相加,输出100*128 102 | - 经过**self-attention层**: 103 | - 操作:假设v的向量最后一维是64维(假设没有多头),该部分输出100*64; 104 | - 经过残差网络: 105 | - 操作:即序列的embedding向量与上一步self-attention的向量加总; 106 | - 经过 **layer-norm**: 107 | - 原因: 108 | - 由于在self-attention里面更好操作而已; 109 | - 真实序列的长度一直在变化; 110 | - 经过 **前馈网络**: 111 | - 目的:增加非线性的表达能力,毕竟之前的结构基本都是简单的矩阵乘法。若前馈网络的隐向量是512维,则结构最后输出100*512; 112 | 113 | ### Transformer-decoder 结构怎么样? 114 | 115 | ![此次是图片,手机可能打不开](img/20200624083258.png) 116 | 117 | - 特点:与 encoder 类似 118 | - 组成结构介绍 119 | - masked 层: 120 | - 目的:确保了位置 i 的预测仅依赖于小于 i 的位置处的已知输出; 121 | - Linear layer: 122 | - 目的:将由解码器堆栈产生的向量投影到一个更大的向量中,称为对数向量。这个向量对应着模型的输出词汇表;向量中的每个值,对应着词汇表中每个单词的得分; 123 | - softmax层: 124 | - 操作:这些分数转换为概率(所有正数,都加起来为1.0)。选择具有最高概率的单元,并且将与其相关联的单词作为该时间步的输出 125 | 126 | 127 | ### 传统 attention 是什么? 128 | 129 | ![此次是图片,手机可能打不开](img/微信截图_20200625085139.png) 130 | - 注意力机制是什么呢? 131 | - 就是将精力集中于某一个点上 132 | - 举个例子: 133 | - 你在超市买东西,突然一个美女从你身边走过,这个时候你会做什么呢? 134 | - 没错,就是将视线【也就是注意力】集中于这个美女身上,而周围环境怎么样,你都不关注。 135 | - 思路 136 | - 输入 给定 Target 中某个 query; 137 | - 计算权值 Score: 138 | - 计算 query 和 各个 Key 的相似度或相关性,得到每个 Key 对应 value 的权值系数; 139 | - 对 权值 Score 和 value 进行加权求和 140 | - 核心: 141 | - Attention 机制 是对 source 中各个元素 的 value 进行加权求和,而 query 和 key 用于计算 对应 value 的权值系数 142 | 143 | ![此次是图片,手机可能打不开](img/微信截图_20200625085922.png) 144 | 145 | > $L_x=||Source||$代表Source的长度 146 | 147 | - 概念: 148 | - attention 的核心 就是从 大量信息中 筛选出少量的 重要信息; 149 | - 具体操作:每个 value 的 权值系数,代表 其 重要度; 150 | 151 | ![此次是图片,手机可能打不开](img/微信截图_20200625090454.png) 152 | 153 | - 具体流程介绍 154 | - step 1:计算权值系数 155 | - 采用 不同的函数或计算方式,对 query 和 key 进行计算,求出相似度或相关性 156 | - 采用的计算方法: 157 | - 向量点积: 158 | 159 | ![](img/20201009163936.png) 160 | 161 | - Cosine 相似度计算: 162 | 163 | ![](img/20201009164019.png) 164 | 165 | - MLP 网络: 166 | 167 | ![](img/20201009164053.png) 168 | 169 | - step 2: softmax 归一化 170 | - 原因: 171 | 1. score 值分布过散,将原始计算分值整理成所有元素权重之和为1 的概率分布; 172 | 2. 可以通过SoftMax的内在机制更加突出重要元素的权重; 173 | - 公式介绍 174 | 175 | ![此次是图片,手机可能打不开](img/微信截图_20200625093537.png) 176 | 177 | - step 3: 加权求和 178 | - 公式介绍: 179 | - 计算结果 $a_i$ 即为 $value_i$ 对应的权重系数,然后进行加权求和即可得到Attention数值 180 | 181 | ![此次是图片,手机可能打不开](img/微信截图_20200625095930.png) 182 | 183 | - 存在问题 184 | - 忽略了 源端或目标端 词与词间 的依赖关系【以上面栗子为例,就是把注意力集中于美女身上,而没看自己周围环境,结果可能就扑街了!】 185 | 186 | ### self-attention 长怎么样? 187 | 188 | - 动机 189 | - CNN 所存在的长距离依赖问题; 190 | - RNN 所存在的无法并行化问题【虽然能够在一定长度上缓解 长距离依赖问题】; 191 | - 传统 Attention 192 | - 方法:基于源端和目标端的隐向量计算Attention, 193 | - 结果:源端每个词与目标端每个词间的依赖关系 【源端->目标端】 194 | - 问题:忽略了 远端或目标端 词与词间 的依赖关系 195 | - 核心思想:self-attention的结构在计算每个token时,总是会考虑整个序列其他token的表达; 196 | - 举例:“我爱中国”这个序列,在计算"我"这个词的时候,不但会考虑词本身的embedding,也同时会考虑其他词对这个词的影响 197 | - 目的:学习句子内部的词依赖关系,捕获句子的内部结构。 198 | 199 | ![此次是图片,手机可能打不开](img/20200624084515.png) 200 | 201 | ![此次是图片,手机可能打不开](img/微信截图_20200625082324.png) 202 | 203 | - 步骤 204 | - embedding层: 205 | - 目的:将词转化成embedding向量; 206 | - Q,K,V 向量计算: 207 | - 根据 embedding 和权重矩阵,得到Q,K,V; 208 | - Q:查询向量,目标字作为 Query; 209 | - K:键向量,其上下文的各个字作为 Key; 210 | - V:值向量,上下文各个字的 Value; 211 | - 权重 score 计算: 212 | - 查询向量 query 点乘 key; 213 | - 目的:计算其他词对这个词的重要性,也就是权值; 214 | - scale 操作: 215 | - 乘以 $\frac{1}{\sqrt{d_{k}}}$; 216 | - 目的:起到调节作用,使得内积不至于太大。实际上是Q,K,V的最后一个维度,当 $d_k$ 越大, $QK^T$ 就越大,可能会将 Softmax 函数推入梯度极小的区域; 217 | - Softmax 归一化: 218 | - 经过 Softmax 归一化; 219 | - Attention 的输出计算: 220 | - 权值 score 和各个上下文字的 V 向量 的加权求和 221 | - 目的:把上下文各个字的 V 融入目标字的原始 V 中 222 | - 举例 223 | - 答案就是文章中的Q,K,V,这三个向量都可以表示"我"这个词,但每个向量的作用并不一样,Q 代表 query,当计算"我"这个词时,它就能代表"我"去和其他词的 K 进行点乘计算其他词对这个词的重要性,所以此时其他词(包括自己)使用 K 也就是 key 代表自己,当计算完点乘后,我们只是得到了每个词对“我”这个词的权重,需要再乘以一个其他词(包括自己)的向量,也就是V(value),才完成"我"这个词的计算,同时也是完成了用其他词来表征"我"的一个过程 224 | 225 | - 优点 226 | - 捕获源端和目标端词与词间的依赖关系 227 | - 捕获源端或目标端自身词与词间的依赖关系 228 | 229 | ### self-attention 如何解决长距离依赖问题? 230 | 231 | - 引言: 232 | - 在上一个问题中,我们提到 CNN 和 RNN 在处理长序列时,都存在 长距离依赖问题,那么你是否会有这样 几个问题: 233 | - 长距离依赖问题 是什么呢? 234 | - 为什么 CNN 和 RNN 无法解决长距离依赖问题? 235 | - 之前提出过哪些解决方法? 236 | - self-attention 是如何 解决 长距离依赖问题的呢? 237 | 238 | 下面,我们将会围绕着几个问题,进行一一解答。 239 | 240 | - 长距离依赖问题 是什么呢? 241 | - 介绍:对于序列问题,第 $t$ 时刻 的 输出 $y_t$ 依赖于 $t$ 之前的输入,也就是 说 依赖于 $x_{t-k}, k=1,...,t$,当间隔 $k$ 逐渐增大时,$x_{t-k}$ 的信息将难以被 $y_t$ 所学习到,也就是说,很难建立 这种 长距离依赖关系,这个也就是 长距离依赖问题(Long-Term Dependencies Problem)。 242 | - 为什么 CNN 和 RNN 无法解决长距离依赖问题? 243 | - CNN: 244 | - 捕获信息的方式: 245 | - CNN 主要采用 卷积核 的 方式捕获 句子内的局部信息,你可以把他理解为 **基于 n-gram 的局部编码方式**捕获局部信息 246 | - 问题: 247 | - 因为是 n-gram 的局部编码方式,那么当 $k$ 距离 大于 $n$ 时,那么 $y_t$ 将难以学习 $x_{t-k}$ 信息; 248 | - 举例: 249 | - 其实 n-gram 类似于 人的 视觉范围,人的视觉范围 在每一时刻 只能 捕获 一定 范围内 的信息,比如,你在看前面的时候,你是不可能注意到背后发生了什么,除非你转过身往后看。 250 | - RNN: 251 | - 捕获信息的方式: 252 | - RNN 主要 通过 循环 的方式学习(记忆) 之前的信息$x_{t}$; 253 | - 问题: 254 | - 但是随着时间 $t$ 的推移,你会出现**梯度消失或梯度爆炸**问题,这种问题使你只能建立短距离依赖信息。 255 | - 举例: 256 | - RNN 的学习模式好比于 人类 的记忆力,人类可能会对 短距离内发生的 事情特别清楚,但是随着时间的推移,人类开始 会对 好久之前所发生的事情变得印象模糊,比如,你对小时候发生的事情,印象模糊一样。 257 | - 解决方法: 258 | - 针对该问题,后期也提出了很多 RNN 变体,比如 LSTM、 GRU,这些变体 通过引入 门控的机制 来 有选择性 的记忆 一些 重要的信息,但是这种方法 也只能在 一定程度上缓解 长距离依赖问题,但是并不能 从根本上解决问题。 259 | 260 | ![此次是图片,手机可能打不开](img/QQ截图20200626120834.png) 261 | 262 | - 之前提出过哪些解决方法? 263 | - 引言: 264 | - 那么 之前 主要采用 什么方法 解决问题呢? 265 | - 解决方法: 266 | - 增加网络的层数 267 | - 通过一个深层网络来获取远距离的信息交互 268 | - 使用全连接网络 269 | - 通过全连接的方法对 长距离 建模; 270 | - 问题: 271 | - 无法处理变长的输入序列; 272 | - 不同的输入长度,其连接权重的大小也是不同的; 273 | 274 | ![此次是图片,手机可能打不开](img/QQ截图20200626122726.png) 275 | 276 | - self-attention 是如何 解决 长距离依赖问题的呢? 277 | - 解决方式: 278 | - 利用注意力机制来“动态”地生成不同连接的权重,从而处理变长的信息序列 279 | - 具体介绍: 280 | - 对于 当前query,你需要 与 句子中 所有 key 进行点乘后再 Softmax ,以获得 句子中 所有 key 对于 当前query 的 score(可以理解为 贡献度),然后与 所有词 的 value 向量进行加权融合之后,就能使 当前 $y_t$ 学习到句子中 其他词$x_{t-k}$的信息; 281 | 282 | ### self-attention 如何并行化? 283 | 284 | - 引言: 285 | - 在上一个问题中,我们主要讨论了 CNN 和 RNN 在处理长序列时,都存在 长距离依赖问题,以及 Transformer 是 如何解决 长距离依赖问题,但是对于 RNN ,还存在另外一个问题: 286 | - 无法并行化问题 287 | - 那么,Transformer 是如何进行并行化的呢? 288 | - Transformer 如何进行并行化? 289 | - 核心:self-attention 290 | - 为什么 RNN 不能并行化: 291 | - 原因:RNN 在 计算 $x_i$ 的时候,需要考虑到 $x_1 ~ x_{i-1}$ 的 信息,使得 RNN 只能 从 $x_1$ 计算到 $x_i$; 292 | - 思路: 293 | - 在 self-attention 能够 并行的 计算 句子中不同 的 query,因为每个 query 之间并不存在 先后依赖关系,也使得 transformer 能够并行化; 294 | 295 | ### multi-head attention 怎么解? 296 | 297 | - 思路: 298 | - 相当于 $h$ 个 不同的 self-attention 的集成 299 | - 就是把self-attention做 n 次,取决于 head 的个数;论文里面是做了8次。 300 | - 步骤: 301 | - step 1 : 初始化 N 组 $Q,K,V$矩阵(论文为 8组); 302 | 303 | ![此次是图片,手机可能打不开](img/QQ截图20200625101229.png) 304 | 305 | - step 2 : 每组 分别 进行 self-attention; 306 | - step 3: 307 | - 问题:多个 self-attention 会得到 多个 矩阵,但是前馈神经网络没法输入8个矩阵; 308 | - 目标:把8个矩阵降为1个 309 | - 步骤: 310 | - 每次self-attention都会得到一个 Z 矩阵,把每个 Z 矩阵拼接起来, 311 | - 再乘以一个Wo矩阵, 312 | - 得到一个最终的矩阵,即 multi-head Attention 的结果; 313 | 314 | 315 | ![此次是图片,手机可能打不开](img/20200624090026.png) 316 | 317 | 最后,让我们来看一下完整的流程: 318 | 319 | ![此次是图片,手机可能打不开](img/20200624090034.png) 320 | 321 | 换一种表现方式: 322 | 323 | ![此次是图片,手机可能打不开](img/微信截图_20200625101800.png) 324 | 325 | - 动图介绍 326 | 327 | ![此次是图片,手机可能打不开](img/v2-595ce4ebf9b3fccb479f7d234190af35_b.gif) 328 | 329 | ### 为什么要 加入 position embedding ? 330 | 331 | - 问题: 332 | - 介绍:缺乏 一种 表示 输入序列中 单词顺序 的方法 333 | - 说明:因为模型不包括Recurrence/Convolution,因此是无法捕捉到序列顺序信息的,例如将K、V按行进行打乱,那么Attention之后的结果是一样的。但是序列信息非常重要,代表着全局的结构,因此必须将序列的分词相对或者绝对position信息利用起来 334 | - 目的:加入词序信息,使 Attention 能够分辨出不同位置的词 335 | - 思路: 336 | - 在 encoder 层和 decoder 层的输入添加了一个额外的向量Positional Encoding,维度和embedding的维度一样,让模型学习到这个值 337 | - 位置向量的作用: 338 | - 决定当前词的位置; 339 | - 计算在一个句子中不同的词之间的距离 340 | - 步骤: 341 | - 将每个位置编号, 342 | - 然后每个编号对应一个向量, 343 | - 通过将位置向量和词向量相加,就给每个词都引入了一定的位置信息。 344 | 345 | ![此次是图片,手机可能打不开](img/QQ截图20200625103634.png) 346 | 347 | - 论文的位置编码是使用三角函数去计算的。好处: 348 | - 值域只有[-1,1] 349 | - 容易计算相对位置。 350 | 351 | ![此次是图片,手机可能打不开](img/20200624090357.png) 352 | 353 | > 注: 354 | > 355 | > $pos$ 表示当前词在句子中的位置 356 | > 357 | > $i$ 表示向量中每个值 的 index 358 | > 359 | > 在偶数位置:使用 正弦编码 $sin()$; 360 | > 361 | > 在奇数位置:使用 余弦编码 $cos()$; 362 | 363 | ### 为什么要 加入 残差模块? 364 | 365 | - 动机:因为 transformer 堆叠了 很多层,容易 梯度消失或者梯度爆炸 366 | 367 | ### Layer normalization。Normalization 是什么? 368 | 369 | - 动机:因为 transformer 堆叠了 很多层,容易 梯度消失或者梯度爆炸; 370 | - 原因: 371 | - 数据经过该网络层的作用后,不再是归一化,偏差会越来越大,所以需要将 数据 重新 做归一化处理; 372 | - 目的: 373 | - 在数据送入激活函数之前进行normalization(归一化)之前,需要将输入的信息利用 normalization 转化成均值为0方差为1的数据,避免因输入数据落在激活函数的饱和区而出现 梯度消失或者梯度爆炸 问题 374 | - 介绍: 375 | - 归一化的一种方式 376 | - 对每一个样本介绍均值和方差【这个与 BN 有所不同,因为他是在 批方向上 计算均值和方差】 377 | - 公式 378 | 379 | > BN 计算公式 380 | 381 | ![此次是图片,手机可能打不开](img/QQ截图20200625110603.png) 382 | 383 | > LN 计算公式 384 | 385 | ![此次是图片,手机可能打不开](img/QQ截图20200625110706.png) 386 | 387 | ### 什么是 Mask? 388 | 389 | - 介绍:掩盖某些值的信息,让模型信息不到该信息; 390 | - 类别:padding mask and sequence mask 391 | - padding mask 392 | - 作用域:每一个 scaled dot-product attention 中 393 | - 动机: 394 | - 输入句子的长度不一问题 395 | - 方法: 396 | - 短句子:后面 采用 0 填充 397 | - 长句子:只截取 左边 部分内容,其他的丢弃 398 | - 原因: 399 | - 对于 填充 的位置,其所包含的信息量 对于 模型学习 作用不大,所以 self-attention 应该 抛弃对这些位置 进行学习; 400 | - 做法: 401 | - 在这些位置上加上 一个 非常大 的负数(负无穷),使 该位置的值经过 Softmax 后,值近似 0,利用 padding mask 标记哪些值需要做处理; 402 | - sequence mask 403 | - 作用域:只作用于 decoder 的 self-attention 中 404 | - 动机:不可预测性; 405 | - 目标:sequence mask 是为了使得 decoder 不能看见未来的信息。也就是对于一个序列,在 time_step 为 t 的时刻,我们的解码输出应该只能依赖于 t 时刻之前的输出,而不能依赖 t 之后的输出。因此我们需要想一个办法,把 t 之后的信息给隐藏起来。 406 | - 做法: 407 | - 产生一个上三角矩阵,上三角的值全为0。把这个矩阵作用在每一个序列上,就可以达到我们的目的 408 | > 注: 409 | > 410 | > 在 decoder 的 scaled dot-product attention 中,里面的 attn_mask = padding mask + sequence mask 411 | > 412 | > 在 encoder 的 scaled dot-product attention 中,里面的 attn_mask = padding mask 413 | 414 | ### Transformer 存在问题? 415 | 416 | - 引言 417 | - 居然 Transformer 怎么厉害,那么 是否也存在不足呢? 418 | - 答案: 有的 419 | - 问题一:不能很好的处理超长输入问题? 420 | - 介绍:Transformer 固定了句子长度; 421 | - 举例: 422 | - 例如 在 Bert 里面,输入句子的默认长度 为 512; 423 | - 对于长度长短问题,做了以下处理: 424 | - 短于 512:填充句子方式; 425 | - 长于 512: 426 | - 处理方式一:截断句子方式(Transformer 处理方式); 427 | - 处理方式二:将句子划分为 多个 seg ([Vanilla Transformer](https://aaai.org/ojs/index.php/AAAI/article/view/4182) 处理方式); 428 | - 思路: 429 | - 将文本划分为多个segments; 430 | - 训练的时候,对每个segment单独处理; 431 | - 问题: 432 | - 因为 segments 之间独立训练,所以不同的token之间,最长的依赖关系,就取决于segment的长度 (如图(a)); 433 | - 出于效率的考虑,在划分segments的时候,不考虑句子的自然边界,而是根据固定的长度来划分序列,导致分割出来的segments在语义上是不完整的 (如图(a)); 434 | - 在预测的时候,会对固定长度的 segment 做计算,一般取最后一个位置的隐向量作为输出。为了充分利用上下文关系,在每做完一次预测之后,就对整个序列向右移动一个位置,再做一次计算,这导致计算效率非常低 (如图(b)); 435 | 436 | ![此次是图片,手机可能打不开](img/QQ截图20200626152309.png) 437 | 438 | - 处理方式三:Segment-Level Recurrenc ( [Transformer-XL](https://aaai.org/ojs/index.php/AAAI/article/view/4182) 处理方式); 439 | - 思路: 440 | - 在对当前segment进行处理的时候,**缓存**并利用上一个segment中所有layer的隐向量序列; 441 | - 上一个segment的所有隐向量序列只参与前向计算,不再进行反向传播; 442 | 443 | ![此次是图片,手机可能打不开](img/QQ截图20200626153600.png) 444 | 445 | - 问题二:方向信息以及相对位置 的 缺失 问题? 446 | - 动机: 447 | - 方向信息和位置信息的缺失,导致 Transformer 在 NLP 中表现性能较差,例如在 命名实体识别任务中; 448 | - 举例: 449 | - 如下图,“Inc”单词之前的词很有可能就是机构组织(ORG),“in”单词之后的词,很有可能是时间地点(TIME);并且一个实体应该是连续的单词组成,标红的“Louis Vuitton”不会和标蓝的“Inc”组成一个实体。但是原始的Transformer无法捕获这些信息。 450 | 451 | ![此次是图片,手机可能打不开](img/QQ截图20200626154711.png) 452 | 453 | - 解决方法: 454 | - 可以查看 [TENER: Adapting Transformer Encoder for Name Entity Recognition](https://arxiv.org/pdf/1911.04474.pdf) 【论文后期会做总结】 455 | 456 | - 问题三:缺少Recurrent Inductive Bias 457 | - 动机: 458 | - 学习算法中Inductive Bias可以用来预测从未遇到的输入的输出(参考[10])。对于很多序列建模任务(如需要对输入的层次结构进行建模时,或者在训练和推理期间输入长度的分布不同时),Recurrent Inductive Bias至关重要【可以看论文[The Importance of Being Recurrent for Modeling Hierarchical Structure](https://arxiv.org/abs/1803.03585)】 459 | - 问题四:Transformer是非图灵完备的: 非图灵完备通俗的理解,就是无法解决所有的问题 460 | - 动机: 461 | - 在Transformer中,单层中sequential operation (context two symbols需要的操作数)是$O(1)$ time,独立于输入序列的长度。那么总的sequenctial operation仅由层数$T$决定。这意味着transformer不能在计算上通用,即无法处理某些输入。如:输入是一个需要**对每个输入元素进行顺序处理**的函数,在这种情况下,对于任意给定的深度$T$的transformer,都可以构造一个长度为 $N>T$; 462 | - 问题五:transformer缺少conditional computation 463 | - 动机: 464 | - transformer在encoder的过程中,所有输入元素都有相同的计算量,比如对于“I arrived at the bank after crossing the river", 和"river"相比,需要更多的背景知识来推断单词"bank"的含义,然而transformer在编码这个句子的时候,无条件对于每个单词应用相同的计算量,这样的过程显然是低效的。 465 | - 问题六:transformer 时间复杂度 和 空间复杂度 过大问题 466 | - 动机: 467 | - Transformer 中用到的自注意力与长度n呈现出$O(n^2)$的时间和空间复杂度 468 | - 解决方法: 469 | - [Linformer](https://arxiv.org/abs/2006.04768) 470 | 471 | ### Transformer 怎么 Coding? 472 | 473 | - 最后的最后,送上 whalePaper 成员 逸神 的 【[Transformer 理论源码细节详解](https://zhuanlan.zhihu.com/p/106867810)】; 474 | 475 | - 理论+实践,干活永不累! 476 | 477 | ## 参考资料 478 | 479 | 1. [Transformer理论源码细节详解](https://zhuanlan.zhihu.com/p/106867810) 480 | 2. [论文笔记:Attention is all you need(Transformer)](https://zhuanlan.zhihu.com/p/51089880) 481 | 3. [深度学习-论文阅读-Transformer-20191117](https://zhuanlan.zhihu.com/p/92234185) 482 | 4. [Transform详解(超详细) Attention is all you need论文](https://zhuanlan.zhihu.com/p/63191028) 483 | 5. [目前主流的attention方法都有哪些?](https://www.zhihu.com/question/68482809/answer/597944559) 484 | 6. [transformer三部曲](https://zhuanlan.zhihu.com/p/85612521) 485 | 7. [Character-Level Language Modeling with Deeper Self-Attention](https://aaai.org/ojs/index.php/AAAI/article/view/4182) 486 | 8. [Transformer-XL: Unleashing the Potential of Attention Models](https://ai.googleblog.com/2019/01/transformer-xl-unleashing-potential-of.html) 487 | 9. [The Importance of Being Recurrent for Modeling Hierarchical Structure](https://arxiv.org/abs/1803.03585) 488 | 10. [Linformer](https://arxiv.org/abs/2006.04768) 489 | 490 | -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/readme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/readme.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/2009.06732.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/2009.06732.pdf -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/2b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/2b.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/2b.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/2b.webp -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210414094103.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210414094103.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210415084208.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210415084208.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210415084222.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210415084222.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210415132355.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210415132355.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210415191251.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210415191251.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416083414.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416083414.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416084725.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416084725.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416085747.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416085747.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416085959.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416085959.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416090045.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416090045.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416090444.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416090444.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416090637.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416090637.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416090713.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416090713.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416090729.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210416090729.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210422080707.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210422080707.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210422081746.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210422081746.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210422083332.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210422083332.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210422083957.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/km1994/nlp_paper_study_transformer/338da3527570c60e80c3f000d6726b2c8d06a93a/DL_algorithm/transformer_study/transformer_survey/img/微信截图_20210422083957.png -------------------------------------------------------------------------------- /DL_algorithm/transformer_study/transformer_survey/readme.md: -------------------------------------------------------------------------------- 1 | # 【关于 Efficient Transformers: A Survey】 那些你不知道的事 2 | 3 | > 作者:杨夕 4 | > 5 | > 论文名称:Efficient Transformers: A Survey 6 | > 7 | > 论文地址:https://arxiv.org/abs/2009.06732 8 | > 9 | > 项目地址:https://github.com/km1994/nlp_paper_study 10 | > 11 | > 个人介绍:大佬们好,我叫杨夕,该项目主要是本人在研读顶会论文和复现经典论文过程中,所见、所思、所想、所闻,可能存在一些理解错误,希望大佬们多多指正。 12 | > 13 | > NLP 面经地址:https://github.com/km1994/NLP-Interview-Notes 14 | 15 | - [【关于 Efficient Transformers: A Survey】 那些你不知道的事](#关于-efficient-transformers-a-survey-那些你不知道的事) 16 | - [一、摘要](#一摘要) 17 | - [二、Transformer 介绍](#二transformer-介绍) 18 | - [三、Efficient Transformers](#三efficient-transformers) 19 | - [3.1 Fixed patterns(FP)](#31-fixed-patternsfp) 20 | - [3.1.1 Fixed patterns(FP) 介绍](#311-fixed-patternsfp-介绍) 21 | - [3.1.2 Fixed patterns(FP) 类别](#312-fixed-patternsfp-类别) 22 | - [3.2 Combination of Patterns (CP)](#32-combination-of-patterns-cp) 23 | - [3.2.1 Combination of Patterns (CP) 介绍](#321-combination-of-patterns-cp-介绍) 24 | - [3.2.2 Combination of Patterns (CP) 类别](#322-combination-of-patterns-cp--类别) 25 | - [3.2.3 Fixed patterns(FP) vs 多Combination of Patterns (CP)](#323-fixed-patternsfp-vs-多combination-of-patterns-cp) 26 | - [3.3 Learnable Patterns (LP)](#33-learnable-patterns-lp) 27 | - [3.3.1 Learnable Patterns (LP) 介绍](#331-learnable-patterns-lp-介绍) 28 | - [3.3.2 Learnable Patterns (LP) 类别](#332-learnable-patterns-lp--类别) 29 | - [3.3.3 Learnable Patterns (LP) 优点](#333-learnable-patterns-lp--优点) 30 | - [3.4 Memory](#34-memory) 31 | - [3.4.1 Memory 介绍](#341-memory-介绍) 32 | - [3.4.2 Memory 类别](#342-memory-类别) 33 | - [3.5 Low-Rank 方法](#35-low-rank-方法) 34 | - [3.5.1 Low-Rank 方法 介绍](#351-low-rank-方法-介绍) 35 | - [3.5.2 Low-Rank 方法 类别](#352-low-rank-方法-类别) 36 | - [3.6 Kernels 方法](#36-kernels-方法) 37 | - [3.6.1 Kernels 方法 介绍](#361--kernels-方法-介绍) 38 | - [3.6.2 Kernels 方法 代表](#362--kernels-方法-代表) 39 | - [3.7 Recurrence 方法](#37--recurrence-方法) 40 | - [3.7.1 Recurrence 方法 介绍](#371--recurrence-方法-介绍) 41 | - [3.7.2 Kernels 方法 代表](#372--kernels-方法-代表) 42 | - [四、Transformer 变体 介绍](#四transformer-变体-介绍) 43 | - [4.1 引言](#41-引言) 44 | - [4.2 Memory Compressed Transformer [4]](#42-memory-compressed-transformer-4) 45 | - [4.2.1 Local Attention Span](#421-local-attention-span) 46 | - [4.2.2 Local Attention Span](#422-local-attention-span) 47 | - [4.2.3 Computation and Memory Complexity](#423-computation-and-memory-complexity) 48 | - [4.3 Image Transformer [5]](#43-image-transformer-5) 49 | - [4.3.1 Localized Attention Span](#431-localized-attention-span) 50 | - [4.3.2 Computational and Memory Complexity](#432-computational-and-memory-complexity) 51 | - [4.4 Set Transformer [6]](#44-set-transformer-6) 52 | - [4.4.1 应用场景](#441-应用场景) 53 | - [4.4.2 Diagrams of our attention-based set operations](#442-diagrams-of-our-attention-based-set-operations) 54 | - [4.4.3 Computational and Memory Complexity](#443-computational-and-memory-complexity) 55 | - [4.5 Sparse Transformer](#45-sparse-transformer) 56 | - [4.5.1 介绍](#451-介绍) 57 | - [4.5.2 Attention](#452-attention) 58 | - [4.5.3 Computational and Memory Complexity](#453-computational-and-memory-complexity) 59 | - [4.5.4 局限性](#454-局限性) 60 | - [4.6 Axial Transformer](#46-axial-transformer) 61 | - [4.6.1 介绍](#461-介绍) 62 | - [4.6.2 Computational and Memory Complexity](#462-computational-and-memory-complexity) 63 | - [4.7 Longformer](#47-longformer) 64 | - [4.7.1 介绍](#471-介绍) 65 | - [4.7.2 Computational and Memory Complexity](#472-computational-and-memory-complexity) 66 | - [4.8 Extended Transformer Construction (ETC)(2020)【9】](#48--extended-transformer-construction-etc20209) 67 | - [4.8.1 介绍](#481-介绍) 68 | - [4.8.2 Computational and Memory Complexity](#482-computational-and-memory-complexity) 69 | - [4.8.3 局限性](#483-局限性) 70 | - [4.9 BigBird(2020)](#49--bigbird2020) 71 | - [4.9.1 介绍](#491-介绍) 72 | - [4.9.2 Computational and Memory Complexity](#492-computational-and-memory-complexity) 73 | - [4.9.3 局限性](#493-局限性) 74 | - [4.10 Routing Transformer](#410--routing-transformer) 75 | - [4.10.1 介绍](#4101-介绍) 76 | - [4.10.2 Computational and Memory Complexity](#4102-computational-and-memory-complexity) 77 | - [4.11 Reformer(2020)](#411--reformer2020) 78 | - [4.11.1 介绍](#4111-介绍) 79 | - [4.11.2 Computational and Memory Complexity](#4112-computational-and-memory-complexity) 80 | - [4.12 Sinkhorn Transformers](#412--sinkhorn-transformers) 81 | - [4.12.1 介绍](#4121-介绍) 82 | - [4.12.2 Computational and Memory Complexity](#4122-computational-and-memory-complexity) 83 | - [4.13 Linformer](#413--linformer) 84 | - [4.13.1 介绍](#4131-介绍) 85 | - [4.13.2 Computational and Memory Complexity](#4132-computational-and-memory-complexity) 86 | - [4.14 Linear Transformer](#414---linear-transformer) 87 | - [4.14.1 介绍](#4141-介绍) 88 | - [4.14.2 Computational and Memory Complexity](#4142-computational-and-memory-complexity) 89 | - [4.15 Performer(2020)](#415--performer2020) 90 | - [4.15.1 介绍](#4151-介绍) 91 | - [4.15.2 Computational and Memory Complexity](#4152-computational-and-memory-complexity) 92 | - [4.16 Synthesizer models(2020)](#416--synthesizer-models2020) 93 | - [4.16.1 介绍](#4161-介绍) 94 | - [4.16.2 Computational and Memory Complexity](#4162-computational-and-memory-complexity) 95 | - [4.17 Transformer-XL(2020)](#417--transformer-xl2020) 96 | - [4.17.1 介绍](#4171-介绍) 97 | - [4.17.2 Computational and Memory Complexity](#4172-computational-and-memory-complexity) 98 | - [4.18 Compressive Transformers](#418--compressive-transformers) 99 | - [4.18.1 介绍](#4181-介绍) 100 | - [4.18.2 Computational and Memory Complexity](#4182-computational-and-memory-complexity) 101 | - [五、总结](#五总结) 102 | - [参考](#参考) 103 | 104 | ## 一、摘要 105 | 106 | Transformer model architectures have garnered immense interest lately due to their effectiveness across a range of domains like language, vision and reinforcement learning. In the field of natural language processing for example, Transformers have become an indispensable staple in the modern deep learning stack. Recently, a dizzying number of "X-former" models have been proposed - Reformer, Linformer, Performer, Longformer, to name a few - which improve upon the original Transformer architecture, many of which make improvements around computational and memory efficiency. With the aim of helping the avid researcher navigate this flurry, this paper characterizes a large and thoughtful selection of recent efficiency-flavored "X-former" models, providing an organized and comprehensive overview of existing work and models across multiple domains. 107 | 108 | Transformer模型体系结构由于其跨语言、视觉和强化学习等一系列领域的有效性,最近引起了人们极大的兴趣。例如,在自然语言处理领域,Transformer 已经成为现代深度学习中不可或缺的主要部分。最近,有许多令人眼花缭乱的“X-former”模型被提出,比如Reformer、Linformer、Performer、Longformer等等,它们改进了原有的Transformer架构,其中许多都围绕计算和内存效率进行了改进。为了帮助热心的研究人员驾驭这股热潮,本文描述了大量和深思熟虑的最近效率口味的“X-former”模型的选择,提供了跨多个领域的现有工作和模型的有组织和全面的概述。 109 | 110 | ## 二、Transformer 介绍 111 | 112 | Transformer 介绍 可以 查看 [【关于Transformer】 那些的你不知道的事](https://github.com/km1994/nlp_paper_study/tree/master/DL_algorithm/transformer_study) 113 | 114 | ## 三、Efficient Transformers 115 | 116 | ![](img/微信截图_20210415084208.png) 117 | 118 | ![](img/微信截图_20210415084222.png.png) 119 | 120 | ### 3.1 Fixed patterns(FP) 121 | 122 | #### 3.1.1 Fixed patterns(FP) 介绍 123 | 124 | Fixed patterns(FP) 作为最早的针对 self-attention 的改进方法,通过限制attention的范围,从全局到局部,降低计算复杂度。 125 | 126 | #### 3.1.2 Fixed patterns(FP) 类别 127 | 128 | 1. Blockwise Patterns 129 | 130 | - 方式:在实践中最简单的示例是blockwise(或chunking)范式,该方式 主要事将输入序列切分成 多个 block,然后分别对 每个 block 进行 attention; 131 | - 优点:通过这种方式将 复杂度 从 $O(N^2)$ 降低到 $O(B^2)$,这里的 B 为 Block size; 132 | - 缺点:对于 输入序列 进行切割,容易导致 序列不连贯 问题,使得 attention 能力受到限制,性能下降; 133 | 134 | 2. Strided Patterns 135 | 136 | - 方式: 利用 滑动窗口 的方法,即 分别对 每个 token 和其所相邻的 token 做 attention,相邻 token 的数量 即为 滑动窗口 的大小【window size】; 137 | - 优点:这种方式类似于 卷积层,能够 捕获 每个 token 的 局部信息; 138 | - 缺点:这种方式 和 卷积层一样,由于 只对 局部感受野 进行 attention,所以 对于 感受野 以外 的信息,无法捕获到; 139 | 140 | 3. Compressed Patterns 141 | 142 | - 方式:通过卷积池化的方式对序列进行负采样,比如用kernel 为2,stride为2的CNN,将2个token表征成一个向量,然后在做attention; 143 | - 优点:降低attention的计算复杂度。其实就相当于通过CNN对序列进行n-gram的切分。 144 | - 缺点:与 Strided Patterns 类似问题,这种方法不可避免 的 出现 长距离依赖问题; 145 | 146 | ### 3.2 Combination of Patterns (CP) 147 | 148 | #### 3.2.1 Combination of Patterns (CP) 介绍 149 | 150 | 通过组合两个或多个不同的访问模式来提高覆盖范围。 151 | 152 | #### 3.2.2 Combination of Patterns (CP) 类别 153 | 154 | - Sparse Transformer 将其一半的头部分配给模式,结合strided 和 local attention; 155 | - Axial Transformer 在给定高维张量作为输入的情况下,沿着输入张量的单轴应用一系列的self attention计算。 156 | 157 | #### 3.2.3 Fixed patterns(FP) vs 多Combination of Patterns (CP) 158 | 159 | - Fixed patterns(FP):以固定模式相同的方式降低了内存的复杂度; 160 | - Combination of Patterns (CP):改善了self attention机制的总覆盖范围。 161 | 162 | ### 3.3 Learnable Patterns (LP) 163 | 164 | #### 3.3.1 Learnable Patterns (LP) 介绍 165 | 166 | 上面 介绍的 Fixed patterns(FP),是通过认为认定好 attention的范围 的方式来减低 计算复杂度,但是 不同 的 token 所对应 的 attention的范围 不一样相同,容易出现 信息丢失问题。 167 | 168 | 那么,attention的范围 是否 可以 让模型 自学习 获得呢? 169 | 170 | 针对该问题,Learnable Patterns (LP) 通过引入可学习参数,让模型自己找到划分区域。LP的关键是确定token相关性,将token分配给buckets 或者clusters。 171 | 172 | #### 3.3.2 Learnable Patterns (LP) 类别 173 | 174 | - Reformer 引入了基于哈希的相似性度量,有效地将token聚类为chunks; 175 | - Routing Transformer 在token上采用在线的k-means聚类; 176 | - Sinkhorn排序网络(Sorting Network)通过学习对输入序列的blocks排序来显露attention weight的sparsity。 177 | 178 | #### 3.3.3 Learnable Patterns (LP) 优点 179 | 180 | 所有这些模型中,相似性函数与网络的其它部分一起进行端到端训练。LP 的**关键点仍然是利用固定模式(chunked patterns)**。但是,此类方法**学会对输入token进行排序/聚类,即保持FP方法效率优势的同时,得到更优的序列全局视图**。 181 | 182 | ### 3.4 Memory 183 | 184 | #### 3.4.1 Memory 介绍 185 | 186 | 用一个side memory模块,可以一次访问多个token。通用形式是全局存储器,能够访问整个序列。全局token充当记忆的一种形式,从输入序列的token中学习聚集。 187 | 188 | #### 3.4.2 Memory 类别 189 | 190 | 1. Set Transformers 191 | 192 | - 介绍:Set Transformers 中引入的inducing points方法,这个过程其实就是利用这m个向量将输入序列X的信息先通过attention进行压缩,再通过attention还原,达到抽取输入序列的特征的目的。这些参数通常被解释为“memory”,并用作将来处理的临时上下文信息。这可以看作是parameter attention的一种形式。 193 | - 流程 194 | - 先单独设置了m个向量(m是超参数); 195 | - 然后这m个向量与X做multihead attention,得到m个临时向量(这些个临时变量我们就称作“temporary memory”); 196 | - 接着把X与这m个临时向量再做一次multihead attention得到输出。 197 | - 缺点:在压缩编码解码的过程中肯定会有信息损失 198 | 199 | 2. ETC和Longformer 200 | 201 | - 介绍:引入全局记忆,即设置一些token,它们可以与所有的token进行注意力交互,比如bert的[CLS],由于这些token的数目远小于序列长度,因此也不会给计算带来负担,而且往往携带了整个输入序列的信息,这就是我们可以在bert上用[CLS]作文本分类任务的原因。 202 | 203 | ### 3.5 Low-Rank 方法 204 | 205 | #### 3.5.1 Low-Rank 方法 介绍 206 | 207 | Low-Rank 方法 采用 N*N 矩阵 的 low-rank 结构 近似 self-attention matrix,以提高计算效率 208 | 209 | #### 3.5.2 Low-Rank 方法 类别 210 | 211 | 1. Linformer 212 | 213 | 由于 通过 softmax 计算之后的 $N*N$ attention 矩阵不是 一个满秩矩阵,所以 不需要 考虑 计算一个 完整 attention 矩阵,也就是说我们 可以将 一个 $n*d$ 的 K,V 映射 到 $k*d$ 维 空间上; 214 | 215 | ![](img/微信截图_20210414094103.png) 216 | 217 | > 注:由于将 $n*d$ 维(n 为序列长度,d 为模型向量维度)的 key 和 val 映射到 $k*d$ 维 空间上,所以 attention矩阵被降到 $n*k$ 维,时间复杂度 降到 $O(n)$; 218 | 219 | ### 3.6 Kernels 方法 220 | 221 | #### 3.6.1 Kernels 方法 介绍 222 | 223 | - 前言:对于 Kernels 方法,大家可能都不陌生,因为在 SVM 方法中就有提到过 该方法, Kernels 方法 在 SVM 方法中的应用,主要是将 在给定空间中线性不可分 的 训练集 通过 Kernels 方法 映射到 线性可分的空间中。; 224 | - 介绍:在 Transformer 优化方法中,可以利用 Kernels 方法 进行变换,并利用 变换后的结果 代替 原有的softmax注意力矩阵计算; 225 | - 优点:这种方法可以将 计算复杂度 下降至 O(n); 226 | 227 | #### 3.6.2 Kernels 方法 代表 228 | 229 | 1. Linear Transformers 230 | 231 | ### 3.7 Recurrence 方法 232 | 233 | #### 3.7.1 Recurrence 方法 介绍 234 | 235 | - 介绍:作为 3.1 节 提到的 fixed patterns 中 blockwise 的 扩展,Recurrence 方法 本质上仍是对输入序列进行区域划分,不过它进一步的对划分后的block做了一层循环连接,通过这样的层级关系就可以把一个长序列的输入更好的表征。 236 | 237 | #### 3.7.2 Kernels 方法 代表 238 | 239 | 1. Transformer-XL 240 | 241 | 为了解决长距离依赖,Transformer-XL 提出了 segment-level recurrence mechanism, 即引入一个 memory 状态。 242 | 243 | 在训练过程中,每个片段的表示为最后的隐层状态​,​表示片段的序号,​表示片段的长度,​表示隐层维度。 244 | 245 | 在计算​片段的表示时,用memory缓存​片段​层的隐层状态​,用来更新​,这样就给下一个片段同了上文,长距离依赖也通过memory保存了下来。并且,最大可能的依赖长度线性增长,达到 $N*L$ 。 246 | 247 | ![](img/2b.webp) 248 | 249 | ## 四、Transformer 变体 介绍 250 | 251 | ### 4.1 引言 252 | 253 | 这一节 主要将对 上一节 所提到的 Transformer 变体 进行介绍。 254 | 255 | 我们首先讨论 local and fixed patterns models ,例如Memory Compressed Transformer(Liu等人,2018)和Image Transformer(Parmaret等人,2018)。然后我们讨论Set Transformers(Lee等人,2019),这是一种利用 global memory 的早期方法。接下来,我们继续使用利用 combinationsof pattern 的模型,例如 Sparse Transformers (Child et al., 2019) 和 Axial Transformers (Hoet al., 2019) 。接下来,我们讨论 Longformer(Beltagy等,2020)和ETC(Ainslie等,2020),介绍了 memory-based approaches 的 Sparse Transformer family 。我们的详细演练将继续研究结合了 learnable patterns(LP) 的模型,例如 Routing Transformers (Roy et al., 2020) ,Reformer(Kitaev等人,2020)和 Sinkhorn Transformers (Tay et al., 2020b)。之后,我们介绍了可以被视为 Linformer (Wanget al., 2020b) 和 Synthesizers (Tay et al., 2020a) 。然后,我们讨论 based on kernel approaches 的模型,例如Performer(Choromanski等,2020)和 Linear Transformers(Katharopoulos等,2020)。最后,我们讨论ased on segment-based recurrence ,例如 Transformer-XL(Dai等人,2019)和 Compressive Transformers(Rae等人,2020) 256 | 257 | ### 4.2 Memory Compressed Transformer [4] 258 | 259 | ![](img/微信截图_20210416083414.png) 260 | 261 | #### 4.2.1 Local Attention Span 262 | 263 | - 介绍:将输入序列分为长度相似的模块,并在每个部分中运行自注意力机制,这样能保证每个部分的注意力成本不变,激活次数就能根据输入长度线性缩放。 264 | 265 | #### 4.2.2 Local Attention Span 266 | 267 | 采用跨步卷积(strided convolution),减少注意力矩阵的大小、以及注意力的计算量,减少的量取决于跨步的步幅。 268 | 269 | #### 4.2.3 Computation and Memory Complexity 270 | 271 | - 时间复杂度:$O(n.n/k)$ 272 | - 空间复杂度:$O(n.n/k)$ 273 | 274 | > 对于 b 的块大小,self-attention 的计算区域存储成本为每个块 $O(b^2)$,并且给定 n/b 个块,则局部注意的计算和存储成本为 O(b.n)。对于内存压缩的注意力,应用具有内核大小和k的跨度的卷积,注意力机制的计算和内存成本降低到 $O(n.n/k)$。 275 | 276 | ### 4.3 Image Transformer [5] 277 | 278 | #### 4.3.1 Localized Attention Span 279 | 280 | ![](img/微信截图_20210416084725.png) 281 | 282 | 受卷积神经网络启发的Transformer变种,重点是局部注意范围,即将接受域限制为局部领域,主要有两种方案:一维局部注意和二维局部注意。 283 | 284 | #### 4.3.2 Computational and Memory Complexity 285 | 286 | - 时间复杂度:$O(n.m)$ 287 | - 空间复杂度:$O(n.m)$ 288 | 289 | > 在Image Transformer中,注意矩阵的形状为 $l_q × m$,其中查询块的选定长度和存储块的长度错误(实际上为 $l_q + l_m$)。考虑到存储块不重叠,我们必须计算 $n×l_q$ attention 矩阵。 290 | 291 | ### 4.4 Set Transformer [6] 292 | 293 | #### 4.4.1 应用场景 294 | 295 | 输入是一组特征,输出是这组特征的函数 296 | 297 | #### 4.4.2 Diagrams of our attention-based set operations 298 | 299 | ![](img/微信截图_20210416085747.png) 300 | 301 | ![](img/微信截图_20210416085959.png) 302 | 303 | ![](img/微信截图_20210416090045.png) 304 | 305 | #### 4.4.3 Computational and Memory Complexity 306 | 307 | 利用了稀疏高斯过程,将输入集大小的注意复杂度从二次降为线性。 308 | 309 | ### 4.5 Sparse Transformer 310 | 311 | #### 4.5.1 介绍 312 | 313 | 这个模型的关键思想,在于仅在一小部分稀疏的数据对上计算注意力,以将密集注意力矩阵简化为稀疏版本。 314 | 315 | ![](img/微信截图_20210416090444.png) 316 | 317 | #### 4.5.2 Attention 318 | 319 | - Local Attention Heads 320 | 321 | ![](img/微信截图_20210416090637.png) 322 | 323 | - Strided Attention Heads 324 | 325 | ![](img/微信截图_20210416090713.png) 326 | 327 | ![](img/微信截图_20210416090729.png) 328 | 329 | #### 4.5.3 Computational and Memory Complexity 330 | 331 | 自注意力机制的修改不会改变模型的参数成本,因为模型仍然保留了原始Transformer模型的Q,K,V变换。注意层的内存复杂度从 $O(n^2)$ 降低到 $O(nlogn)$ 332 | 333 | #### 4.5.4 局限性 334 | 335 | 不过这个模型对硬件有所要求,需要自定义GPU内核,且无法直接在TPU等其他硬件上使用。 336 | 337 | ### 4.6 Axial Transformer 338 | 339 | #### 4.6.1 介绍 340 | 341 | Axial Transformer 主要沿输入张量的单轴施加多个注意力,每个注意力都沿特定轴混合信息,从而使沿其他轴的信息保持独立。 342 | 343 | ![](img/微信截图_20210422080707.png) 344 | 345 | Axial Transformer 提供了 encoder-decoder 架构。对于 decoding ,为了能够实现 casual mask ,Axial Transformer 将 axial attentions 与 shift operations 相结合。例如,对于二维张量的模型,以栅格顺序生成像素,然后首先通过 unmasked 的行和 unmasked 的列 attention 对所有像素进行编码。然后,对于每一行,模型都会应用 unmasked 的行和 masked 的列,以集成先前采样的行。最后,模型将编码表示形式上移,以确保条件信息满足因果关系,并运行 masked 的行注意以对图像中的新行进行采样 346 | 347 | #### 4.6.2 Computational and Memory Complexity 348 | 349 | 由于任何单轴的长度通常都比元素总数小得多,因此这个模型可以显著地节省计算和内存 350 | 351 | ### 4.7 Longformer 352 | 353 | #### 4.7.1 介绍 354 | 355 | Sparse Transformer的变体,通过在注意力模式中留有空隙、增加感受野来实现更好的远程覆盖。 356 | 357 | 在分类任务上,Longformer采用可以访问所有输入序列的全局token(例如CLS token)。 358 | 359 | #### 4.7.2 Computational and Memory Complexity 360 | 361 | O(n^2) -> O(nk) 362 | 363 | > 注:k 为窗口大小 364 | 365 | ### 4.8 Extended Transformer Construction (ETC)(2020)【9】 366 | 367 | #### 4.8.1 介绍 368 | 369 | ETC 是Sparse Transformer的变体,引入了一种新的全局本地注意力机制,在引入全局token方面与Longformer相似。 这种新的关注机制有四个组成部分,即(1) global-to-global (g2g), global-to-local (g2l), local-to-global (l2g) and local-to-local (l2l); 370 | 371 | #### 4.8.2 Computational and Memory Complexity 372 | 373 | - 空间复杂度: 374 | 375 | ![](img/微信截图_20210422081746.png) 376 | 377 | #### 4.8.3 局限性 378 | 379 | 但由于无法计算因果掩码,ETC不能用于自动回归解码。 380 | 381 | ### 4.9 BigBird(2020) 382 | 383 | #### 4.9.1 介绍 384 | 385 | 与Longformer一样,同样使用全局内存,但不同的是,它有独特的“内部变压器构造(ITC)”,即全局内存已扩展为在sequence中包含token,而不是简单的参数化内存。 386 | 387 | The Big Bird model com-prises of several key components, namely (1) global tokens, (2) random attention (queriesattend to random keys) and (3) fixed patterns (local sliding windows) 388 | 389 | #### 4.9.2 Computational and Memory Complexity 390 | 391 | - 空间复杂度:O(n) 392 | 393 | #### 4.9.3 局限性 394 | 395 | 与ETC一样,BigBird同样不能用于自动回归解码。 396 | 397 | ### 4.10 Routing Transformer 398 | 399 | #### 4.10.1 介绍 400 | 401 | Routing Transformer 提出了一种基于聚类的注意力机制,以数据驱动的方式学习注意力稀疏。为了确保集群中的token数量相似,模型会初始化聚类,计算每个token相对于聚类质心的距离。 402 | 403 | 利用 Q 和 K 计算 routing matrix R 404 | 405 | ![](img/微信截图_20210422083332.png) 406 | 407 | > 注:$W_R$ is a d×d orthonormal projection matrix 408 | 409 | #### 4.10.2 Computational and Memory Complexity 410 | 411 | - 空间复杂度:O(nlogn) 412 | 413 | ### 4.11 Reformer(2020) 414 | 415 | #### 4.11.1 介绍 416 | 417 | 一个基于局部敏感哈希(LSH)的注意力模型,引入了可逆的Transformer层,有助于进一步减少内存占用量。 418 | 419 | 模型的关键思想,是附近的向量应获得相似的哈希值,而远距离的向量则不应获得相似的哈希值,因此被称为“局部敏感”。 420 | 421 | #### 4.11.2 Computational and Memory Complexity 422 | 423 | - 空间复杂度:O(nlogn) 424 | 425 | ### 4.12 Sinkhorn Transformers 426 | 427 | #### 4.12.1 介绍 428 | 429 | Sinkhorn Transformers 属于 learned patterns, 是分块模型,以分块的方式对输入键和值进行重新排序,并应用基于块的局部注意力机制来学习稀疏模式。 430 | 431 | ![](img/微信截图_20210422083957.png) 432 | 433 | #### 4.12.2 Computational and Memory Complexity 434 | 435 | - 空间复杂度:O(b^2) 436 | 437 | ### 4.13 Linformer 438 | 439 | #### 4.13.1 介绍 440 | 441 | Linformer 是基于低秩的自注意力机制的高效Transformer模型,主要在长度维度上进行低秩投影,在单次转换中按维度混合序列信息。 442 | 443 | #### 4.13.2 Computational and Memory Complexity 444 | 445 | - 空间复杂度:O(n) 446 | 447 | ### 4.14 Linear Transformer 448 | 449 | #### 4.14.1 介绍 450 | 451 | Linear Transformer 通过使用 kernel-based formulation of self-attention 、和 the associative property of matrix products ,将自注意力的复杂性从二次降低为线性。 452 | 453 | 目前,它已经被证明可以在基本保持预测性能的情况下,将推理速度提高多达三个数量级。 454 | 455 | #### 4.14.2 Computational and Memory Complexity 456 | 457 | - 时间复杂度:O(Ncd) 458 | - 空间复杂度:O(N * d^2) 459 | 460 | ### 4.15 Performer(2020) 461 | 462 | #### 4.15.1 介绍 463 | 464 | Performer(2020) 利用正交随机特征(ORF),采用近似的方法避免存储和计算注意力矩阵。 465 | 466 | #### 4.15.2 Computational and Memory Complexity 467 | 468 | - 空间复杂度:O(Md + Nd + MN) 469 | 470 | ### 4.16 Synthesizer models(2020) 471 | 472 | #### 4.16.1 介绍 473 | 474 | Synthesizer models(2020) 研究了调节在自注意力机制中的作用,它合成了一个自注意力模块,近似了这个注意权重。 475 | 476 | #### 4.16.2 Computational and Memory Complexity 477 | 478 | - 空间复杂度: 479 | 480 | ### 4.17 Transformer-XL(2020) 481 | 482 | #### 4.17.1 介绍 483 | 484 | 为了解决长距离依赖,Transformer-XL 提出了 segment-level recurrence mechanism, 即引入一个 memory 状态。 485 | 486 | 在训练过程中,每个片段的表示为最后的隐层状态​,​表示片段的序号,​表示片段的长度,​表示隐层维度。 487 | 488 | 在计算​片段的表示时,用memory缓存​片段​层的隐层状态​,用来更新​,这样就给下一个片段同了上文,长距离依赖也通过memory保存了下来。并且,最大可能的依赖长度线性增长,达到 $N*L$ 。 489 | 490 | ![](img/2b.webp) 491 | 492 | #### 4.17.2 Computational and Memory Complexity 493 | 494 | - 空间复杂度: 495 | 496 | ### 4.18 Compressive Transformers 497 | 498 | #### 4.18.1 介绍 499 | 500 | 这个模型是Transformer-XL的扩展,但不同于Transformer-XL,后者在跨段移动时会丢弃过去的激活,而它的关键思想则是保持对过去段激活的细粒度记忆。 501 | 502 | #### 4.18.2 Computational and Memory Complexity 503 | 504 | - 空间复杂度: 505 | 506 | ## 五、总结 507 | 508 | 在本文中,我们调查了有关高效 Transformers 模型 的文献,特别是关于 Self-attention 模块的二次复杂度的文献。我们提供了这些新模型类别中使用的核心技术的分类法和高级抽象。我们基于技术对现有模型进行了表征,并提供了一些高效 Transformer 模型的全面介绍。最后,我们讨论了这些模型的评估环境以及这些模型的设计趋势。最后,我们简要讨论了其他可能会总体上提高Transformer模型效率的并行正交工作。 509 | 510 | 511 | ## 参考 512 | 513 | 1. [Efficient Transformers: A Survey](https://www.jianshu.com/p/1b552f1888dc) 514 | 2. [Google团队发布,一文概览Transformer模型的17大高效变种](https://mp.weixin.qq.com/s/El0EFjVd9Kk94U5dC6sV6g) 515 | 3. [Transformers大家族——Efficient Transformers: A Survey](https://zhuanlan.zhihu.com/p/263031249) 516 | 4. [Generating Wikipedia by Summarizing Long Sequences](https://arxiv.org/abs/1801.10198) 517 | 5. [mage transformer](https://arxiv.org/abs/1802.05751) 518 | 6. [Set transformer: A framework for attention-based permutation-invariant neural networks](https://arxiv.org/abs/1810.00825) 519 | 7. [enerating long sequenceswith sparse transformers](https://arxiv.org/abs/1904.10509) 520 | 8. [最新Transformer模型大盘点,NLP学习必备,Google AI研究员出品丨资源](https://jishuin.proginn.com/p/763bfbd2d58d) 521 | 9. [Etc: Encoding long and structured data in transformers](https://arxiv.org/abs/2004.08483) 522 | 10. [Efficient content-based sparse attention with routing transformers.](https://arxiv.org/abs/2003.05997?url=girls.copypasteads.com) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 【关于 NLP】 那些你不知道的事——Transformer 篇 2 | 3 | > 作者:杨夕 4 | > 5 | > 介绍:研读顶会论文,复现论文相关代码 6 | > 7 | > NLP 百面百搭 地址:https://github.com/km1994/NLP-Interview-Notes 8 | > 9 | > **[手机版NLP百面百搭](https://mp.weixin.qq.com/s?__biz=MzAxMTU5Njg4NQ==&mid=100005719&idx=3&sn=5d8e62993e5ecd4582703684c0d12e44&chksm=1bbff26d2cc87b7bf2504a8a4cafc60919d722b6e9acbcee81a626924d80f53a49301df9bd97&scene=18#wechat_redirect)** 10 | > 11 | > 推荐系统 百面百搭 地址:https://github.com/km1994/RES-Interview-Notes 12 | > 13 | > **[手机版推荐系统百面百搭](https://mp.weixin.qq.com/s/b_KBT6rUw09cLGRHV_EUtw)** 14 | > 15 | > 搜索引擎 百面百搭 地址:https://github.com/km1994/search-engine-Interview-Notes 【编写ing】 16 | > 17 | > NLP论文学习笔记:https://github.com/km1994/nlp_paper_study 18 | > 19 | > 推荐系统论文学习笔记:https://github.com/km1994/RS_paper_study 20 | > 21 | > GCN 论文学习笔记:https://github.com/km1994/GCN_study 22 | > 23 | > **推广搜 军火库**:https://github.com/km1994/recommendation_advertisement_search 24 | ![](other_study/resource/pic/微信截图_20210301212242.png) 25 | 26 | > 手机版笔记,可以关注公众号 **【关于NLP那些你不知道的事】** 获取,并加入 【NLP && 推荐学习群】一起学习!!! 27 | 28 | > 注:github 网页版 看起来不舒服,可以看 **[手机版NLP论文学习笔记](https://mp.weixin.qq.com/s?__biz=MzAxMTU5Njg4NQ==&mid=100005719&idx=1&sn=14d34d70a7e7cbf9700f804cca5be2d0&chksm=1bbff26d2cc87b7b9d2ed12c8d280cd737e270cd82c8850f7ca2ee44ec8883873ff5e9904e7e&scene=18#wechat_redirect)** 29 | 30 | - [【关于 NLP】 那些你不知道的事——Transformer 篇](#关于-nlp-那些你不知道的事transformer-篇) 31 | - [【关于 transformer 】 那些的你不知道的事](#关于-transformer--那些的你不知道的事) 32 | - [transformer 篇](#transformer-篇) 33 | - [transformer 改进篇](#transformer-改进篇) 34 | - [transformer 长文本改进篇](#transformer-长文本改进篇) 35 | - [transformer 变体综述篇](#transformer-变体综述篇) 36 | - [参考资料](#参考资料) 37 | 38 | 39 | ## 【关于 transformer 】 那些的你不知道的事 40 | 41 | ### transformer 篇 42 | 43 | - [【关于Transformer】 那些的你不知道的事](https://github.com/km1994/nlp_paper_study_transformer/tree/master/DL_algorithm/transformer_study/Transformer/) 44 | 1. 为什么要有 Transformer? 45 | 2. Transformer 作用是什么? 46 | 3. Transformer 整体结构怎么样? 47 | 4. Transformer-encoder 结构怎么样? 48 | 5. Transformer-decoder 结构怎么样? 49 | 6. 传统 attention 是什么? 50 | 7. self-attention 长怎么样? 51 | 8. self-attention 如何解决长距离依赖问题? 52 | 9. self-attention 如何并行化? 53 | 10. multi-head attention 怎么解? 54 | 11. 为什么要 加入 position embedding ? 55 | 12. 为什么要 加入 残差模块? 56 | 13. Layer normalization。Normalization 是什么? 57 | 14. 什么是 Mask? 58 | 15. Transformer 存在问题? 59 | 16. Transformer 怎么 Coding? 60 | 61 | ### transformer 改进篇 62 | 63 | - [【关于 SHA_RNN】 那些的你不知道的事](https://github.com/km1994/nlp_paper_study_transformer/tree/master/DL_algorithm/transformer_study/SHA_RNN_study/) 64 | - 论文名称:Single Headed Attention RNN: Stop Thinking With Your Head 单头注意力 RNN: 停止用你的头脑思考 65 | - [【关于 Universal Transformers】 那些你不知道的事](https://github.com/km1994/nlp_paper_study_transformer/tree/master/DL_algorithm/transformer_study/T4_Universal_Transformers/) 66 | - [【关于Style_Transformer】 那些你不知道的事](https://github.com/km1994/nlp_paper_study_transformer/tree/master/DL_algorithm/transformer_study/Style_Transformer/LCNQA/) 67 | 68 | ### transformer 长文本改进篇 69 | 70 | - [【关于 Longformer】 那些的你不知道的事](https://github.com/km1994/nlp_paper_study_transformer/tree/master/DL_algorithm/transformer_study/naacl2021_longformer/) 71 | - 论文:Longformer: The Long-Document Transformer 72 | - 发表会议:naacl2021 73 | - 论文地址:https://arxiv.org/abs/2004.05150 74 | - github:https://github.com/allenai/longformer 75 | - 动机: 76 | - 基于传统Transformer的模型,因为 每一个token都要与其他所有token进行交互,其**self-attention的点积计算量都是 O(n^2)** ,(其中 n 为输入序列长度),因此对于长序列的处理存在内存瓶颈(self-attention的计算可以并行化,所以时间复杂度仍然是 O(n) )。这也是传统Transformer模型把输入长度限制在512个token以内的原因之一。 77 | - 在面对超过长度限制的长文档时,往往需要**进行切片、截断或者抽取重要片段等处理**,这种做法 导致不同的text span之间无法进行交互,因而必然存在大量information loss,**既繁琐又破坏了原始文本的完整性**。 78 | - 通过添加一些其他机制来加强这种text span之间的交互。但这种新增机制实现起来通常比较复杂,而且往往是task-specific的,通用性不强 79 | - 论文方法 80 | - 对于每一个token,**只对固定窗口大小的附近token计算local attention**,并结合具体任务,**计算少量的global attention**。该方法的优点包括: 81 | - 复杂度低,将attention机制的复杂度降至 O(n) 82 | - 通用性强,可用于各类文档级任务 83 | - 部署容易,作者在cuda内核上直接实现了Longformer的attention pattern,并提供了开源代码。 84 | 85 | - [【关于 Transformer-XL】 那些的你不知道的事](https://github.com/km1994/nlp_paper_study_transformer/tree/master/DL_algorithm/transformer_study/T3_Transformer_XL/) 86 | - 动机 87 | - RNN:主要面临梯度消失或爆炸(gradient vanishing and explosion),解决方法集中在优化方法、初始化策略、辅助记忆单元的研究上。 88 | - vanilla Transformer:最长建模长度是固定的,无法捕捉更长依赖关系;等长输入序列的获取通常没有遵循句子或语义边界(出于高效考虑,往往就是将文本按长度一段段截取,而没有采用padding机制),可能造成上下文碎片化(context fragmentation)。 89 | - 方法 90 | - 引入循环机制(Reccurrence,让上一segment的隐含状态可以传递到下一个segment):将循环(recurrence)概念引入了深度自注意力网络。不再从头计算每个新segment的隐藏状态,而是复用从之前segments中获得的隐藏状态。被复用的隐藏状态视为当前segment的memory,而当前的segment为segments之间建立了循环连接(recurrent connection)。因此,超长依赖性建模成为了可能,因为信息可以通过循环连接来传播。 91 | - 提出一种新的相对位置编码方法,避免绝对位置编码在循环机制下的时序错乱:从之前的segment传递信息也可以解决上下文碎片化的问题。更重要的是,本文展示了使用相对位置而不是用绝对位置进行编码的必要性,这样做可以在不造成时间混乱(temporal confusion)的情况下,实现状态的复用。因此,作为额外的技术贡献,文本引入了简单但有效的相对位置编码公式,它可以泛化至比在训练过程中观察到的长度更长的注意力长度。 92 | - [【关于 Linformer 】 那些你不知道的事](https://github.com/km1994/nlp_paper_study_transformer/tree/master/DL_algorithm/transformer_study/ACL2020_Linformer) 93 | - 论文标题:《Linformer: Self-Attention with Linear Complexity》 94 | - 来源:ACL 2020 95 | - 链接:https://arxiv.org/abs/2006.04768 96 | - 参考:https://zhuanlan.zhihu.com/p/149890569 97 | - [【关于 Performer 】 那些你不知道的事](https://github.com/km1994/nlp_paper_study_transformer/tree/master/DL_algorithm/transformer_study/Performer) **【推荐阅读】** 98 | - 阅读理由:Transformer 作者 Krzysztof Choromanski 针对 Transformer 问题的重新思考与改进 99 | - 动机:Transformer 有着巨大的内存和算力需求,因为它构造了一个注意力矩阵,需求与输入呈平方关系; 100 | - 思路:使用一个高效的(线性)广义注意力框架(generalized attention framework),允许基于不同相似性度量(核)的一类广泛的注意力机制。 101 | - 优点:该方法在保持线性空间和时间复杂度的同时准确率也很有保证,也可以应用到独立的 softmax 运算。此外,该方法还可以和可逆层等其他技术进行互操作。 102 | - [ A Survey on Long Text Modeling with Transformers](https://github.com/km1994/nlp_paper_study_transformer/tree/master/DL_algorithm/transformer_study/Survey_on_Long_Text_Modeling_with_Transformers) 103 | - 论文名称:A Survey on Long Text Modeling with Transformers 104 | - 论文地址:https://arxiv.org/abs/2302.14502 105 | 106 | ### transformer 变体综述篇 107 | 108 | - [【关于 Efficient Transformers: A Survey】 那些你不知道的事](https://github.com/km1994/nlp_paper_study_transformer/tree/master/DL_algorithm/transformer_survey/Performer) 109 | - 一、摘要 110 | - 二、Transformer 介绍 111 | - 三、Efficient Transformers 112 | - 3.1 Fixed patterns(FP) 113 | - 3.1.1 Fixed patterns(FP) 介绍 114 | - 3.1.2 Fixed patterns(FP) 类别 115 | - 3.2 Combination of Patterns (CP) 116 | - 3.2.1 Combination of Patterns (CP) 介绍 117 | - 3.2.2 Combination of Patterns (CP) 类别 118 | - 3.2.3 Fixed patterns(FP) vs 多Combination of Patterns (CP) 119 | - 3.3 Learnable Patterns (LP) 120 | - 3.3.1 Learnable Patterns (LP) 介绍 121 | - 3.3.2 Learnable Patterns (LP) 类别 122 | - 3.3.3 Learnable Patterns (LP) 优点 123 | - 3.4 Memory 124 | - 3.4.1 Memory 介绍 125 | - 3.4.2 Memory 类别 126 | - 3.5 Low-Rank 方法 127 | - 3.5.1 Low-Rank 方法 介绍 128 | - 3.5.2 Low-Rank 方法 类别 129 | - 3.6 Kernels 方法 130 | - 3.6.1 Kernels 方法 介绍 131 | - 3.6.2 Kernels 方法 代表 132 | - 3.7 Recurrence 方法 133 | - 3.7.1 Recurrence 方法 介绍 134 | - 3.7.2 Kernels 方法 代表 135 | - 四、Transformer 变体 介绍 136 | - 4.1 引言 137 | - 4.2 Memory Compressed Transformer 138 | - 4.3 Image Transformer 139 | - 4.4 Set Transformer 140 | - 4.5 Sparse Transformer 141 | - 4.6 Axial Transformer 142 | - 4.7 Longformer 143 | - 4.8 Extended Transformer Construction (ETC)(2020) 144 | - 4.9 BigBird(2020) 145 | - 4.10 Routing Transformer 146 | - 4.11 Reformer(2020) 147 | - 4.12 Sinkhorn Transformers 148 | - 4.13 Linformer 149 | - 4.14 Linear Transformer 150 | - 4.15 Performer(2020) 151 | - 4.16 Synthesizer models(2020) 152 | - 4.17 Transformer-XL(2020) 153 | - 4.18 Compressive Transformers 154 | - 五、总结 155 | 156 | ## 参考资料 157 | 158 | 1. [【ACL2020放榜!】事件抽取、关系抽取、NER、Few-Shot 相关论文整理](https://www.pianshen.com/article/14251297031/) 159 | 2. [第58届国际计算语言学协会会议(ACL 2020)有哪些值得关注的论文?](https://www.zhihu.com/question/385259014) 160 | --------------------------------------------------------------------------------