Attention might be something you need
Kashima
その高い性能で、自然言語処理を中心に猛威を振るうトランスフォーマー。「Attention is all you need (注意機構しか勝たん)」と題された論文において、注意機構はトランスフォーマーの中心的な役割を担う存在として用いられたことで一躍注目を浴びた。トランスフォーマーは翻訳問題などの系列変換(sequence-to-sequence)問題を始めとする様々なタスクで成功を収め、最近では「とりあえずトランスフォーマー」的なノリで、トランスフォーマーを使ったらSoTA達成みたいな話で盛り上がっている(と思う)。
歴史的には、もう少し前から注意機構は用いられており、同じく系列変換問題に対して用いられたRNNが出力を生成するのに際し、入力のどの箇所に「注意」を向けるかを制御する機構として導入された(と思う)。ちなみに、このRNNは入力系列の全体を一旦読み込み、入力系列の意味を内部状態として保持してから、これをもとに出力系列全体を生成するという「ししし自然言語処理の人たち、深層学習出てきたショックで記憶失っちゃったの??」的モデルであったのだが、案の定それだけではうまくいかず、これを何とかするために出てきたのが注意機構であった(と思う)。
いずれにしても、その生い立ちが系列モデルであったことから、注意機構は系列モデリングの文脈で語られることが多い(と思う)し、系列性が本質であると考えている人も多い(と思う)。最近では画像などに対しても成功を納めているようであるが、画像もまたある種の2次元系列であり、系列と同様に、要素間の局所的な隣接関係をもつものである。しかし、後に述べるように、本来系列データであることと、注意機構の間には何の関係もない。それどころか、系列であることを一旦捨てておきながら、局所的な関係をデータから改めて学びなおすという、大変スジの悪いことを行っているともいえる。さらに、系列データを前提とした注意機構の導入は、その本質をミスリードする。以下では、トランスフォーマーとか何とかのことは一旦忘れて、注意機構とは一体何であるかについて紹介する。
一般に、ニューラルネットワークは、入力として入ってくるデータ(ベクトル)に対して、何らかの処理を行い、その結果を出力する機械である。
ニューラルネットワークは、あるベクトルを別のベクトルに変換するユニット(ここでは「層」と呼ぶことにする)を部品として用い、これらを多数連結することで、様々な複雑な処理を実現している。たとえば、全結合層は、ベクトルを他のベクトルに変換する線形変換である。活性化層では、ベクトルの各次元に、シグモイド関数やReLU関数などの非線形関数を施す。CNNなどで用いられる畳み込み層では入力を局所的に積算し、プーリング層はベクトルの要素の最大値や平均値を出力する。いずれにしても、ニューラルネットワークの層は、次元のベクトルを、別の
次元のベクトルに変換するものである。
よくあるニューラルネットワークの層(全結合層や非線形変換)
入力のタイプや、これに対して行いたい処理に応じて、様々な種類の層を適用することで、所望の出力を構成する。
翻って、自己注意機構は、このようなニューラルネットワーク層の一種であり、ひとことでいえば、ベクトルの(多重)集合を入力とするような層である:
(1) |
注意層は、ベクトルの集合が入力すると、それぞれを更新したもの
を出力する。
通常のNN層が単一のベクトルを対象として変換操作を行うものであるのに対して、注意機構ではベクトルの集合をすべて同時に変換するという操作を行う。なお、入力集合に含まれるベクトルの数は毎回異なっていてもよい(上記の例では3個)。3つのベクトルの集合が入力されれば、これが変換された3つのベクトルが出力され、4つ入力すれば4つ出てくる。つまり、
ベクトルの集合を見たらいつでも注意機構を(無邪気に)入れられる。 |
のだ。以上の説明において、入力の系列性などは全く仮定されていないことに注意してほしい。入力の順序を変えても、それに合わせて出力の順序も変わるだけである。
以下では(自己)注意機構の動きを見ていく。まずはもっとも単純なものを考え、つづいて、これに学習可能パラメータを導入していくという順で話をすすめる。
注意機構は、番目のオブジェクト(のベクトル表現)
を、他のオブジェクト
のベクトル
を使って更新する。そのさい、オブジェクト
間の「注目度」(オブジェクト
がオブジェクト
に注目する度合い)を
として、
(2) |
によって、 オブジェクトの表現を書き換える。更新式(2)を、全てのオブジェクトについて同時に適用することで、全てのオブジェクトのベクトルが(同時に)更新される。
「くま」の表現 が、他のオブジェクトの表現ベクトル(「りんご」
と「うさぎ」
リンゴ)の重み付き和に置き換えられる(式(2))。なお、この図では、表記上の簡便さをとって、くまが自分自身の影響は受けない(=自己ループの→はない)ように描かれているが、実際にはオブジェクト
が自分自身の影響
を受けてもよい(というか、受ける。)
この操作によって、一体なにが起きるのか。注意機構では、入力オブジェクトそれぞれのベクトル表現が、集合に含まれる他のオブジェクトに影響を受けて更新される。つまり、同じオブジェクトでも、一緒に入力される他のオブジェクトによって異なる表現になる。イメージとしては、チーム(集合)における自分の役割に応じた表現を得ることになる。たとえば、スポーツのチームにおいて、他のチームメンバーが守備寄りの特徴をもっていてば自分は攻撃寄りの役割を、そうでなければ守備寄りの役割を担う、といった具合である。図の例だと、森の仲間(りんご、くま、うさぎ)で、くま(捕食者)は、うさぎ(獲物)が同じチームにいると大層やる気がでるみたいな。
更新式(2)で出てきた注目度の定義は、オブジェクト
間の類似度
が与えられているとして、これを用いて
(3) |
と定義される。指数をとって総和で割る操作は、オブジェクトに対する注意が正の値をとり、かつその総量が
となるように正規化していることに相当する。
では、肝心の類似度の定義はどうするかであるが、たとえばオブジェクト表現の内積:
| (4) |
によって定義するなどが考えられるだろう。つまり、オブジェクトの表現の更新の際には、より似ているオブジェクト(
が大きいオブジェクト
)から、より大きな影響を受けることになる。
さて、前の節で定義した操作においては、何をもって似ているとするか(4)は決め打ちである。そこで、類似度の定義に学習できるパラメータを入れることで、データに合わせて類似度を学習できるようにしよう。
類似度(4)にパラメータを導入する方法としては、たとえば、マハラノビス距離を知っている人は、真ん中にあるあの行列のノリで、
(5) |
などとできるだろう。ここで、はパラメータ行列である(対称である必要はない)。
ところで、は行列なので、入力ベクトルのサイズの2乗個のパラメータをもつ。これはちょっと多い気がする。こういうときは、機械学習神の教え(「行列をみたら分解せよ」)に従い、
は低ランク行列であるという仮定を入れる。つまり、
(6) |
とすることで、パラメータ数を減らす。(と
は薄いパラメータ行列)
ついでに、更新式(2)によって、他オブジェクトの影響を受けてオブジェクトのベクトル表現を更新する際にも、パラメータを入れて
(7) |
としてもよいだろう。ここで、はパラメータ行列である。
上記の設定は、まさにトランスフォーマーなどで使われている自己注意機構に(概ね)あたる。
グラフニューラルネットワーク(GNN)は、グラフの頂点のベクトル表現を得るものである。GNNにおいて、各頂点のベクトル表現は、この頂点に隣接する頂点のベクトル表現を用いて更新される。これを注意機構として見ると、注目度を、頂点
間に辺があるときに
、辺がないときに
というように簡単に決めていると見ることができる。
なお、GNNにおいても注意機構を導入したもの(GAT)があるが、これは辺のある頂点間でのみ、上記の自己注意機構の更新操作を適用するというものである。
前述した自己注意機構は、ひとつの(多重)集合の要素が、お互いを見ながら相互に表現を書き換えるものであった。これをふたつの(多重)集合に一般化すると、各オブジェクトの表現を、反対側の集合の要素を見ながら表現を書き換えるようになる。
2つの集合 {リンゴ, バナナ} と {うさぎ, くま, いぬ} に対する注意機構の適用。
りんごは、反対側の集合の要素(うさぎ、くま、いぬ)からの影響を受ける。
これが一般的な注意機構である。逆に言えば、2つの集合を同一の集合にとった特殊ケースが自己注意機構だといえる。
まとめよう。自己注意機構は、多重集合に対するNN層である。 (Deep Set の上位互換だと思ったらよい。) したがって、複数の(同次元の)ベクトルの集合があるときには、いつでも自己注意機構の適用が検討できることになる。たとえば、文書を単語袋(bag-of-words)として捉えたときの、単語のベクトル集合はまさにこれにあたる。
トランスフォーマーなどにおいて、系列データに対して用いる際は、入力ベクトルに位置情報を付加して入力する。もともと注意機構自身は、集合に対する操作であるため、集合内における各要素の位置などという概念はない。そのため、わざわざ位置情報を付加しているということになる。ただし、「1番目の位置」「2番目の位置」などという情報を付加したところで、これ自身は単なる記号にすぎない。「1番目の位置」と「2番目の位置」が隣同士であることは、たくさんデータを見て自分で勉強してください、というスタンスである。
最後に紹介した一般的な注意機構は、ベクトルの集合が2つあるときに適用できる。ベクトルの次元は2つの集合で異なっていてもよい。2つの集合があるといえば、推薦問題(ユーザ集合とアイテム集合)が思い浮かぶ。まあこれはふつうにある気がする。
最後に、注意機構の利用例として、データセット全体に対する注意機構を用いることで、通常は独立性を仮定しているデータ間の関係を捉えようという試み [1]を紹介する。
入力データベクトルの集合を と置こう。通常は、ニューラルネットワークにそれぞれの
が入力され、その予測値が所望の値になるように学習を行う。一方、これを全て、注意層の入力とすることで、関係のある(おそらく近い)データの影響を受けながら、お互いの表現が書き換えられる。
なお、この研究では、入力データに対する注意機構に加え、特徴間の注意機構も導入して、特徴間の関係を捉えるということも行っている。インスタンス・特徴ペアの表現を、特徴間の注意機構で書き換えている。
左はデータ点の間での注意機構による書き換え、右は特徴間での注意機構。元論文だと、データ点の場合と特徴の場合で、注意機構をかける範囲が微妙に違うのだが、イメージは大体これでイイと思う。
このように考えると、注意機構って、ほぼほぼ入力集合のデータ行列を行列分解しているようなものだとも言える(CUR分解に近い感じかな)。
[1] Self-Attention Between Datapoints: Going Beyond Individual Input-Output Pairs in Deep Learning. Kossen et al. (University of Oxford), ArXiv, 2021.