Attention
注意機構 / Attention Mechanism
入力系列の各要素に動的な重みを割り当て、関連度の高い部分に着目して処理するニューラルネットワークの機構
概要
Attention(注意機構)は、ニューラルネットワークが入力系列の各要素に対して動的に重要度(重み)を計算し、関連性の高い部分に着目しながら出力を生成する仕組み。人間が文章を読む際に重要な単語へ注意を向けるのと同様に、モデルが入力全体を均等に扱うのではなく、タスクに応じて特定の部分へ重みを重点的に割り当てる。Query・Key・Valueの3つのベクトルを用いてスコアを計算する「Scaled Dot-Product Attention」が代表的な実装であり、Transformerの中核メカニズムとして自己注意(Self-Attention)の形で採用されている。
背景
RNNベースの系列モデルでは、長い入力を固定長のベクトルに圧縮する際に情報が失われやすく、特に長距離の依存関係を捉えるのが難しいという課題があった。Attentionは、出力の各ステップで入力系列全体を直接参照できるようにすることで、この情報のボトルネックを解消するために考案された。
歴史
2014年: Bahdanauらがニューラル機械翻訳においてAttention機構を導入し、RNNの性能を大幅に向上。2015年: Luongらがより単純化されたAttentionのバリエーションを提案。2017年: Vaswaniらが再帰構造を排除し自己注意機構のみでモデルを構成するTransformerを発表、Attentionが深層学習の中心的な機構となる。
アーキテクチャ
Query(検索したい情報)・Key(参照される情報のラベル)・Value(実際の情報)の3つのベクトルを用いる。QueryとKeyの内積によって各要素との関連度スコアを計算し、softmaxで正規化した重みをValueに掛けて加重和を取ることで出力を得る。複数のAttentionヘッドを並列に用いるMulti-Head Attentionにより、異なる観点からの関連性を同時に捉えられる。
ワークフロー
入力を埋め込みベクトルに変換 → 各要素をQuery・Key・Valueベクトルに射影 → QueryとKeyの内積でスコアを計算 → softmaxで正規化し重みを得る → 重みをValueに適用し加重和を出力とする。
コード例
Query/Key/Valueを用いたAttention層(PyTorch)
import torch.nn as nn
import torch.nn.functional as F
class Attention(nn.Module):
def __init__(self, dim):
super().__init__()
self.q = nn.Linear(dim, dim)
self.k = nn.Linear(dim, dim)
self.v = nn.Linear(dim, dim)
def forward(self, x):
q, k, v = self.q(x), self.k(x), self.v(x)
scores = q @ k.transpose(-2, -1) / (q.size(-1) ** 0.5)
weights = F.softmax(scores, dim=-1)
return weights @ v利点
- 長距離の依存関係を直接モデル化でき、情報のボトルネックが少ない
- 計算を系列方向に並列化できる
- 重みを可視化することでモデルの着目箇所を解釈しやすい
欠点
- 系列長に対して計算量・メモリ使用量が2乗で増加する
- 長い系列では計算コストが大きな制約になる
比較
- Transformer — TransformerはAttention機構(特に自己注意)のみで構成されたアーキテクチャ
- RNN — AttentionはRNNが抱える長距離依存の情報損失を補うために導入された
関連用語
よくある質問
Self-AttentionとAttentionの違いは?
Attentionは入力と出力(または別の系列)の間の関連度を計算する一般的な仕組み。Self-Attentionは、その中でも同じ系列内の要素同士の関連度を計算する特殊なケースを指す。
参考文献
- Research PaperNeural Machine Translation by Jointly Learning to Align and Translate
- Research PaperAttention Is All You Need