劉俊利
(西南科技大學計算機科學與技術學院,綿陽 621000)
近年來,隨著科技的發展,人工智能在多個領域均取得了令人矚目的成就。其中AlphaGo[1]以3 比0 的總比分戰勝了世界圍棋冠軍柯潔就是其標志性成果之一,而關于這次勝利背后所運用到的技術,強化學習是核心之一。強化學習的算法主要分為兩大類:一種是基于值的算法(Value-Based),另一種是基于策略的算法(Policy-Based)。基于值的算法是通過計算每一個狀態動作的價值,選擇價值最大的動作執行;基于策略的算法直接對策略進行建模。兩者方式不同,但核心都是在行動-評價的環境中獲得學習信息并更新模型參數,改進行動方案以適應環境。Q-Learning 是強化學習中基于值的經典算法之一,它能夠很好地體現強化學習的思想并且已經得到了廣泛應用。本文將分析Q-Learning 算法的原理及公式,然后借助TensorFlow訓練框架的算力,最終完成該算法的運行與實現。
強化學習(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反饋給智能體。直到新的環境狀態為結束狀態,強化學習需要不斷循環這一過程。
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 表格
由于Q-Learning 算法要實現智能體在環境中學習,所以在算法執行之前首先要完成環境的定義,完成環境的定義后開始Q-Learning 算法的具體流程:首先要對Q-table 進行初始化,在其所有單元格內設定相同的初始值(大多數情況下是0)。然后智能體開始對環境進行探索,在不斷嘗試和接收反饋的過程中,Q-table通過迭代使用Bellman 方程[4]實現單元格內Q(si,aj)值的更新,找到對于每個狀態來說的最佳動作,最終通過Q-table 得到最優策略。具體流程如圖2 所示。

圖2 Q-Learning 算法流程
定義一個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
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): 利用深度學習框架TensorFlow[6]實現一個簡單的Q-Learning 算法示例:一個自動尋寶的機器人,運行效果如圖4 所示(運行結果太長,只能截取部分),效果非常直觀。其中A 表示智能體,o 表示迷宮里的寶藏,智能體一共玩了200 次這個游戲且每次游戲結束后運行界面均會顯示智能體的整個動作過程。在200 次的游戲過程中,明顯可以感受到智能體在不斷地“學習”且最終確實達到了以較少步驟獲得獎勵的目標,實現了Q-Learning 算法。 圖3 運行效果 本文首先介紹了強化學習的基本概念,之后給出了Q-Learning 算法的算法思想和算法流程,然后利用TensorFlow 搭建迷宮環境,定義并訓練Q 函數,最終實現Q-Learning 算法的一個簡單示例:一個自動尋寶的機器人。運行結果良好,在200 次的游戲中機器人確取得了較好的學習效果,實現了Q-Learning 算法,也證明了Q-Learning 算法確實可以實現在沒有任何監督的情況下找到最優策略。
4 程序運行界面效果

5 結語