Q-learning浅析
当前的机器学习主流方向包含监督学习、无监督学习、强化学习,这里以一个简单的例子讲解强化学习的入门算法Q-learning。
假设有这样的连通图,图中的0、1、2、3、4、5是状态,有向箭头表示可以从一个状态到另一个状态。在此,玩一个游戏,假设玩家agent在任何一个状态,让他自己走动,走到状态5,就赢了。
在玩游戏的过程中,对于玩家每次的行动系统回给出反馈,这样玩家才能学习。这里我们给状态直接设置权重,能够直接到5的边为100,其它为0,这是初始状态。在强化学习的学习过程中会利用这些权重计算直到收敛。这样,玩家在任何状态都能知道下一步怎么走收益最大(最快赢)。
在Q-learning中,表示奖赏的表,也叫R表,表记录从一个状态到另一个状态的收益(奖赏)。在初始状态下R表如下:
其中-1表示不联通,0表示联通但节点不包含奖赏节点5,100表示和状态5直连。
同时,创建一个Q表,表示学到的经验,并创建转移方程如下:
其中R就是上文奖赏矩阵,在本例中a表示s~。如下看一个实际例子,设λ=0.8
随机选择一个状态,如3,根据原图3和1、2、4连通,我们随机选择1,这样计算Q
这样经过多次迭代后Q表为
其对应连通图:
代码实例:
有寻宝游戏如下:
其中,红色的方块代表寻宝人,黑色的方块代表陷阱,黄色的方块代表宝藏,我们的目标就是让寻宝人找到最终的宝藏。
这里,我们的状态可以用横纵坐标表示,而动作有上下左右四个动作。使用tkinter来做这样一个动画效果。宝藏的奖励是1,陷阱的奖励是-1,而其他时候的奖励都为0。
那么怎么用强化学习玩这个寻宝游戏?
这里重点看一下Q-learning的相关代码
这了,我们用s代表当前状态,用a代表当前状态下采取的动作,r代表获得的奖励,s_代表转移后的状态。
首先是选择下个行动的函数,这里采用 Epsilon-Greedy算法进行选择,每次决策以概率ε去选择奖赏最大的行动个,1-ε的概率来随机选择
def choose_action(self, observation):
self.check_state_exist(observation)
# action selection
if np.random.uniform() < self.epsilon:
# choose best action
state_action = self.q_table.loc[observation, :]
# some actions may have the same value, randomly choose on in these actions
action = np.random.choice(state_action[state_action == np.max(state_action)].index)
else:
# choose random action
action = np.random.choice(self.actions)
return action
然后是q表更新的代码,主要是根据Q状态转移函数迭代,lr是学习率
def learn(self, s, a, r, s_):
self.check_state_exist(s_)
q_predict = self.q_table.loc[s, a]
if s_ != 'terminal':
q_target = r + self.gamma * self.q_table.loc[s_, :].max() # next state is not terminal
else:
q_target = r # next state is terminal
self.q_table.loc[s, a] += self.lr * (q_target - q_predict) # update
完整利用强化学习玩寻宝游戏的代码:
https://github.com/DLZWY/Machine-Learning-Checklist/tree/master/rl/Q-learning
原文:http://mnemstudio.org/path-finding-q-learning-tutorial.htm