深度学习UFLDL教程翻译之自我学习

一、概述
假设我们有足够强大的学习算法,得到较好结果的其中一种最靠谱的方法是给算法提供更多的数据 。这验证了在机器学习的那句格言:“有时候获胜的不是谁有最好的算法,而是谁有最多的数据 。”
也许有人总能得到有标记的数据,但这么做成本很高 。特别地,研究人员已经采用极致的工具例如AMT(亚马逊土耳其机器人)来得到大量训练集 。尽管拥有大量的人们人工标记的数据相比拥有大量的研究人员的工程性质的特征已经迈进了一步,但还能做的更好 。特别地,自我学习以及无监督特征学习的方法是说,如果我们让我们的算法从无标记的数据学习,那么我们就可以容易地从大量的数据中获得和学习特征 。即使一个无标记样本给出的信息量比一个有标记样本少,如果我们能得到成吨的前者——例如,通过从网上下载到随机的无标记的图片/音频/文档——还有如果我们的算法可以有效地挖掘无标记数据(的特征),那么我们可以比大量工程手段的和手工标记的方法得到更好的结果 。
在自我学习和无监督特征学习中,我们会给算法提供大量的无标记数据,用它们来学习输入的好的特征表示 。如果我们想完成一项特定的分类任务,那么我们将采用这个特征表示以及任何(也许少量)我们为该分类任务准备的标记数据,并在这些数据上采用监督学习方法解决分类问题 。
这个思想在以下问题可能有最强大的作用:我们有大量的无标记数据,以及少量的有标记数据 。然而,它们通常给出好结果,即使我们只有标记数据(这种情况下我们通常用有标记数据执行特征学习,但忽略标记) 。
二、学习特征
我们已经知道自动编码器如何用于从无标记数据中学习特征 。具体而言,假如我们有一个无标记的训练集{xu(1),xu(2),….xu(mu)},有mu个无标记样本 。(下标u代表无标记 。)然后我们在这些数据上训练稀疏自动编码器(也许有适当的白化或其它预处理过程):

深度学习UFLDL教程翻译之自我学习

文章插图
训练了模型参数W(1),b(1),W(2),b(2)后,对任何新输入x,我们可以计算隐藏层激活值a的相应向量 。正如我们之前看到的,这通常比原始的输入x得到更好的输入的表示 。我们也可以通过计算特征/激活值a来可视化这个算法,正如下面的神经网络:
深度学习UFLDL教程翻译之自我学习

文章插图
这正是我们之前说的稀疏自编码器,我们去掉了最后一层 。
现在我们假设有一个有标记的训练集
,有ml个样本 。(下标l代表有标记 。)我们现在可以寻找输入的更好的表示方法 。特别来讲,不是用xl(1)表示第一个训练样本,而是将xl(1)作为我们自动编码器的输入,并得到激活值al(1)的相应向量 。为了表示这个样本,我们可以用al(1)代替原来的特征向量 。或者,我们可以将两个特征向量连接在一起,得到表示(xl(1),al(1)) 。
这样,我们的训练集变成了
(如果我们使用替代的表示方法,用al(i)表示第i个训练样本),或者
(如果我们使用连接的表示方法) 。在实践中,连接的表示方法通常运行地更好,但考虑到内存和计算的表示,我们也有时候使用替代的表示方法 。
最后,我们可以训练有监督的学习算法例如SVM、逻辑斯特回归等等,来得到预测y值的函数 。给出测试样本xtest,我们可以执行相同的过程:把它输入自动编码器得到atest 。然后,将atest或者(xtest,atest)输入训练好的分类器得到预测值 。
三、预处理数据的时候
在我们学习无标签数据{xu(1),xu(2),….xu(mu)}的特征学习阶段,我们可能已经计算不同的预处理参数 。例如,我们会计算数据的平均值并减去这个平均值执行平均值标准化,或者使用PCA计算矩阵U用UTx表示数据(或者使用PCA白化或ZCA白化) 。如果是这种情况,那么将这些预处理参数保存起来非常重要,以便在有标记的训练集和测试集上使用相同的参数,来确保我们总是以同样的方式变换数据(指预处理)并输入自动编码器 。特别地,如果我们使用无标记数据和PCA计算了一个矩阵U,那么我将保持相同的矩阵U去预处理有标记的样本和测试数据 。我们不应该在使用有标记数据的时候重新估计一个不同的矩阵U(或者平均值标准化的平均值),因为这会引起截然不同的预处理变换,使得自动编码器的输入分布与实际训练的时候非常不同 。