嗨,我目前正在尝试使用 keras 构建自动编码器推荐系统模型(我不确定使用Tensorflow),目前卡住了,原因我无法获得keras做部分反向传播。 (如果可能,请提供代码帮助,或提供其他来源的示例)。
该系统的想法是将带有一串零(“尚未查看”)的高尺寸额定值数据(4k +功能)馈送到编码器,然后将其解码回原始尺寸。先前的零输入将更改为某个数字,该数字将作为预测结果。
当您向编码器输入一堆零时,编码器将学习输出很多零以及输出(他们认为输入0是目标输出,而不是预期的结果)(0表示不可预测/未评级)。
因此,要做的第一件事是屏蔽损耗函数,以仅根据非零输入计算损耗(RMS)。 (即,每列火车的前馈仅使用非零功能)。
然后是真正的问题... 得到损失后,将发生反向传播,并且 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]
谢谢:)