# 强化学习算法 **Repository Path**: wdd121/RL_CODE ## Basic Information - **Project Name**: 强化学习算法 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-08-06 - **Last Updated**: 2021-09-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: 强化学习算法 ## README # 强化学习算法 #### 介绍 仓库记录本人在强化学习上的一些经验以及算法的实现.后期会随着学习的深入以及项目进展进行同步更新.希望对初学者有所帮助 #### 使用说明 1. ubuntu16.04 2. python3 3. tensorflow2 && pytorch #### 算法介绍 ### 1. Q_Learning **_Q-Learning算法框架 _** ![Q-Learning算法框架 ](https://images.gitee.com/uploads/images/2021/0808/112837_dba5be75_8835802.png "2021-08-08 11-23-12屏幕截图.png") **_Q-Learning网络构架_** ![Q-Learning网络构架](https://images.gitee.com/uploads/images/2021/0808/113046_75f6ad3c_8835802.png "2021-08-08 11-30-33屏幕截图.png") ### 2. Sarsar   SARSA算法,属于在线控制这一类,即一直使用一个策略来更新价值函数和选择新的动作,而这个策略是𝜖−贪婪法.作为SARSA算法的名字本身来说,它实际上是由S,A,R,S,A几个字母组成的。而S,A,R分别代表状态(State),动作(Action),奖励(Reward),这也是我们前面一直在使用的符号。这个流程体现在下图: ![Sarsar](https://images.gitee.com/uploads/images/2021/0919/145158_d014b600_8835802.png "屏幕截图.png") 在迭代的时候,我们首先基于𝜖−贪婪法在当前状态𝑆选择一个动作𝐴,这样系统会转到一个新的状态𝑆′, 同时给我们一个即时奖励𝑅, 在新的状态𝑆′,我们会基于𝜖−贪婪法在状态𝑆‘′选择一个动作𝐴′,但是注意这时候我们并不执行这个动作𝐴′,只是用来更新的我们的价值函数,价值函数的更新公式是 𝑄(𝑆,𝐴)=𝑄(𝑆,𝐴)+𝛼(𝑅+𝛾𝑄(𝑆′,𝐴′)−𝑄(𝑆,𝐴)) 算法流程: 算法输入:迭代次数T,状态集S,动作集A, 步长𝛼,衰减因子𝛾, 探索率𝜖. 输出:所有的状态和动作对应的价值Q. 1.随机初始化所有的状态和动作对应的价值Q,对于终止状态其Q值初始化为0. 2. for i in range(T): a) 初始化S为当前状态序列的第一个状态.设置A为𝜖贪婪算法在当前状态S选择的动作. b) 在状态S执行当前动作A,得到更新状态𝑆′和奖励𝑅 c) 用贪婪算法在状态𝑆′选择新的动作𝐴′ d) 更新价值函数Q(S,A) 𝑄(𝑆,𝐴)=𝑄(𝑆,𝐴)+𝛼(𝑅+𝛾𝑄(𝑆′,𝐴′)−𝑄(𝑆,𝐴)) e) S=𝑆′,𝐴=𝐴′ f) 如果𝑆′是终止状态,当前轮迭代完毕,否则转到步骤b ### 3. DQN Deep Q-Learning算法的基本思路来源于Q-Learning。但是和Q-Learning不同的地方在于,它的Q值的计算不是直接通过状态值s和动作来计算,而是通过上面讲到的Q网络来计算的。这个Q网络是一个神经网络,我们一般简称Deep Q-Learning为DQN。 DQN的输入是我们的状态s对应的状态向量𝜙(𝑠), 输出是所有动作在该状态下的动作价值函数Q。Q网络可以是DNN,CNN或者RNN,没有具体的网络结构要求。 DQN主要使用的技巧是经验回放(experience replay),即将每次和环境交互得到的奖励与状态更新情况都保存起来,用于后面目标Q值的更新。为什么需要经验回放呢?我们回忆一下Q-Learning,它是有一张Q表来保存所有的Q值的当前结果的,但是DQN是没有的,那么在做动作价值函数更新的时候,就需要其他的方法,这个方法就是经验回放。 通过经验回放得到的目标Q值和通过Q网络计算的Q值肯定是有误差的,那么我们可以通过梯度的反向传播来更新神经网络的参数𝑤,当𝑤收敛后,我们的就得到的近似的Q值计算方法,进而贪婪策略也就求出来了。 ![输入图片说明](https://images.gitee.com/uploads/images/2021/0919/151657_407768d6_8835802.png "屏幕截图.png") ### 4. Policy_Gradient ### 5. Actor_Critic 1. 离散动作空间 2. 连续动作空间 ![连续动作空间AC算法的Actor网络](https://images.gitee.com/uploads/images/2021/0813/191505_a13496b9_8835802.png "continue.png") ### 6.DDPG(Deep Deternimistic Policy Gradient) **Tricks** 1. soft-replacement w′←τw+(1−τ)w′ θ′←τθ+(1−τ)θ' 在把 eval 网络的参数赋值给 target 网络时,不再是 hard replacement,而是软替换 soft replacement,这样可以避免不收敛的问题。hard replacement 就是每隔一定的步数就将 eval 网络中的参数赋值给 target 网络,而 soft replacement 就是每一步都对 target 网络的参数更新一部分。上式中τ为更新系数,一般取的比较小,比如0.1,0.001这样的值. 2. 为action增加噪声 这样可以增加网络的鲁棒性,为了学习过程可以增加一些随机性,增加学习的覆盖,DDPG对选出来的动作A会增加一定的噪声N,即最终和环境交互的动作A的表达式是: A=πθ​(S)+N **算法流程** DDPG的更新公式为: ![更新公式](https://images.gitee.com/uploads/images/2021/0813/213610_1000ebcd_8835802.png "屏幕截图.png") 输入:Actor当前网络,Actor目标网络,Critic当前网络,Critic目标网络,参数分别为θ, θ′, w , w′,衰减因子 γ , 软更新系数 τ ,批量梯度下降的样本数 m,目标Q网络参数更新频率 C。最大迭代次数 T。随机噪音函数 N . ![算法流程](https://images.gitee.com/uploads/images/2021/0813/213900_be44498a_8835802.png "屏幕截图.png") 上述流程中对Actor网络的损失函数进行了化简,原文中的损失梯度为: ![损失梯度](https://images.gitee.com/uploads/images/2021/0813/214525_2b71d633_8835802.png "屏幕截图.png")