做網(wǎng)站大概價格/南昌seo排名優(yōu)化
由于一些原因, 需要學(xué)習(xí)一下強化學(xué)習(xí)。用這篇博客來學(xué)習(xí)吧,
用的資料是李宏毅老師的強化學(xué)習(xí)課程。?
深度強化學(xué)習(xí)(DRL)-李宏毅1-8課(全)_嗶哩嗶哩_bilibili
這篇文章的目的是看懂公式, 畢竟這是我的弱中弱。?
強化學(xué)習(xí)一般就是 環(huán)境, 動作網(wǎng)絡(luò), 獎勵三者的糾纏,
動作網(wǎng)絡(luò)看到環(huán)境, 產(chǎn)生一個動作, 然后得到一個獎勵。 然后我們通過這個獎勵來更新動作。?
不同的方法有不同的思想, 我們來看看PG和PPO。?
PG是這樣的思想。?
有一個policy網(wǎng)絡(luò) ?,就是actor。 輸入是環(huán)境, 輸出是策略。?
他會輸出各個動作的幾率, 然后可以根據(jù)這些幾率采樣一個動作。,?
? 經(jīng)過連續(xù)的一輪 也就是一個episode 就完成了一場游戲的采集。?
將獎勵加起來, 就是大R
我們的目標(biāo)是讓大R變得越大越好。?
這是actor按照某個路線的概率。
?最后的組合概率。 也就是得到某一個結(jié)果的概率。?
當(dāng)然這條路線也會對應(yīng)一個大R。??
?當(dāng)然 對于同一個actor, 我們會進行很多個episode。 這樣的話得到不同的路線
?對應(yīng)不同的獎勵R() 乘加起來就是當(dāng)前的actor 平均能得到的獎勵了, 也就能評價當(dāng)前actor的好壞。?
?右邊這種寫法也是可以,?? 服從pxita這樣的分布, 然后每個對應(yīng)一個R, 得到一個期望,我們更新模型的目的就是讓這個平均的R越大越好。
?所以求R對參數(shù)的梯度,這里的R()不需要可微
由于右邊只有與參數(shù)相關(guān), 因此轉(zhuǎn)化為對
?的微分
?
?上下同乘(
)
?
?變?yōu)檫@個。 因為對log求導(dǎo) 后面那一項。?
轉(zhuǎn)為分布形式。??
?然后通過采樣來模擬分布。?
?帶入上面的(
)公式, 乘法就轉(zhuǎn)為加法了。?
?直觀理解, 前面的R為正, 則增加后面這個S到A映射的幾率, 通過更新模型參數(shù)。?
通過這兩個式子, 我們就可以更新模型了。 問題是 第二個式子后面那一堆是從哪里來的呢??
事實上就是通過actor和環(huán)境互動得來的。 我們一直玩actor,得到很多個結(jié)果。?
actor的操作一般是從softmax里采樣出來的。?
然后求softmax結(jié)果對參數(shù)的梯度, 然后乘上獎勵就可以了。?
我們會發(fā)現(xiàn) 這個R()? 是對一個episode里所有sample的動作都起作用,
也就是說, 只要這一輪游戲的獎勵是好的, 在這場游戲里所有做過的動作都會增加概率。?
?所以加上時間t, 只計算動作后面的獎勵分?jǐn)?shù)。?
?然后乘上一個discount。 discount 預(yù)示了一個動作的有效時間, 比如, discount很大的時候, 一個動作可以考慮未來很多步的收益。
把現(xiàn)在的這個R-b? 寫作一個優(yōu)勢函數(shù) A , 他是與模型相關(guān)的。?
現(xiàn)在學(xué)了理論知識, 我們要實戰(zhàn)通過代碼來學(xué)習(xí)一下了。、?
李宏毅HW12
首先是李宏毅老師的HW12。 助教放的代碼, 我猜測是PG方法, 我們看下。?
聲明了一個網(wǎng)絡(luò),來產(chǎn)生策略。 輸入是8維向量, 因為環(huán)境給出的接口是8維向量。
輸出是4維向量, 因為可能的操作有4種。 可以看到最后還經(jīng)過了softmax。?
?agent是模型的代理, 里面定義了模型的訓(xùn)練,保存等功能。?
理論運行五輪游戲, 也就是五個episode。?
等下看看這倆。??
環(huán)境重置, 然后步數(shù)也都重置。?
?
?對于當(dāng)前的環(huán)境state, sample一個動作。?
?
?action_prob是四個動作的幾率。?
?categorical : 按類別賦值。? 這里按照概率賦值, 之后就可以按概率來采樣。?
采樣到了動作1.?
?
?這里的log_Prob是對action的概率取對數(shù), 以e為底。
因為action1的概率為0.2368 因此取對數(shù)prob為-1.4404
?把這一步輸入進環(huán)境, 得到下一個環(huán)境的狀態(tài), 這一步的獎勵, 和是否為最后一個動作。
?這個注釋已經(jīng)解釋了, 我們就是這樣得到了每一對動作的概率值的對數(shù)。?
?
會記錄每一步的reward 和?每一個eposide的reward和, 還會記錄最后一步的reward。?
對最后一步的reward和總rewarrd求平均。??
?將每一步的reward 歸一化。?
?傳入那個操作的概率對數(shù)和每一步的獎勵, 更新模型。 我們看看。?
?因為loss要向小優(yōu)化, 所以這里前面加了負(fù)號。 最后求和。
?更新模型, 回傳梯度。?
這里可以看出 和公式是一模一樣的。?
我們參考的第二個代碼來自于蘑菇書。 這本書一樣?
?在sample 也是從分布中采樣, 上面用的是softmax, 這里是伯努利。
state_pool, action_pool, reward_pool = self.memory.sample()state_pool, action_pool, reward_pool = list(state_pool), list(action_pool), list(reward_pool)# Discount rewardrunning_add = 0for i in reversed(range(len(reward_pool))):if reward_pool[i] == 0:running_add = 0else:running_add = running_add * self.gamma + reward_pool[i]reward_pool[i] = running_add# Normalize rewardreward_mean = np.mean(reward_pool)reward_std = np.std(reward_pool)for i in range(len(reward_pool)):reward_pool[i] = (reward_pool[i] - reward_mean) / reward_std# Gradient Desentself.optimizer.zero_grad()for i in range(len(reward_pool)):state = state_pool[i]action = Variable(torch.FloatTensor([action_pool[i]]))reward = reward_pool[i]state = Variable(torch.from_numpy(state).float())probs = self.policy_net(state)m = Bernoulli(probs)loss = -m.log_prob(action) * reward # Negtive score function x reward# print(loss)loss.backward()self.optimizer.step()self.memory.clear()
這事更新模型的代碼。?
第一步, 先采樣一組action結(jié)果。應(yīng)該是一個?的一組結(jié)果(一個episode)
這里是乘以那個時間參數(shù)γ。 從后往前乘, 越向后乘的越多。??
歸一化。
?
和上面一樣, 也是對action的概率取對數(shù), 乘以reward。? 但是伯努利的sample 的action是兩個值。 不知道為什么。?
不管怎么樣, 我們大概知道PG的做法了。 就是算出來各個操作的概率, 然后放在一個分布里sample。 然后要對sample出來的操作的概率取對數(shù) 然后乘上它的獎勵。 乘以一個負(fù)號, 最小化它。
代碼在這里 :?
https://github.com/datawhalechina/easy-rl/blob/master/notebooks/PolicyGradient.ipynb
https://colab.research.google.com/github/ga642381/ML2021-Spring/blob/main/HW12/HW12_ZH.ipynb#scrollTo=bIbp82sljvAt