【发布时间】:2019-02-09 11:42:59
【问题描述】:
根据这个website,深度信念网络只是将多个RBM堆叠在一起,使用前一个RBM的输出作为下一个RBM的输入。
在 scikit-learn documentation 中,有一个使用 RBM 对 MNIST 数据集进行分类的示例。他们将RBM 和LogisticRegression 放入管道中以实现更高的准确性。
因此我想知道是否可以将多个 RBM 添加到该管道中以创建深度信念网络,如下面的代码所示。
from sklearn.neural_network import BernoulliRBM
import numpy as np
from sklearn import linear_model, datasets, metrics
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
digits = datasets.load_digits()
X = np.asarray(digits.data, 'float32')
Y = digits.target
X = (X - np.min(X, 0)) / (np.max(X, 0) + 0.0001) # 0-1 scaling
X_train, X_test, Y_train, Y_test = train_test_split(X, Y,
test_size=0.2,
random_state=0)
logistic = linear_model.LogisticRegression(C=100)
rbm1 = BernoulliRBM(n_components=100, learning_rate=0.06, n_iter=100, verbose=1, random_state=101)
rbm2 = BernoulliRBM(n_components=80, learning_rate=0.06, n_iter=100, verbose=1, random_state=101)
rbm3 = BernoulliRBM(n_components=60, learning_rate=0.06, n_iter=100, verbose=1, random_state=101)
DBN3 = Pipeline(steps=[('rbm1', rbm1),('rbm2', rbm2), ('rbm3', rbm3), ('logistic', logistic)])
DBN3.fit(X_train, Y_train)
print("Logistic regression using RBM features:\n%s\n" % (
metrics.classification_report(
Y_test,
DBN3.predict(X_test))))
但是,我发现添加到管道中的 RBM 越多,准确度就越低。
1 个 RBM 在管道中 --> 95%
2 个 RBM 正在筹备中 --> 93%
3 个 RBM 正在筹备中 --> 89%
下面的训练曲线表明,100 次迭代正好可以收敛。更多的迭代会导致过拟合,可能性会再次下降。
批量大小 = 10
批量大小 = 256 或以上
我注意到一件有趣的事情。如果我使用更高的批量大小,网络的性能会下降很多。当批量大小超过 256 时,准确率下降到仅不到 10%。不知何故,训练曲线对我来说没有意义,第一个和第二个 RBM 学得不多,但第三个 RBM 突然学得很快。
看起来 89% 在某种程度上是具有 3 个 RBM 的网络的瓶颈。
我想知道我在这里做错了什么。我对深度信念网络的理解正确吗?
【问题讨论】:
-
请注意,堆叠在一起的 RBM 越多,需要估计的参数就越多。 100 次迭代可能还不够。您是否检查过模型是否收敛?你检查过验证损失吗?它通常应该下降一段时间,然后在某个时候发生过拟合,然后开始上升。
-
RBM 堆栈以贪婪的方式进行训练,即您首先完全训练最低层,然后收集一些样本编码来训练下一层,然后再训练下一层,等等。我是不熟悉
sklearn.pipeline,但是,鉴于它似乎是用于优化模型/转换链的通用工具,我认为它会尝试同步而不是顺序训练/拟合所有模型。 -
RBM 堆栈中的另一个更微妙的问题是所有层都具有相同数量的单元,因此您不会强制连续层依次进行更多的泛化。实际上,您并没有跨层“分配”(因为没有更好的词)学习过程,因为一旦学习了第一层的变换,所有后续层都可以简单地学习恒等变换(并且很可能会这样)是最容易学习的变换)。你现在在第 2 层和第 3 层所做的只是添加噪声(由于非线性)。
-
@alvas 这是一堆 RBM,而不是反向传播。 RBM 是通过某种对比散度的变体来训练的,它一次在一对层上运行。所以不,梯度不会在这里传播,这是预期(和期望)的行为。
-
@Paul Brodersen 我已经尝试减少连续层的单元数,但精度或多或少相同。
标签: python machine-learning scikit-learn deep-learning