前言 笔者自从学习人工智能相关的技术以来,一直觉得强化学习相关的资料相对偏少,无论是实体的书籍,还是网络上的各种文章,普遍存在重复量大,解释咬文嚼字,充斥着抽象的数学公式,很多时候对于一个算法的设计思路只是简单地列出几条公式就算强行解释过了,虽然在理解了这些算法之后,也能理解作者为什么会做出这样的解释,因为确实有些算法的设计思路是很抽象的。还有的算法纯粹是从数学层面推导出来的,单纯看最后的实现过程是完全没有任何道理的,只有理解了它背后的数学推导过程,才能理解为什么它是那样的一个实现过程,所以在某种程度上也能理解作者为什么要那样古板地解释算法的设计思路。 不过笔者还是希望尽自己所能,从更加感性、更加形象化的角度去解释各个强化学习算法的设计思路。笔者一直认为,万事开头难,学习数据库最困难的部分,可能就是成功地安装一个数据库。如果初期能顺利地入门,后期再去慢慢摸索算法中的各个细节,则可能会更容易一些。 出于以上原因,笔者想要尽自己所能,以自己对强化学习各个算法的理解,尽量简单明了地向读者介绍各个算法的设计思路,以帮助读者能够进入强化学习这座大厦的大门,未来读者可以自己在这座大厦里开启自己的冒险,乃至为这座大厦添砖加瓦。 前面谈到强化学习方面的理论往往解释得很生硬,其实相比原理解释上的问题,还有代码实现的质量也比较差,也许人工智能领域的工程师更偏向数学理论,在代码实现上普遍质量不高。代码里经常可以见到无意义的函数封装、冗余的代码块、无意义的判断、永远只循环一次的循环体等问题,让原本就复杂的程序更加难以读懂。 本书配套的代码都是笔者亲手编写的,全套代码的风格都是统一的,只要看懂了第1套代码,其他的代码就可以做到一通百通。笔者尽量以简洁的形式去书写代码,让每行代码都有意义,避免无意义的冗余,并且所有的代码都是测试通过的,能复现本书中所介绍的效果。 笔者自从2021年以来,逐渐把自己所学习的计算机技术整理成视频和代码资料,在分享知识的过程中,强化学习是很受读者欢迎的部分,同时也有很多读者给笔者反馈,强化学习部分的知识理解起来不太容易,这和笔者制作的视频的质量有很大关系,现在回头看,当初因为青涩,制作的视频资料十分粗糙,因而笔者有了重新制作这部分视频资料的想法,同时也给了笔者动力,想把强化学习部分的知识整理成文本资料出版,以更多的渠道和媒介向读者传达自己的声音。 如果本书的内容能对你有一点帮助,笔者的工作就没有白费,最后,感谢读者购买这本书,希望本书的内容能让读者有所收获。 本书主要内容 第1章: 强化学习概述,概述了强化学习的基本概念及一般的优化过程。 第2章: Q函数和时序差分,介绍了Q函数,以及使用时序差分方法优化Q函数。 第3章: 基于表格的强化学习方法,介绍了基于表格实现的QLearning算法和SARSA算法。 第4章: DQN算法,介绍了DQN算法,以及在DQN算法中使用双模型、加权数据池、Double DQN、Dueling DQN、Noise DQN等改良方法。 第5章: 策略梯度,介绍了基于策略的思想,以及使用策略迭代方法优化策略的过程。 第6章: Reinforce算法,介绍了Reinforce算法,以及在Reinforce算法中应用去基线、熵正则等优化方法。 第7章: AC和A2C算法,介绍了AC算法和A2C算法,引出了“演员评委”模型。 第8章和第9章: 近端策略优化算法和实现,介绍了在强化学习中的难点: 近端策略优化算法,即PPO算法,介绍了在PPO算法中重要的重要性采样、优势函数、广义优势估计等概念。 第10章: DDPG和TD3算法,介绍了深度确定性策略梯度算法,即DDPG算法,以及DDPG算法的改进算法——TD3算法。 第11章: SAC算法,介绍了SAC算法的实现,提出了优化过程中要考虑动作的熵的概念。 第12章: 模仿学习,介绍了模仿学习方法,提出了可以使用传统监督学习的方法来模拟强化学习方法。 第13章: 合作关系多智能体,介绍了在一个系统中多个智能体之间合作方法,介绍了多个智能体之间的有通信和训练时有通信的两种通信策略。 第14章: 对抗关系多智能体,介绍了在一个系统中多个智能体之间的对抗方法,介绍了多个智能体之间的无通信和训练时有通信的两种通信策略。 第15章: CQL算法,介绍了离线学习算法——CQL算法,提出了在离线学习中抑制Q函数的过高估计的方法。 第16章: MPC算法,介绍了直接学习环境的MPC算法,提出了从模拟环境中搜索得到最优动作的方法。 第17章: HER目标导向的强化学习,介绍了在反馈极端稀疏的环境中,通过放置伪目标点来提高优化效率的HER算法。 第18章: SB3强化学习框架,介绍了强化学习框架SB3的使用方法。 阅读建议 本书是一本对强化学习算法的综合性讲解书籍,既有设计原理,也有代码实现。 本书尽量以简洁的语言书写,每个章节之间的内容尽量独立,使读者可以跳跃阅读而没有障碍。 作为一本实战书籍,读者要掌握本书的知识,务必结合代码调试,本书的代码也尽量以简洁的形式书写,使读者阅读不感吃力。本书代码使用Jupyter Notebook书写,每个代码块即是一个单元测试,读者可以用每个程序的每个代码块按从上到下的顺序进行测试,从一个个小知识点聚沙成塔,融会贯通。 扫描目录上方的二维码,可获取本书源码。 致谢 感谢笔者的好友K,在笔者写作过程中始终鼓励笔者,使笔者有动力完成本书的写作。 在本书的撰写过程中,笔者虽已竭尽所能为读者呈现最好的内容,但书中难免存在疏漏,敬请读者批评指正。 李福林 2024年12月