高斯过程与神经网络结合及相关练习解析
立即解锁
发布时间: 2025-08-31 01:48:33 阅读量: 18 订阅数: 22 AIGC 


贝叶斯优化实战入门
### 高斯过程与神经网络结合及相关练习解析
#### 高斯过程与神经网络结合
将高斯过程(GP)与神经网络结合,能有效处理结构化数据。以下是结合模型的具体分析及优势:
```python
with torch.no_grad():
mean_preds = model(test_x).mean
print(torch.mean(torch.abs(mean_preds - test_y)))
```
输出结果为 `0.8524129986763`,这表明平均预测误差约为 0.85,相较于之前的普通 GP(平均绝对误差约为 2.7)有显著提升。这种提升体现了结合模型的优越性能,得益于神经网络强大的灵活建模能力。
该框架不仅适用于手写数字识别,还能处理多种结构化数据,如其他类型的图像、分子和蛋白质等图结构数据。我们只需定义合适的深度学习架构,从这些结构化数据中提取特征,再将其传递给 GP 的均值函数和核函数即可。
结构化数据的特征需满足特定约束,如为整数或非负,不能视为连续的实值数据。常见应用中的图像、药物发现中的蛋白质结构等都属于结构化数据。这类数据对 GP 的常见核函数提出了挑战,因为这些核函数仅考虑输入数据的数值,而这些数值可能并非有效的预测特征。使用错误特征计算协方差会导致 GP 预测质量下降,在处理结构化数据时这种情况尤为常见。以图像数据为例,像素的原始值并非有价值的特征,使用原始像素值计算协方差的核函数会导致 GP 性能不佳。
而神经网络具有多层非线性计算能力,能有效学习复杂函数并从结构化数据中提取特征。通过使用神经网络从结构化数据中提取连续的实值特征,GP 仍能进行有效学习。
在结合神经网络和 GP 时,我们能动态学习适合当前问题的数据处理方式,这种灵活性使模型能泛化到多种结构化数据。同时,在将神经网络的输出传递给 GP 之前,将其缩放到较小范围很重要,这样可避免因神经网络特征提取器初始化不佳而产生的极端值。此外,神经网络特征提取器学习到的表示相对于标签具有平滑的梯度,这使得提取的特征更适合 GP 学习。
#### 练习解析
##### 练习 1:高斯过程作为函数分布
此练习在真实数据集上训练 GP,具体步骤如下:
1. **创建四维数据集**
```python
import torch
import gpytorch
import matplotlib.pyplot as plt
train_x = torch.tensor(
[
[1 / 2, 1 / 2, 0, 0],
[1 / 3, 1 / 3, 1 / 3, 0],
[0, 1 / 2, 1 / 2, 0],
[0, 1 / 3, 1 / 3, 1 / 3],
]
)
train_y = torch.tensor([192.08, 258.30, 187.24, 188.54])
```
2. **归一化标签**
```python
train_y = (train_y - train_y.mean()) / train_y.std()
```
打印 `train_y` 应得到 `tensor([-0.4183, 1.4974, -0.5583, -0.5207])`。
3. **训练 GP**
```python
class BaseGPModel(gpytorch.models.ExactGP):
def __init__(self, train_x, train_y, likelihood):
super().__init__(train_x, train_y, likelihood)
self.mean_module = gpytorch.means.ZeroMean()
self.covar_module = gpytorch.kernels.RBFKernel()
def forward(self, x):
mean_x = self.mean_module(x)
covar_x = self.covar_module(x)
return gpytorch.distributions.MultivariateNormal(mean_x, covar_x)
lengthscale = 1
noise = 1e-4
likelihood = gpytorch.likelihoods.GaussianLikelihood()
model = BaseGPModel(train_x, train_y, likelihood)
model.covar_module.lengthscale = lengthscale
model.likelihood.noise = noise
model.eval()
likelihood.eval()
```
4. **创建测试数据集**
```python
grid_x = torch.linspace(0, 1, 101)
grid_x1, grid_x2 = torch.meshgrid(grid_x, grid_x, indexing="ij")
xs = torch.vstack(
[
grid_x1.flatten(),
grid_x2.flatten(),
torch.zeros(101 ** 2),
torch.zeros(101 ** 2),
]
).transpose(-1, -2)
```
5. **预测混合温度**
```python
with torch.no_grad():
predictive_distribution = likelihood(model(xs))
predictive_mean = predictive_distribution.mean
predictive_stddev = predictive_distribution.stddev
```
6. **可视化预测结果**
```python
fig, ax = plt.subplots(1, 2, figsize=(16, 6))
c = ax[0].imshow(
predictive_mean.detach().reshape(101, 101).transpose(-1, -2),
origin="lower",
extent=[0, 1, 0, 1],
)
c = ax[1].imshow(
predictive_stddev.detach().reshape(101, 101).transpose(-1, -2),
origin="lower",
extent=[0, 1, 0, 1],
)
plt.colorbar(c, ax=ax[1])
```
##### 练习 2:结合均值和协方差函数融入先验知识
该练习用于实现具有自动相关性确定(ARD)的 GP 模型,步骤如下:
1. **实现二维函数**
```python
import torch
import gpytorch
import matplotlib.pyplot as plt
def f(x):
return (
torch.sin(5 * x[..., 0] / 2 - 2.5) * torch.cos(2.5 - 5 * x[..., 1])
+ (5 * x[..., 1] / 2 + 0.5) ** 2 / 10
) / 5 + 0.2
```
2. **可视化函数**
```python
lb = 0
ub = 2
xs = torch.linspace(lb, ub, 101)
x1, x2 = torch.meshgrid(xs, xs)
xs = torch.vstack((x1.flatten(), x2.flatten())).transpose(-1, -2)
ys = f(xs)
plt.imshow(ys.reshape(101, 101).T, origin="lower", extent=[lb, ub, lb, ub])
```
3. **随机抽取训练数据**
```python
torch.manual_seed(0)
train_x = torch.rand(size=(100, 2)) * 2
train_y = f(train_x)
```
4. **实现 GP 模型**
```python
class GPModel(gpytorch.models.ExactGP):
def __init__(self, train_x, trai
```
0
0
复制全文
相关推荐










