为什么Keras中没有指定DNN的预训练?

这个问题更多是关于深度神经网络的训练算法,而不是Keras软件本身的问题。

据我所知,深度神经网络的有效性得益于训练算法的改进。从20世纪80年代开始,反向传播(BP)算法就被用于训练神经网络,但当网络深度增加时,会导致过拟合问题。大约十年前,Hinton通过首先使用无标签数据对网络进行预训练,然后再应用BP算法,改进了这一算法。预训练在避免过拟合方面起着重要作用。

然而,当我开始尝试使用Keras时,我发现下面的示例中使用SGD算法训练的mnist DNN,没有提到预训练过程,却取得了非常高的预测准确率。因此,我开始疑惑预训练去哪儿了?我是否误解了深度学习的训练算法(我认为经典的BP算法几乎与SGD相同)?还是说新的训练技术已经取代了预训练过程?

非常感谢您的帮助!

'''在MNIST数据集上训练一个简单的深度神经网络。经过20个epoch后,测试准确率达到98.40%(参数调整的空间很大)。在K520 GPU上,每个epoch需要2秒。'''from __future__ import print_functionimport numpy as npnp.random.seed(1337)  # for reproducibilityfrom keras.datasets import mnistfrom keras.models import Sequentialfrom keras.layers.core import Dense, Dropout, Activationfrom keras.optimizers import SGD, Adam, RMSpropfrom keras.utils import np_utilsbatch_size = 128nb_classes = 10nb_epoch = 20# the data, shuffled and split between train and test sets(X_train, y_train), (X_test, y_test) = mnist.load_data()X_train = X_train.reshape(60000, 784)X_test = X_test.reshape(10000, 784)X_train = X_train.astype('float32')X_test = X_test.astype('float32')X_train /= 255X_test /= 255print(X_train.shape[0], 'train samples')print(X_test.shape[0], 'test samples')# convert class vectors to binary class matricesY_train = np_utils.to_categorical(y_train, nb_classes)Y_test = np_utils.to_categorical(y_test, nb_classes)model = Sequential()model.add(Dense(512, input_shape=(784,)))model.add(Activation('relu'))model.add(Dropout(0.2))model.add(Dense(512))model.add(Activation('relu'))model.add(Dropout(0.2))model.add(Dense(10))model.add(Activation('softmax'))model.summary()model.compile(loss='categorical_crossentropy',              optimizer=RMSprop(),              metrics=['accuracy'])history = model.fit(X_train, Y_train,                    batch_size=batch_size, nb_epoch=nb_epoch,                    verbose=1, validation_data=(X_test, Y_test))score = model.evaluate(X_test, Y_test, verbose=0)print('Test score:', score[0])print('Test accuracy:', score[1])

回答:

你错了。

过去与今天

过去的神经网络与今天的神经网络之间的区别不在于训练算法。每一种深度神经网络都是基于某种SGD算法的反向传播进行训练的,这与过去完全相同。(有一些新的算法试图通过自适应学习率来减少参数调整,如Adam、RMSprop等;但普通的SGD仍然是最常用的算法,例如AlphaGo就使用了它)

区别仅仅在于网络的规模=层数(深度;这得益于基于GPU的评估)以及激活函数的选择。ReLU的效果比经典的Sigmoid或Tanh激活函数更好(在速度和稳定性方面)。

预训练

我也认为,预训练在5到10年前非常流行,但现在如果数据足够的话,没人会再使用它了!让我引用这里的一段话:

确实,无监督预训练最初使得训练更深的网络成为可能,但最近几年,预训练方法已基本被淘汰。如今,深度神经网络与它们80年代的“表亲”非常相似。与其说是预训练,不如说现在区别在于使用的激活函数和正则化方法(有时也在优化算法上,尽管这种情况很少见)。我认为“预训练时代”,大约从2006年开始,到2010年代初人们开始使用整流线性单元(ReLU),后来又使用了dropout,发现对于这种类型的网络,预训练不再有益时,就结束了。

我推荐这些幻灯片作为现代深度学习的入门介绍(作为起点)。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注