Transformerにおいて、入力トークン数が増えるとエンコーダ側はn²のオーダーで処理時間が増えるのに対して、デコーダ側はnのオーダーでしか増えない。なのでエンコーダ側の処理を減らしたい。

ある種のユースケースではプロンプトは前提知識となる部分とメインの質問部分からなり、前提知識となる部分は毎回同じ値が渡されて同じようなエンコード結果になる(要検証)。そのため前提知識部分が事前処理できるとパフォーマンスの向上が期待できる。

案1: エンコーダの最初の方の層ではself-attentionを計算するときに、全トークンではなく比較的近くのトークンのみに対して重みを計算するようにする(それ以外については重み0)。また、最初の方の層では前提知識部と質問部の間では重みは常に0とする。その上で前提知識部分について途中の層まで事前計算しておく。

案2: 質問部分のトークンのself-attentionを計算するときは前提知識部分のトークンとの重みを計算するが、前提知識部分のトークンのself-attentionを計算するときは質問部分のトークンとの重みは計算しない(重み0)とする。その上で前提知識部分について事前計算をしておく。途中の層の結果も保持しておく。

案1は重みを計算する範囲を絞ること自体でも計算量を減らせる。一方能力としては落ちる可能性がある(要検証)。最初の方の層の計算結果を捨てられる。最後の方の層については依然として事前知識部分を含めたn²のオーダーで処理が増える。

案2は最初の方の層のうちから前提知識を使えるようになる。一方、トークン間の重みが非対称になる。これはどのような影響を与えるだろうか。

Reply to this note

Please Login to reply.

Discussion

GPTはdecoderのみのtransformerらしいので、入力の前半のみ事前処理しておくとかできそう。

こういうのはprefix tuningというらしい。

https://arxiv.org/abs/2101.00190