Keras:指定始终保留某些特征的输入丢失层

Posted

技术标签:

【中文标题】Keras:指定始终保留某些特征的输入丢失层【英文标题】:Keras: specify input dropout layer that always keeps certain features 【发布时间】:2018-03-02 04:43:03 【问题描述】:

我正在使用 Python 中的 Keras 为时间序列气候数据训练神经网络(预测时间 t=T 时的值 X),并尝试在输入上添加 (20%) 辍学层,这似乎限制了过度拟合并导致性能略有提高。然而,在我添加了一个特别有用的新特性(预测 t=0 时响应变量的值)后,我发现通过移除 dropout 层可以大大提高性能。这对我来说很有意义,因为我可以想象神经网络将如何“学习”该特征的重要性,并将其其余训练基于调整该值(即,“这些其他特征如何影响 t 时的响应? =0 随时间变化 t=T")。

此外,我认为还有一些其他功能应该适用于所有时代。也就是说,我仍然希望 dropout 层可以提高模型性能——它只需要不丢弃某些特征,例如 t_0 时的 X:我需要一个只会丢弃某些特征的 dropout 层。

我已经搜索了执行此操作的示例,并阅读了 Keras 文档here,但似乎无法找到执行此操作的方法。我可能遗漏了一些明显的东西,因为我仍然不熟悉如何手动编辑图层。任何帮助,将不胜感激。谢谢!

编辑:对于任何不清楚的地方表示抱歉。这是我定义模型的代码(p是特征的数量):

def create_model(p):
   model = Sequential()
   model.add(Dropout(0.2, input_shape=(p,))) # % of features dropped
   model.add(Dense(1000, input_dim=p, kernel_initializer='normal'
                , activation='sigmoid'))
   model.add(Dense(30, kernel_initializer='normal', activation='relu'))
   model.add(Dense(1, kernel_initializer='normal',activation='linear'))
   model.compile(loss=cost_fn, optimizer='adam')
return model

【问题讨论】:

您正在将 droput 应用于“输入”??? 你能把代码添加到你的模型架构吗???很难想象你在做什么...... 【参考方案1】:

我认为在输入层中使用 dropout 没有任何危害。当然,用法/效果会与正常情况略有不同。效果类似于在输入信号中添加合成噪声;只有特征/像素/什么是完全未知的[归零]而不是嘈杂。在输入中插入合成噪声是提高鲁棒性的最古老的方法之一;只要您考虑一下这对您的数据集是否有意义,这当然不是坏习惯。

【讨论】:

【参考方案2】:

这个问题已经有一个公认的答案,但在我看来你正在以一种不好的方式使用 dropout。

Dropout 仅适用于隐藏层,不适用于输入层!

Dropout 充当正则化器,并防止隐藏层复杂的协同适应,引用 Hinton 论文“我们的工作扩展了这一想法,表明 dropout 也可以有效地应用于隐藏层,并且可以解释为模型平均" (http://www.jmlr.org/papers/volume15/srivastava14a/srivastava14a.pdf)

Dropout 可以看作是用您的数据训练几个不同的模型,并在测试时对预测进行平均。如果您在训练期间阻止您的模型获得所有输入,那么它的性能将会很差,尤其是在一个输入至关重要的情况下。你想要的实际上是避免过度拟合,这意味着你在训练阶段防止模型过于复杂(因此你的每个模型都会首先选择最重要的特征),然后再进行测试。 在集成学习中删除一些特征是一种常见的做法,但它是可控的,不像 dropout 那样是随机的。它也适用于神经网络,因为隐藏层(通常)有更多的神经元作为输入,因此 dropout 遵循大数定律,至于少量输入,在某些糟糕的情况下,几乎所有输入都会丢失。

结论:在神经网络的输入层使用 dropout 是一种不好的做法。

【讨论】:

这也让我思考,这个输入丢失......但后来我想......如果气候变化数据有太多不重要的变化怎么办?也许这种输入丢失可能会在许多时期产生某种数据增强? 感谢您的参考。您提到的同一段还说“经常发现删除 20% 的输入单元和 50% 的隐藏单元是最优的。”这和你的说法不矛盾吗?我不确定您所说的“它是控制而不是随机的”是什么意思,也许这解决了我的问题。你是说在集成学习中,不同模型中省略了固定参数(而不是随机参数)? 20% 的 dropout 是针对 DAE 和玻尔兹曼机,根据定义,它们在输入中具有随机性。如果您不使用其中之一,则删除输入是不好的做法 使用输入丢失是一种常见的正则化技术。 Why should we use (or not) dropout on the input layer? --- 此外:可以估计(输入/隐藏)丢失的最佳数量(超参数调整,交叉验证)。【参考方案3】:

我能想到的仅将 dropout 应用于特定特征的最佳方法是简单地将特征分离到不同层中。

为此,我建议您将输入简单地划分为基本功能和可丢弃功能:

from keras.layers import *
from keras.models import Model

def create_model(essentialP,droppableP):
    essentialInput = Input((essentialP,))
    droppableInput = Input((droppableP,))

    dropped = Dropout(0.2)(droppableInput) # % of features dropped
    completeInput = Concatenate()([essentialInput,droppableInput])        

    output = Dense(1000, kernel_initializer='normal', activation='sigmoid')(completeInput)
    output = Dense(30, kernel_initializer='normal', activation='relu')(output)
    output = Dense(1, kernel_initializer='normal',activation='linear')(output)

    model = Model([essentialInput,droppableInput],output)
    model.compile(loss=cost_fn, optimizer='adam')

    return model

使用两个输入训练模型。你必须在训练之前管理你的输入:

model.fit([essential_train_data,droppable_train_data], predictions, ...)

【讨论】:

感谢您的回复。是的,我将 dropouts 应用于输入。我没有使用循环神经网络。我会看看函数式 API——我还在学习如何解决这些问题。 查看更新后的答案。 :) --- 你会看到函数式 API 和顺序模型一样容易使用,它会给你更多的可能性。

以上是关于Keras:指定始终保留某些特征的输入丢失层的主要内容,如果未能解决你的问题,请参考以下文章

特征选择保留相关特征可能吗?

Keras 中连接多输入深度神经网络的正确最后一层是啥?

是啥让某些 android 类“必须保留”?

如何用Keras自定义层?

卷积层提取特征

Keras LSTM 层输入形状