CS285 Deep Reinforcement Learning#
Table Of Contents#
这里是笔记的目录,和Tutorial无关。
Takeaway/Cheatsheet: Here
- Preliminaries (just this file)
- What is RL (not implemented)
- Imitation Learning Here
- Pytorch Basics (Not complete)
- Introduction to RL Here
- Policy Gradients Here
- Actor Critic Algorithms Here
- Value Function Methods Here
- Q Learning (advanced) Here
- Advanced Policy Gradients Here
- Optimal Control and Planning Here
- Model-based RL Here
- Model-based RL with a Policy Here
- Exploration (1) Here
- Exploration (2) Here
- Offline RL (1) Here
- Offline RL (2) Here
- RL Theory Here
- Variational AutoEncoder Here
- Soft Optimality Here
- Inverse RL Here
- RL and Language Models Here
- Transfer Learning and Meta Learning Here
- Challenges & Open Problems Here
Preliminaries#
学习RL,我们需要什么?
-
一些DL的基本知识。
-
做好记号混乱的心理准备。如果学习过DL,就应该发现以下的场景是十分常见的:
- 一个符号有多个完全不同的含义;
- 多个符号代表完全相同的含义;
- 前一页的符号在后一页变了;
- 期待值不说明从哪个分布采样;
- 多个不同的概率分布全部用记号 \(p\) 表示;
- 还有最常见的:公式存在重要的typo。比如,在某些地方, \(p^\star\) 和 \(p_\star\) 代表两个完全不同的意思,但又在某一处一不小心写反了。
我们会尽量避免这些现象发生,但必须先打好这一预防针。这也不是任何人的问题——很多试图把这些记号变得清楚整洁的尝试都会大概率因为发现公式变得长得离谱以至于令人无法忍受而告终。所以,在混乱的记号中理解它们的“深意”,这一能力也是RL即将为我们培训的,十分重要的技能之一:)
tl;dr: 接下来,是几个十分基础的介绍或问题,旨在介绍RL的基本概念,建立起一个“形象”。如果您已经了解RL的基本任务,完全可以跳过。
What is Reinforcement Learning?#
Reinforcement learning (RL) is an interdisciplinary area of machine learning and optimal control concerned with how an intelligent agent ought to take actions in a dynamic environment in order to maximize the cumulative reward. Reinforcement learning is one of three basic machine learning paradigms, alongside supervised learning and unsupervised learning. (Wikipedia)
Wikipedia给出的对RL的定义十分直观。我们来总结一下,一个一般的RL问题由是agent(或者称为policy)和环境environment构成: - agent能做的是在某个给定的状态(state)下面给出操作(action); - 每作出一个action,环境会给出一个反应,也就是环境会进入下一个状态;同时,我们认为agent会得到一个环境赋予的reward; - agent的目标是最大化无限轮这样的操作之后的cumulative reward(当然,实际中可能会在若干轮后停止)。这一reward通常由环境给出。 - 环境的特性是如何根据state,action给出下一个state和reward。这称为环境的动力学(dynamics)。
我们为什么要定义这样的一个问题?当然是因为,这一抽象很好地描述了生活中的许多和人们所认同的“智能”相关的现象。 - 人们可以训练动物,使得它们做出一些特定的动作。如何训练呢?比如,小狗站起来,就喂它一把狗粮吃,否则就吓唬它一下;久而久之,小狗就会学会站起来。人们会说,“这个小狗真聪明!”——为什么?因为,它其实处理了一个很复杂的RL问题: - 它的action是十分复杂的,也许可以建模为大脑中成千上万神经元的刺激信号; - 它的dynamics更是复杂。从神经元如何将信号传输到一根根神经上,进一步控制肌肉的收缩;这再进一步和复杂的物理世界交互,由弹力、摩擦力、重力等等控制的一个极度耦合、非线性的偏微分方程进行时间演化;最终,它得到的reward只是0或1; - 在失败一次之后它不会放弃,因为它最大化的是累积的reward,它学会利用把历史的失败教训存在它的“参数”里,作出更好的决策,最终达到目标。 - 人类自己就更是如此。比如说,在高中,我们会根据考试的成绩或排名(某种“reward”)反思,进一步改进自己的学习方法这一policy;在人际交往中,我们也会根据对方做的事情来调整自己的行为,等等。
甚至对于新生的AI,和“环境”的交互也是“智能”最终的体现。
在OpenAI推出GPT3的时候,研究者们看了看它,说:“这个模型真不错”;在推出ChatGPT的时候,连你的奶奶都跑过来跟你说:“这个模型真不错”!你也看出来了——这之间是有很大的差距的。这一差距是什么?就是RL。正是RL让GPT3从一个普通的大语言模型变成一个可以和人对话、交互并了解人的喜好的"chatbot"。 ——Eric Mitchell, on the guest lecture of CS285
因此,我们更加清楚了RL这一领域的重要性。实际上,它的发展也主要集中在两个领域: - RL作为一个算法问题,如何解决? - 我们是否可以用RL的思想来解释人类或动物的行为?
当然,作为学习计算机的人,我们更关心的是第一个问题。本笔记就会从最基本的思想出发,带着大家一起解锁各个算法,建立一个解决RL问题的较全面的框架。但在开始之前,我们先来看几个常见的问题。
We already have Physics. Why do we need RL (for control) anyway?#
Q: 你搞个RL模型下下棋玩玩游戏差不多得了,我不懂不多作评价。连开车、发射火箭,你也要用你那个什么算法来?你模型几亿个参数我不懂,但物理规律在哪里呢?你发射火箭的时候,大到牛顿定律、拉格朗日方程,小到空气阻力系数甚至火箭的质量,在你的一堆只有线性函数和relu的模型里哪一个体现出来了?我凭什么相信你的甚至要指明随机数种子的算法,而不相信我几千个方程式严格联立求解出来的纯物理的控制方法呢?
A: 物理的方法当然合理,因为它们相当于人类完成了RL的"pretraining"。我们也无法否认物理方法在各种领域应用广泛,比如发射火箭,就可以完全通过物理的控制来完成。
但是,物理方法主要有两个问题。第一,你能否完全保证一切都在物理的控制范围之内吗?比如,对于自动驾驶,当你获得一张驾驶座前拍的一张照片,单纯的物理学并不能帮你把你前方的人、车、交通标志、道路都分清楚,确定下来。所以,这里必须就要有ML的方法介入了。
第二,就算对于完全完美的物理系统,纯粹物理的方法也不一定可行。比如,你为一只机器狗装了无数的传感器,它现在可以精准地定位它脚下沙滩上的每一颗沙子的位置、形状、大小和摩擦系数。再假设你经过研究可以高效地求解这个复杂的物理系统。但是假如突然脚下出现了一块小石头,你的系统就完全错误了。发射火箭能成功,是因为在高空意外很少见;而一旦意外出现,出一个错,动力学系统的混沌效应就会让物理的控制方法很难恢复。对于同样的问题,相反,对于大部分的RL算法,它把环境抽象为一个黑盒,发生意外情况的时候,agent会感知,并且恢复。这就是RL的优势所在。
物理和RL的关系,就像图片识别中专家方法和卷积网络的关系一样。作为二十一世纪的现代化公民,我们应该逐渐意识到神经网络的参数里蕴含的无穷能力了。
What's the difference between RL and DL (in the root)?#
RL和DL有什么区别呢?当然,我们知道,RL和环境有关,也有随机性;但它毕竟也是一个对确定的objective进行优化的过程。那么,RL和我们之前接触的DL(或者说,supervised learning和unsupervised learning)在实质性上真的有不同之处吗?
From the results#
在具体详细地分析之前,我们先从结果上来看,用一句话来引入:
Generative models are impressive because the images look like something a person might draw; RL models are impressive because no person had thought of their strategies before. ——Sergey Levine, the instructor of CS285
这句话很好地概括了RL和DL(在目标上)的区别。 - DL所做的是模仿,这件事情有标准答案。比如,对于generative model,它的最终任务就是学会数据集分布 \(p(x)\) 。人们夸赞它,夸赞它模仿地惟妙惟肖,就像是人一样。 - 而RL所做的是决策,这件事情没有标准答案。我们也已经看到,agent的目的是最大化cumulative reward。如何能最大化这一reward呢?每一步又该take什么action呢?这不仅没有答案,甚至在理论上都不一定是唯一的。人们夸赞RL agent,夸赞它们作出的举动是如此的“新颖”,与普通人的方法完全不同,甚至于超越了人类的认知。 - 比如,在当年AlphaGo战胜李世石的时候,agent给出了著名的"Move 37",当时所有的围棋专家都无法理解这一步的意义,这就是RL的魅力所在。
此外,老师在我学这门不久的时候跟我讲说,强化学习的insight是指,他将不可导的东西转化为可导的东西(例如RLHF,就是把人们的preferences转化为一个可导的函数)。这个insight是非常有意思的,因为它是一个很大的转变真正能够帮助到我们。
当然,从目标上来看,还有一个更为重要的区别:generalization。我们在这里暂且不描述,当我们去实践RL的具体任务的时候,我们就会真正体会到它们的差异。(如果你很好奇,可以直接去看看最后一讲的总结)
From the process#
从(训练)过程上,RL和DL也有很多细节上的差异。这些差异或多或少是重要的,你也可以发现,很多RL“算法”就是为了减轻这些差异带来的问题而设计的。
- 数据来源:
- 在DL中,我们被给定训练数据集,我们在上面训练我们的模型;
- 在RL中,开始我们一无所有。我们需要自己想如何和环境交互,获得数据。我们还要平衡获得新数据的过程和在老数据上面做类似DL的训练的过程,即平衡exploration和exploitation。
- 数据的关联性:即使数据都采集完成了,训练也并不相同:
- 在DL中,我们认为数据是i.i.d.的。可以发现很多DL算法实际上隐式地依赖(或默认了)这一点;
- 但在RL中,数据之间是相关的。因为我们和环境的交互方式是,每一次环境给我们一个next state,我们就在那一个state上面继续活动。也就是说,我们采集到的数据是一条轨迹(trajectory)。在这样的数据里面,前后肯定是有关联的。
- 额外的和环境交互的代价:
- 你之后跑RL训练的时候,你会发现你的神经网络出奇的小(比如,就几千个参数),但训练又出奇的慢。为什么?实际上很大的时间花费在了
env.step(actions)
这一函数上。这一函数的作用就是,输入action,环境计算并给你next state和reward。如果你使用gym
这个包,那么恭喜你,这一计算必须在CPU上使用np.ndarray
进行;你还总是需要把np.ndarray
和torch.Tensor
相互转化,这都是你的GPU利用率很低的原因。 - 这其实已经算好了,因为我们至少还只是用simulator在电脑上操作;如果要训练在实际世界里的机器人,那一秒就是货真价实的一秒!
- 因此,在RL,必须注意一件事叫做sample efficiency,也就是和环境交互的次数不应该过多。这又会进一步和sample的质量形成tradeoff……
- 你之后跑RL训练的时候,你会发现你的神经网络出奇的小(比如,就几千个参数),但训练又出奇的慢。为什么?实际上很大的时间花费在了
至此,应该可以看出DL和RL的多方面区别了。其实,这里列举的还不是全部,我们可以在具体的算法中进一步思考它们的区别。
Wait... So what do you mean by "Deep" RL?#
的确——RL实际上具有比你的想象更加悠久的历史,远远早于神经网络的发现。但是,当时人们的模型一般都是线性的。就是最近,人们才想到把RL和DL结合起来,用神经网络来表示policy。这就是Deep RL。
直观上,把RL搞得Deep一些肯定是有益无害;但事实上有很subtle的事情会发生。我们会在后面的笔记中进一步讨论这一点。
Anyway... Let's get started!#
Created: 2024年10月29日 20:50:57