python - 如何更新 keras LSTM 权重以避免概念漂移

标签 python tensorflow keras lstm recurrent-neural-network

我正在尝试更新 Keras LSTM 以避免漂移的概念。为此,我遵循本文 [1] 中提出的方法,他们计算异常分数并将其应用于更新网络权重。在论文中,他们使用 L2 范数来计算异常分数,然后更新模型权重。正如论文中所述:

RNN 更新:然后使用异常分数 𝑎𝑡 更新网络 W𝑡−1 以使用时间反向传播 (BPTT) 获得 W𝑡:

W𝑡 = W𝑡−1 − 𝜂∇𝑎𝑡(W𝑡−1) where 𝜂 is the learning rate

我正在尝试更新 LSTM 网络权重,但尽管我已经看到预测多步超前多传感器数据的模型性能有所改进,但我不确定这种改进是否是因为更新处理了漂移概念或仅仅因为模型是用最新数据 retrofit 的。

这是一个示例模型:

model = tf.keras.Sequential()
model.add(tf.keras.layers.LSTM(n_neurons, input_shape=(n_seq, n_features)))
model.add(layers.Dense(n_pred_seq * n_features))
model.add(layers.Reshape((n_pred_seq, n_features)))
model.compile(optimizer='adam', loss='mse')

这是我更新模型的方式:

y_pred = model.predict_on_batch(x_batch)
up_y = data_y[i,]
a_score = sqrt(mean_squared_error(data_y[i,].flatten(), y_pred[0, :]))
w = model.layers[0].get_weights() #Only get weights for LSTM layer
for l in range(len(w)):
    w[l] = w[l] - (w[l]*0.001*a_score) #0.001=learning rate
model.layers[0].set_weights(w)
model.fit(x_batch, up_y, epochs=1, verbose=1)
model.reset_states()

我想知道这是否是更新 LSTM 神经网络的正确方法,以及更新权重后如何应用 BPTT。

P.D.:我也见过其他检测概念漂移的方法,例如 skmultiflow 包中的 ADWIN 方法,但我发现这个方法特别有趣,因为它还处理异常,当出现概念漂移的新数据时稍微更新模型,并且当异常数据出现时几乎忽略更新。

[1] 使用递归神经网络进行概念漂移自适应在线异常检测 Saurav, S., Malhotra, P., TV, V., Gugulothu, N., Vig, L., Agarwal, P., & Shroff, G.(2018 年 1 月)。在 ACM 印度数据科学与数据管理联合国际 session 论文集(第 78-87 页)中。美国计算机协会。

最佳答案

我个人认为这是一个有效的方法。您正在更新网络权重这一事实取决于您在做什么,所以如果您按照自己的方式进行操作就没问题。

也许另一种方法是实现自己的损失函数并将抗漂移参数嵌入其中,但这可能有点复杂。

关于 BPTT,我认为它是正常应用的,但你有不同的“起点”,即你刚刚更新的权重。

关于python - 如何更新 keras LSTM 权重以避免概念漂移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59166128/

相关文章:

Python argparse 忽略默认值

python - keras和scipy的2D卷积结果不同

python - 如何将 NumPy 特征和标签数组转换为可用于 model.fit() 的 TensorFlow 数据集?

python - 默认 MaxPoolingOp 仅在设备类型 CPU 上支持 NHWC

python - 多行中的 PyYAML 变量

python - 将 numpy 数组分配给 pandas 掩码

tensorflow - 使用编码器-解码器 CNN 进行语义分割

python - 如何在自定义 Keras 模型中使用 BatchNormalization 层

python - 如何从 python 中的元素列表中删除特殊字符?

python - 如何在 tensorflow 中获得协方差矩阵?