之前接觸的強化學(xué)習(xí)算法都是單個智能體的強化學(xué)習(xí)算法,但是也有很多重要的應(yīng)用場景牽涉到多個智能體之間的交互,比如說,多個機(jī)器人的控制,語言的交流,多玩家的游戲等等。本文,就帶你簡單了解一下Open-AI的MADDPG(Multi-Agent Deep Deterministic Policy Gradient)算法,來共同體驗一下多智能體強化學(xué)習(xí)的魅力。
1、引言
強化學(xué)習(xí)中很多場景涉及多個智能體的交互,比如多個機(jī)器人的控制,語言的交流,多玩家的游戲等等。不過傳統(tǒng)的RL方法,比如Q-Learning或者policy gradient都不適用于多智能體環(huán)境。主要的問題是,在訓(xùn)練過程中,每個智能體的策略都在變化,因此從每個智能體的角度來看,環(huán)境變得十分不穩(wěn)定(其他智能體的行動帶來環(huán)境變化)。對DQN來說,經(jīng)驗重放的方法變的不再適用(如果不知道其他智能體的狀態(tài),那么不同情況下自身的狀態(tài)轉(zhuǎn)移會不同),而對PG的方法來說,環(huán)境的不斷變化導(dǎo)致了學(xué)習(xí)的方差進(jìn)一步增大。
因此,本文提出了MADDPG(Multi-Agent Deep Deterministic Policy Gradient)方法。為什么要使用DDPG方法作為基準(zhǔn)模型呢?主要是集中訓(xùn)練和分散執(zhí)行的策略。
本文提出的方法框架是集中訓(xùn)練,分散執(zhí)行的。我們先回顧一下DDPG的方式,DDPG本質(zhì)上是一個AC方法。訓(xùn)練時,Actor根據(jù)當(dāng)前的state選擇一個action,然后Critic可以根據(jù)state-action計算一個Q值,作為對Actor動作的反饋。Critic根據(jù)估計的Q值和實際的Q值來進(jìn)行訓(xùn)練,Actor根據(jù)Critic的反饋來更新策略。測試時,我們只需要Actor就可以完成,此時不需要Critic的反饋。因此,在訓(xùn)練時,我們可以在Critic階段加上一些額外的信息來得到更準(zhǔn)確的Q值,比如其他智能體的狀態(tài)和動作等,這也就是集中訓(xùn)練的意思,即每個智能體不僅僅根據(jù)自身的情況,還根據(jù)其他智能體的行為來評估當(dāng)前動作的價值。分散執(zhí)行指的是,當(dāng)每個Agent都訓(xùn)練充分之后,每個Actor就可以自己根據(jù)狀態(tài)采取合適的動作,此時是不需要其他智能體的狀態(tài)或者動作的。DQN不適合這么做,因為DQN訓(xùn)練和預(yù)測是同一個網(wǎng)絡(luò),二者的輸入信息必須保持一致,我們不能只在訓(xùn)練階段加入其他智能體的信息。
2、DDPG算法的簡單回顧
什么是DDPG什么是DDPG呢?一句話描述,它是Actor-Critic 和 DQN 算法的結(jié)合體。
DDPG的全稱是Deep Deterministic Policy Gradient。
我們首先來看Deep,正如Q-learning加上一個Deep就變成了DQN一樣,這里的Deep即同樣使用DQN中的經(jīng)驗池和雙網(wǎng)絡(luò)結(jié)構(gòu)來促進(jìn)神經(jīng)網(wǎng)絡(luò)能夠有效學(xué)習(xí)。
再來看Deterministic,即我們的Actor不再輸出每個動作的概率,而是一個具體的動作,這更有助于我們連續(xù)動作空間中進(jìn)行學(xué)習(xí)。
DDPG的網(wǎng)絡(luò)結(jié)構(gòu)盜用莫煩老師的一張圖片來形象的表示DDPG的網(wǎng)絡(luò)結(jié)構(gòu),同圖片里一樣,我們稱Actor里面的兩個網(wǎng)絡(luò)分別是動作估計網(wǎng)絡(luò)和動作現(xiàn)實網(wǎng)絡(luò),我們稱Critic中的兩個網(wǎng)絡(luò)分別是狀態(tài)現(xiàn)實網(wǎng)絡(luò)和狀態(tài)估計網(wǎng)絡(luò):
我們采用了類似DQN的雙網(wǎng)絡(luò)結(jié)構(gòu),而且Actor和Critic都有target-net和eval-net。我們需要強調(diào)一點的事,我們只需要訓(xùn)練動作估計網(wǎng)絡(luò)和狀態(tài)估計網(wǎng)絡(luò)的參數(shù),而動作現(xiàn)實網(wǎng)絡(luò)和狀態(tài)現(xiàn)實網(wǎng)絡(luò)的參數(shù)是由前面兩個網(wǎng)絡(luò)每隔一定的時間復(fù)制過去的。
我們先來說說Critic這邊,Critic這邊的學(xué)習(xí)過程跟DQN類似,我們都知道DQN根據(jù)下面的損失函數(shù)來進(jìn)行網(wǎng)絡(luò)學(xué)習(xí),即現(xiàn)實的Q值和估計的Q值的平方損失:
上面式子中Q(S,A)是根據(jù)狀態(tài)估計網(wǎng)絡(luò)得到的,A是動作估計網(wǎng)絡(luò)傳過來的動作。而前面部分R + gamma * maxQ(S',A')是現(xiàn)實的Q值,這里不一樣的是,我們計算現(xiàn)實的Q值,不在使用貪心算法,來選擇動作A',而是動作現(xiàn)實網(wǎng)絡(luò)得到這里的A'??偟膩碚f,Critic的狀態(tài)估計網(wǎng)絡(luò)的訓(xùn)練還是基于現(xiàn)實的Q值和估計的Q值的平方損失,估計的Q值根據(jù)當(dāng)前的狀態(tài)S和動作估計網(wǎng)絡(luò)輸出的動作A輸入狀態(tài)估計網(wǎng)絡(luò)得到,而現(xiàn)實的Q值根據(jù)現(xiàn)實的獎勵R,以及將下一時刻的狀態(tài)S'和動作現(xiàn)實網(wǎng)絡(luò)得到的動作A' 輸入到狀態(tài)現(xiàn)實網(wǎng)絡(luò) 而得到的Q值的折現(xiàn)值加和得到(這里運用的是貝爾曼方程)。
我們再來說一下Actor這邊,論文中,我們基于下面的式子進(jìn)行動作估計網(wǎng)絡(luò)的參數(shù):
這個式子看上去很嚇人,但是其實理解起來很簡單。假如對同一個狀態(tài),我們輸出了兩個不同的動作a1和a2,從狀態(tài)估計網(wǎng)絡(luò)得到了兩個反饋的Q值,分別是Q1和Q2,假設(shè)Q1>Q2,即采取動作1可以得到更多的獎勵,那么Policy gradient的思想是什么呢,就是增加a1的概率,降低a2的概率,也就是說,Actor想要盡可能的得到更大的Q值。所以我們的Actor的損失可以簡單的理解為得到的反饋Q值越大損失越小,得到的反饋Q值越小損失越大,因此只要對狀態(tài)估計網(wǎng)絡(luò)返回的Q值取個負(fù)號就好啦。是不是很簡單。
DDPG學(xué)習(xí)中的小trick
與傳統(tǒng)的DQN不同的是,傳統(tǒng)的DQN采用的是一種被稱為'hard'模式的target-net網(wǎng)絡(luò)參數(shù)更新,即每隔一定的步數(shù)就將eval-net中的網(wǎng)絡(luò)參數(shù)賦值過去,而在DDPG中,采用的是一種'soft'模式的target-net網(wǎng)絡(luò)參數(shù)更新,即每一步都對target-net網(wǎng)絡(luò)中的參數(shù)更新一點點,這種參數(shù)更新方式經(jīng)過試驗表明可以大大的提高學(xué)習(xí)的穩(wěn)定性。'soft'模式到底是如何更新網(wǎng)絡(luò)的?我們可以通過代碼更好的理解。
論文中提到的另一個小trick是對采取的動作增加一定的噪聲:
DDPG的完整流程
介紹了這么多,我們也就能順利理解原文中的DDPG算法的流程:
3、MADDPG算法簡介
算法流程
理解了DDPG的算法過程,那么MADDPG的過程也是不難理解的,我們一起來看一下吧。
每個Agent的訓(xùn)練同單個DDPG算法的訓(xùn)練過程類似,不同的地方主要體現(xiàn)在Critic的輸入上:在單個Agent的DDPG算法中,Critic的輸入是一個state-action對信息,但是在MADDPG中,每個Agent的Critic輸入除自身的state-action信息外,還可以有額外的信息,比如其他Agent的動作。
多Agent之間的關(guān)系形式
不同的Agent之間的關(guān)系大體可以分為三種,合作型,對抗性,半合作半對抗型。我們可以根據(jù)不同的合作關(guān)系來設(shè)計我們的獎勵函數(shù)。
4、模型實驗
文章中設(shè)置了多組實驗環(huán)境,有合作型的,有對抗型的也有半合作半對抗型的。如下圖所示:
這里只重點講我們后面代碼中實現(xiàn)的實驗。
實驗的名稱為Predator-prey。其英文解釋為Good agents (green) are faster and want to avoid being hit by adversaries (red). Adversaries are slower and want to hit good agents. Obstacles (large black circles) block the way.
不過我們在代碼中只實現(xiàn)了三個Adversaries,而Good agents處于隨機(jī)游走狀態(tài)。
在合作交流的環(huán)境下,論文中將MADDPG與傳統(tǒng)的算法進(jìn)行了對比,得到的結(jié)果如下:
可以看到,MADDPG與傳統(tǒng)的RL算法相比,在多智能體的環(huán)境下,能夠取得更加突出的效果。
5、MADDPG算法的簡單實現(xiàn)
本文實踐了Predator-prey這一環(huán)境,如下圖所示:
綠色的球為目標(biāo),在二維空間中隨機(jī)游走,躲避紅色的球的攻擊。三個紅色的球是我們定義的Agent,它們處在互相對抗的環(huán)境中,想要擊中綠色的球,從而獲得獎勵。黑色的地方時障礙。
本文的github地址為:https://github.com/princewen/tensorflow_practice/tree/master/RL/Basic-MADDPG-Demo
實驗環(huán)境安裝
下載https://github.com/openai/multiagent-particle-envs中的代碼。
進(jìn)入到代碼主路徑中,執(zhí)行命令安裝所需的環(huán)境
pip install -e .
代碼結(jié)構(gòu)本項目的代碼結(jié)構(gòu)如下:
model_agent_maddpg.py:該文件定義了單個Agent的DDPG結(jié)構(gòu),及一些函數(shù)replay_buffer.py:定義了兩種不同的經(jīng)驗池,一種是普通的經(jīng)驗池,一種是優(yōu)先采樣經(jīng)驗池segment_tree.py:只有在使用優(yōu)先采樣經(jīng)驗池的時候才用到。定義一種樹結(jié)構(gòu)根據(jù)經(jīng)驗的優(yōu)先級進(jìn)行采樣test_three_agent_maddpg.py:對訓(xùn)練好的模型進(jìn)行測試three_agent_maddpg.py:模型訓(xùn)練的主代碼
DDPG-Actor實現(xiàn)我們首先來實現(xiàn)單個的DDPG結(jié)構(gòu)Actor的輸入是一個具體的狀態(tài),經(jīng)過兩層的全鏈接網(wǎng)絡(luò)輸出選擇的Action。
def actor_network(name): with tf.variable_scope(name) as scope: x = state_input x = tf.layers.dense(x, 64) if self.layer_norm: x = tc.layers.layer_norm(x, center=True, scale=True) x = tf.nn.relu(x) x = tf.layers.dense(x, 64) if self.layer_norm: x = tc.layers.layer_norm(x, center=True, scale=True) x = tf.nn.relu(x) x = tf.layers.dense(x, self.nb_actions, kernel_initializer=tf.random_uniform_initializer(minval=-3e-3, maxval=3e-3)) x = tf.nn.tanh(x) return x
DDPG-Critic實現(xiàn)
Critic的輸入是state,以及所有Agent當(dāng)前的action信息:
def critic_network(name, action_input, reuse=False): with tf.variable_scope(name) as scope: if reuse: scope.reuse_variables() x = state_input x = tf.layers.dense(x, 64) if self.layer_norm: x = tc.layers.layer_norm(x, center=True, scale=True) x = tf.nn.relu(x) x = tf.concat([x, action_input], axis=-1) x = tf.layers.dense(x, 64) if self.layer_norm: x = tc.layers.layer_norm(x, center=True, scale=True) x = tf.nn.relu(x) x = tf.layers.dense(x, 1, kernel_initializer=tf.random_uniform_initializer(minval=-3e-3, maxval=3e-3)) return x
訓(xùn)練Actor和Critic
Actor的訓(xùn)練目標(biāo)是Q值的最大化,而Critic的訓(xùn)練目標(biāo)是最小化Q估計值和Q實際值之間的差距:
self.actor_optimizer = tf.train.AdamOptimizer(1e-4)self.critic_optimizer = tf.train.AdamOptimizer(1e-3)# 最大化Q值self.actor_loss = -tf.reduce_mean( critic_network(name + '_critic', action_input=tf.concat([self.action_output, other_action_input], axis=1), reuse=True))self.actor_train = self.actor_optimizer.minimize(self.actor_loss)self.target_Q = tf.placeholder(shape=[None, 1], dtype=tf.float32)self.critic_loss = tf.reduce_mean(tf.square(self.target_Q - self.critic_output))self.critic_train = self.critic_optimizer.minimize(self.critic_loss)
定義三個Agent
隨后,我們分別建立三個Agent,每個Agent對應(yīng)兩個DDPG結(jié)構(gòu),一個是eval-net,一個是target-net:
agent1_ddpg = MADDPG('agent1')agent1_ddpg_target = MADDPG('agent1_target')agent2_ddpg = MADDPG('agent2')agent2_ddpg_target = MADDPG('agent2_target')agent3_ddpg = MADDPG('agent3')agent3_ddpg_target = MADDPG('agent3_target')
模型訓(xùn)練
在訓(xùn)練過程中,假設(shè)當(dāng)前的狀態(tài)是o_n,我們首先通過Actor得到每個Agent的動作,這里我們將動作定義為一個二維的向量,不過根據(jù)OpenAi的環(huán)境設(shè)置,我們需要將動作展開成一個五維的向量,同時綠色的球也需要定義動作,因此一共將四組動作輸入到我們的環(huán)境中,可以得到獎勵及下一個時刻的狀態(tài)o_n_next以及當(dāng)前的獎勵r_n:
agent1_action, agent2_action, agent3_action = get_agents_action(o_n, sess, noise_rate=0.2)#三個agent的行動a = [[0, i[0][0], 0, i[0][1], 0] for i in [agent1_action, agent2_action, agent3_action]]#綠球的行動a.append([0, np.random.rand() * 2 - 1, 0, np.random.rand() * 2 - 1, 0])o_n_next, r_n, d_n, i_n = env.step(a)
隨后,我們需要將經(jīng)驗存放到經(jīng)驗池中,供Critic反饋和訓(xùn)練:
agent1_memory.add(np.vstack([o_n[0], o_n[1], o_n[2]]), np.vstack([agent1_action[0], agent2_action[0], agent3_action[0]]), r_n[0], np.vstack([o_n_next[0], o_n_next[1], o_n_next[2]]), False)agent2_memory.add(np.vstack([o_n[1], o_n[2], o_n[0]]), np.vstack([agent2_action[0], agent3_action[0], agent1_action[0]]), r_n[1], np.vstack([o_n_next[1], o_n_next[2], o_n_next[0]]), False)agent3_memory.add(np.vstack([o_n[2], o_n[0], o_n[1]]), np.vstack([agent3_action[0], agent1_action[0], agent2_action[0]]), r_n[2], np.vstack([o_n_next[2], o_n_next[0], o_n_next[1]]), False)
當(dāng)經(jīng)驗池中存儲了一定的經(jīng)驗之后,我們就可以根據(jù)前文介紹過的雙網(wǎng)絡(luò)結(jié)構(gòu)和損失函數(shù)來訓(xùn)練每個Agent的Actor和Critic:
train_agent(agent1_ddpg, agent1_ddpg_target, agent1_memory, agent1_actor_target_update, agent1_critic_target_update, sess, [agent2_ddpg_target, agent3_ddpg_target])train_agent(agent2_ddpg, agent2_ddpg_target, agent2_memory, agent2_actor_target_update, agent2_critic_target_update, sess, [agent3_ddpg_target, agent1_ddpg_target])train_agent(agent3_ddpg, agent3_ddpg_target, agent3_memory, agent3_actor_target_update, agent3_critic_target_update, sess, [agent1_ddpg_target, agent2_ddpg_target])
-
算法
+關(guān)注
關(guān)注
23文章
4677瀏覽量
94264 -
強化學(xué)習(xí)
+關(guān)注
關(guān)注
4文章
269瀏覽量
11463
原文標(biāo)題:探秘多智能體強化學(xué)習(xí)-MADDPG算法原理及簡單實現(xiàn)
文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
什么是深度強化學(xué)習(xí)?深度強化學(xué)習(xí)算法應(yīng)用分析

深度強化學(xué)習(xí)實戰(zhàn)
將深度學(xué)習(xí)和強化學(xué)習(xí)相結(jié)合的深度強化學(xué)習(xí)DRL
如何構(gòu)建強化學(xué)習(xí)模型來訓(xùn)練無人車算法
基于PPO強化學(xué)習(xí)算法的AI應(yīng)用案例
機(jī)器學(xué)習(xí)中的無模型強化學(xué)習(xí)算法及研究綜述

強化學(xué)習(xí)的基礎(chǔ)知識和6種基本算法解釋
7個流行的強化學(xué)習(xí)算法及代碼實現(xiàn)
徹底改變算法交易:強化學(xué)習(xí)的力量
強化學(xué)習(xí)的基礎(chǔ)知識和6種基本算法解釋

7個流行的強化學(xué)習(xí)算法及代碼實現(xiàn)

評論