参考:当神经网络撞上薛定谔:混合密度网络入门 - 代码律动的文章 - 知乎,本文中的图片也来自这篇知乎文章,版权归原作者所有。
一般可通过神经网络来拟合任意的函数,为了进行简单的测试,作者通过:
y
=
7.0
∗
s
i
n
(
0.75
x
)
+
0.5
x
+
G
a
u
s
s
i
a
n
n
o
i
s
e
y=7.0*sin(0.75x)+0.5x+ Gaussian \ noise
y=7.0∗sin(0.75x)+0.5x+Gaussian noise 得到如下所示的蓝色数据点。那么就可以使用简单的神经网络对这些数据进行拟合,假设拟合的函数是
F
(
x
)
F(x)
F(x),训练好后,就可以对任意
x
x
x的函数值进行预测,红色点的高度就是每个
x
x
x对应的函数值。
如果这些蓝色数据点以
y
=
x
y=x
y=x 进行镜面对称的话,那么我们得到的数据无法再通过刚才的方法进行拟合,因为它本质上不是函数。如果非要拟合,将得到如下误差非常大的效果:
为此 Mixture Density Network 应运而生,它不是直接预测函数值,实际上也不好操作,因为对于具体的每个
x
x
x,它有几个函数值是不确定的。因此, Mixture Density Network直接预测函数值对应的分布。假设
x
x
x对应的多个函数值服从混合高斯分布,假设该混合高斯模型由
n
n
n个高斯模型构成,那么,神经网络的输出就是:
n
n
n个权重:
{
w
1
,
w
2
,
w
3
,
.
.
.
w
n
}
\{w_1,w_2,w_3,...w_n\}
{w1,w2,w3,...wn},
n
n
n个均值:
{
μ
1
,
μ
2
,
μ
3
,
.
.
.
μ
n
}
\{\mu_1, \mu_2,\mu_3,...\mu_n\}
{μ1,μ2,μ3,...μn},
n
n
n个方差:
{
σ
1
,
σ
2
,
σ
3
,
.
.
.
σ
n
}
\{\sigma_1, \sigma_2, \sigma_3,...\sigma_n\}
{σ1,σ2,σ3,...σn}. 混合高斯模型可以简单的表示为:
∑
i
n
w
i
1
(
2
π
)
σ
i
e
−
x
−
μ
i
2
σ
i
2
\sum^n_iw_i\frac{1}{\sqrt(2\pi)\sigma_i}e^{-\frac{x-\mu_i}{2\sigma^2_i}}
i∑nwi(2π)σi1e−2σi2x−μi
有了这个高斯分布,就可以通过在这个分布上采样得到多个函数值。
为此,可以在训练集上训练一个模型表示函数值服从的高斯混合分布。在对数据进行测试的时候,对于每一个数据
x
x
x 均可预测出
n
n
n个权重:
{
w
1
,
w
2
,
w
3
,
.
.
.
w
n
}
\{w_1,w_2,w_3,...w_n\}
{w1,w2,w3,...wn},
n
n
n个均值:
{
μ
1
,
μ
2
,
μ
3
,
.
.
.
μ
n
}
\{\mu_1, \mu_2,\mu_3,...\mu_n\}
{μ1,μ2,μ3,...μn},
n
n
n个方差:
{
σ
1
,
σ
2
,
σ
3
,
.
.
.
σ
n
}
\{\sigma_1, \sigma_2, \sigma_3,...\sigma_n\}
{σ1,σ2,σ3,...σn},那么就可以在这个混合高斯分布上采样多个点作为
x
x
x 对应的多个函数值
y
y
y。 这里在
x
∈
[
−
15
,
15
]
x\in[-15,15]
x∈[−15,15]区间内,以0.1为步长,对每个
x
x
x都随机采样10个
y
y
y 值, 也就是每个
x
x
x对应10个
y
y
y值,把所有这些
(
x
,
y
)
点画到图上(红色的点)
(x,y)点画到图上(红色的点)
(x,y)点画到图上(红色的点),就以得到如下的图像。可以看到,这些红色的点很好的拟合了蓝色数据点的分布。