Site cover image

Site icon imageSen(Qian)’s Memo

This website is Donglin Qian (Torin Sen)’s memo, especially about machine learning papers and competitive programming.

NNDL 第8章 Attention機構と外部記憶

中国の有名な機械学習の本の勉強ノート。自分がわからなかったところだけなので飛び飛びだろう。

https://nndl.github.io/

再度いうが、理論上DNNとRNNは非常に強力である。DNNは任意の関数を近似できるし、RNNはチューリング完全である。しかし、最適化のやり方や処理能力(そんなに大きいネットワークは作れない)の制約上、CNNなどの賢いアーキテクチャを事前に人間考えて訓練させないとなかなか性能出ないということがわかった

ネットワーク内で保存できる情報量はNetwork Capacityと言う。一般的には、RNNの保存できる情報量はニューロンの数とネットワークの複雑度に比例する。

しかし、これは人間の脳も同じである。わずか数秒しか覚えられない脳は、RNNでいう記憶消失問題そのものを抱えている。しかし、人間には注意力=Attentionと、長期記憶を持つ。

Attentionとは

大量の情報がある中で集中的にみる分野を選び出すことをAttentionという。以下の2種類ある。

  • Focus Attention 意識的に○○に集中すること
  • Saliency-Based Attention 無意識に、周りとすごく違うものに注目すること

CNNのMaxPoolingやRNNのGate制度は、Saliency-Based Attention(意識的に最大)を行っているといえる。

入力が{x1,xN}RD×N\{\mathbf{x}_1, \cdots \mathbf{x}_N \} \in \mathbb{R}^{D \times N}と与えられるとき、重要な情報だけに注目したい=一部の情報をそぎ落としたい。

ここで、Query Vectorというq\mathbf{q}を導入し、これに従ってii番目のVectorが選ばれる確率αi\alpha_iを定義したい。

Image in a image block

離散的ではなく連続的に扱いたいので、softmaxを噛ませてCalibrationしている。そして、s(x,q)s(\mathbf{x}, \mathbf{q})とは、サンプルx\mathbf{x}がQuery Vectorq\mathbf{q}の下でどれほど選ばれるべきかのスコアを出力するスコア関数。スコア関数は以下の数通りありえる。

スコア関数のモデル名学習するパラメタ
加算モデルs(x,q)=vTtanh(Wx+Uq)s(\mathbf{x}, \mathbf{q}) = \mathbf{v} ^ T \tanh (W \mathbf{x} + U \mathbf{q})v,U,W\mathbf{v}, U, W
内積モデルs(x,q)=xTqs(\mathbf{x}, \mathbf{q}) = \mathbf{x} ^ T \mathbf{q}
スケールつき内積モデルs(x,q)=xTq/Ds(\mathbf{x}, \mathbf{q}) = \mathbf{x} ^ T \mathbf{q} / \sqrt{D}
ここでDDx\mathbf{x}の次元
二次形式モデルs(x,q)=xTWqs(\mathbf{x}, \mathbf{q}) = \mathbf{x} ^ T W \mathbf{q}WW

理論上加算モデルと内積モデルは同じ表現能力を持つが内積のほうが計算も早い。

入力の次元が高すぎると、内積モデルそのままでは大きな標準偏差を持つので、D\sqrt{D}で割ることによって解決することができる。

二次形式モデルは一番表現力が高い。

このよう計算したαn\alpha_nは、xn\mathbf{x}_nが選ばれる確率となるが、どれほどの割合で注目を受けるかということともいえる。それを確率論ではなく、期待値のようにそのまま計算したものがSoft Attentionである。

n=1Nαnxn\sum_{n=1}^N \alpha_n \mathbf{x}_n

これと逆なのがHard Attentionというもの。何が選ばれるかを明確に1つだけ選出する。選び方としては、

  1. αn\alpha_nが最大のxn\mathbf{x}_nを選ぶ。
  2. αn\alpha_n自体がある確率分布なので、その確率分布の中でランダムに選び出す

ただし、これでは決定的に選べているわけではないんので、損失関数からの誤差逆伝搬で更新するのはできない。これは強化学習を使わないといけない。というわけで、MLでは誤差逆伝搬で追うことができるように、全部Soft Attentionである。

Key-Valueの構造

すべてのデータについて、(K,V)=[(k1,v1),,(kn,vn)](K,V) = [(\mathbf{k}_1, \mathbf{v}_1), \cdots, (\mathbf{k}_n, \mathbf{v}_n)]のようにキーと値を分離させる。Attentionを計算するのはk\mathbf{k}で、Soft Attentionで合算に使われるのがv\mathbf{v}である。

実際の機械学習ではどのように組み込むのか

Attentionは、

  1. 何かしらの入力をQuery Vectorq\mathbf{q}として扱い
  2. それと一連のデータx1,,xN\mathbf{x}_1, \cdots, \mathbf{x}_Nに対して、あるスコア関数のもとで計算を行い
  3. Weightとしてα1,,αN\alpha_1, \cdots, \alpha_Nのスカラーを得る。
  4. そのWeightをどう使うかはそれぞれ次第

というものである。この枠組みによって、人間の意図的に集中して○○を見るという部分がうまく学習で実現できる

Multi-Head Attention

Transformerアーキテクチャでも使われている手法。複数のQuery VecotorQ=[q1,,qM]Q = [\mathbf{q}_1, \cdots, \mathbf{q}_M]があるとき、並列的に各Query VectorのAttentionを計算する。各Query Vectorはそれぞれ違うところに注目しており、その結果得られたSoft Attentionの結果もそのまま結合して1つのベクトルにまとめる。(次元を増やしてそのままそれぞれの結果をつなぎ合わせる感じ)

Image in a image block

構造化されてるものへのAttention

上下関係が存在するとわかっているものに対して、再帰的にAttentionを適用させてももちろん良い。

Pointer Network(指针网络)

参考: https://blog.csdn.net/qq_38556984/article/details/107574587

従来のEncoder-Decoderモデルでは、Decoderとして得られるベクトルはDictionaryのどれであるかを表すOne-hotベクトルであった。しかし、TSPや凸包を計算するとき、入力される長さは可変なので、出力するone-hotベクトルの次元数も可変になってしまうが、既存のone-hotによるdecodingではそれに対処することはできない。

従来のAttentionは、入力された一連の各サンプルに対して、どれを重視するのかを計算していた。ならば、一番重視しているもの=出力されるもの、とすればone-hotによるDecoderの出力表現とおさらばできる!これがPointer Networkである。(既存のAttentionベースのものは、Dictionaryのone-hotについての確率分布を出力してた)

Pointer Networkの入力にはX=[x1,,xN]X=[\mathbf{x}_1, \cdots, \mathbf{x}_N]が与えられ、出力としてc1,,cMc_1, \cdots, c_Mが出力され、その値の中身は[1,N][1,N]である。

次の出力cmc_{m}が得られる条件付き確率は以下のように近似できる。c1:(m1)c_{1:(m-1)}を直接得る代わりに、c1:(m1)c_{1:(m-1)}がインデックスとして指し示しているxc1,,xcm1\mathbf{x}_{c_1}, \cdots, \mathbf{x}_{c_{m-1}}を条件付確率として渡す

Image in a image block

xj\mathbf{x}_jはEncoderの時刻jjにおいての入力。di\mathbf{d}_iはDecoderの時刻iiにおいての隠れ層の出力。si,js_{i,j}はAttentionによって計算されたものであり、ここでのスコア関数はRNNの隠れ層の計算のようなものになっている。

si,j=vTtanh(Wxj+Uhi)p(cmc1,,cm1,x1,,xN)=exp(si,m)n=1Nexp(si,n)s_{i,j} = \mathbf{v} ^ T \tanh (W \mathbf{x}_j + U \mathbf{h}_i) \\ p(c_m | c_1, \cdots, c_{m-1}, \mathbf{x}_1, \cdots, \mathbf{x}_N) = \frac{\exp(s_{i, m})}{\sum_{n=1}^N \exp(s_{i,n})}

ここでは、Softmaxですべてのxm\mathbf{x}_mについてイテレーションしているので、Keyがxm\mathbf{x}_mのものについて、Query Vectorがhi\mathbf{h}_iとしてAttentionをしているといえる。そして、そのAttentionによって得られたWeightをそのまま確率p(cmc1,,cm1,x1,,xN)p(c_m | c_1, \cdots, c_{m-1}, \mathbf{x}_1, \cdots, \mathbf{x}_N) に転用しているように学習を仕向ける。ここでは、v,W,U\mathbf{v}, W, Uを学習する。

Self-Attention

長さが一定しない入力に対して、同じ長さの何かを出力するには、CNNやRNNを使えばできる。しかしCNNでは近傍的な関係しかとらえられず、RNNは短期記憶しか持たないのでやはり近傍的関係になる。それはLSTMとしても、性能上の限界が残る。

ネットワークの構造上、長距離の依存関係をとらえるには1. 全結合層を使う 2. ネットワークを深くする がありえる。しかし、訓練コストや訓練データの準備が非常に大変であるうえに、長さが一定ではない入力に対して、全結合層は同じ重みを適用させようとするので難しい。

ここで天才がひらめく。Attentionをうまく使うことで、重みを長さごとに自動生成して変化させれば、全結合層の重みが長さごとに変動できない問題が解決できると。このように、自分自身に対して判断して、現実的には長距離の依存関係を捉えられるようなWeightを生成できるのが、Self-Attentionである。

入力がX=[x1,,xN]RDx×NX=[\mathbf{x}_1, \cdots, \mathbf{x}_N] \in \mathbb{R}^ {D_x \times N}であるとする。出力はH=[h1,,hN]RDv×NH = [\mathbf{h}_1, \cdots, \mathbf{h}_N] \in \mathbb{R}^{D^v \times N}である。これは入力xi\mathbf{x}_iに対して自分自身へのAttentionを行うことで、その結果各iiに対して何かしらの望ましいhi\mathbf{h}_iというベクトルを得るということ。これは全結合層よりと比べて、異なる長さの入力に対しても異なる重みを(重みを結果的に自動的に生成することで)適用することができ、全結合層さえもしのぐ非常に高い表現力を持つ。具体的には以下のように行う。

Image in a image block
  1. まず、3つの線形写像Wq,Wk,WvW_q, W_k, W_vによって入力のX=[x1,,xN]X=[\mathbf{x}_1, \cdots, \mathbf{x}_N]を写像する。同じ入力からQuery、Key、ValueをそれぞれNN個生成する感じ3つの線形写像はみな学習するパラメタ
Q=WqXRDk×N,qiRDk,WqRDk×DxK=WkXRDk×N,kiRDk,WkRDk×DxV=WvXRDv×N,viRDv,WvRDv×DxQ = W_q X \in \mathbb{R}^{D_k \times N}, \mathbf{q}_i \in \mathbb{R}^{D_k}, W_q \in \mathbb{R} ^ {D_k \times D_x} \\ K = W_k X \in \mathbb{R}^{D_k \times N}, \mathbf{k}_i \in \mathbb{R}^{D_k}, W_k \in \mathbb{R} ^ {D_k \times D_x} \\ V = W_v X \in \mathbb{R}^{D_v \times N}, \mathbf{v}_i \in \mathbb{R}^{D_v}, W_v \in \mathbb{R} ^ {D_v \times D_x}
  1. すべてのqiQ\mathbf{q}_i \in Qに対して、Attentionを行い、soft attentionの結果を得る。なお、よくs(q,k)=qTk Dks(\mathbf{q}, \mathbf{k}) = \mathbf{q} ^ T \mathbf{k} \ \sqrt{D_k}が使われるらしい。
hn=att(qn,(K,V))=j=1Nαn,jvj=j=1Nsoftmax(s(qn,kj))vj\mathbf{h}_n = \mathrm{att}(\mathbf{q}_n, (K, V)) = \sum _{j=1} ^ N \alpha_{n,j} \mathbf{v}_j \\ = \sum_{j=1}^N \mathrm{softmax} (s(\mathbf{q}_n, \mathbf{k}_j)) \mathbf{v}_j
  1. このhnH\mathbf{h}_n \in Hこそが、Self-Attentionという構造によって得たかったもの。

つまり、自分で作ったQueryと自分で作ったKeyを使ってAttentionをして、その結果を使って自分のデータを混ぜる(ようにパラメタを学ばせる)ことで、自分自身のどこを注目するのかを決めさせるという高い表現力を持たせることができる

このSelf-Attentionについても、複数の3つ組の重み行列によって複数のチャンネルを作ることができ、Transformerアーキテクチャではそれが使われている。

ただ、Self-Attentionはq,k\mathbf{q}, \mathbf{k}の関連性だけを見るので、どの入力x\mathbf{x}が先か後かはわからない。どんなxi\mathbf{x}_iだろうが同じようなやり方でSelf-Attentionで計算される。どの入力を注目すればいいのはわかるが、注目したのが何番なのかの情報がない。(これは全結合層でも同様にそう。なので、RNNのような順序立った入力を受けるシステムが必要だった)

これを防ぐには、x\mathbf{x}の次元を拡張してそこに位置の情報を追加することが大事。一番簡単なのは何番目かを追加した次元に入れることである。他にも、1番目の値に+1, +2と+(位置)のように入れることである。ただ、これで一応情報は入れてるが、うまく学習してもらえるのはやはり難しい。

そして、Transformerでは、単純に何番目なのかを追加するよりも、三角関数を利用したベクトルを作り、それを本来の入力に加算をしたあとにMulti-Head Self Attentionを行うことで、数学的に高次元に拡張したのでより容易にSelf-Attentionに位置情報付きの前提で学習できるように仕向けている

Positional EncodingのQiita解説はこちら: https://qiita.com/snsk871/items/93aba7ad74cace4abc62

いずれ自分でもまとめてみる。

外部記憶

RNNの中では短期記憶にとどまってしまう。それを長期的に保持するためにLSTMは別に1つ用意したが、それを拡張して外部記憶のようなDBのようにアクセス専用のものを考えてみよう。

人間の脳で記憶は1つの場所においてるのではなく、広いところに少しずつ置かれているらしい。

そして、人間は

  • Working Memory 臨時で覚えるもの。何に使われているかまで覚えている。容量は一番少ない。
  • Short-Term Memory 短期的に覚えるもの。容量はちょっと多い。
  • Long-Term Memory 長期的に覚えるもの。容量はかなり多い。短期記憶から長期への遷移はEvolutionという。

また、記憶に関しては関係性によって記憶を覚えており、人のことを思い出したら顔や声などが思い返されるというようなものである。

LSTMの長期記憶と比べると、人間の長期記憶はより多くの情報を保存できるうえ、更新されることはあれど、自身を使って他の短期記憶などを更新することはない。

Memory Augmented Neural Network(MANN)

外部記憶という追加の情報を保存する部分を作ることで、ネットワークの記憶能力を増大させる。外部記憶M=[m1,,mN]M=[\mathbf{m}_1, \cdots, \mathbf{m}_N]について、Soft Attentionを行うことで、必要な情報を引き出すことができる

これを利用して3つの典型的なMANNがある。

  • End-To-End Memory Network
  • Neural Turing Machine

End-To-End Memory Network

読み取り専用の外部記憶とする。M=[m1,,mN]M=[\mathbf{m}_1, \cdots, \mathbf{m}_N]に対して、Attentionに使われるKeyはK=[k1,]K=[\mathbf{k}_1, \cdots ]であり、ValueはV=[v1,]V=[\mathbf{v}_1, \cdots ]とする。これは何かしらMMからいい感じに生成する。

入力x\mathbf{x}に対して、Queryのq\mathbf{q}をメインネットワークが生成する。そして、Attentionを行い得たr\mathbf{r}をもとに、以下のように計算したかったラベルを得る。

y=f(q+r)\mathbf{y} = f(\mathbf{q} + \mathbf{r})

これは非常にシンプルな例であるが、次式のように何度もQuery Vectorを更新してその都度Attentionを行ってもよい。

Image in a image block

これをMulti-Hopという。毎回AttentionするK,VK, Vは同じものでもよいし、別々のものでもよい。同じくMMから生成されたものであればそれでよい。

Neural Turing Machine

チューリングマシンの説明は省略。気持ちとしては外部記憶をTuring Machineのようにすることで、書き込みや読み取り両方できるようにしたい。

コントローラーと外部記憶という2つの部分からなる。

外部記憶はMRD×NM \in \mathbb{R}^{D \times N}と定義される。DDは各記憶の次元数で、NNは記憶の個数。

コントローラーはDNNかRNNで実現する。

  1. コントローラーは今の入力xt\mathbf{x}_t、1つ前の出力ht1\mathbf{h}_{t-1}と1つ前に外部記憶から読み取ったrt1\mathbf{r}_{t-1}を入力し、今の出力ht\mathbf{h}_tを得る。
ht=f(xt,ht1,rt1)\mathbf{h}_t = f(\mathbf{x}_t, \mathbf{h}_{t-1}, \mathbf{r}_{t-1})
  1. ht\mathbf{h}_tを出力するのと同時に、検索Vectorqt\mathbf{q}_t、削除Vectoret\mathbf{e}_t、増加Vectorat\mathbf{a}_tht\mathbf{h}_tより生成する・
    1. qt\mathbf{q}_tはAttentionに使い、rt\mathbf{r}_tを得る。これは既存のAttentionであり、読み取り操作にあたる。
    2. 新しいのは、書き取り操作を実現するための削除、増加Vectorもあるということ。(LSTMのGateをより複雑な層で実現した形)
    3. αn,t\alpha_{n,t}nn個目の記憶へのAttentionの重みだとする。以下のように削除したいet\mathbf{e}_tと、新たに加えたいat\mathbf{a}_tを使って更新していく。
    mt+1,n=mt,n(1αt,net)+αt,nat\mathbf{m}_{t+1, n} = \mathbf{m}_{t,n}(1 - \alpha_{t,n} \mathbf{e}_t) + \alpha_{t,n} \mathbf{a}_t

Neurodynamicsに基づくAssociative Memory Model

Associative Memory Model=入力された情報から関連する情報を呼び出すためのモデル。

不完全な情報、ノイズのある情報でも連想ができるのが望ましい。

Hopfield Network

隠れ層がなく、自分の出力が自分を含む次の入力に全部使われる再帰的なネットワーク

Image in a image block

離散版だと以下のように更新できる。重みはwij=wji,wii=0w_{ij}=w_{ji}, w_{ii}=0が成り立つ。

更新のやり方として、各ニューロンがランダムに1つ1つ更新されていくものと、同時にst=f(Wst1+b)\mathbf{s}_t =f(W \mathbf{s}_{t-1} + \mathbf{b})で一気に更新するのがある。違いとしては、1つ1つ更新だと次のニューロン更新にさっそく今更新したsi\mathbf{s}_iが使われているが、一気に更新だとすべて古いものを使うということ

この各状態について、HopField Networkはエネルギー関数というものを定義できる。これをIterationしていくと収束することは保証されている。

Image in a image block

収束した先はエネルギー関数の局所最適解で、Attractorという。複数のAttractorを持つ=複数のパターンを持つ、Attractorへたどり着く動きは検索といえる。Noiseがあっても同じAttractorへ収束すればいいというのは結構都合がいい性質。