强化学习
1、什么是强化学习
强化学习是机器学习的一个重要分支,是多学科多领域交叉的一个产物,它的本质是解决 decision making 问题,即自动进行决策,并且可以做连续决策。
它主要包含四个元素,agent,环境状态,行动,奖励, 强化学习的目标就是获得最多的累计奖励。
类比强化学习和动物学习
训练幼犬的过程有两个要素:
饲养员需要对幼犬发出指令,比如让它“坐着”,
饲养员手中有动物非常想要的东西,即奖赏。对狗来说,奖赏就是食物。
对于智能体(Agent,即计算机)来说,我们希望通过类似的方法能够训练智能体,我们把其中的要素抽象出来,可以用下面这个图来表示:
怎么评判智能体策略的好坏呢?一般评判的形式就是,它能拿到的奖赏会有多大。每一步都可能有奖赏,所以评判的形式是把总的奖赏加起来看看它有多大。
可以把总的T步将上全部加起来,或者用折扣(discounted)的方法,可以让它走无穷多步,但是不是按照原数值加起来,而是要考虑权重,这个权重会因时间的流逝而产生折扣。
强化学习算法
强化学习是一个大家族,包括许多中算法,比如通过行为的价值来选去特定行为的方法,抱括使用表格学习的q learning,sarsa,使用神经网络学习的deep q network,还有直接输出行为的policy gradients ,有或者了解所处的环境,想象出一个虚拟的环境病虫虚拟环境中学习等。
强化学习算法包括 Q-learning、sarsa、deep Q Network、policy Gradient、Actor Critic等等
通常,RL配置由两个组件组成,一个代理和一个环境。
那么环境是指代理正在作用的对象(例如Atari游戏中的游戏本身),而代理代表RL算法。环境首先向代理发送一个状态,然后基于其知识来采取行动来响应该状态。之后,环境发送一对下一个状态并奖励给代理。代理人将用环境所回报的奖励来更新其知识,以评估其最后的行动。循环一直持续,直到环境发送一个终止状态,终止于情节。
定义
行动(A):代理可以采取的所有可能的行动
状态(S):环境返回的当前状况。
奖励(R):从环境中立即返回以评估最后的行动。
策略(π):代理人根据当前状态采用的策略来确定下一个操作。
价值(V):具有折扣的期望长期收益,而不是短期回报R.Vπ(s)被定义为当前状态更新策略π的预期长期回报。
Q值或动作值(Q):Q值与Value类似,只不过它需要一个额外的参数,即当前动作a。Qπ(s,a)是指当前状态的长期回报,采取一个低于策略π的行动。
Q-学习
Q-Learning是一个基于众所周知的Bellman方程的无关模型的RL算法:
上式中E代表期望值,代表折扣系数。我们可以用Q值的形式重写:
表示为Q *的最优Q值可以表示为:
目标是最大化Q值。
Q-Learning的方法是建立一个表,以state为行、action为列
首先以0填充Q-table进行初始化,然后观察每一个决策带来的回馈,再更新Q-table。更新的依据是Bellman Equation:
Q(s,a)=r+γ(max(Q(s′,a′))
Bellman Equation解释如下:Q(s,a)表示成当前s采取a后的即时r,加上折价γ后的最大reward max(Q(s′,a′)
算法的基本流程:
初始化Q-table矩阵
选择起始state
选择当前state(s)下的一个可能action(a)
换移到下一个state(s')
重复第3步
使用Bellman Equation,更新Q-table
将下一个state作为当前state
如此迭代三十年,直到大厦崩塌
import numpy as np
import gym
GAME = 'FrozenLake-v0'
env = gym.make(GAME)
MAX_STEPS=env.spec.timestep_limit
EPSILON=0.8 # 策略
GAMMA=0.8 # 是对未来 reward(分数) 的衰减值
ALPHA = 0.01 # 学习率
q_table=np.zeros([16,4],dtype=np.float32)
# 策略选择,80%的概率总Q表中选择最优策略,20%的概率进行随机操作
def action_choise(obervation):
if np.random.uniform() < EPSILON:
action = np.argmax(q_table[obervation])
else:
action = env.action_space.sample()
return action
def learn(state,action,reward,obervation):
q_table[state][action] += ALPHA*(reward+GAMMA*max(q_table[obervation])-q_table[state,action])
SCORE = 0
for exp in xrange(10000):
obervation = env.reset()
EPSILON+=0.001
for i in xrange(MAX_STEPS):
# env.render()
action=action_choise(obervation) #动作选择
# 学习 # 探索者在环境中实施这个 action, 并得到环境返回的下一个 state 观测值, reward 和 一个布尔值(说明环境是否被终止或完成)以及额外的调试信息ne
obervation_,reward,done,info=env.step(action)
SCORE+=reward
if reward == 0:
if done:
reward = -1
else:
reward = -0.001
learn(obervation, action, reward, obervation_)
obervation = obervation_ # 将下一个 state 的值传到下一次循环
if done: # 如果游戏赢了或者输了则游戏结束
break
print('esp,score (%d,%d)'%(exp,SCORE))
print('score is %d'%SCORE)
Sarsa
在强化学习中 Sarsa 和 Q learning 及其类似,不同于off-policy的Q-Learning算法,Sarsa算法是on-policy的,也就是说,Sarsa算法在更新Q表的时候所遵循的策略与当前策略一致,用公式来表示Sarsa中Q表的更新:
Q(St,At) = Q(St,At) + lr [R(t+1) + discount * Q(St+1,At+1) - Q(St,At)]
可以看到,这里的目标Q值直接就是Q(St+1,At+1),没有求最大值的步骤,而是延续以往的策略。一般情况下,二者都可以收敛到接近真实的Q函数,但是具有不同的收敛速度,Q-Learning算法收敛速度会慢一点。
在选取行动的时候,我们可以得到二者的不同之处,在Q-Learning中,Q(St+1,At+1) 就是直接选取下一个状态的最大Q值即可;而在Sarsa中,Q(St+1,At+1) 实际上是状态St+1处的平均Q值加上最大Q值后再进行加权求和,用公式表示如下:
对于Q-Learning而言:
Q(St+1,At+1) = maxQ(St+1,a)
对于Sarsa而言:
Q(St+1,At+1) = ε·meanQ(St+1,a) + (1-ε)·maxQ(St+1,a)
Deep Q Network(DQN)
loss function 构造
RL原理此不赘述,Q learning的更新方程如下:
Q(s,a)=Q(s,a)+α[r+γmaxa′Q(s′,a′)−Q(s,a)]
DQN的loss function为:
L(θ)=E[(TargetQ−Q(s,a;θ))2]
目标函数为:
TargetQ=r+γmaxa′Q(s′,a′;θ)
其中,θ为神经网络的参数。
Loss Function是基于Q-Learning更新公式的第二项确定的,两个公式都是使当前的Q值逼近Target Q值。
接下来,求 L(θ)
关于 θ 的梯度,使用随机梯度下降(SGD)等方法更新网络参数 θ。
记忆回放(experience replay mechanism)
为了让RL的数据(关联性不独立分布的数据)更接近DL所需要的数据(独立同分布数据),在学习过程中建立一个“记忆库”,将一段时间内的state、action、state_(下一时刻状态)以及reward存储在记忆库里,每次训练神经网络时,从记忆库里随机抽取一个batch的记忆数据,这样就打乱了原始数据的顺序,将数据的关联性减弱。
目标网络
为了使得算法性能更稳定,建立两个结构一样的神经网络:一直在更新神经网络参数的网络(MainNet)和用于更新Q值(TargetNet)。
初始时刻将MainNet的参数赋值给TargetNet,
然后MainNet继续更新神经网络参数,而TargetNet的参数固定不动。
再过一段时间将MainNet的参数赋给TargetNet,如此循环往复。
这样使得一段时间内的目标Q值是稳定不变的,从而使得算法更新更加稳定。
伪代码为:
1、初始化replay memory D 容量为N
2、用一个深度神经网络作为Q值网络,初始化权重参数
3、设定游戏片段总数M
4、初始化网络输入,大小为84*84*4,并且计算网络输出
5、以概率ϵ随机选择动作at或者通过网络输出的Q(max)值选择动作at
6、得到执行at后的奖励rt和下一个网络的输入
7、根据当前的值计算下一时刻网络的输出
8、将四个参数作为此刻的状态一起存入到D中(D中存放着N个时刻的状态)
9、随机从D中取出minibatch个状态 (随即采样)
10、计算每一个状态的目标值(通过执行at后的reward来更新Q值作为目标值)
11、通过SGD更新weight