VAE(Variational Auto-Encoder)(2014)
关于VAE的介绍,建议去看苏建林的VAE讲解,写的非常好,看完第一篇基本就可以理解VAE的原理了。如果有时间可以阅读剩下两篇的深入分析。建议多读几遍,方便你形成一个清晰的VAE认识。
苏剑林. (2018, Mar 18). 《变分自编码器(一):原来是这么一回事 》[Blog post]. Retrieved from https://www.spaces.ac.cn/archives/5253
苏剑林. (2018, Mar 28). 《变分自编码器(二):从贝叶斯观点出发 》[Blog post]. Retrieved from https://kexue.fm/archives/5343
苏剑林. (2018, Apr 03). 《变分自编码器(三):这样做为什么能成?》[Blog post]. Retrieved from https://kexue.fm/archives/5383
简单来说,变分自编码器(VAE)是一种主要用于数据生成的自编码器的变体。当作为生成模型时,首先利用数据训练变分自编码器,然后只使用变分自编码器的解码部分,自动生成与训练数据类似的输出。
VAE假设后验分布。给定一个真实的样本,假设存在专属于的分布,我们用两个神经网络,去寻找专属于的后验分布的均值和方差。(选择拟合是因为总是非负的,用网络拟合一个非负值需要加激活函数,而可正可负。)
因为,从这个专属的分布中采样一个出来,经过生成器得到,最小化即为网络的目标。
但最小化的拟合过程会使得方差尽可能接近0,使得随机性下降,退化为普通的AutoEncoder,这样VAE特有的生成模型就不存在了。因此,VAE让尽可能去看齐,防止了噪声(方差)为0,保证了模型的生成能力。根据
得到了,即可以放心的从N(0,I)中采样去生成图像了。只使用变分自编码器的解码部分,自动生成与训练数据类似的输出。
如何让所有的都向看齐呢?使用KL散度:
其中,d 为隐向量的维度。
相对熵又称KL散度,如果我们对于同一个随机变量 x 有两个单独的概率分布 P(x) 和 Q(x),我们可以使用 KL 散度(Kullback-Leibler (KL) divergence)来衡量这两个分布的差异。
VAE的优点总结:
- 在传统自编码器的隐层表达上增加一个对隐变量的约束,提出了一种将概率模型和神经网络结构结合的方法
- 使编码器产生的隐层表达满足正态分布,能够更好的生成和输入近似的数据
CVAE(Collaborative Variational AutoEncoder)(2017)
论文:Collaborative Variational Autoencoder for Recommender Systems
,KDD,2017
CVAE的核心思想是:CVAE = PMF + VAE(与CTR/CDL类似的耦合结构)
如果仔细阅读过《推荐系统实践(3)---CDL》中介绍的CDL的paper,你会发现CVAE的通篇描述以及文章结构甚至都和CDL很像,Loss构成相近,参数的迭代更新方式也是一样的。CVAE结构如图所示。
原理介绍
与PMF相同,作者定义向量分布如下:
User 隐向量:
Item 协同信息隐向量:
VAE部分:VAE网络用于从 item 的内容信息中提取隐向量。这里需要重点说明一下,作者在文章中将item 内容信息隐向量定义为,有,其中是由 VAE的 encoder 网络生成。实际上,,如下图所示,中间态的是由一个标准正态分布重参数获得的,因而是服从正态分布的重采样,用于docoder中生成数据,不能表示 item 的内容信息隐向量。
看了作者的代码实现,在实验中,作者的 encoder 网络生成的 item 内容信息隐向量应该是,这验证了我的想法。
item 隐向量: 作者表示为,但我觉得表示为更为合适,下文沿用这种写法。
Prediction:
损失函数
其中 CEloss 是item的内容信息 encoder前 和 docoder后 的差值,类似于交叉熵的计算形式。
迭代形式
作者与CTR/CDL相同,采用 EM算法。
Expectation:固定,利用VAE网络的bp更新(即)
Maximization:固定,利用块坐标下降法更新
值得一提的是,在实现时,作者并没有使用的形式,而是使用,并希望去逼近其内容向量。
改进之处
1.CVAE直接对标的模型就是CDL,作者这样描述CDL的问题:
denoising autoencoders(DAEs) have in fact no Bayesian nature and the denoising scheme of the DAEs is in fact not from a probabilistic perspective but rether frequentist perspective.
即CDL的降噪方案不是来自概率分布而是频率分布,因此很难进行贝叶斯推理。并且噪声添加方式需要考虑内容信息的形式,例如文本内容的加噪方案可能不是图像内容的良好加噪方案。
2.作者使用 逐层预训练 的VAE模型来有效表示内容信息的隐向量,这一点是非常值得学习的,好的预训练,会让实验结果差非常多。
代码实现
用pytorch实现了CVAE,并用citeulike-a数据集做了实验。
https://github.com/weberrr/recsys_model
主要说一下实现中的model.fit()函数:
def fit(self, train_users, test_users, train_items, item_side_info):
side_input = self.initialize(train_users, train_items, item_side_info)
for epoch in range(self.max_epoch):
loss, side_latent = self.e_step(side_input)
self.V[:] = side_latent.clone().detach().numpy()
recall = self.m_step(train_users, train_items, test_users)
print("Epoch:{}, Loss:{}, Recall:{}".format(epoch, loss, recall))
e_step中固定U,V,更新V_theta
m_step中固定V_theta,更新U,V
我的VAE逐层预训练做的比较潦草,效果比作者的低约0.02左右