DDPG演算法引數如何調節?yr152019-04-16 11:13:55

之前正好遇到過類似問題,總是輸出邊界值,檢查Actor、Critic程式碼發現啟用函式是用的tanh,考慮可能是網路過深輸出太大導致tanh求導為0而無法學習,將Actor、Critic的網路(原本3個隱層)減少到一層隱層,即能正常訓練。

DDPG演算法引數如何調節?橙汁兒2019-08-06 20:39:12

我也總是出現action是邊界值的情況,不知道是演算法的問題還是網路結構的問題。我用到了一個雙向RNN網路,並且actor的啟用函式設為tanh。結果訓練了幾百步就開始輸出邊界值……換過啟用函式,減小過隱層單元個數,Xavier初始化也用上了,都不好使。不知道接下來咋整了。

DDPG演算法引數如何調節?知乎使用者2019-09-01 22:51:39

一樣的問題

1、資料要歸一化,至少要標準化,否則容易出現梯度爆炸的問題

2、使用批歸一化層,keras中自帶,位置放在啟用函式層之前,防止輸入全部處於tanh啟用函式的飽和區間

3、reward中增加懲罰項,根據action的實際含義而定,懲罰過於複雜容易導致critic網路的loss不收斂

DDPG演算法引數如何調節?0o想要雙翅膀o02020-04-10 00:25:31

樓主知道問題了希望分享一下啊,我的也是迭代了一會就輸出action的邊界值了

DDPG演算法引數如何調節?曾伊言2020-09-02 13:44:34

我曾說過以後再寫,現在我恪守諾言寫出來了 ↓ 2021-1-24

曾伊言:深度強化學習調參技巧:以D3QN、TD3、PPO、SAC演算法為例(有空再新增圖片)

目錄(上面那篇文章↑的目錄)

演算法那麼多,我要選哪個?

訓練環境怎麼寫?循序漸進,三個階段

演算法怎麼調參?

——————————————————

在off-policy演算法中常見的超引數

在on-policy演算法中常見的超引數

與離散動作探索有關的超引數

與連續動作探索有關的超引數

探索衰減、退火

——————————————————

D3QN特有的超引數

TD3特有的超引數

PPO+GAE特有的超引數

SAC特有的超引數

——————————————————

為什麼我的演算法越訓練越差?

備用層,用於回覆評論

對知乎上“DRL超引數調優”的一些觀點進行點評

以下是寫於2019年的舊回答

這不是一個好的問題,我是因為反對其他人的回答所以才出現在這裡。

先回答你的問題

你不應該用DDPG演算法去解決實際問題,而應該換其他演算法。一個擁有大量超引數的RL演算法

不適合用來解決實際問題

,DDPG是2016年的演算法,在2020年看,它的許多設計是落後的,好的演算法應該是像 TD3、PPO、SAC這樣的演算法,一些超引數不應該由人類去調節。例如 SAC 的 automatic temperature tuning 可以自動調節自己的溫度係數 alpha。

我小時候寫過 強化學習DelayDDPG,月球著陸器,雙足機器人,只需訓練半個小時的輕量、穩定程式碼,已經討論了此問題,現在我複製過來。請注意,這裡依然推薦你把DDPG演算法換成其他演算法。

我反對下面的這個回答

DDPG演算法引數如何調節? - @Anonymous (叫這個名字 @不出來 )的回答 - 知乎

1、資料要歸一化,至少要標準化,否則容易出現梯度爆炸的問題

2、使用批歸一化層,keras中自帶,位置放在啟用函式層之前,防止輸入全部處於tanh啟用函式的飽和區間

3、reward中增加懲罰項,根據action的實際含義而定,懲罰過於複雜容易導致critic網路的loss不收斂

釋出於 2019-09-01

我認同第一點,資料可以歸一化。

我不認同第二點,BN不適合強化學習,我專門寫了一篇 文章討論此問題,結論是“深度強化學習

不需要批歸一化

,但是可以用

歸一化

”。完整文章如下:

曾伊言:強化學習需要批歸一化(Batch Norm)嗎?

而且

“位置放在啟用函式層之前”這是絕對錯誤的,詳見從雙層最佳化視角理解對抗網路GAN

的 3.2.3 批歸一化BatchNorm 該怎麼用?

批歸一化不能放在啟用層之前,這種結構在網路寬度不足的情況下容易丟失很多資訊。

第三點不是恰當的建議,懂得如何正確地在“reward中增加懲罰項”的人,不需要問“DDPG演算法引數如何調節?” 這種問題。

DDPG演算法引數如何調節(下面等我有時間再

重寫吧

,以前我寫下面這些東西的時候,只學過DDPG和TD3演算法,一些看法是陳舊的)

重寫的東西就是這個↓

曾伊言:深度強化學習調參技巧:以D3QN、TD3、PPO、SAC演算法為例(有空再新增圖片)

重寫的東西是這個↑

下面太舊了,不建議看

曾伊言:強化學習DelayDDPG,月球著陸器,雙足機器人,只需訓練半個小時的輕量、穩定程式碼

正文目錄

原版DDPG的三個「敏感」:對大量的

超引數、隨機重啟、任務環境

敏感。

改良DDPG,克服「敏感」:使用

延遲更新

,並總結超引數選擇方法

如何選擇強化學習的超引數:Gamma值,訓練步數,噪聲方差

適應連續、離散的動作

適應不同的環境引數

以下為節選內容,正好回答了“DDPG演算法引數如何調節?”的這個問題

DDPG有大量敏感的

超引數

explore noise:探索時,需要為動作新增的噪聲,此噪聲的方差

\gamma

gamma:對動作進行估值時,下一步動作的價值所佔權重

\tau

tau:軟更新時,該值越小,更新越“軟”

R^{(m)}

m:記憶回放快取的記憶容量m (memory size)

R^{(n)}

n:記憶回放時,進行抽樣的批次大小 (batch size)

MaxStep

:最大步數,若探索步數超過此最大值,則重新整理環境,重新開始

對神經網路的超引數敏感:簡單的任務不能用引數過多的神經網路

3。 如何選擇強化學習的超引數?

我將程式碼中所有超引數都分離出來,放在 class Arguments 中,並給出了預設值。選擇超引數前,你需要需要推測你的模型的

「每輪訓練的步數」

不需要準確估計,只需要數量級

對得上就可以。儘管數量級是以10為底數,但是請注意,下面我使用

2 作為底數

以月球登入器為例,我們可以使用未經訓練的模型,測得墜毀需要的步數:

[68,142,72,99,73,89,197,59,88,59,92,93,64,81] ~= 91(2 ** 7)

那麼我們猜測,平穩降落需要的步數將會和墜毀需要的步數處在相同數量級,也是2 ** 7

根據「每輪訓練的步數S」來制定多個超引數

。以月球登入器為例,S取128(2**7)

3.1 「gamma」

決策網路會做出讓評估網路給出高評分的動作,評分的計算會使用到gamma。為了體現決策的連續性,我們希望決策網路根據狀態state 選擇動作action 時,不僅要考慮這一步的收益,也要考慮這麼做之後接下去幾步的收益(下一步的局勢)。根據gamma計算出來的 q值,代表了這一步的質量(quality)。

q_target

=

r

+

gamma

*

Cri

‘(s_, a_)

q_eval

=

Cri

s

a

然後訓練評估網路Cri

()

使得

q_eval

接近於

q_target

q0

=

Cri

s

a

~=

r0

+

gamma

*

Cri

’(s_, a_)

q1

=

Cri

s_

a_

=

r1

+

gamma

*

Cri

‘(s__, a__)

q0

=

r0

+

gamma

*

Cri

’(s_, a_)

=

r0

+

gamma

*

q1

=

r0

+

gamma

*

r1

+

gamma

*

q2

=

r0

+

gamma

*

r1

+

gamma

*

r2

+

gamma

*

q2

))

。。。

迭代

。。。

=

r0

*

gamma

**

0

+

r1

*

gamma

**

1

+

r2

*

gamma

**

2

+

。。。

+

rt

*

gamma

**

t

=

sum

([

r

*

gamma

*

i

for

i

r

in

enumrate

r_list

)])

對於有通關條件的任務(如:安全降落+100分,墜毀-100分),其訓練的最後一步是否完成任務是非常重要的。如下方圖左,Gamma值越大,就越能預見更遙遠的未來。此處可以看出,在這個任務中,將Gamma取值為0。99是合適的。如下方的右圖藍色折線:從淺藍色的第300步可以看出這是一次失敗的降落(-100),而當Gamma取值為0。99時,一個好的評估網路應該在第150步之前就已經提前意識到局勢危急(bad state),因而在接下去的訓練中,評估網路可以很好地指導策略網路,讓策略網路在墜毀的前150步就及時地意識到自己的錯誤,此時採取挽救措施還來得及。在此任務中,

過小的Gamma值(如0.9)將使評估網路無法及時地預見未來的事件

,等到大難臨頭才向策略網路發出預警就來不及了。

如果

Gamma值過大也不行,因為距離現在越遠,評估網路對未來的預測精度

越低,其預測結果越不可信,因此我們有必要加上一個小於1 的gamma值降低遙遠未來的權重。有興趣的話,可以將Gamma值取最大值1。0 體驗一下。

DDPG演算法引數如何調節?

圖左,取不同Gamma值得到的q值曲線;圖右,Gamma值取0。99時,降落成功/失敗的q值曲線

3.2 根據「每輪訓練的步數S」計算出合適的Gamma 值

:我需要使策略網路做出判斷的時候,考慮關鍵步驟的分數

在某輪訓練中的某一步的q值為 q0,則有:

q0 = r0*gamma**0 + r1*gamma**1 + r2*gamma**2 + 。。。 + rt*gamma**t (由前面推出)

其中,t步之後的reward 在q0 中體現為 rt * gamma**t

若t取值為「每輪訓練的步數S」== 128 (128為估計值)

若該項係數 gamma**t == 0。50, 那麼 0。50 ** (1/t) == 0。5 ** (1/128) ~= 0。994

若該項係數 gamma**t == 0。10, 那麼 0。10 ** (1/t) == 0。5 ** (1/128) ~= 0。982 # notic

若該項係數 gamma**t == 0。01, 那麼 0。01 ** (1/t) == 0。5 ** (1/128) ~= 0。964

若t取值為「每輪訓練的步數S」== 400 (400為實際值)

若該項係數 gamma**t == 0。50, 那麼 0。50 ** (1/t) == 0。5 ** (1/400) ~= 0。998

若該項係數 gamma**t == 0。10, 那麼 0。10 ** (1/t) == 0。5 ** (1/400) ~= 0。994 # notic

若該項係數 gamma**t == 0。01, 那麼 0。01 ** (1/t) == 0。5 ** (1/400) ~= 0。988

可見,若希望S步後將出現的關鍵節點的權重為一個接近0。1 的數,那麼gamma 值的合理區間應為0。982~0。994,因此我在月球登陸器這個任務中,選擇0。99作為預設值。總的來說,對gamma 值進行調整,目的是使q值曲線儘可能平穩,如上圖左所示,橙色曲線gamma值過小(gamma==0),曲線陡峭,調整後的折線兩端平衡

,不會在關鍵節點出現極端值

。另外,如果gamma值過大,而評估網路的預測能力較弱(特別在複雜任務下),那麼對

q值的不準確的估計會影響策略網路

的訓練。因此我們需要在明確物理意義後,按照上面的計算方法去確定gamma 值,而不是像煉丹一樣去調參。條件允許的情況下,還是要儘可能舉起數學的火炬照亮前方的路。

3.3 「記憶容量」

是記憶回放快取中存放的最大記憶容量,若超過最大值,那麼程式會自動會刪除舊的記憶以維持容量穩定。每輪訓練結束後需要透過梯度下降更新引數,更新次數為本輪訓練的步數。若希望每輪訓練結束後,將記憶中的所有資料都被拿出來訓練,則:

記憶容量 memories_size = 本輪訓練的步數 * batch_size ~= S * batch_size

3.4 「最大訓練步數」

若每輪訓練步數超過最大值,則強行終止,並判定為任務失敗,進入引數更新步驟。如果不設定最大訓練步數,那麼可能會訓練出一個磨磨蹭蹭的智慧體,如:就差一步就到終點了,但是它就是不完成任務。則:

最大訓練步數 max_step = S * 10

3.5 「探索噪聲的方差」

原版DDPG只有探索噪聲,它在與環境互動,收集訓練資料存放到記憶裡面時,為動作添加了噪聲,促使智慧體多探索未知(低階的、被動的好奇)。

3.6 「策略噪聲的方差」

在探索結束後,訓練開始了,從記憶裡面取出資料進行訓練時,在計算q值的時候,也添加了噪聲,促使智慧體做出更加穩重的動作。

舉例子,訓練一個智慧體過橋:距離遠的橋,有寬闊的橋面;距離近的橋,橋面狹窄而沒有護欄。河面以下有猛萌的黎曼鯤,掉下去後,除非證明出ζ(s)函式的所有非平凡零點都位於臨界線上,否則就會被吃掉。到達終點會,並且走的路程短就會得到獎勵。那麼我要如何選擇兩個方差呢?

DDPG演算法引數如何調節?

可以看到,選擇了大的噪聲方差,會讓智慧體選擇穩妥策略(即:加了噪聲也不會掉河裡),始終走在安全的地方,這樣的好處是評估網路對q值的估計變得更加準確了,訓練變得更加穩定。但是過大的噪聲無法訓練出採用激進策略的智慧體——即便智慧體以精細微操走在窄橋正中間,也無濟於事,在大噪聲的影響下,它還是會掉河裡。如果選擇了小的方差,那麼我們可以訓練出走橙色路徑的智慧體(激進策略),訓練也會變得不穩定。

經驗值 激進策略 穩妥策略

「探索噪聲的方差」 explore_noise 0。4 0。1

「策略噪聲的方差」 policy_nose 0。8 0。2