記錄強化學習入門的相關演算法及實現。
通過以下步驟進行同步backup,從而評估乙個給定的 policy :
在第 $k+1$ 輪,
對於所有狀態 $s\in s$,
更新
$v_(s)=\sum_}\pi(a|s)(\mathcal_sa+\gamma\sum_}\mathcal_a v_k(s'))$
其中, $s'$ is a successor state of $s$
## **實現
def policy_eval(policy, env, discount_factor=1.0, theta=0.00001):
# value function初始化為全0/隨機數
v = np.zeros(env.ns)
while true:
delta = 0
# 對每個狀態進行backup
for s in range(env.ns):
v = 0
# 查詢有可能的下一狀態
for a, action_prob in enumerate(policy[s]):
# 對於每個動作,查詢可能的下一狀態
for prob, next_state, reward, done in env.p[s][a]:
# 計算**值v
v += action_prob * prob * (reward + discount_factor * v[next_state])
# 獲得所有狀態下,最大的value function更新程度
delta = max(delta, np.abs(v - v[s]))
v[s] = v
# 更新程度小於閾值時停止評估
if delta < theta:
break
return np.array(v)
策略迭代的目標是獲得最優策略,其步驟如下:
給定乙個策略 $\pi$,
評估$\pi$: $v_\pi(s)=\mathbb[r_+\gamma r_+...|s_t=s]$
貪心地改善$\pi$: $\pi '=greedy(v_\pi)$
其中,改善策略 $\pi$ 的步驟如下:
給定乙個策略 $\pi$,且 $a=\pi(s)$
首先改善策略: $\pi '(s)=\arg\max_}q_\pi(s,a)$
再改善值from any state $s$ over one step:
$$q_\pi(s,\pi '(s))=\max_}q_\pi(s,a)\geq q_\pi(s,\pi(s))=v_\pi(s)
$$因此改善了value function,有 $v_(s)\geq v_\pi(s)$(證明過程如下)
$$\begin
v_\pi(s)&\leq q_\pi(s,\pi'(s))=\mathbb[r+\gamma v_\pi(s_)|s_t=s]\
&\leq\mathbb[r+\gamma q_\pi(s_,\pi'(s_))|s_t=s]\
&\leq\mathbb[r+\gamma r_+\gamma^2 q_\pi(s_,\pi'(s_))|s_t=s]\
&\leq\mathbb[r+\gamma r_+...|s_t=s]=v_(s)
\end
$$
[理論上]當滿足條件$q_\pi(s,\pi '(s))=\max_}q_\pi(s,a)= q_\pi(s,\pi(s))=v_\pi(s)$(此時對任意狀態s,都有$v_\pi(s)=v_(s)$)時,停止improvement。[實際中]定義乙個閾值$\epsilon$,當value function的更新程度 $\leq\epsilon$時,停止improvement*;或者,直接設定在k輪之後停止。
## **實現(policy_eval是前面的策略評估函式)
def policy_improvement(env, policy_eval_fn=policy_eval, discount_factor=1.0):
# 初始化策略
policy = np.ones([env.ns, env.na]) / env.na
while true:
# 評估當前策略
v = policy_eval_fn(env, policy, discount_factor)
# 若對策略進行了變動,則policy_stable為false
policy_stable = true
# 對每個狀態
for s in range(env.ns):
# 選擇在當前策略下可採取的最佳動作
chosen_a = np.argmax(policy[s])
# 向前一步尋找最佳動作
action_values = np.zeros(env.na)
for a in range(env.na):
for prob, next_state, reward, done in env.p[s][a]:
action_values[a] += prob * (reward + discount_factor * v[next_state])
best_a = np.argmax(action_values)
# 貪心更新策略
if chosen_a != best_a:
policy_stable = false
policy[s] = np.eye(env.na)[best_a]
# 找到了最優策略
if policy_stable:
return policy, v
值迭代的目標也是獲得最優策略,其步驟如下:
在第 $k+1$ 輪,
對於所有狀態 $s\in s$,
更新
$v_(s)=\max_}(\mathcal_sa+\gamma\sum_}\mathcal_a v_k(s'))$
其中, $s'$ is a successor state of $s$
value iteration (vi) 逆向地(從狀態s'到s)迴圈處理整個狀態空間,直到找到最優路徑(即 a set of optimal actions)value更新在vi 中和在pe (policy evaluation) 中的區別在於:
## **實現
def value_iteration(env, theta=0.0001, discount_factor=1.0):
def one_step_lookahead(state, v):
a = np.zeros(env.na)
for a in range(env.na):
for prob, next_state, reward, done in env.p[state][a]:
a[a] += prob * (reward + discount_factor * v[next_state])
return a
v = np.zeros(env.ns)
while true:
# 停止更新的條件
delta = 0
# 對每個狀態
for s in range(env.ns):
# 向前一步尋找最優動作的值(!注意這裡是值,要和策略迭代區分開來)
a = one_step_lookahead(s, v)
best_action_value = np.max(a)
# 獲得所有狀態下,最大的value function更新程度
delta = max(delta, np.abs(best_action_value - v[s]))
# 更新value function
v[s] = best_action_value
# 更新程度小於閾值時停止更新
if delta < theta:
break
# 根據最優的value function得到policy
policy = np.zeros([env.ns, env.na])
for s in range(env.ns):
# 向前一步尋找最優動作
a = one_step_lookahead(s, v)
best_action = np.argmax(a)
# 總是選擇最優動作
policy[s, best_action] = 1.0
return policy, v
馬爾可夫決策過程(四)
最近學習了 mdp,檢視一些資料,本文翻譯了維基百科 有許多地方翻譯的不好,有翻譯錯的地方請多多諒解!歡迎給我留下意見,我會盡快更改!值得注意的變種 值迭代 在值迭代 貝爾曼 1957 年 中,也被稱為 逆向歸納法,陣列是不被使用的,而是當需要時就計算 s 的值。代入 s 的計算結果到 v s 得到...
馬爾可夫決策過程 MDP
但是馬爾科夫過程中不存在動作 action 和獎勵 reward 所有馬爾科夫過程不足以描述圖1所示的強化學習過程。將動作 action 和獎勵 reward 考慮到馬爾科夫過程中去就得到了馬爾科夫決策過程。跟馬爾科夫過程不同的是,馬爾科夫決策過程的狀態轉移概率是包含動作的即 pss a p st ...
work 馬爾可夫決策過程MDP
1.馬爾可夫模型的幾類子模型 大家應該還記得馬爾科夫鏈 markov chain 了解機器學習的也都知道隱馬爾可夫模型 hidden markov model,hmm 它們具有的乙個共同性質就是馬爾可夫性 無後效性 也就是指系統的下個狀態只與當前狀態資訊有關,而與更早之前的狀態無關。馬爾可夫決策過程...