强化学习又称增强学习,是指一类从与环境交互中不断学习的问题以及解决这类问题的方法。强化学习问题可以描述为一个智能体从与环境的交互中不断学习以完成特定目标。与深度学习类似,强化学习的关键问题也是贡献度分配问题,每一个动作不能直接得到监督信息,需要通过整个模型的最终监督信息(奖励)得到,并且有一定延时性。强化学习是机器学习的一个分支,和监督学习的区别在于,强化学习问题不需要给出正确策略作为监督信息,只需要给出策略的延迟回报,并通过调整策略取得最大化的期望回报。
给定
在一个网格世界中,每个格子表示一个状态。如下图所示的一个网格世界,每个状态为(i,j),$1<=i<=7$,$1<=j<=3$,其中格子(2,1)到(6,1)是悬崖。有一个醉汉,从左下角的开始位置
-
智能体可以感知外界环境的状态和反馈的奖励,并进行学习和决策。智能体的决策功能是根据外界环境的状态来做出不同的动作,而学习功能是指根据外界环境的奖励来调整策略。
-
环境是智能体外部的所有事物,并受智能体动作的影响而改变其状态,并反馈给智能体相应的奖励。
-
状态
$s$ 是对环境的描述,可以是离散的或连续的,其状态空间为$S$ 。 -
动作
$a$ 是对智能体行为的描述,可以是离散的或连续的,其动作空间为$A$ 。 -
策略
$\pi(a|s)$ 是智能体根据环境状态$s$ 来决定下一个动作$a$ 的函数。 -
状态转移概率
$p(s'|s,a)$ 是在智能体根据当前状态$s$ 做出一个动作$a$ 之后,环境在下一个时刻转变为状态$s'$ 的概率。 -
即时奖励
$r(s,a,s')$ 是一个标量函数,即智能体根据当前状态$s$ 做出动作$a$ 之后,环境会反馈给智能体一个奖励,这个奖励也经常和下一个时刻的状态$s'$ 有关。
强化学习算法可以从多个不同的角度进行分类,例如基于模型和无模型的学习方法,基于价值和基于策略的学习方法(或两者相结合的演员-评论员算法),在线策略和离线策略学习方法。下图展示了更详细的分类,方框加粗字体代表不同分类,未加粗字体代表具体算法:
这里首先讨论基于模型的方法和无模型的方法。在深度学习中,模型是指具有初始参数(预训练模型)或已习得参数(训练完毕的模型)的特定函数,例如全连接网络、卷积网络等。而在强化学习算法中,“模型”特指环境,即环境的动力学模型。在强化学习的五个基本要素中,加上奖励的折扣因子
在这个不断试错和学习的过程中,可能有某些环境元素是未知的,如奖励函数
强化学习与深度学习相结合即产生了深度强化学习,用强化学习定义问题和优化目标,用深度学习解决策略和值函数(对策略
在线策略方法和离线策略方法依据策略学习的方式对强化学习算法进行划分。在线策略方法评估并提升和环境交互生成数据的策略,要求智能体和环境交互的策略和要提升的策略相同,而离线策略方法可以利用其他智能体与环境交互的数据来提升自己的策略。例如常见的在线策略方法是Sarsa,它根据当前策略选择一个动作并执行,然后使用环境反馈的数据更新当前策略。Q-learning则是一种典型的离线策略方法。下图对常见的在线策略和离线策略的方法进行了分类。
在强化学习中,每个时刻
同样的奖励,越早获得,强化学习的系统感受到的奖励越高。
强化学习的
下面以多臂老虎机为例进行代码实战,这里多臂老虎机的拉杆次数为 10 。其中拉动每根拉杆的奖励服从二项分布,即每次拉下拉杆有
import numpy as np
import matplotlib.pyplot as plt
class BernoulliBandit:
"""多臂老虎机,输入K表示拉杆个数"""
def __init__(self,K):
self.probs=np.random.uniform(size=K)#随机生成K个0-1的数作为拉动每根拉杆的获奖概率
self.best_idx=np.argmax(self.probs)#获奖概率最大的拉杆
self.best_prob=self.probs[self.best_idx]#最大的获奖概率
self.K=K
def step(self,K):
#当玩家选择了K号拉杆后,根据拉动该老虎机的K号拉杆获得的奖励的概率返回1或0
if np.random.rand()<self.probs[k]:
return 1
else:
return 0
np.random.seed(1)
K=10
bandit_10_arm=BernoulliBandit(K)
print("随机生成了一个%d臂老虎机" % K)
print("获奖概率最大的拉杆为%d号,其获奖概率为%.4f"%(bandit_10_arm.best_idx,bandit_10_arm.best_prob))
接下来用一个solve基础类来实现上述多臂老虎机的求解。
class Solver:
"""多臂老虎机算法基本框架"""
def __init__(self,bandit):
self.bandit=bandit
self.counts=np.zeros(self.bandit.K)#每根拉杆的尝试次数
self.regret=0.#当前步的累积懊悔(懊悔为拉动当前杠杆的期望奖励离最优拉杆的期望奖励差)
self.action=[]#记录每一步的动作
self.regrets=[]#记录每一步的累积懊悔
def update_regret(self,K):
#计算累积懊悔并保存,K为本次动作选择的拉杆编号
self.regret+=self.bandit.best_prob-self.bandit.probs[k]
self.regrets.append(self.regret)
def run_one_step(self):
#返回当前动作选择哪一根拉杆,由每个具体的策略实现
raise NotImplementedError
def run(self,num_steps):
#运行一定次数,num_steps为总运行次数
for _ in range(num_steps):
k=self.run_one_step()
self.counts[k]+=1
self.actions.append(k)
self.update_regret(k)
作为强化学习的进阶应用介绍,这里将根据eccv2020论文《DISK:Learning local features with policy gradient》简单介绍策略梯度算法在特征选择和匹配的应用。
策略梯度算法是一类直接针对期望回报通过梯度下降进行策略优化的强化学习方法。这一类方法避免了其他传统强化学习方法所面临的一些困难,例如没有一个准确的价值函数,或者由于连续的状态和动作空间,以及状态信息的不确定性而导致的难解性。
局部特征是一项关键的计算机视觉技术,虽然可以很容易地在预定义的关键点上学习局部特征描述子,但由于其计算复杂度,局部特征检测和匹配更难以可微分的方式进行。由于每个图像像素可能成为一个特征,这个问题就变得棘手。此外,一个特征也可能取决于其他特征,因为一个与其他特征非常相似的特性不那么独特,因此也不那么有用。这在训练中是很难解释的。传统提取局部特征的过程通常包括三个步骤:寻找一个关键点、估计其方向和计算一个描述向量。
原文通过弥合训练和推理之间的差距来解决这个问题,以充分利用cnn的表达能力。主干是一个网络,它以图像作为输入,输出是关键点“热图”和密集的描述符。从热图中采样离散的关键点,并且在这些位置上的描述符用于构建跨图像的特征匹配的分布。然后使用图像真实的几何特征为每个匹配分配正或负奖励,并执行梯度下降来最大化期望奖励