Yi=logπi−[log(2π−−√)+log(σ)]+[−(y−μ)22σ2] Y i = l o g π i − [ l o g ( 2 π ) + l o g ( σ ) ] + [ − ( y − μ ) 2 2 σ 2 ]
协方差矩阵反映的是变量之间的二阶统计特性,如果随机向量不同维度之间的相关性很小,则所得到的协方差举证几乎是一个对角矩阵。所以我们常常将协方差矩阵固定成一个对角阵。
多元正态分布
N(x;μ,Σ)=1(2π)ndet(Σ)−−−−−−−−√(exp(−12(x−μ))TΣ−1(x−μ)) N ( x ; μ , Σ ) = 1 ( 2 π ) n d e t ( Σ ) ( e x p ( − 1 2 ( x − μ ) ) T Σ − 1 ( x − μ ) )
参数 μ μ 表示分布的均值,是一个向量,表示随机变量不同维度的均值。 Σ Σ 给出了分布的协方差矩阵
MDN 数值计算
There are many details should be paid attention to.For example,calculations should be done using logarithmic scale in case of underflow.
log∑Ki=1πiPi(x)=log∑Ki=1elogπiPi(x)=log∑Ki=1elogπi+logPi(x)=log∑Ki=1eyi=log∑Ki=1eyi−ymax∗eymax=ymax+log∑Ki=1eyi−ymax l o g ∑ i = 1 K π i P i ( x ) = l o g ∑ i = 1 K e l o g π i P i ( x ) = l o g ∑ i = 1 K e l o g π i + log P i ( x ) = l o g ∑ i = 1 K e y i = l o g ∑ i = 1 K e y i − y m a x ∗ e y m a x = y m a x + log ∑ i = 1 K e y i − y m a x
Yi=logπi+logPi(x) Y i = l o g π i + l o g P i ( x )
- 单高斯的情况:
Pi(x)=12π√σexp(−(y−μ)22σ2)
P
i
(
x
)
=
1
2
π
σ
e
x
p
(
−
(
y
−
μ
)
2
2
σ
2
)
logPi(x)=log[12π√σexp(−(y−μ)22σ2)]=−[log(2π−−√)+log(σ)]+[−(y−μ)22σ2]
l
o
g
P
i
(
x
)
=
l
o
g
[
1
2
π
σ
e
x
p
(
−
(
y
−
μ
)
2
2
σ
2
)
]
=
−
[
l
o
g
(
2
π
)
+
l
o
g
(
σ
)
]
+
[
−
(
y
−
μ
)
2
2
σ
2
]
- 多元高斯的情况:
Pi(x)=N(x;μ,Σ)=1(2π)ndet(Σ)−−−−−−−−√(exp(−12(x−μ))TΣ−1(x−μ)) P i ( x ) = N ( x ; μ , Σ ) = 1 ( 2 π ) n d e t ( Σ ) ( e x p ( − 1 2 ( x − μ ) ) T Σ − 1 ( x − μ ) )
logPi(x)=log(2π)−n2+log(det(Σ))−12+(−12(x−μ)TΣ−1(x−μ)) log P i ( x ) = l o g ( 2 π ) − n 2 + l o g ( d e t ( Σ ) ) − 1 2 + ( − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) )
=−12(n∗log(2π))+log(det(Σ))−12(x−μ)TΣ−1(x−μ) = − 1 2 ( n ∗ l o g ( 2 π ) ) + l o g ( d e t ( Σ ) ) − 1 2 ( x − μ ) T Σ − 1 ( x − μ )
多元高斯分布MDN代码:
mask = tf.cast(tf.sequence_mask(length, tf.shape(logits)[1]), tf.float32)
logits *= tf.expand_dims(mask, 2)
logits = tf.reshape(logits, [-1, self._mdn_output_size])
target = tf.reshape(target, [-1, self._output_size])
out_pi, out_mu, out_sigma = self._get_mixture_coef(logits, self._mix_num)
all_mix_prob = []
for i in xrange(self._mix_num):
pi = out_pi[:, i : (i + 1)]
mu = out_mu[:, i * self._output_size : (i + 1) * self._output_size]
sigma = out_sigma[:, i * self._output_size : (i + 1) * self._output_size]
# tf.reciprocal 倒数
tmp = tf.multiply(tf.square(target - mu), tf.reciprocal(sigma))
xEx = -0.5 * tf.reduce_sum(tmp, 1, keep_dims=True)
# normaliser = tf.reduce_sum(tf.log(sigma), 1, keep_dims=True)
normaliser = 0.5 * (self._output_size * tf.log(2 * math.pi) + tf.reduce_sum(tf.log(sigma),1,keep_dims=True))
exponent = xEx + tf.log(pi) - normaliser
all_mix_prob.append(exponent)
all_mix_prob = tf.concat(all_mix_prob, 1) # 变成列向量
max_exponent = tf.reduce_max(all_mix_prob, 1, keep_dims=True)
mod_exponent = all_mix_prob - max_exponent #
finetune_cost = -tf.reduce_mean(
max_exponent + tf.log(tf.reduce_sum(tf.exp(mod_exponent), 1, keep_dims=True)))
return finetune_cost
总结:
每一个X对应一个分布P。输入X通过神经网络后得到分布P的参数
包括
Decode时,就是选取最大的Pi对应的u作为模型的输出。
参考文献
多元高斯分布与MDN
本文详细介绍了多元高斯分布及其在混合密度网络(MDN)中的应用,探讨了协方差矩阵的意义,并提供了MDN的实现代码示例。
2698

被折叠的 条评论
为什么被折叠?



