pytorch 笔记:torch.distributions 概率分布相关(更新中)
1 包介紹
????????torch.distributions包包含可參數化的概率分布和采樣函數。 這允許構建用于優化的隨機計算圖和隨機梯度估計器。
????????不可能通過隨機樣本直接反向傳播。 但是,有兩種主要方法可以創建可以反向傳播的代理函數。
這些是
- 評分函數估計量 score function estimato
- 似然比估計量 likelihood ratio estimator
- REINFORCE
- 路徑導數估計量 pathwise derivative estimator
REINFORCE 通常被視為強化學習中策略梯度方法的基礎,
路徑導數估計器常見于變分自編碼器的重新參數化技巧中。
????????雖然評分函數只需要樣本 f(x)的值,但路徑導數需要導數 f'(x)。、
1.1 REINFORCE
? ? ? ? 我們以reinforce 為例:
????????當概率密度函數關于其參數可微時,我們只需要 sample() 和 log_prob() 來實現 REINFORCE:
????????
? ? ? ? 其中θ是參數,α是學習率,r是獎勵,是在狀態s的時候,根據策略使用動作a的概率
? ? ? ? (這個也就是policy gradient)
強化學習筆記:Policy-based Approach_UQI-LIUWJ的博客-CSDN博客
?????????在實踐中,我們會從網絡的輸出中采樣一個動作,在一個環境中應用這個動作,然后使用 log_prob 構造一個等效的損失函數。
?????????對于分類策略,實現 REINFORCE 的代碼如下:(這只是一個示意代碼,跑不起來的)
probs = policy_network(state) #在狀態state的時候,各個action的概率m = Categorical(probs) #分類概率action = m.sample() #采樣一個actionnext_state, reward = env.step(action) #這里為了簡化考慮,一個episode只有一個actionloss = -m.log_prob(action) * reward #m.log_prob(action) 就是 logp #reward就是前面的r #這里用負號是因為強化學習是梯度上升loss.backward()? 2 包所涉及的類
2.1 伯努利分布
torch.distributions.bernoulli.Bernoulli(probs=None, logits=None, validate_args=None)????????創建由 probs 或 logits(但不是兩者同時)參數化的伯努利分布。
????????樣本是二進制的(0 或 1)。 它們取值 1 的概率為 p,取值 0 的概率為 1 - p。
2.1.1 參數
| probs?(Number,Tensor)? | 采樣概率 |
| logits?(Number,Tensor)? | 采樣的對數幾率 |
2.1.2?函數 & 屬性
| sample() | 采樣,默認采樣一個值 還可以按照shape 采樣 |
| entropy() | 計算熵 |
| enumerate_support() | 返回包含離散分布支持的所有值的張量。 結果將在維度 0 上枚舉 |
| mean | 均值 |
| probs, logits | 兩個輸入的參數 |
| param_shape | 參數的形狀 |
| variance | 方差 |
2.2 貝塔分布
torch.distributions.beta.Beta(concentration1, concentration0, validate_args=None)由concentration 1 (α)和concentration 0 (β)參數化的 Beta 分布。
?2.2.1 函數
| 采樣 | 默認是采樣一個值,也可以設置采樣的維數 |
| entropy | 計算熵 |
rsample(sample_shape) | 如果分布參數是批處理的,則生成一個 sample_shape 形狀的重新參數化樣本或 sample_shape 形狀的重新參數化樣本批次。 注:生成Beta分布的時候,兩個參數必須至少有一個是Tensor,否則rsample效果失效 |
| mean,variance | 均值 & 方差 |
?2.3 Chi2 分布
torch.distributions.chi2.Chi2(df, validate_args=None)?它只有sample一個函數?
2.4 連續伯努利
參數和伯努利很類似
torch.distributions.continuous_bernoulli.ContinuousBernoulli(probs=None, logits=None, lims=(0.499, 0.501), validate_args=None)請注意,與伯努利不同,這里的“probs”不對應于伯努利的“probs”,這里的“logits”不對應于伯努利的“logits”,但由于與伯努利的相似性,使用了相同的名稱。?
2.4.1 函數
| sample | 還是采樣 |
| cdf | 返回以 value 計算的累積概率密度函數。 |
| icdf | 返回以 value 計算的逆累積密度/質量函數。 |
| entropy | 還是計算熵 |
| rsample | 如果分布參數是批處理的,則生成一個 sample_shape 形狀的重新參數化樣本或 sample_shape 形狀的重新參數化樣本批次。 和前面Beta分布類似,只有創建時參數為Tensor,才會有rsample效果 |
| mean,variance | 均值 方差 |
?2.5 二項分布
torch.distributions.binomial.Binomial(total_count=1, probs=None, logits=None, validate_args=None)?
?????????創建由 total_count 和 probs 或 logits(但不是兩者)參數化的二項分布。 total_count 必須可以用 probs/logits 廣播。
2.5.1 函數&參數
| sample | 采樣 ? 100被廣播到0,0.2,0.8,1 所以每次相當于是四個二項分布 |
| enumerate_support | 返回包含離散分布支持的所有值的張量。 結果將在維度 0 上枚舉 |
| mean,variance | 均值,方差 |
2.6? 分類分布
torch.distributions.categorical.Categorical(probs=None, logits=None, validate_args=None)?樣本是來{0,...,K?1} 的整數,其中 K 是 probs.size(-1)。
2.6.1 函數
| sample | 采樣 |
entropy | 熵 |
| enumerate_support | 返回包含離散分布支持的所有值的張量。 結果將在維度 0 上枚舉 |
2.6.2 注意:
創建分類分布時候的Tensor中元素的和可以不是1,最后歸一化到1即可
import torch import math m=torch.distributions.Categorical(torch.Tensor([1,2,4])) m.enumerate_support() #tensor([0, 1, 2])m.probs #tensor([0.1429, 0.2857, 0.5714])3 log_probs
很多分類都有這樣一個函數log_probs,我們就統一說一下
假設m是一個torch的分類,那么m.log_prob(action)相當于
probs.log()[0][action.item()].unsqueeze(0)(對這個action的概率添加log操作)?
import torch import math m=torch.distributions.Categorical(torch.Tensor([1,2,4])) m.enumerate_support() #tensor([0, 1, 2])a=m.sample() a #tensor(2)m.probs #tensor([0.1429, 0.2857, 0.5714])m.probs.log() #tensor([-1.9459, -1.2528, -0.5596])m.log_prob(a) #tensor(-0.5596)m.probs.log()[a.item()] #tensor(-0.5596)總結
以上是生活随笔為你收集整理的pytorch 笔记:torch.distributions 概率分布相关(更新中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: numpy 笔记:finfo
- 下一篇: pytorch笔记:policy gra