強化學習 十二 Dueling DQN

2022-03-17 06:03:14 字數 3796 閱讀 6346

在強化學習(十一) prioritized replay dqn中,我們討論了對dqn的經驗回放池按權重取樣來優化dqn演算法的方法,本文討論另一種優化方法,dueling dqn。本章內容主要參考了icml 2016的deep rl tutorial和dueling dqn的**(icml 2016)。

在前面講到的ddqn中,我們通過優化目標q值的計算來優化演算法,在prioritized replay dqn中,我們通過優化經驗回放池按權重取樣來優化演算法。而在dueling dqn中,我們嘗試通過優化神經網路的結構來優化演算法。

具體如何優化網路結構呢?dueling dqn考慮將q網路分成兩部分,第一部分是僅僅與狀態$s$有關,與具體要採用的動作$a$無關,這部分我們叫做價值函式部分,記做$v(s,w,\alpha)$,第二部分同時與狀態狀態$s$和動作$a$有關,這部分叫做優勢函式(advantage function)部分,記為$a(s,a,w,\beta)$,那麼最終我們的價值函式可以重新表示為:$$q(s,a, w, \alpha, \beta) = v(s,w,\alpha) + a(s,a,w,\beta)$$

其中,$w$是公共部分的網路引數,而$\alpha$是價值函式獨有部分的網路引數,而$\beta$是優勢函式獨有部分的網路引數。

由於q網路的價值函式被分為兩部分,因此dueling dqn的網路結構也和之前的dqn不同。為了簡化演算法描述,這裡不使用原**的cnn網路結構,而是使用前面文中用到的最簡單的三層神經網路來描述。是否使用cnn對dueling dqn演算法本身無影響。

在前面講到的ddqn等dqn演算法中,我使用了乙個簡單的三層神經網路:乙個輸入層,乙個隱藏層和乙個輸出層。如下左圖所示:

而在dueling dqn中,我們在後面加了兩個子網路結構,分別對應上面上到**函式網路部分和優勢函式網路部分。對應上面右圖所示。最終q網路的輸出由**函式網路的輸出和優勢函式網路的輸出線性組合得到。

我們可以直接使用上一節的價值函式的組合公式得到我們的動作價值,但是這個式子無法辨識最終輸出裡面$v(s,w,\alpha)$和$a(s,a,w,\beta)$各自的作用,為了可以體現這種可辨識性(identifiability),實際使用的組合公式如下:$$q(s,a, w, \alpha, \beta) = v(s,w,\alpha) + (a(s,a,w,\beta) - \frac}\sum\limits_}a(s,a', w,\beta))$$

其實就是對優勢函式部分做了中心化的處理。以上就是duel dqn的主要演算法思路。由於它僅僅涉及神經網路的中間結構的改進,現有的dqn演算法可以在使用duel dqn網路結構的基礎上繼續使用現有的演算法。由於演算法主流程和其他演算法沒有差異,這裡就不單獨講duel dqn的演算法流程了。

下面我們用乙個具體的例子來演示dueling dqn的應用。仍然使用了openai gym中的cartpole-v0遊戲來作為我們演算法應用。cartpole-v0遊戲的介紹參見這裡。它比較簡單,基本要求就是控制下面的cart移動使連線在上面的pole保持垂直不倒。這個任務只有兩個離散動作,要麼向左用力,要麼向右用力。而state狀態就是這個cart的位置和速度, pole的角度和角速度,4維的特徵。堅持到200分的獎勵則為過關。

這個例項代基於nature dqn,並將網路結構改為上圖中右邊的dueling dqn網路結構,完整的**參見我的github: 

這裡我們重點關注dueling dqn和nature dqn的**的不同之處。也就是網路結構定義部分,主要的**如下,一共有兩個相同結構的q網路,每個q網路都有狀態函式和優勢函式的定義,以及組合後的q網路輸出,如**紅色部分:

def

create_q_network(self):

#input layer

self.state_input = tf.placeholder("

float

", [none, self.state_dim])

#network weights

with tf.variable_scope('

current_net'):

w1 = self.weight_variable([self.state_dim,20])

b1 = self.bias_variable([20])

#hidden layer 1

h_layer_1 = tf.nn.relu(tf.matmul(self.state_input,w1) +b1)

#hidden layer for state value

with tf.variable_scope('value'):

w21= self.weight_variable([20,1])

b21 = self.bias_variable([1])

self.v = tf.matmul(h_layer_1, w21) + b21

#hidden layer for action value

with tf.variable_scope('advantage'):

w22 = self.weight_variable([20,self.action_dim])

b22 = self.bias_variable([self.action_dim])

self.a = tf.matmul(h_layer_1, w22) + b22

#q value layer

self.q_value = self.v + (self.a - tf.reduce_mean(self.a, axis=1, keep_dims=

true))

with tf.variable_scope(

'target_net'):

w1t = self.weight_variable([self.state_dim,20])

b1t = self.bias_variable([20])

#hidden layer 1

h_layer_1t = tf.nn.relu(tf.matmul(self.state_input,w1t) +b1t)

#hidden layer for state value

with tf.variable_scope('value'):

w2v = self.weight_variable([20,1])

b2v = self.bias_variable([1])

self.vt = tf.matmul(h_layer_1t, w2v) + b2v

#hidden layer for action value

with tf.variable_scope('advantage'):

w2a = self.weight_variable([20,self.action_dim])

b2a = self.bias_variable([self.action_dim])

self.at = tf.matmul(h_layer_1t, w2a) + b2a

#q value layer

self.target_q_value = self.vt + (self.at - tf.reduce_mean(self.at, axis=1, keep_dims=true))

其餘部分**和nature dqn基本相同。當然,我們可以也在前面ddqn,prioritized replay dqn**的基礎上,把網路結構改成上面的定義,這樣dueling dqn也可以起作用。

當然dqn家族的演算法遠遠不止這些,還有一些其他的dqn演算法我沒有詳細介紹,比如使用一些較複雜的cnn和rnn網路來提高dqn的表達能力,又比如改進探索狀態空間的方法等,主要是在dqn的基礎上持續優化。

強化學習 十二 Dueling DQN

在強化學習 十一 prioritized replay dqn中,我們討論了對dqn的經驗回放池按權重取樣來優化dqn演算法的方法,本文討論另一種優化方法,dueling dqn。本章內容主要參考了icml 2016的deep rl tutorial和dueling dqn的 icml 2016 在...

強化學習 強化學習基礎

為了應對車載網路中通訊環境快速變化的難題,可以使用強化學習進行解決,這裡對強化學習的基礎進行整理。主要的應用場景為車載網路中資源分配問題。本文源自莫煩python 強化學習章節,有需要請查閱原文 20200413補充了一些內容,來自這篇部落格,是李巨集毅的深度強化學習的筆記。強化學習的主要構成有 a...

強化學習 1 1 0 強化學習介紹

abstract 本文介紹reinforcement learning的具體特點和與其他機器學習演算法不同之處,本文是乙個骨架性的文章,所有專有名詞都保持英文原始單詞,具體內容會在後續中給出詳細解答。keywords reinforcement learning,situation,action,e...