贝叶斯神经网络
贝叶斯神经网络(Bayesian Neural Network,BNN)是一类结合了贝叶斯推断与神经网络的模型。它的核心思想是:不像传统神经网络那样学习固定的参数值(即网络权重),BNN 会学习这些参数的概率分布。这样可以更好地量化不确定性,提高模型在不确定环境下的鲁棒性。
🔧 传统神经网络 vs 贝叶斯神经网络
特点 | 传统神经网络 | 贝叶斯神经网络 |
---|---|---|
参数(权重) | 固定值(点估计) | 概率分布 |
输出 | 单值预测 | 预测分布 |
不确定性表示 | 没有或依赖于 dropout 等近似方法 | 内在地建模参数和预测的不确定性 |
优点 | 高效、易训练 | 不确定性建模、可避免过拟合 |
缺点 | 不提供置信度 | 推理成本高、训练复杂 |
🧠 BNN 的核心思想
BNN 采用贝叶斯公式:
P ( θ ∣ D ) = P ( D ∣ θ ) P ( θ ) P ( D ) P(\theta | D) = \frac{P(D | \theta) P(\theta)}{P(D)} P(θ∣D)=P(D)P(D∣θ)P(θ)
其中:
- θ \theta θ:模型参数(如网络权重)
- P ( θ ) P(\theta) P(θ):先验分布
- P ( D ∣ θ ) P(D|\theta) P(D∣θ):似然函数
- P ( θ ∣ D ) P(\theta|D) P(θ∣D):后验分布
我们不再学习一个确定的 θ \theta θ,而是学习其后验分布。
🔁 推理过程
由于后验分布一般不可解析,BNN 常用近似推理方法:
常见推理方法包括:
变分推断(Variational Inference)
用一个简单的分布 q ( θ ) q(\theta) q(θ) 去近似真实的后验分布 P ( θ ∣ D ) P(\theta | D) P(θ∣D)。马尔可夫链蒙特卡洛(MCMC)采样
精度高但计算开销大。贝叶斯 dropout(Monte Carlo Dropout)
在测试时启用 dropout 多次,近似后验采样,简单有效。
✅ BNN 的优势
- 提供预测的不确定性(例如医疗、自动驾驶中的决策更可靠)
- 抑制过拟合(通过先验正则)
- 可与主动学习、强化学习等结合良好
🚫 挑战
- 训练成本高(需要估计后验分布)
- 模型复杂度增加
- 推理速度慢于传统网络
🧪 PyTorch 中的 BNN 示例(简化版)
import torch
import torch.nn as nn
import torch.nn.functional as F
class BayesianLinear(nn.Module):
def __init__(self, in_features, out_features):
super().__init__()
self.w_mu = nn.Parameter(torch.Tensor(out_features, in_features).normal_(0, 0.1))
self.w_logvar = nn.Parameter(torch.Tensor(out_features, in_features).normal_(-3, 0.1))
def forward(self, x):
epsilon = torch.randn_like(self.w_mu)
w_sample = self.w_mu + torch.exp(0.5 * self.w_logvar) * epsilon
return F.linear(x, w_sample)
# 用法类似普通神经网络
📚 推荐资源
论文:《Weight Uncertainty in Neural Networks》(Blundell et al., 2015)
库:
- Pyro(PyTorch 上的概率编程框架)
- TensorFlow Probability
- Bayes-by-Backprop
分形神经网络
分形神经网络(Fractal Neural Network, FNN)是一类受自然界分形结构启发的神经网络结构。它的核心理念是:通过自相似(self-similar)结构来构建深度网络,以提高模型的表达能力和泛化能力,同时缓解梯度消失或爆炸等深度网络中的常见问题。
🧠 什么是分形结构?
在数学中,分形(Fractal)是具有自相似性的结构——整体与局部在形态上是相似的。例如:雪花、费尔南德斯三角形、树木、血管等自然结构。
🔧 分形神经网络的核心结构
分形神经网络中,一个典型的模块通过递归组合更小的网络结构来构造大网络,如图:
F(C) = [F(C), F(C)] + C
这意味着:一个大的网络由多个小网络的组合构成,且每个小网络结构和大的结构是一样的(递归自我复制)。
🎯 举例:FractalNet(ICLR 2017)
FractalNet 是一个代表性的分形神经网络架构,由德国波恩大学提出。其特点是:
- 多个路径、不同深度:网络中的每个分支代表一个不同深度的子网络
- 自相似结构:使用统一的模块递归构建
- drop-path 正则化:训练时随机丢弃某些路径,防止过拟合并增强鲁棒性
🏗️ 构造原理
一个深度为 n
的 Fractal Block 定义为:
F n ( x ) = Concat ( F n − 1 ( F n − 1 ( x ) ) , F n − 1 ( x ) ) F_{n}(x) = \text{Concat}(F_{n-1}(F_{n-1}(x)), F_{n-1}(x)) Fn(x)=Concat(Fn−1(Fn−1(x)),Fn−1(x))
其中 F_0
是基础卷积模块。
每一层都由前面层的重复结构构建,最终形成“树状结构”。
✅ 优势
优势 | 说明 |
---|---|
多路径学习 | 类似 ResNet 的跳跃连接,多个深度路径并行 |
稀疏激活 | 每个样本可能只激活部分路径,形成类似 ensemble 效果 |
容易训练 | 由于浅层路径存在,梯度传导不再依赖太深的网络 |
自动选择路径 | drop-path 类似强化学习中的 policy sampling,可自动选择最优深度 |
🧪 FractalNet 的 PyTorch 伪代码结构
class FractalBlock(nn.Module):
def __init__(self, conv, depth):
super().__init__()
self.depth = depth
if depth == 1:
self.block = conv()
else:
self.left = FractalBlock(conv, depth-1)
self.right = FractalBlock(conv, depth-1)
def forward(self, x):
if self.depth == 1:
return self.block(x)
else:
left = self.left(self.left(x))
right = self.right(x)
return (left + right) / 2
你可以将 conv()
替换为任意的 CNN 层模块。
🤔 分形神经网络 vs ResNet vs DenseNet
特性 | ResNet | DenseNet | FractalNet |
---|---|---|---|
跳跃连接 | 是 | 是 | 是(结构性) |
多路径结构 | 否 | 否 | 是 |
自动路径选择 | 否 | 否 | 是(drop-path) |
模块构造方式 | 手动 | 累积连接 | 递归分形构造 |
📚 推荐资源
- 论文:FractalNet: Ultra-Deep Neural Networks without Residuals
- 视频讲解:[YouTube 搜索 “FractalNet Explained”]
- PyTorch实现示例:[GitHub 上搜索 “FractalNet PyTorch”]
如果你想我为你:
- 画出 FractalNet 的结构图
- 写一个完整的 FractalNet 网络代码
- 分析它在图像分类或NLP中的表现