当神经网络撞上薛定谔:混合密度网络入门

https://cloud.tencent.com/developer/news/240669python

你必定据说过『神经网络络能够拟合任意连续函数』这句话。数组

没错,经过增长网络的隐藏层数量和隐藏层大小,你能够获得强大的学习网络,不管是二次三次函数,仍是正弦余弦,均可以用你的网络进行无限逼近。网络

好了,打住,今天我不是来教你逼近这种简单函数的(这种内容应该在学习深度学习的第一天就已经解决了)。让咱们来考虑这个状况——当咱们要拟合的『函数』,不止有一个值会怎样?函数

严格来讲,『多值函数』不是严谨的定义,良好定义的『函数』在其定义域内的每一个输入都对应一个输出,并且只对应一个输出[1]。然而实际上咱们常常要处理一些多值问题,好比反三角函数(arcsin, arccos 等等),因此如今问题来了,当咱们但愿拟合的函数有多个输出值的时候,咱们的神经网络模型应该怎么定义呢?学习

第一个任务:单值函数拟合测试

让咱们先回忆单值函数是怎么拟合的,下面我将用 tensorflow 来演示一个超简单的网络拟合。咱们首先要设计一个函数,以产生点集,用于后面的拟合,咱们选用的是正弦函数:.net

f(x) = 7.0sin(0.75x) + 0.5x设计

在生成数据的时候,还会加入一些随机的噪声。orm

这些数据点可视化的结果是这样的:blog

 

如今咱们设计一个具备一个隐藏层的简单网络进行拟合,咱们但愿用神经网络模型设计一个函数 y = f'(x),在必定区间上能够达处处处 |f'(x) - f(x)|

如今咱们看一下结果,其中蓝色是训练数据,红色是网络的输出值,能够看到,红色的点几乎完美地排成了一条阶段上升的曲线。

 

交换坐标轴

如今咱们进一步,将数据点的 x 轴与 y 轴交换,这样咱们就有了一个多值函数的输入。在 python 中,交换两个轴的数据很是简单:

 

如今咱们的 x 可能会对应多个 y,若是再套用之前的方法,结果就不那么理想了。

 

是的,咱们原来的模型已经失效了,不管增长多少层,增大多少节点数,都不能拟合多值函数曲线。因此,如今咱们应该怎么办?

混合密度网络:薛定谔的猫

在前面的代码中,咱们对于多值函数的预测走入了一个误区:咱们的神经网络最后的输出是一个肯定值,然而实际上咱们须要的是多个『可能』的值。你也许会想,用神经网络输出多个值并不难呀,只要定义最后的输出层节点数大于 1 就能够了。是的,你能够定义一个多输出的网络(好比 3),而后每次输出 3 个预测值,然而这个网络的效果确定是很是差的(你能够本身思考一下为何)。

如今咱们换一种思路——假如咱们输出的不是一个值,而是目标值的一个『可能分布』,好比当 x=1 时,咱们获得 y 有两个取值 { 1, -1 },而且每一个取值的几率都是 0.5。这就像薛定谔的那只量子叠加态的猫同样,咱们获得的结果是一个几率分布,只有当咱们进行一次『观察』时,才会获得一个具体结果!

使用这个思想设计的网络就叫混合密度网络(Mixture Density Network),用处至关大。

你也许会问,几率究竟应该怎么表示呢,难道是输出一个相似 one-hot 表示的数组吗?显然咱们不能使用 one-hot 来表示这个几率分布,由于咱们输出的值域是连续的浮点数,咱们不可能用有限的数组来表达。这里就要引入一个统计学里面的很常见的概念了,就是高斯分布。

高斯分布的几率密度曲线表示为:

这里面的参数只有两个,一个是均值 mu,一个是标准差 simga,经过改变这两个量,咱们能够获得多样的几率分布曲线。

 

而经过组合多个高斯几率分布,理论上咱们能够逼近任意几率分布。好比将上面的三个分布按几率 1: 1: 1,混合为一个分布:

 

因此咱们的思路就比较清晰了:咱们要设计这么一个网络,输入 x ,输出一个混合几率分布(即多个 mu 和 sigma 的组合值),而咱们须要获取真正的预测值的时候,就从这么个混合几率分布中产生一个随机值,屡次取随机值则能够获得全部 y 的可能值。混合几率网络的实现也很简单,咱们设计一个具备两个隐藏层的网络,输出层节点数为 12 * 3 个,能够表示为 12 个高斯分布的叠加,咱们用前 12 个节点表示 12 个高斯分布叠加时各自的权重,而中间 12 个表示平均数 mu,最后 12 个表示标准差 sigma。

咱们的 loss 函数不能是和以前同样的平方差来表示,咱们但愿最大化真实的 y 值在混合几率密度中的几率,将通过标准化的 y_normal 与几率权重相乘,并取对数相加后取相反数,这个结果就是几率联合分布的最大似然函数。

运行咱们的网络:

 

生成数据测试一下。

注意,因为咱们获得的是一个几率分布,因此还须要根据预测出的联合几率密度来随机生成具体的点。在测试中,咱们对于每个输入 x 都成生 10 个随机点。最终获得的生成图像以下:

 

wow!完美,咱们的混合密度网络真的拟合了这个多值函数,虽然有一点小瑕疵,实际上我本身经过增长节点数或者隐藏层后,生成的图像很是好,你也能够动手试试。

[1]https://zh.wikipedia.org/wiki/%E5%A4%9A%E5%80%BC%E5%87%BD%E6%95%B0

[2]http://blog.otoro.net/2015/11/24/mixture-density-networks-with-tensorflow/

相关文章
相关标签/搜索