溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用pytorch怎么計算 kl散度

發(fā)布時間:2021-05-24 15:36:46 來源:億速云 閱讀:979 作者:Leah 欄目:開發(fā)技術(shù)

使用pytorch怎么計算 kl散度 ?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

如果現(xiàn)在想用Y指導(dǎo)X,第一個參數(shù)要傳X,第二個要傳Y。就是被指導(dǎo)的放在前面,然后求相應(yīng)的概率和對數(shù)概率就可以了。

import torch
import torch.nn.functional as F
# 定義兩個矩陣
x = torch.randn((4, 5))
y = torch.randn((4, 5))
# 因?yàn)橐脃指導(dǎo)x,所以求x的對數(shù)概率,y的概率
logp_x = F.log_softmax(x, dim=-1)
p_y = F.softmax(y, dim=-1)
 
 
kl_sum = F.kl_div(logp_x, p_y, reduction='sum')
kl_mean = F.kl_div(logp_x, p_y, reduction='mean')
 
print(kl_sum, kl_mean)
 
 
>>> tensor(3.4165) tensor(0.1708)

補(bǔ)充:pytorch中的kl散度,為什么kl散度是負(fù)數(shù)?

F.kl_div()或者nn.KLDivLoss()是pytroch中計算kl散度的函數(shù),它的用法有很多需要注意的細(xì)節(jié)。

輸入

第一個參數(shù)傳入的是一個對數(shù)概率矩陣,第二個參數(shù)傳入的是概率矩陣。并且因?yàn)閗l散度具有不對稱性,存在一個指導(dǎo)和被指導(dǎo)的關(guān)系,因此這連個矩陣輸入的順序需要確定一下。如果現(xiàn)在想用Y指導(dǎo)X,第一個參數(shù)要傳X,第二個要傳Y。就是被指導(dǎo)的放在前面,然后求相應(yīng)的概率和對數(shù)概率就可以了。

所以,一隨機(jī)初始化一個tensor為例,對于第一個輸入,我們需要先對這個tensor進(jìn)行softmax(確保各維度和為1),然后再取log;對于第二個輸入,我們需要對這個tensor進(jìn)行softmax。

import torch
import torch.nn.functional as F

a = torch.tensor([[0,0,1.1,2,0,10,0],[0,0,1,2,0,10,0]])
log_a =F.log_softmax(a)

b = torch.tensor([[0,0,1.1,2,0,7,0],[0,0,1,2,0,10,0]])
softmax_b =F.softmax(b,dim=-1)

kl_mean = F.kl_div(log_a, softmax_b, reduction='mean')
print(kl_mean)

為什么KL散度計算出來為負(fù)數(shù)

先確保對第一個輸入進(jìn)行了softmax+log操作,對第二個參數(shù)進(jìn)行了softmax操作。不進(jìn)行softmax操作就可能為負(fù)。

然后查看自己的輸入是否是小數(shù)點(diǎn)后有很多位,當(dāng)小數(shù)點(diǎn)后很多位的時候,pytorch下的softmax會產(chǎn)生各維度和不為1的現(xiàn)象,導(dǎo)致kl散度為負(fù),如下所示:

a = torch.tensor([[0.,0,0.000001,0.0000002,0,0.0000007,0]])
log_a =F.log_softmax(a,dim=-1)
print("log_a:",log_a)

b = torch.tensor([[0.,0,0.000001,0.0000002,0,0.0000007,0]])
softmax_b =F.softmax(b,dim=-1)
print("softmax_b:",softmax_b)

kl_mean = F.kl_div(log_a, softmax_b,reduction='mean')
print("kl_mean:",kl_mean)

輸出如下,我們可以看到softmax_b的各維度和不為1:

使用pytorch怎么計算 kl散度

pytorch的優(yōu)點(diǎn)

1.PyTorch是相當(dāng)簡潔且高效快速的框架;2.設(shè)計追求最少的封裝;3.設(shè)計符合人類思維,它讓用戶盡可能地專注于實(shí)現(xiàn)自己的想法;4.與google的Tensorflow類似,F(xiàn)AIR的支持足以確保PyTorch獲得持續(xù)的開發(fā)更新;5.PyTorch作者親自維護(hù)的論壇 供用戶交流和求教問題6.入門簡單

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI