Q_learning原理及其实现方法
声明
学习博客快乐的强化学习1——Q_Learning及其实现方法,加之自己的理解写成,同时欢迎大家访问原博客
前期回顾
简介
Q-Learning是一种 value-based 算法,即通过判断每一步 action 的 value来进行下一步的动作,以人物的左右移动为例,Q-Learning的核心Q-Table可以按照如下表示:
环境 | 向左 | 向右 |
---|---|---|
1 | 0 | 0.1 |
2 | 0.2 | 0.15 |
3 | 0.32 | 0.5 |
其中,在环境1下,向左得分为0,向右得分为0.1
在进行初始化时,给予一个概率值 e_greedy, 当处于环境1时,按照算法中的策略进行动作选择的概率为 e_greedy,而为了避免局部最优以及进行更多的探索,仍按照 1- e_greedy 的概率进行随机选择。
Q_learning算法
Q_learning算法流程
Q_learning算法理解
- 建立Q表,行是每种状态,列是每种状态的行为,值是某状态下某行为估计获得的奖励
- 每次进行状态转移时有e_greedy概率选当前状态最优方法,有 1- e_greedy选随机方法
- 选完之后就更新当前状态下对应所选行为的Q值(估计值)
- 更新方法:其自身= 其自身+学习率*(估计-现实) —> (实际更新 = 实际未更新+学习率*(预测-实际发生))
现实值也是其自身, 估计值是选择当前行为后的奖励及下一状态中选择与当前状态具有相同行为的Q值
PS:建议结合以下的例子理解。
Q_learning算法实现
以小男孩取得玩具为例子,讲述Q-Learning算法的执行过程。
在一开始的时候假设小男孩不知道玩具在哪里,他的Q_Table一片空白,此时他开始观测自己所处的环境,这个环境是环境1,并将这个环境加入到Q_Table中。此时,他不知道左右两个环境的情况,所以向左走向右走的得分都是0, 这两个得分都是小男孩心中预测出来的,并不是真实的左右两个环境的得分,我们给这个得分一个名字叫做q_predict。
环境 | 向左 | 向右 |
---|---|---|
1 | 0 | 0 |
往左走往右走都是有可能的,如果他往左走,他会到达环境0,环境0是一个深渊,然后小男孩就挂了。此时环境会给他一个反馈得分,由于他掉入了深渊,所以他的得分是-1, 这个得分是环境0的实际得分,与上面小男孩处于环境1对环境0的预测得分不同,我们给这个得分一个名字叫做q_target, 由于这个得分与上一步预测的环境0的得分不同,所以我们需要对上一个表格进行更新,此时他的Q_Table表为:
环境 | 向左 | 向右 |
---|---|---|
1 | -0.01 | 0 |
此时小男孩重生了,在这一轮假设他会选择往右走,此时他到达了环境2,并将这个环境加入到Q_Table中。此时,他不知道这个新环境的情况,向左走和向右走对他来说是一样的,所以这个新环境的左右两个Actions得分都是0。
环境 | 向左 | 向右 |
---|---|---|
1 | -0.01 | 0 |
2 | 0 | 0 |
此时他会随机选择一个方向走,之后不断重复探测新环境和走回旧环境的过程,如果他在不断测试中找到了最后的toys,他会得到正数得分,这个得分会一步一步驱使他走向toys。在经过许多次的尝试之后,小男孩会找到一条最快通向玩具的道路。假设环境4就是玩具,小男孩在经过多次尝试后,最后的Q_Table可能是这样。
环境 | 向左 | 向右 |
---|---|---|
1 | -0.02 | 0.033 |
2 | 0.001 | 0.154 |
3 | 0 | 0.547 |
对于Q-Learning算法的主体而言,Q-Learning算法主要由两个对象组成,分别是Q-Learning的大脑和大环境。
Q-Learning的大脑包括以下部分,其对应的功能为
模块名称 | 作用/功能 |
---|---|
初始化 | 初始化学习率、可执行动作、Q_table等参数 |
动作选择 | 根据小男孩当前所处的环境和Q_table进行动作选择 |
学习 | 根据小男孩当前所处的环境对其它环境的预测情况q_predict和下一步环境的实际情况q_target更新Q_table表 |
确认是否存在该环境 | 由于在学习之前环境是未知的,当进入一个新环境时,需要生成一个得分都为0的动作表格 |
大环境包括以下部分,其对应的功能为
模块名称 | 作用/功能 |
---|---|
初始化 | 初始化环境参数、用于构建环境 |
图画更新 | 用于更新当前的图画,便于用户观察 |
环境观察 | 用于返回当前环境情况 |
终点观察 | 用于返回是否到达终点 |
更新坐标 | 用于更新当前所处位置 |
下一环境获取 | 用于获取下一步的环境的实际情况 |
参数归零 | 用于每一个步坐标和当前行走步数的归零 |
在完成两个对象的构建后,需要有一个主函数将两个对象联系起来使用,主函数需要完成以下功能,以伪代码的形式呈现:
初始化测试环境对象
初始化Q-Learning的大脑对象
for episode in range(TIMES):
环境观察
图画更新
while(1):
终点观察
if(到达终点):
打印当前进行世代数,共使用多少步数
参数归零
break;
动作选择
获取下一步的环境的实际情况
学习
更新坐标
图画更新
在观察完Q_Learning算法的伪代码后我们可以发现, 大脑在获取下一步环境的实际情况之后再进行学习,学习函数对Q-Table表更新的重要参数之一就是获取下一步的环境的实际情况。 具体来说,在进行学习过程时,Q-Learning的大脑对象会根据所处的当前环境对各个动作的预测得分和下一步的环境的实际情况(最大得分)对当前环境的Q-Table表进行更新,具体的代码如下所示
1.QL.py
import numpy as np
import pandas as pd
class QL:
def __init__(self, actions, learning_rate=0.05, reward_decay=0.9, e_greedy=0.9):
self