私が読んでいた論文http://www.cs.toronto.edu/~ilya/pubs/2011/LANG-RNN.pdfでは、テキストの生成コンピューター モデルの品質を推定するためのテスト メトリックとして 1 文字あたりのビット数を使用していますが、それがどのように計算されたかについては言及していません。グーグルで調べても、本当に何も見つかりません。
計算方法わかる人いますか?Python が望ましいですが、疑似コードでも何でも動作します。ありがとう!
私が読んでいた論文http://www.cs.toronto.edu/~ilya/pubs/2011/LANG-RNN.pdfでは、テキストの生成コンピューター モデルの品質を推定するためのテスト メトリックとして 1 文字あたりのビット数を使用していますが、それがどのように計算されたかについては言及していません。グーグルで調べても、本当に何も見つかりません。
計算方法わかる人いますか?Python が望ましいですが、疑似コードでも何でも動作します。ありがとう!
文字あたりのビット数は、圧縮方法のパフォーマンスの尺度です。これは、文字列を圧縮し、圧縮された表現が合計で何ビットかかるかを測定することによって適用され、元の文字列に含まれていたシンボル (つまり文字) の数で割られます。圧縮バージョンの 1 文字あたりのビット数が少ないほど、圧縮方法の効果が高くなります。
言い換えれば、著者は生成言語モデルなどを圧縮に使用し、結果として得られる圧縮方法の高い有効性は、基礎となる生成モデルの精度が高いことを示していると仮定しています。
セクション 1 では、次のように述べています。
この論文の目的は、新しい Hessian-Free オプティマイザーでトレーニングされた大規模な RNN を、テキスト ストリーム内の次の文字を予測するタスクに適用することで、その能力を実証することです。これは重要な問題です。文字レベルの言語モデルを改善すれば、テキスト ファイルの圧縮が改善される可能性があるからです (Rissanen & Langdon、1979 年) [...]
Rissanen & Langdon (1979) の記事は、テキスト圧縮のよく知られた方法である算術符号化の元の説明です。
算術コーディングは、著者が構築したような生成言語モデルに基づいて動作します。(空の可能性がある) 一連の文字が与えられると、モデルは次にどの文字が来るかを予測します。人間もそれを行うことができます。たとえば、入力シーケンスが与えられた場合hello w
、次の文字の確率を推測できます:o
確率が高い (hello world
はもっともらしい継続であるため) が、h
as inhello where can I find..
またはi
as inのような文字hello winston
もゼロではない確率を持ちます。したがって、この特定の入力に対する文字の確率分布を確立することができます。これは、著者の生成モデルが行うこととまったく同じです。
これは、算術コーディングに自然に適合します。すでにエンコードされている入力シーケンスが与えられると、次の文字のビット シーケンスは、可能な文字の確率分布によって決定されます。確率の高い文字は短いビット シーケンスを取得し、確率の低い文字は短いビット シーケンスを取得します。より長いシーケンス。次に、次の文字が入力から読み取られ、確率分布から決定されたビット シーケンスを使用してエンコードされます。言語モデルが良ければ高い確率で文字を予測できたのでビット列は短くなる. 次に、次の文字で圧縮が続行されます。これまでの入力を使用して文字の確率分布を確立し、ビット シーケンスを決定してから、実際の次の文字を読み取り、それに応じてエンコードします。
生成モデルは、新しい確率分布を確立するためにすべてのステップで使用されることに注意してください。したがって、これは適応算術符号化の例です。
すべての入力が読み取られてエンコードされた後、結果の全長 (ビット単位) が測定され、圧縮されていない元の入力の文字数で除算されます。モデルが優れていれば、文字は高精度で予測されているため、各文字に使用されるビット シーケンスは平均して短く、文字あたりの合計ビット数は低くなります。
すぐに使える実装について
独自の生成言語モデルを簡単に統合できるようにする算術コーディングの実装については知りません。ほとんどの実装では、オンザフライで独自の適応モデルを構築します。つまり、入力を読み取るときに文字頻度テーブルを調整します。
選択肢の 1 つは、arcodeから始めることです。コードを調べたところ、簡単ではありませんが、独自のモデルを統合することは可能であるように思われます。メンバーはself._ranges
言語モデルを表します。基本的に累積文字頻度の配列として、self._ranges[ord('d')]
以下のすべての文字の合計相対頻度もそうですd
(つまりa
、小文字のアルファベット文字のみを想定した場合) b
。c
入力文字ごとにその配列を変更し、生成モデルから取得した文字確率を文字頻度範囲にマッピングする必要があります。
Alex Graves (2014) による "Generating Sequences With Recurrent Neural Networks" では、データセット全体で -log p(X(t+1) | y(t)) として与えられます。この X(t+1) は正しいシンボルで、y(t) はアルゴリズムの出力です。この条件付き確率は、正解に割り当てるものです。
したがって、システムの出力が確率的である場合、それは平均予測力です。
sys ライブラリには getsizeof() 関数があります。これは役に立ちますか? http://docs.python.org/dev/library/sys