成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用TensorFlow Probability實現最大似然估計

開發 前端
TensorFlow Probability是一個構建在TensorFlow之上的Python庫。它將我們的概率模型與現代硬件(例如GPU)上的深度學習結合起來。

TensorFlow Probability是一個構建在TensorFlow之上的Python庫。它將我們的概率模型與現代硬件(例如GPU)上的深度學習結合起來。

圖片

極大似然估計

最大似然估計是深度學習模型中常用的訓練過程。目標是在給定一些數據的情況下,估計概率分布的參數。簡單來說,我們想要最大化我們在某個假設的統計模型下觀察到的數據的概率,即概率分布。

這里我們還引入了一些符號。連續隨機變量的概率密度函數大致表示樣本取某一特定值的概率。我們將表示這個函數??(??|??),其中??是樣本的值,??是描述概率分布的參數:

圖片

tfd.Normal(0, 1).prob(0)

<tf.Tensor: shape=(), dtype=float32, numpy=0.3989423>

當從同一個分布中獨立抽取多個樣本時(我們通常假設),樣本值??1,…,????的概率密度函數是每個個體????的概率密度函數的乘積:

可以很容易地用一個例子來計算上面的問題。假設我們有一個標準的高斯分布和一些樣本:??1=?0.5,??2=0和??3=1.5。正如我們上面定義的那樣,我只需要計算每個樣本的概率密度函數,并將輸出相乘。

X = [-0.5, 0, 1.5]

np.prod(tfd.Normal(0, 1).prob(X))

0.01819123

現在,我想直觀地告訴大家概率密度函數和似然函數之間的區別。它們本質上是在計算類似的東西,但角度相反。

從概率密度函數開始,我們知道它們是樣本??1,…,????的函數。參數??被認為是固定的。因此當參數??已知時,我們使用概率密度函數,找出相同樣本??1,…,????的概率。簡單地說,當我們知道產生某個過程的分布并且我們想從它中推斷可能的抽樣值時,我們使用這個函數。

對于似然函數,我們所知道的是樣本,即觀測數據??1,…,????。這意味著我們的自變量現在是??,因為我們不知道是哪個分布產生了我們觀察到的這個過程。所以當我們知道某個過程的樣本時,使用這個函數,即我們收集了數據,但我們不知道最初是什么分布生成了該過程。也就是說既然我們知道這些數據,我們就可以對它們來自的分布進行推斷。

對于似然函數,慣例是使用字母??,而對于概率密度函數,我們引入了上面的符號。我們可以這樣寫:

我們準備定義參數為??和??的高斯分布的似然函數:

作為對似然函數有更多直觀了解,我們可以生成足夠多的樣本來直觀地了解它的形狀。我們對從概率分布中生成樣本不感興趣,我們感興趣的是生成參數??,使觀測數據的概率最大化,即??(??1,…,????|??)。

我們使用與上面相同的樣本??1=?0.5,??2=0和??3=1.5。

X

[-0.5, 0, 1.5]

為了能夠構建2D可視化,我們可以創建一個潛在參數的網格,在一段時間間隔內均勻采樣,??從[-2,2]采樣,??從[0,3]采樣。由于我們對每個參數采樣了100個值,得到了??^2個可能的組合。對于每個參數的組合,我們需要計算每個樣本的概率并將它們相乘。

μ = np.linspace(-2, 2, 100)
σ = np.linspace(0, 3, 100)

l_x = []
for mu in μ:



l_x = np.asarray(l_x).reshape((100, 100)).T

現在準備繪制似然函數。注意這是觀察到的樣本的函數,這些是固定的,參數是我們的自變量。

plt.contourf(μ, σ, l_x)
plt.xlabel('μ')
plt.ylabel('σ')
plt.colorbar()
plt.title('Likelihood');

圖片

我們感興趣的是最大化數據的概率。這意味著想要找到似然函數的最大值,這可以借助微積分來實現。函數的一階導數對參數的零點應該足以幫助我們找到原函數的最大值。

但是,將許多小概率相乘在數值上是不穩定的。為了克服這個問題,可以使用同一函數的對數變換。自然對數是一個單調遞增的函數,這意味著如果x軸上的值增加,y軸上的值也會增加。這很重要,因為它確保概率對數的最大值出現在與原始概率函數相同的點。它為我們做了另一件非常方便的事情,它將乘積轉化為和。

讓我們執行變換:

圖片

現在可以著手解決優化問題了。最大化我們數據的概率可以寫成:

上面的表達式可以被求導以找到最大值。展開參數有log(??(??|??,??))。由于它是兩個變量??和??的函數,使用偏導數來找到最大似然估計。

專注于??′("撇"表示它是一個估計值,即我們的輸出),我們可以使用以下方法計算它:

為了找到最大值,我們需要找到臨界值,因此需要將上面的表達式設為零。

得到

這是數據的平均值,可以為我們的樣本??1=?0.5,??2=0和??3=1.5計算μ和σ的最大值,并將它們與真實值進行比較。

idx_μ_max = np.argmax(l_x, axis=1)[-1]
print(f'μ True Value: {np.array(X).mean()}')
print(f'μ Calculated Value: {μ[idx_μ_max]}')
print(f'σ True Value: {np.array(X).std()}')
print(f'σ Calculated Value: {σ[np.nanargmax(l_x[:,idx_μ_max], axis=0)]}')

μ True Value: 0.3333333333333333
μ Calculated Value: 0.3434343434343434
σ True Value: 0.8498365855987975
σ Calculated Value: 0.8484848484848485

最大似然估計在TensorFlow Probability中的實現

我們先創建一個正態分布隨機變量并從中取樣。通過繪制隨機變量的直方圖,可以看到分布的形狀。

x_train = np.random.normal(loc=1, scale=5, size=1000).astype('float32')[:, np.newaxis]

plt.hist(x_train, bins=50);

圖片

然后計算隨機變量的均值,這是我們想用最大似然估計學習的值。

x_train.mean()

0.85486585

將TensorFlow Variable對象定義為分布的參數。這向TensorFlow說明,我們想在學習過程中學習這些參數。

normal = tfd.Normal(loc=tf.Variable(0., name='loc'), scale=5)
normal.trainable_variables

(<tf.Variable 'loc:0' shape=() dtype=float32, numpy=0.0>,)

下一步是定義損失函數。我們已經看到了我們想要達到的目標最大化似然函數的對數變換。但是在深度學習中,通常需要最小化損失函數,所以直接將似然函數的符號改為負。

 def nll(x_train):
return -tf.reduce_sum(normal.log_prob(x_train))

最后建立訓練程序,使用自定義訓練循環,可以自己定義過程細節(即使用自定義損失函數)。

使用tf.GradientTape(),它是訪問TensorFlow的自動微分特性的API。然后指定要訓練的變量,最小化損失函數并應用梯度。

 @tf.function
def get_loss_and_grads(x_train):
with tf.GradientTape() as tape:
tape.watch(normal.trainable_variables)
loss = nll(x_train)
grads = tape.gradient(loss, normal.trainable_variables)
return loss, grads

optimizer = tf.keras.optimizers.SGD(learning_rate=0.001)

現在訓練程序已經準備完畢了。

 @tf.function
def get_loss_and_grads(x_train):
with tf.GradientTape() as tape:
tape.watch(normal.trainable_variables)
loss = nll(x_train)
grads = tape.gradient(loss, normal.trainable_variables)
return loss, grads

optimizer = tf.keras.optimizers.SGD(learning_rate=0.001)

Step 000: Loss: 13768.004 Loc: 0.855
Step 001: Loss: 13768.004 Loc: 0.855
Step 002: Loss: 13768.004 Loc: 0.855
...
Step 1997: Loss: 13768.004 Loc: 0.855
Step 1998: Loss: 13768.004 Loc: 0.855
Step 1999: Loss: 13768.004 Loc: 0.855

我們通過最大化在第一時間生成的抽樣數據的概率,計算了參數??的最大似然估計。它是有效的,因為能夠得到一個非常接近原始值的??值。

 print(f'True Value: {x_train.mean()}')
print(f'Estimated Value: {normal.trainable_variables[0].numpy()}')

True Value: 0.8548658490180969
Estimated Value: 0.8548658490180969

總結

本文介紹了最大似然估計的過程,和TensorFlow Probability的實現。通過一個簡單的例子,我們對似然函數的形狀有了一些直觀的認識。最后通過定義一個TensorFlow變量、一個負對數似然函數并應用梯度,實現了一個使用TensorFlow Probability的自定義訓練過程。

責任編輯:華軒 來源: DeepHub IMBA
相關推薦

2018-01-29 00:52:45

機器學習深度學習最大似然

2020-11-17 18:10:02

無人駕駛視覺障礙

2017-09-12 16:31:21

TensorFlowLSTMCNN

2020-05-28 07:15:00

機器學習TensorFlow人工智能

2018-08-30 09:36:10

編程語言Python機器學習

2021-11-02 09:40:50

TensorFlow機器學習人工智能

2021-01-03 14:43:43

深度學習人工智能視頻

2017-05-22 13:15:45

TensorFlow深度學習

2017-12-08 12:44:44

GithubiOS機器學習

2017-05-17 08:24:08

TensorFlow機器學習線性回歸

2020-10-23 10:30:54

NumPyRNN神經網絡

2023-01-11 07:28:49

TensorFlow分類模型

2020-09-09 07:00:00

TensorFlow神經網絡人工智能

2017-03-20 17:20:35

iOSTensorFlow

2017-05-12 16:25:44

深度學習圖像補全tensorflow

2023-03-16 07:27:30

CnosDB數據庫

2017-08-28 21:31:37

TensorFlow深度學習神經網絡

2020-07-17 07:21:36

TensorFlow機器學習計算機視覺

2024-01-16 11:17:18

GPUAI大語言模型

2022-06-29 09:00:00

前端圖像分類模型SQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区久久久 | 精品亚洲一区二区三区 | 亚洲成人久久久 | 欧美午夜一区 | 18gay男同69亚洲网站 | 日韩二三区 | 国产精品视频999 | 欧美日韩精品中文字幕 | 久久久久国产成人精品亚洲午夜 | 久久99精品久久久久 | 亚洲欧美在线免费观看 | 国产精品久久久久久久午夜片 | 国产9 9在线 | 中文 | 欧美日韩国产高清 | 中文字幕日本一区二区 | 免费亚洲一区二区 | 伊人网综合在线 | 亚洲精品 在线播放 | 国产精品123区 | 一级片免费在线观看 | 美日韩免费视频 | 亚洲高清久久 | 在线观看av免费 | 久久久一二三 | 国产精品1区2区 | 亚洲一区二区免费电影 | 91av在线不卡 | 成人在线视频免费看 | 亚洲精品一二区 | 91久久精品国产91久久性色tv | 久久无毛 | 日本在线看片 | 成人免费视频久久 | 日韩中文字幕视频在线 | 一区二区三区在线 | 欧 | 永久网站| 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 牛牛热在线视频 | 欧美99久久精品乱码影视 | 国产精品免费一区二区三区四区 | 黄色国产区 |