本文用於基本入門理解。
強化學習的基本理論 : R, S, A 這些就不說了。
先設想兩個場景:
一。 1個 5x5 的 格子圖, 里面有一個目標點, 2個死亡點
二。 一個迷宮, 一個出發點, 3處 分叉點, 5個死角, 1條活路
Q-learning 的概念 其實就是一個算法, 數學的,或者軟件程序的算法而已。
對於這種 死的(固定的游戲), 我個人覺得其實就是個窮舉算法而已。
Q-learning 步驟:
場景一:
假設前提:
成功的路 A1, A2, ..... An , A-succ
失敗的路 A1, B2, ..... Bn , A-Fail
失敗的路 A1, C3, ..... Cn , B-Fail
最后成功后, 給個好處 R = 1, 失敗,給個R = -1
1. 先隨機走, 走出三條路來, A1 -- > A-succ , A1 -- > A-Fail, A1 -- > B-Fail
2. 走對的路, 最后一個點 An = 1, Bn = -1, Cn = -1 ; 實際上是 x 參數(0.90 自定義)
3. 接下,繼續走, 走出 An-1 Bn-1,
3. 接下,繼續走, 走出 An-2 Bn-2,
3. 接下,繼續走, 走出 An-3 Bn-3,
3. 接下,繼續走, 走出 An-4 Bn-4,
4.最后回到 A1, 發現, A1, 向上走 是 0.99, 向右走勢 0.10, 向下走勢 - 0.50
這樣就得到了一個完整的表格, 叫 Q-table, 占在哪個位置,往哪個方向走。 更容達到目標。
總結: Q-learning 其實是個很 low 的算法, 用諺語說就是:一回生,二回熟。
場景二其實是一樣的問題:
拐角處才有選擇, 非拐角處過濾掉。
個人覺得,用Q-learning 做迷宮, 還不如用 右手法則走迷宮; 反正電腦是傻的, 能達到目標就好。
更新公式:
q_target = r + self.gamma * self.q_table.ix[s_, :].max()
self.q_table.ix[s, a] += self.lr * (q_target - q_predict)
Sarsa 與Q-learning 的區別僅僅在於, 更新Q-table 表里的某一項的時候, 是先走, 還是先計算更新而已。 沒有大的區別。
再說 DQN :
DQN 在原先的Q-learning 上做了幾個處理:
1. 在選擇Action 的時候, 不是用 values.max; 而是用 predict().max
2. 在更新的時候, 不是更新 Q-learning 里的值, 而是通過訓練 定量的數據minbatch , 來更新網絡的 weights 。
更新了 weights , 其實就是變相更新 values.max 的計算方式; 也就確定了 Action 的選擇。
個人總結:
對於走宮格這類問題, 強化的概念反應在, 隨機走路后, 成功的路多走走。 逐步穩定固化。
迷宮 雖小, 可以用程序暴力解決(窮舉), 但是里面包含的思維方式,值得重視。 這樣可以拓展
到規模很大的計算上來, 可以加速成效。 但是用一維 4 dim 的(小數據)數據,去訓練神經網絡
感覺是大炮打蚊子。
