栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

使用tensorflow进行简单的强化学习 1—Q-learning

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用tensorflow进行简单的强化学习 1—Q-learning

注:该系列文章为学习笔记,欢迎指正!

文章目录

前言

一、Q-learning

1. FrozenLake 环境

2.Q-Learning的简单实现

二、Q-Table Learning 代码实现

1. 调用FrozenLake 环境

2.Q-Table Learning 算法代码实现

3.Q-Table Learning 整体代码


前言

大家听说的可以玩 Atari 游戏的 Deep Q-Networks 是 Q-Learning 算法的更大、更复杂的实现。所以在学习DQN之前,我们需要对Q-learning有一定的了解。

一、Q-learning

概述:Q-learning为一种针对表格环境的表格方法 。

与试图学习如何通过函数定义将观察值直接映射到动作的策略梯度方法不同,Q-Learning 试图学习处于给定状态(State)的价值(Value),并在那里采取特定的动作(action)。 虽然这两种方法最终都是学习如何在特定情况下让智能体(Agent)在特定情况下采取明智的行动,但采取行动的方式却大不相同。 我们将通过一个简单的实现来讲解 Q-Learning 算法。

1. FrozenLake 环境

      我们通过 OpenAI gym 构建 FrozenLake 环境来模拟 Q-learning 算法的交互环境。OpenAI gym 为我们提供了一系列用于训练agent的简单环境。FrozenLake 环境由一个 4x4 的块网格组成,分别为起始块、目标块、安全的冻结块以及一个危险的悬崖。其目标是让 agent 学会从起点安全的到达目标,而不会掉入悬崖。在任何给定时间,agent可以选择向上、向下、向左或向右移动。环境中还设置了一阵风,其目的是偶尔将 agent 吹到他们没有选择的网格上。因此,每次都完美的实现目标是不可能的,但训练 agent 避开悬崖并达到目标是可行的。环境中设置每一步的奖励都是 0,达到目标设置奖励为1 。因此,我们需要一个学习长期预期汇报的算法。而 Q-learning 就是这样的一个算法。FrozenLake 环境的规则如图1所示。

图1  FrozenLake 环境的规则

2.Q-Learning的简单实现

        在最简单的实现中,Q-Learning 是环境中可能的每个状态(行)和动作(列)的值表。 在表格的每个单元格中,我们学习在给定状态下采取各个给定动作的价值。 在 FrozenLake 环境的情况下,我们有 16 种可能的状态(每个块一个)和 4 种可能的动作(四个运动方向)。 我们首先将一个 16x4 的 Q 值表格初始化为统一的(全为零),然后通过观察采取不同动作获得的奖励,我们相应地更新表格。使用贝尔曼方程来更新我们的 Q 表,贝尔曼方程证明给定动作的预期长期奖励等于当前动作的即时奖励加上在接下状态采取的最佳未来动作的预期奖励。贝尔曼方程的等式如下所示: 

其中 是 s,a 为状态,动作的一般表示, 为折扣标量(衰减因子),其决定未来可能的奖励与当前奖励相比的重要性。 通过以这种方式更新,该表开始慢慢获得在给定状态下给定动作的预期未来奖励的准确度量。 折扣变量允许我们决定未来可能的奖励与当前奖励相比的重要性。 通过以这种方式更新,该表开始慢慢获得在给定状态下给定动作的预期未来奖励的准确度量。

注:贝尔曼方程(Bellman equation)和马尔科夫决策过程(MDPs)是强化学习的基础,大家应有所了解。

二、Q-Table Learning 代码实现

1. 调用FrozenLake 环境

代码如下(示例):

import gym
env = gym.make('FrozenLake-v0')

2.Q-Table Learning 算法代码实现

代码如下(示例):

#Initialize table with all zeros
Q = np.zeros([env.observation_space.n,env.action_space.n])
# Set learning parameters
lr = .8
y = .95
num_episodes = 2000
#create lists to contain total rewards and steps per episode
#jList = []
rList = []
for i in range(num_episodes):
    #Reset environment and get first new observation
    s = env.reset()
    rAll = 0
    d = False
    j = 0
    #The Q-Table learning algorithm
    while j < 99:
        j+=1
        #Choose an action by greedily (with noise) picking from Q table
        a = np.argmax(Q[s,:] + np.random.randn(1,env.action_space.n)*(1./(i+1)))
        #Get new state and reward from environment
        s1,r,d,_ = env.step(a)
        #Update Q-Table with new knowledge
        Q[s,a] = Q[s,a] + lr*(r + y*np.max(Q[s1,:]) - Q[s,a])
        rAll += r
        s = s1
        if d == True:
            break
    #jList.append(j)
    rList.append(rAll)

3.Q-Table Learning 整体代码
import gym
import numpy as np
env = gym.make('FrozenLake-v0')

#Initialize table with all zeros
Q = np.zeros([env.observation_space.n,env.action_space.n])
# Set learning parameters
lr = .8
y = .95
num_episodes = 2000
#create lists to contain total rewards and steps per episode
#jList = []
rList = []
for i in range(num_episodes):
    #Reset environment and get first new observation
    s = env.reset()
    rAll = 0
    d = False
    j = 0
    #The Q-Table learning algorithm
    while j < 99:
        j+=1
        #Choose an action by greedily (with noise) picking from Q table
        a = np.argmax(Q[s,:] + np.random.randn(1,env.action_space.n)*(1./(i+1)))
        #Get new state and reward from environment
        s1,r,d,_ = env.step(a)
        #Update Q-Table with new knowledge
        Q[s,a] = Q[s,a] + lr*(r + y*np.max(Q[s1,:]) - Q[s,a])
        rAll += r
        s = s1
        if d == True:
            break
    #jList.append(j)
    rList.append(rAll)
print "Score over time: " +  str(sum(rList)/num_episodes)
print "Final Q-Table Values"
print Q

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/468023.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号