Keras 中的样本重要性(训练权重)

数据挖掘 神经网络 喀拉斯 加权数据
2021-10-01 01:21:39

您如何在 Keras 中为某些样本添加比其他样本(样本权重)更重要的部分?

我不是在寻找class_weight哪个是不平衡数据集的修复方法。

我目前拥有的是:

trainingWeights 这是我想对每个样本赋予的期望重要性。

epochs = 30
batchSize = 512

# Fit model with selected data
model.fit(trainingMatrix, trainingTargets,
          batch_size=batchSize, epochs=epochs, 
          sample_weight=trainingWeights)

然而,训练误差比以前低得多,根据Keras 的文档

sample_weight:训练样本的可选 Numpy 权重数组,用于加权损失函数(仅在训练期间)。

据我了解,此选项仅以不同方式计算损失函数,而无需使用权重(样本重要性)训练模型,那么如何为不同样本训练具有不同重要性(权重)的 Keras 模型。

PD。这是一个类似的问题xgboost:更加重视最近的样本,但我想要一个适用于 Keras 的答案。

2个回答

我不确定我是否完全理解您想要什么,但看起来您正在尝试为sample_weight. 好吧,我尝试过类似的东西。在我开始之前,我想提一下我的错误实际上上升了——我没有时间去解释为什么会发生这种情况。

为简单起见,假设您知道每个类所需的权重,并且可以将其作为字典传递。在我的示例中,我将 myy_train作为一个热编码向量。我正在利用这一事实对每行指向的类进行逆向工程,并为其添加权重。当您拟合模型时,您基本上需要将一组权重映射到每个标签(因此长度与您的训练数据相同)。

def generate_sample_weights(training_data, class_weight_dictionary): 
    sample_weights = [class_weight_dictionary[np.where(one_hot_row==1)[0][0]] for one_hot_row in training_data]
    return np.asarray(sample_weights)

当您调用fit模型时,它会被传递。

model.fit(x=X_train, 
    y=y_train, 
    batch_size = 64,
    validation_data=(X_val, y_val),
    shuffle=True,
    epochs=20,
    sample_weight = generate_sample_weights(y_train, class_weights_dict)
)

据我了解,此选项仅以不同方式计算损失函数,而无需使用权重(样本重要性)训练模型,那么如何为不同样本训练具有不同重要性(权重)的 Keras 模型。

当损失函数的计算方式不同时,这意味着反向传播将表现不同(更加强调重要样本)。

但是训练误差比以前低得多

如果我理解错误,您的意思是为每批计算的平均损失。
交叉熵损失函数是训练模型的代理(可微分),而零一损失是对其进行微调的损失函数。

这是一个类似的问题 xgboost:更加重视最近的样本,但我想要一个适用于 Keras 的答案

对特定示例的神经网络进行惩罚意味着使它们有很高的概率被包含在批次中。这里没有与 XGboost 的对应关系。

旁注:也许您可以尝试通过课程进行培训

逐渐转变训练任务,从简单的(可能是凸的)示例说明更简单的概念,到目标任务(更难
的示例) 基本思想是从小处着手,学习任务的更简单方面或更容易的子任务,然后逐渐增加难度。从这里提倡的构建表示的角度来看,这个想法是首先学习捕获低级抽象的表示,
然后利用它们并组合它们来学习解释数据中更复杂结构所必需的稍微更高级别的抽象。通过选择要呈现的示例以及将它们呈现给学习系统的顺序,可以指导培训并显着提高学习的速度。 yoshua bengio 为 AI 学习深度架构