この投稿の英語版はGitHubに投稿されています 。
テスト312ソリューション
すべての参加者に感謝します! 312人の参加者から603のソリューションを受け取りました。 テストのために時間に関する最新の決定を行うため、 312のソリューションをテストする必要があります 。 これは予想外の結果でした。 これでこんなに時間がかかる理由を少し説明できればと思います。
すべてのテストソリューションをGitHubのsubmissionsディレクトリに公開しました。 各サブディレクトリの名前は、ソリューションの一意の識別子です。 ソリューションを送信した場合、この識別子を含む自動確認書を受け取りました。 意思決定者の名前または仮名は、最終結果とともに公開されます。
各ディレクトリには、ファイル
solution.js
(実際には競合ソリューション)と、データファイル
data
または
data.gz
(gzipを使用して圧縮されている場合)が含まれています。 このレイアウトは、公式のテストスクリプトが期待するものと一致しています。
src
サブディレクトリには、作成者が追加のアーカイブで送信したソースが含まれています。 テストスクリプトはそれらに注意を払いません。
もちろん、あなたの決定に変更を加えることはもはや不可能です。 ただし、
src
ディレクトリで公開したいが、ソースアーカイブに含めなかった特定の追加ファイル(READMEファイルなど)を送信できます。 これはテスト結果には影響しませんが、ソリューションをよりよく理解できれば、オリジナリティの特別賞を受賞する可能性が高くなります。 追加のファイルを送信する場合は、レターをお送りください 。
テストジェネレーター
約束どおり、 テストジェネレーターを公開しています 。 これは、テストを生成するためにWebサービスで使用したのと同じモジュールへのコマンドラインインターフェイスです。 疑似乱数ジェネレーターの同じ初期値の場合、このジェネレーターはWebサービスと同じ結果を生成することが保証されています。
--help
オプションは指示を与えます。
起動時に、ジェネレーターは辞書を分析し、さまざまな次数のマルコフモデルを構築します(したがって、ジェネレーターの初期化にはかなりの時間がかかります)。 次に、疑似乱数ジェネレーターを使用してテストセットを生成します。 確率½で、辞書からランダムな単語が選択され、その他の場合、9つのモデルからランダムに選択されたモデルが生成に使用されます。これらは1から8までの次数のマルコフ連鎖とホワイトノイズジェネレーターです。 マルコフモデルの次数が高いほど、その結果は英語の単語により類似しています。 単語が辞書に偶然出現した場合、その単語は破棄され、新しい単語が生成されます。 これは高次モデルでより頻繁に発生するため、テストでは、これらのモデルによって生成される非単語は、低次モデルによって生成される単語よりもやや一般的ではありません。 詳細に興味がある場合は、ジェネレーターのソースコードを読むことをお勧めします。
深刻なテストを行うには、100ワードの多数のブロックが必要です。 それらを生成するには、テキスト文字列(「シード文字列」)を使用して、ブロック番号の取得元である擬似乱数のマスターシーケンスを初期化します。 同じ行から、常に同じブロックのシーケンスを取得し、無期限に継続できます。
数日後、テストジェネレーターのWebバージョンは無効になります。 代わりにジェネレーターを使用してください。これにより、コンピューター上でまったく同じ結果が得られます。
「戦闘」テストシステム
ソリューションの大量テスト用に、より強力で柔軟な新しいテストシステムを開発しました。
--help
オプションは指示を与えます。
新しいテストシステムは、機能的には古いテストシステムと同等です。つまり、同じテストとテストプログラムに対して、両方のシステムが同じ結果をもたらします。 新しいシステムの際立った特徴は次のとおりです。
- 複数のソリューションを並行してテストできます。 これを行うには、コマンドラインに次々とリストする必要があります。 (最初のスクリプトについては、ファイルパスではなく、ソリューションを含むディレクトリの名前を指定する必要があります。)
- ソリューションは、メインプロセスから単語を受信し、応答を返信する個別のプロセスで実行されます。
- 新しいシステムは、数千のテストJSONファイルを読み取る代わりに、ラインベースのジェネレーターを使用してオンザフライでテストを生成し、マスターシーケンスを初期化します。 完全に決定論的で再現可能です。
- 新しいシステムは、正解の割合よりもはるかに多くの統計を計算します。 テスト中、彼女はコンソールでこれらの統計を定期的に更新します。 テスト結果を機械可読のJSONファイルに書き込むこともできます。
- オプションで、テストプログラムは、テストで繰り返し(既に検出された単語)が発生するたびに、ソリューションを再起動して再初期化できます。 これにより、テスト中のトレーニングの効果を特定し、測定することができます。一部のソリューションではこれを実装しています。
- 「危険」モードを選択できます。このモードでは、「サンドボックス」なしで、通常のNode.jsモジュールのようにソリューションがロードされます。 Node.js VMがソリューションを歪めている疑いがある場合は、注意して使用できます。 もちろん、あなたはあなた自身のソリューションを信頼しているので、テストするときは常に
--unsafe
を使用することはパフォーマンスを改善するための良い考えです。
これは、テスト中に画面に表示される統計の意味です。 トップライン:
Total
-チェックされた単語の総数、
W
単語の数、
NW
非単語の数、
NW[0]
...
NW[8]
-各モデルによって生成された非単語の数:0はホワイトノイズジェネレーター、1 –8 —対応する注文のマルコフ連鎖。 各決定について:
Correct
は
Correct
の割合(これは最終順位の場所を決定するものです)、
F-
は偽陰性結果の割合、
F+
は偽陽性結果の割合、
F+[0]
...
F+[8]
はそれぞれの偽陽性結果の割合です個別モデル、
ms/100w
-1ブロックの平均処理時間(ミリ秒)。 重複
(R)
表示されたときにソリューションが再起動すると、名前の左側に
(R)
表示されます。 結果を含む機械読み取り可能なJSONファイルには、すべて同じ情報が直感的な形式で含まれています。
公式のテストシーケンス
Twitter @ladygagaを開きました :-)、締め切り後に表示される最初のツイートを取得しました。 このツイートのテキストは、シーケンスを初期化する公式の文字列になりました。 公式のテストシーケンスを生成するには、
generate.js
および
test2.js
次のオプションを指定できます。
--text 'Lady Gaga has accompanied Mario Andretti in a two-seater race car at #Indy500 today!'
(追加:残念ながら、このツイートは既に削除されています。 このリツイートのみが残ります。テストがすでに実行されているため、初期化文字列は変更されません。)
シーケンスの開始(ブロック番号)は、416943456、1130928813、1690493249、1560679505、1146154276、403245362、1509995579、2138666856、1841363379、1083285606です。
ブロック数とセルフトレーニング
最初に、非常に少数のブロックですべてのソリューションを実行し、どのソリューションがリードするチャンスがあるかを見つけました。 次に、8つの有望なソリューションを採用し、非常に多くのブロックでそれらを開始しました。 いくつかの異なる初期化ラインにより、評価の最初の3行は最初の1,500ブロック内で安定しました。ブロック数をさらに増やしても、シェアの割合は明確になりましたが、リーダーの相対的な位置は変わりませんでした。 すべてのソリューションを10,000ブロックでテストすることにしました(これは100万ワードです)。
一部のソリューションでは、独自のアプローチを使用しています。テストシステムが提示するすべての単語を記憶しています。 辞書に含まれる単語は700,000未満であり、疑似ランダムの非単語の種類ははるかに広いため、2回出現する単語は非単語よりも単語である可能性が高くなります。 この現象を使用するソリューションの場合、結果の精度は時間の経過とともに向上します。 理論的には、ブロック数の無制限の増加により、このようなソリューションは任意の高い結果を示すことができます。
これは興味深いアイデアですが、理論的には十分な数のテストセットでこのようなソリューションが非学習ソリューションをバイパスする可能性があるため、これは競合にとって問題です。 これは、この単純な手法を他のすべてを打ち負かす「魔法の杖」にするだけでなく、いくつかの学習ソリューションから選択する問題をsolutions審員にもたらすでしょう。 競争の開始前にこのアイデアが思いついた場合、テスト中にいつでもテストシステムがソリューションを再起動できることを示すことで、問題を簡単に解決できました。 ただし、初期化は1回のみであると明示的に約束しました。
学習効果を個別に測定するために、10,000ブロックという数字に留まり、再起動の有無にかかわらず各ソリューションを実行することにしました。 この期間の非学習ソリューションの結果は、かなり安定します。 トレーニングは、いくつかの決定の結果を本当に改善します(これまでのところ、トレーニングのおかげでトップ10になった1つのソリューションがあります)。 もちろん、学習ソリューションはより多くのブロックでさらに良い結果を示しますが、これは初期化直後にプログラムが高い認識精度を示す参加者には不公平です。
つまり、学習ソリューションの学習を許可しますが、学習効果が決定的になるような膨大な数のブロックを使用しないでください。
ステータス
現在、いくつかのソリューションはまだテスト中です。
問題の記述には、プログラムのパフォーマンスに関する要件は示されていません。 制限を示した場合、ハードウェアとオペレーティングシステムを正確に記述し、ソリューションを何度も実行して正確に測定し、サンドボックスによって生じる歪みの問題を解決する必要があります。 パフォーマンスの測定の問題から逃れたかったのです。 この結果、受け取った解決策のいくつかは非常に遅いです。
一部のソリューションのテストはまだ完了していません。 最も遅いものは、事前に停止し、部分的なテスト実行の結果を使用する必要があるようです。 現時点では、これらのソリューションはどれもトップ10に入っていません。 さらに、少なくとも1つのソリューションがスタックしています。 サンドボックスがこの問題を引き起こすのか、それともソリューション自体のバグなのかを把握します。
数日のうちに、遅いソリューションのテストが終了したら、結果を公開します。 すでに、テーブル全体の公開を待たずに、独自の結果を見つけることができます。 これには、上記で指定した新しいテストシステムと公式の初期化文字列を使用します。 10,000ブロックを設定すると、私たちとまったく同じ結果が得られます(ソリューションで
Math.random
使用している場合を除きます-この場合、結果はわずかに異なります)。 これまでのところ、10,000ブロックで見た最高の結果は83.67%です。
しばらくお待ちください。 私たちと一緒にいてください!