深度强化学习-Q-learning解决悬崖寻路问题-笔记(三)

Q-learning解决悬崖寻路问题

  • 悬崖寻路问题
  • Q-learning原理简介
  • Q-learning代码
    • 为什么epsilon要逐渐衰减?
    • epsilon 如何衰减,代码怎么实现?
  • 运行结果

悬崖寻路问题

悬崖寻路问题(CliffWalking)是指在一个4 x 12的网格中,智能体以网格的左下角位置为起点,以网格的下角位置为终点,目标是移动智能体到达终点位置,智能体每次可以在上、下、左、右这4个方向中移动一步,每移动一步会得到-1单位的奖励。
深度强化学习-Q-learning解决悬崖寻路问题-笔记(三)_第1张图片
如图,红色部分表示悬崖,数字代表智能体能够观测到的位置信息,即observation,总共会有0-47等48个不同的值,智能体再移动中会有以下限制:

  • 智能体不能移出网格,如果智能体想执行某个动作移出网格,那么这一步智能体不会移动,但是这个操作依然会得到-1单位的奖励
  • 如果智能体“掉入悬崖” ,会立即回到起点位置,并得到-100单位的奖励
  • 当智能体移动到终点时,该回合结束,该回合总奖励为各步奖励之和

实际的仿真界面如下:
深度强化学习-Q-learning解决悬崖寻路问题-笔记(三)_第2张图片
由于从起点到终点最少需要13步,每步得到-1的reward,因此最佳训练算法下,每个episode下reward总和应该为-13。

Q-learning原理简介

具体理论可以参见我的另一篇博文
深度强化学习-马尔科夫决策过程和表格型方法-笔记(二)
在这里插入图片描述
深度强化学习-Q-learning解决悬崖寻路问题-笔记(三)_第3张图片

深度强化学习-Q-learning解决悬崖寻路问题-笔记(三)_第4张图片

Q-learning代码

class QLearning(object):
    def __init__(self,
                 obs_dim,
                 action_dim,
                 learning_rate=0.01,
                 gamma=0.9,
                 epsilon_start=0.9,
                 epsilon_end=0.1,
                 epsilon_decay=200):
        self.action_dim = action_dim  # 动作维度,有几个动作可选
        self.lr = learning_rate  # 学习率
        self.gamma = gamma  # reward的衰减率
        self.epsilon = 0  # 按一定概率随机选动作,即 e-greedy 策略,并且epsilon逐渐衰减
        self.sample_count = 0  # 采样次数/训练次数  epsilon随训练的也就是采样的次数逐渐衰减,所以需要计数
        self.epsilon_start = epsilon_start
        self.epsilon_end = epsilon_end
        self.epsilon_decay = epsilon_decay
        self.Q_table = np.zeros((obs_dim, action_dim))  # Q表

    def sample(self, obs):
        '''
        根据输入观测值,采样输出动作值,带探索,训练模型时使用
        :param obs:
        :return:
        '''
        self.sample_count += 1
        self.epsilon = self.epsilon_end + (self.epsilon_start - self.epsilon_end) * math.exp(-1.0 * self.sample_count / self.epsilon_decay)
        if np.random.uniform(0, 1) > self.epsilon:  # 随机选取0-1之间的值,如果大于epsilon就按照贪心策略选取action,否则随机选取
            action = self.predict(obs)  # 根据当前观测预测下一步选择哪个action
        else:
            action = np.random.choice(self.action_dim)  # 有一定概率随机探索选取一个动作
        return action

    def predict(self, obs):
        '''
        根据输入观测值,采样输出的动作值,带探索,测试模型时使用
        :param obs:
        :return:
        '''
        Q_list = self.Q_table[obs, :]  # 当前观测(状态)那一行,所有列
        Q_max = np.max(Q_list)  # 选择当前观测(状态)下对应Q值最大的那个动作
        action_list = np.where(Q_list == Q_max)[0]  # 找到Q_max在Q_list里对应的所有index
        action = np.random.choice(action_list)  # Q_max可能对应多个action,可以随机抽取一个
        return action

    def learn(self, obs, action, reward, next_obs, done):
        '''
        学习方法 off-policy, 也就是更新Q-table的方法
        :param obs: 交互前的obs, s_t
        :param action: 本次交互选择的action, a_t
        :param reward: 本次动作获得的奖励r
        :param next_obs: 本次交互后的obs,s_t+1
        :param done: episode是否结束
        :return:
        '''
        Q_predict = self.Q_table[obs, action]
        if done:
            Q_target = reward  # 没有下一个状态了
        else:
            Q_target = reward + self.gamma * np.max(self.Q_table[next_obs, :])  # Q-table-learning
        self.Q_table[obs, action] += self.lr * (Q_target - Q_predict)  # 修正q

    def save(self):
        '''
        把Q表格的数据保存到文件中
        :return:
        '''
        npy_file = './Q_table.npy'
        np.save(npy_file, self.Q_table)
        print(npy_file + ' saved.')

    def load(self, npy_file='./result/Q_table.npy'):
        '''
        从文件中读取数据到Q表格
        :param npy_file:
        :return:
        '''
        self.Q_table = np.load(npy_file)
        print(npy_file + ' loaded.')

为什么epsilon要逐渐衰减?

因为在训练初期agent选取动作很不稳定,这个时候应该探索到更多的可能性(探索),而在训练后期趋于稳定,则应该加大对reward比较大的动作选取的概率(利用),这就是探索和利用的原理。

epsilon 如何衰减,代码怎么实现?

在这里插入图片描述

  • 这里,为什么要这样计算?

    这样就保障了 ϵ \epsilon ϵ会随着采样的次数而逐渐衰减,并且衰减的速率趋于平缓最终不变。
    深度强化学习-Q-learning解决悬崖寻路问题-笔记(三)_第5张图片

  • 训练模型和测试模型的时候选择动作有一些不同,训练时采取e-greedy策略,而测试时直接选取Q值最大对应的动作,所以算法在动作选择的时候会包括sample(训练时的动作采样)和predict(测试时的动作选择)。

  • Q值最大对应的动作可能不止一个,此时可以随机选择一个输出结果。

运行结果

深度强化学习-Q-learning解决悬崖寻路问题-笔记(三)_第6张图片
深度强化学习-Q-learning解决悬崖寻路问题-笔记(三)_第7张图片
深度强化学习-Q-learning解决悬崖寻路问题-笔记(三)_第8张图片

你可能感兴趣的:(学习笔记,强化学习)