7个流行的强化学习算法及其代码实现
目前流行的强化学习算法包括Qlearning、SARSA、DDPG、A2C、PPO、DQN和TRPO。这些算法已被用于在游戏、机器人和决策制定等各种应用中,并且这些流行的算法还在不断发展和改进,本文我们将对其做一个简单的介绍。
1、Qlearning
Qlearning:Qlearning是一种无模型、非策略的强化学习算法。它使用Bellman方程估计最佳动作值函数,该方程迭代地更新给定状态动作对的估计值。Qlearning以其简单性和处理大型连续状态空间的能力而闻名。
下面是一个使用Python实现Qlearning的简单示例:importnumpyasnpDefinetheQtableandthelearningrateQnp。zeros((statespacesize,actionspacesize))alpha0。1Definetheexplorationrateanddiscountfactorepsilon0。1gamma0。99forepisodeinrange(numepisodes):currentstateinitialstatewhilenotdone:Chooseanactionusinganepsilongreedypolicyifnp。random。uniform(0,1)epsilon:actionnp。random。randint(0,actionspacesize)else:actionnp。argmax(Q〔currentstate〕)Taketheactionandobservethenextstateandrewardnextstate,reward,donetakeaction(currentstate,action)UpdatetheQtableusingtheBellmanequationQ〔currentstate,action〕Q〔currentstate,action〕alpha(rewardgammanp。max(Q〔nextstate〕)Q〔currentstate,action〕)currentstatenextstate
上面的示例中,statespacesize和actionspacesize分别是环境中的状态数和动作数。numepisodes是要为运行算法的轮次数。initialstate是环境的起始状态。takeaction(currentstate,action)是一个函数,它将当前状态和一个动作作为输入,并返回下一个状态、奖励和一个指示轮次是否完成的布尔值。
在while循环中,使用epsilongreedy策略根据当前状态选择一个动作。使用概率epsilon选择一个随机动作,使用概率1epsilon选择对当前状态具有最高Q值的动作。
采取行动后,观察下一个状态和奖励,使用Bellman方程更新q。并将当前状态更新为下一个状态。这只是Qlearning的一个简单示例,并未考虑Qtable的初始化和要解决的问题的具体细节。2、SARSA
SARSA:SARSA是一种无模型、基于策略的强化学习算法。它也使用Bellman方程来估计动作价值函数,但它是基于下一个动作的期望值,而不是像Qlearning中的最优动作。SARSA以其处理随机动力学问题的能力而闻名。importnumpyasnpDefinetheQtableandthelearningrateQnp。zeros((statespacesize,actionspacesize))alpha0。1Definetheexplorationrateanddiscountfactorepsilon0。1gamma0。99forepisodeinrange(numepisodes):currentstateinitialstateactionepsilongreedypolicy(epsilon,Q,currentstate)whilenotdone:Taketheactionandobservethenextstateandrewardnextstate,reward,donetakeaction(currentstate,action)Choosenextactionusingepsilongreedypolicynextactionepsilongreedypolicy(epsilon,Q,nextstate)UpdatetheQtableusingtheBellmanequationQ〔currentstate,action〕Q〔currentstate,action〕alpha(rewardgammaQ〔nextstate,nextaction〕Q〔currentstate,action〕)currentstatenextstateactionnextaction
statespacesize和actionspacesize分别是环境中的状态和操作的数量。numepisodes是您想要运行SARSA算法的轮次数。Initialstate是环境的初始状态。takeaction(currentstate,action)是一个将当前状态和作为操作输入的函数,并返回下一个状态、奖励和一个指示情节是否完成的布尔值。
在while循环中,使用在单独的函数epsilongreedypolicy(epsilon,Q,currentstate)中定义的epsilongreedy策略来根据当前状态选择操作。使用概率epsilon选择一个随机动作,使用概率1epsilon对当前状态具有最高Q值的动作。
上面与Qlearning相同,但是采取了一个行动后,在观察下一个状态和奖励时它然后使用贪心策略选择下一个行动。并使用Bellman方程更新q表。3、DDPG
DDPG是一种用于连续动作空间的无模型、非策略算法。它是一种actorcritic算法,其中actor网络用于选择动作,而critic网络用于评估动作。DDPG对于机器人控制和其他连续控制任务特别有用。importnumpyasnpfromkeras。modelsimportModel,Sequentialfromkeras。layersimportDense,Inputfromkeras。optimizersimportAdamDefinetheactorandcriticmodelsactorSequential()actor。add(Dense(32,inputdimstatespacesize,activationrelu))actor。add(Dense(32,activationrelu))actor。add(Dense(actionspacesize,activationtanh))actor。compile(lossmse,optimizerAdam(lr0。001))criticSequential()critic。add(Dense(32,inputdimstatespacesize,activationrelu))critic。add(Dense(32,activationrelu))critic。add(Dense(1,activationlinear))critic。compile(lossmse,optimizerAdam(lr0。001))Definethereplaybufferreplaybuffer〔〕DefinetheexplorationnoiseexplorationnoiseOrnsteinUhlenbeckProcess(sizeactionspacesize,theta0。15,mu0,sigma0。2)forepisodeinrange(numepisodes):currentstateinitialstatewhilenotdone:Selectanactionusingtheactormodelandaddexplorationnoiseactionactor。predict(currentstate)〔0〕explorationnoise。sample()actionnp。clip(action,1,1)Taketheactionandobservethenextstateandrewardnextstate,reward,donetakeaction(currentstate,action)Addtheexperiencetothereplaybufferreplaybuffer。append((currentstate,action,reward,nextstate,done))Sampleabatchofexperiencesfromthereplaybufferbatchsample(replaybuffer,batchsize)Updatethecriticmodelstatesnp。array(〔x〔0〕forxinbatch〕)actionsnp。array(〔x〔1〕forxinbatch〕)rewardsnp。array(〔x〔2〕forxinbatch〕)nextstatesnp。array(〔x〔3〕forxinbatch〕)targetqvaluesrewardsgammacritic。predict(nextstates)critic。trainonbatch(states,targetqvalues)Updatetheactormodelactiongradientsnp。array(critic。getgradients(states,actions))actor。trainonbatch(states,actiongradients)currentstatenextstate
在本例中,statespacesize和actionspacesize分别是环境中的状态和操作的数量。numepisodes是轮次数。Initialstate是环境的初始状态。Takeaction(currentstate,action)是一个函数,它接受当前状态和操作作为输入,并返回下一个操作。4、A2C
A2C(AdvantageActorCritic)是一种有策略的actorcritic算法,它使用Advantage函数来更新策略。该算法实现简单,可以处理离散和连续的动作空间。importnumpyasnpfromkeras。modelsimportModel,Sequentialfromkeras。layersimportDense,Inputfromkeras。optimizersimportAdamfromkeras。utilsimporttocategoricalDefinetheactorandcriticmodelsstateinputInput(shape(statespacesize,))actorDense(32,activationrelu)(stateinput)actorDense(32,activationrelu)(actor)actorDense(actionspacesize,activationsoftmax)(actor)actormodelModel(inputsstateinput,outputsactor)actormodel。compile(losscategoricalcrossentropy,optimizerAdam(lr0。001))stateinputInput(shape(statespacesize,))criticDense(32,activationrelu)(stateinput)criticDense(32,activationrelu)(critic)criticDense(1,activationlinear)(critic)criticmodelModel(inputsstateinput,outputscritic)criticmodel。compile(lossmse,optimizerAdam(lr0。001))forepisodeinrange(numepisodes):currentstateinitialstatedoneFalsewhilenotdone:Selectanactionusingtheactormodelandaddexplorationnoiseactionprobsactormodel。predict(np。array(〔currentstate〕))〔0〕actionnp。random。choice(range(actionspacesize),pactionprobs)Taketheactionandobservethenextstateandrewardnextstate,reward,donetakeaction(currentstate,action)Calculatetheadvantagetargetvaluecriticmodel。predict(np。array(〔nextstate〕))〔0〕〔0〕advantagerewardgammatargetvaluecriticmodel。predict(np。array(〔currentstate〕))〔0〕〔0〕Updatetheactormodelactiononehottocategorical(action,actionspacesize)actormodel。trainonbatch(np。array(〔currentstate〕),advantageactiononehot)Updatethecriticmodelcriticmodel。trainonbatch(np。array(〔currentstate〕),rewardgammatargetvalue)currentstatenextstate
在这个例子中,actor模型是一个神经网络,它有2个隐藏层,每个隐藏层有32个神经元,具有relu激活函数,输出层具有softmax激活函数。critic模型也是一个神经网络,它有2个隐含层,每层32个神经元,具有relu激活函数,输出层具有线性激活函数。
使用分类交叉熵损失函数训练actor模型,使用均方误差损失函数训练critic模型。动作是根据actor模型预测选择的,并添加了用于探索的噪声。5、PPO
PPO(ProximalPolicyOptimization)是一种策略算法,它使用信任域优化的方法来更新策略。它在具有高维观察和连续动作空间的环境中特别有用。PPO以其稳定性和高样品效率而著称。importnumpyasnpfromkeras。modelsimportModel,Sequentialfromkeras。layersimportDense,Inputfromkeras。optimizersimportAdamDefinethepolicymodelstateinputInput(shape(statespacesize,))policyDense(32,activationrelu)(stateinput)policyDense(32,activationrelu)(policy)policyDense(actionspacesize,activationsoftmax)(policy)policymodelModel(inputsstateinput,outputspolicy)DefinethevaluemodelvaluemodelModel(inputsstateinput,outputsDense(1,activationlinear)(policy))DefinetheoptimizeroptimizerAdam(lr0。001)forepisodeinrange(numepisodes):currentstateinitialstatewhilenotdone:Selectanactionusingthepolicymodelactionprobspolicymodel。predict(np。array(〔currentstate〕))〔0〕actionnp。random。choice(range(actionspacesize),pactionprobs)Taketheactionandobservethenextstateandrewardnextstate,reward,donetakeaction(currentstate,action)Calculatetheadvantagetargetvaluevaluemodel。predict(np。array(〔nextstate〕))〔0〕〔0〕advantagerewardgammatargetvaluevaluemodel。predict(np。array(〔currentstate〕))〔0〕〔0〕Calculatetheoldandnewpolicyprobabilitiesoldpolicyprobactionprobs〔action〕newpolicyprobpolicymodel。predict(np。array(〔nextstate〕))〔0〕〔action〕Calculatetheratioandthesurrogatelossrationewpolicyproboldpolicyprobsurrogatelossnp。minimum(ratioadvantage,np。clip(ratio,1epsilon,1epsilon)advantage)Updatethepolicyandvaluemodelspolicymodel。trainableweightsvaluemodel。trainableweightspolicymodel。compile(optimizeroptimizer,losssurrogateloss)policymodel。trainonbatch(np。array(〔currentstate〕),np。array(〔actiononehot〕))valuemodel。trainonbatch(np。array(〔currentstate〕),rewardgammatargetvalue)currentstatenextstate6、DQN
DQN(深度Q网络)是一种无模型、非策略算法,它使用神经网络来逼近Q函数。DQN特别适用于Atari游戏和其他类似问题,其中状态空间是高维的,并使用神经网络近似Q函数。importnumpyasnpfromkeras。modelsimportSequentialfromkeras。layersimportDense,Inputfromkeras。optimizersimportAdamfromcollectionsimportdequeDefinetheQnetworkmodelmodelSequential()model。add(Dense(32,inputdimstatespacesize,activationrelu))model。add(Dense(32,activationrelu))model。add(Dense(actionspacesize,activationlinear))model。compile(lossmse,optimizerAdam(lr0。001))Definethereplaybufferreplaybufferdeque(maxlenreplaybuffersize)forepisodeinrange(numepisodes):currentstateinitialstatewhilenotdone:Selectanactionusinganepsilongreedypolicyifnp。random。rand()epsilon:actionnp。random。randint(0,actionspacesize)else:actionnp。argmax(model。predict(np。array(〔currentstate〕))〔0〕)Taketheactionandobservethenextstateandrewardnextstate,reward,donetakeaction(currentstate,action)Addtheexperiencetothereplaybufferreplaybuffer。append((currentstate,action,reward,nextstate,done))Sampleabatchofexperiencesfromthereplaybufferbatchrandom。sample(replaybuffer,batchsize)PreparetheinputsandtargetsfortheQnetworkinputsnp。array(〔x〔0〕forxinbatch〕)targetsmodel。predict(inputs)fori,(state,action,reward,nextstate,done)inenumerate(batch):ifdone:targets〔i,action〕rewardelse:targets〔i,action〕rewardgammanp。max(model。predict(np。array(〔nextstate〕))〔0〕)UpdatetheQnetworkmodel。trainonbatch(inputs,targets)currentstatenextstate
上面的代码,Qnetwork有2个隐藏层,每个隐藏层有32个神经元,使用relu激活函数。该网络使用均方误差损失函数和Adam优化器进行训练。7、TRPO
TRPO(TrustRegionPolicyOptimization)是一种无模型的策略算法,它使用信任域优化方法来更新策略。它在具有高维观察和连续动作空间的环境中特别有用。
TRPO是一个复杂的算法,需要多个步骤和组件来实现。TRPO不是用几行代码就能实现的简单算法。
所以我们这里使用实现了TRPO的现有库,例如OpenAIBaselines,它提供了包括TRPO在内的各种预先实现的强化学习算法,。
要在OpenAIBaselines中使用TRPO,我们需要安装:pipinstallbaselines
然后可以使用baselines库中的trpompi模块在你的环境中训练TRPO代理,这里有一个简单的例子:importgymfrombaselines。common。vecenv。dummyvecenvimportDummyVecEnvfrombaselines。trpompiimporttrpompiInitializetheenvironmentenvgym。make(CartPolev1)envDummyVecEnv(〔lambda:env〕)DefinethepolicynetworkpolicyfnmlppolicyTraintheTRPOmodelmodeltrpompi。learn(env,policyfn,maxiters1000)
我们使用Gym库初始化环境。然后定义策略网络,并调用TRPO模块中的learn()函数来训练模型。
还有许多其他库也提供了TRPO的实现,例如TensorFlow、PyTorch和RLLib。下面时一个使用TF2。0实现的样例importtensorflowastfimportgymDefinethepolicynetworkclassPolicyNetwork(tf。keras。Model):definit(self):super(PolicyNetwork,self)。init()self。dense1tf。keras。layers。Dense(16,activationrelu)self。dense2tf。keras。layers。Dense(16,activationrelu)self。dense3tf。keras。layers。Dense(1,activationsigmoid)defcall(self,inputs):xself。dense1(inputs)xself。dense2(x)xself。dense3(x)returnxInitializetheenvironmentenvgym。make(CartPolev1)InitializethepolicynetworkpolicynetworkPolicyNetwork()Definetheoptimizeroptimizertf。optimizers。Adam()Definethelossfunctionlossfntf。losses。BinaryCrossentropy()Setthemaximumnumberofiterationsmaxiters1000Startthetrainingloopforiinrange(maxiters):Sampleanactionfromthepolicynetworkactiontf。squeeze(tf。random。categorical(policynetwork(observation),1))Takeastepintheenvironmentobservation,reward,done,env。step(action)withtf。GradientTape()astape:Computethelosslosslossfn(reward,policynetwork(observation))Computethegradientsgradstape。gradient(loss,policynetwork。trainablevariables)Performtheupdatestepoptimizer。applygradients(zip(grads,policynetwork。trainablevariables))ifdone:Resettheenvironmentobservationenv。reset()
在这个例子中,我们首先使用TensorFlow的KerasAPI定义一个策略网络。然后使用Gym库和策略网络初始化环境。然后定义用于训练策略网络的优化器和损失函数。
在训练循环中,从策略网络中采样一个动作,在环境中前进一步,然后使用TensorFlow的GradientTape计算损失和梯度。然后我们使用优化器执行更新步骤。
这是一个简单的例子,只展示了如何在TensorFlow2。0中实现TRPO。TRPO是一个非常复杂的算法,这个例子没有涵盖所有的细节,但它是试验TRPO的一个很好的起点。总结
以上就是我们总结的7个常用的强化学习算法,这些算法并不相互排斥,通常与其他技术(如值函数逼近、基于模型的方法和集成方法)结合使用,可以获得更好的结果。
作者:SiddharthaPramanik