導入
宝くじに当たる確率は非常に低いということを一度は聞いたことがあるでしょう。確率に関連するすべてのことと同様、複数の試行によって結果が有利になる可能性があります。さて、多くの宝くじに参加した場合、さらに何回参加したかに応じて、当選の可能性は少し高くなります。これは、最終的に当選するという保証はまだありませんが、均一な分布の場合です。そして、大数の法則 (この場合は多数の抽選を意味します) に従うと、比較的可能性の高い可能性に到達できます。
新しい宝くじはそれぞれ独立しており、同じ宝くじの「チケット番号」が (大数の法則に従って) 多くの異なる宝くじに当たる可能性があることを理解することが重要です。運が悪いと、何度試しても、毎回の宝くじで間違った数字を選んでしまう可能性もあります。現在、2 つのオプションがあります:
- 毎回乱数を試すことができます。
- 毎回同じ番号を試すことができます。
理論的に (そして数学的に)、両方のシナリオが発生する可能性は同じです。ただし、シナリオ 2 の方がわずかに有利になります。回数が無限に近づくと、最終的にはすべての数字が選択されます。問題は、シナリオ 1 では、その時点で選んだ数字が勝ちの数字と一致することを期待して、さらに何度も試行する必要があることです。シナリオ 2 では、試行は無限に進む傾向があるため、ある時点であなたの番号が「勝つ」ことが確実です。このブログ投稿では、シナリオ 2 を使用します。
それでは、私が答えを言う前に、この質問に答えられると思いますか?
「あなたの周りのすべての宝くじにちょうど 100 万人分のスロットがあり、プレイした全員に同じチケット [x] を選択した場合、最終的に当選者になるには何回の宝くじをプレイする必要がありますか?」 (最初の答えが何であったかについてお気軽にコメントしてください)
答えは...
約1,440万回。
このブログ投稿の残りの部分では、どのようにしてその値に到達したか、シミュレーションがどのように行われたか、およびいくつかの注意点について説明します。ここからはさらに技術的な話になります。
論理
100 万人の宝くじのチケット番号は、1 ~ 1,000,000 (または 0 ~ 999,999) の範囲になります。プレイヤーは各宝くじでその範囲内の数字のみを選択でき、当選チケットはその範囲からのみ選択できます。基本的に、100 万個の数値のセットがあると言えます。
ユーザーがその範囲内の任意の数値を選択できるという事実を考慮すると、セット内のすべての項目が少なくとも 1 回ヒットするという条件を満たす必要があります。これは、すべての番号が少なくとも 1 回コールされていれば、プレーヤーが選択できるすべてのチケット番号がカバーされるためです。これは、各数値が実行される回数を気にしないことも意味し、「セット」がシミュレーションに使用する理想的な Python データ構造になります。空のセットから開始し、セットに指定された範囲内のすべての数値が含まれるまで、反復ごとにランダムに生成された数値をそのセットに入力します。 Python セットは数値を繰り返さないため、一意性の確保について心配する必要はありません。
def calculate_lottery_chances(lottery_players_count): number_set = set() count = 0 while len(number_set) <p>1,000,000 人の宝くじの場合、関数呼び出しは Calculate_lottery_chances(1000000) のようになり、当選するまでの宝くじの試行回数が返されます。このようにコードを配置すると、非常に拡張可能になります。</p> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173567637690021.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How a Lottery Quest Led Me to The Powers of PyTorch"></p> <h2> 問題 </h2> <p>一言で言えば、問題の根本原因は「ばらつき」です。初めて関数を実行したとき、値として「1,310 万」回を取得しました。再実行したところ、1,390 万程度の値が得られました。これをさらに何度も繰り返したところ、さまざまな答えが得られ、ある時点で 1,500 万を獲得しました。これを実行して平均値を見つける必要があることは明らかでした。これまでの既存のパターンに従って、平均化する反復回数が無限に近づくにつれて、<strong>1 つ</strong> の信頼できる答えに近づくだろうと考えました。これを高速に実行できるものが必要だったので、この関数を作成することにしました。<br> </p> <pre class="brush:php;toolbar:false">def average_over_n_times(function, function_arg, n): """ This returns the average of the returned value of a function when it is called n times, with its (one) arg """ total = 0 for x in range(0, n): total += function(function_arg) return round(total/n)
その後、すべてが次のように修正されます:
num_of_trials = average_over_n_times(calculate_lottery_chances, lottery_players_count, n)
ここで、「n」は結果を平均化する回数を表します。ただし、これは次のセクションで説明する別の問題を引き起こします。
「ん」は何にすべきでしょうか?
n の値が大きいほど、「平均的な場合」の結果に近づきます。ただし、まだ絶対や確実性がないことを考えると、この一連の作業を何度も実行すると生産性が低下します。私がこれを言うのは次の理由からです:
- 時間は無限ではなく、これらの計算を無限に実行することはできません。つまり、計算を実行するたびに (どんなに小さくても) 常に変動があり、「絶対」という考えは無効になります。
- 計算リソースは有限です。
- この実験の前提の 1 つは、コンピューターによって生成される「ランダム性」が現実を正確に模倣できるということです。
- アルゴリズムの実行時間と同様に、より小さな規模はより大きな規模と同じくらい重要ではなくなります。 13,000,000 を超える値を扱う場合、約 100,000 の変動はそれほど重要ではありません。
これらを念頭に置いて、「n」を次の値でテストしました: 10、20、30、50、100、1000、および 5000 回
PyTorch はどこに登場するのでしょうか?
この時点で、ブログ投稿のタイトルにある「PyTorch」という単語がなぜ言及されていないのか疑問に思われたかもしれません。さて、さまざまな値で n をテストすると述べましたが、それはすべてのテストに使用したのと同じコードではありませんでした。
これらは計算量の多い実験であり、私の CPU は私に連絡をくれました。以前に共有したコード スニペットは、外部パッケージの依存関係がまったくない 1 つのファイルに書かれており、そのファイルは、実行時間を追跡するために time コマンドを先頭に付けて bash シェルで実行されました。 CPU のみを使用した場合の実行時間は次のようになります:
n | Time (min and sec) |
---|---|
10 | 1m34.494s |
20 | 3m2.591s |
30 | 5m19.903s |
50 | 10m58.844s |
100 | 14m56.157s |
1000 で、プログラムを動作させることができなくなりました。途中で切れて実行停止に失敗したのかは分かりませんでしたが、4時間57分後にキャンセルしました。これにはいくつかの要因が影響していると思われますが、それについては「注意事項」セクションで説明します。とにかく、ファンの音がうるさかったので、ラップトップのそれほど強力ではない CPU を少し使いすぎたのかもしれないと思いました。私は敗北を受け入れることを拒否し、少なくとも 4 桁の反復を実行するにはどうすればよいかを考えていたとき、PyTorch を使っていた友人が私に言ったことを思い出しました。
「一般に、GPU は CPU よりも大量の計算処理において効率的です。」
PyTorch は GPU を使用するため、この作業に最適なツールです。
リファクタリング
今回の目的では PyTorch が計算に使用されるため、既存の Calculate_lottery_chances() コードをリファクタリングすることは、CPU に依存した数値演算を変更し、適切な PyTorch データ構造に切り替えることを意味します。一言で言えば:
- Python set() データ型ではもう不十分です。
- Python randint() 関数は、同等の PyTorch 関数に置き換えられます。
- set() データ型では不十分であるため、数値が以前に当選したかどうかを示すブール値を使用して、lottery_players_count のサイズに一致するゼロのテンソルを生成するように切り替えられます。
calculate_lottery_chances のリファクタリングは次のようになります:
def calculate_lottery_chances(lottery_players_count): number_set = set() count = 0 while len(number_set) <p>私のコンピューターでは PyTorch がサポートするインテル グラフィックス GPU を使用しているため、デバイスを「xpu」に設定しました。</p> <h2> 出力 </h2> <p>実行中に GPU が使用されていることを確認するために、実行前に Windows タスク マネージャーを開き、「パフォーマンス」セクションに移動しました。実行すると、GPU リソースの使用量が顕著に急増していることがわかりました。<br> コンテキストのために、前と後を次に示します:</p> <p>前:</p> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173567637915280.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How a Lottery Quest Led Me to The Powers of PyTorch"><br> GPU 使用率が 1% であることに注目してください</p> <p>後:</p> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173567638051975.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How a Lottery Quest Led Me to The Powers of PyTorch"><br> GPU 使用率が 49% であることに注目してください</p> <p>n の値を変化させた場合のランタイムでは、GPU は数倍高速でした。 100 未満の n の値を 1 分未満で一貫して実行し、<strong>5000</strong> (5,000!)</p> の n の値を計算することができました。 <p>GPU を使用したランタイムの表は次のとおりです:</p> <div><table> <thead> <tr> <th>n</th> <th>Time (min and sec)</th> </tr> </thead> <tbody> <tr> <td>10</td> <td>0m13.920s</td> </tr> <tr> <td>20</td> <td>0m18.797s</td> </tr> <tr> <td>30</td> <td>0m24.749s</td> </tr> <tr> <td>50</td> <td>0m34.076s</td> </tr> <tr> <td>100</td> <td>1m12.726s</td> </tr> <tr> <td>1000</td> <td>16m9.831s</td> </tr> </tbody> </table></div> <p>この実験での GPU 操作と CPU 操作のパフォーマンスの差がどれほど大きかったかを視覚的に理解するために、以下のデータ視覚化を考慮してください。</p> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173567638195144.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="How a Lottery Quest Led Me to The Powers of PyTorch"></p> <p>CPU から現実的に「タイムリーな」出力を得ることができなくなり、GPU と比較する余地がなくなったため、X 軸の上限は 100 になりました。 1,000 ~ 5,000 の範囲の数値で実験を実行すると、結果として「1,440 万回」ほどの結果が得られることが多かったです。それが先ほどの答えです。</p> <h2> 注意事項 </h2> <p>この実験では仮説を立て、特定の方法に依存しました。さらに、私には PyTorch の経験が浅いため、より効率的なアプローチがあった可能性があります。 <strong>結果の精度または実行時間に影響を与えた可能性がある</strong>と考えられる、考慮すべきいくつかの要因を以下に示します。</p> <ol> <li>私は、コンピュータで生成されたランダム性が現実世界 (物理世界) のランダム性を模倣しているという微妙な仮定を立てました。</li> <li>PyTorch を使用するようにロジックを少し切り替えましたが、コードの残りの部分は依然として CPU に依存していました。たとえば、average_over_n_times() 関数では、ループ内の加算と平均化の両方が PyTorch の同等の機能の恩恵を受けている可能性があります。パフォーマンスが向上したのではないかと思います。</li> <li>使用したバッチサイズが精度とパフォーマンスに与える影響がわかりません。</li> <li>すべての CPU と GPU のテストは、マシンが最高の状態で動作できるように、PC に接続した状態で行われました。バッテリー電源でデバイスを使用して実行すると、実行時間が長くなる可能性があります。</li> <li>PyTorch の CUDA は「XPU」よりも優れている可能性がありますが、私の PC は前者をサポートしていません。 </li> <li>テスト中は PC を「スリープ」状態にしないようにしました。コンピューターがスリープ状態の場合、テストの実行に時間がかかる可能性があります。</li> </ol> <p>最後に、私は PyTorch を初めて使用したのですが、そのパフォーマンスに非常に感銘を受けたことを指摘しておきます。</p> <h2> 結論 </h2> <p>これを使ってウサギの穴に落ちたとき、これほどパフォーマンスが向上するとは予想していませんでした。私はテンソルの背後にある考え方と、さらに計算的に複雑なタスクの背後にあるサポートメカニズムについていくつか学びました。コード スニペットを自由に使用、複製、変更することができます。</p> <p>お楽しみいただきありがとうございます。楽しくお読みいただければ幸いです。</p> <p>次回まで</p> <p>乾杯。 ?</p>
以上が宝くじのクエストが私を PyTorch のパワーに導いた経緯の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

限られた時間でPythonの学習効率を最大化するには、PythonのDateTime、時間、およびスケジュールモジュールを使用できます。 1. DateTimeモジュールは、学習時間を記録および計画するために使用されます。 2。時間モジュールは、勉強と休息の時間を設定するのに役立ちます。 3.スケジュールモジュールは、毎週の学習タスクを自動的に配置します。

PythonはゲームとGUI開発に優れています。 1)ゲーム開発は、2Dゲームの作成に適した図面、オーディオ、その他の機能を提供し、Pygameを使用します。 2)GUI開発は、TKINTERまたはPYQTを選択できます。 TKINTERはシンプルで使いやすく、PYQTは豊富な機能を備えており、専門能力開発に適しています。

Pythonは、データサイエンス、Web開発、自動化タスクに適していますが、Cはシステムプログラミング、ゲーム開発、組み込みシステムに適しています。 Pythonは、そのシンプルさと強力なエコシステムで知られていますが、Cは高性能および基礎となる制御機能で知られています。

2時間以内にPythonの基本的なプログラミングの概念とスキルを学ぶことができます。 1.変数とデータ型、2。マスターコントロールフロー(条件付きステートメントとループ)、3。機能の定義と使用を理解する4。

Pythonは、Web開発、データサイエンス、機械学習、自動化、スクリプトの分野で広く使用されています。 1)Web開発では、DjangoおよびFlask Frameworksが開発プロセスを簡素化します。 2)データサイエンスと機械学習の分野では、Numpy、Pandas、Scikit-Learn、Tensorflowライブラリが強力なサポートを提供します。 3)自動化とスクリプトの観点から、Pythonは自動テストやシステム管理などのタスクに適しています。

2時間以内にPythonの基本を学ぶことができます。 1。変数とデータ型を学習します。2。ステートメントやループの場合などのマスター制御構造、3。関数の定義と使用を理解します。これらは、簡単なPythonプログラムの作成を開始するのに役立ちます。

10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

ドリームウィーバー CS6
ビジュアル Web 開発ツール

WebStorm Mac版
便利なJavaScript開発ツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境
