HeadlinesBriefing favicon HeadlinesBriefing.com

gzip は言語モデルになれるか? 圧縮-予測の等価性

Hacker News •
×

しばらく前に、ニューラルネットワークを使わない言語モデリングについて書きました。そこで、無制限の n-gram モデルを使ってシェイクスピアを生成しました:重みなし、トレーニングなし、ただ数えるだけ。幸運にも、私は『Language Modeling is Compression』という論文に出会いました。そこでは圧縮-予測の等価性が述べられていました:あらゆる予測モデルは本質的に圧縮器であり、すべての圧縮アルゴリズムは予測モデルです。これにより自然な疑問が生じました:gzip は言語モデリングができるのか?ニューラルネットワークなし、学習済みパラメータなし、何もなし。ただ、オペレーティングシステムに付属している圧縮器だけです。コーパスでそれをプライムし、普通のテキストプロンプトを与えると、それはそのプロンプトを、最もよく圧縮されるバイト列を探して続けます。tiny Shakespeare でプライムした後の実際の、編集されていない出力を以下に示します:

gzipt --corpus data/tinyshakespeare.txt --prompt $'MENENIUS:\n' --length 200

MENENIUS:'Though all at once canq MARCIUS: Pray now, nocamest thou to a morsel .LARTIUS: Hence, and I' the end admire, where Gagain; and after it ag .その結果、ある種の意味では?完全に一貫したテキストではないですが、確かにテキストについて何かを知っています。私が gzip に期待していたよりもずっと多くを知っています。

それでは、どうすれば圧縮器がこのような出力を生成できるのでしょうか?圧縮は予測です。圧縮器が何をするかを考えてみてください。それは「期待」しているデータには少ないバイトを使い、「期待していない」データには多くのバイトを使います。私があなたに、文字 A が 100 万回繰り返されたファイルを渡したら、あなたはそれを一文で説明できます。一方、100 万のランダムバイトは、利用できる構造がほとんどなく、ほとんど圧縮されません。これは偶然ではなく、情報理論の核心です。シンボルをエンコードするために必要なビット数は $-\log_2 p$ であり、ここで $p$ はモデルがそれに割り当てる確率です。高い確率は少ないビットを意味します。したがって、どんな圧縮器にも、誰かがそれを書き下したかどうかに関わらず、内在的に確率モデルが隠れています。gzip は DEFLATE を使います。これは、32 KiB のスライドウィンドウ内の最近のテキストに対してマッチを見つけることで、次のバイトを圧縮します。もし継続がウィンドウ内に既に存在する何かを反映しているなら、DEFLATE はそれをリテラルバイトではなく、安価なバック参照としてエンコードします。したがって:gzip が「期待」した継続 — つまり、そのウィンドウ内に既に存在するテキストを反映している継続 — は、ほとんど何も圧縮されません。これにより、我々はスコアを得ることができます。あるコンテキストがあり、候補の継続がどれだけ良いかを知りたいときは、ただ測るだけです:score(候補) = len(gzip(コンテキスト + 候補))。圧縮後の長さが小さいほど、その候補はより「予測されている」と見なされます。モデルをプライムするために、私は gzip のウィンドウにコーパスを含めます。コーパスに似ている継続は小さく圧縮され、似ていない継続は大きく圧縮されます。ビームサーチによる生成。スコアリングは一つのこと;生成は別のことです。 naïve なアプローチ — つまり、最もよく圧縮される次の単一バイトを選ぶ — はひどく失敗します。その理由は微妙です:gzip は整数バイト長しか返しません(小数点なし)。バイトを1つ追加しても、圧縮後の長さが変わらないことがよくあり、そのため多くの候補が同点になり、信号は量子化ノイズに埋もれます。対処法は:コミットする前に、全長を見て先を見ることです。gzipt はバイト列に対してビームサーチを実行します。各ステップでは、現在のコンテキストは:コーパスウィンドウ + (プロンプト + 生成バイト) の最近の末尾です。その後、gzipt は可能な次のバイトを試します。各候補継続は、コンテキスト + 候補を圧縮し、その結果の圧縮サイズ(バイト数)をチェックしてスコアリングされます。ループは次の通りです:

プロンプト。ユーザーのプロンプトから始め、それを継続するための初期テキストとします。スタートトークンはありません;プロンプトのバイトは単に gzip が見るコンテキストの一部です。

コンテキスト。gzip にコーパスウィンドウと、プロンプト/生成テキストの最近の末尾を見せます。

検索。beam_width 番目までの最も圧縮されやすい部分継続を保持します。それぞれを、コーパスに現れるすべてのバイトで拡張し、すべてを圧縮長でスコアリングし、再び最高の beam_width まで絞り込みます。

ホライズンバイト数分繰り返します。

コミット。最も圧縮されやすい完全なスパンを取ります(温度が正の場合はファイナリストの中からサンプリング)、それを追加し、続けます。

...

FAQ Q: gzip は言語モデルとして使用できますか?

FAQ A: はい、gzip は圧縮に基づく予測によって言語モデルとして機能できます。コーパスでプライムし、ビームサーチを使って最も効率的に圧縮されるバイト列を見つけることで、gzip はパターンを効果的に特定し、テキストの継続を生成します。これは機能する理由として、圧縮アルゴリズムは本質的に確率モデルを構築するからです — テキストが以前に見たパターンを反映するとき、それはより効率的に圧縮され、これによりより高い予測可能性を示します。