2

我正在尝试在 Python 中编写几种类型的 ANN 算法,以便更好地理解/直觉这些算法。我没有使用 Scikit-learn 或任何其他现成的软件包,因为我的目标是教育而不是实用。作为一个示例问题,我使用 MNIST 数据库(http://yann.lecun.com/exdb/mnist/)。

虽然我执行了简单的 1 隐藏层 NN 和卷积 NN,但我成功地避免了任何二阶优化方法,因此没有计算 Hessian 矩阵。然而,然后我到了贝叶斯神经网络,为了优化超参数,Hessian 的计算是强制性的。

在我的全连接网络中,有 784 个输入、300 个隐藏单元和 10 个输出单元。所有这些都会产生 238200 个权重(+ 偏差)。当我尝试计算甚至近似 Hessian(通过梯度的外积)时,Python 会通知“MemoryError”。即使我将权重数量减少到 ~40000 并且没有显示错误消息,我的计算机也会在几分钟后卡住。据我了解,问题在于理想的矩阵非常庞大。我浏览了几篇关于贝叶斯神经网络的文章,注意到作者通常使用不超过 10 或 20 个输入和隐藏单元的网络架构,因此参数比我少得多。但是,我没有看到任何关于此类限制的明确声明。

为了将贝叶斯方法应用于 MNIST 的 NN,我该怎么做?

更一般地说:是否可以将贝叶斯方法应用于此(238200 个权重)甚至更大的架构?或者也许它只适用于相对较小的网络?

4

1 回答 1

2

您可以尝试梯度上升的 BFGS 算法,该算法近似于 Hessian 并且倾向于节省(相当大的)内存。Scipy 中有一个实现

于 2015-11-06T16:27:40.830 回答