关于强化学习的资源现在也是越来越多了,自己16年接触的时候国内资源比较少,有知乎上郭宪博士的一点文章和莫烦博士的教学视频,。自己也总结了一些资源,希望可以帮到各位。链接:https://github.com/ZhiqiangHo/awesome-reinforcement-learning。后期的话打算对自己已近学了的强化学习做一个总结,这篇文章的画是自己做一个学习记录,学习一下别人的学习笔记,链接如下:https://zhuanlan.zhihu.com/c_150977189。学习别人总结好的笔记的好处就是,可以体会到不同的思想。好了,我要开始乱记录了:
(一)
机器人控制系统。如果我们想弄一个机器人控制流程,首先第一步是从观测得到像素级别的图像;第二步是从这个图像得出现在的情况意味着什么,即状态估计;第三步是模型预测,可能会参考物理模拟器和相关仿真引擎来预测机器人下一步动作的效果;第四步是根据预测结果做行动的计划;第五步是将计划的结果变成低级控制 (low-level control) 来算出控制电机运转和扭矩的命令,最终实现控制。
上面的这句话的前两步是比较好理解的,第三步模型预测,大概的意思就是预测出我们需要走到哪个位置,才能获得比较大的奖励值,或者你换个角度思考,我们预测什么样的状态,会获得多大的奖励。这样我们只需要达到那个状态就可以了,这里也许会有一个疑问,那这预测出来的奖励是一个估计值,本身就是不准确的,怎么可以用来衡量状态的好坏呢?其实是可以的,想一下,如果我预测状态1的奖励大于状态2,那是不是可以说明状态1的好坏程度是好于状态2的,虽然奖励值是不准确的,但是状态1在同一个神经网络的估计下好于状态2,那么就能说明状态1相比较于状态2是很好的。我们如果知道了我们要到达的状态应该长什么样子的话,我们就可以通过控制里面的模型预测控制,或者其他的方法,到达预测出来的那个状态。从而实现控制。
如果我们要弄一个机器人让它倒满一杯水,这个奖赏函数该怎么设置?这个任务对于孩子来说并不难,但是对于机器人来说则异常艰难,也是一个开放问题。从生物学、大脑的角度看,有一块非常复杂的、叫基底核 (Basal ganglia) 的部分负责人类的这块“奖赏”,一般是对进化有利的人类行为进行奖励。很难说是一个来自奇妙的地方的一个奇妙的“得分”,必然是有一定来源的。一只猎豹在捕猎一只羚羊,猎豹不能只是随机地动它的四肢直到捕到羚羊这个事情发生,必然有很多诸如对方向感知等,这个奖励系统事实上必然是非常复杂的。事实上,奖赏系统的存在性和完善性已然是一个相当强的假设。
这个问题简单概括一下就是:当我们需要进行很长一段时间的交互之后才能获得最后的奖励,中间所有步骤的奖励都是0,导致这个问题非常难解,专业一点叫做奖励稀疏。可能你还是不能很明白为啥就难解了,换个角度考虑,你交互的数据里面,之后很低的概率的数据是含有奖励的,而大部分数据奖励都是0,并且每个episode的步骤长一点的话乘上折扣因子gamma,基本数值就衰减没有了,导致神经网络很难收敛。
我们也关心现在深度学习和增强学习到底能做好一些什么样的事情。主要有三类问题。一类以AlphaGo在围棋领域的突出事迹为代表,在一个已知规则且规则简单的领域内,获得很高程度的精通水平;第二类是给予足够的经验尝试,使用直接的传感器数据作为输入来学习简单的技能,这个在机器人中比较常见;第三类则是从足够多的人类专家提供的行为中模仿学习,如自动驾驶。
这个感觉总结地很好,倒是没有什么比较难理解地地方。
(二)
动作可以是离散意义的,譬如跑掉、忽略或者去抚摸它等,在数学表达上和之前的类似,可以使用Softmax;也可以是连续的,譬如选择往哪个方向跑,可能会去用一个高斯分布的均值和方差来表示;当然混合起来也是可以的。
可以参见以下链接:https://spinningup.readthedocs.io/zh_CN/latest/spinningup/rl_intro.html的绝对策略和对角高斯策略理解。
在这边还出现了一个状态 (state) 的概念,通常指真实环境的相关配置全貌,包含了我们去了解这个世界所需要的一切信息,但这些信息不见得能从单一的观测中得出来。
状态包含环境所有的信息,但是观测只是你看到的部分信息。
我们使用红色的线来描绘根据之前策略得到的期望轨迹。如我们在第一个拐弯处出现了一个非常小的失误(第一次出现夹角处),这时我们的状态是和训练轨迹有一个非常小的差距的。这个失误本身并不严重,而麻烦的是,这个失误导致进入了一个新的状态,在这个状态中可能会犯的错误比之前的失误更大。虽然可能只大一点点,但是会导致这个轨迹偏离越偏越大,最后发散到一个很离谱的地方。这本质上是因为序贯决策的特性才导致了这样的问题:如果只是一个单独的问题,也许会犯点小错误,但这个错误是有限的;而这里的决策并不是独立同分布,每个行动都会影响下一个状态,这样错误就会被累积起来。
用模仿学习最最大的弊端就是你无法完全模仿,就是你没有掌握控制这个系统的灵魂。
实际上轨迹路线上看到的数据分布将和训练数据的分布不同,除非我们的训练是完美的,且看到了与训练数据一模一样的初始观测。如果两个分布不同,那么这将意味着我们将在一个与训练集有很大差异的测试集上进行测试,这在监督学习中也称为域转移 (domain shift),通常机器学习不能保证在测试集有任何的效果。
DAgger算法:
第三步我们可能会需要很长的人工标注时间(我感觉通常比收集数据本身难多了),而且有相当难度。譬如指导汽车驾驶,如果坐在驾驶位上可能是非常熟练的,但给你图片让你给出标注可能就不那么容易了。
说的是我们之前的数据分布不一样,这里我们先得到策略,然后用这个策略产生数据,这样的话就能够使得分布都是从pai_theta(at|ot)中产生的。然后标记完之后,分布又不一样了,然后重复标注。我个人感觉就是再磨洋工。
有两个原因使得我们经常不能很好地学习专家行为。
第一个是非Markov行为,意思是专家所做的行为可能不完全依赖于当前所看到的东西。我们在前面学习的假设中,给定的策略形式pai假设行动只依赖于当前的观测。这在一些情况下并不合理,是因为我们只能得到部分观测 (partially-observed),当前的状态不能被这个观测所完全推断出来。通过循环神经网络解决。
第二个是多峰 (multimodal) 行为。当我们要驾驶无人机躲避一棵树的时候,我们可能会向左绕或者向右绕,但如果将这些决策进行平均的话就变成向前飞然后撞上去了。
1. 第一种方法是使用高斯分布的混合。
2.第二种是使用隐性密度模型 (Implicit Density Model),这类模型可以表达任意概率分布:虽然它本身还是输出一个高斯分布或者一个什么其他的简单分布,甚至可以是一个值。现在我们输入的不仅仅是一个观测图像本身,同样也输入一个噪音进去,譬如给定维数的多元高斯噪音,然后得到输出。这一模型可以学习任何的非线性函数,可以把单峰的噪音变成多峰的输出。我自己感觉这个模型输入了一个随机噪音进去,对应了原分布的某一个位置,有点像概率论里面的分布变换。这种方法的主要问题是这个模型很难训练。
3.第三种是使用自回归离散化 (Autoregressive Discretization)。如果有连续的动作,一个可行的方法是将其离散化;但是如果维度大了,离散化后的联合分布将维度灾难。一个小技巧是避免联合离散化所有维度。假设我们有三个维度,首先我们离散化维度1,通过诸如Softmax的方法得到维度1的几个离散分类的分布。然后我们从这个分布里面进行抽样,得到维度1的值(其实是某个分类),然后把这个值输送给另一个神经网络(顺便还有图像或者某些隐藏层数据),这个神经网络给出离散化后维度2的分布,再如此得到维度3的分布。这样做的一个好处是,维度2的分布是以维度1的样本为条件的,即。这样就可以表示出任何的联合分布,但是在一个时段只需要离散化一个维度。当你训练这样的模型时,只需要给每个维度的正确值就可以了,做一个标准的监督学习过程。在测试中,需要依此采样然后馈入后续网络之中。
总结来说,模仿学习通常有一定局限性(分布不匹配的问题、误差累积问题),但有时候能做得不错,如使用一些稳定控制器,或者从稳定轨迹分布中抽样,抑或是使用DAgger之类的算法增加更多的在线数据,理想化地如使用更好的模型来拟合得更完美。
专家系统难学,第一个是不仅仅依赖于当前观测做出决策,第二个是多峰行为,再提出了三种解决方法。
(三)
作者从另一个角度阐述了用期望来衡量强化学习的目标的好处。
(四)
再往后走我就发现作者开始翻译了,没有灵魂了(可能是我太菜了,嘻嘻嘻嘻),慢慢介绍基于值的,基于策略的,还有AC的,但是都是公式的罗列,但是都没有扼住要点,公式晦涩难懂,后期我自己再结合自己的学习写一份好了。