文章目录
无监督学习基础
无监督学习是指从无标签的数据中学习出一些有用的模式。
监督学习:构建输入-输出之间的映射关系;
无监督学习:发现隐藏的数据中的有价值信息,包括有效的特征、类别、结构以及概率分布。
主要应用
主要分为特征学习和密度估计两大应用
特征学习中,又分为聚类和分布式表示两种类型。
关于特征学习,核心思想是:化繁为简。
从数据中抽象出本质特征,训练时只有输入数据。
关于密度估计,核心思想是:无中生有。
以Generation为例,根据特征生成数据,训练时只有输出数据。
名词解释
无监督特征学习:从无标签的训练数据中挖掘有效的特征或表示。用来进行降维、数据可视化或监督学习前期的数据预处理;
概率密度估计:根据训练样本来估计样本空间的概率密度。又详细分为参数密度估计和非参数密度估计。参数密度估计是假设数据服从某个已知概率密度函数的参数。非参数密度估计是不假设数据服从某个已知分布,只利用训练样本对密度进行估计,可以进行任意形状密度估计。
学习要素
- 模型;
- 学习准则;
- 优化算法。
其中,损失函数中,无监督特征学习主要采用最小重构误差;概率密度估计采用最大似然估计。
无监督特征学习
聚类
K-Means
聚类算法最困扰的问题在于无法确定簇的个数,只能凭经验选择。
HAC
该方法,构建了一个树。
其过程为:
- 有五个样本,经过比较,前两个样本相似度最高,我们构建一个pair;
- 四个样本,最后两个样本相似度最高,构建一个pair;
- 有三个样本,前两个样本相似度高,构建一个pair;
- 最后两个样本归并于root。
决定簇个数的方法是阈值划分法。我们对相似度设定一个阈值,低于该阈值,看看有几个样本。图中划分为了三类。
分布式表示
聚类的话,可以看做是一种特征学习,但是比较片面,划分很绝对。
因此,我们给出了很多个类别,得到一个样本属于不同类别的分数。
这类似于“六边形战士”之流。
降维表示
降维表示和分布式表示其实是一样的,不过是换一种称呼。
为什么要降维?
维数灾难:
1.数据样本稀疏;
2.距离计算困难。
我们在分析KNN的性能时,做出了领域内必有点的假设,这在现实任务中是很难满足的。因为大部分数据维度较高,分布稀疏。同时高维还会带来内积、距离计算困难。
而解决维数灾难的一个方案是——降维(“维数约减”)。这有助于提高样本密度,简化距离计算。
除此之外,有一些特征是没必要、可以省略的。降维也是一个提取特征的过程。
如何进行降维?
核心思想是找到一个函数。
特征选择
在一些视频中,被称为脑瘫降维法。
就是从高维数据中选择几个维度来代表这个样本。
PCA
PCA
PAC要求满足最大化方差以及最小化重构误差。
Auto-encoder
我们希望训练一个网络,对数据进行自动降维,这称之为Encoder;
然而,这样一个Encoder难以训练,因为没有对其结果进行评价的方法。
于是,我们设计一个decoder,将code复原,计算它与原来的图像的重构误差。
这样的想法,我们在PCA中已经见过:
我们只要将其中W的计算,转化为网络自动训练,就可以得到Auto Encoder。
其中瓶颈层得到的数据,就是降维后的特征向量。
如果在输入层,瓶颈层,输出层之间多加几层网络,就转化为了Deep Auto Encoder。
我们比较PCA和Auto Encoder的效果,可以清晰地发现两者的差异。
文本检索
文本检索,就是找到相似内容。
我们可以将文本抽象为一个向量,通过计算向量内积/余弦相似性的方式判读文本内容的相似程度。
那么如何抽象为一个向量就成为了文本检索的关键问题。
在传统的词袋模型中,我们首先构建一个语料库,通过对出现的词汇置1来表示一句话。这样的做法可行,但有很大的缺点,就是无法考虑词汇之间语义之间的相关性。apple和pen对词袋模型而言是一视同仁的。
而我们通过自编码器得到特征,就可以很好的解决这一问题。
图像检索
图像检索也是同样的道理。
传统的图像检索在欧式空间中进行,相似性是通过欧氏距离度量。
我们可以通过自编码器得到欧氏空间中的隐式嵌入空间中的向量,依次来度量相似性。
预训练DNN
在过去,训练一个深度神经网络是很困难的,因为数据量过大。因此,我们可以采用自编码器,对每一层做一个预训练。
本身神经网络的每一层都是一个提特征的过程,自编码器也是一个提特征的过程,两者的目标是有相似性的。
其过程为:
Auto-encoder for CNN
对于图像的处理,我们一般采用CNN,于是Auto-encodor也有对应CNN的版本:
令人困惑的是Unpooling和Deconvolution究竟是个什么操作???
Unpooling:
以MaxPooling为例,我们在做maxpooling时,记录下了最大值的位置,我们只要将特征图的每个像素点填充到原来的位置,其余地方补0即可。
Deconvolution:
Deconvolution其实就是Convolution + padding。
Auto Encoder +
在自编码器中,我们最初的做法是,最小化重构误差。
那么出了最小化重构误差,还有其他的方法吗?
我们的目的是为了让encoder输出与样本相关的code,因此,在整体上的思想就是判断样本与code的相关性。
我们可以借助GAN的思想,设计一个Discriminator来判断这一点。
我们给出很多正负样本(正样本,匹配;负样本,不匹配),而Discriminator对其打分、分类即可。
于是,最小化重构误差转化为了最小化交叉熵损失函数。
本质上,最小化重构误差是该方法的特殊化:
特殊点在于:
- 判别器输出的得分转化为了重构误差;
- 训练时,没有用到负样本。
除此之外,我们还希望特征可以有效表示数据,也就是说,特征应该有可解释性,那么这该如何做到?
我们用特征解耦的应用来讲解。 耦合操作,是将几个东西连接在一起,而解耦操作则是将他们分开。
输入的数据,往往带有诸多信息,我们希望能通过特征解耦,将这些信息分开。比如说encoder得到的code的前100维是信息A,后一百维是信息B,这就使得code具有了可解释性。
思想有了,那么该怎么实现呢?
假设一段音频只包含语者声音与说话内容两个信息。我们借助GAN的思想,创建一个Speaker Classifier,用来对前100维的code进行判别(打分、Discriminator),看看它究竟属于哪一个说话人。
我们希望Classifier得到信息后,完全都猜错,也就是说,code的前100维没有语者信息。从而,信息得到了划分。
整体的训练是一个交替训练的过程。
我们可以用划分的code进行随机组合,得到变声器。
矩阵因子分解(Matrix Factorization)
该矩阵的行标签是动漫人物,该矩阵的列标签是路人。
矩阵中的数据是路人给动漫人物的打分。
我们首先给出这样一个概念:万事万物背后,都有一个向量,代表着其性格、喜好等等。这样一个向量也可以认为是其特征向量。
这样一个评分矩阵是显示的,而路人和动漫角色背后的向量则是隐式的。
得到这个向量要解决两方面问题:
- 向量维数;
- 向量数值。
向量维数问题其实和聚类问题一样,都是经验所得;但是向量数值问题,可以通过矩阵因子分解得到。
评分矩阵也称为反馈矩阵;
K是特征向量数量;M为路人数量;N为动漫人物数量。
关于路人矩阵和动漫人物矩阵可以通过SVD分解求解。
我们希望分解后的矩阵相乘后和反馈矩阵尽量接近,因此我们通过重建误差度量。
但是反馈矩阵有一个很大的问题:现实中,会出现缺失值,无法进行SVD分解。
我们给出的解决方案是忽略缺失部分,优化损失函数,实现特征嵌入。