dqn系列梳理_系列论文阅读——DQN及其改进
DQN
作為DRL的開山之作,DeepMind的DQN可以說是每一個入坑深度增強學習的同學必了解的第一個算法了吧。先前,將RL和DL結合存在以下挑戰:1.deep learning算法需要大量的labeled data,RL學到的reward 大都是稀疏、帶噪聲并且有延遲的(延遲是指action 和導致的reward之間);2.DL假設樣本獨立;而RL前后state狀態相關;3.DL假設分布固定,而RL在學習新的行為時,數據分布會變化。DQN通過Q-Learning使用reward來構造標簽、使用經驗池等方法解決了這些問題。
基于Q-learning 確定Loss Function
Q-learning 更新公式為:
DQN 的 loss function:
DQN使用隨機梯度下降更新參數,為啥要把targetnet單獨拎出來呢,后續會說的。
experience replay
DQN 使用exprience replay解決instablity的問題,把每個時間步agent與環境交互得到的轉移樣本
存儲在buffer中,并被隨機抽取。通過這種方式,去除了數據之前的相關性,并且緩和了數據分布的差異。
TargetNet
為了減少
和 目標
之間的相關性,從而提高穩定性.2015年版的DQN加入了另一個網絡——
作為targetnet,它和
參數分離,每次參數更新只更新
,而
的參數
保持不變,并且周期性的將
的參數復制給
。此時,loss function變為:
DQN算法偽代碼
double DQN
在標準的Q-learning,和DQN中,參數是這么更新的:
max操作使得估計的值函數比值函數的真實值大。如果是均勻的過估計,找到的最優策略是不會變的,不會對我們的目標造成影響。但實際上,過估計的誤差在不同的states和actions下是不同的,這就會影響到我們找到最佳策略了。為了減少overestimation,van Hasselt et al.(2016)提出Double DQN(D-DQN)。利用DQN中的target network,將selection 和 evelation 解藕。使用Behavior Network選擇出value最大的action,用target network來估計它的值
被更改為:
PS 論文中有對兩個數學定理的詳細證明,感興趣的同學可以看哦
Prioritized Experience Replay
在前面的方法中,experience replay都是均勻隨機采樣,但實際上不同樣本的重要性顯然是不同的。舉個例子,在強化學習初期,replay memory中,除了直接和目標相關的state-action pair 有正值,大部分的value都為0,大量的從zero-value state 到 另一個 zero-value state 的transitions更新導致很低效。Moore & Atkeson, 1993 提出Prioritized Sweeping,優先選擇value改變了的state。具體算法如下:
prioritized sweeping
但Prioritized sweeping 主要用在model based planning。Schaul et al. (2016)提出了Prioritized Experience Replay。
Prioritizing TD-Error
用 TD-error來規定優先學習的程度. 如果
越大, 就代表我們的預測精度還有很多上升空間, 那么這個樣本就越需要被學習, 也就是優先級越高。通過存儲transition,及其每次回放更新得到的最新的TD-error,將TD-error絕對值最大的transition從 memory 中進行回放。然后對該transition進行Q-learning的更新,并根據TD-error,更新其優先級。而對于沒有已知TD-error的新進入memory的transition,將其放到最大優先級的行列,以確保所有的經驗至少被回放一次。
Stochastic Prioritization
greedy TD-error prioritization有以下問題:1.那些TD-error很小的transition 將很長時間不被replay.2.對noise spikes 敏感。最終算法會集中在一個小子集里面。初始TD-error很高的transitions會經常被重放,缺失多樣性會導致over-fitting。作者提出了一種介于均勻隨機采樣和貪心優先之間的隨機采樣方法,transition
的采樣概率為:
其中,
是
的優先級。這樣,即使是最低優先級的transition被采樣到的概率也不為0.
的設定有多種方法。
第一種是成比例優先。
.
用來防止transitions的TD-error為0后不再被回放。具體實現中,使用名為sum-tree的樹型數據結構。它的每個葉子節點保存了 transition priorities,父節點存儲了孩子節點值之和,這樣,頭節點的值就是所有葉子結點的總和
。采樣一個大小為
的minibatch時,range
被均分為
個ranges,每個ranges均勻采樣,這樣,各種
的transitions都有被采樣到。
第二種是
。
是transition
根據它的
在replay memory中的rank。這種方法對異常值更加不敏感,因此更為魯棒。作者最終使用了基于array的二叉堆實現的優先隊列來存儲transitions。
Importance Sampling
Prioritized replay 改變了分布,因此引入了bias。為了消除bias,作者使用了importance-sampling(IS) weights:
Q-learning更新中的
替換為
,并出于stability的原因,用
將權值正則化。
Prioritized Sweeping
Dueling Network Architectures for Deep Reinforcement Learning
Wang et al. (2016b)在網絡結構上做了創新,這種新的網絡結構能夠更容易的與當前和未來的RL算法相結合。
作者引入了advantage function。
關注的是state的值,
關注的是這個狀態下,動作的重要性。
估計的是在這一狀態下選擇某一動作的價值。因為在某些狀態下,無論做什么動作對下一個狀態都沒有太大影響,而這種方法,可以單獨學習狀態本身的價值。
dueling network architecture.png
如上圖,作者將原來的DQN最后的一條全聯接層一分為二,一個用來估計value functions,一個用來估計advantage function。最后將兩條流聚合成輸出Q function。
相應的Q function變為:
和
是兩個全聯接層分支的參數, 那為什么要減去
呢。這是因為給定一個Q,我們無法給出一個唯一的V和A(擁有兩個變量的一個方程式,當然有無窮多解)。為了解決這一問題,作者強制讓被選擇的動作的advantage為0,即
。
這樣,
在實際應用中,作者用均值代替了最大值操作,即:
這樣,可以縮小 Q 值的范圍,去除多余的自由度,且期望值為0,提高算法穩定性
Distributional value function
強化學習一般是對智體收到的隨機return的期望進行建模,但實際上,這些隨機return的分布——value distribution是非常有用的。
It’s already evident from our empirical results that the distributional perspective leads to better, more stable reinforcement learning
Bellemare et al. (2017)提出貝爾曼方程的一個變體,實際上可以預測所有可能的結果,而不用對它們進行平均 —— distributional Bellman’s equation
具體算法如下:
categorical algorithm
網絡結構上的改變:
傳統的DQN最后一層全聯接層輸出的是
維向量,表示當前狀態下,每一個動作的價值的估計。Categorical DQN 輸出的是
維,表示的是表示的是 N 個動作在 M 個價值分布的支撐上的概率。
def _network_template(self, state):
"""Builds a convolutional network that outputs Q-value distributions.
Args:
state: `tf.Tensor`, contains the agent's current state.
Returns:
net: _network_type object containing the tensors output by the network.
"""
weights_initializer = slim.variance_scaling_initializer(
factor=1.0 / np.sqrt(3.0), mode='FAN_IN', uniform=True)
net = tf.cast(state, tf.float32)
net = tf.div(net, 255.)
net = slim.conv2d(
net, 32, [8, 8], stride=4, weights_initializer=weights_initializer)
net = slim.conv2d(
net, 64, [4, 4], stride=2, weights_initializer=weights_initializer)
net = slim.conv2d(
net, 64, [3, 3], stride=1, weights_initializer=weights_initializer)
net = slim.flatten(net)
net = slim.fully_connected(
net, 512, weights_initializer=weights_initializer)
net = slim.fully_connected(
net,
self.num_actions * self._num_atoms,
activation_fn=None,
weights_initializer=weights_initializer)
logits = tf.reshape(net, [-1, self.num_actions, self._num_atoms])
probabilities = tf.contrib.layers.softmax(logits)
q_values = tf.reduce_sum(self._support * probabilities, axis=2)
return self._get_network_type()(q_values, logits, probabilities)
orz其實這篇論文我看了代碼才懂了算法流程,但是并不能完全理解,有大佬可以解釋一哈嗎??
未完待續
A3C
asynchronous advantage actor-critic (A3C) [Mnih et al.(2016)] (https://arxiv.org/pdf/1602.01783.pdf)并不屬于value-based算法,這里提到它一是因為DeepMind 在投給AAAI 2018的論文Rainbow: Combining Improvements in Deep Reinforcement Learning中使用了A3C中的multi-step learning。
論文中最為出彩的地方在于:在多個環境副本上并行地異步執行多個agent,不同的agent采用不同的策略,經歷不同的state,有不同的transition,不但有助于探索,加快速度,而且使得時間上數據的相關性很小,起到穩定學習過程的作用。因此不需要使用又費計算又費資源的experience replay,這樣就可以使用on-policy RL 方法。
算法有一個global network,和若干個agent,大概的步驟過程是:
1.agent 將global network的參數pull過來
2.agent與環境互動n-step或遇到terminal state 提前終止
3.agent計算loss,得到梯度
4.把梯度 push 給global network,用梯度更新global network的參數,然后reset自己,回到第一步
A3C, each actor-learner thread, based on Mnih et al. (2016)
Noisy DQN
Fortunato et al. (2018)提出在參數中加入噪聲,代替
-greedy,增加模型的探索能力。
Noisynet
舉個例子,設神經網絡的一個linear layer 為:
那么加入噪聲后為:
是均值為0的噪聲,
和
都是可學習的參數。設
為
有兩種噪聲產生方法:
a.Independent Gaussian noise:為每一個權值和偏差都設定一個獨立噪聲。在這種情況下,若輸入x是q維、輸出y是p維,那么就需要p*q+q個
,
b. Factorised Gaussian noise:通過將
分解,大大減少了需要的噪聲數量,只需要q+p個
即可。
和
的計算公式為:
這里,作者將
設為
NoisyNet 的loss function 為
梯度為
作者使用蒙特卡洛方法近似上面的梯度,得到
總結
以上是生活随笔為你收集整理的dqn系列梳理_系列论文阅读——DQN及其改进的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java什么时候需要同步_JAVA中线程
- 下一篇: python 每天执行一次_python