贝叶斯神经网络(Bayesian Neural Network)
近期致力于探索贝叶斯神经网络的奥秘,并发现了一些关键点尚待深入理解。为便于后续查阅和巩固知识基础,决定对相关知识进行系统梳理。
贝叶斯神经网络(Bayesian Neural Network)
-
贝叶斯神经网络(Bayesian Neural Network)
-
- BNN的核心理念
-
- BNN的优化目标是实现数据的准确预测
-
- BNN的结构及其特征
-
- 在实际应用中, BNN的具体训练流程通常包括初始化参数和优化器设置
-
- 相对于传统神经网络模型而言, 在泛化能力方面表现更为突出
-
- 在实际应用中, BNN相较于传统神经网络的优势主要体现在对噪声数据的鲁棒性上
-
- 为了便于实践操作, 在PyTorch框架下提供了一个简洁的教学范例代码
-
The paper concludes with a comprehensive summary of the key findings.
-
BNN 旨在通过计算后验分布实现概率推断
- 1. 经典神经网络如何与最大似然估计建立联系?
- 2. 贝叶斯神经网络的目标是什么?
- 3. 在贝叶斯框架下区分经典与贝叶斯神经网络的关键点在哪里?
- 4. 贝叶斯方法为何不采用最大似然估计或损失函数最小化?
- 5. 在贝叶斯框架下优化的目标是什么?
- 6. 实际应用中为何重视后验分布的优势?
-
总结
-
Bayes-Bayesian反向传播算法
-
- Bayes-Bayesian反向传播算法的主要目标
- 探索其在深度学习中的应用潜力
-
- Bayes-Bayesian反向传播算法的核心思想
- 通过构建后验分布模型来实现参数估计与推理过程
- 总结
- 综上所述,Bayes-Bayesian反向传播算法结合了贝叶斯推断与神经网络训练机制,在不确定性建模与优化方面展现出显著优势
-
-
神经网络优化的经典案例
-
- 采用均方根误差作为优化指标
-
- 对代码的具体实现进行详细解析
- 针对上述算法的代码展开深入分析
- 对比研究:与贝叶斯变分推断方法进行系统性比较
-
-
采用最大似然估计法进行优化
-
- 代码的具体实现
- 对该算法的详细说明
- 探讨最大似然估计在其中的应用
- 与贝叶斯反向传播法进行比较
-
贝叶斯神经网络(Bayesian Neural Network)
基于贝叶斯理论的概率神经网络(Bayesian Neural Network, BNN)是通过贝叶斯方法构建了其概率框架的一种扩展模型


1. BNN 的核心思想
在经典神经网络中,权重被视为预设的点值,在训练过程中通过最小化损失函数(如均方误差、交叉熵)来估计最优参数值。相比之下,在贝叶斯神经网络中,权重被视为概率分布,并通过观测数据调整其概率以实现后验分布的计算。
贝叶斯公式:
P(\mathbf{w}|\mathcal{D}) = \frac{P(\mathcal{D}|\mathbf{w}) P(\mathbf{w})}{P(\mathcal{D})}, 其中分母项P(\mathcal{D})作为归一化常数确保了后验几率的合理性
其中:
- 条件后验概率密度p(\mathbf{w}|\mathcal{D}):表示基于观测到的数据集\mathcal{D}对模型参数向量\mathbf{w}的概率密度函数。
- 条件概率p(\mathcal{D}|\mathbf{w}):表示给定特定模型参数\mathbf{w}时样本集\mathcal{D}发生的概率密度。
- 先验概率密度p(\mathbf{w}):表示关于模型参数\mathbf{w}的一个先验假设(例如假设其服从均值为零、方差为\sigma^2的高斯分布)。
- 边缘似然度p(\mathcal{D}):通常通过计算所有可能模型参数向量\mathbf=w的概率加权积分来获得:
p(\ mathcal {d }) = \int p (\ mathcal {d } | \ mathbf { w }) p (\ mathbf { w }) d \ mathb f { w }.
2. BNN 的优化目标
BNN的主要任务是估算后验分布 p(\mathbf{w}|\mathcal{D})。尽管边际似然 p(\mathcal{D}) 的计算在实际应用中往往面临巨大的挑战(涉及高维积分),但我们仍可采用近端技术来推断后验分布
变分推断(Variational Inference)
采用一个较为紧凑的分布模型来估计真实后验概率分布p(\mathbf{w}|\mathcal{D}),并以最小化 Kullback-Leibler (KL) 散度为目标优化该近似过程:
\mathrm{KL}(q(\mathbf{w}|\boldsymbol{\theta}) \| p(\mathbf{w}|\mathcal{D})).
蒙特卡罗方法(Monte Carlo Methods) 主要依赖于马尔可夫链蒙特卡罗(MCMC)算法来被有效地抽取样本。
贝叶斯优化与反向传播结合
采用重参数化技巧实现了变分推断与神经网络反向传播的有效融合。
3. BNN 的结构与特点
BNN 与经典神经网络的主要区别是权重的建模方式:
- 经典神经网络 :在经典神经网络中,权重被设定为确定数值(单一点估计)。
- 贝叶斯神经网络 :在贝叶斯神经网络中,权重被建模为一种分布形式,并以 p(\mathbf{w}) 表示。
Within the framework of BNNs, performing inference for the output will inherently introduce some level of randomness.
这表明预测结果(输出 \mathbf{y})不仅受输入 \mathbf{x}的影响,并且也受到权重分布不确定性的制约。
4. BNN 的训练过程
BNN 的训练过程包括以下步骤:
设定先验分布 :
为权重向量 \mathbf{w} 建立一个先验概率模型 p(\mathbf{w});其中一种常见的选择是采用零均值的高斯分布:
p(\mathbf{w}) = \mathcal{N}(\mathbf{w}|0, \sigma^2)。
估计观测数据的条件概率分布
近似后验分布 :
用 q(\mathbf{w}|\boldsymbol{\theta}) 近似 p(\mathbf{w}|\mathcal{D})。
- 该分布的参数(包括均值 \mu 和方差 \sigma)是通过优化生成的。
- 我们的目的是最大化变分下界:
\displaystyle \boxed{ L_{VAE}\left(θ\right) = E_{q(w|θ)} [\ln p(D|w)] - KL(q(w|θ) || p(w)) }
对最大化变分下界的理解:
第一部分:对数似然的期望 \mathbb{E}_{q(\mathbf{w}|\boldsymbol{\theta})}[\log p(\mathcal{D}|\mathbf{w})]
* **作用** :评估近似分布 $q(\mathbf{w}|\boldsymbol{\theta})$ 在训练数据 $\mathcal{D}$ 上的拟合能力。 * **解释** :从分布 $q(\mathbf{w}|\boldsymbol{\theta})$ 中采样权重 $\mathbf{w}$,然后计算其对应的对数似然 $\log p(\mathcal{D}|\mathbf{w})$,再取期望值。 * **目标** :最大化该项,使得 $q(\mathbf{w}|\boldsymbol{\theta})$ 能够生成最能解释数据的权重。
第二部分:KL 散度(复杂度惩罚项) \mathrm{KL}(q(\mathbf{w}|\boldsymbol{\theta}) \| p(\mathbf{w}))
* **作用** :衡量近似分布 $q(\mathbf{w}|\boldsymbol{\theta})$ 与先验分布 $p(\mathbf{w})$ 的差异。 * **解释** :KL 散度越小,表示 $q(\mathbf{w}|\boldsymbol{\theta})$ 越接近 $p(\mathbf{w})$。 * **目标** :最小化该项,限制 $q(\mathbf{w}|\boldsymbol{\theta})$ `不偏离先验分布太远,从而引入正则化`。
公式的优化目标
拟合数据 : 最大化 \mathbb{E}_{q(\mathbf{w}|\boldsymbol{\theta})}[\log p(\mathcal{D}|\mathbf{w})],
提高模型对训练数据的拟合能力,可用交叉熵损失进行优化。
引入正则化 : 最小化 \mathrm{KL}(q(\mathbf{w}|\boldsymbol{\theta}) \| p(\mathbf{w})),`1防止近似分布 q(\mathbf{w}|\boldsymbol{\theta}) 偏离先验分布
p(\mathbf{w})。
平衡拟合与正则化 : 损失函数 \mathcal{L}(\boldsymbol{\theta}) 是这两部分的加权和(注意,这里的权重隐含在公式中)。优化的结果是找到一种平衡:既能很好地拟合数据,又不会过拟合。
直观理解
第一项:数据驱动 这部分鼓励模型的权重分布能够解释训练数据,推动模型从数据中学习。
第二项:先验约束 这部分限制模型的权重分布不要偏离我们先验的假设(例如高斯分布),引入一种正则化效果,减少过拟合。
整体 模型的目标是找到一个近似的权重分布 q(\mathbf{w}|\boldsymbol{\theta}),使得它在解释数据的同时,也与先验分布保持一致。
一个简单的类比 假设你在山中寻找一个最优的山峰位置:
- 第一项(期望对数似然) :你希望找到能看到最美景色的地方(拟合数据)。
- 第二项(KL 散度) :你希望选的地方不偏离你事先对“最佳景点”的猜测(先验)。
- 目标 :在两者之间找到平衡,既能看到好景色,又不会偏离你的直觉太远。
在预测过程中,通过采样方法从权重分布q(w)中抽取多个权重样本,在此基础上估计输出结果的平均值与不确定性程度。
5. BNN 的优缺点
优点
量化不确定性 :表征模型预测结果中的不确定性(例如均值与方差),适用于涉及高度不确定性的领域(如医疗、金融、自动驾驶)。
-
更高的泛化性能 : * 借助先验分布的引入,在模型中实现了自然地实施正则化措施,从而有效防止了模型发生过拟合现象。
-
小样本场景的适应性 :
- 利用
先验分布,在数据不足时仍能稳定预测。
- 利用
缺点
- 计算量大 :
-
后验分布的求解需要进行高维积分运算,这些近似方法往往需要较长的时间来完成计算。
-
实现复杂 :
- 需要掌握概率推断(如变分推断、采样)技术。
-
易受先验假设影响 :
先验分布选择不当可能导致模型性能下降。
-
6. 与经典神经网络的对比
| 特性 | 经典神经网络 | 贝叶斯神经网络 |
|---|---|---|
| 权重表示 | 固定值(点估计) | 概率分布 |
| 目标 | 最小化损失函数 | 近似后验分布 |
| 不确定性量化 | 不支持 | 支持 |
| 泛化能力 | 容易过拟合 | 更强 |
| 计算复杂度 | 较低 | 较高 |
7. 简单代码示例(PyTorch)
以下代码使用 PyTorch 实现一个简单的贝叶斯神经网络的框架。
import torch
import torch.nn as nn
import torch.optim as optim
from torch.distributions import Normal
# 定义贝叶斯线性层
class BayesianLinear(nn.Module):
def __init__(self, in_features, out_features):
super(BayesianLinear, self).__init__()
self.in_features = in_features
self.out_features = out_features
# 权重的均值和标准差参数
self.weight_mu = nn.Parameter(torch.zeros(out_features, in_features))
self.weight_logsigma = nn.Parameter(torch.zeros(out_features, in_features))
# 偏置的均值和标准差参数
self.bias_mu = nn.Parameter(torch.zeros(out_features))
self.bias_logsigma = nn.Parameter(torch.zeros(out_features))
def forward(self, x):
# 使用正态分布采样权重和偏置
weight_sigma = torch.exp(self.weight_logsigma)
bias_sigma = torch.exp(self.bias_logsigma)
weight_dist = Normal(self.weight_mu, weight_sigma)
bias_dist = Normal(self.bias_mu, bias_sigma)
weight_sample = weight_dist.rsample() # 重参数化采样
bias_sample = bias_dist.rsample()
return torch.nn.functional.linear(x, weight_sample, bias_sample)
# 定义一个简单的贝叶斯神经网络
class BayesianNN(nn.Module):
def __init__(self):
super(BayesianNN, self).__init__()
self.bayesian_layer = BayesianLinear(1, 1)
def forward(self, x):
return self.bayesian_layer(x)
# 示例训练(模拟数据)
model = BayesianNN()
optimizer = optim.Adam(model.parameters(), lr=0.01)
loss_fn = nn.MSELoss()
# 生成简单数据
x = torch.linspace(-3, 3, 100).view(-1, 1)
y = 2 * x + 3 + torch.randn_like(x) * 0.5 # 加噪声
for epoch in range(200):
optimizer.zero_grad()
outputs = model(x)
loss = loss_fn(outputs, y)
loss.backward()
optimizer.step()
if epoch % 20 == 0:
print(f"Epoch {epoch}: Loss = {loss.item()}")
代码解读
总结
贝叶斯神经网络通过构建权值的概率分布模型来表征模型对预测结果的置信度,在小样本学习和高风险决策任务中展现出卓越的效果。尽管计算开销较大,在实际应用中的广泛使用使其具有重要的实用价值
BNN 的目标是计算后验分布
贝叶斯神经网络(BNN)旨在推断后验概率密度 p(\mathbf{w} | \mathcal{D}),
这句话的核心在于:贝叶斯神经网络的目标不仅不仅仅局限于确定一个固定不变的权重值(点估计)。相反,在贝叶斯框架下,
模型通过概率分布的形式对参数进行建模,并且能够量化参数的不确定性。
这种区别主要体现在于贝叶斯方法与传统频率学派方法在理论基础和应用目标上的显著差异。
1. 经典神经网络与最大化似然估计
在经典的神经网络架构中, 权重 \mathbf{w} 被视为固定数值, 其核心目标在于系统地推导出能够充分解释数据的最佳参数组合 \mathbf{w}^*, 即:
\hat{\mathbf{w}} = \arg\max_{\omega} p(\mathcal{D}|{\omega}),
这一过程等价于最小化损失函数(如负对数似然):
\ell({\omega}) = - \ln p(\mathcal{D}|{\omega}.)
值得注意的是, 该方法仅致力于确定最佳权值配置而非其概率分布或不确定性
2. 贝叶斯神经网络的目标
从贝叶斯视角来看,在这一框架下我们将其视为\mathbf{w}的一个随机变量;而传统观点则将其视为固定的单一值。
该概率模型基于贝叶斯定理推导得出:
P(\theta|y) = \frac{P(y|\theta) P(\theta)}{\int P(y|\theta) P(\theta)d\theta}
其中所述的概率模型中涉及的主要变量包括参数向量\theta、条件概率分布P(y|\theta)以及边缘分布P(\theta)。
- 该概率密度函数 p(\mathcal{D}|\bm{\theta}) 代表了观测数据在特定参数设置下的可能性。
- 该先验概率分布 p(\bm{\theta}) 反映了在没有观测数据的情况下关于参数的知识。
- 边缘似然函数 p(\mathcal{D}) 通常难以直接计算;它通过将所有可能的参数值进行积分来求得:
p(\mathcal{D}) = \int p(\mathcal{D}|\bm{\theta}) p(\bm{\theta}) \, d\bm{\theta}.
3. 经典神经网络与贝叶斯神经网络的核心区别
- 经典方法:通过直接求取条件概率 p(\mathcal{D}|\mathbf{w}) 的最大值来获得参数 \mathbf{w} 的单一最佳估计值。
- 贝叶斯方法:在贝叶斯框架下推导出完整的后验概率分布 p(\mathbf{w}|\mathcal{D}) 来表征参数 \mathbf{w} 的不确定性程度。
4. 为什么不是最大化似然估计或最小化损失函数
贝叶斯神经网络的核心在于对不确定性的估计与建模。然而,在实际应用中,并非通过直接最大化似然函数或最小化损失函数来实现目标。相反地,在构建模型时会综合考虑数据特征和先验知识的提取。
-
联合建模数据和先验信息 :
- 在贝叶斯框架中,模型不仅依赖于数据 \mathcal{D} 的信息,还结合了权重的先验分布 p(\mathbf{w})。这使得模型能够
在数据不足或不确定性较高时,利用先验来补充信息。
- 在贝叶斯框架中,模型不仅依赖于数据 \mathcal{D} 的信息,还结合了权重的先验分布 p(\mathbf{w})。这使得模型能够
-
全分布优化 :
- 传统的最大化似然估计仅定位到单一最佳位置(single point optimum),而基于贝叶斯推断的方法则全面考察后验概率分布(posterior probability distribution),系统性提取均值(mean)、方差(variance)等高级统计特征,并有效评估权重存在不确定性(uncertainty)和多变性的可能性。
例如:
- 最大似然估计能够揭示预测结果为 0.9 ,但无法评估其可信度。
- 贝叶斯后验概率分布则可进一步量化预测的不确定性;例如预估结果可能在 [0.85, 0.95] 范围内。
5. 贝叶斯神经网络的优化目标
由于手动计算后验分布 p(\mathbf{w}|\mathcal{D}) 具有挑战性,且边际似然 p(\mathcal{D}) 涉及高维积分这一复杂运算。然而,通过变分推断或采样技术 ,我们可以有效地接近地逼近后验分布。
变分推断通过引入一个较为容易处理的分布q(w|\theta)来近似复杂的后验分布p(w|D);我们的优化目标是使这两个分布之间的KL散度最小化;具体而言,在展开上述公式后,则我们的目标转化为最大化一个新的下界——
这公式包含两个部分:
- 数据似然项(
模型拟合性能)。 - 复杂度项(
近似分布与先验分布的差异)。
6. 实际意义:后验分布的好处
量化不确定性 :
贝叶斯方法同时生成预测值并表征其变异性(例如预测值的分布)。
在高风险场景(如医疗、自动驾驶)中尤为重要。
对于这些领域而言,在不确定条件下实现准确性和可靠性至关重要。
数据效率高 :
* 利用先验信息,贝叶斯方法可以`在小样本场景下提供稳健的预测`。
避免过拟合 :
贝叶斯框架内在地实现了正则化机制, 因为其通过先验分布 p(\mathbf{w}) 约束了参数空间的扩展.
总结
贝叶斯神经网络旨在通过捕捉权重参数的真实后验分布 p(\mathbf{w}|\mathcal{D}) 来实现对模型参数的概率推断,在这一过程中能够有效提升模型的解释能力和鲁棒性。
相比之下,在传统统计框架下使用的经典神经网络方法主要关注于确定权重点估计值(通常基于最大似然或损失最小化原则),而贝叶斯方法则提供了一种自然的方式来进行预测不确定性建模和推理。
这种差异使得贝叶斯神经网络在处理小样本学习和不确定性量化方面展现出显著的优势。
Bayes by Backprop
Bayes by Backprop (简称BBB)是将贝叶斯推断与深度学习中的反向传播相结合的一种算法。它主要针对神经网络参数展开贝叶斯估计工作,以量化其不确定性程度。具体而言,在这一过程中,该方法通过优化变分下界来近似计算后验分布。
1. Bayes by Backprop 的目标
Bayes by Backprop 使用变分推断 来近似后验分布,具体目标是:
- 构建一个易于处理的概率分布q(\mathbf{w}|\boldsymbol{\theta})以便近似后验概率p(\mathbf{w}|\mathcal{D});
- 通过最大化变分下界(即最小化其负值),寻求最大地逼近q(\mathbf{w}|\boldsymbol{\theta})与p(\mathbf{w}|\mathcal{D})之间的差异。
通过反向传播算法对变分下界进行求解优化这正是 **Bayes by Backprop** 所采用的核心思路
2. Bayes by Backprop 的实现细节
通过参数化的方法近似后验分布
重参数化技术
该方法用于计算 \mathbb{E}_{q(\mathbf{w}|\boldsymbol{\theta})}[\cdot] 的梯度时会遇到挑战;为此我们采用重参数化技术来实现:
\mathbf{w} = \mu + \sigma \cdot \boldsymbol{\epsilon}, 其中 \boldsymbol{\epsilon} 服从标准正态分布 \mathcal{N}(0, 1);从而使得随机采样过程得以实现并转化为可微分的计算过程。
目标函数
整体优化目标是通过最小化以下负对数似然实现:
\mathcal{L}(\boldsymbol{\theta}) = \mathrm{KL}(q(\mathbf{w}|\boldsymbol{\theta}) \| p(\mathbf{w})) - \frac{1}{N} \sum_{i=1}^N \log p(y_i|f(x_i, \mathbf{w})),
其中 f(x_i, \mathbf{w}) 表示模型预测结果。
反向传播
利用自动微分库(例如 PyTorch 和 TensorFlow)完成梯度的计算,并对模型中的参数 \boldsymbol{\theta} 进行调整以进行优化。
总结
Bayes by Backprop 主要代表了一种将贝叶斯推断引入深度学习的方法,
它主要依靠变分推断将权重的后验分布近似为可优化的形式,并结合反向传播来进行优化。
尽管计算上较为复杂,
其在量化不确定性及提升模型鲁棒性方面展现出显著的优势。
经典神经网络优化的例子
使用均方根误差优化
假设有一个简单的回归场景:估计 y = 2x + 3 的函数关系。在经典的神经网络架构中采用一个神经网络来拟合该函数;其权重 \mathbf{w} 将通过最小化误差(例如均方误差)来进行优化。
代码实现
以下代码展示了一个经典神经网络的实现,用于拟合线性关系 y = 2x + 3。
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
# 生成简单的线性数据
torch.manual_seed(42)
x = torch.linspace(-10, 10, 100).unsqueeze(1) # 输入
y = 2 * x + 3 + torch.randn(x.size()) * 2 # 目标值,加一些噪声
# 定义简单的线性神经网络
class LinearModel(nn.Module):
def __init__(self):
super(LinearModel, self).__init__()
self.linear = nn.Linear(1, 1) # 输入1维,输出1维
def forward(self, x):
return self.linear(x)
# 初始化模型、损失函数和优化器
model = LinearModel()
criterion = nn.MSELoss() # 均方误差
optimizer = optim.SGD(model.parameters(), lr=0.01) # 随机梯度下降
# 训练模型
epochs = 200
losses = []
for epoch in range(epochs):
model.train() # 设置模型为训练模式
optimizer.zero_grad() # 清零梯度
outputs = model(x) # 前向传播
loss = criterion(outputs, y) # 计算损失
loss.backward() # 反向传播计算梯度
optimizer.step() # 更新权重
losses.append(loss.item()) # 记录损失
if (epoch + 1) % 20 == 0:
print(f"Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.4f}")
# 查看模型的权重和偏置
print("Learned parameters:")
for name, param in model.named_parameters():
print(f"{name}: {param.data.numpy()}")
# 绘制结果
model.eval() # 设置模型为评估模式
with torch.no_grad():
y_pred = model(x)
plt.scatter(x.numpy(), y.numpy(), label="True Data")
plt.plot(x.numpy(), y_pred.numpy(), color="red", label="Predicted Line")
plt.legend()
plt.show()
代码解读
代码解释
-
数据采样*:输入数据 x 均匀分布在区间 [-10, 10] 内,并选取了100个样本点。
- 输出生成*:对于每个输入样本 x_i,输出值由线性模型 y = 2x + 3 决定,并通过添加随机噪声项模拟实际观测值的不确定性。
模型定义 使用PyTorch库中的nn.Linear(1, 1)构建了一个输入和输出空间均为一维的空间。
-
这一层网络仅包含一个权重参数和一个偏置参数,并且这些参数在初始化时采用随机数值。
优化过程 * 其中采用均方误差(MSE)这一指标作为损失函数用于评估预测值与实际观测值之间的差异程度。 * 同时通过随机梯度下降(SGD)优化器对模型参数进行迭代更新。
模型训练的核心任务 旨在系统性地优化参数\mathbf{w}和\mathbf{b}以实现均方误差的最小化。
结果输出 * 打印最终学到的权重和偏置,绘制拟合结果。

对比 Bayes by Backprop
在经典神经网络架构中,默认权重被视为单一数值(即单点估计),其优化过程对应一个特定的解。然而,在采用Bayes by Backprop方法时,默认权重被视为随机变量,并通过确定这些变量的关键参数(如均值与方差)来进行建模。这种做法不仅有助于表征模型的置信度,还特别适合量化预测不确定性。
使用最大化似然估计优化
最大似elihood估計(MLE, Maximum Likelihood Estimé)被廣泛應用於統計領域的一種經典方法。其目標是通過調整參數θ來使觀測數據出hd现的概率最大hdiz化。在神經網路模型中,最小化Negative Log-Likelihood損失函數等價於執行Maximum Probability Estimé tasks。
设想我们拥有一组数据 D ,其中每个样本具有两个特征维度 x_i ,其标签属于二元集合 \{0, 1\} 。为了实现分类目标 ,我们需要设计一个神经网络模型来进行分类任务 。该模型将通过优化过程中的最大似然估计方法确定其参数设置 ,从而实现对未知测试样本的有效分类 。
代码实现
from sklearn.datasets import make_classification
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
# 生成简单的二分类数据
torch.manual_seed(42)
X, y = make_classification(
n_samples=200,
n_features=2, # 总特征数
n_informative=2, # 有用的特征数
n_redundant=0, # 冗余特征数
n_repeated=0, # 重复特征数
n_classes=2,
n_clusters_per_class=1,
random_state=42
)
X = torch.tensor(X, dtype=torch.float32)
y = torch.tensor(y, dtype=torch.long) # 标签需要是整数
# 定义神经网络
class SimpleClassifier(nn.Module):
def __init__(self):
super(SimpleClassifier, self).__init__()
self.fc = nn.Linear(2, 2) # 输入2维,输出2个类别的分数
def forward(self, x):
return self.fc(x)
# 初始化模型、损失函数和优化器
model = SimpleClassifier()
criterion = nn.CrossEntropyLoss() # 使用交叉熵损失,等价于负对数似然
optimizer = optim.SGD(model.parameters(), lr=0.1)
# 训练模型
epochs = 100
losses = []
for epoch in range(epochs):
model.train() # 设置模型为训练模式
optimizer.zero_grad() # 清零梯度
outputs = model(X) # 前向传播
loss = criterion(outputs, y) # 计算损失
loss.backward() # 反向传播计算梯度
optimizer.step() # 更新权重
losses.append(loss.item()) # 记录损失
if (epoch + 1) % 10 == 0:
print(f"Epoch [{epoch + 1}/{epochs}], Loss: {loss.item():.4f}")
# 绘制分类结果
model.eval() # 设置模型为评估模式
with torch.no_grad():
logits = model(X)
predictions = torch.argmax(logits, dim=1)
plt.scatter(X[:, 0], X[:, 1], c=y, cmap="viridis", label="True Labels", alpha=0.5)
plt.scatter(X[:, 0], X[:, 1], c=predictions, cmap="coolwarm", marker="x", label="Predicted Labels", alpha=0.8)
plt.legend()
plt.title("True Labels vs Predicted Labels")
plt.show()
代码解读
代码解释
1. 数据生成
- 基于
make_classification创建二维分类数据集。 - 其中每一类的数据点均遵循高斯分布。
- 对于输入样本 X 来说是一个二维向量。
- 其取值范围限定为二元标签 {0,1}。
2. 模型定义
- 采用了单一层的全连接神经网络结构。
- 其输出为两个类别对应的无量纲指标值。
3. 损失函数
采用CrossEntropyLoss方法进行评估时,则其计算方式基于以下公式:
\text{Loss} = - \frac{1}{N} \sum_{i=1}^N \log p(y_i | x_i, \mathbf{w}),,
其中p(y_i | x_i, w) = ... 表示第i个样本属于类别的概率。
4. 优化器
采用随机梯度下降(SGD)算法以优化神经网络模型中的权重参数;具体而言, 该方法旨在寻求最大化观测数据的可能性(同时也可以通过最小化其负对数可能性来实现)。
5. 训练过程
- 前馈传播:完成每个样本的类别分数推导。
- 损失评估:基于真实标签 y 和预测的概率分布确定损失函数值。
- 反向传递:推导出梯度值,并相应地调整模型参数以最小化损失函数。
6. 可视化分类结果
- 绘制分类边界,比较真实标签和预测标签。

MLE如何在此应用
- MLE的主要目标是通过最大化数据的似然值来优化模型参数:
\max_{\mathbf{w}} \prod_{i=1}^N p(y_i | x_i, \mathbf{w}),
这与最小化对数概率的负值等价:
\min_{\mathbf{w}} -\sum_{i=1}^N \log p(y_i | x_i, \mathbf{w}).- 从代码实现的角度来看,
CrossEntropyLoss正是用于实现这一目标的损失函数。
- 从代码实现的角度来看,
对比 Bayes by Backprop
经典神经网络(MLE) :
* 参数是点估计,找到一个固定值。
* 假设数据中没有显式的不确定性。
Bayes by Backprop :
* 参数是概率分布,建模权重的不确定性。
* 提供预测结果的不确定性量化。
