用一种方法是Bag-of-word词袋,意思是向量的sentence就是let think sentence(假设世界上有1w个词汇,那么这个向量的sentence就是1w维)。甚至你可以将其乘上weight表示词汇的重要性。但是这种方法没办法考虑semantics语义。所以这时候就可以用Auto-encoder自编码器,输入document or query,通过自编码器压缩成二维,每个点表示一个document,不同的颜色的类代表document属于哪类。再做检索时输入的单词通过自编码器映射到哪一类上,就可以把相关的文本检索出来。如果用Latent Semantic Analysis LSA隐语义分析是得不到类似的效果。
自编码器 - 类似图像搜索:
图像检索可以计算input与其他pixel的相似程度,找出最像的图像,但这样的结果实际上并不好。因此可以用自编码器把image转成一个code再在此上算相似度做检索。(因为这是无监督的,数据量大)
自编码器也可以用在Pre-training预训练上,预训练是用来找到神经网络比较合适的初始化参数。
比如训练网络输入784维,中间第一层1000维,第二层1000维,第三层500,输出10维。
那么我们可以首先训练一个深度自编码器,input and output都是784维,中间code是 1000维,这样得到第一层的w权重;再继续训练input and output都是1000维,中间code是 500维,得到第二层的w权重,以此类推,最后得到各层的初始化参数,最后再用反向传播调整一遍,这个步骤称为find-tune(迁移学习的一种手段)。
当网络的coder要比输入dimension小,如果比之大的话可能不会learn。当发现hidden layer比input大时就需要加上一个很强的regularization L1正则项加在层输出上。
还有种方法能让自编码器效果更好,叫做De-noising Auto-encoder去噪自编码器,即主动在原来的input上加上一些noise噪声变成\(x‘\)后再进行自编码,要求output与原input误差越小越好。这样使模型在学习时把噪声过滤掉了。
还有一种方法叫做contractive auto-encoder压缩自编码器,即在学习code时加上一个contract压缩,表示当input有变化的时候,对code的影响是被minimize最小的。与之前的去噪自编码器实际类似,制式不同角度来看,降低变化对code的影响。
CNN自编码器:
CNN而言将卷积和池化层交替,让image越来越小。对编码器而言就是做相同的事,解码器就是做相反的事。convolution pooling convolution pooling & deconvolution unpooling deconvolution unpooling,让输入和输出越接近越好。
反池化操作:pooling是把原矩阵分组缩小,unpooling就是把小的矩阵扩大。相应的位置对称操作,把小的矩阵做扩散,部分地方补0.(并非唯一做法,在keras种是重复某些值)
反卷积操作:反卷积实际上就是卷积。只不过是把维度还原成原先的维度,不同的是权重是相反的(转置)。
除了CNN自编码器,后续在介绍到RNN时还会讲到sequence-to-sequence auto-encoder序列到序列编码器,针对于语音和文章等不好表示成向量的数据结构。(如果用bag-of-word词袋强行表示成向量的话会失去语义以及前后上下文关系)
第二十一章 无监督学习 - 深度生成模型Ⅰ
deep generation model深度生成模型,目的是通过输入图像训练从而输出图像的一个大型神经网络,属于无监督学习的一个分支。这个分支希望的是机器不仅能进行辨识,更重要的是能够画出一只猫或者狗,通晓其概念。这个分支内大概分为三个方法:PixelRNN,VAE,GAN(像素循环神经网络,变分编码器,生成对抗网络)
PixelRNN像素循环神经网络:
RNN是专门处理序列数据,即可处理可变输入。(相当于少的地方补了0)。pixelrnn的工作方式是首先随机涂一个像素,然后输出下一个像素点。(实际上就是RGB三维向量)之后再输入这两个像素输出下一个像素,循环直至结束。属于无监督,不需要任何标签,并且其产生的图最为清晰。
pixelRNN生成模型练习:输入pixel时换了一种表示方法用1-of-N-encoding独热码对像素颜色编码产生n维向量,颜色过大再用聚类合并最后得到176种不同颜色。(因为如果用RGB三维向量表示无法使某个值很高,产生的图都比较灰颜色不鲜明)
网络架构只用了一层LSTM还有521cells
variational auto-encoder VAE变分自动编码器
深度生成模型的目的就是不确定随机输入后输出图像等。自编码器种的解码器部分就可以做到这样的功能,先训练完自编码器,然后将解码器单独拿出来input随机向量(与code同维),输出的可以是一张完整的图像。