深度学习生成舞蹈影片01之MDN
阅读难度:★★★★☆
技能要求:机器学习基础
字数:1136字
阅读时长:6分钟
先案例一个Github的项目:
DanceNet
Dance generator using Variational Autoencoder, LSTM and Mixture Density Network.
自动生成舞蹈动作的深度网络,结合了变分自编码器VAE、LSTM 与混合密度网络MDN。该网络的主要思想即使用VAE生成单张舞蹈图片,并使用 LSTM 将这些舞蹈图片组合成一系列完整的动作,最后联合训练就能生成非常逼真的舞蹈动作。训练完成后,生成的舞蹈效果如下:
本文先介绍MDN:
点击即可GET知识卡片
1
用神经网络拟合任意连续函数
基本上所有的深度学习教程的第一课,都是让大家练习用神经网络拟合任意连续函数。例如tensorflow.js的练习之一:
Fitting a Curve to Synthetic Data
有兴趣可以自行练习下:
https://js.tensorflow.org/tutorials/fit-curve.html
我们如果要拟合:f(x) = 7.0sin(0.75x) + 0.5x,我们很容易通过定义一个包含一个隐藏层和20个节点的神经网络来拟合,结果如下:
如果把x轴跟y轴的数据对换下,再套用之前的神经网络进行拟合,效果并不理想:
x 可能会对应多个 y,我们不管增加多少层,增大多少节点数,都不能拟合多值函数曲线。上图这个是一个多值函数,每一个输入都至少会对应一个输出,而且有些会对应不止一个输出:
有什么办法可以拟合多值函数曲线呢?采用MDN可以很容易做得到。
2
深度混合密度模型
deep mixture density network
MDN
你也许会想,用神经网络输出多个值并不难,只要定义最后的输出层节点数大于 1 就可以了。是的,你可以定义一个多输出的网络(比如 3),然后每次输出 3 个预测值,然而这个网络的效果肯定是非常差的(你可以自己思考一下为什么)。
现在我们换一种思路——假如我们输出的不是一个值,而是目标值的一个可能分布,比如当 x=1 时,我们得到 y 有两个取值 { 1, -1 },并且每个取值的概率都是 0.5。使用这个思想设计的网络就叫混合密度网络Mixture Density Network:
早在1994年,Christopher M. Bishop就提出Mixture Density Networks,MDN 结合了常规的深度神经网络和高斯混合模型GMM,MDN的结构如上图所示:
neural network + mixture model
下面我们继续了解GMM。
3
高斯混合模型
Gaussian Mixed Model
指的是多个高斯分布函数(正态分布曲线)的线性组合。如下图所示的多个正态分布曲线,拟合出一个分布:
理论上GMM可以拟合出任意类型的分布。回到上文提到的多值函数,使用多个高斯分布的线性组合就可以拟合出来。
高斯分布
4
MDN的应用
MDN我们知道可以用来拟合多值函数后,还有哪些应用呢?除了上文的DanceNet使用了MDN,还可以用于手写字的生成,用连续的概率分布估计横、纵方向的位移,即MDN来估算下一笔的位移,采用的也是LSTM+MDN。
其他的一些应用:
4.1 解决天文学的星体测距问题
http://cbonnett.github.io/MDN.html
4.2 解决篮球轨迹预测问题
https://github.com/RobRomijnders/RNN_basketball
4.3 生成手写数字
https://github.com/rndbrtrnd/kadenze-deep-creative-apps/blob/master/final-project/glyphs-rnn.ipynb
参考资料:
http://blog.otoro.net/2015/11/24/mixture-density-networks-with-tensorflow
https://github.com/jsn5/dancenet
附上keras实现的MDN:
https://github.com/cpmpercussion/keras-mdn-layer