原文链接:Bayesian Deep Learning
作者:Thomas Wiecki,关注贝叶斯模型与Python
译者:刘翔宇 校对:赵屹华
责编:周建丁(zhoujd@csdn.net)
目前机器学习的发展趋势
目前机器学习有三大趋势:概率编程、深度学习和“大数据”。在概率编程(PP)方面,有许多创新,它们大规模使用变分推理。在这篇博客中,我将展示如何使用PyMC3中的变分推理来拟合一个简单的贝叶斯神经网络。我还将讨论桥接概率编程与深度学习能够为将来研究开创怎样的有趣途径。
大规模概率编程
概率编程可以灵活创建自定义概率模型,主要关注从数据中洞悉和学习。这种方法本质上是贝叶斯方法,所以我们可以指定先验来告知和约束我们的模型,并得到后验分布形式的不确定性估计。使用MCMC采样算法,我们可以从后验中抽样灵活地估计这些模型。PyMC3和Stan是目前用来构建并估计这些模型最先进的工具。但是,采样的一个主要缺点就是它往往非常耗时,特别是对于高维度模型。这就是为什么最近变分推理算法得到发展,它几乎与MCMC同样灵活,但是更快。这些算法拟合后验的分布(比如正态分布),将采样问题转换为优化问题,而不是从后验中采样。ADVI——自动微分变分推理(Automatic Differentation Variational Inference)——在PyMC3和Stan中已经实现,一个新的包Edward同样得到了实现,它主要与变分推理有关。
不幸的是,当面临传统的机器学习问题时,比如分类或(非线性)回归,与集成学习(比如随机森林或梯度提升回归树)这样的算法相比,概率编程不能胜任(精度和可扩展性方面)。
深度学习
现在深度学习第三次复兴,它已经成为头条新闻,支配了几乎所有的物体识别基准,在Atari游戏中获胜,并且战胜了世界围棋冠军李世石。从统计学角度看,神经网络非常擅长非线性函数逼近和表示法学习。大多数为人所知的是分类任务,它们已经通过AutoEncoders和其他各种有趣的方法(比如循环网络,或使用MDN来估计多模态分布)扩展到了非监督学习。它们的效果为何如此好?没有人真正知道原因,因为这些统计特性仍不为人完全理解。
深度学习很大一部分创新是可以训练极其复杂的模型。这依赖于几个支柱:
- 速度:提高GPU性能获得更快的处理。
- 软件:像Theano和TensorFlow这样的框架允许灵活创建抽象模型,然后可以对其优化并编译到CPU或GPU上。
- 学习算法:在数据子集上训练——随机梯度下降——可以让我们在海量数据上训练这些模型。使用drop-out这样的技术可以避免过拟合。
- 架构:大量的创新都是改变输入层,比如卷积神经网络,或改变输出层,比如MDN。
桥接深度学习和概率编程
一方面,概率编程可以让我们以原则化和易于理解的方式构建比较小的,集中的模型来深入了解数据;在另一方面,使用深度学习的启发式方法来训练大量和高度复杂的模型,这些模型的预测效果惊人。最近变分推理中的创新能够使概率编程扩大模型的复杂性和数据大小。所以,我们处于结合这两种方法的风口浪尖,希望能在机器学习方面解锁新的创新。想了解更多,也可以看看Dustin Tran最近的博客文章。
这种桥接可以让概率编程被运用于一系列更广泛的有趣问题中,我相信它同样能在深度学习方面有所创新。比如:
- 预测中的不确定性:我们下面将会看到,贝叶斯神经网络告诉我们它的预测中的不确定性。我认为不确定性是机器学习中被低估的概念,因为它对现实世界的应用来说显然是重要的。它在训练中也非常有用。比如,我们可以在模型最不确定的样本中来训练模型。
- 表示中的不确定性:我们同样会得到权重的不确定估计,它可以告诉我们网络中学习到的表示的稳定性。
- 先验正则:权重往往通过L2正则化来避免过拟合,这很自然地在权重系数上使用高斯先验。我们可以想象其他各种先验,比如spike-and-slab 来加强稀疏程度(使用L1范数更合适)。
- 知情先验的迁移学习:如果我们想在一个新的物体识别数据集上训练网络,我们可以使用其他预训练的网络生成的权值作为知情先验来引导学习,比如GoogLeNet。
- 分层神经网络:概率编程中一种强大的方法是分层建模,可以将在子组中学习到的东西池化运用于全局(见PyMC3分层线性回归教程)。在分层数据集中运用神经网络,我们可以对子组训练单个神经网络,而同时还能获得全局的表示。比如,假设一个网络被训练用来从汽车图片中分类车型。我们可以训练一个分层神经网络,其中一个子网络仅用来分辨某个制造商生产的车型。直觉告诉我们,某个制造商的所有车辆都有相似之处,所以针对特定品牌来训练单个网络完全说的通。然而,由于各个单个网络都与上一层相连,它们仍然可以与其他特定的子网络共享特征信息,这些特征对于所有品牌都有用。有趣的是,网络的不同层可以从分层不同的级别中获得信息——例如,提取视觉线条的初层在所有子网络中都是同一的,而高阶表示则不同。分层模型可以从数据中学习到所有东西。
- 其他混合架构:我们可以自由地构建各种神经网络。例如,贝叶斯非参数化可以用来灵活调整隐藏层的大小和形状,根据在训练过程中碰到的问题最佳地扩展网络架构。目前,这需要昂贵的超参数优化和大量的系统知识。
PyMC3中的贝叶斯神经网络
生成数据
首先,我们生成一些小型数据——一个简单的二元分类问题,非线性可分。
In [1]:
%matplotlib inline
import pymc3 as pm
import theano.tensor as T
import theano
import sklearn
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('white')
from sklearn import datasets
from sklearn.preprocessing import scale
from sklearn.cross_validation import train_test_split
from sklearn.datasets import make_moons
In [2]:
<