在前一篇博客中,我总结了强化学习的同策回合更新的方法,并用这种方法来学习21点游戏的最优策略。这里我将总结一下我学习到的异策回合更新的方法。
同策学习和异策学习的区别在于,同策是边决策边学习,学习者同时也是决策者。异策则是根据之前的历史来学习,学习者和决策者可以不同。以围棋AI为例,如果边对弈边学习,这就是同策学习。如果通过阅读人类的历史对弈记录来学习,那么就是异策学习。
在异策学习中,历史记录中用到的策略和我们要学习的策略是不同的,所以称为异策学习。我们将要学习的策略称为目标策略,用来生成历史记录的另一策略称为行为策略b,我们可以采用统计学中的重要性采样的概念,通过行为策略b生成的轨迹样本来生成目标策略的统计量。
重要性采样比率
考虑从t开始的轨迹,在给定的条件下,用策略和策略b生成这个轨迹的概率分别为:
我们把这两个概率的比值称为重要性采样比率:
为了让这个比率对于不同的轨迹都有意义,需要使得任何满足的,均有,这样的关系可以记为
增量法更新
回合更新总是采用Monte Carlo来估计价值函数的值。同策回合更新得到c个回报后,用平均值来作为价值函数的估计。这个方法默认了这c个回报是等概率出现的。类似的,异策回合更新用行为策略b得到c个回报,这c个回报对于行为概率b是等概率出现的,但是对于目标概率不是等概率出现的,这c个回报值出现的概率正是各轨迹的重要性采样比率。因此我们用加权平均来完成Monte Carlo估计。具体而言,若是回报样本对应的权重(轨迹的重要性采样比率),可以有以下两种采样方法:
1. 加权重要性采样:
2. 普通重要性采样:
这两种采样方法的区别在于分母部分,加权重要性采样会排除掉的参与平均。
对于加权重要性采样方法,采用增量法来更新加权平均值:
证明如下:
对于前n次观测到的回报,根据加权重要性采样的定义,值函数
令
这个就等价于我们刚才定义的
对于普通重要性采样,增量法更新为:
最优策略求解算法
在求解最优策略的时候,可以指定行为策略b为任意的一个柔性策略,让目标策略为确定性策略,在回合更新中,始终满足。算法如下:
1. (初始化)初始化动作价值估计q(s,a)为任意值,初始化权重和c(s,a)为0,
2. (回合更新)对每个回合执行以下操作
2.1 (柔性策略)指定b为任意柔性策略
2.2 (采样)用策略b生成轨迹:
2.3 (初始化回报和权重)
2.4 对于:
2.4.1 (更新回报)
2.4.2 (更新价值)更新以减少 (如, )
2.4.3 (策略更新)
2.4.4 (提前终止)若则退出步骤2.4
2.4.5 (更新权重), 因为
21点的最优策略求解
下面我们可以用异策回合更新算法来找出21点游戏的最优策略。在上一篇博文里面已经介绍了如何用Gym来模拟21点的环境以及用同策回合更新算法来求最优策略,这里不再重复,只是给出异策回合更新的算法,代码如下:
import gym
import numpy as np
import pandas as pd
env = gym.make("Blackjack-v0")
def ob2state(observation):
return(observation[0], observation[1], int(observation[2]))
def monte_carlo_importance_resample(env, episode_num=500000):
policy = np.zeros((22,11,2,2))
policy[:,:,:,0] = 1.
behavior_policy = np.ones_like(policy)*0.5 #柔性策略
q = np.zeros_like(policy) #价值函数
c = np.zeros_like(policy) #计数器
for _ in range(episode_num):
#每一回合
state_actions = []
observation = env.reset()
while True:
state = ob2state(observation)
action = np.random.choice(env.action_space.n, p=behavior_policy[state])
state_actions.append((state, action))
observation, reward, done, _ = env.step(action)
if done:
break
g = reward #每一回合最后结束时的奖励作为回报值
rho = 1. #重要性采样比率初始化
for state, action in reversed(state_actions):
c[state][action]+=rho
q[state][action]+=(rho/c[state][action])*(g-q[state][action])
a = q[state].argmax()
policy[state] = 0.
policy[state][a] = 1.
if a!=action:
break
rho /= behavior_policy[state][action]
return policy, q
p,q = monte_carlo_importance_resample(env)
blackjack_policy = {}
for i in range(4, 20):
blackjack_policy[str(i)] = []
for j in range(2, 11):
if p[i,j,0,0]<p[i,j,0,1]:
blackjack_policy[str(i)].append('H')
else:
blackjack_policy[str(i)].append('S')
if p[i,1,0,0]<p[i,1,0,1]:
blackjack_policy[str(i)].append('H')
else:
blackjack_policy[str(i)].append('S')
for i in range(13, 20):
key = 'A,'+str(i-11)
blackjack_policy[key] = []
for j in range(2, 11):
if p[i,j,1,0]<p[i,j,1,1]:
blackjack_policy[key].append('H')
else:
blackjack_policy[key].append('S')
if p[i,1,1,0]<p[i,1,1,1]:
blackjack_policy[key].append('H')
else:
blackjack_policy[key].append('S')
with open('blackjack_policy.csv', 'w') as f:
result = 'Player;2;3;4;5;6;7;8;9;10;A\n'
for key in blackjack_policy:
result += (key+';'+';'.join(blackjack_policy[key])+'\n')
f.write(result)
df = pd.read_csv('blackjack_policy.csv', header=0, index_col=0, sep=';')
df.head(100)
输出结果如下:
Player | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | A |
---|---|---|---|---|---|---|---|---|---|---|
4 | H | H | H | H | H | H | H | H | H | H |
5 | H | H | H | H | H | H | H | H | H | H |
6 | H | H | H | H | H | H | H | H | H | H |
7 | H | H | H | H | H | H | H | H | H | H |
8 | H | H | H | H | H | H | H | H | H | H |
9 | H | H | H | H | H | H | H | H | H | H |
10 | H | H | H | H | H | H | H | H | H | H |
11 | H | H | H | H | H | H | H | H | H | H |
12 | H | H | H | S | S | H | H | H | H | H |
13 | S | S | S | S | S | H | H | H | H | H |
14 | S | S | S | S | S | H | H | H | H | H |
15 | S | S | S | S | S | H | H | H | H | H |
16 | S | S | S | S | S | H | H | H | H | H |
17 | S | S | S | S | S | S | S | S | S | H |
18 | S | S | S | S | S | S | S | S | S | S |
19 | S | S | S | S | S | S | S | S | S | S |
A,2 | H | H | H | H | H | H | H | H | H | H |
A,3 | H | H | H | H | H | H | H | H | H | H |
A,4 | H | H | H | H | H | H | H | H | H | H |
A,5 | H | H | H | H | H | H | H | H | H | H |
A,6 | H | H | H | H | H | H | H | H | H | H |
A,7 | S | S | H | H | H | S | S | H | H | H |
A,8 | S | S | S | S | S | S | S | S | S | S |