判别模型 vs 生成模型
机器学习模型通常分为判别模型和生成模型两类,这一区分源于构建和训练这些模型时使用的概率公式。
判别模型学习标签yyy基于数据点xxx的概率,数学上表示为p(y∣x)p(y|x)p(y∣x)。为了将数据点分类到某个类别,我们需要学习数据与类别之间的映射关系,这种映射可以描述为概率分布。
生成模型则学习没有外部标签的数据点的概率分布,数学上表示为p(x)p(x)p(x)。在这种情况下,数据本身"竞争"概率密度。
条件生成模型是另一类模型,尝试学习数据xxx基于标签yyy的条件概率分布,表示为p(x∣y)p(x|y)p(x∣y)。
生成模型
生成模型的目标是学习概率密度函数p(x)p(x)p(x)。这个概率密度有效地描述了训练数据的行为,并通过从分布中采样来生成新数据。理想情况下,我们希望模型学习到的概率密度p(x)p(x)p(x)与数据密度pdata(x)p_{data}(x)pdata(x)相同。
生成模型可分为两类:
- 显式密度模型:能够显式计算密度函数ppp
- 隐式密度模型:不计算p(x)p(x)p(x),但训练后能够从底层分布中采样
潜变量模型
潜变量模型旨在用潜变量建模概率分布。潜变量是将数据点转换到连续低维空间的表示。
直观上,潜变量将以更简单的方式描述或"解释"数据。在严格的数学形式中,遵循概率分布p(x)p(x)p(x)的数据点xxx被映射到遵循分布p(z)p(z)p(z)的潜变量zzz。
基本术语定义:
- 先验分布p(z)p(z)p(z):建模潜变量的行为
- 似然p(x∣z)p(x|z)p(x∣z):定义如何将潜变量映射到数据点
- 联合分布p(x,z)=p(x∣z)p(z)p(x,z)=p(x|z)p(z)p(x,z)=p(x∣z)p(z):似然和先验的乘积,本质描述模型
- 边际分布p(x)p(x)p(x):原始数据的分布,模型的最终目标
- 后验分布p(z∣x)p(z|x)p(z∣x):描述可由特定数据点产生的潜变量
生成过程:从p(z)p(z)p(z)采样zzz,然后从p(x∣z)p(x|z)p(x∣z)采样xxx
推断过程:从p(x)p(x)p(x)采样xxx,然后从p(z∣x)p(z|x)p(z∣x)采样zzz
用最大似然训练潜变量模型
最大似然估计是一种完善的估计概率分布参数的技术,通过最大化似然函数来实现。数学上表示为:
θML=argmaxθ∑i=1Nlogpθ(xi)\theta^{ML} = arg \max_{\theta} \sum_{i=1}^{N} log p_{\theta}(x_{i})θML=argθmaxi=1∑Nlogpθ(xi)
为了应用梯度下降,需要计算边际对数似然函数的梯度:
∇logpθ(x)=∫pθ(z∣x)∇θlogpθ(x,z)dz\nabla log p_{\theta}(x) = \int p_{\theta}(z |x) \nabla_{\theta} log p_{\theta}(x,z) dz∇logpθ(x)=∫pθ(z∣x)∇θlogpθ(x,z)dz
变分推断
变分推断用易于处理的分布近似难处理的后验分布,通过优化问题计算。我们想用称为变分后验的另一分布qϕ(z∣x)q_{\phi}(z|x)qϕ(z∣x)来近似实际的pθ(z∣x)p_{\theta}(z|x)pθ(z∣x)。
证据下界(ELBO)定义为:
Lθ,ϕ(x)=Eqϕ(z)[logpθ(x,z)qϕ(z∣x)]≤logpθ(x)L_{\theta,\phi}(x) = \textbf{E}_{q_{\phi}(z)} \left[ log \frac{p_{\theta}(x,z)}{q_{\phi}(z|x)} \right] \leq log p_{\theta}(x)Lθ,ϕ(x)=Eqϕ(z)[logqϕ(z∣x)pθ(x,z)]≤logpθ(x)
扩展ELBO方程:
Lθ,ϕ(x)=logpθ(x)−KL(qϕ(z∣x)∣∣pθ(z∣x))L_{\theta,\phi}(x) = log p_{\theta}(x) - \textbf{KL}(q_{\phi}(z|x) || p_{\theta}(z|x))Lθ,ϕ(x)=logpθ(x)−KL(qϕ(z∣x)∣∣pθ(z∣x))
摊销变分推断
在摊销变分推断中,我们训练外部神经网络来预测变分参数,而不是对每个数据点优化ELBO。该网络在一些论文中称为推断网络。
重参数化技巧
直观上,我们可以将重参数化技巧理解为:由于无法计算期望的梯度,我们将概率分布的参数从分布空间"移动"到期望空间。
对于高斯分布,我们可以用固定已知分布中的样本表示zzz:
z=μ+σϵwithϵ∼N(0,1)z = \mu +\sigma \epsilon \quad with \quad \epsilon \sim N(0,1)z=μ+σϵwithϵ∼N(0,1)
变分自编码器
对于主模型,我们选择神经网络,该网络将参数化变分后验qϕ(z∣x)q_{\phi}(z|x)qϕ(z∣x)(也称为解码器)。
self.decoder = tf.keras.Sequential([
tf.keras.layers.InputLayer(input_shape=(latent_dim,)),
tf.keras.layers.Dense(units=7*7*32, activation=tf.nn.relu),
tf.keras.layers.Reshape(target_shape=(7, 7, 32)),
tf.keras.layers.Conv2DTranspose(
filters=64, kernel_size=3, strides=2, padding='same',
activation='relu'),
tf.keras.layers.Conv2DTranspose(
filters=32, kernel_size=3, strides=2, padding='same',
activation='relu'),
tf.keras.layers.Conv2DTranspose(
filters=1, kernel_size=3, strides=1, padding='same'),
])
我们使用摊销变分推断训练模型,因此需要另一个神经网络作为推断网络(也称为编码器),它将参数化似然pθ(x∣z)p_{\theta}(x|z)pθ(x∣z)。
self.encoder = tf.keras.Sequential([
tf.keras.layers.InputLayer(input_shape=(28, 28, 1)),
tf.keras.layers.Conv2D(
filters=32, kernel_size=3, strides=(2, 2), activation='relu'),
tf.keras.layers.Conv2D(
filters=64, kernel_size=3, strides=(2, 2), activation='relu'),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(latent_dim + latent_dim),
])
为了从编码器生成样本并将其传递给解码器,我们还需要利用重参数化技巧:
def reparameterize(self, mean, logvar):
eps = tf.random.normal(shape=mean.shape)
return eps * tf.exp(logvar * .5) + mean
两个网络通过最大化ELBO联合训练,在VAE情况下写为:
Lθ,ϕ(x)=Eqϕ(z∣x)[logpθ(x∣z)]−KL(qϕ(z∣x)∣∣pθ(z))L_{\theta,\phi}(x) = \textbf{E}_{q_{\phi}(z|x)} [ log p_{\theta}(x|z) ] - \textbf{KL}(q_{\phi}(z |x) || p_{\theta}(z))Lθ,ϕ(x)=Eqϕ(z∣x)[logpθ(x∣z)]−KL(qϕ(z∣x)∣∣pθ(z))
损失项分析
第一项控制VAE从变分后验的样本zzz重构数据点xxx的效果,称为负重构误差。第二项控制变分后验与先验的接近程度。
训练过程:
- 将数据点传递给编码器,输出近似后验的均值和对数方差
- 应用重参数化技巧
- 将重参数化样本传递给解码器,输出似然
- 计算ELBO并反向传播梯度
生成新数据点:
- 从正态先验分布采样一组潜向量
- 从编码器获取潜变量
- 解码器将样本的潜变量转换为新数据点
def generate(model, epoch, test_sample):
mean, logvar = model.encode(test_sample)
z = model.reparameterize(mean, logvar)
predictions = model.sample(z)
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)或者 我的个人博客 https://blog.qife122.com/
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
1249

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



