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