blitz-bayesian-deep-learning
blitz-bayesian-deep-learning(简称 BLiTZ)是一个专为 PyTorch 设计的轻量级开源库,旨在帮助开发者轻松构建贝叶斯神经网络。与传统神经网络只能输出单一预测值不同,BLiTZ 通过引入概率分布来模拟权重的不确定性,使模型不仅能给出预测结果,还能提供该结果的置信区间。
这一特性有效解决了传统深度学习模型在面临噪声数据或分布外样本时“过度自信”的问题。例如在金融交易或医疗诊断等高风险场景中,知道预测值的可靠范围往往比单纯的数值估计更具决策价值。BLiTZ 基于经典的“神经网络权重不确定性”理论,允许用户在几乎不改变原有 PyTorch 代码结构的前提下,将普通网络层替换为贝叶斯层,并自动计算模型复杂度的代价函数,从而简化了训练流程。
该工具特别适合需要评估模型不确定性的 AI 研究人员、数据科学家以及希望提升模型鲁棒性的深度学习开发者。其核心亮点在于高度的可扩展性与易用性:用户既可以快速上手进行回归或分类任务,也能通过其核心的权重采样类自定义更复杂的网络结构。如果你希望在保持 PyTorch 原生开发体验的同时,为模型增添“自知之明”,BLiTZ 是一个值得尝试的专业选择。
使用场景
某量化交易团队正在构建基于深度学习的股价趋势预测模型,旨在为高频交易决策提供数据支撑。
没有 blitz-bayesian-deep-learning 时
- 模型仅能输出单一的点估计值(如“预计上涨 2.5%"),无法告知该预测的可信程度,交易员难以判断是否值得下注。
- 面对市场剧烈波动或罕见数据(分布外样本),传统神经网络往往盲目自信地给出错误预测,导致严重的资金回撤。
- 若要手动实现贝叶斯神经网络以获取不确定性,需从零推导变分推断公式并重写反向传播逻辑,开发周期长达数周且极易出错。
- 缺乏对模型复杂度成本的原生支持,难以在预测精度与模型过拟合风险之间找到最佳平衡点。
使用 blitz-bayesian-deep-learning 后
- 直接调用库中的贝叶斯层替换标准 PyTorch 层,模型不仅能预测股价,还能输出置信区间(如"95% 概率上涨 1%-4%"),让交易策略更具鲁棒性。
- 利用权重采样机制,模型在面对异常市场数据时会自动扩大预测方差,提示交易员“当前预测不可靠”,从而触发风控机制避免盲目操作。
- 无需修改现有训练循环架构,仅需几行代码即可集成不确定性估算,将原本数周的算法验证工作缩短至几天。
- 内置的复杂度成本函数可自动计算并优化变分下界,帮助团队快速筛选出既准确又不过度复杂的轻量级交易模型。
blitz-bayesian-deep-learning 的核心价值在于让开发者能以极简的代码成本,将“知其然”的点预测升级为“知其所以然”的概率决策,显著提升 AI 在高风险场景下的可靠性。
运行环境要求
未说明
未说明

快速开始
Blitz - Torch Zoo 中的贝叶斯层
BLiTZ 是一个简单且可扩展的库,用于在 PyTorch 上构建贝叶斯神经网络层(基于《神经网络中的权重不确定性》论文中提出的方案)。通过使用 BLiTZ 的层和工具,您可以以一种不会影响各层之间交互的方式,轻松地为模型添加不确定性并计算复杂度代价,就像使用标准 PyTorch 一样。
借助我们核心的权重采样器类,您可以扩展和完善此库,以更广泛地为各种层引入不确定性,并且这些操作将与 PyTorch 完美集成。我们也欢迎贡献代码!
目录
安装
要安装 BLiTZ,您可以使用 pip 命令:
pip install blitz-bayesian-pytorch
或者通过 conda:
conda install -c conda-forge blitz-bayesian-pytorch
您也可以通过 git 克隆并在本地使用 pip 安装:
conda create -n blitz python=3.9
conda activate blitz
git clone https://github.com/piEsposito/blitz-bayesian-deep-learning.git
cd blitz-bayesian-deep-learning
pip install .
文档
关于我们层、权重(及先验分布)采样器和工具的文档:
回归任务的简单示例
(您可以在自己的机器上运行 这个示例 来亲自体验)。
接下来我们将展示如何利用贝叶斯深度学习进行回归任务,从而为每个数据点预测一个置信区间,而不是单一的连续值预测。为预测结果提供置信区间,有时甚至比低误差的精确估计更有用。
我的理由是,在某些情况下,拥有一个高置信度的区间范围,往往能帮助我们做出比非常接近真实值的估计更为可靠的决策:例如,在进行交易操作时,如果能够知道价格至少会在某个特定范围内波动,就能判断这笔交易是否会带来收益或损失。了解某个数值是否一定会落在某个区间内,对于需要谨慎决策的场景来说,可能比一个非常接近但可能超出界限的精确估计更有价值。关键在于,有时候知道“是否有收益”本身可能比精确衡量收益大小更重要。
为了证明这一点,我们将使用 Boston-house-data 这个玩具数据集,构建一个贝叶斯神经网络回归器,尝试为待预测房价生成置信区间。我们将对数据进行标准化处理,置信区间的置信度设为 75%。有趣的是,我们会发现大约 90% 的预测置信区间要么低于上限,要么高于下限。
导入必要的模块
除了常用的模块外,我们还将从 BLiTZ 库中引入 variational_estimator 装饰器,它可以帮助我们在保持与 PyTorch 完全兼容的同时处理 BayesianLinear 层;当然,还有我们的核心层——具有权重不确定性的 BayesianLinear。
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import numpy as np
from blitz.modules import BayesianLinear
from blitz.utils import variational_estimator
from sklearn.datasets import load_boston
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
加载并标准化数据
这里没有什么新内容,我们只是加载数据并对其进行标准化处理,以便更好地进行训练。
X, y = load_boston(return_X_y=True)
X = StandardScaler().fit_transform(X)
y = StandardScaler().fit_transform(np.expand_dims(y, -1))
X_train, X_test, y_train, y_test = train_test_split(X,
y,
test_size=.25,
random_state=42)
X_train, y_train = torch.tensor(X_train).float(), torch.tensor(y_train).float()
X_test, y_test = torch.tensor(X_test).float(), torch.tensor(y_test).float()
创建我们的变分回归器类
我们可以像构建任何 PyTorch 网络一样,通过继承 nn.Module 来创建我们的类。装饰器为我们提供了处理贝叶斯特性的方法,例如计算贝叶斯层的复杂度代价,以及执行多次前向传播(每次采样不同的权重)来估计损失。
@variational_estimator
class BayesianRegressor(nn.Module):
def __init__(self, input_dim, output_dim):
super().__init__()
#self.linear = nn.Linear(input_dim, output_dim)
self.blinear1 = BayesianLinear(input_dim, 512)
self.blinear2 = BayesianLinear(512, output_dim)
def forward(self, x):
x_ = self.blinear1(x)
x_ = F.relu(x_)
return self.blinear2(x_)
定义置信区间评估函数
该函数为我们尝试对标签值进行采样的批次上的每个预测创建一个置信区间。然后,我们可以通过计算预测分布中有多少确实包含了数据点的正确标签来衡量预测的准确性。
def evaluate_regression(regressor,
X,
y,
samples = 100,
std_multiplier = 2):
preds = [regressor(X) for i in range(samples)]
preds = torch.stack(preds)
means = preds.mean(axis=0)
stds = preds.std(axis=0)
ci_upper = means + (std_multiplier * stds)
ci_lower = means - (std_multiplier * stds)
ic_acc = (ci_lower <= y) * (ci_upper >= y)
ic_acc = ic_acc.float().mean()
return ic_acc, (ci_upper >= y).float().mean(), (ci_lower <= y).float().mean()
创建回归器并加载数据
请注意,我们在这里创建 BayesianRegressor 的方式与其他神经网络相同。
regressor = BayesianRegressor(13, 1)
optimizer = optim.Adam(regressor.parameters(), lr=0.01)
criterion = torch.nn.MSELoss()
ds_train = torch.utils.data.TensorDataset(X_train, y_train)
dataloader_train = torch.utils.data.DataLoader(ds_train, batch_size=16, shuffle=True)
ds_test = torch.utils.data.TensorDataset(X_test, y_test)
dataloader_test = torch.utils.data.DataLoader(ds_test, batch_size=16, shuffle=True)
主训练和评估循环
我们的训练循环与普通的 PyTorch 训练循环唯一的不同之处在于,其损失是通过 sample_elbo 方法进行采样的。其他部分都可以正常进行,因为 BLiTZ 的目的就是让你在使用不同的贝叶斯神经网络时,能够更轻松地迭代数据,而无需担心复杂性。
以下是我们的简单训练循环:
iteration = 0
for epoch in range(100):
for i, (datapoints, labels) in enumerate(dataloader_train):
optimizer.zero_grad()
loss = regressor.sample_elbo(inputs=datapoints,
labels=labels,
criterion=criterion,
sample_nbr=3)
loss.backward()
optimizer.step()
iteration += 1
if iteration%100==0:
ic_acc, under_ci_upper, over_ci_lower = evaluate_regression(regressor,
X_test,
y_test,
samples=25,
std_multiplier=3)
print("CI acc: {:.2f}, CI upper acc: {:.2f}, CI lower acc: {:.2f}".format(ic_acc, under_ci_upper, over_ci_lower))
print("Loss: {:.4f}".format(loss))
贝叶斯深度学习简述
快速解释一下如何在贝叶斯神经网络中引入不确定性,以及我们如何对其损失进行建模,以便客观地提高预测的置信度并减少方差,而无需使用 Dropout 技术。
首先,确定性神经网络层的线性变换
如我们所知,在确定性的(非贝叶斯)神经网络层中,可训练参数直接对应于其前一层(或输入层,如果是第一层的话)线性变换中使用的权重。这可以用以下公式表示:
}&space;=&space;W^{(i+1)}\cdot&space;z^{(i)}&space;+&space;b^{(i+1)})
(Z 表示第 i 层的激活输出)
贝叶斯层的目的
贝叶斯层旨在通过在每次前向传播时从由可训练变量参数化的分布中采样权重,从而在其权重中引入不确定性。
这样做的好处不仅在于优化模型的性能指标,还在于可以收集网络对特定数据点预测的不确定性(通过多次采样并测量分散程度),并尽可能地减少网络预测的方差,从而让我们了解在基于特定数据点进行建模时,我们对标签仍然有多少不确定性。
贝叶斯层中的权重采样
为此,在每次前向传播时,我们会使用以下公式对线性变换的参数进行采样(其中 ρ 参数化标准差,μ 参数化样本线性变换参数的均值):
对于权重:
}_{(n)}&space;=&space;\mathcal{N}(0,1)&space;*&space;log(1&space;+&space;\rho^{(i)}&space;)&space;+&space;\mu^{(i)})
其中采样的 W 对应于第 i 层在第 n 次采样时用于线性变换的权重。
对于偏置:
}_{(n)}&space;=&space;\mathcal{N}(0,1)&space;*&space;log(1&space;+&space;\rho^{(i)}&space;)&space;+&space;\mu^{(i)})
其中采样的 b 对应于第 i 层在第 n 次采样时用于线性变换的偏置。
可以优化我们的可训练权重
尽管我们的权重和偏置带有随机乘数,但我们仍然可以通过给定一个关于采样权重和可训练参数的可微分函数(在本例中为损失),然后对该函数分别对这两个参数求导来优化它们:
- 设
) - 设
) - 设
&space;*&space;\epsilon) - 设
) 关于其变量可微分
因此:
以及
同样地,也存在一种复杂度代价函数,其对各变量可导。
众所周知,交叉熵损失(以及均方误差)都是可导的。因此,如果我们证明存在一种可导的复杂度代价函数,就可以让我们的框架自动求导并计算优化步骤中的梯度。
复杂度代价是在前向传播过程中,由每个贝叶斯层分别计算得出的(基于预先定义的较简单先验分布及其经验分布)。各层的复杂度代价之和会被累加到总损失中。
正如《神经网络中的权重不确定性》论文所提出的,我们可以通过计算该分布与一个更简单的分布之间的KL散度来获取分布的复杂度代价,并通过一些近似处理,使这一函数能够对其变量(即各个分布)求导:
- 设
) 为人工设定的低熵分布的概率密度函数,将其视为权重的“先验”分布。 - 设
) 为我们采样的权重在给定参数下的后验经验分布的概率密度函数。
因此,对于采样矩阵 W 中的每一个标量:
&space;\lVert&space;{P}(w)&space;)&space;=&space;\lim_{n\to\infty}1/n\sum_{i=0}^{n}&space;{Q}(w^{(i)}&space;|&space;\theta)*&space;(\log{{Q}(w^{(i)}&space;|&space;\theta)}&space;-&space;\log{{P}(w^{(i)})}&space;))
假设 n 非常大时,我们可以近似得到:
&space;\lVert&space;{P}(w)&space;)&space;=&space;1/n\sum_{i=0}^{n}&space;{Q}(w^{(i)}&space;|&space;\theta)*&space;(\log{{Q}(w^{(i)}&space;|&space;\theta)}&space;-&space;\log{{P}(w^{(i)})}&space;))
从而有:
&space;\lVert&space;{P}(w)&space;)&space;=&space;\mu_Q&space;*\sum_{i=0}^{n}&space;(\log{{Q}(w^{(i)}&space;|&space;\theta)}&space;-&space;\log{{P}(w^{(i)})}&space;))
由于 Q 分布的期望值(均值)只是对数值进行缩放,因此可以将其从表达式中提取出来(因为不会影响框架的梯度追踪)。于是,第 n 个样本的复杂度代价为:
}&space;(w^{(n)},&space;\theta)&space;}&space;=&space;(\log{{Q}(w^{(n)}&space;|&space;\theta)}&space;-&space;\log{{P}(w^{(n)})}&space;))
该表达式对其所有参数均可导。
要得到第 n 个样本的完整代价函数:
- 设性能(拟合数据)函数为:
}&space;(w^{(n)},&space;\theta)})
因此,第 n 个权重样本的完整代价函数为:
}&space;(w^{(n)},&space;\theta)&space;}&space;=&space;{C^{(n)}&space;(w^{(n)},&space;\theta)&space;}&space;+&space;{P^{(n)}&space;(w^{(n)},&space;\theta)&space;})
我们可以通过蒙特卡洛采样来估计真实的完整代价函数(即多次前向传播网络并取总损失的平均值),然后使用该估计值进行反向传播。这种方法即使每次反向传播只进行少量实验,甚至只进行一次实验,也同样有效。
一些说明与总结
至此,《贝叶斯深度学习概览》教程就告一段落了。了解了这里的内容后,您可以根据自己的需求实现贝叶斯神经网络模型。
例如,您可以在每次采样时执行一次优化步骤,或者采用这种类似蒙特卡洛的方法多次收集损失、取其平均值后再进行优化。一切由您决定。
温馨提示:我们的贝叶斯层及工具类会在每次前向传播时自动计算各层的复杂度代价,因此您无需过多关注这一点。
参考文献:
引用方式
如果您在研究中使用了 BLiTZ,可以按如下方式引用:
@misc{esposito2020blitzbdl,
author = {皮耶罗·埃斯波西托},
title = {BLiTZ - Torch Zoo 中的贝叶斯层(一个面向 Torch 的贝叶斯深度学习库)},
year = {2020},
publisher = {GitHub},
journal = {GitHub 仓库},
howpublished = {\url{https://github.com/piEsposito/blitz-bayesian-deep-learning/}},
}
制作:皮耶罗·埃斯波西托
版本历史
0.2.82022/04/150.2.72020/11/280.2.62020/11/220.2.52020/07/010.2.32020/05/250.2.12020/05/20常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器
