在實踐中,給定一組相同的查詢、鍵和值,我們可能希望我們的模型結合來自同一注意機制的不同行為的知識,例如捕獲各種范圍的依賴關系(例如,較短范圍與較長范圍)在一個序列中。因此,這可能是有益的
允許我們的注意力機制聯合使用查詢、鍵和值的不同表示子空間。
為此,可以使用以下方式轉換查詢、鍵和值,而不是執行單個注意力池h獨立學習線性投影。那么這些h投影查詢、鍵和值被并行輸入注意力池。到底,h 注意池的輸出與另一個學習的線性投影連接并轉換以產生最終輸出。這種設計稱為多頭注意力,其中每個hattention pooling outputs 是一個頭 (Vaswani et al. , 2017)。使用全連接層執行可學習的線性變換,圖 11.5.1描述了多頭注意力。
import math
import torch
from torch import nn
from d2l import torch as d2l
import math
from mxnet import autograd, np, npx
from mxnet.gluon import nn
from d2l import mxnet as d2l
npx.set_np()
import jax
from flax import linen as nn
from jax import numpy as jnp
from d2l import jax as d2l
No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)
import tensorflow as tf
from d2l import tensorflow as d2l
11.5.1。模型
在提供多頭注意力的實現之前,讓我們從數學上形式化這個模型。給定一個查詢 q∈Rdq, 關鍵 k∈Rdk和一個值 v∈Rdv, 每個注意力頭 hi(i=1,…,h) 被計算為
(11.5.1)hi=f(Wi(q)q,Wi(k)k,Wi(v)v)∈Rpv,
其中可學習參數 Wi(q)∈Rpq×dq, Wi(k)∈Rpk×dk和 Wi(v)∈Rpv×dv, 和f是注意力集中,例如11.3 節中的附加注意力和縮放點積注意力。多頭注意力輸出是另一種通過可學習參數進行的線性變換Wo∈Rpo×hpv的串聯h負責人:
(11.5.2)Wo[h1?hh]∈Rpo.
基于這種設計,每個頭可能會關注輸入的不同部分。可以表達比簡單加權平均更復雜的函數。
11.5.2。執行
在我們的實現中,我們為多頭注意力的每個頭選擇縮放的點積注意力。為了避免計算成本和參數化成本的顯著增長,我們設置 pq=pk=pv=po/h
評論
查看更多