强化学习笔记1
强化学习(1)
作者:hschen
写于:16-4-13
强化学习简介
监督学习在机器学习中取得了重大的成功,然而在顺序决策制定和控制问题中,比如无人直升机、无人汽车等,难以给出显式的监督信息,因此这类问题中监督模型无法学习。
强化学习就是为了解决这类问题而产生的。在强化学习框架中,学习算法被称为一个agent,假设这个agent处于一个环境中,两者之间存在交互。agent通过与环境交互不断增强对环境的适应力,故得名强化学习。
这个过程可以用下图来理解:
在每个时间步t,agent:
- 接受状态st
- 接受标量回报rt
- 执行行动at
环境:
- 接受动作at
- 产生状态st
- 产生标量回报rt
MDP
通常我们都是从MDP(马尔科夫决策过程)来了解强化学习的。MDP问题中,我们有一个五元组:(S,A,P,γ,R)
- S:状态集,由agent所有可能的状态组成
- A:动作集,由agent所有可能的行动构成
- P(s,a,s′):转移概率分布,表示状态s下执行动作a后下个时刻状态的概率分布
- γ:折扣因子,0≤γ≤1,表示未来回报相对于当前回报的重要程度。如果γ=0,表示只重视当前立即回报;γ=1表示将未来回报视为与当前回报同等重要。
- R(s,a,s′):标量立即回报函数。执行动作a,导致状态s转移到s′产生的回报。可以是关于状态-动作的函数S×A→R,也可以是只关于状态的函数S→R。记t时刻的回报为rt,为了后续表述方便,假设我们感兴趣的问题中回报函数只取决于状态,而状态-动作函数可以很容易地推广,这里暂不涉及。
注:这里阐述的MDP称为discounted MDP,即带折扣因子的MDP。有些MDP也可以定义为四元组:(S,A,P,R),这是因为这类MDP中使用的值函数不考虑折扣因子。
MDP过程具有马尔科夫性质,即给定当前状态,未来的状态与过去的状态无关。但与马尔科夫链不同的是,MDP还考虑了动作,也就是说MDP中状态的转移不仅和状态有关,还依赖于agent采取的动作。举个下棋的例子来说,我们在局面(状态st−1)走了一步(动作at−1),导致棋盘状态变为st,这时对手只需要根据当前棋盘状态st思考,作出应对at,导致局面变为st+1,而不需要考虑再之前的棋盘状态st−i,(i=1,2,...)。由于对手会采取什么行动我们无法预测,因此st+1是随机的,依赖于当前的局面st和对手的落子行动at。
我们可以通过下面表格了解各种马尔科夫模型的区别:
|_|不考虑动作|考虑动作|
|:|:|:|
|状态可观测|马尔科夫链(MC)|马尔科夫决策过程(MDP)|
|状态不完全可观测|隐马尔科夫模型(HMM)|不完全可观察马尔可夫决策过程(POMDP)|
MDP的运行过程:
我们从初始状态s0出发,执行某个动作a0,根据转移概率分布确定下一个状态s1∼Ps0a0,接着执行动作a1,再根据Ps1a1确定s2...。
一个discounted MDP中,我们的目标最大化一个累积未来折扣回报:
具体地,我们希望学得一个策略(policy),通过执行这个策略使上式最大化。策略一般可以表示为一个函数,它以状态为输入,输出对应的动作。策略函数可以是确定的π(s)=a,也可以是不确定的π(s,a)=p(a|s)(这时策略函数是一个条件概率分布,表示给定状态s下执行下一个动作a的概率)。当agent执行一个策略时,每个状态下agent都执行策略指定的动作。
强化学习通常具有延迟回报的特点,以下围棋为例,只有在最终决定胜负的那个时刻才有回报(赢棋为1,输棋为-1),而之前的时刻立即回报均为0。这种情况下,Rt等于1或-1,这将导致我们很难衡量策略的优劣,因为即使赢了一盘棋,未必能说明策略中每一步都是好棋;同样输了一盘棋也未必能说明每一步都是坏棋。因此我们需要一个目标函数来刻画策略的长期效用。
为此,我们可以为策略定义一个值函数(value function)来综合评估某个策略的好坏。这个函数既可以是只关于状态的值函数Vπ(s),也可以状态-动作值函数Qπ(s,a)。状态值函数评估agent处于某个状态下的长期收益, 动作值函数评估agent在某个状态下执行某个动作的长期收益。
本文后续都将以状态值函数为例,进行阐述。一般常用的有三种形式:
- Vπ(s)=Eπ[∞∑k=0rt+k+1|st=s]
- Vπ(s)=Eπ[lim
- V^{\pi}(s) = E_\pi[\sum\limits_{k=0}^{\infty}\gamma^k r_{t+k+1}|s_t=s]
其中E_\pi[\cdot|s_t=s]表示从状态s开始,通过执行策略\pi得到的累积回报的期望。有些情况下,agent和环境的交互是无止境的,比如一些控制问题,这样的问题称为continuing task。还有一种情况是我们可以把交互过程打散成一个个片段式任务(episodic task),每个片段有一个起始态和一个终止态(或称为吸收态,absorbing state),比如下棋。当每个episode结束时,我们对整个过程重启随机设置一个起始态或者从某个随机起始分布采样决定一个起始态。下面的部分我们只考虑片段式任务。
上面三种值函数中,我们一般常用第三种形式,我把它叫做折扣值函数(discounted value function)。下一篇将介绍计算折扣值函数三种方法:动态规划、蒙特卡洛、时间差分。
参考:
1.wiki
2.强化学习二
3.Reinforcement Learning: An Introduction
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!