Attention in Deep Learning
を読んだ(ICML2019のTutorial)
スライド: http://alex.smola.org/talks/ICML19-attention.pdf
1.Watson Nadaraya Estimator
- Alex Smolaのスライド、好きです
- まず最初Watson Nadaraya Estimatorってのを導入してた
- Key Query ValueっていうAttentionの基本的な仕組みを導入するためかな
2. Pooling
- まずDeep Setsを導入(SmolaもAuthorやんけ!)
- Deep Setsは集合に対するニューラルネットワーク
- 集合上の任意の関数は、各要素にφを適用したものの総和を取って、何らかの関数に突っ込んだもので表現できる
- んで、Multiple Instance Problemっていう問題について考えてみる
- これは、ある望ましい性質を持つ(薬理効果みたいな)要素を持つ集合を同定してほしいって問題
- んで、さっきのφの部分の関数の値に、Attentionを導入して要素に重み付けを行って上記の問題へアプローチしてる
- 次はBag of WordsとWord2vec
- こいつも、文章(集合)中の各単語(要素)に対する関数みたいなものを求めたいって気持ち
- WordレベルのAttentionとかSentenceレベルのAttentionがあったりする
- あとはILSVRC 2017でトップだった(たしか)Squeeze Excitation Networksとか、GAT(Graph Attention Networks)とかもAttentionだよなぁっていう
- Squeeze Excitation Networksはよくわかってないのでちょっと解説記事を読む
まとめると、集合に対し
- Pooling
- Attention付きPooling
- Attention関数(単位重みに正規化)
って感じ、Attentionの重みってのはクエリwがどれくらいコンテクストに依存するかって感じ
この辺はよくある話かなぁといったところ
3. Iterative Attention
- Question Answeringを考える。○○はどこにある?っていう時に、単純なAttentionだと、○○って入ってる部分しか考慮できない
- なのでIterative Attentionを導入 その名の通りAttention部分を複数個用意してる
- さっきみたく書くと
- 繰り返しAttentionやってるのは初めて聞いた(無知無知のムチ)
4. Iterative Output
- Seq2Seqとかwith AttentionとかPointer Networkの話(この辺は軽く調べた)
- Improvementとして、Transformerを使ったりとか、Graph Neural Networksによる局所的交互情報の導入とか
- Neural Turing Machineとか(これは内部にメモリを持っていて、Attentionの重みを使ってそのメモリを読み書きするっていうやつ)
5. Multiple Heads
- まあ出てきましたTransformer
- self-attentionは、QueryとKeyとValueが一致する時
- でもなんでSelf-Attentionがいいんだろ……(よくわかっていない)
- まあ、よしなにQueryやKey、Valueに変換する操作が入ってるからまあ……わかるかも……?
- まあ出てきましたBERT
- word2vecは系列情報を完全に無視してしまう
6. Sparse Structured Lightweight
- 疎なAttentionとかもあるっぽい(計算量大きくなるからね)
雑感
- なんとなくAttentionがわかった(気になった)
- Pointer Networkに対してのTransformerは筋が悪いわけではなかったんだ(とICLR2019のAttention, Learn to〜を読んで思いました)
- GATも実装しようかなぁ