贝叶斯神经网络¶
隐藏层¶
- class HiddenLayer(X=None, A_mean=None, A_scale=None, non_linearity=<function relu>, KL_factor=1.0, A_prior_scale=1.0, include_hidden_bias=True, weight_space_sampling=False)[source]¶
这种分布是贝叶斯神经网络中的一个基本构建块。它代表一个单一的隐藏层,即对一组输入X进行仿射变换后应用非线性。权重的不确定性通过由参数A_scale和A_mean指定的正态变分分布进行编码。所谓的“局部重参数化技巧”用于减少方差(见下文参考)。实际上,这意味着权重从不直接采样;相反,在预激活空间(即在应用非线性之前)进行采样。由于权重从不直接采样,当这种分布在变分推理的上下文中使用时,必须注意正确缩放与权重矩阵对应的KL散度项。这个项被折叠到这个分布的log_prob方法中。
实际上,这个分布编码了以下生成过程:
A ~ 正态分布(A_mean, A_scale) 输出 ~ 非线性(AX)
- Parameters
X (torch.Tensor) – B x D 维度的输入小批量
A_mean (torch.Tensor) – D x H 维度的权重均值
A_scale (torch.Tensor) – D x H 维(对角协方差矩阵) 指定权重不确定性
non_linearity (callable) – 一个可调用对象,用于指定使用的非线性函数。默认为ReLU。
KL_factor (float) – KL散度的缩放因子。通常 这等于小批量的大小除以 整个数据集的大小。默认为 1.0。
A_prior (float 或 torch.Tensor) – 假设权重的先验是均值为零且比例因子为 A_prior 的正态分布。默认值为 1.0。
include_hidden_bias (bool) – 控制是否应该在激活中增加一个1,这可以用于包含偏置项。默认为 True。
weight_space_sampling (bool) – 控制是否使用局部重参数化技巧。这仅用于内部测试。默认为 False。
参考:
Kingma, Diederik P., Tim Salimans, 和 Max Welling. “变分丢弃和局部重参数化技巧.” 神经信息处理系统进展. 2015.