HN 日本語サマリー

← 一覧へ戻る
AI・機械学習

DeepSeek-v4.1 Flash: KVキャッシュ圧縮の限界を押し広げる

DeepSeek-v4.1 Flash: Pushing the Limits of KV Cache Compression (zartbot.github.io)

109 pointsby mfiguiere8 コメント

要約

DeepSeek-v4.1 Flashは、KVキャッシュ圧縮を極限まで追求した大規模言語モデルです。長大なコンテキスト処理とツール呼び出しによる計算負荷増大という課題に対し、モデルアーキテクチャの最適化、特にKVキャッシュの圧縮とPrefill計算の効率化に注力しています。これにより、KVCacheストレージを4倍に圧縮しつつ、高いタスク完了品質を維持しています。

全文翻訳

DeepSeek-V4.1 Flash: KVキャッシュ圧縮の限界を押し広げる

TL;DR

DeepSeek-V4.1 Flashがリリースされたとき、私は単なるポストトレーニングのイテレーション版かと思っていました…しかし、しばらく使ってみると、速度が毎秒約420トークンに達し、その後CuiがすべてのDeepSeek-V4 Proモデルをオフラインにするという話を聞きました…突然、これは大したことではないと感じました…技術レポート《DeepSeek-V4.1-Flash: Pushing the Limits of KV Cache Compression》[1]が完全にリリースされるまで、私はこれがDeepSeek-V5 Flashと呼ばれるべきだと気づきませんでした。

論文のタイトルが示すように、DeepSeek-V4.1 Flashの目的はKVCache圧縮を極限まで押し広げることです。主な理由は、長期間にわたるエージェントワークフローがコンテキストをますます長く成長させ、さまざまなツール呼び出しが重いプレフィル計算圧力をもたらすことです。HBMおよび外部SSDにおけるKVCacheのストレージ圧力は非常に高く、これらすべてがスケーリングを不可能にする理由です。したがって、モデルアーキテクチャに一連の最適化が施され、特にKVCacheの圧縮とPrefillの計算最適化に重点が置かれました。

  • プレフィル計算の最適化: YOCOから着想を得て、モデル全体は40層ですが、プレフィル中は20層のみが必要です。したがって、プレフィルでアクティブ化されるパラメータは8Bのみで、デコードでアクティブ化されるパラメータは16Bです。

  • KVCache圧縮: エンジニアリング的には、KVCache圧縮はいくつかの次元に分けられます。GQAに類似したヘッド数圧縮、CSAのようなブロックベース圧縮、そしてこの論文のCSA2によるクロスレイヤー圧縮です。同時に、スパースアテンションのインデクサー計算も最適化されています。最後に、数値精度に関する最適化がいくつかあります。例えば、DS41FはFP4 KVCacheを採用しています。

最終的に、モデルの高品質なタスク完了を維持するという前提の下で、KVCacheはさらに4倍に圧縮されます。

[画像]

さらに、論文の元の記述はやや複雑で、特にCEDの説明はそうです。実際、KVCacheを中心に、コンピュータアーキテクチャの視点を組み合わせて図を再描画すると、すべてが明確になるようです。これは一種の再帰的Transformerアーキテクチャと見なすことができ、再帰プロセス中にQを変更しKVを再利用する方法です。

[画像]

再帰的Transformerアーキテクチャについては、《On the Future Transformer: Loops Are Not What You Need》を参照してください。次に、技術レポートの章立てに従って詳細な解釈と分析を行います。この記事はそのシリーズの最初のもので、モデルアーキテクチャを詳細に分析しており、より重要な内容は第3章にあります。

1. 概要

1.1 なぜKVCache圧縮が必要なのか

まず、レポートでは、近年、長期間にわたるエージェントが超長コンテキスト処理をますます重要なモデルワークロードにしていると述べています。この種のワークロードをサポートするには、長いシーケンスの効率的な処理だけでなく、大規模なKVCacheの永続的な保存、再利用、転送も必要です。したがって、KVCache管理はモデル展開の基本的な機能となっていますが、計算、ストレージ、通信において大きな課題をもたらしています。

次に、DeepSeek-V4アーキテクチャを紹介します。これは、コンテキストを完全にカバーするスパースアテンションと、ローカルウィンドウをカバーするスライディングウィンドウアテンション(SWA)を組み合わせて処理します。スパースアテンションに関連する進歩は、長シーケンス処理の計算コストを大幅に削減しましたが、永続的なストレージとデータ移動が徐々に顕著なボトルネックになっています。長コンテキストでは、グローバルKVキャッシュの使用が支配的になり、プレフィックスの再利用のために永続化されるため、ホストメモリ容量とSSD容量を大きく占有し、KVCache移動のための相互接続帯域幅にも高い要求を課します。これらはサービスのスループットを制限し、展開コストを増加させ、最終的にはエージェントのより長いタスクスパンとより広いアプリケーションシナリオへの展開と普及を妨げます。

したがって、キーバリューキャッシュのフットプリントをさらに削減することは、ストレージと通信のボトルネックを緩和し、長コンテキストサービングコストを削減するために非常に重要です。 DeepSeek-V4.1-Flashは、より積極的なKVCache圧縮のために設計されたマルチモーダル混合エキスパートモデルです。DeepSeek-V4.1-Flashは552Bのパラメータ規模を持ち、ネイティブでマルチモーダル入力をサポートし、最大100万トークンのコンテキストをサポートします。これは、Causal Encoder-Decoder(CED)アーキテクチャを採用しており、デコーダーのグローバルKVCacheはエンコーダーの最終隠れ状態を投影することで取得されます。この設計により、モデルはプレフィルステージでトークンあたり8Bのパラメータ、デコードステージで16Bのパラメータをアクティブ化します。これは、入力主導型のエージェントシナリオで特にコスト効率が高いです。 DeepSeek-V4.1-FlashはDeepSeek-V4-Flashよりも大幅に大きいですが、同じシーケンス長では、必要なランタイムKVCacheストレージは後者の約1/4、永続KVCacheストレージは後者の約1/8にすぎません。さらに、DeepSeek-V4.1-Flashの全体的なパフォーマンスはDeepSeek-V4-Flashを上回っています。

これらのKVCacheの圧縮は、主にモデルアーキテクチャ、キャッシュ精度、および展開戦略の共同最適化から来ています。DSv4はSWAをバックボーンとし、グローバル圧縮アテンション(CSA/HCA)で強化されたモデルです。この観点から、DeepSeekチームは一連の最適化を行いました。まず、HCAのようなブロックベースの高圧縮率構造を放棄し、代わりにCSAにさらなる最適化を施してCSA2を形成したことは注目に値します。主な最適化は、KVキャッシュを3つの次元から圧縮します。

  • チャネル次元では、512次元の潜在ベクトルを使用して、各アテンションヘッドが必要とするキーと値の表現を共有します。
  • シーケンス次元では、エンコーダーはチャネルごとの学習済み重みを通じて2つの隣接する位置を1つのキャッシュエントリにマージしますが、デコーダーは位置ごとのエントリを保持します。
  • レイヤー次元では、複数のレイヤーが同じグローバルKVを共有し、ネットワーク全体はエンコーダーキャッシュの3つのコピーとデコーダーキャッシュの1つのコピーのみを保持します。

FP4量子化と組み合わせると、グローバルメインKVとインデクサーのストレージ増加は、トークンあたり約890バイトです。

1.2 モデルアーキテクチャの概要

モデル全体のアーキテクチャは以下の通りです。

[画像]

論文によると、バックボーンパラメータは約、エングラムパラメータは約、プレフィルおよびデコードでトークンあたりアクティブ化されるパラメータは約およびそれぞれです。コアは、CEDを使用して長コンテキストのプレフィル計算を削減し、CSA2を使用してアテンションとKVキャッシュのオーバーヘッドを削減し、その後エングラム条件付きメモリとDSpark投機的デコードを組み合わせることです。

モデルは合計層、隠れ次元、語彙サイズを持ちます。各層にはアテンションとMoEが含まれており、mHC残差接続を通じて組織化されています。全体のアテンションメカニズムは、エンコーダーとデコーダーの2つのモジュールに分割され、Causal Encoder-Decoder(CED)アーキテクチャを形成します。CEDの鍵は、デコーダーのグローバルKVがエンコーダーの最終表現から取得されることであり、後続のデコーダー層はこれらのKVを共有します。したがって、長いプロンプトのほとんどの位置は、最初の20層のみを通過する必要があります。

その中の鍵となるCSA2は、ローカルスライディングウィンドウ + グローバルスパース検索 + クロスレイヤーKVCache再利用のメカニズムを採用しています。スライディングウィンドウサイズは128、アテンションはQヘッドを使用し、-次元KV潜在空間を共有します。そのうちRoPEは-次元、NoPEは-次元です。Qはランクの低ランク投影を使用し、出力投影はグループに分割され、各グループのランクはです。モデル全体の関連パラメータは次のとおりです。

カテゴリフィールド値意味
バックボーンdim5120隠れ次元
n_layers40最初の20層がエンコーダー、最後の20層がデコーダー
n_mtp_layers3DSparkの3つのSWA-128ブロック
vocab_size129280—
アテンションn_heads64
head_dim512潜在次元
rope_head_dim64RoPEコンポーネント次元、NoPEコンポーネント
q_lora_rank1280
o_lora_rank / o_groups1024 / 8出力投影は8グループに分割され、各グループのランクは1024
window_size128SWAスライディングウィンドウ
CSA2compress_ratios[0,0, 2×18, 1×20, 0,0,0]エンコーダー層の圧縮率は2、デコーダー層の圧縮率は1
kv_source_layers[2,8,14,20]フルモードレイヤー
index_source_layers[2,8,14,20,24,28,32,36]フル+再インデックスモードレイヤー
index_n_heads / index_head_dim32 / 128インデクサーのスケール
index_topk512トップKカウント
candidate_source_layer20候補プール構築レイヤー
candidate_topk_blocks / candidate_block_size2048 / 8候補
RoPEoriginal_seq_len65536
rope_factor16
rope_theta / compress_rope_theta10000 / 160000
MoEn_routed_experts / n_activated_experts384 / 6384中のトップ6
moe_inter_dim2304エキスパート中間次元
score_funcsqrtsoftplussqrtsoftplusを継続使用
route_scale / swiglu_limit1.5 / 10.0—
mHChc_mult4残差ストリーム
hc_sinkhorn_iters20skは20回反復
Engramengram_layer_ids[1, 14]レイヤー1とレイヤー14に注入
engram_num_embeddings[384006168, 384016682]2つのテーブルの行数
engram_max_ngram_size / engram_n_heads4 / 8N-gram次数、8ヘッド
engram_head_dim256、各次数あたりの総埋め込み次元は2048
engram_vocab_size16000000約16Mエントリ
DSparkdspark_block_size5ドラフト
dspark_target_layer_ids[37,38,39]
dspark_n_routed_experts128ドラフトレイヤーは小規模なMoEを使用
Visionvision_n_layers / vision_dim32 / 1024—
vision_patch_size / vision_downsample_ratio14 / 33×3ダウンサンプリング → 9倍のトークン削減
vision_max_n_token1024単一画像あたりのトークン上限

そのうち:

  • mHC: 各トークンは次元の残差ストリームを保持します。残差混合行列は、Sinkhorn反復を通じてほぼ二重確率行列に制約されます。Single-Passの鍵は、前のサブレイヤーによって生成された入力混合係数を使用することです。これにより、現在の係数計算の依存関係が解放され、カーネル融合が促進され、メモリの読み書きが削減されます。

  • DSpark: 追加のSWA-128ドラフトブロック。各レイヤーは、ルーティングされたエキスパートの中からトップ3を選択する小規模なMoEを採用しています。バックボーンネットワークレイヤーのエントリで4つの残差ストリームの平均を読み取り、ドラフト位置を並列に一度に計算し、マルコフヘッドと協力して依存関係をモデル化し、信頼度ヘッドが検証長を決定するのを支援します。

  • ビジョンブランチ: 層数と隠れ次元、パッチサイズを持つViT。特徴はピクセルアンシャッフルを通過し、トークン数を元のの削減し、その後次元にマッピングされてMLPによって言語バックボーンシーケンスに挿入され、単一画像あたり最大視覚トークンとなります。

CEDとCSA2については、第2章で詳細に紹介します。最終的に、コンテキストが成長するにつれて、DeepSeek V4.1 Flashの必要な計算量は1Mの範囲内でほぼ線形に増加し、計算オーバーヘッドは以前の世代のモデルよりもはるかに少なくなります。

[画像]

2. モデルアーキテクチャ

2.1 マルチモーダルアーキテクチャ

DeepSeek-V4.1-Flashのビジョンパスは、より細かい画像パッチグリッド上での完全なビジョンエンコーディング、隣接する特徴をより少ない幅広ベクトルに並べ替え、それを言語バックボーンの入力空間に投影することとして要約できます。そのうち:

  • vision_patch_size=14: 元の画像のパッチサイズです。
  • vision_downsample_ratio=3: ViT出力特徴グリッドのマージ範囲です。

全体の処理フローは以下の図に示されています。ViTはまず高解像度特徴量で画像内の相互作用を完了し、その後空間的な並べ替えと圧縮投影を通じてLLMにフィードします。

[画像]

上記の図は、前処理およびパディング後の1008 x 1008ピクセルの正方形画像を例として示しています。

ステージ操作例示形状説明
画像前処理RGB、サイズ計画、リサイズ/パディング、正規化2Dレイアウトを保持
パッチへの分割オーバーラップしないブロックグリッドは
パッチ埋め込み平坦化後の線形投影各パッチは同じ重みセットを独立して使用
DeepSeek-ViT32層双方向ビジョンTransformerすべてのパッチ位置を保持、CLS集約パスなし
空間並べ替えオーバーラップしないグループ化グリッドはからに変化
2層MLP線形、GELU、線形中間層も-次元
画像スパンアセンブリ行区切り文字と開始/終了マーカーを挿入位置を含む
画像-テキスト融合元の順序でテキスト埋め込みとインターリーブテキストとすべての画像スパンを含む
mHC拡張4つの残差ストリームを確立各位置が共有言語バックボーンに入る
言語バックボーン40層CED/CSA2/MoE隠れ状態次元は変更されない最終的に語彙ヘッドを通じてテキストを出力

画像前処理: OCRのようなテキスト認識は行わないことに注意してください。ファイルがロードされると、load_imageを介して直接デコードされ、RGBに変換されます。次に、最小ピクセル領域を確認します。元の画像領域がを下回る場合、ターゲットサイズを比例してスケーリングします。その後、2つのエッジを上にアラインメントしてvision_patch_size=14の倍数にし、アラインメントされた空白領域をRGBグレーで埋めます。そして、拡張された画像スパンがvision_max_n_token=1024の予算を超えるかどうかを確認します。予算を超える場合、アスペクト比に基づいてより小さいターゲットキャンバスを再計算します。

前処理後のピクセルサイズを、パッチ辺長を、空間マージ係数をとすると、コードはまずピクセル辺長をの整数倍にします。

アライナーは、パッチグリッドが3で割り切れないことを可能にします。なぜなら、特徴グリッドの右側と下側にゼロをパディングするからです。

マージされたビジュアルグリッドとそのコンテンツトークン数は次のようになります。

そして、ローカル前処理関数が実際に予算を組んでいるのは次のとおりです。

そのうち、各行に1つのIMAGE_NEW_LINE、それに加えてIMAGE_STARTとIMAGE_ENDが含まれます。

論文の「約1344×1344ピクセルの入力解像度をサポート」という記述は、本質的にvision_max_n_token=1024によって制約されています。例えば、論文によると、、その後、後続のダウンサンプリング後のトークン数は1024ですが、スパン内にタグを追加するとvision_max_n_token=1024の予算を超えることを考慮すると、この画像はにスケーリングされ、トークン、さらに31のNLタグと2つのSTART/ENDタグで合計994トークンになります。

そして、一般的な画面解像度(例:)はにスケーリングされ、合計968トークンになります。

次に、画像はRGBチャネルに従って正規化されます。

画像を引き続き例として、コードは画像をオーバーラップしないブロックに分割します。画像ブロックの行座標と列座標が、ブロック内の座標がである場合、それが取り出す値はです。まず行内の列をトラバースし、次に次の行に入り、形状の画像ブロックを取得します。ブロックに分割することで、空間座標がブロック番号とブロック内座標として書き換えられます。

パッチ埋め込み: 各ブロックのすべての数値は、その後各ブロックが平坦化され、すべてのブロックが同じ線形層とバイアスを共有します。最後に、行列が得られます。論文では、畳み込みを線形投影に置き換える必要がある理由が説明されています。主な理由は、Muonオプティマイザーとの互換性を確保するためです。

DeepSeek-ViT: 次に、32層のViT処理が行われ、画像内コンテキストが付与されます。入力と最終出力の両方がです。各層はまず現在の特徴量にRMSNormを実行し、残差を追加して戻します。その後、再度正規化し、SwiGLUフィードフォワードネットワークを実行し、残差を追加して戻します。32層の後、ビジョントーワーの最後にさらに1つのRMSNormがあります。

層のいずれかのアテンションを例にとると、線形層がまず正規化された特徴量からQ、K、Vを生成し、総出力幅はです。3つはそれぞれ、つまり16ヘッド、各ヘッド64次元に編成されます。スコアを計算する前に、2D RoPEが元の行/列座標に従ってQとKを回転させ、Vは回転させません。アテンションはクロスポジション通信を解決し、後続のSwiGLUは主に各位置内のチャネル変換を行います。まず次元に投影し、2つのブランチに分割し、ゲートブランチにSiLUを適用し、もう一方のブランチと要素ごとに乗算し、その後1024次元に再投影します。このように、1つの層は「他の位置から情報を取得する」と「ローカル位置の特徴量を再編成する」という2種類の処理を同時に含みます。

空間並べ替え: 9つの隣接する特徴量を同じ幅広ベクトルにロードし、ダウンサンプリングを採用します。具体的なアプローチは次のとおりです。

[画像]

2層MLP: LLM用のトークンを生成するために使用され、hidden_dim = 5120にアラインします。

最後に、画像によって生成されたトークンスパン内に、いくつかのマーカーを追加する必要があります。以下の図を参照してください。

[画像]

次に、これらのトークンがバックボーンネットワークに送信されます。ここでもう1つの最適化があります。マルチモーダル補助損失なしのMoE負荷分散です。画像とテキストのトークンは異なる表現分布を示し、MoEで異なるエキスパートルーティング選好を形成する可能性があります。したがって、それらの集約された負荷をバランスさせると、各モダリティ内の不均衡がマスクされる可能性があります。この問題に対処するため、DeepSeekチームは、テキストと画像トークンそれぞれのエキスパート修正バイアスのセットを維持します。ルーティング中、各トークンはエキスパート選択のためにそのモダリティに対応する修正バイアスを使用し、選択されたエキスパートの出力を重み付けするために元のルーティングスコアを保持します。各トレーニングステップの終了後、これらの2セットのバイアスは、それぞれの専門家負荷に応じて独立に更新されます。この設計は、各モダリティ内のエキスパートの使用をバランスさせ、安定した効率的なマルチモーダルトレーニングを支援します。

2.2 Causal Encoder-Decoder (CED)

2.2.1 なぜCEDが必要なのか?

実質的な問題は、エージェントワークフローにおいて、頻繁なツール呼び出しが大量のプレフィルリクエストを生成し、KVキャッシュミス時に計算オーバーヘッドが大きくなることです。

[画像]

このプレフィルボトルネックを緩和するため、著者はYoCo《You Only Cache Once: Decoder-Decoder Architectures for Language Models》[2]に触発されたCausal Encoder-Decoder(CED)アーキテクチャを提案しています。YoCoは、上位レイヤーが下位レイヤーが生成したKVキャッシュを直接共有できるようにすることで、プレフィル計算を削減します。

[画像]

具体的な実装では、YoCoは履歴メモリの生成と消費を分離します。下半分がメモリを確立し、上半分がメモリを繰り返し読み取りますが、後続の推論のために保存する必要のあるレイヤーごとの履歴KVは生成しなくなります。

[画像]

ここで、YoCoのアーキテクチャ進化プロセス全体を簡単に拡張しましょう。まず、Decoder-Onlyモデルの各レイヤーのアテンションメカニズムにより、各レイヤーがプレフィル中にKV計算を行うことが、非効率性の根本原因です。

最初の間接的な解決策はSWAアルゴリズムを使用することです。これは、固定スライディングウィンドウを通じて、各レイヤーがKVを生成します。これは、YoCoの元の論文で言及されているEfficient Self-Attn(ESA)です。しかし、すべてのレイヤーがSWAを使用すると、グローバルアテンションメカニズムが失われます(注:元の論文では、ESAはオプションでSWAまたはgRet…)。もう1つの解決策は、モデル全体を深度で分割することです。前半はESAを使用してグローバルKVを生成し、後半は標準アテンションを使用して前半のKVを読み取ります。これにより、グローバルアテンションメカニズムを復元できます。しかし、後半のKVがどのレイヤーから来るかを決定する必要があります。

最終的に決定された解決策は、後半のKVが-層の隠れ状態からを介して投影されることであり、これがYoCoアーキテクチャを構成します。

実際、YoCoのソリューションはいくつかのベースモデルチームによって試されており、通常はKV-Mirrorという異なる名前で説明されています。一部のチームはそれを公開していません。公開検索可能なのは、TencentのWeLM《Building Effective Sparse MoE Models with Moderate Resources》[3]です。

2.2.2 CEDの具体的な実装

YoCoの概念の上に、CEDは一連の構造的改善を導入し、同時にKVキャッシュの全体的な容量とKV生成の計算深度を増加させ、最終的にパフォーマンスをベースラインと同等に維持しながら、プレフィル計算をほぼ半分に削減することに成功しました。

グローバルアテンションのために、CEDはTransformerの下位レイヤーをCausal Encoderと見なします。上位レイヤー(つまり、デコーダー、)の場合、KVエントリはもはやそれ自身の隠れ状態から派生するのではなく、レイヤー依存の投影重み(および)を介して-層の隠れ状態から直接投影されます。

ここで、およびはKVエントリと対応する圧縮重みを表します。この設計により、CEDは非常に低い計算コストで上位レイヤーのグローバルKVキャッシュを取得できます。プレフィルステージ中に最初の半分だけを計算する必要があります。

具体的には、CEDはモデルをCausal-EncoderとDecoderの2つの部分に分割し、それぞれ20層とします。比較すると、YoCoは2つの部分をSelf-DecoderとCross-Decoderと名付け、主にアテンションの情報源によって2つの部分を区別します。前半は効率的な自己アテンションを通じてシーケンスを処理し、後半は自身のレイヤーによって生成されたクエリを使用して前半が生成した共有KVを読み取ります。DeepSeekは異なる観察角度に変更しました。前半の主な責任は再利用可能なコンテキスト表現を生成することであるため、エンコーダーと見なすことができます。上位半分はこれらの表現を使用して予測を継続的に計算するため、デコーダーと呼ばれます。YoCoの論文の視点では、主にSelf-Decoderは「シーケンスを効率的に処理する方法」であり、Causal Encoderは「後続のネットワークに何を提供するのか」を強調しています。エンコーダー/デコーダー名の区別は、単なる視点の違いです。

YoCoでは、前半はESA(gRetまたはSWA)を採用していますが、CEDでは、Causal-Encoderの最初の2層もSWAであり、後続の18層はCSA2を採用しています。これは、圧縮とSWAを組み合わせたスパースアテンションです。これはスパースアテンションによって構築されたKVをグローバルKVと呼び、SWAによって構築されたKVをローカルKVと呼び、これらを連結してからQと共にAttn-Scoreを計算します。これについては、後続のセクションで詳細に説明し、CEDアーキテクチャをCSA2と組み合わせて詳しく説明します。

SWAについては、CEDはすべてのレイヤーで通常のレイヤーごとの計算を維持します。任意のレイヤーのローカルKVは、現在のレイヤーの隠れ状態から直接派生します。これは実際にはローカルKV生成の計算深度を増加させます。しかし、レイヤーごとの計算を維持するにはSWAリプレイプロセスが必要です。プレフィルステージ中にデコーダーのSWA KVキャッシュを計算するには、追加のトークン処理が必要です(はウィンドウサイズ)。各ターンのプロンプトが比較的短いマルチターンインタラクションでは、このデコーダーオーバーヘッドの部分は無視できません。幸いなことに、先行研究(Chen et al., 2025)は、SWAの実効的な受容野が理論値よりもはるかに小さいことを示しています。この観察に触発されて、著者はDecoder SWA Bounded Replayを導入します。デコーダーのためにプレフィルプロンプトの最後のトークンのみを計算し、それによって計算コストを大幅に削減します。

1. なぜSWAは実際にはローカルKV生成の計算深度を増加させるのか?

まず、エンコーダー深度を、デコーダー深度を、ウィンドウサイズをとします。CEDのグローバルKVは、エンコーダー境界表現から取得されます。

前半には多くのレイヤーがありますが、デコーダーが読み取るグローバルメモリは依然としてから取得した投影です。後続のレイヤーは異なるクエリを生成できますが、これにより履歴グローバルKVのソースがより深いレイヤーの表現に変わることはありません。そして、各後続レイヤーはSWAベースのローカルKVを追加します。これは、「各レイヤーが独自の入力表現からKVを生成する」パスを保持します。「深度増加」とは、これらの最近の位置のKVが、同じエンコーダー境界表現の異なる投影だけでなく、より深いレイヤーの計算結果を含むことができることを意味します。

2. なぜBounded Replayが必要なのか?

しかし、これらのローカルKVはいくつかの問題も引き起こします。通常の完全なプレフィルでは、このような問題はありません。すべてのプロンプト単語がすべてのレイヤーを通過し、各レイヤーのローカルKVはフォワード計算で自然に生成されます。

しかし、CEDはほとんどの履歴位置がエンコーダー終了後に計算を停止することを望んでいます。この時点で、グローバルKVは準備できますが、これらの履歴位置はデコーダーを通過していないため、深いデコーダーレイヤーのローカルKVはまだ生成されていません。Decoder SWA Bounded Replayは、CEDがプレフィルを早期に終了した後に失われたDecoderローカルKVを補うためのものですが、早期終了の利点を相殺するこれらのKVを復元するコストを回避します。

SWAは最近の位置のローカルKVのみを保存するため、最後の位置をリプレイすれば十分なように思われます。しかし問題は、深いレイヤーにおけるこれらの位置の表現は、ウィンドウ外のより前の位置に依存するということです。例えば、各レイヤーのウィンドウは4です。位置100の第2層表現を計算するには、第1層の位置97から100の表現が必要です。そして、第1層の位置97は入力位置94から97を読み取る必要があります。したがって、回復が深くなるほど、前方にさらにトレースバックする必要があります。層のデコーダーの場合、正確な回復のための履歴スパンは約です。

各ツール呼び出しがわずか数十単語しか追加しない場合でも、キャッシュを復元するために数千()の履歴位置をデコーダーに通過させる必要がある場合、プレフィルの早期終了で節約された計算量は、大量のリプレイによって消費される可能性があります。著者は、《PowerAttention: Exponentially Scaling of Receptive Fields for Effective Sparse Attention》[4]という研究を参照しています。これは、スパースアテンションの受容野とクロスレイヤー情報伝播を研究した論文です。そのセクション4.3には、パスキー検索タスクでモデルを評価した実験があります。約2Kのウィンドウを持つSWA実験では、著者は情報が約6層を伝播した後、かなり弱く減衰したと推定しています。

したがって、DeepSeekはBounded Replayアプローチを採用しており、Boundedの役割は、このオーバーヘッドを制限することです。最後の位置のみをリプレイし、正確な回復のために前方に継続的にトレースバックすることはなくなります。 コストは、再構築されたローカルKVが近似状態であることです。リプレイセグメントの開始には、以前のローカル依存関係が欠けており、後続の深いレイヤー表現はそれに応じて変化する可能性があります。

しかし、CSA2では、グローバルメモリではなく、ローカルSWA状態の再構築範囲が切り捨てられることに注意してください。最後の位置をリプレイする際、デコーダーは因果的およびスパースアテンションのルールに従って、より長い履歴のグローバルKVを引き続き読み取ることができます。したがって、DeepSeekはこの近似を受け入れ、品質評価とポストトレーニング適応を通じて影響を制御します。

3. なぜこの問題が重要なのか?

長いプロンプトの下では、テールリプレイはエンコーダーの大規模計算の外にある小さな作業にすぎません。しかし、エージェントのマルチターンインタラクションでは、履歴のほとんどはすでにグローバルキャッシュにヒットしており、このターンで新しく追加された内容は非常に短い場合があります。このターンの新しく追加された長さをとします。新しいコンテンツのエンコーダー本体の作業はほぼで増加しますが、デコーダーローカル状態を復元するコストは自動的には縮小しません。例えば、のとき、のとき、正確な回復のための履歴スパンは約位置です。このターンでわずか数十位置しか新しく追加されなくても、ローカル状態を復元するために非常に長いテールを振り返り、その後マルチレイヤー計算を実行する必要があるかもしれません。

Boundedリプレイは、この復元作業をデコーダーを通過する最も最近の位置に制限し、各ターンの状態復元を固定オーバーヘッドに制限します。

全体として、シーケンス長に対して、CEDはプレフィル複雑性をからに削減し、実際には総計算量を半分にします。

計算量が半分になるのはなぜか?

長いプロンプトのコールドスタートプレフィルの場合、エンコーダーはすべての位置を処理します:、デコーダーはテール位置のみを処理します:

したがって、本体のワークロードは次のようになります。

を代入し、完全な計算と比較します。

のとき、第2項は非常に小さく、比率はに近づきます。DeepSeek V4.1 Flashの例()を使用して、プロンプト長がであると仮定します。完全な計算は約トークン-レイヤーです。CEDのエンコーダーとバウンデッドリプレイは約であり、これは前者のはです。

2.3 CSA2

2.3.1 なぜCSA2が必要なのか?

長コンテキストのサービングには、KVキャッシュストレージとアテンション計算の両方を同時に制御する必要があります。これらのコストは、乗算関係を持つ3つの次元で削減できます。

  • エントリサイズ次元: 例えば、GQAはKVヘッドの数を減らし、MLAは異なるヘッド間で小さな潜在表現を共有します。

  • シーケンス次元: ここでは、トークンごとに1つのエントリに圧縮されます。例として、DeepSeek-V4のCSAとHCAがあります。

  • レイヤー次元: ここでは、特定のレイヤーが他のレイヤーのキャッシュと選択結果を再利用します。独自のキャッシュと選択結果を保持するのではなく、またはより効率的なレイヤーに完全に置き換えられます。

レイヤー次元に関する作業では:

  • 《Reducing Transformer Key-Value Cache Size with Cross-Layer Attention》[5]は、クロスレイヤーアテンションを提案しており、一部のアテンションレイヤーが以前のレイヤーによって生成されたKVを直接読み取ることで、レイヤーごとの独立したKVキャッシュの保存を回避します。

  • 《IndexCache: Accelerating Sparse Attention via Cross-Layer Index Reuse》[6]は、レイヤー間でトップKインデックスを再利用してインデクサー計算を削減します。

  • 《You Only Index Once: Cross-Layer Sparse Attention with Shared Routing》[7]は、スパースルーティングを一度だけ計算し、すべてのレイヤーと共有します。

  • 《HySparse: A Hybrid Sparse Attention Architecture with Oracle Token Selection and KV Cache Sharing》[8]は、スパースレイヤーが密レイヤーのKVキャッシュを再利用できるようにします。

しかし、単にインデックスを再利用するだけでは、主要なKVストレージは削減されません。ネットワーク全体でのルーティング共有はパフォーマンスを制限し、ハイブリッド設計は依然として完全なアテンションレイヤーを保持します。さらに重要なのは、これらの方法のいずれも、3つの次元すべてを乗算関係でカバーしていないことです。

詳細に分析すると、クロスレイヤーアテンション(CLA)はレイヤー間でKVを共有し、独立したKVコピーを削減できますが、各レイヤーは独自の注意を計算します。KVストレージは削減されますが、計算は削減されません。IndexCacheは一部のレイヤー間でトップKインデックスを共有し、インデクサーの実行回数を削減できますが、主要なKVは依然としてレイヤーごとに保存されるため、一部のインデクサー計算は節約されても、ストレージは節約されません。また、YOIOはYOCOのデコーダー-デコーダー構造を再利用し、KVCacheを半分節約しますが、クロスデコーダーの複数のレイヤーのスパースアテンションは、1セットの選択されたトップK候補セットを共有する必要があり、モデルのパフォーマンスに影響を与えます。HySparseはフルアテンションを使用してKVを生成し、スパースレイヤーがこれらのKVを再利用できるとしても、フルアテンション計算の効率はパフォーマンスに影響を与えます。

CSA2を紹介する前に、DeepSeekの過去数年間のアテンション計算の最適化を詳細にレビューできます。MLAでは、すべてのヘッドのK/V表現に対する共同低ランク圧縮が行われ、エントリサイズ次元で圧縮されます。次に、DeepSeek V3.2でスパースアテンション(DSA)が導入され、アテンションの計算需要が削減されました。次に、DeepSeek-V4では、CSA(圧縮率4:1)とHCA(圧縮率128:1)を通じてシーケンス次元での圧縮が追加されました。そしてCSA2は、圧縮をレイヤー次元に向けてさらに推進します。

CSA2はこれらの3つの次元を共同で利用します。これは、メインKVとインデクサーKをレイヤー間で共有し、レイヤーがトップKインデックスを再利用できるようにすると同時に、キャッシュ共有とインデックス再利用を分離します。これは、簡略化されたコンプレッサーと階層的スパースインデクサーとこれらの再利用戦略を組み合わせたものです。後者は、デコーダーにおける後続のインデックスレイヤーの検索範囲を狭めます。

CSAからのいくつかの微妙な計算上の違い: CSAと同様に、CSA2には軽量インデクサーが含まれており、インデクサーQとインデクサーKを使用してメインKVエントリをスコアリングし、各クエリのトップKエントリを選択します。各Qは同時に選択されたエントリとレイヤー内のローカルスライディングウィンドウKV(SWA KV)にアテンドします。

CSA2のコンプレッサーにもいくつかの違いがあります。まず、圧縮率1の特殊ケースが含まれます。これは、デコーダーレイヤーに使用されるメインKVを圧縮しない機能です。

具体的な実装では、Causal-Encoderは圧縮率を使用します。これにより、メインKVの各コピーのエントリ数とインデックス候補が削減されます。デコーダーは、トークンごとのアドレス可能性を維持するためにを使用します。CEDおよびクロスレイヤーキャッシュ共有と組み合わせると、デコーダーは各レイヤーの独立した長シーケンスメインKVを保存する必要がないため、シーケンスの粒度を細かくするためにスペース予算の一部を割り当てることができます。

同時に、CSA2はコンプレッサーとインデクサーを簡略化します。CSAでは、圧縮率は、各メインKVエントリが元のKVキャッシュエントリから生成され、隣接する圧縮エントリによって使用されるソースエントリ間にオーバーラップがあることを意味します。また、これらのエントリの位置を圧縮中にエンコードするための絶対位置埋め込みも含まれます。CSA2は、このオーバーラップと絶対位置埋め込みを削除します。

[画像]

さらに、CSA2はメインKVエントリを投影することでインデクサーKを取得し、隠れ状態から始まるCSAの独立した圧縮パスを置き換えます。これらの設計はいずれも実装を簡素化し、トレーニング効率を向上させます。

[画像]

2.3.2 クロスレイヤーKVとインデックスの再利用

具体的には、CSA2はCSAの基盤の上に、主にレイヤー次元でデータ再利用を追加します。コンピュータアーキテクチャの観点から、アテンションブロックを計算コンポーネント、MoE/FFNをストレージコンポーネント、KV関連部分を計算のキャッシュと見なすことができます。この観点から、KVとインデックスのクロスレイヤー再利用を一種のデータ局所性処理と見なすことができます。以下の図を参照してください。

[画像]

クロスレイヤー再利用は主に3つのモードに分かれます。以下の図を参照してください。

[画像]

これらのモードの違いは、メインKV、インデクサーK、およびトップKインデックスがどのように取得されるかにあります。緑色の四角は現在のレイヤーで計算された量を示します。黄色の四角は、最も近いフルモードレイヤーから再利用されたメインKVとインデクサーKを示します。赤色の四角は、インデックスを生成した最も近いレイヤーから再利用されたトップKインデックスを示します。さらに、3つのモードすべてがメインQとSWA KVを現在のレイヤーで計算します。

フルモード: このレイヤーは、独自のメインKVとインデクサーQを計算し、メインKVからインデクサーKを取得し、インデクサーを実行して新しいトップKインデックスを生成します。したがって、完全なCSA2計算パスを実行し、各コンポーネントが負担する責任は、DeepSeek-V4の完全なCSAレイヤーと同じです。

再インデックスモード: このレイヤーは、前のレイヤーから利用可能な最も近いメインKVと対応するインデクサーKを再利用します。そして、独自のインデクサーQを計算し、再利用されたキーを再スコアリングし、新しいトップKインデックスを生成します。これにより、スパース選択がレイヤー間で変化する一方で、メインKVとインデクサーKは共有されたままになります。

再利用モード: このレイヤーは、利用可能な最も近いメインKVと、前のフルモードレイヤーまたは再インデックスモードレイヤーによってそのメインKVに対して計算された最新のトップKインデックスを再利用します。この選択を使用してアテンション計算を実行し、インデクサーQを計算せず、インデックススコアを評価しません。

メインKVとインデクサーKを共有することでKVCacheのストレージフットプリントが削減され、トップKインデックスを再利用することで追加のインデクサー計算を回避できます。再インデックスモードにより、選択されたエントリがレイヤー間で変化しながらキャッシュ共有を維持できます。CEDと組み合わせた特定のモードの使用法を分析します。

2.3.3 CEDとCSA2の組み合わせ

Causal-Encoderでは、次のようなマクロブロックで構成される構造と見なすことができます。まず、2層の標準SWAブロックがあり、その後、3つのマクロエンコーダーブロックで構成される構造が続きます。エングラムは、2番目のSWAブロックと最後のエンコーダーブロックの前に注入されます。以下の図を参照してください。

[画像]

エンコーダーブロックは6層構造で、最初の層はフルモードCSA2、後続の5層は再利用モードCSA2です。上記のアプローチは、クロスレイヤー再利用メカニズム全体をより良く記述できます。

1. なぜ1層のフル+5層の再利用を統合されたエンコーダーブロックと見なすのか?

最初のレイヤーのフルモードCSA2は、メインKVとトップKインデックス全体を計算して書き込みます。後続の5層の再利用モードCSA2はすべて、最初のレイヤーによって生成されたメインKVとトップKインデックスを再利用します。要するに、KVとトップK選択の両方が再利用モードブロックで再利用され、各レイヤーが実際に変更するのはQです。

したがって、6層を含むエンコーダーブロック構造全体を、各レイヤーでQを変更することによって再帰を実行する再帰的Transformer構造と見なすことができます。

2. 最初の2層SWA + Engramの役割は何ですか?

一言で言えば、最初のレイヤーはローカルコンテキストを提供し、Engramは短いパターンによってアドレス指定され、コンテキストによって制御されるメモリを注入し、2番目のレイヤーはこれら2つを後続の圧縮に使用できる表現に統合します。

最初のレイヤーのSWAウィンドウサイズは、位置が読み取れる位置のセットは次のとおりです。

例えば、異なる文中の同じ単語は、異なる近くの位置に異なる重みを割り当てます。最初のレイヤーの出力はSWAによって処理され、ローカルコンテキストで処理された表現に変換されます。次にEngramの注入が行われます。Engramについては、以前の記事《On DeepSeek Engram: Conditional Memory》で詳細な分析が行われています。

Engramは、現在の位置で終わる2-gram、3-gram、および4-gramを読み取り、ハッシュテーブル検索後に連結します。したがって、Engramは、繰り返し出現するフレーズパターン、ローカル組み合わせ規則などをパラメータテーブルにエンコードする能力を持っています。そして、最初のレイヤーSWAの出力は、Engramのコンテキストゲーティングを提供します。直接Engramを最初のレイヤーに注入するのと比較して、最初のレイヤーSWA処理後の出力は、すでにローカルコンテキストを組み合わせた表現であることに注意してください。

Engramの注入は現在の位置の残差更新を直接行います。現在の位置のメモリを他の位置に直接書き込むわけではありません。しかし、2番目のレイヤーSWAは、各位置のEngram強化表現をウィンドウ内で読み取ることができます。したがって、2番目のレイヤーSWAのQとローカルKVの両方がEngramの影響を受けて、関連するフレーズパターン、ローカル組み合わせ規則などの情報を強化できます。2番目のレイヤーSWA処理後、ローカル情報の統合が完了します。したがって、最初の2つのレイヤーは次の順序を形成します。

一方、2層のSWAの結果は、受容野長をに拡張します。したがって、3層から始まるCSA2処理では、入力には次のものが含まれます。トークン埋め込み/2層のローカルコンテキスト計算の結果/コンテキストゲーティング後に注入され統合されたEngramメモリ—これらの処理されたローカル表現。これも、CSA2のコンプレッサーがオーバーラップ処理を行う必要がない理由の1つです。

次に、デコーダーの構造を見てみましょう。同様に、5つのデコーダーブロックで構成される構造と見なすことができます。

[画像]

そのうち、最初のデコーダーブロックの最初のCSA2はフルモードであり、フルモードデコーダーブロックとも呼びます。同様に、後続の4つのデコーダーブロックも再インデックスモードデコーダーブロックと呼ばれます。デコーダーのすべてのCSA2は圧縮率1であり、デコーダーでは再インデックスモードCSA2のみが使用されることに注意してください。

フルモードデコーダーブロックの最初のレイヤーは、フルモードCSA2です。Causal-EncoderのフルモードCSA2と同様に、独自のメインKV、インデクサーK、およびトップKインデックスを計算します。メインKVとトップKインデックスは、後続の3層の再利用モードCSA2によって再利用されます。しかし、階層的スパースインデクサー(HSI)処理アプローチを導入しており、後続の再インデックスモードCSA2の検索ドメインとしてブロックレベルの選択を構築します。これは、トップKインデックスを計算する際のスコアを利用します。これについては、後続のセクションで詳しく説明します。

再インデックスモードデコーダーブロック: デコーダーには、フルモードデコーダーブロックの後に4つの再インデックスモードデコーダーブロックがあります。その内部の最初のレイヤーは再インデックスモードCSA2です。再インデックスモードCSA2は、独自のインデクサーQを再計算してスコアリングし、候補プール内で独自のトップKエントリを選択します。

2.3.4. 階層的スパースインデクサー(HSI)

クロスレイヤーインデックス再利用は、インデクサー評価の回数を削減しますが、残りのインデクサーは依然としてすべての因果的に可視なコンテキストをスコアリングする必要があります。超長コンテキストでは、このコストは依然として主要な計算ボトルネックです。

《HISA: Efficient Hierarchical Indexing for Fine-Grained Sparse Attention》[9]では、「ブロックレベルの粗フィルタリング + トークンレベルのファインフィルタリング」を使用してスパースアテンションインデクサーのオーバーヘッドを削減する方法を研究しています。

[画像]

図に示すように、プレフィックスを約のブロックサイズで連続する位置に分割します。ブロックはです。ブロック数はです。各ブロックはインデクサーの平均を保持します。

平均は検索の補助関数として機能します。元のトークンインデクサーとメインKVは依然として保持されます。デコード中、現在のブロックのベクトル和とカウントを維持でき、新しいトークンは1つのブロックのみを更新し、完了した履歴ブロックは要約を再利用します。

最初のステージでは、同じセットを使用してブロック平均をスコアリングします。

スコアの高いブロックのみが保持され、その後候補位置セットに展開されます。

第2ステージでは、の元の値を計算し、候補から最終位置を選択します。

DeepSeekチームは、デコーダーでは、浅いレイヤーのインデクサーの情報を使用して、深いレイヤーのインデクサーが考慮する候補を自然に制限できることを発見しました。追加の状態は必要ありません。したがって、著者はCEDデコーダーでのみ使用される階層的スパースインデクサー(HSI)を導入し、デコード中の繰り返しスコアリングを削減します。各クエリに対して、最初のフルモードレイヤーは、後続の再インデックスモードレイヤーの検索ドメインとして候補プールを構築します。候補プールサイズが固定されている場合、深いレイヤーのインデクサーのクエリあたりのコストは、コンテキストに線形に増加するものから定数に変化します。このメカニズムはトレーニング対応であり、ポストトレーニングステージで導入されます。トレーニングと推論はまったく同じ候補制限を課すため、深いレイヤーのインデクサーは推論に使用される検索ドメインの下で最適化されます。

HSIの動作原理は次のとおりです。

最初のフルモードCSA2は、因果的に可視なすべてのメインKV位置をスコアリングし、独自の注意のためのトップKインデックスを生成します。同時に、ブロックレベルの候補選択を実行します。各ブロックは、内部位置の最大インデックススコアを取得し、最もスコアの高いいくつかのブロックを選択し、これらのブロックがカバーする位置を候補プールに収集します。これは最終的なトップKセットよりも大きいサイズです。例えば、2048ブロックを選択し、各ブロックに8位置を含めると、16384候補位置が得られます。候補プールは、後続の再インデックスモードレイヤーの「どこを検索するか」を決定し、最終的なトップKは各レイヤーの「どのエントリを読み取るか」を決定します。

後続の再インデックスモードレイヤーは、対応するクエリの候補位置のみをスコアリングし、プール内で独自のトップKエントリを選択します。再利用モードレイヤーは新しいインデックスを計算せず、再利用されたメインKVに対して計算された最新のトップKインデックスを直接使用します。このように、候補プールはインデックスレイヤー間で共有されますが、最終的な選択は異なる場合があります。

候補プールサイズが固定されている場合、各後続インデクサーがクエリごとにスコアリングする位置の数は、コンテキスト長に依存せず、制限されます。最初のフルモードレイヤーは依然として因果的に可視な範囲全体をスキャンする必要があります。したがって、階層的インデックス付けは、初期のフルレンジスキャンを維持しながら、後続のインデクサー評価のコストを削減します。

[画像:HSI候補プールと再インデックス]

HISAとの違いは、HISAは各レイヤーでブロックプーリングスコアリングを実行してからスパーストップK選択を実行する必要があることです。HSIは、浅いレイヤーで既に取得された完全な位置スコアからブロック最大値を取り、後続のレイヤーは候補範囲を共有し、ポストトレーニングでの制限に適応します。どちらもまず粗フィルタリングを行い、次にファイン選択を行いますが、粗フィルタリングの基準は異なります。

さらに、HSIがブロック最大値を取ることは、平均プーリングが引き起こす可能性のあるピーク希釈を回避します。

1. フルモードレイヤーはどのように候補プールを生成しますか? 候補ブロック幅candidate_block_sizeは、ブロック数の上限candidate_topk_blocksは、最終的に選択されるトップKはです。を、因果的に可視な-番目のブロックとすると、

最初のレイヤーはまず完全なインデクサー・スコアを計算します。それ自身のトップKインデックスを生成するために

同じスコアセットがブロック最大値削減にも使用されます。

対応する実装はscores = F.pad(logits, (0, -width % block_size), value=-torch.inf)で、最後のブロックをでパディングし、次にunflattenで履歴軸をブロック数と各ブロック8位置に分割し、amax(dim=-1)が正確に実装します。最後に、最大ブロックがブロックスコアによって選択されます。

さらに、境界戦略が追加されます。最新の可視位置を含むブロックのスコアを一時的にに設定し、このブロックに選択ブロックのクォータを占有させます。つまり

選択されたブロックの場合、ビットマップが生成され、その後repeat_interleave(block_size, dim=-1)[..., :width]を介してブロックフラグが元のスコアと同じ幅のビットマップに展開され、後続の再インデックスモード計算に使用される候補プールを構成します。

さらに、論文には「このメカニズムはトレーニング対応であり、ポストトレーニングステージで導入されます。トレーニングと推論はまったく同じ候補制限を課すため、深いレイヤーのインデクサーは推論に使用される検索ドメインの下で最適化されます。」と記載されていることに注意する必要があります。しかし、具体的なポストトレーニング方法はここでは開示されていません。

HSIが使用されないと仮定すると、再インデックスが必要なデコーダーの各レイヤーは、完全な履歴を検索して最も関連性の高い512位置を見つけることができます。HSIを使用した後は、最初のリトリーバーが履歴を最大16384位置を含むリストに縮小し、後続のリトリーバーはそれぞれリストから512位置を選択できます。トレーニング中に後続のレイヤーがまだ完全な履歴を検索できるが、オンラインでデプロイされるときに突然リストのみが与えられる場合、トレーニング-推論分布と選択の間の一貫性がなくなり、パフォーマンスに影響します。

論文によると、DeepSeek-V4.1-Flashはすでに事前トレーニングステージでスパースアテンションをゼロから使用しており、最初に64Kシーケンスでトレーニングし、次に1Mに拡張し、HSIがポストトレーニングステージで導入されることを明確に述べています。つまり、事前トレーニングステージではモデル構造にHSIがないはずです。再インデックスモードレイヤーは依然として完全な計算を使用します。ポストトレーニングステージでは、深いレイヤーインデクサーの排他的パラメータが実際に学習されるようにするためには、インデクサー損失またはその他の勾配推定メカニズムも存在する必要がありますが、レポートは損失形式を開示していません。ハイブリッド損失関数を使用していると推測されます。

ここで、バックボーンが制限された候補セットで適応するようにし、メインアテンション分布を使用してインデクサーの連続スコアを蒸留する可能性があります。DSAの実装と組み合わせると、次のように推測されます。