qlearning 吾找了很久的中文名,终不得其果。
qlearning为何物,建立q_table ,优化q_table 矩阵的值。
何为q_table. 无例要不成文。
先理一下 ,这个例子的逻辑, 可以阅读完全文再返回来理解
源码地址:HTTPS://GITHUB.COM/YUANYUANGONG/GYYTENSOR.GIT
在 《零碎的python基础代码》··这个文件夹里。人懒就不重新起 项目,感谢莫烦大神的教程和源码
1,根据实际情况 建立 q_table
2,在不同的位置根据设置的方法 选择动作 (left,right)
3,根据选择的结果
一,小明想要从1走到6,吾等人类肯定知道 一直往右就对了,但电脑不知道啊,对于电脑 走到 每个 各自都有 两个 方向 right left
那么吾就把 格子一记作 state:0 (数组都是从0开始的),格子二 记作 state:1 .每个 格子两个选择(left,right)以此列推,可记作 矩阵:
import numpy as np
import pandas as pd
n_states=6
actions=['left','right']
q_table = pd.DataFrame( np.zeros((n_states, len(actions))),columns=actions, )
print(q_table)
上面这个矩阵 里面的 0.0 表示 在 status 0 往left 可以获得的 收益值 。至于这 个值 初始是 0.0 。随着训练,在后面通过特有的方法来改变(优化)。
整个矩阵表明了 在 格子1 ,2 ,3 等 地方 往left 的好处值 以及 往right 的好处,尽管现在全是0.0 。那么电脑现在只会随机选择方向。
有这么一个可以记录 每个格子 (state)选left 还是right 的表,就是让 电脑去瞎走,每走一步,改变 好处值(价值)就是 那些 0.0
代码如下
这是选择 向left right 的逻辑
state 是 0,1,2,3,4,5
1,传入参数 当前格子(state)--可以理解当前位置 q_table
2, q_table.iloc[state, :] 获取当前 state 的 left right 的价值
3,np.random.uniform() 获取一个0到1 的随便变量。EPSILON 全局变量 设置为0.9
意味着 这个函数 10%的几率 执行 随机选动作 np.random.choice(ACTIONS)
def choose_action(state, q_table):
state_actions = q_table.iloc[state, :] #获取当前 state 的 left right 的价值
if (np.random.uniform() > EPSILON) or ((state_actions == 0).all()):
action_name = np.random.choice(ACTIONS) #10%的几率 执行 随机选 动作
else:
action_name = state_actions.idxmax() #选择 价值最大的 动作
return action_name
当 执行动作就要获取这个动作的反馈,这个例子的反馈只有 两个 到达6 ,没有到达 6 用参数R = 0 or 1
传入参数 格子位置state(S) 动作action(A)
返回 S_ (下一步的位置),R(是否到达)
def get_env_feedback(S, A):
if A == 'right': # move right
if S == N_STATES - 2: # N_STATES总共多少格子 (-2?从0 开始计数)
S_ = N_STATES-1 #终点
R = 1
else:
S_ = S + 1 #往右 state +1 也就是位置增1
R = 0
else: # move left
R = 0
if S == 0:
S_ = S # 到起点
else:
S_ = S - 1 #往左位置减 1
return S_, R
执行了动作,获取了 state(位置) 以及是否到达。就开始评估 这个动作的价值。也就是改变那些0.0。
来看看代码是怎么个逻辑吧
A = choose_action(S, q_table) #选择动作
S_, R = get_env_feedback(S, A) #获取反馈
q_predict = q_table.loc[S, A] #根据q_table 获取 当前 位置(S),动作(A)对应的 价值 (0.0)
if R != 1:
q_target = R + GAMMA * q_table.iloc[S_, :].max()
#GAMMA 是全局变量, 设置为0.9,获取当前位置 最大的值那个值
else:
q_target = R # next state is terminal
q_table.loc[S, A] += ALPHA * (q_target - q_predict) # ALPHA全局变量,可以理解为学习速率。
update_env(S_, episode, step_counter+1) #更新显示的位置
当然,上面这段代码需要循环多次 才能 吧 q_table 更新到我们想要的。
总结一下。qlearning. 就是 让 傻瓜 一开始 瞎乱跑。当这个傻瓜 跑到了 终点。就让他记住 在某个位置,执行了 某个动作 获得了成功 比如在 位置 5 执行向右 到6 。那么 傻瓜就记住了 位置5 动作right 对应 价值 为 1 (你也可以设置成100 ,随你高兴)。一次还无法让傻瓜学会从 1 到 6 怎么走。 他现在只知道 5到6 该如何走。
没事让他 从新再瞎跑一遍。当傻瓜 从位置4到位置5 ,根据上一次经验,位置5 上有 价值。于是就记录位置4 动作right 对应 价值 为 1*0.8 (0.8是我设置的系数,目的?现在不予讨论,去了解一下泛化吧)
同理,可以组建推出 4个位置的 right left 的价值。在这个例子中起点 ,终点的价值是 固定的 0 1。
因为该例子 简单,还不足以证实qlearning 的强大,请关注下一期的 ,走棋。
最后,感谢阅读此文的同志们,若有疑问可以加 QQ 群,660357555 一起来探讨。