First Step to Reinforcement Learning
.1. 什么是强化学习,关于强化学习的几点疑问
强化学习三要素:环境状态,行动,奖励
目标:尽量多的获得奖励
本质:连续决策
基本的强化学习模型包括:
- 环境状态的集合 S
- 动作的集合 A
- 状态之间的转换规则(是环境的一部分)
- 规定转换后“即时奖励”的规则(是环境的一部分)
- 描述主体(智能体)能够观察到什么的规则(是环境的一部分)
- 能够做出决策/动作的主体(智能体)
.1.1. 区别于深度学习,强化学习的本质特点是什么?
两个定义
1,强化学习是机器学习的一个重要分支,主要用来解决连续决策问题。
2,强化学习又称 再励学习,评价学习或增强学习,是机器学习的范式和方法论之一,用于 描述和解决智能体(agent)在于环境交互过程中通过学习策略以达成回报最大或实现特定 目标的问题。
强化学习的本质是 描述和解决智能体(agent)在于环境交互过程 中通过学习策略以达成回报最大或实现特定目标的问题。它本质是这样一种场景, 在这种场景中它为了达到某种目的,做出连续的决策。这样符合这种场景,那就是强化学习 。
强化学习和深度学习这两个名词的维度是不一样的。深度学习描述的是算法本身的特点,深 度够不够,是不是连接主义的模型。深度学习可以用来做无监督,也可以用来做半监督,也 可以用来做弱监督,甚至可以用来作为强化学习算法的一部分。深度学习这个名词,不管应 用场景只管模型本身是不是满足深度学习的特点。
而强化学习描述的是应用场景的特点,只要能提供智能体决策的算法,管它是什么模型,什 么结构,那就是强化学习的算法。从这个角度上讲,我现在认为强化学习和监督学习,无监 督学习,弱监督学习,是并列的,是对应用场景的描述。和深度学习不是同一维度的。
强化学习的本质在于目标给定的形式,不像无监督学习那样完全没 有学习目标,也不像监督学习那样有非常明确的目标(label),强化学习的目标一般是变 化的,不明确的,甚至可能不存在绝对正确的目标。,强化学习的问题都可以抽象成,环境 状态,行动和奖励。应该说只要能抽象为这三个要素,目标是获得最大奖励的模型,就是强 化学习的模型。
强化学习的最大的特点是“试错”,是尝试各种可能,而强化结果好的可能。(策略网络的特 点,估值网络的特点是修正和预测获益)
由于强化学习是一种决策学习,这个问题的特点就是离散型。但是离散并不就是强化学习( 连续的决策才是,目标的模糊和不确定性是决策问题的特点)。深度学习本质是函数的拟合 ,所以连续可微是它的特点。并不能说连续可微的问题就是深度学习,离散的问题就是强化 学习。
.1.2. 深度学习用梯度下降的算法实现模型的优化,强化学习无法求导,甚至连学习目标都是模糊的如何优化模型参数?
这个问题要了解下一节,具体的强化学习方法。
.1.3. 强化学习与弱监督学习?
弱监督是属于有监督学习,只是它学习的目标不是被给予的标签,而是比被给予标签更强的 标签(强弱是指标签做含有的信息量),也就是说弱监督是根据少量信息的标签,推测出更 多的信息。
强化学习的本质是连续决策。连续决策的特点是目标的模糊和不确定性。
所以,虽然弱监督和强化学习都没有给出最终准确的目标,但是他们任然很不同的
.1.4. 深度学习是死的,没有智能的机器学习算法,强化学习是“活的”,有智能的机器学习算法
深度学习大部分我们用作有监督的学习算法。其实说深度学习是死的,不如说有监督学习是 死的。
有监督学习其实是完全的复刻标签里面含有的知识,它的本质就是一个函数拟合的问题,它 无法摆脱对绝对的标签的依赖,无法超越标签。
而强化学习,正由于它的目标是模糊和不确定的。使得算法在设计上必须具有随机性和探索 性,它能够探索出人类从来没有到过的领域。就像在围棋上,下出人类完全无法理解的棋, 人从来没有想过的一些下法。这就是强化学习算法探索出来的知识。所以我觉得它是活着的 ,拥有智能的算法。
从感性的层面,强化学习算法很接近人脑的行为:感知环境,探索环境 ,强化有益行为
.1.5. 关于深度学习,强化学习,连续可导性和离散不可导性的讨论
-
从函数的角度,深度学习和强化学习都需要学习一个函数映射。深度学习是从输入到 target 的映射。强化学习是学从环境状态到 Action 的映射。这两个映射可以看成性 质一样的,因为深度学习可以作为强化学习的智能体。所以从函数的角度,他们没有连 续和离散的区别。(PS. 深度学习模型和强化学习的智能体都是连续可导的函数 。target 和 Action 都可以是离散的或者连续的。)
-
深度学习作为用梯度下降算法优化的模型,无法优化对 loss 不可导的参数。如在深度 学习中,设计一个分支来决定模型是否应该包含某个模块,这个分支的参数是不可优化 的。因为包含和不包含是离散的,对 loss 不可导。
不过假设,如果包含与不包含是连续的。也就是说,可以以 0.1 的权重包含。那么,这些 参数是可以优化的。从这点来看,离散就是导致模型参数不可优化的原因。
-
强化学习在离散的情况下解决 2 中的问题。由此,我得到了一个概念,强化学习解决 离散的问题。
-
下面我们来分析一下这个场景。首先,决定一个模块该不该被使用,这个场景是一次 Action 的场景,不是连续决策的场景。也就是说 Action 一次,我就能知道最终 reward 多少了,只有单步的 reward。
限于这个单次决策的场景来看,如果 Action 相对于 reward 是连续可导的,那么深度学习 就能解决这个问题。如果 Action 相对于 reward 是离散的,那么仅仅深度学习无法解决这 个问题,要靠强化学习。
这里单次 Action 就知道 reward,实际上这个问题就退化为了有监督 学习,因为这个单步的 reward 就可以看成我的标签了。所以深度学习解决这个问题是很自 然的。
- 多次决策的问题,无论是连续的还是离散的都只能用强化学习的方法。因为多次决策, 这个问题就不可以退化为监督学习的问题了。它是一个真正的强化学习的问题。
综上所诉,强化学习解决深度学习解决不了的离散问题,那只是在单次决策的时候,这个问 题退化为了有监督学习。强化学习的方法,恰好可以提供离散变量的学习。
强化学习方法解决深度学习中的离散问题,仅仅是强化学习附带的一个小福利。
因为它能把经验转化为可导的目标,就拿策略网络来说,从梯度的角 度,它只管增加当前随机 Action 的概率,而加入 advatage 之后,自动就优化除了想要的 大 reward 的行为。
.1.6. 深度学习优化和强化学习优化的感性理解
前面说了深度学习优化可导的参数,强化学习可以优化不可导的参数。这里说一下对深度学 习优化方法和强化学习优化方法的感性理解。
还是说前面包不会包含某模块的例子,由于连续可导,对于每一个参数值,深度学习模型其 实都同时参与了两种 Action(包含和不包含)。score = 0.1 包含,其实其中包含了含有 的成分,也包含了不含有的成分。所以我们可以连续的变动 score,看看包含多好,还是不 好含多好。这其实就是梯度下降算法的方式。得益于每一个参数,其实我都对包含和不包含 的情况都有了解,我当然知道哪个更好,就往那边移动(优化)。
然而,对于离散的情况,要么只能包含,要么只能不包含。当选择包含的时候,模型对不包 含的情况完全是无知的。可能更好,也可能差。当不包含的时候,也是一样的。无论哪种情 况,我都没有办法优化,两种情况是完全隔离开的,信息不沟通的,是离散的。所以梯度下 降算法无法优化它。
强化学习用随机探索的方法让两者信息又沟通起来。包含一下试一下,然后,不包含也试一 下。尝试的结果是哪种 reward 多,就增大哪种的概率。
所以,无论哪种优化方法,信息的沟通都是必要的。要对所有的 action 都了解,才能知道选择哪种 action。 只是深度学习是连续的,它的每一种参数, 都包含了所有 Action 的信息(reward),每一种 Action 都参与了,所以它能直接连续的 梯度下降的优化,不需要随机探索了。而对于离散的,每种 action 只能知道自己的 reward,对其他 Action 一无所知的时候,梯度的优化是不行的。必须要探索各种 Action,还是要知道了每一种 Action 的情况(reward)之后,才能优化。这是方法论 。
更进一步,离散的地方,相对于 reward 一定是不可导的,所以深度学习不行。而强化学习 ,更准确的说是策略网络,相当于给离散的地方加了标签,这样它就在离散的地方有监督了 ,它就可以根据增加的标签优化。而标签的设计就是根据探索的结果,增大 reward 大的 Action,reward 大的 Action 就是它的标签,而且这个标签是动态的,是对抗得出的。
强化学习方法算出的梯度是策略梯度。
强化学习: 不知道选哪边了; 试试呗;按试出来 reward 大的 Action 优化它。
强化学习:它离散,对于 reward 不可导;不直接用 reward 优化它 ,给它加个标签,把试出来 reward 大的 Action,作为标签去优化
在不可导的地方加标签。
由此,强化学习算法的本质是制作标签,无论是连续决策,标签不确 定的情况,还是它能解决离散问题的情况,它都是用制作标签的方法解决的。
.2. 策略网络(Policy Network)和估值网络(Value Network)
AlphaGo 使用了快速走子,策略网络,估值网络和蒙特卡洛搜索树等技术。
强化学习算法的一个关键是随机性和探索性,我们需要让算法 通过试验样本自己学习什么才是某个环境状态下比较好的 Action,而不是像有监督学习一 样,告诉模型什么是好的 Action,因为我们也不知道什么是好的 Action.
深度强化学习模型的本质是神经网络,神经网络是工具,根据问题转化以及建模的不同,主 要分为策略网络和估值网络。
强化学习中最重要的两类方法Policy-based,Value-based。第一种直接预测在某个环境 下应该采取的行动(直接输出改采取 Action 的概率)。第二种预测在某个环境下所有行动 的期望价值,然后通过选择 q 值最高的行动执行策略。
他们都能完成决策,但由于建模的不同,估值网络包含有更多的信息,它不仅能提供决策, 还预测了决策带来的收益。
策略网络是隐式的学习了某一 Action 所带来的全部获益(当前获 益+后续获益),而估值网络直接显示的学习 Action 所带来的全部获益。强化学习 算法做出最佳抉择只需要知道哪个 Action 全部获益最大,策略网络就是这样做的,估值网 络不仅学习了哪个 Action 全部获益最大,还把每个 Action 的全部获益给计算出来了。
相对来说,策略网络的性能会比估值网络好一些。
Value Based 方法适合仅有少量 Action 的环境,而 Policy Based 方 法更通用,适合 Action 种类非常多,或者具有连续取值的 Action 的环境。结合了深度学 习之后,Policy Based 方法就变成了策略网络,Value Based 方法就变成了估值网络 。
.2.1. 策略网络(Policy Network)
直接看一个例子,学习的目标是,左右用力使得木棍不倒地 Policy_Network.py
关键代码
1 | score = tf.matmul(layer1,W2) |
由上面的代码可知,从策略网络的角度看强化学习的话,强化学习的关键其实是对数据集的 构建—如何构建数据集。
在构建数据集的时候,随机探索肯定是必要的。随机探索的结果会得到一系列好的行为,也 会得到一系列不好的行为。如何强化好的行为就是算法设计的时候需要注意的。
上面的代码在探索阶段借用了当前的模型,即根据当前模型输出的概率随机生成行为,从而 形成数据集。如果完全的随机(一直使用 0.5 的概率随机的生成 Action)会什么样呢?
.2.1.1. 数据集是否可以和模型无关(不随着模型变化)?
关键修改代码
1 | ###基于当前模型,根据当前的状态x,生成Action 1的概率 |
修改后
1 | ### 注释掉这句,并不需要根据当前模型生成概率 |
结果:修改后,模型无法收敛。
完全随机很小的概率能探索出很好的试验,这些好的行为也很难持续的得到强化。
所以,强化学习也有一种效果叠加的感觉。在完全随机的情况下 ,探索出相对好的 action,再在这个相对好的 action 的基础上,在探索探索出更好的 action。
如果数据集不依赖模型,就是一直在完全随机的基础上探索。这样很难收敛。
也可以这样看,完全随机的话,最多能学到前几步的策略(因为完全随机就走不了几步,探 索的经验就只有那几步)。依赖于模型,探索的行为更有价值,因为是依赖于学到过的知识 的,一方面确认了,按学到的知识走,确实获益多,一方面又在学到的知识的基础上,做了 一些随机,探索更好的知识。
.2.2. 估值网络(Value Network,Q-learning)
Q-Learing 用神经网络实现,得到的模型就是估值网络。
也看一个例子 ,Value_Network.py
学习每个 Action 所对应的 reward 的期望。
我们先看看数据集的结构
1 | ###Save the experience to our episode buffer. |
-
现在目标是学习 Q(st, at),也就是当前环境状态,采取行为 a 的全部 reward 的期望。
-
现在假设我们有模型 Qdesird,可以预测全部 reward 了,那么这个模型 应该满足条件,Qdesired(st, at) = r + Maxa Qdesired(st+1, a),这有点递 归的感觉了。
-
现在我们能不能根据这个公式 , 来优化出 Qdesired。肯定是能的。对于 探索过的所有试验,公式都满足的话,此时的模型就可以看成我们想要的模型了。我感 觉这就是估值网络方法的核心。
直接看关键代码
1 | ###Choose an action by greedily (with e chance of random action) |
这是策略网络和估值网络的共通之处,其实这也最上面那个注释"by greedily (with e chance of random action) from the Q-network"的意思。
“贪心”两个字完美的诠释了强化学习,无论是策略网络还是估值网络 ,在探索阶段,在生成数据集上的特点。
在策略网络那一节,我做的那个试验,和模型无关生成数据集。其实就是不贪心了,不贪心 不行。
1 | if total_steps > pre_train_steps: |
下面的代码是将在数据集弄好的情况下,如何训练模型的。
1 | if total_steps % (update_freq) == 0: |
target 网络参数的更新方式代码
1 | def updateTargetGraph(tfVars,tau): |
.2.3. 策略网络和估值网络的不同
从策略网络和估值网络看,强化学习都有探索和对抗两个过程。通过探索,得到数据集,包 含了各种可能性。通过对抗,让数据集中好的(reward 高的试验胜出)。他们的不同点在 于对抗的方法。
- 策略网络:对抗的焦点在于选择 Action 的概率。
- 估值网络:对抗的焦点在于评估 Action 的 reward。
- 两者都会影响数据集的制作,而且影响的方式是相同的:贪心和随机探索
- 比起策略网络,估值网络更加没有对抗的感觉。因为策略网络在提高某一个 Action 的 概率的时候,会抑制其他 Action 的概率(总的概率为 1)。而估值网络在提高某一个 Action 的 reward 的时候,和其他 Action 是无关的。而且其实不能说是提高 reward,它是预测出正确的 reward。(这是两者的很大的不同处,策略网络更像是 一个分类问题,而估值网络像是一个回归问题)
.3. 回顾
强化学习的本质是连续决策。强化学习算法的关键是标签制作,数据集制作。
连续决策问题是没有确定的标签的,它通过探索试验得到数据集和标签,为没有提供标签的 问题,做了标签,让问题可以解决。
深度学习无法优化离散的不可导的参数,强化学习也可以通过在离散的地方做数据集做标签 ,把它转换为可导的,可用 sgd 优化的问题。
做标签和数据集的关键是随机性以及贪心,贪心让它立足于以往的知识,随机让它不刚愎自 用,保持谦卑,给新的可能保留空间。
无论是策略网络还是估值网络,在数据集的制作上都是一样的,随机性和贪心。估值网络的 数据集制作,可以看出强化学习探索的本质(由于估值网络本身没有随机性,它在制作数据 集的时候,显示的暴露了,探索和贪心的本质。策略网络这方面还不太好看出来,因为它是 隐式的利用探索和贪心)。
策略网络,增大所有行为的概率,但是对于 reward 大 的行为增大的权重大。这个思路在 我得感觉上更加符合强化两个字。强化好的行为嘛。
估值网络的本质是公式 Qdesired(st, at) = r + Maxa Qdesired(st+1, a),有点递归的感 觉。
策略网络和估值网络数据集也有一点不同,策略网络的数据集是纵向的,一串行为一起的。 而估值网络的数据集是单个单个的。
由下面代码可以看出,策略网络中,每一窜试验就会训练一次,只是网络参数更新会积累了 好几次试验之后才更新。策略网络关心从开始到结束一系列行为。而估值网络只关心当前和 下一状态。
1 | if done: |
估值网络人为的控制随机强度,也是一个值得考虑的问题。