源码网址:https://github.com/tensorflow/tensor2tensor
https://github.com/tensorflow/tensor2tensor
文章目录
一、RNN特点
1、RNN可以有效处理时序信息
RNN的计算是把序列从左到右一步一步,假设序列是一个句子,就是一个一个词的看,对第t个词,会计算一个输出ht(它的隐藏状态),而这个ht是由前面一个词,也就是第t-1个词的隐藏状态ht-1和第t个词本身决定的,也就是将前面学到的历史信息携带到当下,和当前词做一些计算得到输出,所以RNN可以有效处理时序信息
2、无法并行
正因为时序,一步步运行,所以难以并行。也就是说,在计算ht的时候必须保证ht-1输入完成,如果你有1000个词,必须得算1000步,你就得不辞辛劳不合眼地算上两天两夜,好夸张,开个玩笑,假如说你有个大怨种地朋友是把,你跪求他帮你一起算,一人算500,是不是就只需要算一天一夜了,再假如你有999个小跟班,一人算一步,一下就完成了吧,这叫啥,时间上地并行,哎可惜,RNN就是孤军奋战地那个两天两夜(bushi)。目前主流地GPU、TPU都是成千上万地线程,不用不合适吧,铪蛤。。。。
3、丢掉信息
就还是说啊,你算一个东西算上个1000步,当你算到666时你还记得222时计算地信息吗?可以啊,建立索引表,每次结果记录一下,但是你想想信息得多大。所以,对于RNN来说,当时序过长时,在早期地那些时序信息在后面地时候可能会丢掉,如果不丢掉,那ht就会狠狠狠狠地大,内存开销顶不住啦!!!虽然在这方面也做了很多改进,但是本质上并没有解决太多问题。
二、Transformer
不再使用之前的循环神经层,而是纯基于注意力机制,完全可以做并行,并行度比较高,再短时间内做出比之前更好的结果。
用卷积神经网络对于比较长的序列难以建模,是因为卷积做计算的时候,每次看一个比较小的像素块,如果两个像素相隔比较远,就需要用很多卷积层,才能把这俩线像素融合起来。但,如果使用transformer里面的注意力机制的话呢,一次性就可以看到所有的像素,一层就能把整个序列给你看到。
嗯。。。。。。还说到,卷积比较好的地方是可以做多个输出通道,每个输出通道呢,可以识别不同的模式,也想做这样的多输出通道的效果,所以便有了多头注意力机制(multi-headed attention),多头注意力机制就是来模拟卷积神经网络多输出通道的。其实,意思就是相当于多个空间,也就是w矩阵,将不同空间得到的计算的值融合在一起,提高了效率。
1、自注意力机制
这是一个关键点,但不是他们团队的创新,早在之前已经有工作了。而transformer呢是一个只基于自注意力机制的encoder到decoder的架构模型。
2、模型架构
- 编码器:将一个输入,变成矩阵,就比如说一个句子长为n,每个词都有一个向量表示,然后生成一个长为列为n的矩阵输出。
- 解码器:拿到编码器的输出,生成长为m的序列,这个m和n不一定一样长,就意思有可能一样长有可能不一样长,就比如机器翻译: "我爱你" 翻译为 "l love you"就是一样长的对吧,又如:"我是一个学生"翻译为"i am a student"就不一样长了,能力有限,到此为止吧。。。。。。嘤嘤嘤。
- 解码器与编码器不同:编码器可以看见整个句子,但是解码器只能一个一个生成,我用一下我右手想一下,可能要提到masked?要不是当我没说,,,,,
- 自回归:之前的t-1次输出,作为第t次的输入。在解码器之后讲了自回归,就是说用前面的输出来预测当前输出,例如你在复试的候考室等待复试,你排在第五个,此时你很紧张,压根儿干不了其他事,只能坐在那里猜测里面复试同学的情况,你可以通过前面四位同学的面试时间,结束出场的表情来预测你的复试可能要进行几分钟?难度大不大?例子不是很恰当,爱看不看吧,嘤嘤嘤,,,,,
3、详看模型架构
二话不说,先上图
我们可以看到,左半部分是由输入、位置编码、编码器(多头注意力机制、求和与归一化、前馈神经网络),右边是是编码输出,输出,位置编码,解码器(多了一个编码-解码多头注意力机制,而多头注意力那层多了一个mask)、全连接层、softmax函数
- 输入:把正常的输入转化为矩阵的形式,并将其降维,也就是embedding,例如“我爱你”的序列向量,就是矩阵,就是一个词一个向量组成的序列,加入这句话是一个200w*3的矩阵,太夸张了吼吼吼,此刻是不是相当相当大了!!!!embedding呢其实就是类似于一个3*1w的矩阵,两个相乘,就可以将“我爱你”这句话由200w*3的规模,转化成!!!!!!sorry,写反了哈哈哈哈哈哈哈哈哈,稍等,懒得删了。“我爱你”是一个3*200w的矩阵,embedding是一个200w*6的矩阵,做矩阵乘法之后就会转化为3*6的矩阵,看,是吧,缩小了无敌多吧!!!!!!哈哈哈,不要和我一样,搞错了哦,不然那将是一个恨恨恨恨恨额的灾难!
- 位置彪马(bushi)是位置编码啦:你想想看咱transformer和rnn是不同滴对吧,rnn怎么着?一个一个,那是不是就有了先后顺序,这个词之间的相对位置是不是拿捏的死死的,我爱你不会是你爱我对吧!!!而咱这个transformer嗫,是直接搞一个句子,那么你如何判断词1和词2是什么关系呀?所以此刻,咱就给它加一个位置编码,用来补充词与词之间的位置关系,具体的公式不说了。
- 编码器:
- 多头注意力机制,这个上面有讲过,不懂的话建议先去看自注意力机制,然后多头就是多个空间,这样可以捕捉到更丰富的特征、信息(不同角度观点不同)。
- 求和与归一化:求和也就是ADD,residule block(残差模块),将未经过多有注意力机制的输入与经过多头注意力机制的输出相加;归一化就是layer-normalization(标准化),这就不得不提到BN(Batch Normalization)的缺点(当batch——size较小的时候,效果比较差,它是用局部均值方差代表全部),而LN对一个样本的所有单词做均值方差。解决梯度消失、爆炸的问题。有错的话,希望可以纠正我,我是王小菜,在学习,呜呜呜呜,,,,,,。
- 前馈神经网络:这就不说了哟~
- mask:你想想如果让你预测“我爱”后面的宾语,你肯定应该是不知道的对吧?别较真儿,让你预测哈!假如我们在使用的时候是不是肯定是无法得知这个宾语的,可能是小猫小狗,张三李四王二麻子,那我们如果在训练的时候以一种上帝的视角给了宾语,那再后面回到正常人的时候你如何去获得上帝视角的超能力?别说你会算命!!!!所以说,我们在训练的时候也要把他当作正常人来训练,以提高他的此项技能是不是!所以我们只能把已经输出的位置给到编码器,而不能将未输出的给它,所以会设置一个非常大的负数的权重到这个未输出的位置,当她不存在。
- 全连接层和softmax:将这个解码器输出的浮点型向量转化成一个词。
啊哈?到此为止吧,再讲就不礼貌了!!!
提示:如果还有啥不懂得可以细致看一下我在word2vec里面提到的大佬的文章,大概明白一下这个流程,然后找代码去chatpgt加个注释哈哈哈,再看看跑跑,就这样吧,bye~祝大家坚持学习~yes!!!!!!!!