首页 > 解决方案 > 决定是否根据特征条件更新权重

问题描述

我想根据特征值决定是否训练一些特定的权重。

作为一个简单的尝试,我只想“触摸”输入和第一层之间的权重,这样如果特征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 个神经元保持不变且不更新。我正在尝试模拟“缺失特征”行为

标签: pythontensorflowkerasneural-networkbackpropagation

解决方案


我可能完全错了。但我认为这个问题没有数学意义。如果输入为零,则梯度将为零。因此不会更新权重。让我们进行测试。

让我们用零做一些输入:

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,将不会对与缺失值相关的权重执行任何操作,因为梯度为零。


推荐阅读