莫烦强化学习笔记整理(二)Q-learning
Q-leaning算法代码地址 link.
1、什么是Q-learning
(1) Q-learning决策
S1当前状态,A1为看电视行为,A2为写作业行为。
在S1状态时,凭借经验学习,A2行为的潜在奖励比A1要高,所以做A2行为,这个潜在奖励用Q值来表示。此时状态更新为S2,接下来继续选择Q值高的行为A2,状态到达S3,继续上面的决策过程。
状态 | 行为 | Q值 |
---|---|---|
S1 | A1 | -2 |
S1 | A2 | 1 |
S2 | A1 | -4 |
S2 | A2 | 2 |
(2)Q-learning更新
回到上面的过程,S1状态我们选择了A2行为并到达了状态S2,需要对Q值进行更新,即Q(S1,A2)。
Q(S1,A2)估计值=老Q(S1,A2)
Q(S1,A2)现实值=R+y*max{Q(S2,A1),Q(S2,A2)}
R为到达S2的奖励值,y(gamma)为衰减率。Q(S2,A1),Q(S2,A2)为S2状态下A1和A2行为的估计Q值,是未发生的、想象出来的。
差距=Q(S1,A2)现实值-Q(S1,A2)估计值
新Q(S1,A2)=老Q(S1,A2)+a*差距
a(alpha)为学习率,S2状态的行为决策要等到Q(S1,A2)更新完成之后再进行。
(3)Q-learning算法概述
图中用一个公式总结了Q值更新的规律。
Q learning 的迷人之处就是 在 Q(s1, a2) 现实 中, 包含了一个 Q(s2) 的最大估计值, 将对下一步的衰减的最大估计和当前所得到的奖励当成这一步的现实。
公式中一些参数的意义:
Epsilon greedy 是用在决策上的一种策略, 比如 epsilon = 0.9 时, 就说明有90% 的情况我会按照 Q 表的最优值选择行为, 10% 的时间使用随机选行为. alpha是学习率, 来决定这次的误差有多少是要被学习的, alpha是一个小于1 的数. gamma 是对未来 reward 的衰减值.
gamma = 1 时, 在 s1 看到的 Q 是未来没有任何衰变的奖励, 也就是能清楚地看到之后所有步的全部价值
gamma =0, 眼前的 reward, 只在乎最近的大奖励。
gamma 从 0 变到 1, 对远处的价值看得越清楚, 所以智能体渐渐变得有远见, 不仅仅只看眼前的利益, 也为自己的未来着想。
2、Q-leaning的一个小例子
用 tabular Q-learning 的方法实现一个小例子, 例子的环境是一个一维世界, 探索者O在世界的左边尽头,在世界的右边尽头有宝藏T, 世界是几个“-------”道路。探索者有向左走和向右走两种行为选择,第一次经过多次试错得到宝藏, 然后以后就记住了得到宝藏的方法, 即一直向右走,这就是他用强化学习所学习到的行为。
Q-learning 是一种记录行为值 (Q值) 的方法, 每种在一定状态的行为都会有一个值 Q(s, a), 行为 a 在 s 状态的值是 Q(s, a)。s 在上面的探索者游戏中, 是 o 所在的地点,每一个地点探索者都能做出两个行为 left/right, 这就是探索者的所有可行的 a。
如果在某个地点 s1, 探索者计算了他能有的两个行为, a1/a2=left/right, 计算结果是 Q(s1, a1) < Q(s1, a2), 那么探索者就会选择 right 这个行为. 这就是 Q learning 的行为选择简单规则。
最终效果
O经过多次尝试之后学会了直行向右,并打印Q表
代码实现和注释
(1)导入模块包并预设变量
Numpy、Pandas模块包基本的用法也可以参考莫烦的教程,教程链接:https://mofanpy.com/tutorials/data-manipulation/np-pd/
Time模块是用来控制动画速度的,可以进行时间有关的操作。
import numpy as np
import pandas as pd
import time
N_STATES = 6 # 1维世界的宽度
ACTIONS = ['left', 'right'] # 探索者的可用动作
EPSILON = 0.9 # 贪婪度 greedy
ALPHA = 0.1 # 学习率
GAMMA = 0.9 # 奖励递减值
MAX_EPISODES = 13 # 最大回合数
FRESH_TIME = 0.3 # 移动间隔时间
(2)初始化Q表并输出
对于 tabular Q learning, 要将所有的 Q values (行为值) 放在 q_table 中, 更新 q_table 也是在更新他的行为准则。q_table 的 index 是所有对应的 state (探索者位置), columns 是对应的 action (探索者行为)。
def build_q_table(n_states, actions)