做網(wǎng)站大概價格/南昌seo排名優(yōu)化
由于一些原因, 需要學習一下強化學習。用這篇博客來學習吧,
用的資料是李宏毅老師的強化學習課程。?
深度強化學習(DRL)-李宏毅1-8課(全)_嗶哩嗶哩_bilibili
這篇文章的目的是看懂公式, 畢竟這是我的弱中弱。?
強化學習一般就是 環(huán)境, 動作網(wǎng)絡, 獎勵三者的糾纏,
動作網(wǎng)絡看到環(huán)境, 產(chǎn)生一個動作, 然后得到一個獎勵。 然后我們通過這個獎勵來更新動作。?
不同的方法有不同的思想, 我們來看看PG和PPO。?
PG是這樣的思想。?
有一個policy網(wǎng)絡 ?,就是actor。 輸入是環(huán)境, 輸出是策略。?
他會輸出各個動作的幾率, 然后可以根據(jù)這些幾率采樣一個動作。,?
? 經(jīng)過連續(xù)的一輪 也就是一個episode 就完成了一場游戲的采集。?
將獎勵加起來, 就是大R
我們的目標是讓大R變得越大越好。?
這是actor按照某個路線的概率。
?最后的組合概率。 也就是得到某一個結果的概率。?
當然這條路線也會對應一個大R。??
?當然 對于同一個actor, 我們會進行很多個episode。 這樣的話得到不同的路線
?對應不同的獎勵R() 乘加起來就是當前的actor 平均能得到的獎勵了, 也就能評價當前actor的好壞。?
?右邊這種寫法也是可以,?? 服從pxita這樣的分布, 然后每個對應一個R, 得到一個期望,我們更新模型的目的就是讓這個平均的R越大越好。
?所以求R對參數(shù)的梯度,這里的R()不需要可微
由于右邊只有與參數(shù)相關, 因此轉化為對
?的微分
?
?上下同乘(
)
?
?變?yōu)檫@個。 因為對log求導 后面那一項。?
轉為分布形式。??
?然后通過采樣來模擬分布。?
?帶入上面的(
)公式, 乘法就轉為加法了。?
?直觀理解, 前面的R為正, 則增加后面這個S到A映射的幾率, 通過更新模型參數(shù)。?
通過這兩個式子, 我們就可以更新模型了。 問題是 第二個式子后面那一堆是從哪里來的呢??
事實上就是通過actor和環(huán)境互動得來的。 我們一直玩actor,得到很多個結果。?
actor的操作一般是從softmax里采樣出來的。?
然后求softmax結果對參數(shù)的梯度, 然后乘上獎勵就可以了。?
我們會發(fā)現(xiàn) 這個R()? 是對一個episode里所有sample的動作都起作用,
也就是說, 只要這一輪游戲的獎勵是好的, 在這場游戲里所有做過的動作都會增加概率。?
?所以加上時間t, 只計算動作后面的獎勵分數(shù)。?
?然后乘上一個discount。 discount 預示了一個動作的有效時間, 比如, discount很大的時候, 一個動作可以考慮未來很多步的收益。
把現(xiàn)在的這個R-b? 寫作一個優(yōu)勢函數(shù) A , 他是與模型相關的。?
現(xiàn)在學了理論知識, 我們要實戰(zhàn)通過代碼來學習一下了。、?
李宏毅HW12
首先是李宏毅老師的HW12。 助教放的代碼, 我猜測是PG方法, 我們看下。?
聲明了一個網(wǎng)絡,來產(chǎn)生策略。 輸入是8維向量, 因為環(huán)境給出的接口是8維向量。
輸出是4維向量, 因為可能的操作有4種。 可以看到最后還經(jīng)過了softmax。?
?agent是模型的代理, 里面定義了模型的訓練,保存等功能。?
理論運行五輪游戲, 也就是五個episode。?
等下看看這倆。??
環(huán)境重置, 然后步數(shù)也都重置。?
?
?對于當前的環(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)化, 所以這里前面加了負號。 最后求和。
?更新模型, 回傳梯度。?
這里可以看出 和公式是一模一樣的。?
我們參考的第二個代碼來自于蘑菇書。 這本書一樣?
?在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結果。應該是一個?的一組結果(一個episode)
這里是乘以那個時間參數(shù)γ。 從后往前乘, 越向后乘的越多。??
歸一化。
?
和上面一樣, 也是對action的概率取對數(shù), 乘以reward。? 但是伯努利的sample 的action是兩個值。 不知道為什么。?
不管怎么樣, 我們大概知道PG的做法了。 就是算出來各個操作的概率, 然后放在一個分布里sample。 然后要對sample出來的操作的概率取對數(shù) 然后乘上它的獎勵。 乘以一個負號, 最小化它。
代碼在這里 :?
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