python - 决定是否根据特征条件更新权重
问题描述
我想根据特征值决定是否训练一些特定的权重。
作为一个简单的尝试,我只想“触摸”输入和第一层之间的权重,这样如果特征i的条件成立,则不要训练(更新)所有连接第一层和输入神经元i的权重
假设我有这样的模型:
model = keras.Sequential([
layers.Dense(2, activation=tf.nn.relu, input_shape=(N, 4)),
layers.Dense(1, activation=tf.nn.relu)])
如果我的输入为 [1,2,3,4] 且所有非零值,我希望一切正常工作。但是,我想提供一个类似 [1,2,3,0] 的示例,并使权重与输入层的第 4 个神经元保持不变且不更新。我正在尝试模拟“缺失特征”行为
解决方案
我可能完全错了。但我认为这个问题没有数学意义。如果输入为零,则梯度将为零。因此不会更新权重。让我们进行测试。
让我们用零做一些输入:
import tensorflow as tf
import numpy as np
x = np.array([[1.2, 1.1, 0., 2.3, 4.1]], dtype=np.float32)
y = [0.]
如您所见,缺少第三个值。
现在让我们使用随机目标进行前向传递,并查看梯度:
x = np.array([[1.2, 1.1, 0., 2.3, 4.1]], dtype=np.float32)
y = [0.]
model = tf.keras.Sequential([
tf.keras.layers.Dense(8, activation='relu'),
tf.keras.layers.Dense(3, activation='softmax')])
with tf.GradientTape() as tape:
out = model(x)
loss = tf.losses.sparse_categorical_crossentropy(y, out)
gradients = tape.gradient(loss, model.trainable_variables)
np.round(gradients[0].numpy().tolist(), 2)
array([[0. , 0. , 0. , 0.3 , 0. , 0. , 0.17, 1.29],
[0. , 0. , 0. , 0.28, 0. , 0. , 0.15, 1.18],
[0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0.58, 0. , 0. , 0.32, 2.47],
[0. , 0. , 0. , 1.03, 0. , 0. , 0.57, 4.4 ]])
与输入的第 3 列(第 3 行)相关的所有梯度都为零。当optimizer.apply_gradients
将应用于 时model.fit
,将不会对与缺失值相关的权重执行任何操作,因为梯度为零。