强化学习总结

本文围绕强化学习展开,介绍其目标是学习最优决策序列获最大长期累积奖励,数据可源于真实或虚拟环境。阐述了多种求解最优策略的方法,如动态规划法、蒙特卡洛法等,还对比了Q - Learning和SARSA等算法。此外,列举了强化学习在淘宝、Google等的应用,以及AlphaGo等案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

强化学习的目标:学习最优决策序列,使其得到最大化的长期累积奖励;

强化学习的数据,一部分是在真实环境中实践得到,一部分可从和虚拟环境的交互中模拟得到;从而丰富了训练数据;

环境模型:状态转移概率P(s[t+1] | s[t],a), 奖励函数R(s[t+1],a)

求解最优策略-->求解最优价值函数: 1.动态规划法(策略迭代,价值迭代,异步动态规划);2.蒙特卡洛法;3.时间差分法(TD);1是环境模型已知,2和3可以不需要环境模型;状态太多时,1就不适用了;

探索和利用的权衡:\varepsilon-贪婪法;有\varepsilon的概率去探索;随着尝试次数的增加,\varepsilon应当逐渐减小;

策略迭代:很多轮迭代后,所有状态的价值函数都收敛了,才更新策略;

价值迭代:一轮迭代后,就更新策略;

蒙特卡洛法:用随机性解决确定性的问题;即采样次数越多,越逼近最优解;一条道走到黑,遇到终止状态才完成一次采样;

时间差分法:1.Sarsa:Q(s[t+1],a')里的a'是用\varepsilon-贪婪法得到的,下一步就会实际执行的动作;2.Q-Learning: Q(s[t+1],a')的a'是所有a里面使得Q值最大的那个,只做评估用,下一步不走它(下一步用\varepsilon-贪婪法来走)

蒙特卡洛法:无偏差,方差大,对初始值不敏感;

时间差分法:偏差较大,方差低,对初始值较敏感; 通常比蒙特卡洛法更高效;

策略梯度法:1.蒙特卡洛策略梯度法(用G来做策略梯度定理里的第二项);2.时间差分策略梯度法(用Q或者\DeltaQ作为策略梯度定理里的第二项);3.Actor-Critic算法:Actor走一步,Critic得到\DeltaQ,\DeltaQ作为Actor策略梯度定理里的第二项去更新Actor的策略参数\theta\DeltaQ的平方(均方误差)作为Critic的损失函数更新Critic的评估参数w;

利用环境模型的算法,比如Dyna,引入了二次误差(训练环境模型是一次,使用环境模型生成的数据去强化学习是第二次)

DQN使用连续4帧图像做输入,是为了捕捉游戏环境的动态性;探索很多经验之后,才开始训练,目的是为了避免对早期经验的过拟合;

强化学习的应用:

1. 淘宝使用强化学习优化商品搜索;(Virtual-Taobao) (收益提升2%)

2. Google使用强化学习作为广告的推荐框架(Gorila)   (广告收益提升4%)

3. AlaphaGo & AlaphaGo-Zero

4. AutoML自动模型压缩;

5. 神经机器翻译

6. 滴滴智能派单系统(除了二分图匹配,还考虑长远累积总分)

7. 菜鸟的装箱优化

Q-Learning:

<s, a, r, s'>

s:  state

a: action

r: reward

s': next-state

r(s, a) + max(所有a'){Q(s', a')}是target,  Q(s, a)是当前,target - Q(s,a)是要更新的delta量,Q(s,a) + η*(target - Q(s,a))是下一状态的Q(s,a)

每次以概率ε来随机选action, 以概率1-ε来走当前最优action; ε随着效果变好而逐渐减小 (类似模拟退火)

每次训练一个minibatch的<s, a, r, s'> (之前记录的状态转移库)

小游戏的例子:

<action> ===state===> <next-state, reward, isTerminal> , 前者输入到游戏机,state是游戏机维护的当前状态,后者游戏机输出给学习算法;

可以把next-state这一帧图像append到state的后3帧图像后面,形成4帧图像(4个通道),每帧图像做黑白二值化处理(如果先验知识知道黑白还是彩色不影响结果)

一上来先试着走,积累了一定数量的状态之后,才开始变走边训练;

试走:以较小概率(越往后概率越小),随机选择action;以较大概率,按当前state输入神经网络得到的最大Q值的action来走;把4元组放到状态池里;

训练:从状态池里随机选取一个mini-batch做训练;先把next-state输入到神经网络得到所有action的Q值,求最大Q值;该Q值乘以衰减系数(0.99), 加上reward,就是目标Q值(如果已经是terminal了,则只使用reward做目标Q值);把state输入到神经网络,输出只计算本action的Loss(其他action和Loss-Function无关),本action上的输出值和目标Q值的MSE就是Loss,训练一下子(更新梯度);

Bellman方程及其推导:

强化学习学习笔记——介绍强化学习(reinforcement learning)_trillion_power的博客-CSDN博客

认为当前状态下采取各个action服从某概率分布的;当前状态下采取某个action后到达的状态也是服从某概率分布的

策略迭代:

初始随机定策略,随机指定各个状态的价值

1. 策略评估: 每个状态, 按照当前的策略, 试走一步,用reward和下一状态的价值,估计出本状态的价值;也就是按这个策略得到的本状态价值;迭代下去直到收敛(也就是所有状态的价值不再大改变了)

2. 策略提升: 每个状态,试探每个动作,根据reward和下一状态的价值,估计该动作会得到的价值,然后所有动作取最大那个就是更优策略;这个步骤只做一遍,不迭代;

重复1和2迭代下去直到收敛

策略迭代的一个代码例子,印证了策略评估要迭代才开始下一轮,策略提升是一下子就开始下一轮;这份策略迭代伪代码geng更清楚;

每个状态当前时刻的策略,采取各个action可以是概率,也就是有的action概率大有的action概率小,这就形成了一个策略;策略评估的时候,Bellman方程里每个action是有概率的,当前状态采取某个action后到达所有状态都是有概率的,两组概率的价值嵌套相加就是当前状态当前策略下的期望价值;策略提升的时候,当前策略也可以(但是官方公式是argmax)不是取各个action的max,而是根据采取各个action得到的价值来决定采取各个action的概率,价值大的就让这个action概率大,小的就让小;

价值迭代可以看做是从策略迭代的策略提升公式里合并得到的;价值迭代不管策略,只在最后结束的时候价值函数收敛以后才定下策略来;本质上是策略和价值交替提升,一小步接着一小步;不同于策略迭代(固定策略,价值提升很多轮直到收敛;再固定价值,策略提升很多轮直到收敛;交替进行),策略迭代是一大步改一次策略再一大步改一次策略;

强化学习很好的专题博客

:agent和环境是2个节点,action和reward和state是3条边;

MDP(Markov Decision Process,马尔科夫决策过程): 把MDP假设引入强化学习,目的是为了简化模型;有3个地方用到:1. 环境的下一状态只和"上一状态+action"有关(和以前状态无关);2.当前状态下的策略(即发动各个action的概率),只和当前状态有关(和以前状态无关);3.当前状态下的价值,只和当前状态有关(和以前状态无关);

状态价值函数v, 动作价值函数q, Bellman方程(注意要能推导,两种形式都是带E的); v和q的递推关系(注意:两组最优的递推公式,和两组递推关系的式子,是不同的!);动态规划的策略迭代和价值迭代,在更新价值时,用的是递推关系的式子(不同a的概率之和),在更新策略时,用的是最优递推公式(取最大值对应的a做为当前状态下的策略);

动态规划求解:其实讲的分别是策略迭代,价值迭代,异步动态规划;策略迭代和价值迭代的区别:策略迭代是等到状态价值收敛才调整策略; 价值迭代是不等,随着状态价值的迭代及时调整策略;  异步动态规划:不是所有状态更新一轮再开始下一轮

蒙特卡罗法:在S[t]状态下做action A,转移到下一状态S[t+1]的概率不知道的情况下(即环境模型未知的情况下),用该方法去试探的走。特点:一条道走到终止状态(不见棺材不落泪),期间探索(随机走)结合利用(贪心走);走出一条S,A,S,A,...A,S序列后,更新v[S]和q[S,A],平均法;

时序差分法(TD): 蒙特卡罗法是当前状态价值真的由后续状态直到终止状态的激励加权和得到;时序差分法是当前状态价值由当前激励和下一状态的价值函数加权和得到;即蒙特卡罗走一个序列才能计算出当前价值,时序差分只走一步就能计算当前价值;时序差分法由于无法统计准确的本状态出现次数,所以用参数α代替;

时序差分法,离线控制和在线控制的区别:在线控制(例如SARSA)一般只有一个策略(最常见的是ϵ−贪婪法)。而离线控制(例如Q-Learning)一般有两个策略,其中一个策略(最常见的是ϵ−贪婪法)用于选择新的动作,另一个策略(最常见的是贪婪法)用于更新价值函数。

    对于Q-Learning,我们会使用ϵ−贪婪法来选择新的动作,这部分和SARSA完全相同。但是对于价值函数的更新,Q-Learning使用的是贪婪法,而不是SARSA的ϵ−贪婪法。这一点就是SARSA和Q-Learning本质的区别。

SARSA算法:使用时序差分求解强化学习控制问题。求解控制问题,要写成Q(S,A)和Q(S',A')的关系式。Q(S,A)<=Q(S,A) + α(R+γQ(S',A')-Q(S,A)) ; S'下选择A'用的是ϵ−贪婪法,S'和A'作为下一时刻的S和A(也就是一条道走下去); 步长α一般需要随着迭代的进行逐渐变小,这样才能保证动作价值函数Q可以收敛。

Q-Learning: 对于Q-Learning,我们会使用ϵ−贪婪法来选择新的动作,这部分和SARSA完全相同。但是对于价值函数的更新,Q-Learning使用的是贪婪法,而不是SARSA的ϵ−贪婪法。这一点就是SARSA和Q-Learning本质的区别。Q(S,A)<=Q(S,A) + α(R + γ*max(Q(S',a)) - Q(S,A))

Q-Learning和SARSA的对比:1. Q-Learning直接学习的是最优策略,而SARSA在学习最优策略的同时还在做探索。这导致我们在学习最优策略的时候,如果用SARSA,为了保证收敛,需要制定一个策略,使ϵ−贪婪法的超参数ϵϵ在迭代的过程中逐渐变小。Q-Learning没有这个烦恼。2. 另外一个就是Q-Learning直接学习最优策略,但是最优策略会依赖于训练中产生的一系列数据,所以受样本数据的影响较大,因此受到训练数据方差的影响很大,甚至会影响Q函数的收敛。Q-Learning的深度强化学习版Deep Q-Learning也有这个问题。3. 在学习过程中,SARSA在收敛的过程中鼓励探索,这样学习过程会比较平滑,不至于过于激进,导致出现像Q-Learning可能遇到一些特殊的最优“陷阱”。比如经典的强化学习问题"Cliff Walk"。4. 在实际应用中,如果我们是在模拟环境中训练强化学习模型,推荐使用Q-Learning,如果是在线生产环境中训练模型,则推荐使用SARSA。

Deep Q-Learning : 3种网络:1.输入s输出v'(s); 2.输入s和a输出q'(s,a); 3.输入s输出所有a的q'(s,a);  加'是表示预估函数值,和真实值有误差;常用的是3;重要技巧:经验回放,把走过的“步”都存起来,训练的时候用;

Nature DQN: 走动作的网络,和选择目标值的网络,是同一个,"彼此依赖,相关性太强,不利于收敛";Nature DQN使用2个网络,一个Q用来走动作,另一个Q'用来选择目标值q'(s,a); 一段时间后周期性同步一次(把Q复制给Q')

Double DQN(DDQN) : NatureDQN"使用max虽然可以快速让Q值向可能的优化目标靠拢,但是很容易过犹不及,导致过度估计(Over Estimation),所谓过度估计就是最终我们得到的算法模型有很大的偏差(bias)"; DDQN通过解耦目标Q值动作的选择和目标Q值的计算这两步,来达到消除过度估计的问题。(说白了就是选择最优a'在Q上选,用该a'计算目标Q值在Q'上计算)

Prioritized Replay DQN :在DDQN基础上,把经验回放的采样变得更合理,误差大的样本,得到更大的采样几率。和DDQN有3点不同:1.采样的概率正比于误差值;2.损失函数里每个样本有权重w, w和该样本的采样概率正相关;3.每次更新完Q,都要重新计算所有样本的误差;  采样知识点:使用SumTree,采样的时候把整个范围分成n个区间,每个区间采样一个点,这个点对应到叶子层在哪个节点就是采哪个叶子节点;

策略梯度原论文里的公式,应该是真理;简书里的公式推导,看上去是容易理解,但是最后式子里是R,而原论文里是Q,谁对谁错?这里引用的公式推导,和原论文的推导1,是一样的(不过博文作者强行把R换成Q,是没道理的);知乎里解释的很好,R的那种是单步MDP, Q的那种是多步MDP;  softmax策略下,策略函数对数梯度的推导,我推成功了,第一部分减去第二部分,第一部分是采取某行为的Score,第二部分是当前状态的期望分值(采取所有行为的期望分值);

策略梯度引入基准值:策略梯度定理的解释:如果奖励 () 比较高时,策略 () 会倾向于增加相应的动作的概率,如果奖励比较低时,策略会倾向于降低相应动作的概率。通过引入基准值b减小方差:这是因为实际计算中产生的轮次奖励并不能准确代表这个策略的好坏程度,比如当策略已经较好时,使用一个不太好的样本生成了较小的轮次奖励,由于这个奖励非负,传统的策略梯度算法仍然尝试增加产生这个轨迹的动作的概率,从而导致学习效果不升反降。所以我们需要引入一个基准值,使得算法能够增加优于基准值的动作的概率,降低低于基准值动作的概率。

Actor-Critic : Critic使用我们之前讲到了的价值函数,负责评估Actor的表现,并指导Actor下一阶段的动作。上一篇的策略梯度,策略函数就是我们的Actor,但是那里是没有Critic的,我们当时使用了蒙特卡罗法来计算每一步的价值部分替代了Critic的功能。Critic通过Q网络计算状态的最优价值v, 而Actor利用v这个最优价值迭代更新策略函数的参数θ,进而选择动作,并得到反馈和新的状态,Critic使用反馈和新的状态更新Q网络参数w, 在后面Critic会使用新的网络参数w来帮Actor计算状态的最优价值vt。里面的算法流程,很清楚,用在Critic网络上得到的TD误差,既作为Critic网络的损失函数(均方误差损失函数),又作为Actor的策略梯度更新公式里替代Q的东西(决定了Actor的更新方向和幅度);简书解释了为什么用时序查分作为Q,从baseline函数降低方差,推导得到失序差分的形式。 Actor 基于概率选行为, Critic 基于 Actor 的行为和奖励评判行为的得分, Actor 根据 Critic 的评分修改选行为的概率。知乎里解释了方差和偏差;

A3C : (经验回放有什么问题呢? 回放池经验数据相关性太强,用于训练的时候效果很可能不佳。举个例子,我们学习下棋,总是和同一个人下,期望能提高棋艺。这当然没有问题,但是到一定程度就再难提高了,此时最好的方法是另寻高手切磋)。 同时在多个线程里面分别和环境进行交互学习,每个线程都把学习的成果汇总起来,整理保存在一个公共的地方。并且,定期从公共的地方把大家的齐心学习的成果拿回来,指导自己和环境后面的学习交互。N步采样:得到的Q值更准确些;流程里面是每采样一批后,停下来计算这批里所有状态的Q值,更新两个网络,再把delta上传到共享网络上去;

DDPG: 在Actor-Critic的基础上,拆成了4个网络:(Actor的损失函数,没看懂)

    1. Actor当前网络:负责策略网络参数θ的迭代更新,负责根据当前状态S选择当前动作A,用于和环境交互生成S′,R。

    2. Actor目标网络:负责根据经验回放池中采样的下一状态S′选择最优下一动作A′。网络参数θ′定期从θ复制。

    3. Critic当前网络:负责价值网络参数w的迭代更新,负责计算负责计算当前Q值Q(S,A,w)。目标Q值yi=R+γQ′(S′,A′,w′)

    4. Critic目标网络:负责计算目标Q值中的Q′(S′,A′,w′)部分。网络参数w′定期从w复制。

Dyna: 基于模型的强化学习和不基于模型的强化学习结合起来;用传统不基于模型来走路并更新Q函数,每走一步都用基于模型的方法也更新Q函数,实际走的路会更新模型;(环境模型,就是P(S(t+1) | S(t),a) 和 R(R(t+1) | S(t),a)

蒙特卡洛树搜索:四部曲:1.Selection; 2.Expansion; 3.Simulation; 4.Backpropagation; 当前步,要进行很多次模拟走棋(每次都走到游戏结束;随机走棋或者用弱决策器决定走棋),直到超时,才选择最优子节点走这一步;代码例子看完就懂了;优点:走完当前步之后,子树里之前积攒的Reward信息,仍然可复用;UCT是兼顾了搜索成果和探索倾向:过往搜索成果里表现好的会优先,搜索次数少的会更优先;

AlaphaGo : 论文中文翻译英文原版论文; 4个模型:

1.浅层线性分类模型(训练数据也是人类专家的对弈棋局;用于蒙特卡罗树模拟阶段快速走棋,对V值有一半贡献);

2.监督式策略网络(人类专家的对弈棋局作为训练数据,目标是拟合人类走法;用在蒙特卡罗树搜索阶段策略评分的P部分);

3.强化学习式策略网络(使用2作为初始参数,通过与不同阶段的2进行对弈,用最终的胜败结果做拟合目标,更新每一步的策略梯度);

4.价值网络(也叫估值网络;以3和3的自我对弈中产生的棋局做训练数据,拟合每个棋局状态下的胜负得分;用于蒙特卡罗树模拟阶段直接对V值有一半贡献);

1和2的学习属于监督学习;3和4的学习属于强化学习;V的平均值就是Q值;Q和P共同形成搜索策略P(a|s),搜索过的次数N越大,P的作用越小,Q的作用越大;2用在了对战时蒙特卡罗树搜索时做先验概率P,3用在了生成对弈棋局数据喂给价值网络4;

并行:蒙特卡罗树搜索和模拟快速走棋,使用了CPU多线程异步;234这3个网络的预测使用了GPU

蒙特卡罗树搜索步骤:

A. 用搜索价值Q综合上卷积策略网络(2)得到的先验概率P,生成到未来T轮的落子方案; 
B. 用卷积价值网络(4)评估该落子方案的胜率,用softmax回归网络基于该落子方案继续快速走棋,直至棋局结束得到输赢结果,综合两个结果算出该T轮落子方案的胜率V; 
C. 从叶子节点回溯到根节点,路上的所有Q被V更新;(Q就是V们的平均值) 
最后,循环上述过程若干次,选择搜索途经次数最多的子节点作为当前走法。

Tips:

(1)“快速走子网络”计算一次需要2微秒,“专家训练网络”计算一次需要3毫秒。

(2)“快速走子网络”与专家走法的匹配准确度为24.2%,“专家训练网络”则为57%。

(3)“自我提升网络”和“专家训练网络”对弈胜率为80%。

(4)“价值判断网络”在使用职业棋手对局数据进行训练时,发生了过度拟合的情况,训练组偏差0.19而测试组达到0.37,说明泛化效果不好。为了解决这个问题,改用了“自我提升网络”自我对弈3000万局作为“价值判断网络”的训练数据,基本解决了过度拟合的问题。

(5)DeepMind团队发现,在蒙特卡洛树搜索时,计算下一步走子概率使用“专家训练网络”效果要优于使用“自我提升网络”,虽然“自我提升网络”与“专家训练网络”对弈时胜率高达80%。但是在训练“价值判断网络”时,使用“自我提升网络”自我对弈的棋局效果好于使用“专家训练网络”。

(6)计算上,多线程搜索使用CPU处理,策略和价值并行计算使用GPU处理。单机版的AlphaGo使用了40个线程、48个CPU和8个GPU。分布式版的AlphaGo使用了40个线程、1202个CPU和176个GPU。

(7)分布式版本对单机版的胜率为77%。

20分钟课程:腾讯视频 (qq.com)

人工智能—深度学习公开课(七月在线出品)_哔哩哔哩_bilibili

强化学习:用强化学习去自我提升策略网络(但是没直接用提升后的策略网络),只是为了生成棋局训练数据,供价值网络去训练;(期间引入了”随机“落子,给棋局加入了更多变化,走出模型限制的小圈子)

价值网络+浅层快速走棋模型:效果好,所以蒙特卡洛树搜索深度可以减少;从出发棋局到当前棋局的所有节点,都要用当前节点得到的新Q值,来更新每个节点上的平均Q值;

蒙特卡洛树宽度:取决于V+P/N的效果;V是平均Q值,P是策略网络(人工棋局训练得来的那个),N是尝试次数(适度鼓励”探索“抑制”利用“)

实战中的最终落子:蒙特卡罗树里,那个子节点的N大(即尝试次数最多),就走哪个;

AlaphaGo Zero : 论文中文翻译;一个神经网络通吃策略估计和价值估计;不需要人类专家对弈棋局做训练;只用黑白棋子做特征;

search probabilities \pi是该步下完之后得到的,和每个action走过的次数N和模拟退火温度\tau有关;整盘棋下完之后,该盘各个步骤上的\pi和神经网络得到的p要尽量相似(p和网络参数有关), 各个步骤上都要让胜负结果z和神经网络得到的价值v要尽量相似(v和网络参数有关);下每一步棋时,是在搜索完毕后,按照\pi进行采样得到的action;  每次搜索在展开叶子节点时,对叶子节点的价值估计只用神经网络,不再进行快速走棋模拟(走到终盘);

该步棋的搜索过程中,对每个节点选哪个子节点,是用Q(s,a)+U(s,a)决定的(那个a的这个值最大,就选哪个a),Q时模拟得到的平均价值,U是根据神经网络得到的先验概率P和尝试次数N决定的;尝试次数越多,Q的比重越大U的比重越小;

自我对弈时(搜索时),根据\pi进行采样决定action; 真正比赛时,选取\pi向量的最大值(也就是最大的N)决定action;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值