APP下载

基于TensorFlow 的Q-Learning 算法研究与实现

2019-11-22刘俊利

现代计算机 2019年29期
关键词:迷宫定义状态

刘俊利

(西南科技大学计算机科学与技术学院,绵阳 621000)

0 引言

近年来,随着科技的发展,人工智能在多个领域均取得了令人瞩目的成就。其中AlphaGo[1]以3 比0 的总比分战胜了世界围棋冠军柯洁就是其标志性成果之一,而关于这次胜利背后所运用到的技术,强化学习是核心之一。强化学习的算法主要分为两大类:一种是基于值的算法(Value-Based),另一种是基于策略的算法(Policy-Based)。基于值的算法是通过计算每一个状态动作的价值,选择价值最大的动作执行;基于策略的算法直接对策略进行建模。两者方式不同,但核心都是在行动-评价的环境中获得学习信息并更新模型参数,改进行动方案以适应环境。Q-Learning 是强化学习中基于值的经典算法之一,它能够很好地体现强化学习的思想并且已经得到了广泛应用。本文将分析Q-Learning 算法的原理及公式,然后借助TensorFlow训练框架的算力,最终完成该算法的运行与实现。

1 强化学习简介

强化学习(Reinforcement Learning,RL)[2]是机器学习的一个重要分支。有别于其他传统的机器学习模式,它受到行为主义心理学启发,模拟生物的学习过程,不要求预先给定任何数据,也没有监督者,强调在给定情景下不断试错,最终学习得出最佳策略。强化学习有5 个核心概念,分别为:智能体(Agent)、环境(Environment)、行动(Action)、状态(State)和奖励(Reward)。智能体可以理解为机器人,用于完成学习任务;环境是一个外部系统,智能体存在于环境中;动作是智能体输出的行为;状态用于描述环境和智能体的关系,是做出决策的依据;奖励是环境提供给智能体的反馈信号,用于评价智能体某一行动的好坏。具体地,它们的关系如图1 所示。

图1 强化学习关系图

t 表示t 时刻;St表示t 时刻的环境状态;rt表示t时刻环境对当前动作或者状态的回报;αt表示t 时刻选择的行为。智能体通过感知t 时刻的St和rt选择执行αt,αt执行后影响环境,环境状态立即由St变为St+1,同时新的环境立即给出回报rt+1反馈给智能体。直到新的环境状态为结束状态,强化学习需要不断循环这一过程。

2 Q-Learning算法

2.1算法思想

Q-Learning 算法[3]是一种基于值的算法,Q-table和Q(s,a)函数是该算法的核心。Q-table 是一张存储Q值的表格,用于指导智能体的行动,它的每一列代表一个动作,每一行表示一个状态。Q(s,a)函数又称动作值函数(action-value function),用于计算在s 状态执行了a 行为后的期望奖励数值,计算所得即Q 值最终完成Q-table 单元格的填充。具体Q(s,a)函数公式如式(1),Q-table 表格如表1。

表1 Q-table 表格

2.2 算法流程

由于Q-Learning 算法要实现智能体在环境中学习,所以在算法执行之前首先要完成环境的定义,完成环境的定义后开始Q-Learning 算法的具体流程:首先要对Q-table 进行初始化,在其所有单元格内设定相同的初始值(大多数情况下是0)。然后智能体开始对环境进行探索,在不断尝试和接收反馈的过程中,Q-table通过迭代使用Bellman 方程[4]实现单元格内Q(si,aj)值的更新,找到对于每个状态来说的最佳动作,最终通过Q-table 得到最优策略。具体流程如图2 所示。

图2 Q-Learning 算法流程

3 Python实现

3.1 定义迷宫环境

定义一个5 行9 列的迷宫地图并将智能体的位置为作为状态,设置其具体位置为(self.x,self.y),self.x 和self.y 初始值均为1。智能体在迷宫中各种行为的表示是环境定义的重点,interact 函数中的action 属性共有4 个取值:0,1,2,3,分别表示四个基本动作:向上、向下、向左、向右,每个动作的执行环境都会判断并给予相应的回报。

def interact(self,action):

assert self.is_end is False

new_x=self.x+DX[action]#新的x 坐标

new_y=self.y+DY[action]#新的y 坐标

new_pos_char=self.map[new_x][new_y]#新的位置

self.step+=1#表示已经走了几步

if new_pos_char=='.':#如果走到墙壁

reward=0 #不改变位置且没有奖励

elif new_pos_char=='':#如果没有宝藏

self.x=new_x

self.y=new_y

reward=0#走到新的位置但是没有奖励

elif new_pos_char=='o':#如果有宝藏

self.x=new_x

self.y=new_y#走到新的位置

self.map[new_x][new_y]='' #更新地图

self.is_end=True #游戏结束

reward=100#获得100 奖励

self.total_reward+=reward

return reward

3.2 定义Q-Learning算法

Q 函数是Q-Learning 算法的核心,首先定义Q函数:

e=Env()#环境

Q= np.zeros((e.state_num,4))#e.state_num 表示状态的总数,4 表示可以执行4 个动作

然后学习计算定义好的Q 函数的值,具体程序如下:

for i in range(200):#进行200 次游戏

e=Env()#每进行一次游戏都需要初始环境

while(e.is_end is False)and(e.step

action = epsilon_greedy(Q,e.present_state)#依据Q 值和当前状态,利用ε-greedy 策略[5]挑选行动

state=e.present_state#当前状态

reward=e.interact(action)#当前回报

new_state=e.present_state#新的状态

Q[state,action]=(1-ALPHA)*Q[state,action]+

ALPHA *(reward + GAMMA * Q[new_state,:].max())#更新Q 值

其中更新Q 值对应的公式具体如式(2):

4 程序运行界面效果

利用深度学习框架TensorFlow[6]实现一个简单的Q-Learning 算法示例:一个自动寻宝的机器人,运行效果如图4 所示(运行结果太长,只能截取部分),效果非常直观。其中A 表示智能体,o 表示迷宫里的宝藏,智能体一共玩了200 次这个游戏且每次游戏结束后运行界面均会显示智能体的整个动作过程。在200 次的游戏过程中,明显可以感受到智能体在不断地“学习”且最终确实达到了以较少步骤获得奖励的目标,实现了Q-Learning 算法。

图3 运行效果

5 结语

本文首先介绍了强化学习的基本概念,之后给出了Q-Learning 算法的算法思想和算法流程,然后利用TensorFlow 搭建迷宫环境,定义并训练Q 函数,最终实现Q-Learning 算法的一个简单示例:一个自动寻宝的机器人。运行结果良好,在200 次的游戏中机器人确取得了较好的学习效果,实现了Q-Learning 算法,也证明了Q-Learning 算法确实可以实现在没有任何监督的情况下找到最优策略。

猜你喜欢

迷宫定义状态
以爱之名,定义成长
一种基于ResNet的车钩状态识别方法及其应用
严昊:不定义终点 一直在路上
定义“风格”
状态联想
生命的另一种状态
大迷宫
迷宫
捕网迷宫
创造独一无二的迷宫