浅析Transformer训练时并行问题

浅析Transformer训练时并行问题 - 知乎 (zhihu.com)

上面这个链接配合下面这段话来理解

作者:匿名用户
链接:https://www.zhihu.com/question/307197229/answer/1574219664
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

我是初学者,我不知道我说的对不对,所以先匿了。

以我个人的浅薄见解,Transformer的并行化是指在训练阶段的并行化,测试阶段只有encoder可以并行化,decoder不能并行化。

首先我们不考虑batch的问题,假设我们是输入一个时间序列Xi,表示i时刻X的值(或者你可以理解为输入了一串单词,Xi表示第i个单词)。训练的时候进入模型的是所有的训练集Xi同时进入,而不是X0,X1,X2一个个依次序进入。所以transformer可以同时对这批数据进行处理(各种矩阵运算),也就可以并行化。而RNN之所以不能并行化,是因为虽然X0,X1,X2你都知道了,但是由于你计算的时候不止要输入X还要输入上一时刻的依赖ht-1,那么你就不得不一个个的按顺序去计算X0得出的h0,又用h0和X1得出的h1,。。。而你无法和transformer一样直接把这批数据([X0,X1,X2,...])当作一个完整矩阵同时处理,而需要一条一条的处理。

另外,在decoder阶段可能Transformer在代码层面上可能会有点小不同。在pytorch里面,一般我们(应该来说是我一个人)习惯于train阶段和eval阶段都直接forward()函数接收参数进行运算,也就是说训练时候的函数应该和评估阶段的函数一样都直接用forward()函数,但是根据我看的别人的代码,他们基本只是在forward()函数里面写训练阶段的代码,评估阶段他们会使用另一个自定义的函数。按道理来说decoder阶段无论训练还是评估都是需要使用到上一时间步的decoder结果,所以也应该采用一个时间步一个时间步的循环输入。但别人写的代码都是,训练阶段已知target(目标结果)的矩阵,那么在经过mask之后,就可以直接将整个矩阵输入,进行处理,个人理解这里就避免了时间依赖,方便了并行化处理。这样可以只在评估阶段采用一个时间步一个时间步的顺序decoder,而在训练阶段就可以都采用直接输入整个矩阵的方式避免了时间依赖。这些是我个人见解。

10.Transformer如何并行化的?关于Transformer的若干问题整理记录 - 知乎 (zhihu.com)

Transformer的并行化我认为主要体现在self-attention模块,在Encoder端Transformer可以并行处理整个序列,并得到整个输入序列经过Encoder端的输出,在self-attention模块,对于某个序列x1,x2,...,xn,self-attention模块可以直接计算​ xi.xj的点乘结果,而RNN系列的模型就必须按照顺序从  x1计算到  xn

 

这个图就描述得比较好,你若是放在rnn里面训练,那就是输入了11得等过了一个神经元再输入12,这样训练速度很慢 

 摘自以下链接

(165条消息) Transformer decoder中masked attention的理解_寺里LZS的博客-CSDN博客

细节讲解Transformer一些不同的角度,和烂大街的知乎文不太一样

(167条消息) 【深度学习】NLP之Transformer (1) Encoder_littlemichelle的博客-CSDN博客_encoder nlp (167条消息) 【深度学习】NLP之Transformer (2) Decoder_littlemichelle的博客-CSDN博客

细节讲解Transformer一些不同的角度,和烂大街的知乎文不太一样

(166条消息) 多图详解attention和mask。从循环神经网络、transformer到GPT2_神洛华的博客-CSDN博客_attention mask矩阵

顶哥

猜你喜欢

转载自blog.csdn.net/weixin_43332715/article/details/124960314