<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【深度學(xué)習(xí)】各種各樣神奇的自注意力機(jī)制(Self-attention)變形

          共 4097字,需瀏覽 9分鐘

           ·

          2022-11-01 12:36

          轉(zhuǎn)載自 | PaperWeekly

          總結(jié)下關(guān)于李宏毅老師在 2022 年春季機(jī)器學(xué)習(xí)課程中關(guān)于各種注意力機(jī)制介紹的主要內(nèi)容,也是相對(duì)于 2021 年課程的補(bǔ)充內(nèi)容。參考視頻見(jiàn):

          https://www.bilibili.com/video/BV1Wv411h7kN/?p=51&vd_source=eaef25ec79a284858ac2a990307e06ae

          在 2021 年課程的 transformer 視頻中,李老師詳細(xì)介紹了部分 self-attention 內(nèi)容,但是 self-attention 其實(shí)還有各種各樣的變化形式:

          先簡(jiǎn)單復(fù)習(xí)下之前的 self-attention。假設(shè)輸入序列(query)長(zhǎng)度是 N,為了捕捉每個(gè) value 或者 token 之間的關(guān)系,需要對(duì)應(yīng)產(chǎn)生 N 個(gè) key 與之對(duì)應(yīng),并將  query 與 key 之間做 dot-product,就可以產(chǎn)生一個(gè) Attention Matrix(注意力矩陣),維度 N*N。這種方式最大的問(wèn)題就是當(dāng)序列長(zhǎng)度太長(zhǎng)的時(shí)候,對(duì)應(yīng)的 Attention Matrix 維度太大,會(huì)給計(jì)算帶來(lái)麻煩。

          對(duì)于 transformer 來(lái)說(shuō),self-attention 只是大的網(wǎng)絡(luò)架構(gòu)中的一個(gè) module。由上述分析我們知道,對(duì)于 self-attention 的運(yùn)算量是跟 N 的平方成正比的。當(dāng) N 很小的時(shí)候,單純?cè)黾?self-attention 的運(yùn)算效率可能并不會(huì)對(duì)整個(gè)網(wǎng)絡(luò)的計(jì)算效率有太大的影響。因此,提高 self-attention 的計(jì)算效率從而大幅度提高整個(gè)網(wǎng)絡(luò)的效率的前提是 N 特別大的時(shí)候,比如做圖像識(shí)別(影像辨識(shí)、image processing)。

          如何加快 self-attention 的求解速度呢?根據(jù)上述分析可以知道,影響 self-attention 效率最大的一個(gè)問(wèn)題就是 Attention Matrix 的計(jì)算。如果我們可以根據(jù)一些人類(lèi)的知識(shí)或經(jīng)驗(yàn),選擇性的計(jì)算 Attention Matrix 中的某些數(shù)值或者某些數(shù)值不需要計(jì)算就可以知道數(shù)值,理論上可以減小計(jì)算量,提高計(jì)算效率。

          舉個(gè)例子,比如我們?cè)谧鑫谋痉g的時(shí)候,有時(shí)候在翻譯當(dāng)前的 token 時(shí)不需要給出整個(gè) sequence,其實(shí)只需要知道這個(gè) token 兩邊的鄰居,就可以翻譯的很準(zhǔn),也就是做局部的 attention(local attention)。這樣可以大大提升運(yùn)算效率,但是缺點(diǎn)就是只關(guān)注周?chē)植康闹?,這樣做法其實(shí)跟 CNN 就沒(méi)有太大的區(qū)別了。

          如果覺(jué)得上述這種 local attention 不好,也可以換一種思路,就是在翻譯當(dāng)前 token 的時(shí)候,給它空一定間隔(stride)的左右鄰居,從而捕獲當(dāng)前與過(guò)去和未來(lái)的關(guān)系。當(dāng)然stride的數(shù)值可以自己確定。

          還有一種 global attention 的方式,就是選擇 sequence 中的某些 token 作為 special token(比如標(biāo)點(diǎn)符號(hào)),或者在原始的 sequence 中增加 special token。讓 special token 與序列產(chǎn)生全局的關(guān)系,但是其他不是 special token 的 token 之間沒(méi)有 attention。以在原始 sequence 前面增加兩個(gè) special token 為例:

          到底哪種 attention 最好呢?小孩子才做選擇...對(duì)于一個(gè)網(wǎng)絡(luò),有的 head 可以做 local attention,有的 head 可以做 global attention... 這樣就不需要做選擇了??聪旅鎺讉€(gè)例子:

          • Longformer 就是組合了上面的三種 attention
          • Big Bird 就是在 Longformer 基礎(chǔ)上隨機(jī)選擇 attention 賦值,進(jìn)一步提高計(jì)算效率
          上面集中方法都是人為設(shè)定的哪些地方需要算 attention,哪些地方不需要算 attention,但是這樣算是最好的方法嗎?并不一定。對(duì)于 Attention Matrix 來(lái)說(shuō),如果某些位置值非常小,我們可以直接把這些位置置 0,這樣對(duì)實(shí)際預(yù)測(cè)的結(jié)果也不會(huì)有太大的影響。也就是說(shuō)我們只需要找出 Attention Matrix 中 attention 的值相對(duì)較大的值。但是如何找出哪些位置的值非常小/非常大呢?
          下面這兩個(gè)文獻(xiàn)中給出一種 Clustering(聚類(lèi))的方案,即先對(duì) query 和 key 進(jìn)行聚類(lèi)。屬于同一類(lèi)的 query 和 key 來(lái)計(jì)算 attention,不屬于同一類(lèi)的就不參與計(jì)算,這樣就可以加快 Attention Matrix 的計(jì)算。比如下面這個(gè)例子中,分為 4 類(lèi):1(紅框)、2(紫框)、3(綠框)、4(黃框)。在下面兩個(gè)文獻(xiàn)中介紹了可以快速粗略聚類(lèi)的方法。
          有沒(méi)有一種將要不要算 attention 的事情用 learn 的方式學(xué)習(xí)出來(lái)呢?有可能的。我們?cè)儆?xùn)練一個(gè)網(wǎng)絡(luò),輸入是 input sequence,輸出是相同長(zhǎng)度的 weight sequence。將所有 weight sequence 拼接起來(lái),再經(jīng)過(guò)轉(zhuǎn)換,就可以得到一個(gè)哪些地方需要算 attention,哪些地方不需要算 attention 的矩陣。有一個(gè)細(xì)節(jié)是:某些不同的 sequence 可能經(jīng)過(guò) NN 輸出同一個(gè) weight sequence,這樣可以大大減小計(jì)算量。
          上述我們所講的都是 N*N 的 Matrix,但是實(shí)際來(lái)說(shuō),這樣的 Matrix 通常來(lái)說(shuō)并不是滿(mǎn)秩的,也就是說(shuō)我們可以對(duì)原始 N*N 的矩陣降維,將重復(fù)的 column 去掉,得到一個(gè)比較小的 Matrix。
          具體來(lái)說(shuō),從 N 個(gè) key 中選出 K 個(gè)具有代表的 key,每個(gè) key 對(duì)應(yīng)一個(gè) value,然后跟 query 做點(diǎn)乘。然后做 gradient-decent,更新 value。
          為什么選有代表性的 key 不選有代表性的 query 呢?因?yàn)?query 跟 output 是對(duì)應(yīng)的,這樣會(huì) output 就會(huì)縮短從而損失信息。
          怎么選出有代表性的 key 呢?這里介紹兩種方法,一種是直接對(duì) key 做卷積(conv),一種是對(duì) key 跟一個(gè)矩陣做矩陣乘法。
          回顧一下注意力機(jī)制的計(jì)算過(guò)程,其中 I 為輸入矩陣,O 為輸出矩陣。
          先忽略 softmax,那么可以化成如下表示形式:
          上述過(guò)程是可以加速的。如果先 V*K^T 再乘 Q 的話(huà)相比于 K^T*Q 再乘 V 結(jié)果是相同的,但是計(jì)算量會(huì)大幅度減少。
          附:線(xiàn)性代數(shù)關(guān)于這部分的說(shuō)明
          還是對(duì)上面的例子進(jìn)行說(shuō)明。如果 K^T*Q,會(huì)執(zhí)行 N*d*N 次乘法。V*A,會(huì)再執(zhí)行 d'*N*N 次乘法,那么一共需要執(zhí)行的計(jì)算量是(d+d')N^2。
          如果 V*K^T,會(huì)執(zhí)行 d'*N*d 次乘法。再乘以 Q,會(huì)執(zhí)行 d'*d*N 次乘法,所以總共需要執(zhí)行的計(jì)算量是 2*d'*d*N。
          而(d+d')N^2>>2*d'*d*N,所以通過(guò)改變運(yùn)算順序就可以大幅度提升運(yùn)算效率。
          現(xiàn)在我們把 softmax 拿回來(lái)。原來(lái)的 self-attention 是這個(gè)樣子,以計(jì)算b1為例:
          如果我們可以將 exp(q*k) 轉(zhuǎn)換成兩個(gè)映射相乘的形式,那么可以對(duì)上式進(jìn)行進(jìn)一步簡(jiǎn)化:
          ▲ 分母部分化簡(jiǎn)
          ▲ 分子化簡(jiǎn)
          將括號(hào)里面的東西當(dāng)做一個(gè)向量,M 個(gè)向量組成 M 維的矩陣,在乘以 φ(q1),得到分子。
          用圖形化表示如下:
          由上面可以看出藍(lán)色的 vector 和黃色的 vector 其實(shí)跟 b1 中的 1 是沒(méi)有關(guān)系的。也就是說(shuō),當(dāng)我們算 b2、b3... 時(shí),藍(lán)色的 vector 和黃色的 vector 不需要再重復(fù)計(jì)算。
          self-attention 還可以用另一種方法來(lái)看待。這個(gè)計(jì)算的方法跟原來(lái)的 self-attention 計(jì)算出的結(jié)果幾乎一樣,但是運(yùn)算量會(huì)大幅度減少。簡(jiǎn)單來(lái)說(shuō),先找到一個(gè)轉(zhuǎn)換的方式 φ(),首先將 k 進(jìn)行轉(zhuǎn)換,然后跟 v 做 dot-product 得到 M 維的 vector。再對(duì) q 做轉(zhuǎn)換,跟 M 對(duì)應(yīng)維度相乘。其中 M 維的 vector 只需要計(jì)算一次。
          b1 計(jì)算如下:
          b2 計(jì)算如下:
          可以這樣去理解,將 φ(k) 跟 v 計(jì)算的 vector 當(dāng)做一個(gè) template,然后通過(guò) φ(q) 去尋找哪個(gè) template 是最重要的,并進(jìn)行矩陣的運(yùn)算,得到輸出 b。
          那么 φ 到底如何選擇呢?不同的文獻(xiàn)有不同的做法:
          在計(jì)算 self-attention 的時(shí)候一定需要 q 和 k 嗎?不一定。在 Synthesizer 文獻(xiàn)里面,對(duì)于 attention matrix 不是通過(guò) q 和 k 得到的,而是作為網(wǎng)絡(luò)參數(shù)學(xué)習(xí)得到。雖然不同的 input sequence 對(duì)應(yīng)的 attention weight 是一樣的,但是 performance 不會(huì)變差太多。其實(shí)這也引發(fā)一個(gè)思考,attention 的價(jià)值到底是什么?
          處理 sequence 一定要用 attention 嗎?可不可以嘗試把 attention 丟掉?有沒(méi)有 attention-free 的方法?下面有幾個(gè)用 mlp 的方法用于代替 attention 來(lái)處理 sequence。
          最后這頁(yè)圖為今天所有講述的方法的總結(jié)。下圖中,縱軸的 LRA score 數(shù)值越大,網(wǎng)絡(luò)表現(xiàn)越好;橫軸表示每秒可以處理多少 sequence,越往右速度越快;圈圈越大,代表用到的 memory 越多(計(jì)算量越大)。
          以上就是關(guān)于李老師對(duì)于《各種各樣神奇的自注意力機(jī)制(Self-attention)變形》這節(jié)課總結(jié)的全部?jī)?nèi)容。
          往期精彩回顧




          瀏覽 67
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色二区| 日韩精品视频观看 | 丁香五月激情小说 | 免费看黄片女生靠逼 | AV无码网 |