たれぱんのびぼーろく

わたしの備忘録、生物学とプログラミングが多いかも

徹底解説!non-local operations / self-attention

Non-local Neural Networks (2018)

モジュールのお気持ち

「私が欲しいものだけぜーんぶください」

FC: とにかく全要素を取りこむ
Conv: 決め打ちで局所だけ取りこむ
RNN: hiddent-1だけ直接取りこむ
=> 現在値に基づいて動的に、全長から欲しい要素だけ、取りこみたい
=> 現在値を用いて各要素用のweightを計算し、各要素へweightをかけたうえで、全部取りこめばいい1

generic non-local operation

入力xi として、良い感じに情報を取りこんだ出力をyiとする.
現在値 xi を基に/anchorとして各要素用の重み wj=f(xi ,xj) を計算、取りこむ情報は良い形にしておきたいので g(xj) で変形.
Σw==1 は必須ではないが要素数が増えるだけで出力が大きくなるのは困る2ので、何らかの正規化数Cを用意する.
この yi = Σ (wj/C)*g(xj) でお気持ちを達成できる.

fをxi・xj内積にすれば、似た入力に強いweightが乗ることになる.
fully connection layerと異なり、fがanchor値 xiと入力要素 xj の関係に基づいてweight jを計算する点がポイント。

computes responses based on relationships between different locations

FCと同じく全要素を取りこむが、重みは動的にf(xi, xj) で計算できるためConvやRNNのように可変長を処理できる.

fとgをどう設計するかで見た感じのお気持ちは全然変わってくる.
ただ、この論文ではfの設計がさほど影響しなかったとの結果がでており、タスク依存なのか本質的に差が無いのかは不明.

g/fの例

g

論文ではgは学習可能な線形変換とした.
実装としては1x1 conv

f

  • Gaussian: 2入力のdot-productした値でeを乗する
    • norm (C) はf出力の総和
  • Embedded Gaussian: 2入力を線形変換したのちにdot-productした値でeを乗する
    • norm (C) はf出力の総和 (softmaxのactivation functionとして働く)
  • Dot product: 2入力を線形変換したのちにdot-product
    • norm (C) はiの数N
  • Concat: 2入力を線形変換したのちにconcatし、weight vectorかけてReLU
    • norm (C) はiの数N

self-attentionは、このnon-local operationのうち、gを線形変換、fをEmbedded Gaussiantとしたものである.
一見すると少し違うのだが、総和する前にC(X)を入れ込んで考えると、dimension j周りのsoftmaxになる.

Non-local Block

res-blockの中にnon-local operation * weightを入れたもの.
weightゼロで学習済みモデルに入れると、学習済みモデルを壊さずに導入が可能. その後学習を進めていけばいい (当然最初から入れてもいい)

Original Paper

Paper

@misc{1711.07971,
Author = {Xiaolong Wang and Ross Girshick and Abhinav Gupta and Kaiming He},
Title = {Non-local Neural Networks},
Year = {2017},
Eprint = {arXiv:1711.07971},
}

  1. “non-local operation computes the response at a position as a weighted sum of the features at all positions. ” from original paper

  2. “A normalization like this is necessary because the input can have variable size.” from original paper