❝作者:小莫
来自:阿泽的学习笔记
❞
本博客 主要 是本人在学习 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 理论源码细节详解】;
理论+实践,干活永不累!
由于微信平台算法改版,公号内容将不再以时间排序展示,如果大家想第一时间看到我们的推送,强烈建议星标我们和给我们多点点【在看】。星标具体步骤为:
(1)点击页面最上方“深度学习自然语言处理”,进入公众号主页。
(2)点击右上角的小点点,在弹出页面点击“设为星标”,就可以啦。
感谢支持,比心。
投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。
方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。
记得备注呦
推荐两个专辑给大家:
专辑 | 李宏毅人类语言处理2020笔记
整理不易,还望给个在看!