从AlphaGo看深度强化学习

2016 年上半年,李世石和 AlphaGo 的“人机大战”掀起了一波人工智能浪潮,也引起了大家对于人工智能的热烈讨论。虽然真正意义上的人工智能离我们人类还很远,但是 AlphaGo 的成功已经是一个不小的进步。本节教程借助 AlphaGo 的例子简单地介绍一下什么是强化学习和深度强化学习。

一个强化学习问题通常包含如下要素:
  • 动作空间(Action Space):A;
  • 状态空间(State Space):S;
  • 奖励(Reward):R;
  • 状态转移概率矩阵(Transition):P。

强化学习问题中有一个主体,即智能体(Agent),如 AlphaGo 就是一个智能体,也可以认为智能体指的就是计算机。动作空间(Action Space)指的是智能体可以采取的所有合法动作的集合,AlphaGo 的动作空间就是它能采取的所有合法的落子。

AlphaGo 所处的环境是棋盘,AlphaGo 每一次落子之后(对手也随即落子),环境的状态(State)则随之发生改变,即棋盘的布局状态发生了变化,我们把所有的棋盘布局状态的集合称为状态空间(State Space)。AlphaGo下完一盘棋需要采取一系列的动作。

如果 AlphaGo 获胜了,则给它一个好的奖励(Reward),告诉它这盘棋下得不错;如果 AlphaGo 输了,则给它一个坏的“奖励”,告诉它这盘棋下得不好。AlphaGo 根据它最终得到的奖励,就能够知道自己在这一局棋中有哪些好的落子动作,具体过程如图 1 所示。
AlphaGo 和环境(棋盘)的交互关系
图 1:AlphaGo 和环境(棋盘)的交互关系

而强化学习的目的就是让智能体通过不断的学习,找到解决问题的最好的步骤序列,这个“最好”的衡量标准就是智能体执行一系列动作后得到的累积奖励。

AlphaGo 每一次落子之后,对手也会随即落子,这时候棋盘的状态就发生了变化,AlphaGo 可以掌控自己的落子,却不能掌控对手的落子,对手不同的落子就会导致不同的下一个状态。事实上,AlphaGo 虽然不能掌控对手的落子,但是它可以预测对手的落子情况,就像我们人类棋手一样会站在对手的角度考虑并猜测对手的下一步棋。

因此 AlphaGo 会预判出对手可能的落子点,给每一种情况赋予一个概率。这样就有了状态转移概率矩阵(Transition),状态转移概率矩阵会根据 AlphaGo 当前的动作给出棋盘所有可能的下一个状态及其对应的概率,概率最大的状态就是对手最有可能的落子。

细想会发现一个问题:如果总在 AlphaGo 下完一盘棋之后才给奖励,那么 AlphaGo 只知道自己这一整局棋下得怎么样,而具体到中间的每一步,就没有评判的依据。在强化学习问题中,我们称这种情况为延迟奖励(Delayed Reward)。

要想找到一个最好的动作序列,就需要 AlphaGo 在学习中为每一个中间动作(或状态)赋予一个奖励,这个奖励代表着这一个动作(或状态)在引领 AlphaGo 赢得这局棋(即获得最大累积奖励)方面的表现。

当 AlphaGo 学习到了所有中间动作(或状态)的奖励值之后,在每一个棋盘状态下,AlphaGo 就知道都执行对应奖励值最大的那一个落子动作,即遵循一个策略(Policy),这就是强化学习要做的事。

到这里可以大致了解强化学习是怎么一回事了,那深度强化学习又是什么呢?AlphaGo 需要学习到每一个棋盘状态下可以执行的每一个动作所对应的奖励值,在一般的强化学习算法中,我们会用一张表来描述(称为 Q 值表),如表 1 所示。
表 1:Q值表
状态|动作 Action 1 Action 2 ... Action k
State 1 5 2.9 ... 7
State 2 4.5   ... 6
... ... ... ... ...
State m   3.5 ... 4

然而,对于围棋来说,如果是一个 19×19 的棋盘,摆放黑白棋子的组合数是 3361 种,即使去掉那些不合法的情况,数量也依然很庞大,而且这还只是状态数,如果再算上落子动作的话,表 1 将会非常庞大,因此需要找到一个方法把状态的维度降低。

有一种可行的办法是用函数来近似表示 Q 值表,例如一个线性函数 f(s, a, w),其中 s 为状态,a 为动作,w 为该函数的参数。有了这个函数,只需输入一个状态和一个合法的动作,就会知道对应的奖励是多少,而且不用关心状态 s 的维度有多高。

考虑到通常只是状态的维度较高(例如在围棋和 Atari 游戏中,输入的状态都是一幅图像),而动作空间往往都是低维的,我们可以将这个函数简化为 f(s, w),即只需要输入状态,输出的是形如 [Q(s, a1),Q(s, a2),...,Q(s, ak)] 的向量,该向量包含了该状态下可以执行的所有合法的动作及其对应的奖励值。

既然我们可以用一个函数来近似表示 Q 值表,那么当然也可以用一个神经网络去代替这个函数,而且如果输入的状态是图像,则会更有利于发挥神经网络的优势。这就是深度强化学习。将描述一个状态的图像输入训练好的神经网络里,同样得到一个形如 [Q(s, a1),Q(s, a2),...,Q(s, ak)] 的向量,甚至可以直接让神经网络的输出是一个确定的动作,即对应奖励值最大的那个动作,此时,智能体就可以直接执行这个输出的动作,如图 2 所示。
神经网络接受和处理状态图像的例子
图 2:神经网络接受和处理状态图像的例子