問題タブ [temporal-difference]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
machine-learning - Q学習 vs 時間差 vs モデルベースの強化学習
私は大学で「Intelligent Machines」というコースにいます。強化学習の 3 つの方法が紹介され、それらをいつ使用するかについての直感が与えられました。引用します。
- Q-Learning - MDP が解けない場合に最適です。
- 時間差学習 - MDP が既知であるか、学習できるが解決できない場合に最適です。
- モデルベース - MDP を学習できない場合に最適です。
ある方法を他の方法よりもいつ選択するかを説明する良い例はありますか?
machine-learning - 関数近似なしの勾配時間差ラムダ
GTD(λ) のすべての形式では、θ といくつかの重みベクトル w を使用して、関数近似の観点からそれを定義しているようです。
線形関数近似の収束特性から勾配法の必要性が広まっていることは理解していますが、重要度のサンプリングには GTD を利用したいと考えています。
関数近似なしで GTD を利用することは可能ですか? もしそうなら、更新方程式はどのように形式化されていますか?
python - 時間差分学習におけるダブルカウント
私は一時的な差分学習の例 ( https://www.youtube.com/watch?v=XrxgdpduWOU ) に取り組んでおり、報酬を二重にカウントしているように見えるため、Python の実装で次の方程式に問題があります。とQ。
以下のグリッドを 2 次元配列としてコーディングした場合、現在の位置は (2, 2) であり、目標は (2, 3) であり、最大報酬が 1 であると仮定します。Q(t) を現在の位置の平均とします。 r(t+1) は 1 であり、最大 Q(t+1) も 1 であると仮定すると、Q(t) は 2 に近づきます (ガンマが 1 であると仮定)。これは正しいですか、それとも Q(n) (n は終点) は 0 であると仮定する必要がありますか?
コードを含めるように編集 - get_max_q 関数を変更して、それが終点であり、値がすべて 1 を下回っている場合は 0 を返すようにしました (報酬は 1 にすぎないため、より正確であると思います)。ただし、これが正しいアプローチであるかどうかはわかりません (以前は、終点のときに 1 を返すように設定していました)。
algorithm - バックギャモンでブロット露出を効率的に計算する方法
here で説明されているように、td-gammon に似たバックギャモンのアルゴリズムを実装しようとしています。
論文で説明されているように、td-gammon の初期バージョンは、優れたプレー エージェントを作成する特徴空間で生のボード エンコーディングのみを使用していましたが、世界クラスのエージェントを取得するには、優れたプレーに関連するいくつかの事前計算された特徴を追加する必要があります。遊ぶ。最も重要な機能の 1 つは、しみの露出です。
ブロット露出は次のように定義されます。
特定のブロットについて、対戦相手がブロットをヒットできるようにする 36 のうちのロールの数。総ブロット露出は、対戦相手が任意のブロットをヒットできるようにする 36 のうちのロールの数です。しみの露出は以下に依存します。(a) しみの前にいるすべての敵の男性の位置。(b) ブロットと敵兵の間のブロッキング ポイントの数と位置、および (c) バー上の敵兵の数、およびバー上の敵兵は再びボードに入ることができるロール。 -しみがヒットする前に入力してください。
この機能を効率的に計算するためにさまざまなアプローチを試みましたが、計算がまだ遅すぎて、高速化する方法がわかりません。
td-gammon アプローチは、特定のダイス ロールに対して可能なすべてのボード ポジションを評価することに注意してください。そのため、すべてのプレーヤーのダイス ロールの各ターンでは、可能なすべてのボード ポジションに対してこの機能を計算する必要があります。
大まかな数値: ターンごとに約 30 のボード ポジションがあり、平均的なゲームが 50 ターン続くと仮定すると、1,000,000 回のゲーム シミュレーションを実行するには、(x * 30 * 50 * 1,000,000) / (1000 * 60 * 60 * 24) 日かかります。ここで、x は機能を計算するミリ秒数です。x = 0.7 とすると、1,000,000 ゲームをシミュレートするのに約 12 日かかります。
それが妥当なタイミングかどうかはよくわかりませんが、かなり速いアプローチが必要だと感じています。
だからここに私が試したことがある:
アプローチ1(ダイスロールによる)
可能な 21 個のダイスのロールごとに、再帰的にチェックしてヒットが発生することを確認します。この手順の主な主力は次のとおりです。
この関数が行うことは、サイコロの値の配列を入力として受け取ることです (つまり、プレイヤーが 1,1 を振った場合、配列は [1,1,1,1] になります)。関数は、ヒットがあるかどうかを再帰的にチェックします。関数 LegalMovesOfDie は、その特定のサイコロの値の正当な動きを計算します。
アプローチ 2 (ブロットによる)
このアプローチでは、最初にすべてのしみを見つけてから、各しみについて可能なすべてのサイコロの値をループして、ヒットが発生するかどうかを確認します。この関数は最適化されているため、サイコロの値がヒットを登録すると、次のブロットには再度使用しません。また、ブロットの前にある移動のみを考慮するように最適化されています。私のコード:
メソッド transitions.HitBlot2 は、ブロットの前にある移動のみが考慮されることを保証する、blotPosition パラメーターを取ります。
これらの実装はどちらも非常に遅く、プロファイラーを使用したところ、再帰が原因であることが判明したため、次のようにリファクタリングを試みました。
- 再帰の代わりに for ループを使用するには (醜いコードですが、はるかに高速です)
- parallel.foreach を使用して、一度に 1 つのサイコロの値をチェックする代わりに、これらを並行してチェックします。
これは、機能の 50000 回の計算に対する私の実行の平均タイミング結果です (各アプローチのタイミングは同じデータで行われたことに注意してください)。
- 再帰を使用したアプローチ 1: 計算あたり 2.28 ミリ秒
- 再帰を使用したアプローチ 2: 計算あたり 1.1 ミリ秒
- for ループを使用したアプローチ 1: 計算あたり 1.02 ミリ秒
- for ループを使用したアプローチ 2: 計算あたり 0.57 ミリ秒
- parallel.foreach を使用したアプローチ 1: 計算あたり 0.75 ミリ秒 6 parallel.foreach を使用したアプローチ 2: 計算あたり 0.75 ミリ秒
タイミングが非常に不安定であることがわかりました (ニューラル ネットワークの重みのランダムな初期化に依存する可能性があります) が、約 0.7 ミリ秒が達成可能であるように思われます。
私の質問は次のとおりです。これが合理的かどうか知っている人はいますか? トレーニングを減らすことができる、私が認識していないより高速なアルゴリズムはありますか?
最後の情報: 私はかなり新しいマシンで実行しています。Intel Cote (TM) i7-5500U CPU @2.40 GHz。
さらに情報が必要な場合はお知らせください。提供いたします。
ありがとう、オフィル
neural-network - Reinforcement Learning training
I am new to reinforcement learning and doing a project about chess. I use neural network and temporal difference learning to train the engine learn the game.
The neural network has one input layer (of 385 features), two hidden layers and one output layer, whose range is [-1,1] where -1 means lose and 1 win (0 draw). I use TD-lambda to self-learn the chess, and the default case is to only consider next 10 moves. All the weights are initialized in the range [-1, 1].
I use forward propagation to estimate the value of state, but most of the values are very close to either 1 or -1, even the result is draw, which I think the engine doesn't learn well. I think some values are large and dominate the result, changing small weights does no help. I change the size of two hidden layers but it doesn't work (However, I have tried a toy example with small size and dimension, it can converge and the estimated value is very close to the target one after dozens of iteration). I don't know how to fix this, could someone give me some advice?
Thank you.
Some references are listed below