详见http://t.csdnimg.cn/NHFGE
给定环境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 ′ ) \begin{aligned} V^{\pi}(s)& =\mathbb{E}[R(s_{0},a_{0})+\gamma R(s_{1},a_{1})+\gamma^{2}R(s_{2},a_{2})+\cdots|s_{0}=s,\pi] \\ &=\mathbb{E}_{a\sim\pi(s)}\left[R(s,a)+\gamma\sum_{s^{\prime}\in S}P_{s\pi(s)}(s^{\prime})V^{\pi}(s^{\prime})\right] \\ &=\mathbb{E}_{a\sim\pi(s)}[Q^{\pi}(s,a)] \\ Q^{\pi}(s,a)& =\mathbb{E}[R(s_{0},a_{0})+\gamma R(s_{1},a_{1})+\gamma^{2}R(s_{2},a_{2})+\cdots|s_{0}=s,a_{0}=a,\pi] \\ &=R(s,a)+\gamma\sum_{s^{\prime}\in S}P_{s\pi(s)}(s^{\prime})V^{\pi}(s^{\prime}) \end{aligned} 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,可以使得策略更优,更容易靠近终点。
模型不准?
原因:
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