Keras:编码器的部分反向传播

时间:2019-05-27 15:49:31

标签: python keras neural-network backpropagation recommender-systems

概述

嗨,我目前正在尝试使用 keras 构建自动编码器推荐系统模型(我不确定使用Tensorflow),目前卡住了,原因我无法获得keras做部分反向传播。 (如果可能,请提供代码帮助,或提供其他来源的示例)

AutoEnc RecSys的工作方式

该系统的想法是将带有一串零(“尚未查看”)的高尺寸额定值数据(4k +功能)馈送到编码器,然后将其解码回原始尺寸。先前的零输入将更改为某个数字,该数字将作为预测结果。

问题是

当您向编码器输入一堆零时,编码器将学习输出很多零以及输出(他们认为输入0是目标输出,而不是预期的结果)(0表示不可预测/未评级)。

因此,要做的第一件事是屏蔽损耗函数,以仅根据非零输入计算损耗(RMS)。 (即,每列火车的前馈仅使用非零功能)。

然后是真正的问题... 得到损失后,将发生反向传播,并且 keras似乎会对所有权重进行反向传播,其中的某些权重(零)应忽略(以避免编码器学习输出零) (损耗在层上的所有权重之间共享,它们基于相同的损耗计算梯度)

是否有任何方法可以防止keras对通过零输入的权重进行反向传播?

类似于辍学,但这不是随机的,如果该节点的输入为零,则关闭节点/权重)

我尝试搜索群页面,主要是通过使用Tensorflow完成并创建自定义渐变功能。其他人建议只使用掩码,因为零损耗=零梯度=无反向传播,但这仅适用于单数预测,同时我的系统将返回高维数据(与输入相同的维数)。

注意:自定义损失功能不适用于反向传播,损失是共享的,其中一些仍然需要损失才能调整权重。我已经掩盖了损失函数,因此只有非零特征会影响损失函数。 (正确的方法,但不完整)

一些细节: 自动编码器架构:https://prnt.sc/ntzmbf

我的模特:

from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.layers import LeakyReLU

model = Sequential()
model.add(Dense(128, input_shape=(4000,)))
model.add(LeakyReLU(alpha=0.1))
model.add(Dense(4000, activation="softmax"))

自定义损失功能(已屏蔽)

import keras.backend as K

# Custom MSE (only calculate loss from non-masked value)
def masked_mse(mask_value):

    def f(y_true, y_pred):
        mask_true = K.cast(K.not_equal(y_true, mask_value), K.floatx())
        masked_squared_error = K.square(mask_true * (y_true - y_pred))
        masked_mse = K.sum(masked_squared_error, axis=-1) / K.sum(mask_true, axis=-1)
        return masked_mse

    f.__name__ = 'Masked MSE (mask_value={})'.format(mask_value)
    return f
model.compile(optimizer='adam', loss=masked_mse(0))
model.fit(X_train.values, X_train.values,
          validation_data=(X_val.values, X_val.values),
          epochs=100,
          batch_size=128,
          verbose=1,
          )
Input example :   [3, 0,   0, 0,   1, 0, ..., 2, 1]
Expected output : [3, 0.1, 2, 0.3, 1, 1, ..., 2, 1]

谢谢:)

0 个答案:

没有答案