作者:小莫
本博客 主要 是本人在学习 Transformer 时的「所遇、所思、所解」,通过以 「十六连弹」 的方式帮助大家更好的理解 该问题。
为什么要有 Transformer? 首先需要知道在 Transformer 之前都有哪些技术,这些技术所存在的问题:
基于Transformer的架构主要用于建模语言理解任务,它避免了在神经网络中使用递归,而是完全依赖于self-attention机制来绘制输入和输出之间的全局依赖关系。
从上一张 Transformer 结构图,可以知道 Transformer 是一个 encoder-decoder 结构,但是 encoder 和 decoder 又包含什么内容呢?
其中上图中每一层的内部结构如下图所求。
具体内容,后面会逐一介绍。
其中 代表 Source 的长度
具体流程介绍
采用不同的函数或计算方式,对 query 和 key 进行计算,求出相似度或相关性
采用的计算方法:
向量点积:
Cosine 相似度计算:
MLP 网络:
step 1:计算权值系数
step 2: softmax 归一化
step 3: 加权求和
存在问题
步骤
举例
优点
下面,我们将会围绕着几个问题,进行一一解答。
长距离依赖问题 是什么呢?
为什么 CNN 和 RNN 无法解决长距离依赖问题?
RNN 主要 通过 循环 的方式学习(记忆) 之前的信息 ;
问题:但是随着时间 的推移,你会出现「梯度消失或梯度爆炸」问题,这种问题使你只能建立短距离依赖信息。
举例:RNN 的学习模式好比于 人类 的记忆力,人类可能会对 短距离内发生的 事情特别清楚,但是随着时间的推移,人类开始 会对 好久之前所发生的事情变得印象模糊,比如,你对小时候发生的事情,印象模糊一样。
解决方法:针对该问题,后期也提出了很多 RNN 变体,比如 LSTM、 GRU,这些变体 通过引入 门控的机制 来 有选择性 的记忆 一些 重要的信息,但是这种方法 也只能在 一定程度上缓解 长距离依赖问题,但是并不能 从根本上解决问题。
CNN 主要采用 卷积核 的 方式捕获 句子内的局部信息,你可以把他理解为 「基于 n-gram 的局部编码方式」捕获局部信息
问题:因为是 n-gram 的局部编码方式,那么当 距离 大于 时,那么 将难以学习 信息;
举例:其实 n-gram 类似于 人的 视觉范围,人的视觉范围 在每一时刻 只能 捕获 一定 范围内 的信息,比如,你在看前面的时候,你是不可能注意到背后发生了什么,除非你转过身往后看。
CNN:捕获信息的方式:
RNN:捕获信息的方式:
最后,让我们来看一下完整的流程:
换一种表现方式:
注: 表示当前词在句子中的位置; 表示向量中每个值 的 index;在偶数位置:使用 正弦编码 ;在奇数位置:使用 余弦编码 。
动机:因为 transformer 堆叠了 很多层,容易 梯度消失或者梯度爆炸;
原因:数据经过该网络层的作用后,不再是归一化,偏差会越来越大,所以需要将 数据 重新 做归一化处理;
目的:在数据送入激活函数之前进行normalization(归一化)之前,需要将输入的信息利用 normalization 转化成均值为0方差为1的数据,避免因输入数据落在激活函数的饱和区而出现 梯度消失或者梯度爆炸 问题
介绍:
公式
注:在 decoder 的 scaled dot-product attention 中,里面的 attn_mask = padding mask + sequence mask;在 encoder 的 scaled dot-product attention 中,里面的 attn_mask = padding mask。
引言
问题一:不能很好的处理超长输入问题?
处理方式一:截断句子方式(Transformer 处理方式);
处理方式二:将句子划分为 多个 seg (Vanilla Transformer 处理方式);
思路:将文本划分为多个segments;练的时候,对每个segment单独处理;
问题:因为 segments 之间独立训练,所以不同的token之间,最长的依赖关系,就取决于segment的长度 (如图(a));出于效率的考虑,在划分segments的时候,不考虑句子的自然边界,而是根据固定的长度来划分序列,导致分割出来的segments在语义上是不完整的 (如图(a));在预测的时候,会对固定长度的 segment 做计算,一般取最后一个位置的隐向量作为输出。为了充分利用上下文关系,在每做完一次预测之后,就对整个序列向右移动一个位置,再做一次计算,这导致计算效率非常低 (如图(b));
处理方式三:Segment-Level Recurrenc ( Transformer-XL 处理方式);
思路:在对当前segment进行处理的时候,「缓存」并利用上一个segment中所有layer的隐向量序列;上一个segment的所有隐向量序列只参与前向计算,不再进行反向传播;
介绍:Transformer 固定了句子长度;
举例:例如 在 Bert 里面,输入句子的默认长度 为 512;
对于长度长短问题,做了以下处理:短于 512:填充句子方式;长于 512:
解决方法:可以查看 TENER: Adapting Transformer Encoder for Name Entity Recognition 【论文后期会做总结】
问题三:缺少Recurrent Inductive Bias
问题四:Transformer是非图灵完备的:非图灵完备通俗的理解,就是无法解决所有的问题
问题五:transformer缺少conditional computation
问题六:transformer 时间复杂度 和 空间复杂度 过大问题
最后的最后,送上 whalePaper 成员 逸神 的 【Transformer 理论源码细节详解】;
理论+实践,干活永不累!
推荐阅读
征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)
完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)
模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法
文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化
斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用
关于AINLP
AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。
阅读至此了,分享、点赞、在看三选一吧🙏