重み行列 W_Q, W_K, W_V は,Self-Attenshon で使われる。
Self-Attenshon は,複数レイアーの形を以て,繰り返される。
そして各レイヤーが自分専用の W_Q, W_K, W_V をもつ。
ということで,重み行列は,レイヤー数 × 3 個が格納されることになる。
- Multi-Head Attention の場合
例えば Multi-Head Attention の 12レイヤーだと,
layer_0:
W_Q^(0) : D × d_Q
W_K^(0) : D × d_K
W_V^(0): D × d_V
layer_1:
W_Q^(1) : D × d_Q
W_K^(1) : D × d_K
W_V^(1) : D × d_V
...
layer_11:
W_Q^(11) : D × d_Q
W_K^(11) : D × d_K
W_V^(11) : D × d_V
ここで,d_K = d_Q。また d_V は,通常は d_Q と同じか,それに近い値が使われることが多い。
本テクストは,Single-Head で論を進めているので,重み行列はすべて D × D 行列。
- 「格納」の実際
PyTorch や TensorFlow では nn.ModuleList のような形で管理される。
たとえば PyTorch の nn.Linear で定義する場合:
self.W_Q = nn.Linear(D_model, d_Q)
self.W_K = nn.Linear(D_model, d_K)
self.W_V = nn.Linear(D_model, d_V)
self.W_O = nn.Linear(d_V, D_model)
(d_* は,Multi-Head 並列処理のために D を区切った長さ)
これを各レイヤーに持たせて,レイヤーごとに別のインスタンスとして保持。
- 重さ行列の初期設定
重み行列の初期値は,ランダムに設定される (ランダム初期化)。
Transformer の「学習によるトークンベクトルの成長」の中身は,トークンベクトルと重み行列の更新である。
|