Value-Based Reinforcement Learning-DQN

强化学习

这一章会讲DQN算法,并且用TD算法来训练DQN。

前言

说明一下:这是我的一个学习笔记,课程链接如下:

最易懂的强化学习课程
公众号:AI那些事
在这里插入图片描述


一、Action-Value Functions

我们回顾一下Action-Value Functions:
在这里插入图片描述
  这些R都是环境给的Reward奖励,每当agent做出一个动作,环境就会更新一个状态,并且给一个奖励R,每一个奖励R都依赖前一个状态和动作,所以Return依赖t时刻开始所有的动作和所有的状态,未来的状态A和S都是随机变量,动作A的随机性来自policy函数π,动作是agent根据函数π随机抽样得到的,状态S的随机性来自于状态转移函数p,新的状态是根据函数p随机抽样得到的,未来所有的动作和状态都是随机的,Ut依赖于这些动作和状态,因此Ut也是随机的,Ut的值可以反映出来未来奖励的总和,所以我们想了解Ut的大小,由于Ut是一个随机变量,在t时刻我们并不知道Ut的值,我们可以对Ut求期望,这样就可以排除掉Ut中的随机性,这个期望是关于未来所有的动作A和状态S求的,期望消除了S和A的随机变量,只留下了At和St两个变量,通过求期望我们得到了Qπ函数,它被称为Action-Value function 动作价值函数,Qπ和策略函数π有关,和St和At也有关,未来的随机性都被期望所消除了,Qπ只依赖当前的动作At和状态St,Qπ可以反映出当前状态St下做动作At的好坏程度,我们想要进行一般消除策略函数π,我们可以根据Qπ对π求最大化得到最优动作价值函数Q*(最优动作价值函数)

  Q* 告诉我们不管用什么样的策略π要使agent在当前状态st下做动作at,那么回报Ut的期望顶多就是Q*(st,at),不会更好,Q* 函数与policy函数π无关,只要agent做的动作a那么Q*(st,at)就是最好的结果了,哪怕之后你把策略函数π改进的更好,你获得的回报也不会比Q*(st,at)更好。

  说的更简单一点Q* 函数告诉我们,基于当前状态st做出动作at的好坏程度,所以Q* 函数可以指导agent做决策,agent观测到当前的状态st,Q* 函数可以给当前状态进行打分,比如向上跳是3000分,向左是2000分,向右是1000分,agent可以根据分数来做决策,既然向上跳的分数最高是3000分agent就应该向上跳,这样期望回报才会最大化。

二、DQN

在这里插入图片描述

2.1 游戏中agent的目标是什么?

  主要目标是打赢游戏,既然目标定下来了,那么agent就要努力的实现目标,假设Q* 函数是知道的,那么agent该怎么做决策呢?

2.2 agent如何做决策?

  决策就是选出最优动作,那什么才是最优动作呢,我们刚才说Q* 函数可以给所有的动作打分,每个动作a都有一个分数,最好的动作a就是分数最高的那个动作,我做一个更加通俗的解释:Q* 函数就像一个先知一样,它能预见未来的结果,比如你问先知,现在有a,b,c三支股票,我该把我的钱用来买哪一支股票呢?未来是充满随机性的,什么都可能发生,如蝴蝶效应,所以先知没有办法给你一个确定的答案,只能告诉你平均值,先知告诉你,从平均值来看,A股票涨了10倍,B股票涨了2倍,C股票跌了一半,先知还告诉你实际发生的情况和平均值并不一样,那么你该买哪一支股票呢?我们很定会选择A股票,因为它能涨10倍。

2.3 如何理解Q* 函数呢?

  我们可以把Q* 当做一个先知,它能够告诉你每一个动作带来的平均回报,你该听先知的话,选平均回报最高的那个动作,我们希望有Q* 这样一个先知,agent可以靠Q* 的指点来做决策,这样agent就像开了挂一样。但实际上我们没有Q* 函数,价值学习的基本想法就是学习一个函数来近似Q* ,我们不可能近似出一个万能的先知,但是对于超级玛丽这种游戏学习出来一个先知并不难,要是我玩了10w次超级玛丽,我就跟先知一样了,看一眼屏幕就告诉你这一步是什么操作才是最好的。

2.5 DQN打游戏?

  DQN是一种价值学习的方法,用一个神经网络去近似Q* 函数,我们将这个神经网络记为Q(s,a;w),神经网络的参数是w,输入是状态s,输出是很多数值,这些数值是对所有很能的动作的打分,每一个动作对应一个分数,我们通过奖励来学习神经网络。这个神经网络给动作的打分就会逐渐改进。打分会越来越准,如果让神经网络玩几百万次超级玛丽,这个神经网络就跟先知一样了。
在这里插入图片描述
  DQN就是一个这样的神经网络,对于不同的问题DQN的结构可能会不一样,我这里举个例子,如果是玩超级玛丽,可以把屏幕上的画面进行输入,用一个卷积层将图片变为特征向量,最后用几个全连接层把特征映射到一个输出的向量,这个输出的向量就是对动作的打分,向量每一个元素对应一个动作,在超级玛丽的例子里面有左右上三个动作,所以输出的向量是三维的,agent会做得分最高的动作,所以我们只要把DQN训练好,就可以用DQN自动控制超级玛丽打游戏。
在这里插入图片描述
  用DQN控制agent打游戏,当前观测到状态st,用DQN把st作为输入,给所有的动作打分,选出分数最高的动作作为at,agent执行at这个动作后,环境会改变状态,用状态转移函数p来随机抽一个状态st+1,环境告诉我们这一步的奖励rt,奖励可以是正的可以是负的也可以是0,奖励就是强化学习中的监督信号,DQN要靠奖励进行训练,有了新的状态st+1,DQN再对所有的动作打分,agent选择分数最高的动作,作为at+1,agent执行at+1后,环境会再更新状态st+2,还会再给一个奖励rt+1,然后还是重复这一过程,让DQN给动作打分,让agent选择分数最高的动作来执行,然后环境再更新状态s再给奖励rt+2,不断重复这一过程直到游戏结束。
在这里插入图片描述

三、如何训练DQN?

  我们这里采用TD算法

3.1 TD算法

在这里插入图片描述
  TD算法不是那么容易理解,所以我用一个例子来阐述:

  假设:我要从纽约开车到亚特兰大,我有一个模型Q,参数是W,他可以预测出开车出行的时间开销,我现在要从纽约出发了,这是Q告诉我,要开车1000min,才能到亚特兰大,这个模型一开始不是很准确,或者是纯随机的,但是随着用这个模型的人越来越多,得到越来越来数据跟多训练,这个模型就会越来越准,会像谷歌地图一样准确。

  问题是这样的,我需要什么数据呢,得到这些数据我该怎么更新模型参数呢?

  最简单的办法是,首先,出发之前,让模型做一个预测记作q,模型告诉我,从纽约到亚特兰大要花1000min,所以q=1000,预测过后我就出发了,但当我到亚特兰大的时候我只用了860min,这里的q是模型的预测,而y是我真实的开销,于是我把y作为target,q和y不一样,q比y大了140min,这就说明我的模型预测有了偏差,比我实际的y要多,这就造成了loss损失。损失定义为q和y的平方差。记作l,我们对损失l关于模型参数W求导,然后把倒数关于链式法则展开l是q的函数,q是W的函数,所以这之间可以用链式法则求导,结果就是(q-y) * q函数对W的倒数。梯度求出来了,我们就能根据梯度下降来更新模型参数W,新的参数Wt+1为:
在这里插入图片描述
  假如我们用Wt+1代替Wt那么预测值将会更加接近真实值y=860,这是因为梯度下降减小了loss让预测值离真实值更近了,这种算法我必须完成整个旅途才能对模型进行一次更新。
在这里插入图片描述
  我问个问题,假如我走到半路我就不走了,那我还有办法对模型进行更新吗?

  我从纽约开车去亚特兰大会经过华盛顿DC,假如我到DC的时候,车子出故障了,我就去不了亚特兰大了,那我有没有可能使用这一段旅途去改进模型呢?

  其实是可以的,我从出发的时刻做了预测,模型说从纽约开车到亚特兰大要花1000分钟,这个1000就是模型的估计,当我开车到DC的时候我一看花了300分钟(真实观测),然后模型又预测我还需要花600min才能到达亚特兰大。

  回顾一下,一开始模型告诉我,从纽约到亚特兰大需要花1000min。而现在我到DC花了300min,模型又告诉我,我还需要花600min才能到达亚特兰大,根据模型新的预测我知道我到达亚特兰大的总时间900min,比原来快了100min,在TD算法里面我们将这个新的估计900min叫做TD target

  TD target虽然也是一个虽然也是个估计,但未必是实际情况,但是它要比最初的1000min要更可靠,最初的估计纯粹是一个估计,无事实成分,虽然TD target也是一个估计但是它有事实成分,当我越接近亚特兰大,TD target就越接近真实值。

  用TD target的话我不需要跑完整个路程去知道真实的时间开销,我到了DC我得到TD target=900,我就可以更新模型参数了,我假如y=900就是真实观测,我把y作为target,损失函数就是:最开始预测的模型参数 1000和TD target差的平方,这里Q(W)和y的差我们称为TD error。
在这里插入图片描述
  整个模型更新如下:
在这里插入图片描述
在这里插入图片描述
  刚才我们学了TD算法,有了TD算法即使不完成旅途也能更新模型参数,把TD算法用来学习DQN是相同的道理,我不需要打完游戏就能更新游戏的参数。

3.2 TD算法训练DQN

在这里插入图片描述
  怎样才能使用TD算法来学习DQN呢?

  刚才的例子里面要用到这样一个公式:
在这里插入图片描述
&ems p; 公式的意思是纽约到亚特兰大的时间(估计)约等于纽约到DC(真实时间)+ DC到亚特兰大的时间(估计),有上述公式才能实现TD算法:
在深度强化学习中也有这样一个公式:
在这里插入图片描述
  等式左边是T时刻的估计,这是未来总和的期望相当于纽约到亚特兰大的总时间,等式右边有一项rt是真实的奖励,第二项是DQN在t+1时刻做的估计,相当于DC到亚特兰大的估计时间,接下来,我总结一下为什么强化学习有这个公式:
  回顾一下折扣回报:
在这里插入图片描述
  这里的R是奖励。γ是一个介于0-1之间的折扣率,我们对这个公式进行处理,将有γ的项提取一个γ得到:
在这里插入图片描述
  括号里的内容是什么呢?我们再用一下折扣回报U的定义,不难发现括号里面就是Ut+1因此我们得到一个等式:
在这里插入图片描述
  这个等式反应了相邻两个折扣之间的关系。

  现在我们要把TD算法用到DQN上,在t时刻DQN输出的值Q(st,at;w)是对Ut做出的估计,这就像我从纽约出发前,模型做的预测,告诉我,纽约到亚特兰大的总时间。

  在下一时刻DQN输出的值Q(st+1,at+1;w)是对Ut+1做出的估计,这就我开车到DC,模型预测DC到亚特兰大的时间。

  我们知道Ut=Rt+γ * Ut+1,所以Ut的期望约等于Rt加上Ut+1的期望,所以我们能够得到这样一个关系,DQN在t时刻做出的预测:
在这里插入图片描述
在这里插入图片描述

四、训练步骤

  有了prediction和TD target我们就能更新DQN的模型参数了:
在t时刻,模型做出了预测Q(st,at;w),这里的st是当前的状态,at是已经做出的动作,wt是当时的模型参数。
在这里插入图片描述
  到了t+1时刻,我们观测到真实的奖励rt,还观测到新的状态st+1,有了st+1,我们就能用DQN算出下一个动作at+1了,在t+1时刻我们知道了rt,st+1,at+1的值,这时候我们就能计算TD target记作yt,t+1时刻的动作at+1是怎么算出来的呢,DQN对每一个动作打分,分数最高的那个动作就被选出来作为at+1,所以呢。Q(st+1,at+1;wt)就是对Q函数关于a求最大化。
在这里插入图片描述
  我们将两者差的平方l做为loss:
在这里插入图片描述

  然后算lt关于模型参数w的导数,作梯度下降来更新模型参数,做梯度下降是为了使loss减小
在这里插入图片描述
  总的来说所有步骤就是这样的:
在这里插入图片描述

六、总结

期待大家和我交流,留言或者私信,一起学习,一起进步!麻烦大家可用关注公众号:AI那些事,感谢!!!
在这里插入图片描述

おすすめ

転載: blog.csdn.net/CltCj/article/details/119618632