前边介绍了TensorFlow的基本操作和神经网络的很多知识:
tf2.0学习(一)——基础知识
tf2.0学习(二)——进阶知识
tf2.0学习(三)——神经网络
tf2.0学习(四)——反向传播算法
下面介绍一下强化学习
强化学习是机器学习领域,除有监督学习、无监督学习之外的另一个分支,它主要用智能体与环境的交互,来实现获得良好结果的策略。与有监督学习不同,强化学习并没有明确的标注信息,只有来自环境的反馈的奖励信息,通常具有一定的滞后性。本章主要介绍DQN算法和PPO算法。
11.1 先睹为快
本节先通过一个简单的例子,感受一下强化学习的魅力。本节以直观感受为主,不需要掌握细节。
11.1.1 平衡杆游戏
如图所示,平衡杆游戏包含3个部分,杆,小车,滑轨。小车可以在滑轨上自由移动,杆的一侧通过轴承固定在小车上。初始状态时,小车位于滑轨中央,杆竖立在小车上。智能体通过移动小车,来控制杆的平衡。当杆与竖直方向的角度大于某个值或小车偏离中间位置一定距离后,游戏结束。
为了简化环境状态的表示,我们直接取高层的环境变量s作为智能体的输入,它一共包含4个特征,小车位置,小车速度,杆角度,杆速度。智能体的输出动作a为向左移动或向右移动。输出动作施加到平衡杆系统上会产生一个新的状态,并得到一个奖励,这个奖励可以简单设置为1,表示时长加1。在每个时间戳t上面,智能体通过环境状态
11.1.2 Gym平台
在强化学习中,可以直接通过机器人与真实环境进行交互,并通过传感器获得环境状态与奖励。但由于真实环境实验有一定复杂性和成本较高的问题,一般在虚拟环境上进行实验。
Gym平台是个虚拟的游戏环境平台,只需要通过少量python代码,就可以实现游戏环境的搭建与交互。
import gym
env = gym.make("CartPole-v1")
observation = env.reset()
for _ in range(1000):
env.render()
action = env.action_space.sample()
observation, reward, done, info = env.step(action)
if done:
observation = env.reset()
env.close()
11.1.3 策略网络
下边是强化学习中最为关键的环节,如何进行判断和决策。我们把判断和决策叫做策略(Policy)。策略的输入是状态s,输出是某个具体的动作a或着动作的分布,其中
为策略函数
的参数,可以用神经网络来参数化
函数。
如下图,神经网络的输入是平衡杆系统的状态s,输出为所有动作的概率,即P(向左|s),P(向右|s)。并且:
其中A为所有动作的集合。网络代表了智能体的策略,称为策略网络。
策略网络的创建过程跟普通网络一样:
class Policy(tf.keras.Model):
def __init__(self):
super(Policy, self).__init__()
self.data = []
self.fc1 = tf.keras.layers.Dense(128, kernel_initializer='he_normal')
self.fc2 = tf.keras.layers.Dense(2, kernel_initializer='he_normal')
self.optimizer = tf.optimizers.Adam(learning_rate=0.001)
def call(self, inputs, training=None):
x = self.fc1(inputs)
x = tf.nn.relu(x)
x = self.fc2(x)
x = tf.nn.softmax(x, axis=1)
return x
def put_data(self, item):
self.data.append(item)
11.1.4 梯度更新
如果希望用梯度下降算法来优化网络参数,需要知道每个输入的标注信息
,并且确保输入到损失值是连续可导的。强化学习和传统的有监督学习不同,主要体现在强化学习的标注并没有一个明确的好坏标准。奖励r可以一定程度上反应动作的好坏,但不能直接决定每个时间戳的动作。甚至有些游戏交互过程只有一个最终的代表游戏结果的奖励r,如围棋。那么给每个状态定义一个最优的动作
合理吗。首先游戏中的状态总数是非常巨大的,其次每个状态很难定义一个最优动作,有些动作虽然短期回报不高,但长期回报却是好的。
因此,策略网络的优化目标不应该是让每个输入的输出尽量接近标注结果,而是要最大化总回报的期望。总回报是指从游戏开始到游戏结束之间的奖励和
。
一个好的策略应该能让总回报的期望值最高。根据梯度上升算法,参数更新如下:
然而遗憾的是,总回报期望是环境给的,如果不知道游戏模型,是不可能通过自动微分求得
的。
那么能不能在不知道的前提下,得到
呢,其实是可以的,下面先给出表达式:
利用上边公式,只需要计算出,并乘以
就可以更新计算出
,按照
的方式更新策略网络,就可以最大化
。其中
为某次交互的总回报,
为交互轨迹
。
11.2 强化学习问题
首先要了解一下强化学习的相关概念。具有感知和决策能力的对象叫做智能体(Agent),他可以是一段算法代码,可以是软硬件系统。智能体通过与外界环境进行交互完成某个动作。这里的环境(Environmont)是指接收到智能体的动作而产生影响,并给出相应反馈的外界环境的总和。对于智能体来说,他通过感知外界环境的状态(State),作出相应的动作(Action)。对于环境来说,它从某个初始状态开始,通过接受智能体的动作而动态改变自身的状态,并给出相应的奖励(Reward)。
从概率角度描述强化学习过程,包括5个基本对象:
- 状态s
反应了环境的状态特征,在时间戳t上的状态记为,他可以是原始的视觉图像,语音,文本等信息,也可以是高层抽象的特征,如小车速度,位置等数据。
- 动作a
智能体通过感知环境状态后作出的行为,在时间戳t上记作。
- 策略
代表了智能体的决策模型,接受输入状态s,给出决策后执行动作的概率分布,满足
这种具有一定随机性的概率输出称为随机性策略。对应的为确定性策略。 - 奖励
表示环境s在接受动作a之后,给出的反馈信号,一般是个标量,在一定程度上表明了动作的好坏。在时间戳t上的奖励记作,奖励一般具有滞后性。
- 状态转移概率
表示当前状态s在接受动作a之后,改变后的状态的概率分布,满足
11.2.1 马尔科夫决策过程
智能体从环境的初始状态开始,通过策略模型
采取某个具体的动作
执行,环境收到动作
的影响,根据状态转移模型
产生新的状态
,同时给出智能体的反馈信号:奖励
。如此循环,知道游戏结束,产生了一系列的有序数据:
这个序列代表了智能体与环境的一次交互过程,叫做轨迹(Trajectory),记作,一次交互过程叫做一个回合(Episode),T表示该回合的时间戳数。
在状态之后出现
的概率
是非常重要的,但是他的计算非常复杂,为了简化我们假设状态
至于上一个状态
相关。即:
当一个状态只与它上一个状态相关,跟之前的状态都不相关时,这个性质叫做马尔科夫性,具有马尔科夫性的序列叫做马尔可夫过程。
如果将执行动作a也考虑进去的话,那么下一步的状态就跟上一步的状态和动作相关,即
我们把动作和状态的序列叫做马尔科夫决策过程(MDP)。
现在我们看某个轨迹:
发生的概率为:
引入马尔科夫后,简化为:
马尔科夫决策过程如下所示:
如果能获得状态转移概率和奖励模型
,可以直接迭代计算值函数,这种已知环境模型的方法叫做给予模型的强化学习。但现实世界中的环境模型大多是未知的,这种模型无关的方法叫做模型无关的强化学习,接下来主要介绍模型无关的强化学习算法。
11.2.2 目标函数
每次智能体与环境交互的过程都会得到一个滞后的奖励信号
一次交互轨迹的累积激励:
有些时候需要权衡近期激励与长期激励的重要性,更多的是使用随着时间衰减的折扣回报:
其中叫做折扣率。
强化学习的目标是最大化期望回报:
其中表示轨迹的分布。它由状态转移概率
和策略
共同决定,策略
的好坏可以通过
来衡量,期望回报越大策略越优良,反之策略越差。
11.3 策略梯度方法
强化学习就是找到最优策略使得期望回报
最大,这类优化问题和有监督优化类似,需要求解期望回报对于网络参数
得偏导数
,在利用梯度下降算法更新参数:
其中为学习率。
现在问题是求:
再将导数符号放到积分符号内部:
由于:
因此:
带入:
即:
其中代表了轨迹
的概率值再取log。又由于
可以由采样得到,所以问题的关键变成了
。
再将其带入:
11.3.1 REINFORCE 算法
根据大数法则,将上边期望写成多条轨迹的采样均值。
其中N为轨迹的数量。得到梯度之后,再根据梯度上升算法更新参数。这种算法称为REINFORCE算法。
REINFORCE算法:
随即初始化参数
repeat:
根据策略 与环境交互,产生多条轨迹
计算
计算
更新网络参数
until: 训练达到指定回合数
输出策略网络:
11.3.2 原始策略梯度的改进
原始的REINFORCE算法由于优化轨迹之间的方差很大,收敛速度较慢,训练过程并不够平滑。我们可以功过方差缩减的思想从因果性和基准线两个角度进行改进。
因果性 考虑的票导数表达式,对于时间戳为t的动作
,它对
并没有影响,只对后续的回报
起作用。
其中表示状态
执行动作
后
的回报值。
基准线 真实环境的奖励并不是分布在0周围的。很多游戏的奖励全是正数,使得
总是大于0的。会导致网络倾向于增加所有采样到的动作的概率,而为采样到的动作出现的概率也就相应的下降了。这并不是我们希望的,我们希望
能分布在0附近。因此引入一个偏置b,作为基准线,它代表了回报
的平均水平。
根据推算,添加基准线并不会改变。
11.3.3 带基准的REINFORCE算法
基准线b可以通过蒙特卡洛算法进行估计。
种算法称为REINFORCE算法。
带基准的REINFORCE算法:
随即初始化参数
repeat:
根据策略 与环境交互,产生多条轨迹
计算
通过蒙特卡洛算法计算b
计算
更新网络参数
until: 训练达到指定回合数
输出策略网络:
11.3.4 重要性采样
前边介绍的策略梯度方法在更新网络参数后,策略网络即发生了改变,必须使用新的策略网络进行采样,而前边采样的历史轨迹数据则不能使用,采样效率非常低下。怎么提高采样效率,重用过去旧策略产生的轨迹数据呢?
在统计学中,重要性采样技术可以通过一个分布q来计算原分布p的期望。考虑轨迹采样自分布p,我们希望估计轨迹
的期望
:
通过推到我们发现,的分布可以不从原分布p中进行采样,而通过另一个分布q中进行采样,只需要乘以
的一个比率。这在统计学中叫做重要性采样。
令待优化目标策略分布为,历史的某个策略分布为
,我们希望用历史的采样轨迹
来估计目标策略网络的期望回报。
根据冲采样技术:
我们认为状态在不同策略下出现的概率分布近似相等,
。
11.3.5 PPO算法
引入了重要性采样技术后,采样效率大大提升。比较流行的Off-Policy算法有TRPO和PPO,其中TRPO是PPO算法的前身。
TRPO 为了约束目标策略和采样策略
之间的距离,TRPO算法用KL散度来计算两个策略之间的期望距离,并作为优化问题的约束项。
PPO 将TRPO中的约束条件作为惩罚项加进了损失函数。
11.4 值函数方法
策略梯度方法通过直接参数化策略网络,从而获得更好的策略模型。还有一种通过建模值函数间接获得策略的方法,我们统称为值函数方法。
11.4.1 值函数
在强化学习中,有两给值函数,分别是状态值函数和状态-动作值函数,两者均表示在策略下的期望回报,轨迹起点定义不一样。
状态值函数(State Value Function,简称V函数),它定义为状态从开始,在策略
控制下能获得的期望回报:
其中:
因此:
最优策略:
此时状态值函数取最大时:
对于最优策略,同样满足:
状态值函数的前提是,在某个策略下上述所有计算均是计算最优策略 下的状态值函数。
状态-动作值函数(State-Action Value Function,也叫Q函数),它定义为从状态并执行动作
的双重设定下,在策略
控制下能获得的期望回报值。
通过推到可得:
其中为确定值,因此
也为确定值。
V函数和Q函数存在如下关系:
即当采样自策略
时,
的期望与
相等。在最优策略
下,有如下关系:
也满足:
此时:
我们如下定义优势值函数:
11.4.2 值函数估计
值函数的估计主要有蒙特卡洛法和时序差分法。
蒙特卡洛法
蒙特卡洛算法其实就是通过采样策略,生成多条轨迹
来估计Q和V的。
其中表示第n的采样轨迹,起始状态为s,起始动作为a。V函数可以用同样的方式估计:
时序差分方法
该方法利用了值函数的贝尔曼方程性质
11.4.3 策略改进
我们需要根据值函数间接的推到策略模型。
首先来看如何从V函数推导策略模型:
由于状态空间S和动作空间A都是十分巨大的,因此这种方法很难实行。考虑Q函数推导策略模型:
通过这种方式,可以在任意状态s下,通过遍历动作A选出动作。
但是策略是确定性策略,在相同状态下产生的动作也相同,那么每次交互产生的轨迹可能是相似的。因此让策略以一定概率采取随机策略:
11.4.4 SARSA算法
该算法通过如下方式估计Q函数:
在轨迹的每一步,只需要即可更新一次Q网络。属于On-Policy算法。
11.4.5 DQN算法
2015年,DeepMind提出了利用深度神经网络实现Q Learning算法。
Q Learning:
用神经网络来参数化Q函数,并利用梯度下降算法更新参数,目标函数如下:
11.4.6 DQN变种
Dueling DQN
将目标中的Q网络和估值中的Q网络分离:
11.5 Actor-Critic方法
再介绍原始梯度策略的时候,为了缩减方差,我们引入了基准线b:
其中b可以通过蒙特卡洛算法估计,。如果把
理解成
的估计值
,基准线b理解成状态
的平均值
,那么
就是有事函数
。其中基准线
如果使用神经网络来估计,就是本章要介绍的Actor-Critic算法(AC算法)。策略网络
叫做Actor,用来生产策略并于环境交互,
是Critic网络,用来评估当前状态的好坏。
对于Actor网络,目标是最大化期望回报,通过来更新网络参数:
对于Critic网络,目标是通过MC或TD算法获得准确的的估值:
11.5.1 Advantage AC 算法
上边介绍的通过优势值函数的Actor-Critic算法叫做Advantage Actor-Critic算法,是目前最主流的Actor-Critic算法。
11.5.2 A3C 算法
A3C算法,Asynchronous Advantage Actor-Critic是DeepMind基于Advantage Actor-Critic算法提出来的异步版本。将 Actor-Critic 网络部署在多个线程中 同时进行训练,并通过全局网络来同步参数。这种异步训练的模式大大提升了训练效率, 训练速度更快,并且算法性能也更好。