1 The Maximum Likelihood Principle
定义
假设现在我们有数据集
和参数
, 假设我们的参数
代表的是抛掷硬币朝上的概率,
是连续的抛掷硬币的独立事件的结果序列, 比如
HHTTHH, 我们想要通过这个数据集来估算出参数
的大小
我们引入极大似然估计的概念, 也就是我们要求的:
由贝叶斯定理,我们有
分母和
无关,也就是和我们的优化参数无关,我们不看它 分子上的
是先验概率,也就是自然界中存在的不同的硬币(
fair or not)抛掷之后正面朝上的概率为的可能性,我们无从得知,所以我们可以把它看做和我们要优化的
无关, 也可以不看 最后我们的优化目标变成了:
, 我们称这个最大的概率为似然
例子
假设
已知, 表示硬币抛掷之后朝上的概率,
是一个随机变量, 描述了硬币抛掷
之后的朝上朝下的序列,比如
HHTTHH假设我们连续抛掷硬币,其中有次朝上,
次朝下,假设事件
则我们有
:::info
假设是
HHHTHTTHHHHHT, ,我们有
, 我们试图求其最大值, 画图可知:
:::
%matplotlib inlineimport torchfrom d2l import torch as d2ltheta = torch.arange(0, 1, 0.001)p = theta**9 * (1 - theta)**4.d2l.plot(theta, p, 'theta', 'likelihood')
:::info
我们也可以对这个目标函数求导:
因为, 所以
:::
2 Negative Log-Likelihood
由来
:::info
承接刚刚的例子,假设事件实际上是由
个独立的硬币抛掷事件的序列,假设事件
可以拆分成
个独立的事件序列
, 所以我们有:
假设, 则
此时因为
, 所以如果序列很长的话,
会非常小,所以计算机的精度可能无法完整记录,于是我们想: 有没有一个映射函数,在不改变原函数的递增性质的同时, 能够将这些概率信息以正数的形式保存成下来,于是
Negative Log-LikeLihood的概念应运而生
:::
我们定义
Negative Log-Likelihood为于是之前的似然函数就会变成:
# Set up our datan_H = 8675309n_T = 25624# Initialize our paramterestheta = torch.tensor(0.5, requires_grad=True)# Perform gradient descentlr = 0.00000000001for iter in range(10):loss = -(n_H * torch.log(theta) + n_T * torch.log(1 - theta))loss.backward()with torch.no_grad():theta -= lr * theta.gradtheta.grad.zero_()# Check outputtheta, n_H / (n_H + n_T)# (tensor(0.5017, requires_grad=True), 0.9970550284664874)
定义
**Negative Log Likelihood**的出现除了防止浮点数溢出,还有简化运算的目的,上面的程序涉及到对求偏导的运算,使用
**Negative Log Likelihood**能够极大幅度地简化导数运算
:::danger
看一下原来的式子:
在独立性假设的前提下: , 如果我们想对
求导, 我们使用链式法则:

可以看到,这里有次乘法运算和
次加法运算, 非常花时间
:::
:::success
使用
Negative Log-Likelihood之后,我们有:
对求偏导算极值:

这里只用到了次除法运算和
次求和运算,节省运算资源
:::
:::success
同时,
Negative Log-likelihood还可以和信息论做结合
:::
总结
使用
Negative Log-likelihood有三大优点
- 简化浮点数信息,稳定数值
- 简化求导运算,将乘法转变为加法
- 和信息论紧密结合
3 Maximum Likelihood for Continuous Variables
推导和定义

