网易首页 > 网易号 > 正文 申请入驻

使用TensorFlow Probability实现最大似然估计

0
分享至

TensorFlow Probability是一个构建在TensorFlow之上的Python库。它将我们的概率模型与现代硬件(例如GPU)上的深度学习结合起来。

极大似然估计

最大似然估计是深度学习模型中常用的训练过程。目标是在给定一些数据的情况下,估计概率分布的参数。简单来说,我们想要最大化我们在某个假设的统计模型下观察到的数据的概率,即概率分布。

这里我们还引入了一些符号。连续随机变量的概率密度函数大致表示样本取某一特定值的概率。我们将表示这个函数(|),其中是样本的值,是描述概率分布的参数:

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

当从同一个分布中独立抽取多个样本时(我们通常假设),样本值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 μ:
for sigma in σ:
l_x.append(np.prod(tfd.Normal(mu, sigma).prob(X)))
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
(

,)

下一步是定义损失函数。我们已经看到了我们想要达到的目标最大化似然函数的对数变换。但是在深度学习中,通常需要最小化损失函数,所以直接将似然函数的符号改为负。

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的自定义训练过程。

https://avoid.overfit.cn/post/e604c2173f754788869c5c1332ccba6d

作者:Luís Roque

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
闹麻了,过年亲戚送的礼不忍直视!网友:无良商家,你是真敢卖

闹麻了,过年亲戚送的礼不忍直视!网友:无良商家,你是真敢卖

夜深爱杂谈
2026-02-24 20:53:23
官方丨牙槽骨骨折,下巴骨折,多颗牙齿脱落……

官方丨牙槽骨骨折,下巴骨折,多颗牙齿脱落……

米兰圈
2026-02-24 08:35:27
开年最离谱的瓜,他俩走到一起了?!

开年最离谱的瓜,他俩走到一起了?!

新民周刊
2026-02-22 13:04:39
美称中国一人工智能企业违反美出口管制,外交部:中方已多次表明原则立场

美称中国一人工智能企业违反美出口管制,外交部:中方已多次表明原则立场

澎湃新闻
2026-02-24 15:34:26
翟晓川一家泰国度假,场均5分拿底薪,老婆太漂亮了,已财富自由

翟晓川一家泰国度假,场均5分拿底薪,老婆太漂亮了,已财富自由

大西体育
2026-02-24 10:37:07
老了才醒悟:人过六十,在兄弟姐妹面前,再亲也别做这几件事

老了才醒悟:人过六十,在兄弟姐妹面前,再亲也别做这几件事

阿凯销售场
2026-02-25 02:00:12
杨尚昆回忆:毛主席最大的本事是把“仇人”拧成一股绳,团结对外

杨尚昆回忆:毛主席最大的本事是把“仇人”拧成一股绳,团结对外

老谢谈史
2026-02-24 17:03:20
如何判断一个国家是否有军国主义倾向

如何判断一个国家是否有军国主义倾向

小院之观
2025-09-01 05:30:03
1959年彭德怀主动搬离中南海,毛主席下令:待遇一分不能少!

1959年彭德怀主动搬离中南海,毛主席下令:待遇一分不能少!

历史图鉴
2026-02-24 17:19:34
全球160国都接入,为啥偏偏越南上星链炸了锅?

全球160国都接入,为啥偏偏越南上星链炸了锅?

达文西看世界
2026-02-24 14:56:20
遇到这种20元纸币别花了,估价45000元,找到就发了

遇到这种20元纸币别花了,估价45000元,找到就发了

小陈收藏社
2026-02-24 12:44:04
恭喜!香港名模突然宣布怀上双胞胎,结婚七年终于造人成功

恭喜!香港名模突然宣布怀上双胞胎,结婚七年终于造人成功

乡野小珥
2026-02-24 04:17:52
恩里克:说我执教的巴黎能和瓜帅手下的巴萨相比?我们刚起步

恩里克:说我执教的巴黎能和瓜帅手下的巴萨相比?我们刚起步

懂球帝
2026-02-25 00:54:39
平顶山打人夫妻结婚照曝光:男的酷似昆山龙哥,女的刻薄像燕冬萍

平顶山打人夫妻结婚照曝光:男的酷似昆山龙哥,女的刻薄像燕冬萍

江山挥笔
2026-02-22 09:48:58
从左权之妻到改嫁左权秘书,再到山西夺权,刘志兰究竟经历了什么

从左权之妻到改嫁左权秘书,再到山西夺权,刘志兰究竟经历了什么

旧书卷里的长安
2026-02-22 00:08:58
12306半夜3点通知候补成功,当事人睡醒时列车已发车,1700元车票作废;工作人员:发车后未乘车的车票仅可改签

12306半夜3点通知候补成功,当事人睡醒时列车已发车,1700元车票作废;工作人员:发车后未乘车的车票仅可改签

扬子晚报
2026-02-24 15:42:22
欧洲小偷,都传疯了,达成了一个行业共识,中国人的钱包,随便拿

欧洲小偷,都传疯了,达成了一个行业共识,中国人的钱包,随便拿

西楼知趣杂谈
2026-02-14 18:35:51
杨紫真的已经瘦到天赋上限了,这也太牛了…

杨紫真的已经瘦到天赋上限了,这也太牛了…

可乐谈情感
2026-02-24 19:05:26
赔了1个亿到67亿“卖”了公司,小杨哥还能打赢这场翻身仗吗?

赔了1个亿到67亿“卖”了公司,小杨哥还能打赢这场翻身仗吗?

毒sir财经
2026-02-20 19:37:39
俄宣传人员自曝:扎波罗热进攻潜力已耗尽,南线战局彻底反转

俄宣传人员自曝:扎波罗热进攻潜力已耗尽,南线战局彻底反转

老马拉车莫少装
2026-02-23 16:23:59
2026-02-25 02:36:49
deephub incentive-icons
deephub
CV NLP和数据挖掘知识
1930文章数 1456关注度
往期回顾 全部

科技要闻

宇树科技发布四足机器人Unitree As2

头条要闻

男子搂住继女强吻动作亲密 当地妇联介入

头条要闻

男子搂住继女强吻动作亲密 当地妇联介入

体育要闻

苏翊鸣总结米兰征程:我仍是那个热爱单板滑雪的少年

娱乐要闻

汪小菲官宣三胎出生:承诺会照顾好3个孩子

财经要闻

县城消费「限时繁荣」了十天

汽车要闻

入门即满配 威兰达AIR版上市 13.78万元起

态度原创

教育
艺术
游戏
亲子
军事航空

教育要闻

马马马上上岸!!!TTS《大吉大利复试手册》+复试班:纸质笔记与1v1模拟面试堂堂上线!!

艺术要闻

投资95亿,高428米!海南第一高楼最新进展

LOL传奇选手公布恋情!发博晒照被夸夫妻相,女方身份曝光

亲子要闻

如果你们生在清朝,可能都是特权阶级了

军事要闻

美军参联会主席警告:对伊朗动武可能带来重大风险

无障碍浏览 进入关怀版