ピンポンゲーム用のディープ q ラーニング アルゴリズムを実装しようとしています。テーブルを Q 関数として使用する Q ラーニングを既に実装しています。非常にうまく機能し、10 分以内に素朴な AI を打ち負かす方法を学習します。しかし、ニューラル ネットワークを Q 関数の近似器として使用して機能させることはできません。
私が正しい軌道に乗っているかどうか知りたいので、ここに私がやっていることの要約があります:
- 現在の状態、実行したアクション、報酬を現在のエクスペリエンスとしてリプレイ メモリに保存しています。
- 512個の隠れユニットを持つ1つの隠れ層を持つQ関数として多層パーセプトロンを使用しています。入力 -> 隠れ層の場合、シグモイド活性化関数を使用しています。非表示->出力レイヤーの場合、線形活性化関数を使用しています
- 状態は、両方のプレーヤーとボールの位置、およびボールの速度によって表されます。位置は、はるかに小さい状態空間に再マップされます。
- イプシロンが徐々に 0 になる状態空間を探索するために、イプシロン貪欲アプローチを使用しています。
学習時に、32 の後続のエクスペリエンスのランダムなバッチが選択されます。次に、すべての現在の状態とアクション Q(s, a) のターゲット q 値を計算します。
forall Experience e in batch if e == endOfEpisode target = e.getReward else target = e.getReward + discountFactor*qMaxPostState end
これで、32 個のターゲット Q 値のセットができました。バッチ勾配降下法を使用して、それらの値でニューラル ネットワークをトレーニングしています。私はちょうど1つのトレーニングステップをやっています。何個やればいいですか?
私は Java でプログラミングしており、多層パーセプトロンの実装には Encog を使用しています。問題は、トレーニングが非常に遅く、パフォーマンスが非常に弱いことです。私は何かが欠けていると思いますが、何がわかりません。テーブルアプローチには問題がないので、少なくともある程度まともな結果が期待できます。