论文《A recurrent latent variable model for sequential data》笔记:详解VRNN
A recurrent latent variable model for sequential data
背景
1 通过循环神经网络的序列建模
循环神经网络(RNN)可以接收一个可变长度的序列 x = ( x 1 , x 2 , . . . , x T ) x = (x_1, x_2, ..., x_T) x=(x1,x2,...,xT)作为输入,并通过递归地处理每个符号同时维持其内部隐藏状态 h h h。在每个时间步 t t t,RNN读取符号 x t x_t xt并更新其隐藏状态 h t ∈ R p h_t \in \mathbb{R}^p ht∈Rp如下:
h t = f θ ( x t , h t − 1 ) (1) h_t = f_\theta (x_t, h_{t-1})\tag{1} ht=fθ(xt,ht−1)(1)
其中 f f f是一个确定性的非线性转移函数, θ \theta θ是 f f f的参数集。转移函数 f f f可以通过长短期记忆(LSTM)[9]或门控循环单元(GRU)[5]等具有门控激活函数的方式实现。RNN通过参数化联合序列概率分布的条件概率的乘积来建模序列:
p ( x 1 , x 2 , . . . , x T ) = ∏ t = 1 T p ( x t ∣ x < t ) p(x_1, x_2, ..., x_T) = \prod_{t=1}^{T} p(x_t | x_{<t}) p(x1,x2,...,xT)=t=1∏Tp(xt∣x<t)
p ( x t ∣ x < t ) = g τ ( h t − 1 ) (2) p(x_t | x_{<t}) = g_\tau (h_{t-1}) \tag{2} p(xt∣x<t)=gτ(ht−1)(2)
其中 g g g是一个将 RNN 隐藏状态 h t − 1 h_{t-1} ht−1映射到可能输出上的概率分布的函数, τ \tau τ是 g g g的参数集。
决定 RNN 表征能力的主要因素之一是输出函数 g g g在方程(2)中的定义。通过一个确定性的转移函数 f f f, g g g的选择实际上定义了 RNN 能够表达的联合概率分布 p ( x 1 , . . . , x T ) p(x_1, ..., x_T) p(x1,...,xT)的家族。
我们可以将方程(2)中的输出函数 g g g表达为由两部分组成。第一部分 ϕ τ \phi_\tau ϕτ是一个函数,它根据隐藏状态 h t − 1 h_{t-1} ht−1返回参数集 ϕ t \phi_t ϕt,即 ϕ t = ϕ τ ( h t − 1 ) \phi_t = \phi_\tau (h_{t-1}) ϕt=ϕτ(ht−1),而 g g g的第二部分返回 x t x_t xt的密度,即 p ϕ t ( x t ∣ x < t ) p_{\phi_t} (x_t | x_{<t}) pϕt(xt∣x<t)。
在建模高维和实值序列时,一个合理的观察模型选择是高斯混合模型(GMM),如在[7]中使用。对于 GMM, ϕ τ \phi_\tau ϕτ返回一组混合系数 α t \alpha_t αt,均值 μ t \mu_t μt,和协方差 Σ t \Sigma_t Σt,它们定义了对应混合组件下 x t x_t xt的概率。在混合分布下 x t x_t xt的概率是:
p α t , μ t , Σ t ( x t ∣ x < t ) = ∑ j α t , j N ( x t ; μ t , j , Σ t , j ) p_{\alpha_t, \mu_t, \Sigma_t} (x_t | x_{<t}) = \sum_j \alpha_{t,j} \mathcal{N}(x_t; \mu_{t,j}, \Sigma_{t,j}) pαt,μt,Σt(xt∣x<t)=j∑αt,jN(xt;μt,j,Σt,j)
除了[7]的显著例外,很少有工作研究了针对实值序列的 RNN 的结构化输出密度模型。
RNN模型输出可变性的方式可能存在一个显著问题。鉴于确定性转移函数是唯一的可变性来源,唯一的可变性来源在于条件输出概率密度。这在建模高度可变且需要高信号保真度的序列时会带来问题。为了有效地模拟这些类型的序列,RNN必须能够映射 x t x_t xt中非常微小的变化(即,随机性的唯一来源)到 h t h_t ht中可能非常大的变化。限制网络的表达能力,如必须通过提高隐藏状态的维度来对抗过拟合,将迫使在生成清晰信号和编码足够的输入可变性以捕捉高层次的可变性之间进行折中。
RNN中对高度结构化输出函数的需求已经被之前注意到过。Boulanger-Lewandowski等人[4]广泛测试了NADE和基于RBM的输出密度,用于模拟音乐的二进制向量表示的序列。Bayer和Osendorfer[2]引入了一个序列的独立潜变量表示的压缩传递到状态的RNN。他们的模型,称为STORN,首先从序列的独立潜变量中生成一系列样本 z = ( z 1 , . . . , z T ) z = (z_1, ..., z_T) z=(z1,...,zT),然后在每个时间步骤上,转移函数 f f f根据方程(1)从先前的状态 h t − 1 h_{t-1} ht−1,先前的输出 x t − 1 x_{t-1} xt−1和采样的潜变量 z t z_t zt计算下一个隐藏状态 h t h_t ht。他们提出根据VAE原则来训练这个模型(见第2.2节)。同样,Pachitariu和Sahani[16]早期提出了一个序列的独立潜变量和随机隐藏状态的RNN。
这些方法与本文提出的方法密切相关。然而,有一个主要差异在于如何对潜在随机变量的先验分布进行建模。与上述方法不同,我们的方法使潜在随机变量的先验分布依赖于通过RNN隐藏状态 h t − 1 h_{t-1} ht−1传递的所有前序输入(见方程(5))。引入时间结构到先验分布中预计会提高模型的表征能力,这一点我们在实验中实证观察到(见表1)。然而,重要的是要注意,任何基于具有随机潜在状态的方法与拥有结构化输出函数的方法是正交的,这两者可以一起使用以形成一个单一模型。
2 变分自编码器 (Variational Autoencoder)
对于非序列化数据,变分自编码器(VAEs)[11, 17] 最近已经被证明是一个有效的建模范式,用于恢复数据空间上的复杂多模态分布。VAE引入了一组潜在随机变量 z z z,旨在捕捉观测变量 x x x 的变化。作为一个有向图模型的例子,联合分布被定义为:
p ( x , z ) = p ( x ∣ z ) p ( z ) . (3) p(x, z) = p(x | z)p(z).\tag{3} p(x,z)=p(x∣z)p(z).(3)
潜在随机变量的先验 p ( z ) p(z) p(z) 通常选择为一个简单的高斯分布,而条件分布 p ( x ∣ z ) p(x | z) p(x∣z) 是一个任意观测模型,其参数由 z z z 的参数函数计算得出。重要的是,VAE通常用一个高度灵活的函数逼近器(如神经网络)来参数化 p ( x ∣ z ) p(x | z) p(x∣z) 。尽管潜在随机变量模型的形式如方程 (4) 中所示并不少见,这使得条件 p ( x ∣ z ) p(x | z) p(x∣z) 作为从潜在变量 z z z 到观测变量 x x x 的非线性映射是VAE的一个独特特征。
然而,从 z 到 x 的高度非线性映射导致后验 p ( z ∣ x ) p(z | x) p(z∣x) 的推理难以处理。相反,VAE使用后验的变分近似 q ( z ∣ x ) q(z | x) q(z∣x) ,从而允许使用下界:
log p ( x ) ≥ − K L ( q ( z ∣ x ) ∣ ∣ p ( z ) ) + E q ( z ∣ x ) [ log p ( x ∣ z ) ] , (4) \log p(x) \geq -KL(q(z | x) || p(z)) + \mathbb{E}_{q(z|x)} [\log p(x | z)],\tag{4} logp(x)≥−KL(q(z∣x)∣∣p(z))+Eq(z∣x)[logp(x∣z)],(4)
其中 K L ( Q ∣ ∣ P ) KL(Q||P) KL(Q∣∣P) 是两个分布 Q 和 P 之间的Kullback-Leibler散度。
在 [11] 中,近似后验 q ( z ∣ x ) q(z | x) q(z∣x)是一个高斯 N ( μ , d i a g ( σ 2 ) ) N(\mu, diag(\sigma^2)) N(μ,diag(σ2)),其均值 μ \mu μ和方差 σ 2 \sigma^2 σ2是 x 的高度非线性函数的输出,通常再次是一个神经网络。
生成模型 p ( x ∣ z ) p(x | z) p(x∣z)和推断模型 q ( z ∣ x ) q(z | x) q(z∣x)然后通过最大化它们的参数的变分下界共同训练,其中积分通过随机近似。这个估计的梯度可以有一个低方差估计,通过重新参数化 z = μ + σ ⊗ ϵ z = \mu + \sigma \otimes \epsilon z=μ+σ⊗ϵ并重写:
E q ( z ∣ x ) [ log p ( x ∣ z ) ] = E p ( ϵ ) [ log p ( x ∣ z = μ + σ ⊗ ϵ ) ] , \mathbb{E}_{q(z|x)}[\log p(x | z)] = \mathbb{E}_{p(\epsilon)}[\log p(x | z = \mu + \sigma \otimes \epsilon)], Eq(z∣x)[logp(x∣z)]=Ep(ϵ)[logp(x∣z=μ+σ⊗ϵ)],
其中 ϵ \epsilon ϵ是标准高斯变量的向量。推断模型可以通过标准的反向传播技术来进行随机梯度下降训练。
变分循环神经网络(VRNN)
在本节中,我们介绍了VAE的递归版本,目的是为了模拟序列。受到简单动态贝叶斯网络(DBNs)如HMMs和卡尔曼滤波器启发,提出的变分递归神经网络(VRNN)明确模型了潜在随机变量在连续时间步之间的依赖性。然而,不像这些更简单的DBN模型,VRNN保留了模拟高度非线性动态的灵活性。
VRNN每个操作的图形说明:(a) 使用方程(5)计算条件先验;(b) 使用方程(6)的生成函数;© 使用方程(7)更新RNN隐藏状态;(d) 使用方程(9)推断近似后验;(e) VRNN的整体计算路径。
Generation
VRNN在每个时间步包含一个VAE。然而,这些VAEs是基于RNN的状态变量 h t − 1 h_{t-1} ht−1 的条件。这一新增功能将帮助VAE考虑到序列数据的时间结构。与标准VAE不同,潜在随机变量的先验不再是标准高斯分布,而是遵循以下分布:
z t ∼ N ( μ 0 , t , d i a g ( σ 0 , t 2 ) ) , where [ μ 0 , t , σ 0 , t ] = ϕ t p r i o r ( h t − 1 ) , (5) z_t \sim \mathcal{N}(\mu_{0,t}, diag(\sigma_{0,t}^2)), \text{ where } [\mu_{0,t}, \sigma_{0,t}] = \phi^{prior}_t (h_{t-1}),\tag{5} zt∼N(μ0,t,diag(σ0,t2)), where [μ0,t,σ0,t]=ϕtprior(ht−1),(5)
上述公式说明 z t z_t zt由 h t − 1 h_{t-1} ht−1通过一个神经网络提取特征得到的 μ 0 , t , σ 0 , t \mu_{0,t}, \sigma_{0,t} μ0,t,σ0,t进行计算得到
其中 μ 0 , t \mu_{0,t} μ0,t 和 σ 0 , t \sigma_{0,t} σ0,t 表示条件先验分布的参数。此外,生成分布不仅基于 z t z_t zt 进行条件化,也基于 h t − 1 h_{t-1} ht−1,如下:
x t ∼ N ( μ x , t , d i a g ( σ x , t 2 ) ) , where [ μ x , t , σ x , t ] = ϕ t d e c ( ϕ t p r i o r ( z t , h t − 1 ) ) , (6) x_t \sim \mathcal{N}(\mu_{x,t}, diag(\sigma_{x,t}^2)), \text{ where } [\mu_{x,t}, \sigma_{x,t}] = \phi^{dec}_t (\phi^{prior}_t (z_t, h_{t-1})),\tag{6} xt∼N(μx,t,diag(σx,t2)), where [μx,t,σx,t]=ϕtdec(ϕtprior(zt,ht−1)),(6)
其中 μ x , t \mu_{x,t} μx,t 和 σ x , t \sigma_{x,t} σx,t 表示生成分布的参数。生成分布的参数 ϕ t p r i o r \phi^{prior}_t ϕtprior 和 ϕ t d e c \phi^{dec}_t ϕtdec 可以是任何高度灵活的函数,比如神经网络。 ϕ t p r i o r \phi^{prior}_t ϕtprior 和 ϕ t d e c \phi^{dec}_t ϕtdec 也可以是神经网络,这些网络从 x t x_t xt 和 z t z_t zt 提取特征,我们发现这些特征提取器对于学习复杂序列至关重要。RNN使用以下递归方程更新其隐藏状态:
h t = f θ ( ϕ t e n c ( x t ) , ϕ t p r i o r ( z t ) , h t − 1 ) , (7) h_t = f_{\theta}(\phi^{enc}_t (x_t), \phi^{prior}_t (z_t), h_{t-1}),\tag{7} ht=fθ(ϕtenc(xt),ϕtprior(zt),ht−1),(7)
其中 f f f 最初是从方程(1)的过渡函数。从方程(7)我们发现 h t h_t ht 是 x ≤ t x_{\leq t} x≤t 和 z < t z_{<t} z<t 的函数。因此,方程(5)和方程(6)定义了分布 p ( z t ∣ x ≤ t , z < t ) p(z_t | x_{\leq t}, z_{<t}) p(zt∣x≤t,z<t) 和 p ( x t ∣ z ≤ t , x < t ) p(x_t | z_{\leq t}, x_{<t}) p(xt∣z≤t,x<t),生成模型的参数化导致了以下因式分解的动机:
p ( x ≤ T , z ≤ T ) = ∏ t = 1 T p ( x t ∣ z ≤ t , x < t ) p ( z t ∣ x ≤ t , z < t ) . (8) p(x_{\leq T}, z_{\leq T}) = \prod_{t=1}^T p(x_t | z_{\leq t}, x_{<t})p(z_t | x_{\leq t}, z_{<t}).\tag{8} p(x≤T,z≤T)=t=1∏Tp(xt∣z≤t,x<t)p(zt∣x≤t,z<t).(8)
Inference
以类似的方式,近似后验不仅仅是 x t x_t xt 的函数,也是 h t − 1 h_{t-1} ht−1 的函数,如下式所示:
z t ∣ x t ∼ N ( μ z , t , d i a g ( σ z , t 2 ) ) , 其中 [ μ z , t , σ z , t ] = ϕ t e n c ( ϕ t x ( x t ) , h t − 1 ) , (9) z_t | x_t \sim \mathcal{N}(\mu_{z,t}, diag(\sigma_{z,t}^2)), \text{ 其中 } [\mu_{z,t}, \sigma_{z,t}] = \phi_t^{enc}(\phi_t^x(x_t), h_{t-1}),\tag{9} zt∣xt∼N(μz,t,diag(σz,t2)), 其中 [μz,t,σz,t]=ϕtenc(ϕtx(xt),ht−1),(9)
其中 μ z , t \mu_{z,t} μz,t 和 σ z , t \sigma_{z,t} σz,t 表示近似后验的参数。我们注意到,近似后验的编码和生成的解码通过RNN隐藏状态 h t − 1 h_{t-1} ht−1 进行关联。我们也观察到,对 h t − 1 h_{t-1} ht−1 的这种条件化导致了因子分解:
q ( z ≤ T ∣ x ≤ T ) = ∏ t = 1 T q ( z t ∣ x ≤ t , z < t ) . (10) q(z_{\leq T} | x_{\leq T}) = \prod_{t=1}^T q(z_t | x_{\leq t}, z_{<t}).\tag{10} q(z≤T∣x≤T)=t=1∏Tq(zt∣x≤t,z<t).(10)
Learning
目标函数变为使用方程(8)和方程(10)的时间步长变分下界:
E q ( z ≤ T ∣ x ≤ T ) [ ∑ t = 1 T ( − K L ( q ( z t ∣ x ≤ t , z < t ) ∣ ∣ p ( z t ∣ x ≤ t , z < t ) ) + log p ( x t ∣ z ≤ t , x < t ) ) ] . (11) \mathbb{E}_{q(z_{\leq T} | x_{\leq T})} \left[ \sum_{t=1}^T \left( -KL(q(z_t | x_{\leq t},z_{<t}) || p(z_t | x_{\leq t},z_{<t})) + \log p(x_t | z_{\leq t},x_{<t}) \right) \right].\tag{11} Eq(z≤T∣x≤T)[t=1∑T(−KL(q(zt∣x≤t,z<t)∣∣p(zt∣x≤t,z<t))+logp(xt∣z≤t,x<t))].(11)
如同标准VAE,我们通过最大化它们参数的变分下界共同学习生成模型和推断模型。VRNN的示意图如图1所示,操作(a)-(d)分别对应于方程(1)-(7),方程(9)。VRNN在计算条件先验时应用操作(a)(见方程(5))。如果VRNN的变体(VRNN-I)不应用操作(a),那么先验在时间步之间变得独立。实际上,STORN[2]可以被认为是VRNN-I模型家族的一个实例。我们在实验评估中包括了这个模型版本(VRNN-I),以便直接研究先验(即条件先验)在潜在随机变量上的时间依赖结构的影响。
vrnn_gmm详解
代码:https://github.com/jych/nips2015_vrnn
模型的架构和数据流动如下:
模型架构
-
输入层:
- 数据通过
train_data.theano_vars()
和valid_data.theano_vars()
被加载为Theano变量x
和m_x
,分别用于训练和验证。
- 数据通过
-
全连接层(
FullyConnectedLayer
):x_1
到x_4
和z_1
到z_4
是一系列用于特征变换的全连接层。每个x
层处理来自上一层或原始输入x_t
的信息,而每个z
层处理来自潜在变量z_t
的信息。phi_1
到phi_4
用于构建近似后验分布的参数。prior_1
到prior_4
用于构建先验分布的参数。theta_1
到theta_4
用于构建生成模型的参数。
-
LSTM层:
rnn
层是一个长短时记忆单元,用于捕获数据的时序特征。
-
输出层:
phi_mu
和phi_sig
层分别用于输出近似后验分布的均值和标准差。prior_mu
和prior_sig
层分别用于输出先验分布的均值和标准差。theta_mu
和theta_sig
层分别用于输出生成分布的均值和标准差。
数据流动
-
前向传播:
- 原始输入数据
x
经过一系列全连接层(x_1
到x_4
)被转换为适合LSTM层处理的形式。
- 原始输入数据
-
递归处理:
inner_fn
函数定义了每个时间步的处理方式。它首先通过phi_*
层处理输入x_t
和先前的状态s_tm1
来获取近似后验分布的参数,然后从该分布中采样得到z_t
。z_t
接着经过全连接层z_1
到z_4
处理,并和x_t
一起被送入rnn
层得到新的状态s_t
。
-
后向传播和参数更新:
- Theano的
scan
函数被用来迭代整个序列,应用inner_fn
函数,并收集每个时间步的输出。 - 通过比较每一步生成的均值和标准差与先验和后验的相应值,使用
KLGaussianGaussian
计算Kullback-Leibler散度,作为正则化项。 - 使用
Gaussian
函数计算重构损失,与KL散度相加得到变分下界(也即负对数似然)。
- Theano的
-
优化:
- 通过定义的
Adam
优化器和Theano函数进行梯度下降,更新模型的参数以最小化变分下界。
- 通过定义的
-
监控:
monitor_fn
函数用于在验证数据上计算和监控各种统计量,如模型的上界负对数似然、重构项、KL项以及各参数的最大值、最小值和均值。