この広告は、90日以上更新していないブログに表示しています。
流行りに便乗して、【ラストセール!】フィットネスビキニ">やAIの勉強を始めてみました。なかでも、強化学習は、伝統的なAIの世界(プランニング等々)とMIKI☆OSAKABE MA-1 ライトグレー">の融合のようで面白くいろいろと探求のしがいがありそうです。
とりかかりとしてこの本を読み始めています。
強くなるロボティック・ゲームプレイヤーの作り方 プレミアムブックス版 ~実践で学ぶ強化学習~
- 作者: 八谷大岳,杉山将
- 出版社/メーカー: スティナ stina レオタード">
- 発売日: 2016/06/30
- メディア: 単行本
- この商品を含むブログ (2件) を見る
2008年の本なのでDQNなどはでていませんが、歴史的背景(「最適制御理論」最適化の観点から制御というものを考える、等々)から、基本的な技法の定式や実装イメージ(擬似コード的なものがある)まで網羅的に丁寧に記述されていて、大変勉強になります。
ただ読んでいるだけだとあまりわかった気になれないので、ところどころで具体的に値を計算してみたり、トイプロブレムを解いてみたりしたいと思います。
【身長別】アウターガイド -vol.21
強化学習で取り組む問題は、有限ハーツ バスケットボール ユニフォーム 115">として定式化されます。
: とりうる状態の集合
: とりうる行動の集合
:状態
のときに、行動
を取った場合に、状態
に遷移する確率(状態遷移関数)
:エージェントが
の状態のときに、行動
を取る確率(政策関数。方策関数という言い方もする。)
:エージェントが状態
のときに、行動
を取り、状態
に遷移した場合に得られる報酬値を出力する関数(報酬関数)
:割引率
学習者、いわゆるエージェントが、ある状態のときにある行動を取ることで、別の状態に遷移します。この状態遷移は「最終値下げ munoz vrandecic ARTS&SCIENCE">を解くために、「状態価値関数」あるいは「状態・行動価値関数」を利用するのが筋です。
状態価値関数はある状態を初期値とした場合の、将来の報酬の総和の期待値を算出します。状態・行動価値関数のほうはさらに行動も加えます。
状態価値関数と状態・行動価値関数には以下のような関係があります。
【検証】風俗嬢/立ちんぼを本気でナンパしてみたwww
「強くなるロボティック・ゲームプレイヤーの作り方」4.2に、簡単な例題が載っております。
図は4状態チェーンウォークと呼ばれるマルコフ決定問題の、状態遷移を表しています。状態空間は、行動空間は
政策関数πを下記に、割引率γを0.9とした場合のQは下記のようになるとあります。
s(1) | s(2) | s(3) | s(4) | |
---|---|---|---|---|
L | 1.46 | 1.46 | 1.82 | 2.63 |
R | 1.71 | 2.42 | 3.72 | 3.72 |
【アークテリクス】街のシェルといえばこれ!フレイザージャケットを着用レビュー。
本では、結果だけが載っていますので、これを一から算出してみたいと思います。
また状態・行動価値関数は、期待値の計算=線形の処理なので
最初のステップ(0ステップ目)での各状態・行動の報酬期待値 + 1ステップ目以降の状態の報酬期待値
と分解できます。これをソニアリキエル モヘアニットワンピース ハート柄 40">に起こしたものが下記です。
coding: UTF-8 """ 「強くなるロボティックプレイヤーの作り方」4章のチェーンウォーク問題の Q関数の値を求める """ import numpy as np ### パラメータ n_iter = 100 discount = 0.9 # s(n=0)からLを選んでs(t=1)に遷移する確率 Pt(s(t=1)|s(t=0), L) s0L = np.array([[0.9, 0.1, 0, 0], [0.9, 0.1, 0, 0], [0, 0.9, 0.1, 0], [0, 0, 0.9, 0.1]]) # s(t=0)からRを選んでs(t=1)に遷移する確率 pt(s(t=1)|s(t=0), R) s0R = np.array([[0.1, 0.9, 0, 0], [0, 0.1, 0.9, 0], [0, 0, 0.1, 0.9], [0, 0, 0.1, 0.9]]) ### 1. t=0の報酬期待値を求める # t=0の期待報酬値は、ノード4への遷移確率そのものになる s0L_value = s0L[:,3] s0R_value = s0R[:,3] ### 2. t=1以降の報酬期待値を求める # 状態遷移行列 A = np.array([[0.5, 0.5, 0, 0], [0.45, 0.1, 0.45, 0], [0, 0.45, 0.1, 0.45], [0, 0, 0.5, 0.5]]) # Aのべき乗を求めるために固有値と固有ベクトルを求める la, v = np.linalg.eig(A) # laでから対角行列を作る D = np.diag(la) # vの逆行列を求める inv_v = np.linalg.inv(v) # iステップ後の期待得点を算出。それを足していく values = np.zeros(4) for i in range(1, n_iter): expected = np.dot(np.dot(v, D ** i), inv_v)[:,3] * (discount ** i) values += expected # t=0からt=1への遷移確率を掛けて、t=1以降の期待値を出す s1L_values = np.dot(s0L, values) s1R_values = np.dot(s0R, values) ### 3. 最終的な値を表示 print(s0L_value + s1L_values) print(s0R_value + s1R_values)
実行結果は以下のようになります。
[ 1.46032168 1.46032168 1.82091047 2.63112231] [ 1.71430161 2.41980141 3.72279858 3.72279858]
期待通りの値が計算できたようですね。