Press enter to see results or esc to cancel.

Flow Based Model

GAN , VAE 还差一个Flow Based Model就把御三家给集合全了。Flow与 GAN和VAE不同,那两个模型用了神经网络来避免了一堆复杂的运算,非英雄也。Flow模型就是硬刚,直接计算最后的概率,但是这个概率它也知道是硬骨头,没那么容易计算,所以它在计算的时候就选择了将$p(x)$进行一点点改变,打个不恰当的比方,现在我们想要去做一道菜,比如说是红烧牛肉,其他的两个模型不管做菜的流程是怎么样的,把所有的原材料乱七八糟丢进去,过了一个小时锅里自己做出了一道和红烧牛肉差不多的东西。而Flow模型也不知道红烧牛肉怎么做,但是他分解了一下流程,先买牛肉,再把牛肉切块,再放锅里焖,再加五香桂皮,再加啤酒,然后一步一步的把红烧牛肉给复原出来了

Introduction

上面就是这个做红烧牛肉的过程,通过一系列的可逆函数变换使得一个简单的正态分布变成一个复杂的乱七八糟分布。用数学的表示就是

$$ \begin{aligned} \mathbf{z}_{i-1} &\sim p_{i-1}(\mathbf{z}_{i-1}) \\ \mathbf{z}_i &= f_i(\mathbf{z}_{i-1})\text{, thus }\mathbf{z}_{i-1} = f_i^{-1}(\mathbf{z}_i) \\ p_i(\mathbf{z}_i) &= p_{i-1}(f_i^{-1}(\mathbf{z}_i)) \left\vert \det\dfrac{d f_i^{-1}}{d \mathbf{z}_i} \right\vert \end{aligned} $$

那么对于后面的行列式再做些手脚

$$\begin{aligned} p_i(\mathbf{z}_i) &= p_{i-1}(f_i^{-1}(\mathbf{z}_i)) \left\vert \det\dfrac{d f_i^{-1}}{d \mathbf{z}_i} \right\vert \\ &= p_{i-1}(\mathbf{z}_{i-1}) \left\vert \det \color{red}{\Big(\dfrac{d f_i}{d\mathbf{z}_{i-1}}\Big)^{-1}} \right\vert  \\ &= p_{i-1}(\mathbf{z}_{i-1}) \color{red}{\left\vert \det \dfrac{d f_i}{d\mathbf{z}_{i-1}} \right\vert^{-1}}  \\ \log p_i(\mathbf{z}_i) &= \log p_{i-1}(\mathbf{z}_{i-1}) – \log \left\vert \det \dfrac{d f_i}{d\mathbf{z}_{i-1}} \right\vert \end{aligned}$$

从第二步到第三步在BiliBili的白板机器学习有较为详细的推导,【机器学习】白板推导系列(三十三) ~ 流模型(Flow based Model),大家如果想看可以去康康。

那么经过上面的推导我们就可以得到了前一项与后一项的数学关系,那么在数学里面一旦得到了这种东西,我们就会想要从头连到尾。那么接下来我们就来连一连

$$\begin{aligned} \mathbf{x} = \mathbf{z}_K &= f_K \circ f_{K-1} \circ \dots \circ f_1 (\mathbf{z}_0) \\ \log p(\mathbf{x}) = \log \pi_K(\mathbf{z}_K) &= \log \pi_{K-1}(\mathbf{z}_{K-1}) – \log\left\vert\det\dfrac{d f_K}{d \mathbf{z}_{K-1}}\right\vert \\ &= \log \pi_{K-2}(\mathbf{z}_{K-2}) – \log\left\vert\det\dfrac{d f_{K-1}}{d\mathbf{z}_{K-2}}\right\vert – \log\left\vert\det\dfrac{d f_K}{d\mathbf{z}_{K-1}}\right\vert \\ &= \dots \\ &= \log \pi_0(\mathbf{z}_0) – \sum_{i=1}^K \log\left\vert\det\dfrac{d f_i}{d\mathbf{z}_{i-1}}\right\vert \end{aligned}$$

上面就是我们连出来的结果,可以看成是初始状态$\pi_{0}(z_{0})$加上后面的变化$\sum_{i=1}^K \log\left\vert\det\dfrac{d f_i}{d\mathbf{z}_{i-1}}\right\vert $变成最终的状态。

那么也就是说可以通过学习得到整个变化的函数链条,而基于这个函数链条我们就可以从这个链条做出其他的有趣的东西。比如说红烧牛肉里面的初始我改成是鸡肉就变成了红烧鸡肉。

但是这么数学的东西肯定会有些限制,在应用上肯定也没有其他的两个的那么广泛,比如说在这里面就要求这个会比较容易的Invertible , 如果不可逆,那Flow个屁,而且还有要求就是雅克比行列式比较好计算,如果行列式复杂的一批,那么我们可能也要耗费很多的时间,远远没有神经网络Efficiency。

 

这个是基础的Flow模型了,后面还有其他的很多的变种,以后有机会再去介绍这些变种吧。

OK待会再写一篇三者的对比?

Reference

【机器学习】白板推导系列(三十三) ~ 流模型(Flow based Model)

Flow-based Deep Generative Models – Weng,Lilian

Comments

Leave a Comment