「注意 シンクとキャッシュの配置場所 – ストリーミングLLM実装のビジュアルガイド」
「シンクとキャッシュの配置場所を注意する - ストリーミングLLM実装のビジュアルガイド」
最新のAI論文の中でも注目を集めるのは、テキスト生成のためのGenerative Pre-training Transformer(GPT)モデルアーキテクチャにおいて、効率的かつ無制限のコンテキストウィンドウを実現する手法です。これは、「注意の溜まり場」という発見を活用することで実現されます。「注意の溜まり場」とは、次のトークンの予測(自己回帰)において、最初のトークンがテキストの表現を作るためのセルフアテンションの大部分を担っていることです。これはFine-tuningを必要とせず、GPTアーキテクチャへの最小の修正のみが必要なため、非常に実用的です。この記事では、それらの修正が詳細レベルでどのようなものかに焦点を当てており、実際の実践方法に関して理解できるようになることを目指しています。
なぜこれが重要なのかを思い出すために、通常のLLMでは、コンテキストの長さが長くなればなるほど、次のトークンを生成するためのメモリと処理時間が指数的に増加します。さらに、多くのモデルは実際には非常に長い入力には対応していないため、入力が長くなると性能が低下します。モデルが次のトークンを生成するたびに、ウィンドウの長さが増えていきます。GPTが本の結末を書くと想像してみてください。モデルが自身の書いたすべての内容を理解するためには、非常に長いコンテキストウィンドウを保持する必要があります。そうしなければ、本の結末にはすべてのプロットの詳細が含まれていない可能性があります。
論文:
この記事の残りの部分は、単に手法を正当化したり結果を検証するのではなく、実際の手法に焦点を当てています。手法に関する論文内の実際のテキストは比較的少ないです。基本的には、いくつかの「注意の溜まり場」を選び、その後のトークン埋め込みのキューを固定サイズにします。各イテレーションでは、次のトークン埋め込みを生成する際に、溜まり場の埋め込みを保持し、キューの末尾のトークンの埋め込みを破棄します。
- 機械学習における公平性(パート1)
- 「2/10から8/10までの週のトップの重要なコンピュータビジョン論文」
- 新しいAmazon KendraのWebクローラーを使用して、ウェブにクロールされたコンテンツをインデックス化します
では、実際の例を挙げて説明します。
えー、とりあえずこれは一部の入力です
そして、注意の溜まり場が3つあり、最大トークン長がわずか7であるとします。最初に、すべてのトークンをレイヤーに通して7つのトークン埋め込みを生成し、8番目のトークンを生成しに行きます。次のトークンとして「テキスト」を生成するとしましょう(太字は次に破棄されるトークンです)。
[えー、とりあえず、これは、一部です] → “テキスト”
次のイテレーションでは、キューをスクロールし、溜まり場の直後に発生するトークンを破棄します。
[えー、とりあえず、これは、これは、それは] → “です”
これを繰り返し行います。
[えー、とりあえず、これは、それは、です、それに] → “かのように”
もう一つ覚えておくべきことは、位置埋め込みが前に進まないことです。つまり、各イテレーションでトークンに関連付けられた位置埋め込みは変わります。
可視化の詳細
計算手順は、ノードグラフの可視化ツールを使用して視覚的に表示されます。各ブロックは、左側の入力からデータを受け取り、右側の出力変数のデータを生成する操作です。リンクは、データの出力から入力への受け渡しを示し、入力の円はデータが静的であることを意味します。
操作は、「unbox」アイコンを持つ合成または、それ以上分解できないものであるプリミティブのいずれかです。合成操作は、親の入力を使用し、親の出力に対応する出力を生成するサブグラフに分解されます。プリミティブ操作は、NumPyやTensorFlowのような低レベルのテンソル操作に対応し、さらに分解することはできません。色はデータのタイプを示し、パターンはデータの形状を示します。青は整数のデータタイプ、紫/ピンクは浮動小数点数のデータタイプを意味し、緑はテキストを示します。実線のリンクは、データの形状がスカラーであることを示し、リンク内の点は配列の次元数を示します(ダッシュ間のドットの数)。各グラフの一番下には、モデル内でデータを持つ変数の形状、タイプ、および操作名を特定する表があります。
以前の投稿で可視化をカバーして、GPT Fully VisualizedとBERT Fully Visualizedのための参照マップを作成し、Graph Attention Networks、LoRA fine-tuning method、およびBERTScoreについてのビジュアルウォークスルーも行いました。
ビジュアル化された実装
実装に入ってみましょう。以下に表示されているのは、ループの開始です。各反復で、次のトークンとこれまでの連結トークンがあります。GPTには次の新しいトークンのみを渡します。各レイヤーでキャッシュされた埋め込みを読み取り、書き込みます。これは効率的にするための実装のトリックであり、各新しい反復で、最新のトークンのために埋め込みを取得する必要があるだけです。
さらに進む前に、モデルのいくつかのハイパーパラメータ(グローバル変数)を調べてみましょう。グローバル定数は、グラフ内で静的な値です。
GPT-2の重みを含むパブリックデータベースから読み取り、指定されたディレクトリパス”gpt_2_rolling_cache”にキャッシュします。これらのキャッシュパスは、メモリ内にあるモデルパラメータなど、すべての重みと関数のパラメータを格納するために使用されます。
注意してください。注意シンクの数を3トークンに設定し、最大トークンを7に設定しています。これは、1回に処理するトークン数を7以上に制限することを意味します。これはかなり短いですが、例です。通常、この小さなGPT-2モデルの元のコンテキストの長さに一致するはずで、32です。次のトークンを処理するたびに、注意シンクの途中に最初にキャッシュされたトークンを削除し、合計して各反復で注意シンク3つと最後の4つのトークンのみを見ることになります。
しかし、「トークンを見る」というと、具体的にはどういう意味でしょうか?層に詳しく見てみましょう。まず、レイヤー0だけを見てみると、アーキテクチャ内の現在位置をたどることができます。ここでは、キーと値の重みのための密な投影層を取得しています。
キーローリングキャッシュの中で、キャッシュから重みを読み取っています。条件付きブロック内にあることに注意してください。そのため、ループの最初の反復では、読み取らずにキャッシュに書き込むだけです。キャッシュには、前回の反復でのトークン埋め込みが含まれています。埋め込みの形状は[1、12、7、64]です。
- 次元0はバッチのサイズ(1)に対応しています。
- 次元1はアテンションヘッドの数(12)に対応しています。
- 次元2はトークンの数(7)に対応しています。
- 次元3は非表示のサイズ(768)をアテンションヘッドの数(64)で除算したものです。
読み込み元のリンクは、入力トークンにのみ関連しています。例のループの最初の反復では、[1、12、7、64]、およびそれ以降の反復では次のトークンのみ([1、12、1、64])で実行されます。まず、アテンションシンク(次元2の上)を分割し、新しい埋め込みを次元2軸に沿って連結します。アテンションシンクの重みは連結されるため、進んでいきます。削除するブロックでは、キューの末尾から1つまたは複数のトークンを削除します。
エビックトブロック内で、次元2の先頭からいくつのトークンエンベッディング(すなわち、エビクト、エビクトの方が良いという意味です)をスライスするかを計算しています。一般的に、新しいトークンごとに1つのトークンがエビクトされます。
最後に、結果を注意のシンクエンベッディングと連結してパスフォワードします。Self Attention操作内でQuery Key Valueレイヤーを取得する際には、各レイヤーに対してキーと値のウェイトも同様に行います。
最後に残っているのは、位置エンコーディングです。 “Create Position IDs”ブロック内で、位置エンベッディングのロジックを更新できます。ロジックは比較的シンプルです。トークンの長さにまだ達していない場合は、次のトークンの位置エンベッディングを増やし、そうでない場合は同じ位置エンベッディングを取得します。
例として、GPT-2をローリングキャッシュなしで比較し、ローリングキャッシュを使用して20のトークンを生成する場合を検討します。先程の例「Hmm okay this is some input text」から始まります。これはまだ短い文章であり、ローリングキャッシュはほとんど必要ありませんが、それが機能していることを示しています。
ローリングキャッシュなしのGPT2:
ローリングキャッシュありのGPT2(最大7つのトークンと3つの注意シンク):
予想通り、異なっていますが、どちらの方が良いですか?
お読みいただきありがとうございます!完全なグラフはGithubで利用できるJSONです。何かお気づきの点はありましたか?次にご覧になりたいことはありますか?コメントでお知らせください!
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles