馬爾可夫決策過程中的動規

2022-08-20 08:15:11 字數 4753 閱讀 6351

記錄強化學習入門的相關演算法及實現。

通過以下步驟進行同步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 它們具有的乙個共同性質就是馬爾可夫性 無後效性 也就是指系統的下個狀態只與當前狀態資訊有關,而與更早之前的狀態無關。馬爾可夫決策過程...