.. _sec_queries-keys-values: クエリ、キー、値 ================ これまでに見てきたネットワークはすべて、入力が明確に定義されたサイズであることに本質的に依存していた。たとえば、ImageNet の画像は :math:`224 \times 224` ピクセルであり、CNN はこのサイズに特化して調整されている。自然言語処理においてさえ、RNN の入力サイズは明確に定義されており固定である。可変サイズへの対応は、1トークンずつ順に処理するか、あるいは特別に設計された畳み込みカーネルによって行われる :cite:`Kalchbrenner.Grefenstette.Blunsom.2014`\ 。この方法は、入力が本当に可変サイズであり、しかも情報量もさまざまである場合、たとえば :numref:`sec_seq2seq` におけるテキスト変換 :cite:`Sutskever.Vinyals.Le.2014` のような場合には、重大な問題を引き起こし得る。特に長い系列では、ネットワークがすでに生成したもの、あるいは見たものすべてを追跡し続けることが非常に難しくなる。:cite:t:`yang2016neural` が提案したような明示的な追跡ヒューリスティックでさえ、得られる利点は限定的である。 これをデータベースと比べてみよう。最も単純な形では、データベースはキー (:math:`k`) と値 (:math:`v`) の集合である。たとえば、私たちのデータベース :math:`\mathcal{D}` は、{(“Zhang”, “Aston”), (“Lipton”, “Zachary”), (“Li”, “Mu”), (“Smola”, “Alex”), (“Hu”, “Rachel”), (“Werness”, “Brent”)} というタプルからなり、姓がキーで名が値だとする。\ :math:`\mathcal{D}` に対して操作を行うことができ、たとえば “Li” に対する厳密なクエリ (:math:`q`) を与えれば、値 “Mu” が返される。もし (“Li”, “Mu”) が :math:`\mathcal{D}` のレコードでなければ、有効な答えは存在しない。近似一致も許すなら、代わりに (“Lipton”, “Zachary”) を取得することになる。この非常に単純で自明な例であっても、私たちはいくつかの有用なことを学べる。 - データベースサイズに依存せず有効であるように、(:math:`k`,\ :math:`v`) ペアに対して動作するクエリ :math:`q` を設計できる。 - 同じクエリでも、データベースの内容に応じて異なる答えを返しうる。 - 大きな状態空間(データベース)に対して動作するための「コード」は、かなり単純でよい(たとえば、厳密一致、近似一致、top-:math:`k`\ )。 - 操作を有効にするために、データベースを圧縮したり単純化したりする必要はない。 もちろん、ここで単純なデータベースを持ち出したのは、深層学習を説明するためである。実際、これは過去10年の深層学習で導入された最も刺激的な概念の一つ、すなわち *注意機構* へとつながる :cite:`Bahdanau.Cho.Bengio.2014`\ 。その機械翻訳への応用の詳細は後で扱う。ここでは、次のことだけ考えよう。\ :math:`\mathcal{D} \stackrel{\textrm{def}}{=} \{(\mathbf{k}_1, \mathbf{v}_1), \ldots (\mathbf{k}_m, \mathbf{v}_m)\}` を、\ *キー* と *値* の :math:`m` 個のタプルからなるデータベースとする。さらに、\ :math:`\mathbf{q}` を *クエリ* とする。このとき、\ :math:`\mathcal{D}` 上の *attention* を次のように定義できる。 .. math:: \textrm{Attention}(\mathbf{q}, \mathcal{D}) \stackrel{\textrm{def}}{=} \sum_{i=1}^m \alpha(\mathbf{q}, \mathbf{k}_i) \mathbf{v}_i, :label: eq_attention_pooling ここで :math:`\alpha(\mathbf{q}, \mathbf{k}_i) \in \mathbb{R}` (:math:`i = 1, \ldots, m`) はスカラーの注意重みである。この操作自体は通常、\ *attention pooling* と呼ばれる。\ *attention* という名前は、重み :math:`\alpha` が大きい(すなわち重要な)項に特に注意を払うことに由来する。このように、\ :math:`\mathcal{D}` 上の attention は、データベースに含まれる値の線形結合を生成する。実際、これは上の例を、1つを除くすべての重みが0である特殊ケースとして含んでいる。いくつかの特殊ケースがある。 - 重み :math:`\alpha(\mathbf{q}, \mathbf{k}_i)` が非負である。この場合、注意機構の出力は、値 :math:`\mathbf{v}_i` が張る凸錐の中に含まれる。 - 重み :math:`\alpha(\mathbf{q}, \mathbf{k}_i)` が凸結合をなす、すなわち :math:`\sum_i \alpha(\mathbf{q}, \mathbf{k}_i) = 1` かつすべての :math:`i` について :math:`\alpha(\mathbf{q}, \mathbf{k}_i) \geq 0` である。これは深層学習で最も一般的な設定である。 - 重み :math:`\alpha(\mathbf{q}, \mathbf{k}_i)` のうちちょうど1つだけが :math:`1` で、他はすべて :math:`0` である。これは従来のデータベースクエリに似ている。 - すべての重みが等しい、すなわちすべての :math:`i` について :math:`\alpha(\mathbf{q}, \mathbf{k}_i) = \frac{1}{m}` である。これはデータベース全体にわたる平均化に相当し、深層学習では average pooling とも呼ばれる。 重みの総和を :math:`1` にするための一般的な戦略は、次のように正規化することである。 .. math:: \alpha(\mathbf{q}, \mathbf{k}_i) = \frac{\alpha(\mathbf{q}, \mathbf{k}_i)}{{\sum_j} \alpha(\mathbf{q}, \mathbf{k}_j)}. 特に、重みを非負にもするためには、指数関数を用いることができる。これは、任意の関数 :math:`a(\mathbf{q}, \mathbf{k})` を選び、それに対して多項モデルで用いられる softmax 演算を次のように適用できることを意味する。 .. math:: \alpha(\mathbf{q}, \mathbf{k}_i) = \frac{\exp(a(\mathbf{q}, \mathbf{k}_i))}{\sum_j \exp(a(\mathbf{q}, \mathbf{k}_j))}. :label: eq_softmax_attention この操作は、すべての深層学習フレームワークで容易に利用できる。これは微分可能であり、その勾配は決して消失しないため、モデルにとって望ましい性質を備えている。ただし、上で導入した注意機構が唯一の選択肢というわけではない。たとえば、強化学習手法を用いて訓練できる非微分可能な注意モデルを設計することもできる :cite:`Mnih.Heess.Graves.ea.2014`\ 。予想されるように、そのようなモデルの訓練はかなり複雑である。そのため、現代の attention 研究の大部分は :numref:`fig_qkv` に示した枠組みに従っている。したがって、ここではこの微分可能な機構の系列に焦点を当てる。 .. _fig_qkv: .. figure:: ../img/qkv.svg 注意機構は、クエリ :math:`\mathbf{q}` とキー :math:`\mathbf{k}_\mathit{i}` の適合度に基づいて重みを決め、attention pooling を通じて値 :math:`\mathbf{v}_\mathit{i}` の線形結合を計算する。 非常に注目すべきなのは、キーと値の集合に対して実行する実際の「コード」、すなわちクエリが、操作対象となる空間が大きいにもかかわらず、かなり簡潔でありうることである。これは、学習すべきパラメータが多すぎないという点で、ネットワーク層にとって望ましい性質である。同様に便利なのは、attention が、attention pooling のやり方を変えることなく、任意に大きなデータベースに対して動作できることである。 .. raw:: html