劉俊利
(西南科技大學計算機科學與技術學院,綿陽 621000)
強化學習[1]是機器學習的重要研究方向之一。不同于傳統的監(jiān)督學習和非監(jiān)督學習,它對數據沒有任何要求,只需要通過接收環(huán)境對動作的反饋并據此不斷對行動方案進行改進,就能讓機器逐步學會一項新的技能。按照基于值和基于策略兩個方向可以對強化學習到的眾多算法進行分類?;谥档模╒alue-Based)算法其本質上都是學習價值函數Q(state,action)[2],在具體應用時,需要先確定state(當前時刻的環(huán)境狀態(tài))和action(當前時刻的行為),然后再根據Q(state,action)選擇價值最大的動作執(zhí)行?;谥档乃惴ㄊ且环N間接選擇策略的做法,而基于策略的(policy-based)算法是直接對策略進行建模,不需要學習價值函數Q通過模型即可輸出下一時刻的動作。Policy Gradient算法是強化學習中基于策略的經典算法之一。本文將分析Policy Gradient算法的原理及公式,然后借助Tensor-Flow[3]訓練框架的算力,最終完成該算法的運行與實現。
value-based和policy-based是機器學習的兩大類算法。value-based方法采用的策略(例如ε-greedy[4])是確定性策略,即無論什么時候,只要給定一個狀態(tài)si就有唯一一個動作ai輸出與之對應;而policy-based方法采用的策略是帶參數θ的策略π(一個參數化函數,具體公式見式(1)),不斷調整θ并利用策略評分函數J(θ)(具體公式見式(2))測量不同θ下的策略π的質量,待J(θ)函數值達到最大,此時對應的策略π即為最優(yōu)策略。
policy-based方法和value-based方法的使用對比效果如圖1、圖2所示。其中√表示寶藏;×表示陷阱;箭頭表示策略。在運用value-based方法時,由于該方法的確定性策略和迷宮的對稱結構,導致當智能體處在灰色格子上時無法分辨自己處于哪個灰色格子上,所以最后學習到的策略如圖1所示:當初始位置在第一個白格子上,就會陷入死循環(huán);而運用policy-based方法時,因為學習的策略不是確定輸出一個具體的動作,而是輸出在這個狀態(tài)下可以執(zhí)行的動作的概率分布,所以即使在相同狀態(tài)下,每次采取的動作也很可能是不一樣的。所以最后學習到的策略如圖2所示,不會造成死循環(huán)。
圖1 value-based RL
圖2 policy-based RL
Policy Gradient[5]算法是強化學習的一種基于策略的算法。與其他基于價值的算法不同,該算法直接通過模型輸出需要采取的動作,不需要學習價值函數Q。策略網絡(Policy Network)和優(yōu)化目標是Policy Gradient算法的核心。
Policy Gradient算法的實現過程主要是訓練一個策略網絡(Policy Network)。Policy Network框架具體如圖3所示。該網絡輸入為當前狀態(tài)(State),輸出為各個動作的概率(State)。
圖3 Policy Network框架
2.2.1 目標函數
Policy Gradient算法采用的是帶參數θ的策略,不斷的調整參數θ可以實現策略的優(yōu)化,為了評估不同參數對策略的影響,引入目標函數,目標函數的值越大,模型質量越高。一般而言,目標函數主要有三種形式:對于episode任務,優(yōu)化目標是初始狀態(tài)收獲的期望(式3);對于連續(xù)性任務,沒有明確的初始狀態(tài),優(yōu)化目標是平均價值(式4);其他情況可以將每一時間步的平均獎勵作為優(yōu)化目標(式5)。
2.2.2 優(yōu)化函數
在明確了目標函數以后,為了實現最優(yōu)模型,需要找到一個參數θ使得目標函數能夠取到最大值。對目標函數求導可以表示為式(6)。
初始化的內容包括變量初始化,獲得觀察量以及清空gradBuffer等,具體實現如下:
running_reward=None
reward_sum=0
episode_number=1
total_episodes=10000
init=tf.global_variables_initializer()
#開始訓練
with tf.Session()as sess:
rendering=False
sess.run(init)
observation=env.reset()#observation 是環(huán)境的初始觀察量(輸入神經網絡的值)
gradBuffer=sess.run(tvars)#gradBuffer會存儲梯度,此處做一初始化
for ix,grad in enumerate(gradBuffer):
gradBuffer[ix]=grad*0
定義策略網絡的過程包括定義輸入層,定義損失loss然后再根據損失loss定義Adam優(yōu)化器,最后再計算并保存梯度。具體實現如下:
#定義和訓練、loss有關的變量
tvars=tf.trainable_variables()
input_y=tf.placeholder(tf.float32,[None,1],name="input_y")
advantages=tf.placeholder(tf.float32,name="reward_signal")
#定義loss函數
loglik=tf.log(input_y*(input_y-probability)+(1-input_y)*(input_y+probability))
loss=-tf.reduce_mean(loglik*advantages)
newGrads=tf.gradients(loss,tvars)
#優(yōu)化器、梯度。
adam =tf.train.AdamOptimizer(learning_rate=learning_rate)
W1Grad=tf.placeholder(tf.float32,name="batch_grad1")
W2Grad=tf.placeholder(tf.float32,name="batch_grad2")
batchGrad=[W1Grad,W2Grad]
updateGrads=adam.apply_gradients(zip(batchGrad,tvars))
訓練的過程包括:使用當前決策進行游戲交互、計算并保存每一局的梯度、將保存的梯度應用到網絡并輸出結果。其中計算并保存每一局的梯度在整個過程中起承上啟下的作用,具體代碼如下:
#一局游戲結束
if done:
episode_number+=1
# 將 xs、ys、drs從 list變成 numpy數組形式
epx=np.vstack(xs)
epy=np.vstack(ys)
epr=np.vstack(drs)
tfp=tfps
xs,hs,dlogps,drs,ys,tfps=[],[],[],[],[],[]
#對epr計算期望獎勵
discounted_epr=discount_rewards(epr)
#對期望獎勵做歸一化
discounted_epr-=np.mean(discounted_epr)
discounted_epr//=np.std(discounted_epr)
#將梯度存到gradBuffer中
tGrad=sess.run(newGrads,feed_dict={observations:epx,input_y:epy,advantages:discounted_epr})
for ix,grad in enumerate(tGrad):
gradBuffer[ix]+=grad
利用深度學習框架TensorFlow實現一個簡單的Policy Gradient算法示例:一個CartPole小游戲,該游戲通過控制下面的黑色小車向左向右移動使連接在上面的桿保持垂直不倒,如果桿子過于傾斜,或者小車移出一個范圍,那么游戲結束。不停地訓練,直到在游戲中平均能拿到200的獎勵,訓練停止。在訓練過程中,游戲持續(xù)時間越來越長,連接在小車上面的桿也越來越向垂直靠攏,可以明顯感受到“學習”的過程。
圖4運行效果
本文首先介紹了強化學習中policy-based方法的基本概念,之后分析了Policy Gradient算法的策略網絡結構和目標優(yōu)化,然后利用TensorFlow搭建環(huán)境,定義并訓練策略網絡,最終實現Policy Gradient算法的一個簡單示例:一個CartPole小游戲。運行結果良好,在不斷的訓練中,平均獎勵穩(wěn)步上升,直到達到200,整個訓練結束,最終實現了Policy Gradient算法。