贝叶斯深度学习:桥接PyMC3和Lasagne构建层次神经网络

时间:2022-04-25
本文章向大家介绍贝叶斯深度学习:桥接PyMC3和Lasagne构建层次神经网络,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

编辑部翻译组

编译:西西、wally

作者:Thomas Wiecki

今天,我们将使用Lasagne构建一个更有趣的模型,这是一个灵活的Theano图书馆,用于构建各种类型的神经网络。你可能知道,PyMC3还使用了Theano,因此在Lasagne中建立了人工神经网络(ANN),将贝叶斯先验放在参数上,然后在PyMC3中使用变分推理(ADVI)来估计模型。

由于Lasagne的优秀表现,我们可以轻松地建立一个具有最大汇集层的分层贝叶斯卷积ANN,在MNIST上实现98%的准确性。

数据集:MNIST

我们将使用手写数字的经典MNIST数据集。 与之前的博客文章相反,MNIST是具有合理数量的维度和数据点的有实际挑战性的ML任务(当然不如像ImageNet那样有挑战性)。

Loading data...

模型说明

我想像应该可以把Lasagne和PyMC3搭在一起,因为他们都依赖于Theano。 然而,目前还不清楚它将会是多么困难。 幸运的是,第一个实验做得很好,但有一些潜在的方法可以使这更容易。 我开设了一个GitHub issue在Lasagne's的报告里,在这几天后,PR695被合并,允许他们更好的整合。

首先,Lasagne创建一个具有2个完全连接的隐藏层(每个具有800个神经元)的ANN,这几乎是从教程中直接采用的Lasagne代码。 当使用lasagne.layers.DenseLayer创建图层时,我们可以传递一个函数init,该函数必须返回一个用作权重和偏差矩阵的Theano表达式。

接下来,为ANN创建权重函数。 因为PyMC3要求每个随机变量具有不同的名称,我们创建一个类并且是唯一命名的先验。

在这里,priors充当了调节者的角色,试图保持ANN small的权重。它在数学上等价于一个L2的损失项,作为通常的做法是将大的权重惩罚到目标函数中。

下面是一些设置小批量ADVI的函数。

放在一起

让我们用小批量的ADVI来运行ANN:

确保一切聚合:

Accuracy on test data = 89.81%

分层神经网络:学习数据的正则化

上面我们只是固定了所有层的sd = 0.1,但是可能第一层应该有不同于第二层的值。也许开始时是0.1,要么太小或太大。在贝叶斯建模中,很常见的是在这种情况下放置hyperprior,并学习最佳正则化应用到数据中去。这节省了我们在超参数优化中对参数进行调优的时间。

Accuracy on test data = 92.25999999999999%

我们得到一个很小但很好的boost在准确性上。 我们来看看超参数后面的部分:

有趣的是,它们都是不同的,这表明改变正规化数量在网络的每一层是有意义的。

卷积神经网络

但到目前为止,在PyMC3中实现也很简单。有趣的是,我们现在可以构建更复杂的ANNs,像卷积神经网络:

Accuracy on test data = 98.03%

更高的精度。我也尝试了这个层次模型,但它实现了较低的精度(95%),我认为是由于过度拟合。

让我们更多地利用我们在贝叶斯框架中的产出,并在我们的预测中探索不确定性。正如我们的预测是分类的,我们不能简单地计算预测标准差。相反,我们计算的是卡方统计量,它告诉我们样本的均匀程度。越均匀,我们的不确定性越高。我不确定这是否是最好的方法。

正如我们所看到的,当模型出错时,答案会更加不确定(即提供的答案更加均匀)。你可能会说,你从一个普通的ANN那里得到了同样的效果,但事实并非如此。

这篇文章在后续会翻译

结论

通过桥接Lasagne和PyMC3,并通过使用小批量的ADVI来训练贝叶斯神经网络,在一个合适的和复杂的数据集上(MNIST),我们在实际的贝叶斯深度学习问题上迈出了一大步。

我还认为这说明了PyMC3的好处。通过使用一种常用的语言(Python)和抽象计算后端(Theano),我们能够很容易地利用该生态系统的强大功能,并以一种从未考虑过的方式使用PyMC3。我期待着将它扩展到新的领域。