如何使用 RBM 进行分类?

数据挖掘 分类 RBM
2021-09-15 03:07:00

目前我正在玩受限玻尔兹曼机,因为我在玩它,所以我想尝试用它对手写数字进行分类。

我创建的模型现在是一个非常漂亮的生成模型,但我不知道如何进一步使用它。

这篇文章中,作者说,在创建了一个好的生成模型之后,“然后使用标记的样本在 RBM 之上训练一个判别分类器(即线性分类器,支持向量机) ”并进一步说明“因为你传播了数据向量到 RBM 模型的隐藏单元中得到隐藏单元向量,或者数据的更高层次的表示”。问题是我不确定我是否做对了。

这是否意味着我所要做的就是将输入传播到隐藏单元,然后我就有了用于分类的 RBM 功能?

有人可以向我解释这个过程吗?

3个回答

受限玻尔兹曼机回顾

受限玻尔兹曼机 (RBM) 是一种生成模型,它学习输入的概率分布。这意味着,在经过训练之后,RBM ​​可以从学习的概率分布中生成新的样本。可见单元上的概率分布v 是(谁)给的

p(vH)=一世=0p(v一世H),
在哪里
p(v一世H)=σ(一个一世+j=0Hwj一世Hj)
σ 是 sigmoid 函数, 一个一世 是可见节点的偏差 一世, 和 wj一世 是来自的重量 Hjv一世. 从这两个方程可以得出p(vH) 仅取决于隐藏状态 H. 这意味着有关可见样本的信息v 生成后,必须存储在隐藏单元、权重和偏差中。

使用 RBM 进行分类

在使用 RBM 进行分类任务时,您使用以下想法:因为有关如何生成训练或测试数据的信息保存在隐藏单元中 H,您可以通过将训练样本输入 RBM 的可见单元来提取这些潜在因素,将其向前传播到隐藏单元,并将隐藏单元的这个向量用作特征向量。您不再对可见单位进行任何向后传递。

这个隐藏向量只是输入数据的转换版本——它本身不能对任何东西进行分类。要进行分类,您将使用隐藏向量而不是“原始”训练数据作为输入来训练任何分类器(线性分类器、SVM、前馈神经网络或其他任何东西)。

如果您正在构建一个深度置信网络 (DBN) - 用于以无监督方式预训练深度前馈神经网络 - 您将采用此隐藏向量并将其用作新 RBM 的输入,然后将其堆叠在它的上面。这样,您可以逐层训练网络,直到达到所需的大小,而无需任何标记数据。最后,您将在顶部添加例如 softmax 层,并在您的分类任务上使用反向传播训练整个网络。

@hbaderts 完美地描述了整个工作流程。但是,如果您对这个想法完全陌生,它可能没有任何意义。因此,我将用外行的方式来解释它(因此,我将省略细节):

将深度网络视为转换数据的功能。转换的示例包括标准化、记录数据等。您正在训练的深度网络具有多个层。这些层中的每一层都使用某种学习算法进行训练。对于第一层,您将原始数据作为输入传递并尝试获取一个函数,该函数将返回那些“相同的原始数据”作为输出。但是,您没有得到完美的输出。因此,您将获得输入的转换版本作为第一层的输出。

现在,对于第二层,您将那些“转换后的数据”作为输入传递并重复整个学习过程。你一直在为你的深层网络中的所有层这样做。

在最后一层,您得到的是原始输入数据的“转换版本”。这可以被认为是原始输入数据的更高层次的抽象。请注意,您尚未在深度网络中使用标签/输出。因此,到目前为止,一切都是无监督学习。这称为逐层预训练。

现在,您想训练一个分类器/回归模型,这是一个监督学习问题。实现该目标的方法是从深层网络的最后一层获取原始输入的“最终转换版本”,并将它们用作任何分类器的输入(例如 knn 分类器/softmax 分类器/逻辑回归等)。这称为堆叠。

当你训练这个最后一步的分类器/学习器时,你在整个网络中传播你所有的学习。这确保您能够从标签/输出中学习并相应地修改学习的逐层参数。

因此,一旦您训练了生成模型,就可以获取生成模型的输出并将其用作分类器/学习器的输入。随着学习的继续,让错误流经整个网络,以便您可以修改在前面步骤中学习的逐层参数。

您可以在图像上训练堆叠的 RBM,然后在 RBM 堆栈的输出和标签的串联上训练最终的 RBM。然后,您实际上可以使用 RBM 进行分类。Hinton ++ 的这篇文章解释了这种方法A Fast Learning Algorithm for Deep Belief Nets ,你也可以看看这个演示