MDP原理
其中内容大多基于AndrewNG的Youtube课程,python编码
Optimal value function:
V
π
(
s
)
=
R
(
s
)
+
γ
M
a
x
∑
s
′
ϵ
s
,
a
ϵ
A
P
s
π
(
s
′
)
V
π
(
s
′
)
V^\pi(s) = R(s) + \gamma Max\sum_{s'\epsilon s,a\epsilon A}P_{s\pi}(s')V^\pi(s')
Vπ(s)=R(s)+γMaxs′ϵs,aϵA∑Psπ(s′)Vπ(s′)
符号解释:
R
(
s
)
\R(s)
R(s)表示的是immediate reward
γ
M
a
x
∑
s
′
ϵ
s
P
s
π
(
s
′
)
V
π
(
s
′
)
\gamma Max\sum_{s'\epsilon s}P_{s\pi}(s')V^\pi(s')
γMax∑s′ϵsPsπ(s′)Vπ(s′)表示的是future discounted reward, 在future discounted reward中max的标志意味着会选取最优值
P
s
π
P_{s\pi}
Psπ代表着从当前状态S前往下一个状态S‘的概率转移矩阵
V
π
(
s
′
)
V^\pi(s')
Vπ(s′)代表下一个状态S’的状态函数
混淆点:
个人在根据AndrewNg的课堂笔记完成相关的课后程序设计时,在Optimal value function这个公式的符号理解上栽了跟头。
首先,第一个要明确的一点是,Optimal value function只考虑从当前状态S转移向S‘的过程中,并不考虑从状态S转移向最终状态的全过程。因此,公式中的
s
′
ϵ
s
s'\epsilon s
s′ϵs代表着下一个节点可能是总状态
S
S
S中的任意一个。
其次,Optimal value function数值的迭代更新往往是在全过程做完后通过新旧值差来不断逼近tolerance点完成的。因此,在执行policy的过程中,关于policy make总是基于上一次循环中的value的优化值。
最后,在每一个阶段中都相应地对应着一个value值,而不是随着每一个周期过程的进行一直更新到最后。
收敛代码:
def update_mdp_value(mdp_data, tolerance, gamma):
"""
Update the estimated values in your MDP.
Perform value iteration using the new estimated model for the MDP.
The convergence criterion should be based on `TOLERANCE` as described
at the top of the file.
Return true if it converges within one iteration.
Args:
mdp_data: The data for your MDP. See initialize_mdp_data.
tolerance: The tolerance to use for the convergence criterion.
gamma: Your discount factor.
Returns:
True if the value iteration converged in one iteration
"""
# *** START CODE HERE ***
iters = 0
transition_probs = mdp_data['transition_probs']
while True:
iters += 1
value = mdp_data['value']
new_value = mdp_data['reward'] + gamma * value.dot(transition_probs).max(axis=1)
mdp_data['value'] = new_value
if np.max(np.abs(value - new_value)) < tolerance:
break
return iters == 1
# *** END CODE HERE ***
POLICY MAKE:
π
=
a
r
g
m
a
x
a
ϵ
A
∑
s
′
ϵ
s
P
s
s
′
V
(
s
′
)
\pi = argmax_{a\epsilon A}\sum_{s'\epsilon s} P_{ss'}V(s')
π=argmaxaϵAs′ϵs∑Pss′V(s′)
混淆点:
个人在编写代码的时候栽跟头主要是因为认为
V
(
s
′
)
V(s')
V(s′)是在一个周期的过程中随着过程的推进不断更新的。然而
V
(
s
′
)
V(s')
V(s′)是一个固定值,只有在一周期结束后才会进行更新。
反思与心得
这是继卷积神经网络以后,第二次写代码出现问题了。主要是出现再对与公式的误解上。Value是一个周期后进行收敛变化的,但是我却当成了在一个周期中不断发生变化的。两次写代码的经验下来看,个人对于复杂模型的构建还是缺乏一定的能力。今后就主要向复杂模型的实现进发。