计算机视觉面试题-Transformer相关问题总结:https://zhuanlan.zhihu.com/p/554814230
计算机视觉面试31题 CV面试考点,精准详尽解析:https://zhuanlan.zhihu.com/p/257883797
1. 循环神经网络(Recurrent Neural Networks, RNN)
RNN的出现是为了解决输入输出没有严格对应关系的问题,该模型的输入和输出长度不需固定。
RNN的框架结构如下,X0, X1, … , Xt是长度相同的输入词向量,A是参数矩阵,h0, h1, … , ht是长度相同的隐藏状态向量。最后一个隐藏状态向量ht就是RNN的最终输出
RNN和人的阅读方式类似,每次读取一个单字或单词向量Xt,然后用状态向量ht存储单词信息,并且该存储是累积式的。比如状态向量h0包含单字“祝”的信息,h1包含“祝你”两个单字的信息,而ht包含“祝你新年快”五个单字信息。模型中的参数模块A只有一个,它是机器学习的关键对象,A通常随机初始化,然后用训练数据学习A。
RNN 长记忆为什么会丢失?
RNN 用于信息传输通路只有一条,并且该通路上的计算包含多次非线性激活操作。众所周知,长记忆丢失
的罪魁祸首是梯度消失
,而梯度消失的主谋就是多层激活函数的嵌套
,导致梯度反传时越乘越小
(激活函数的导数<=1
),如
0.
9
100
=
0.000026
0.9^{100}=0.000026
0.9100=0.000026 。所以后面的梯度传递不到前方,无法建立长时依赖,导致只能应对短序列,面对长序列存在记忆丢失(梯度传不过去)。
2. 长短期记忆网络(Long Short Trem Memory, LSTM)
LSTM 为了解决 RNN 的长记忆丢失问题而提出。
LSTM 如何解决该问题?
LSTM 引入了两条计算通道
( C 和 h ) 用于信息传输
,其中 C 通道上的计算相对简单,较多的是矩阵的线性转换,C 通道没有太多的非线性激活操作
。梯度反传时可以在 C 通道上平稳的传输到前方,从而建立长时依赖。所以 C 通道主要用于建立长时依赖
,h 通道用于建立短时依赖
。
用 Ct 表示神经元在 t 时刻过后的“记忆”,这个向量涵盖了在 t+1 时刻前神经网络对于所有输入信息的“概括总结”
门 :控制信息通过与否的结构,组成:sigmoid输出01向量,0表示不允许信息通过,1表示允许信息通过。LSTM包含遗忘门、记忆门、输出门
,这3个门。
遗忘门:决定从cell状态Ct-1中,丢弃哪些信息,输入Ht-1和xt,输出0-1的值。通过这种方式,LSTM可以长期记忆重要信息,并且记忆可以随着输入进行动态调整
记忆门:决定是否将在 t 时刻(现在)的数据xt存储入单元状态中Ct-1的控制单位。首先,用tanh函数层将现在的向量中的有效信息提取出来,然后使用左侧的sigmoid函数来控制这些记忆要放“多少”进入单元状态。
输出门:用于计算当前时刻的输出值的神经层。输出层会先将当前输入值与上一时刻输出值整合后的向量,用sigmoid函数提取其中的信息,接着,会将当前的单元状态Ct-1通过tanh函数压缩映射到区间(-1, 1)中,将经过tanh函数处理后的单元状态与sigmoid函数处理后的,整合后的向量点对点的乘起来就可以得到LSTM在 t 时刻的输出了!
LSTM 真的解决长记忆丢失问题了吗?
答案是否定的。在序列长度达到300+
的场景中,LSTM 仍然会出现长记忆丢失问题(梯度消失)。严格来说,引入的 C(cell) 通道只是缓解了梯度消失
,并没有从根本上解决该问题(注意力机制从根本上解决了该问题
,后面会介绍),因为lstm仍然是一个非常深的网络,对于反向传播仍然不利,同时LSTM是不可迁移学习
的。
LSTM 沿用了 RNN 的所有优势,采用顺序输入
的方式将序列位置信息融入
建模之中。该方式比较 make sense,因为从前往后依次进行,更符合人对序列的理解方式。但是顺序输入也严重影响了模型的并行性
,后一个词的计算依赖于前一个词计算得到的结果,所以必须依次进行,导致了此类模型训练复杂度高
的问题。
3. Tramsformer
Transformer 最有价值的就是其满身的自注意力机制
。注意力机制更接近于人对序列的理解方式,而且可以彻底解决长记忆丢失问题。
注意力机制的思考方式?
做不同任务时赋予序列中 token 不同的权重,比如在对 “我喜欢你” 这句话做情感分类时,关注点肯定放在 “喜欢” 上,而不是泛指的人称代词。注意力机制就是在学习的过程中自适应的给予每个词对应的权重,自适应的学习应该关注的重点位置,人的思考方式亦是如此。
彻底解决长记忆丢失问题?
不同于 LSTM,Transformer 引入的自注意力机制从根本上解决了长记忆丢失问题。注意力机制会以遍历的方式计算序列中任意两个词之间的相关性,所以不管两个词相隔多远,都能捕捉到之间的依赖关系,从根本上解决难以建立长时依赖的问题
。但是注意力机制的计算复杂度较大,通常为O(n^2),n 序列长度,提升模型表达能力的同时,也引入了较高的训练复杂度,所以此类模型通常都比较笨重。Transformer 摒弃了顺序输入的方式,一次性输入一个序列的所有词进行计算。这给模型带来了很好的可并行性,可批量的对多个序列进行计算
。
但却丢失了对序列中词的相对位置的建模,对于语言来说,位于一维空间的序列,词的相对位置是比较重要的信息。如果不考虑词的位置信息,就会导致打乱输入序列中词的位置,不会影响到输出结果。但事实是: 我喜欢你≠你喜欢我 (舔狗的悲哀)
所以为了考虑词的位置信息,Transformer 采用函数式绝对位置编码方式
,使用三角函数为每个词计算一个唯一的位置向量表示,然后加到对应的词向量上。第一次看到时不由得惊叹这是什么操作?这也能 work? 感觉这种考虑位置信息的方式只是权宜之计。后来又有参数式绝对位置(BERT)、函数式相对位置(NEZHA)的编码方式,说不上孰好孰坏。
LSTM 与 Transformer 的对比:
- 位置编码方式: LSTM 以顺序输入的方式考虑位置信息,Transformer 采用函数式绝对位置编码的方式,个人觉得顺序输入的方式更合理一些。
- 模型表达能力: Transformer 采用多层注意力叠加的方式展现了强大的学习能力,其实单层的 Transformer Encoder 表达能力比较有限,有些场景比不上单层的 LSTM。模型蒸馏得到的双层Bi-LSTM可以达到类似的效果,说明 LSTM 的表达能力并不弱。
- 并行能力: Transformer 的并行能力远远优于 LSTM,所以适合训练多层叠加的模型,多层的LSTM 复杂度难以承受,没有强大的算力别来沾边。
CNN,RNN,LSTM,Transformer之间的优缺点
CNN概念:
传统意义上的多层神经网络是只有输入层、隐藏层、输出层,其中隐藏层的层数按需决定。而卷积神经网络CNN,在传统的多层神经网络基础上,全连接层前面加入了部分连接的卷积层、激活层和池化层操作,使得实际应用场景中能够构建更加深层、功能更强大的网络。
CNN优点:
CNN主要用于识别位移、缩放及其它扭曲不变性
的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以能够避免显示的特征抽取,隐式地从训练数据中进行学习。另外,CNN局部权重共享的结构可以使得网络并行学习,较好的处理高维数据,更接近于实际的生物神经网络,
CNN缺点:
(1)当网络层数太深时,采用反向传播调整内部参数会使得接近于输入层的变化较慢;
(2)采用梯度下降进行迭代时很容易使得训练结果收敛于局部最优而非全局最优;
(3)池化层会丢失一定的有价值信息,忽略了局部与整体之间的关联性;
(4)特征提取的物理含义不是十分明确,导致可解释性一般。
RNN优点:
传统网络无法结合上下文去训练模型,导致对于序列特性数据场景的处理效果不佳,而RNN结构决定了其具有了短期记忆性,每一时刻隐藏层信息不仅由该时刻的输入层决定,还可以由上一时刻的隐藏层决定,做到挖掘数据张红的时序信息以及语义信息。
RNN缺点:
随着网络层数增加,RNN在长序列场景处理时会出现梯度消失或梯度爆炸的弊端(反向传播算法局限性导致)。
LSTM优点:
LSTM通过引入包含了遗忘门、输入门、输出门的cell状态的结构改善了RNN中存在的长期依赖问题,并且其表现通常比时间递归神经网络和隐马尔科夫模型更好,而LSTM本身也可以作为复杂的非线性单元构造更大型深度网络。
LSTM缺点:
梯度问题在LSTM中得到了一定程度的优化解决,但是并没有彻底搞定,在处理N量级的序列有一定效果,但是处理10N或者更长的序列依然会暴露,另外,每一个LSTM的单元节点都意味着有4个全连接层,如果时间序列跨度较大,并且网络较深,会出现计算量大和耗时偏多的问题。
Transformer优点:
(1)突破了RNN模型不能并行计算的限制;
(2)相比CNN,计算两个位置之间的关联所需要的操作次数不会随着距离的增长而增加;
(3)attention机制可以产生更具可解释性的模型,可以从模型中检查attention分布,各个attention head可以学会执行不同的任务。
Transformer缺点:
(1)局部信息的获取不如RNN和CNN强;
(2)位置信息编码存在问题,因为位置编码在语义空间中并不具备词向量的可线性变换,只是相当于人为设计的一种索引,所以并不能很好表征位置信息;
(3)由于transformer模型实际上是由残差模块和层归一化模块组合而成,并且层归一化模块位于两个残差模块之间,导致如果层数较多时连乘计算会使得顶层出现梯度消失问题。