使用TensorFlow手写Transformer

原创:王稳钺
资料来源:张春阳

由于目前”调包“非常方便,往往让人忽略对于算法的深入理解。本文介绍使用TensorFlow从0实现Transformer,帮助从代码角度理解原理及其中的细节。

1. Self-attention

1.1 Self-attention原理

本文主要介绍代码实现,对于原理部分只做简单介绍。Self-attention主要想要实现的是句子中每一个token和其它token之间的相关性,将其融合起来的语义组成一个新的向量,计算过程如图。首先需要有QUERY和KEYS,在实际实现过程中,最开始就是两组随机的参数的向量。然后进行点乘,点乘后可以得到S值,点乘的过程就是在求相关性的过程。得到S后,经过softmax,得到权重W。之后再引入可学习参数VALUES,刚开始它也是一组随机值。用VALUES与W相乘,最终就可以得到新的向量。通过V1可以得到Y1,单纯使用V1表示时它只有自己的语意信息,而使用Y1时就包括了其与周边向量的关系。

1.2 Self-attention实现

生成矩阵作为输入,用来模拟V1,V2,V3,值是随机写的并没有特殊的含义。为了后续可以传入到模型中,将矩阵转换成tensor。

生成QUERY、KEYS、VALUES参数矩阵,与x点乘后就可以生成QUERY、KEYS、VALUE。它们都是随机的参数,可以自己设定,之后通过深度学习的学习能力来逐渐优化到一些合适的值。生成矩阵后,同样的,也需要转换成tensor。最后进行点乘操作,生成query、key、value。

计算得到S,即attn_score,计算时需要将key转置,利用transpose_b=True实现。再经过softmax,得到权重W。之后,将W与value相乘。

最终求出输出值,也就是新的向量,其中包含着上下文的信息。其实举例中X是随便写的数,它其实代表要转换的向量。实际中,做NLP时,x其实就应该是token对应的向量值。或者如果实现推荐系统的话,x可能就是推荐系统里每一个输入的序列向量的表示。

2. Positional Encoding

2.1 Positional Encoding作用及原理

一些序列模型,需要一步步执行,其中其实就隐藏了一些位置信息。但Transformer不同,它在做转换计算时是将所有输入一起进行计算,速度很快,但失去了位置信息。所以在Transformer中,使用Positional Encoding来表示位置信息,表示当前字符在句子中的第几个位置。具体所需函数如下图。

2.2 Positional Encoding实现

在实现过程中,主要是实现这两个公式。

因为会经常调用位置编码的计算,所以将它定义成一个函数。函数有两个参数——pos及model_size。pos代表当前要编码的位置。model_size指想把位置编码转化成多长的向量,这个长度和transformer的输入是有关系的,输入是150维,那位置编码也要是150维的。

函数中,需要先生成指定大小的全0矩阵PE,用来占位。之后利用循环,判断i的奇偶,因为通过上面的公式,奇偶不同,采用不同的公式。注意,2i其实就表示偶数,在代码中用i就可以实现,特殊的在奇数时,需要减1。将计算出的值,切片填入PE中,最终函数返回PE矩阵。

3. Multi-head attention

3.1 Multi-head attention原理

在NLP中,其实某两个token之间,也许不仅仅有一种相关性。比如可以有语义层面的信息相关性的计算方法,但是可能在语法层面也有一定相关性,甚至从其它的,人类不太能够去理解的一些抽象的方面,也许也有一些相关性的计算方法。深度学习框架的好处就在于它能够自己去帮人类去发现一些没有关注到的方面。所以不能仅仅用Self-attention这一种计算相关性的方法,需要有更多的种类。所以Transformer的作者将其起名为Multi-head attention,其实是指需要更多的参数,利用更多的参数表示相关性的计算。

其实每一个head就是重复Self-attention中的计算过程,但是K、Q、V都是多维的,这样最终计算出的y也是多维的。为了降维,将最终的y进行拼接,变成一个n*h的向量。最后再进过全联接层,输出与输入长度一样的向量,利用全链接层再进行降维。

3.2 Multi-head attention实现

首先定义初始化方法,其中有两个参数——model_size和head。model_size与位置编码的维度对应,head是一个可变参数,也就是所需的head数。之后写入所需的变量。

因为需要用到很多的参数,所以利用全链接层来定义QUERY、KEYS和VALUES中可学习的参数。由于有很多个head,可以利用循环来定义不同的head。因为还需要一层全连接层,所以定义self.wo。初始化完成。

定义call来进行计算。这里大致的计算过程与Self-attention中相同,只是每一个head计算后利用concat进行拼接。同时在计算score时,除了根号k,这样可以防止梯度消失同时可以保证数据同分布。最后再利用wo全链接层降维,返回context。

4. Encoder过程实现

Encoder主要结构如图。

在实现整个Encoder过程中,会使用到很多层,首先需要用到Embedding层。

下面两层实现了图中的self attention以及layer norm结构。

desen1,dense2实现了图中的全链接层,可以后面还接了layer norm,所以定义ffn_norm。dense中的参数是可以调整的,选择不同的值会有不同的效果,这也是值得研究的内容。

接下来就可以定义call来做具体计算。这一部分实现了结构图中self attention部分。注意图中有残差结构,具体实现就是将sub_in与sub_out直接相加,其实是很简单的操作。

这里对应结构图中第一个layer norm。

利用前面定义的两个全链接层实现图中的第二个橙色部分,为了明确实现残差,从新命名变量,最后还是进行简单的相加操作。

利用定义好的ffn_norm实现最后一个layer norm结构。

最后,考虑连贯性,需要将第一层的输出当作第二层的输入,所以需要将ffn_out再赋值给sub_in。最终返回ffn_out。这就实现了Encoder过程。

想要获取更多的训练代码或者对实现过程有任何问题,欢迎联系。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 223,507评论 6 521
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 95,626评论 3 401
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 170,466评论 0 366
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 60,456评论 1 300
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 69,473评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,016评论 1 314
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,409评论 3 426
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 40,370评论 0 278
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,909评论 1 322
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,960评论 3 343
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,102评论 1 354
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,754评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,428评论 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,917评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,036评论 1 275
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,582评论 3 380
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,126评论 2 362

推荐阅读更多精彩内容