【Day22】 Transformer 新手包 (二)

Query,Key,Value

在昨天我们有提到 "自" 注意力机制,现在我们更详细的来看具体是怎麽算的。

先定义一下 "做 attention" 这件事就是收 2 个向量,然後输出一个分数告诉你这两个向量有多配,至於怎麽算有很多种,像是昨天说的内积。

  1. 假设我们输入是 [x1,x2,x3,x4] 我们先把这个东西做 embedding,变成 [a1,a2,a3,a4]

  2. 把 [a1,a2,a3,a4] 丢进 "自"注意力机制中做运算,每个 input 都各别乘上 3 种不同的矩阵[w1,w2,w3],会得到 3 个新 Vector 就是 Query,Key,Value

    [q1,q2,q3,q4],[k1,k2,k3,k4],[v1,v2,v3,v4]
    
  3. 把每个 q 对做每个 k 都做 attention 得到 [alpha1,alpha2,alpha3,alpha4]],以论文上来讲 "做 attention" 这件事是

     alpha = q。k^i / sqrt(d) ,d is the dim of q and k
    
  4. 把每个 alpha 做 softmax 得到 alpha^ 这边其实你会发现跟昨天的一样

  5. 把结果个别乘上 v 然後加总然後得到输出 b1,相信大家都看过下面这张图XD

  • 如果你不想让 b1 知道其他地方的资讯,那你只需要把其他地方的 alpha^乘V 设成 0 就好了。还是有点不清楚的话就再看一张图吧! 看看 b2 怎麽算出来的

这里就是和 RNN 不一样的地方了,你会发现对电脑而言,b1,b2 这些是可以平行运算的!

Multi-Head Attention

刚刚上面有提到 q,k,v,Multi-Head 顾名思义就是把这些分裂成 2 份(或更多),然後後做一样的事,注意虽然分成两份 [qi1,qj],但 qi 只会对 ki,vi 做,qj 也一样,最後把两份不同的 b concatenate 起来,看下面这张图就知道了。

为什麽没事要给自己找麻烦呢? 其实这麽做是有原因的,上面我们提到不想让有的 head 知道其他地方的资讯,但又想让某个 head 知道其他地方的资讯,就可以这样处理。

Positional Encoding

如果照上面算下来,你会发现对 b 来讲,输入顺序这件事毫无意义的,因为对 b 而言它就是对所有的输入做 self-attention,b 是没有输入前後位置的概念的,但这显然不对,而解决这个问题德方法,就是 Positional Encoding。

这个 e^i 不是训练出来的,它是人工设定的,用的时候只要把它加上 a^i 就好了。(之後再说这个怎麽生的)

整理一下 Transformer Encoder 的部分

来看一张被转贴到烂的图,再经过我的巧手之後变得更烂了XD

decoder 还有一些小差异我们明天继续讲

参考资料

Hung-yi Lee - Transformer

Hung-yi Lee 老师的内容都很扎实好理解,而且还无私地分享给大家,抱持着感恩的心收看吧 XD !

/images/emoticon/emoticon09.gif/images/emoticon/emoticon13.gif/images/emoticon/emoticon14.gif/images/emoticon/emoticon22.gif/images/emoticon/emoticon28.gif


<<:  Day 07 Style

>>:  那些被忽略但很好用的 Web API / ImageCapture

[前端暴龙机,Vue2.x 进化 Vue3 ] Day2.在认识vue之前(二)

在认识 Vue 之前,前一篇已经介绍了资料驱动画面跟双向绑定的概念了 今天再介绍一个 MVVM架构~...

Unity自主学习(二十八):Time.deltaTime

上次把物件基本的移动以及跳跃都弄出来了,那麽改变物件的位置座标时,都要再额外乘上一个"Ti...

[Day9] 词性标注(四)-利用python实作POS任务

一. 资料准备 这边的code是参考coursera上课程的code,根据自己的需求改成中文的范例 ...

Day 28 : Git

1. 为什麽要学 Git,可以做什麽呢? 学习到现在大家一定累积很多的程序码或是各式的档案,如何去做...

[Day3]-if叙述

if…else叙述,基本格式为: if(条件): 条件成立时执行 else: 条件不成立时执行 i...