目前流行的强化学习算法包括 Q-learning、SARSA、DDPG、A2C、PPO、DQN 和 TRPO。 这些算法已被用于在游戏、机器人和决策制定等各种应用中,并且这些流行的算法还在不断发展和改进,本文我们将对其做一个简单的介绍。

1、Q-learning

Q-learning:Q-learning 是一种无模型、非策略的强化学习算法。 它使用 Bellman 方程估计最佳动作值函数,该方程迭代地更新给定状态动作对的估计值。 Q-learning 以其简单性和处理大型连续状态空间的能力而闻名。

下面是一个使用 Python 实现 Q-learning 的简单示例:

 importnumpyasnp# Define the Q-table and the learning rateQ=np.zeros((state_space_size, action_space_size))alpha=0.1# Define the exploration rate and discount factorepsilon=0.1gamma=0.99forepisodeinrange(num_episodes):current_state=initial_statewhilenotdone:# Choose an action using an epsilon-greedy policyifnp.random.uniform(0, 1) <epsilon:action=np.random.randint(0, action_space_size)else:action=np.argmax(Q[current_state])# Take the action and observe the next state and rewardnext_state, reward, done=take_action(current_state, action)# Update the Q-table using the Bellman equationQ[current_state, action] =Q[current_state, action] +alpha* (reward+gamma*np.max(Q[next_state]) -Q[current_state, action])current_state=next_state

上面的示例中,state_space_size 和 action_space_size 分别是环境中的状态数和动作数。 num_episodes 是要为运行算法的轮次数。 initial_state 是环境的起始状态。 take_action(current_state, action) 是一个函数,它将当前状态和一个动作作为输入,并返回下一个状态、奖励和一个指示轮次是否完成的布尔值。

在 while 循环中,使用 epsilon-greedy 策略根据当前状态选择一个动作。 使用概率 epsilon选择一个随机动作,使用概率 1-epsilon选择对当前状态具有最高 Q 值的动作。

采取行动后,观察下一个状态和奖励,使用Bellman方程更新q。 并将当前状态更新为下一个状态。这只是 Q-learning 的一个简单示例,并未考虑 Q-table 的初始化和要解决的问题的具体细节。

2、SARSA

SARSA:SARSA 是一种无模型、基于策略的强化学习算法。 它也使用Bellman方程来估计动作价值函数,但它是基于下一个动作的期望值,而不是像 Q-learning 中的最优动作。 SARSA 以其处理随机动力学问题的能力而闻名。

 importnumpyasnp# Define the Q-table and the learning rateQ=np.zeros((state_space_size, action_space_size))alpha=0.1# Define the exploration rate and discount factorepsilon=0.1gamma=0.99forepisodeinrange(num_episodes):current_state=initial_stateaction=epsilon_greedy_policy(epsilon, Q, current_state)whilenotdone:# Take the action and observe the next state and rewardnext_state, reward, done=take_action(current_state, action)# Choose next action using epsilon-greedy policynext_action=epsilon_greedy_policy(epsilon, Q, next_state)# Update the Q-table using the Bellman equationQ[current_state, action] =Q[current_state, action] +alpha* (reward+gamma*Q[next_state, next_action] -Q[current_state, action])current_state=next_stateaction=next_action

state_space_size和action_space_size分别是环境中的状态和操作的数量。num_episodes是您想要运行SARSA算法的轮次数。Initial_state是环境的初始状态。take_action(current_state, action)是一个将当前状态和作为操作输入的函数,并返回下一个状态、奖励和一个指示情节是否完成的布尔值。

在while循环中,使用在单独的函数epsilon_greedy_policy(epsilon, Q, current_state)中定义的epsilon-greedy策略来根据当前状态选择操作。使用概率 epsilon选择一个随机动作,使用概率 1-epsilon对当前状态具有最高 Q 值的动作。

上面与Q-learning相同,但是采取了一个行动后,在观察下一个状态和奖励时它然后使用贪心策略选择下一个行动。并使用Bellman方程更新q表。

3、DDPG

DDPG 是一种用于连续动作空间的无模型、非策略算法。 它是一种actor-critic算法,其中actor网络用于选择动作,而critic网络用于评估动作。 DDPG 对于机器人控制和其他连续控制任务特别有用。

 importnumpyasnpfromkeras.modelsimportModel, Sequentialfromkeras.layersimportDense, Inputfromkeras.optimizersimportAdam# Define the actor and critic modelsactor=Sequential()actor.add(Dense(32, input_dim=state_space_size, activation='relu'))actor.add(Dense(32, activation='relu'))actor.add(Dense(action_space_size, activation='tanh'))actor.compile(loss='mse', optimizer=Adam(lr=0.001))critic=Sequential()critic.add(Dense(32, input_dim=state_space_size, activation='relu'))critic.add(Dense(32, activation='relu'))critic.add(Dense(1, activation='linear'))critic.compile(loss='mse', optimizer=Adam(lr=0.001))# Define the replay bufferreplay_buffer= []# Define the exploration noiseexploration_noise=OrnsteinUhlenbeckProcess(size=action_space_size, theta=0.15, mu=0, sigma=0.2)forepisodeinrange(num_episodes):current_state=initial_statewhilenotdone:# Select an action using the actor model and add exploration noiseaction=actor.predict(current_state)[0] +exploration_noise.sample()action=np.clip(action, -1, 1)# Take the action and observe the next state and rewardnext_state, reward, done=take_action(current_state, action)# Add the experience to the replay bufferreplay_buffer.append((current_state, action, reward, next_state, done))# Sample a batch of experiences from the replay bufferbatch=sample(replay_buffer, batch_size)# Update the critic modelstates=np.array([x[0] forxinbatch])actions=np.array([x[1] forxinbatch])rewards=np.array([x[2] forxinbatch])next_states=np.array([x[3] forxinbatch])target_q_values=rewards+gamma*critic.predict(next_states)critic.train_on_batch(states, target_q_values)# Update the actor modelaction_gradients=np.array(critic.get_gradients(states, actions))actor.train_on_batch(states, action_gradients)current_state=next_state

在本例中,state_space_size和action_space_size分别是环境中的状态和操作的数量。num_episodes是轮次数。Initial_state是环境的初始状态。Take_action (current_state, action)是一个函数,它接受当前状态和操作作为输入,并返回下一个操作。

4、A2C

A2C(Advantage Actor-Critic)是一种有策略的actor-critic算法,它使用Advantage函数来更新策略。 该算法实现简单,可以处理离散和连续的动作空间。

 importnumpyasnpfromkeras.modelsimportModel, Sequentialfromkeras.layersimportDense, Inputfromkeras.optimizersimportAdamfromkeras.utilsimportto_categorical# Define the actor and critic modelsstate_input=Input(shape=(state_space_size,))actor=Dense(32, activation='relu')(state_input)actor=Dense(32, activation='relu')(actor)actor=Dense(action_space_size, activation='softmax')(actor)actor_model=Model(inputs=state_input, outputs=actor)actor_model.compile(loss='categorical_crossentropy', optimizer=Adam(lr=0.001))state_input=Input(shape=(state_space_size,))critic=Dense(32, activation='relu')(state_input)critic=Dense(32, activation='relu')(critic)critic=Dense(1, activation='linear')(critic)critic_model=Model(inputs=state_input, outputs=critic)critic_model.compile(loss='mse', optimizer=Adam(lr=0.001))forepisodeinrange(num_episodes):current_state=initial_statedone=Falsewhilenotdone:# Select an action using the actor model and add exploration noiseaction_probs=actor_model.predict(np.array([current_state]))[0]action=np.random.choice(range(action_space_size), p=action_probs)# Take the action and observe the next state and rewardnext_state, reward, done=take_action(current_state, action)# Calculate the advantagetarget_value=critic_model.predict(np.array([next_state]))[0][0]advantage=reward+gamma*target_value-critic_model.predict(np.array([current_state]))[0][0]# Update the actor modelaction_one_hot=to_categorical(action, action_space_size)actor_model.train_on_batch(np.array([current_state]), advantage*action_one_hot)# Update the critic modelcritic_model.train_on_batch(np.array([current_state]), reward+gamma*target_value)current_state=next_state

在这个例子中,actor模型是一个神经网络,它有2个隐藏层,每个隐藏层有32个神经元,具有relu激活函数,输出层具有softmax激活函数。critic模型也是一个神经网络,它有2个隐含层,每层32个神经元,具有relu激活函数,输出层具有线性激活函数。

使用分类交叉熵损失函数训练actor模型,使用均方误差损失函数训练critic模型。动作是根据actor模型预测选择的,并添加了用于探索的噪声。

5、PPO

PPO(Proximal Policy Optimization)是一种策略算法,它使用信任域优化的方法来更新策略。 它在具有高维观察和连续动作空间的环境中特别有用。 PPO 以其稳定性和高样品效率而著称。

 importnumpyasnpfromkeras.modelsimportModel, Sequentialfromkeras.layersimportDense, Inputfromkeras.optimizersimportAdam# Define the policy modelstate_input=Input(shape=(state_space_size,))policy=Dense(32, activation='relu')(state_input)policy=Dense(32, activation='relu')(policy)policy=Dense(action_space_size, activation='softmax')(policy)policy_model=Model(inputs=state_input, outputs=policy)# Define the value modelvalue_model=Model(inputs=state_input, outputs=Dense(1, activation='linear')(policy))# Define the optimizeroptimizer=Adam(lr=0.001)forepisodeinrange(num_episodes):current_state=initial_statewhilenotdone:# Select an action using the policy modelaction_probs=policy_model.predict(np.array([current_state]))[0]action=np.random.choice(range(action_space_size), p=action_probs)# Take the action and observe the next state and rewardnext_state, reward, done=take_action(current_state, action)# Calculate the advantagetarget_value=value_model.predict(np.array([next_state]))[0][0]advantage=reward+gamma*target_value-value_model.predict(np.array([current_state]))[0][0]# Calculate the old and new policy probabilitiesold_policy_prob=action_probs[action]new_policy_prob=policy_model.predict(np.array([next_state]))[0][action]# Calculate the ratio and the surrogate lossratio=new_policy_prob/old_policy_probsurrogate_loss=np.minimum(ratio*advantage, np.clip(ratio, 1-epsilon, 1+epsilon) *advantage)# Update the policy and value modelspolicy_model.trainable_weights=value_model.trainable_weightspolicy_model.compile(optimizer=optimizer, loss=-surrogate_loss)policy_model.train_on_batch(np.array([current_state]), np.array([action_one_hot]))value_model.train_on_batch(np.array([current_state]), reward+gamma*target_value)current_state=next_state

6、DQN

DQN(深度 Q 网络)是一种无模型、非策略算法,它使用神经网络来逼近 Q 函数。 DQN 特别适用于 Atari 游戏和其他类似问题,其中状态空间是高维的,并使用神经网络近似 Q 函数。

 importnumpyasnpfromkeras.modelsimportSequentialfromkeras.layersimportDense, Inputfromkeras.optimizersimportAdamfromcollectionsimportdeque# Define the Q-network modelmodel=Sequential()model.add(Dense(32, input_dim=state_space_size, activation='relu'))model.add(Dense(32, activation='relu'))model.add(Dense(action_space_size, activation='linear'))model.compile(loss='mse', optimizer=Adam(lr=0.001))# Define the replay bufferreplay_buffer=deque(maxlen=replay_buffer_size)forepisodeinrange(num_episodes):current_state=initial_statewhilenotdone:# Select an action using an epsilon-greedy policyifnp.random.rand() <epsilon:action=np.random.randint(0, action_space_size)else:action=np.argmax(model.predict(np.array([current_state]))[0])# Take the action and observe the next state and rewardnext_state, reward, done=take_action(current_state, action)# Add the experience to the replay bufferreplay_buffer.append((current_state, action, reward, next_state, done))# Sample a batch of experiences from the replay bufferbatch=random.sample(replay_buffer, batch_size)# Prepare the inputs and targets for the Q-networkinputs=np.array([x[0] forxinbatch])targets=model.predict(inputs)fori, (state, action, reward, next_state, done) inenumerate(batch):ifdone:targets[i, action] =rewardelse:targets[i, action] =reward+gamma*np.max(model.predict(np.array([next_state]))[0])# Update the Q-networkmodel.train_on_batch(inputs, targets)current_state=next_state

上面的代码,Q-network有2个隐藏层,每个隐藏层有32个神经元,使用relu激活函数。该网络使用均方误差损失函数和Adam优化器进行训练。

7、TRPO

TRPO (Trust Region Policy Optimization)是一种无模型的策略算法,它使用信任域优化方法来更新策略。 它在具有高维观察和连续动作空间的环境中特别有用。

TRPO 是一个复杂的算法,需要多个步骤和组件来实现。TRPO不是用几行代码就能实现的简单算法。

所以我们这里使用实现了TRPO的现有库,例如OpenAI Baselines,它提供了包括TRPO在内的各种预先实现的强化学习算法,。

要在OpenAI Baselines中使用TRPO,我们需要安装:

 pip install baselines

然后可以使用baselines库中的trpo_mpi模块在你的环境中训练TRPO代理,这里有一个简单的例子:

 importgymfrombaselines.common.vec_env.dummy_vec_envimportDummyVecEnvfrombaselines.trpo_mpiimporttrpo_mpi#Initialize the environmentenv=gym.make("CartPole-v1")env=DummyVecEnv([lambda: env])# Define the policy networkpolicy_fn=mlp_policy#Train the TRPO modelmodel=trpo_mpi.learn(env, policy_fn, max_iters=1000)

我们使用Gym库初始化环境。然后定义策略网络,并调用TRPO模块中的learn()函数来训练模型。

还有许多其他库也提供了TRPO的实现,例如TensorFlow、PyTorch和RLLib。下面时一个使用TF 2.0实现的样例

 importtensorflowastfimportgym# Define the policy networkclassPolicyNetwork(tf.keras.Model):def__init__(self):super(PolicyNetwork, self).__init__()self.dense1=tf.keras.layers.Dense(16, activation='relu')self.dense2=tf.keras.layers.Dense(16, activation='relu')self.dense3=tf.keras.layers.Dense(1, activation='sigmoid')defcall(self, inputs):x=self.dense1(inputs)x=self.dense2(x)x=self.dense3(x)returnx# Initialize the environmentenv=gym.make("CartPole-v1")# Initialize the policy networkpolicy_network=PolicyNetwork()# Define the optimizeroptimizer=tf.optimizers.Adam()# Define the loss functionloss_fn=tf.losses.BinaryCrossentropy()# Set the maximum number of iterationsmax_iters=1000# Start the training loopforiinrange(max_iters):# Sample an action from the policy networkaction=tf.squeeze(tf.random.categorical(policy_network(observation), 1))# Take a step in the environmentobservation, reward, done, _=env.step(action)withtf.GradientTape() astape:# Compute the lossloss=loss_fn(reward, policy_network(observation))# Compute the gradientsgrads=tape.gradient(loss, policy_network.trainable_variables)# Perform the update stepoptimizer.apply_gradients(zip(grads, policy_network.trainable_variables))ifdone:# Reset the environmentobservation=env.reset()

在这个例子中,我们首先使用TensorFlow的Keras API定义一个策略网络。然后使用Gym库和策略网络初始化环境。然后定义用于训练策略网络的优化器和损失函数。

在训练循环中,从策略网络中采样一个动作,在环境中前进一步,然后使用TensorFlow的GradientTape计算损失和梯度。然后我们使用优化器执行更新步骤。

这是一个简单的例子,只展示了如何在TensorFlow 2.0中实现TRPO。TRPO是一个非常复杂的算法,这个例子没有涵盖所有的细节,但它是试验TRPO的一个很好的起点。

总结

以上就是我们总结的7个常用的强化学习算法,这些算法并不相互排斥,通常与其他技术(如值函数逼近、基于模型的方法和集成方法)结合使用,可以获得更好的结果。

https://avoid.overfit.cn/post/82000e3c65a14403b5e4defae28b703b

作者:Siddhartha Pramanik

7个流行的强化学习算法及代码实现相关推荐

  1. 简述7个流行的强化学习算法及代码实现!

    目前流行的强化学习算法包括 Q-learning.SARSA.DDPG.A2C.PPO.DQN 和 TRPO.这些算法已被用于在游戏.机器人和决策制定等各种应用中,并且这些流行的算法还在不断发展和改进 ...

  2. Github上重现DeepMind星际争霸强化学习算法的代码调试与问题

    最近对于DeepMind应用于星际争霸,训练智能体自发产生游戏策略的问题很感兴趣,因此在网上找了相关资料学习,发现了github上有一个复现的python程序,大喜,遂下之,然python初学,调试过 ...

  3. 入门 | 走近流行强化学习算法:最优Q-Learning

    选自Medium 作者:Yassine Yousfi 机器之心编译 参与:Nurhachu Null.李泽南 Q-Learning 是最著名的强化学习算法之一.我们将在本文中讨论该算法的一个重要部分: ...

  4. 强化学习算法成功控制核聚变装置;元宇宙里的AI玩出新花样

    近期业内发布了这些有趣且重要的AI应用: Nature重磅:DeepMind利用强化学习算法成功控制核聚变装置 突破原有技术应用形态,Meta元宇宙这样玩AI 告别渣画质动漫视频,B站开源动漫超分辨率 ...

  5. 目前最好用的大规模强化学习算法训练库是什么?

    点击蓝字  关注我们 本文整理自知乎问答,仅用于学术分享,著作权归作者所有.如有侵权,请联系后台作删文处理. 本文精选知乎问题"目前最好用的大规模强化学习算法训练库是什么?"评论区 ...

  6. 只用1/500数据就打败人类!一种采样高效的强化学习算法 | 报告详解

    [栏目:前沿进展]近日,清华大学交叉信息研究院高阳研究组在强化学习领域中取得突破,研究组所提出的模型EfficientZero首次在雅达利(Atari )游戏数据上超过同等游戏时长的人类平均水平.Ef ...

  7. 上交张伟楠副教授:基于模型的强化学习算法,基本原理以及前沿进展(附视频)

    2020 北京智源大会 本文属于2020北京智源大会嘉宾演讲的整理报道系列.北京智源大会是北京智源人工智能研究院主办的年度国际性人工智能高端学术交流活动,以国际性.权威性.专业性和前瞻性的" ...

  8. 17种深度强化学习算法用Pytorch实现(附链接)

    来源:新智元 本文约1300字,建议阅读5分钟. 本文为你介绍一个用PyTorch实现了17种深度强化学习算法的教程和代码库,帮助大家在实践中理解深度RL算法. [ 导读 ]深度强化学习已经在许多领域 ...

  9. 【重磅】Tensorflow2.0实现29种深度强化学习算法大汇总

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要3分钟 Follow小博主,每天更新前沿干货 来源:深度强化学习实验室 作者:王健树 [导读]今天给大家推荐一个超赞的强化学习项目资料,该项目 ...

最新文章

  1. python excel操作单元格_python 操作excel表格的方法
  2. JAVA构造MAP并初始化MAP
  3. 微信小程序背景图虚化
  4. DropdownList树
  5. 【python】日志模块以及日志组件使用
  6. 拼多多再添新瓜!15 岁上浙大、22 岁获世界冠军的天才黑客 Flanker 疑因拒绝违法攻击被强制开除...
  7. 谷歌甲骨文十年争夺战!90 亿美元的“Java 第一版权案”终于尘埃落定?
  8. 上周的工作总结和下周的学习安排
  9. scrapy实例三 【豆瓣电影Top250】
  10. 另类方法激活你的Winodws 2008
  11. 基于 cm-11 源码编译模拟器
  12. 就业季必看的职业规划
  13. 【matlab】matlab相关系数计算公式(Pearson和Spearman,以及Kendall Rank)
  14. pure-admin九州权限系统地址简单读
  15. Hutool(Excel工具使用)
  16. 计算机word2003试题,计算机应用基础Word2003试题新
  17. 封装的练习(宠物自白)
  18. Java基础|一图总结Java File类(与IO密切相关)
  19. 关于制作点击出现文字的JS效果
  20. uplink端口能接路由器吗_这些常见的网络故障,你都知道如何解决吗,一文告诉你解决方法...

热门文章

  1. RX 6500 XT和rtx3050 哪个好
  2. 爆笑三国故事:张飞流水帐41-50
  3. 理解 LVM (Logical Volume Manager)
  4. 查看网页源代码的方法
  5. 【光学】发散角的奥秘
  6. winForm欢迎界面
  7. 单片机应用系统设计技术——计数器
  8. 自媒体领域选择大全,自媒体新手参考资料
  9. mysql 辅键_mysql 的主辅配置
  10. python数组和函数的区别_真假美猴王-Numpy数据与Python数组的区别与联系!