- Q-learning 是RL的核心
- Q 代表 Quality 品质
系统维护一个Q值表:
1 | 3.3 | 1.6 |
2 | 2.6 | 7.8 |
3 | 2.4 | 9.5 |
4 | 1.3 | 5.6 |
当前agent下一步要采取什么动作,完全根据当前状态的Q值来判断:
在状态1的时候,采取动作价值更大( 3.3 > 1.6)。
在状态3的时候,采取动作价值更大(9.5 > 2.4)。
里面每个数值叫。比如
各种表达公式总结:
获取状态s的V: 或 返回的是所有action的值
第4个状态 对应的V: 或 返回的是所有action对应的值
第4个状态 动作1 对应的V:
t 时刻的状态 / 动作 对应的V:
状态 对应动作的V:
状态 对应动作的V:
状态 对应动作的概率:
状态s里,V最大的动作: 或
状态s里,所有动作中,最大的V: 或
如何计算Q值表,便是Q-Learning要做的事情。
然后agent通过一个策略,结合Q表,做出动作选择。
比如这样的策略:90%的情况下选择值大的动作,%10的情况随机选一个。
# select_action
def policy_pi(state):
if random.random() > 0.9:
return random_action
else:
return argmax(state)
蒙特卡洛MC法:
首先,是通过每一个状态获取的奖励算出来的。具体算法后面讲。先用来表示,的意思是,这个函数,会在策略里面使用。会根据当前 state 来产生 action:
def pi(s):
#.....
return a
如果策略不是一个固定的值,而是返回一个概率,状态a下执行动作s的概率:
# select_action
def policy_pi(state):
return (p_act_0, p_act_1)
MC的基础思想就是:让agent不停的去尝试各种可能,获取奖励,算出单次值,最后计算所有的平均值作为总的值。
完整的收集各种状态/动作/奖励,直到此经历结束,比如:
. | ep1 | ep2 | ep3 | ep4 | ep5 | ... |
---|---|---|---|---|---|---|
state | a | b | c | d | a | ... |
action | 0 | 1 | 1 | 0 | 0 | ... |
reward | 1 | 1 | 1 | 0 | 1 | ... |
. | ep1 | ep2 | ep3 | ep4 | ep5 | ... |
---|---|---|---|---|---|---|
state/action | a,0 | b,1 | c,1 | d,0 | a,0 | ... |
reward | 1 | 1 | 1 | 0 | 1 | ... |
state/action | reward = R(s,a) |
---|---|
a,0 | 1 |
b,1 | 1 |
c,1 | 1 |
d,0 | 0 |
a,0 | 1 |
单次迭代的得分计算方法:因为状态/动作是一个连续的序列,后续也会影响到前面的,所以每个状态的,都需要包含后续所有动作的。
state/action | |
---|---|
a,0 | |
b,1 | |
c,1 | |
d,0 | |
a,0 |
后续步骤的奖励,可能并没有那么重要,所以需要做一个递减,加入一个 < 1 的递减:
state/action | |
---|---|
a,0 |
经过无数次迭代后,某个状态/动作收集了无数个,取平均值,便是这个状态/动作的 值。公式表示如下:
这就是 Reward Hypothesis 奖励假说中的“递减奖励累加”
这个也会被写作: 反正都是一回事。
如何实现?要么:
- 维护一个G的list,算平均值,要么
- 用动态平均值函数:
( a是平均值,v是新加入的值 )
求V的公式便出来了:
也就是这样不停的去迭代,直到结果足够好:
时间差分TD法:
初始Q值表,全是0
s | ||
---|---|---|
1 | 0 | 0 |
2 | 0 | 0 |
3 | 0 | 0 |
... | ... | ... |
状态 经过动作后,变为状态,再经过动作后,变为其他状态。
的所有动作:
公式:
或
都是常量
alpha 可以看作是遗忘率,越大,本次奖励越重要(之前同等状态下的奖励情况都忘了)
gamma 可以看作是后续奖励重要性,越大,基于本次行为的以后可获得奖励越重要(长远考虑)
可以看出,如果状态比较多,action也很多的情况下,Q table是无法适用的。cart pole环境state有4个变量:位置、速度、角度、角速度,两个动作:左、右。
1.2 | -2.1 | 0.1 | -2.1 | 3.1 | 4.5 |
如果 4个变量离散化,只保留0~10的范围,那么这个表的大小是:,这个精度很低了,对cart pole来说凑活够用,1维的小车,已经2万个Q值了,那如果是2维、3维连续坐标空间,要求又很精细,参数又很多的话,比如现实中的自动驾驶,动作有 左转n度/右转n度/刹车力度/加速力度,太离散化的取值,是无法完成任务的,但是将采样粒度设置的特别小,又是无法完成的任务。这种时候,就要直接对策略进行优化了,而不是通过Q值,这是 policy gradient