给定环境MDP和策略𝜋,策略值函数估计如下
V
π
(
s
)
=
E
[
R
(
s
0
,
a
0
)
+
γ
R
(
s
1
,
a
1
)
+
γ
2
R
(
s
2
,
a
2
)
+
⋯
∣
s
0
=
s
,
π
]
=
E
a
∼
π
(
s
)
[
R
(
s
,
a
)
+
γ
∑
s
′
∈
S
P
s
π
(
s
)
(
s
′
)
V
π
(
s
′
)
]
=
E
a
∼
π
(
s
)
[
Q
π
(
s
,
a
)
]
Q
π
(
s
,
a
)
=
E
[
R
(
s
0
,
a
0
)
+
γ
R
(
s
1
,
a
1
)
+
γ
2
R
(
s
2
,
a
2
)
+
⋯
∣
s
0
=
s
,
a
0
=
a
,
π
]
=
R
(
s
,
a
)
+
γ
∑
s
′
∈
S
P
s
π
(
s
)
(
s
′
)
V
π
(
s
′
)
Vπ(s)=E[R(s0,a0)+γR(s1,a1)+γ2R(s2,a2)+⋯|s0=s,π]=Ea∼π(s)[R(s,a)+γ∑s′∈SPsπ(s)(s′)Vπ(s′)]=Ea∼π(s)[Qπ(s,a)]Qπ(s,a)=E[R(s0,a0)+γR(s1,a1)+γ2R(s2,a2)+⋯|s0=s,a0=a,π]=R(s,a)+γ∑s′∈SPsπ(s)(s′)Vπ(s′)
Vπ(s)Qπ(s,a)=E[R(s0,a0)+γR(s1,a1)+γ2R(s2,a2)+⋯∣s0=s,π]=Ea∼π(s)[R(s,a)+γs′∈S∑Psπ(s)(s′)Vπ(s′)]=Ea∼π(s)[Qπ(s,a)]=E[R(s0,a0)+γR(s1,a1)+γ2R(s2,a2)+⋯∣s0=s,a0=a,π]=R(s,a)+γs′∈S∑Psπ(s)(s′)Vπ(s′)
在强化学习中,无特殊说明的话,模型通常指的是环境模型,而非智能体模型。
定义:给定一个状态和动作,模型能够预测下一个状态和奖励的分布: 即
P
(
s
′
,
r
∣
s
,
a
)
\mathcal P(s',r|s,a)
P(s′,r∣s,a)
模型的分类
模型的作用
定义:输入一个模型,输出一个策略的搜索过程
规划的分类:
规划的通用框架
注意:Q-learning用的是真实环境产生的经验数据,而Q-planning则是利用模型产生的模拟经验。
通过于环境交互产生的经验可以有以下两种途径:
环境
• 4个动作(上下左右)
• 碰到障碍物和边界静止
• 到达目标(𝐺),得到奖励+1
• 折扣因子 0.95
结果
• 横轴代表游戏轮数
• 纵轴代表到达 𝐺 花的时间步长
• 不同曲线代表采用不同的规划步长
• 规划步长越长,表现收敛越快
那么为什么Dyna算法会更快呢?
通过更多的sample,可以使得策略更优,更容易靠近终点。
模型不准?
原因:
Dyna-Q+:
Dyna-Q+能够发现捷径(鼓励探索)
class DynaQ():
def __init__(self, env, gamma, alpha, epsilon, numOfEpisodes, numOfTrainQLearning, numOfActions=4):
self.env = env
self.gamma = gamma
self.alpha = alpha
self.epsilon = epsilon
self.numOfEpisodes = numOfEpisodes
self.numOfActions = numOfActions
# 初始化Q(s, a)表
self.Q_table = np.zeros([self.env.nrows * self.env.ncols, numOfActions])
# 初始化模型
self.Model = dict()
# Q-learning 训练次数
self.numOfTrainQLearning = numOfTrainQLearning
# Choose A from S using policy derived from Q (e.g., epsilon-greedy)
def ChooseAction(self, state):
if np.random.random() < self.epsilon:
action = np.random.randint(self.numOfActions)
else:
action = np.argmax(self.Q_table[state])
return action
def DynaQRun(self):
# 记录每一条序列的回报
returnList = []
# 显示10个进度条
for i in range(10):
# tqdm的进度条功能
with tqdm(total=int(self.numOfEpisodes / 10), desc='Iteration %d' % i) as pbar:
# 每个进度条的序列数
for episode in range(int(self.numOfEpisodes / 10)):
# initialize state
state = self.env.Reset()
done = False
episodeReward = 0
# Loop for each step of episode:
while not done:
# Choose A from S using policy derived from Q (e.g., epsilon-greedy)
action = self.ChooseAction(state)
# Take action A, observe R, S'
stateprime, reward, done = self.env.Step(action)
episodeReward += reward
# Update
TD_error = reward + self.gamma * self.Q_table[stateprime].max() \
- self.Q_table[state, action]
self.Q_table[state,action] += self.alpha * TD_error
# 将数据添加到模型中
self.Model[(state, action)] = stateprime, reward
# Q-planning循环
for i in range(self.numOfTrainQLearning):
# 随机选择曾经遇到过的状态动作对
(s, a), (s_next, r) = random.choice(list(self.Model.items()))
# Q-plannnig
TD_error = r + self.gamma * self.Q_table[s_next].max() \
- self.Q_table[s, a]
self.Q_table[s, a] += self.alpha * TD_error
state = stateprime
returnList.append(episodeReward)
if (episode + 1) % 10 == 0: # 每10条序列打印一下这10条序列的平均回报
pbar.set_postfix({
'episode':
'%d' % (self.numOfEpisodes / 10 * i + episode + 1),
'return':
'%.3f' % np.mean(returnList[-10:])
})
pbar.update(1)
return returnList
Q-planning训练次数为0
可以看到,当Dyna-Q的Q-planning训练次数为0时,Dyna-Q就退化成了Q-learning。
十次训练平均:
随着 Q-planning 步数的增多,Dyna-Q 算法的收敛速度也随之变快。当然,并不是在所有的环境中,都是 Q-planning 步数越大则算法收敛越快,这取决于环境是否是确定性的,以及环境模型的精度。在上述悬崖漫步环境中,状态的转移是完全确定性的,构建的环境模型的精度是最高的,所以可以通过增加 Q-planning 步数来直接降低算法的样本复杂度。
[1] 伯禹AI
[2] https://www.deepmind.com/learning-resources/introduction-to-reinforcement-learning-with-david-silver
[3] 动手学强化学习
[4] Reinforcement Learning