强化学习 # Q

编程入门 行业动态 更新时间:2024-10-09 03:23:19

强化学习 # Q

强化学习 # Q

  • 【UPDATE 2021/12/10】由于写作需求将本章原本的强化学习概述部分单独拆出来,并对内容进行扩充。因此初步接触强化学习/深度强化学习概念的同学请参考本文:强化学习 # 概述

详细教程参考REF.1,本文是根据reference的个人笔记,外加一些其他的参考资料。

Q-Learning

1 一个案例

Q-Learning决策


Q表:行为准则
假设已知行为准则 ,现在我处于状态s1, 我在写作业, 我有两个行为 a1, a2, 分别是看电视和写作业, 根据我的经验, 在 s1 下, a2 写作业 带来的奖励要比 a1 看电视高, 这里的奖励可以用一个关于 s 和 a 的 Q 表代替。
又Q(s1, a1)=-2 < Q(s1, a2)=1, 所以要选择 a2 作为下一个行为. 现在状态更新成 s2 , 我们还是有两个同样的选择, 重复上面的过程, 在行为准则Q 表中比较 Q(s2, a1) Q(s2, a2) 的值, 选取较大的一个. 接着根据 a2 我们到达 s3 并在此重复上面的决策过程

Q-Learning更新


上面假设Q表不变动。这里我们考虑Q表的更新情况。
回到之前的流程, 根据 Q 表的估计, 因为在 s1 中, a2 大, 通过之前的决策方法, 我们在 s1 采取了a2到达 s2, 这时我们开始更新用于决策的 Q 表。接着我们并没有在实际中采取任何行为, 而是再想象自己在 s2 上采取了每种行为, 分别看看两种行为哪一个的 Q 值大。
比如Q(s2, a2) >Q(s2, a1),我们把大的 Q(s2, a2) 乘上一个衰减值 gamma (比如是0.9) 并加上到达s2时所获取的奖励 R (这里还没有获取到我们的棒棒糖, 所以奖励为 0),我们将这个Q(s2,a2)*gamma+R作为现实中 Q(s1, a2) 的值。
但是start是估计的Q(s1, a2) 的值. 所以有了现实和估计值的差距diff, 我们就能更新Q(s1, a2)为diff*alpha+Q(S1,a2),alpha为学习效率。
我们虽然用 maxQ(s2) 估算了一下 s2 状态, 但还没有在 s2 做出任何的行为, s2 的行为决策要等到更新完了以后再重新另外做.

这就是 off-policy 的 Q learning 是如何决策和优化决策的过程.

PS: on-policy与off-policy的本质区别在于:更新Q值时所使用的方法是沿用既定策略(on-policy)还是使用新策略(off-policy)

2 算法介绍


每次更新我们都用到了 Q 现实和 Q 估计。
参数解释:
Epsilon greedy是用在决策上的一种策略,比如 epsilon = 0.9 时, 就说明有90% 的情况我会按照 Q 表的max-value选择行为, 10% 的情况使用随机选择的行为。
alpha:学习率, 来决定这次的误差有多少是要被学习的
gamma:对未来 reward 的衰减值.

QLearning 中的 Gamma


重写一下 Q(s1) 的公式, 将 Q(s2) 拆开, 因为Q(s2)可以像 Q(s1)一样,是关于Q(s3) 的…可以看出Q(s1) 是有关于之后所有的reward, 但这些reward正在衰减, 离 s1 越远的状态衰减越严重

我们想象 Qlearning 的机器人天生近视眼, gamma = 1 时, 机器人有了一副合适的眼镜,在 s1 看到的 Q 是未来没有任何衰变的reward。机器人能清清楚楚地看到之后所有步的全部价值。
当 gamma =0, 近视机器人没了眼镜, 只能摸到眼前的 reward, 同样也就只在乎最近的大奖励,如果 gamma 从 0 变到 1, 眼镜的度数由浅变深, 对远处的价值看得越清楚, 所以机器人渐渐变得有远见, 不仅仅只看眼前的利益, 也为自己的未来着想。

3 实验

实验:用tabular Q-learning实现一个demo,例子的环境是一个一维世界, 在世界的右边有宝藏
实验全部代码:github

-o---T
# T 就是宝藏的位置, o 是探索者的位置

3.1 pre setting

import numpy as np
import pandas as pd
import timeN_STATES = 6   # 1维世界的宽度
ACTIONS = ['left', 'right']     # 探索者的可用动作
EPSILON = 0.9   # 贪婪度 greedy
ALPHA = 0.1     # 学习率
GAMMA = 0.9    # 奖励递减值
MAX_EPISODES = 13   # 最大回合数
FRESH_TIME = 0.3    # 移动间隔时间

3.2 Q-Table

对于 tabular Q learning:我们必须将所有的 Q values (行为值) 放在 q_table 中, 更新 q_table 也是在更新他的行为准则. q_table 的 index 是所有对应的 state (探索者位置), columns 是对应的 action (探索者行为).

def build_q_table(n_states, actions):table = pd.DataFrame(np.zeros((n_states, len(actions))),     # q_table 全 0 初始columns=actions,    # columns 对应的是行为名称)return table# q_table:
"""left  right
0   0.0    0.0
1   0.0    0.0
2   0.0    0.0
3   0.0    0.0
4   0.0    0.0
5   0.0    0.0
"""

3.3 定义动作

我们引入 epsilon greedy 的概念. 因为在初始阶段, 随机的探索环境, 往往比固定的行为模式要好, 所以这也是累积经验的阶段, 我们希望探索者不会那么贪婪(greedy). EPSILON 用来控制贪婪程度的值. EPSILON 可以随着探索时间不断提升(越来越贪婪), 不过在这个例子中, 我们就固定成 EPSILON = 0.9, 90% 的时间是选择最优策略, 10% 的时间来探索.

# 在某个 state 地点, 选择行为
def choose_action(state, q_table):state_actions = q_table.iloc[state, :]  # 选出这个 state 的所有 action 值if (np.random.uniform() > EPSILON) or (state_actions.all() == 0):  # 非贪婪 or 或者有 state 还没有探索过action_name = np.random.choice(ACTIONS)else:action_name = ACTIONS[state_actions.argmax()]# 或者:action_name = state_actions.idxmax()return action_name

这里原参考资料代码有误,需要修改为action_name = ACTIONS[state_actions.argmax()]
因为argmax()在新版中行为有变化,返回的是序数(不是’left’,‘right’)

3.4 环境反馈 S_, R

做出行为后, 环境也要给我们的行为一个反馈, 反馈出下个 state (S_) 和 在上个 state (S) 做出 action (A) 所得到的 reward(R ). 这里定义的规则就是, 只有当 o 移动到了 T, 探索者才会得到唯一的一个奖励, 奖励值 R=1, 其他情况都没有奖励

def get_env_feedback(S, A):# This is how agent will interact with the environmentif A == 'right':    # move rightif S == N_STATES - 2:   # terminateS_ = 'terminal'R = 1else:S_ = S + 1R = 0else:   # move leftR = 0if S == 0:S_ = S  # reach the wallelse:S_ = S - 1return S_, R

3.5 环境更新

def update_env(S, episode, step_counter):# This is how environment be updatedenv_list = ['-']*(N_STATES-1) + ['T']   # '---------T' our environmentif S == 'terminal':interaction = 'Episode %s: total_steps = %s' % (episode+1, step_counter)print('\r{}'.format(interaction), end='')time.sleep(2)print('\r                                ', end='')else:env_list[S] = 'o'interaction = ''.join(env_list)print('\r{}'.format(interaction), end='')time.sleep(FRESH_TIME)

3.6 强化学习主循环

整个算法就是一直不断更新 Q table 里的值, 然后再根据新的值来判断要在某个 state 采取怎样的 action,

def rl():q_table = build_q_table(N_STATES, ACTIONS)  # 初始 q tablefor episode in range(MAX_EPISODES):     # 回合step_counter = 0S = 0   # 回合初始位置is_terminated = False   # 是否回合结束update_env(S, episode, step_counter)    # 环境更新while not is_terminated:A = choose_action(S, q_table)   # 选行为S_, R = get_env_feedback(S, A)  # 实施行为并得到环境的反馈q_predict = q_table.loc[S, A]    # 估算的(状态-行为)值if S_ != 'terminal':q_target = R + GAMMA * q_table.iloc[S_, :].max()   #  实际的(状态-行为)值 (回合没结束)else:q_target = R     #  实际的(状态-行为)值 (回合结束)is_terminated = True    # terminate this episodeq_table.loc[S, A] += ALPHA * (q_target - q_predict)  #  q_table 更新S = S_  # 探索者移动到下一个 stateupdate_env(S, episode, step_counter+1)  # 环境更新step_counter += 1return q_table

entry:

if __name__ == "__main__":q_table = rl()print('\r\nQ-table:\n')print(q_table)

4 Q-Learning算法更新

大多数 RL 是由 reward 导向的, 所以定义 reward 是 RL 中比较重要的一点。
Qlearning 是一个 off-policy 的算法, 因为里面的 max action 让 Q table 的更新可以不基于正在经历的经验(可以是现在学习着很久以前的经验,甚至是学习他人的经验). 整个算法就是一直不断更新 Q table 里的值, 然后再根据新的值来判断要在某个 state 采取怎样的 action.

新的案例的代码:github

代码解读:
maze_env:环境模块
RL_brain:核心算法

def update():# 学习 100 回合for episode in range(100):# 初始化 state 的观测值observation = env.reset()while True:# 更新可视化环境env.render()# RL 大脑根据 state 的观测值挑选 actionaction = RL.choose_action(str(observation))# 探索者在环境中实施这个 action, 并得到环境返回的下一个 state 观测值, reward 和 done (是否是掉下地狱或者升上天堂)observation_, reward, done = env.step(action)# RL 从这个序列 (state, action, reward, state_) 中学习RL.learn(str(observation), action, reward, str(observation_))# 将下一个 state 的值传到下一次循环observation = observation_# 如果掉下地狱或者升上天堂, 这回合就结束了if done:break# 结束游戏并关闭窗口print('game over')env.destroy()if __name__ == "__main__":# 定义环境 env 和 RL 方式env = Maze()RL = QLearningTable(actions=list(range(env.n_actions)))# 开始可视化环境 envenv.after(100, update)env.mainloop()

Reference

[1]mofany-Reinforcement-learning
[2]强化学习入门简述
[3]强化学习中on-policy 与off-policy有什么区别?
[4]《Reinforcement Learning:An Introduction》
[5]《深度强化学习:学术前沿与实战应用》

书籍

经典圣经《Reinforcement Learning:An Introduction》Sutton
(ps:一上来就看Sutton的大作容易迷失在知识的海洋中…)

更多推荐

强化学习 # Q

本文发布于:2024-02-14 09:56:21,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1762722.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!