らんだむな記憶

blogというものを体験してみようか!的なー

自己注意

torch.nn.Transformer の自己注意ブロックの実装を見ると、transformer.py#L352 のようになっている。

    # self-attention block
    def _sa_block(self, x: Tensor,
                  attn_mask: Optional[Tensor], key_padding_mask: Optional[Tensor]) -> Tensor:
        x = self.self_attn(x, x, x,

他の実装サンプルも同様の実装である。つまり、Q-K-V に同じテンソルを渡している。この効果について Attention (4) - らんだむな記憶 で妄想を書いてみたがどうやら正しくなかったらしい。

これについては [1706.03762] Attention Is All You Need の p.13- Attention Visualization が参考になった。['since', '2009', 'making', 'the', 'registration', 'or', 'voting', 'process', 'more', 'difficult', '.'] というシーケンスで、'making' から 'more', 'difficult' への注意が発生し「making ... more difficult」というフレーズを構成しているとのことだ。次の例では ['The', 'Law', 'will', 'never', 'be', 'perfect', ',', 'but', 'its', 'application', 'sould', ...] で 'its' から 'Law' と 'application' に注意が発生している。所有代名詞がかかる先と代名詞の中身ということだ。

CV に応用した場合にはどうなるか?というのが気になるが、例えば [1805.08318] Self-Attention Generative Adversarial Networks が参考になる。正確には論文内の解説はあまり分からなかったのだが、O'Reilly Japan - 生成 Deep Learning のほうでの解説が分かりやすかった。p.312 によると、身体の中のピクセルをクエリとする時、同じく身体の周囲への注意が発生し、背景のピクセルをクエリとする時、鳥の反対側の背景に注意が発生し、尾羽のピクセルをクエリとする時、尾羽の別の箇所に注意が発生しているということで、画像内でのオブジェクトの関連付けがなされているということだ。

他の例としては、Vision Transformer [2010.11929] An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale が思いつくが、p.20 に attention map のサンプルが掲載されている。懇切丁寧な説明が書いてあるわけではないが、興味のあるターゲットの一部をクエリとすると、そのターゲットの他の部分に注意が発生している・・・ということの可視化なのだろう。

いずれにせよ、自己注意というものは、“翻訳時のアライメントの対応関係同士の単語を選択する仕組み” とは少し違って、“文章中のフレーズを構築するような仕組み” や “画像中のオブジェクトを浮き彫りにする仕組み” ということが分かった。

意味を理解しやすそうかは別として https://colab.research.google.com/github/tensorflow/tensor2tensor/blob/master/tensor2tensor/notebooks/hello_t2t.ipynb というノートブックもあるらしい。

BERT の場合、GitHub - jessevig/bertviz: BertViz: Visualize Attention in Transformer Models (BERT, GPT2, BART, etc.) というサンプルも見つかったが、これなど良さそうに見える。