Я реализую состязательное обучение с помощью метода FGSM из Объяснение и использование состязательных примеров с использованием пользовательской функции потерь:
Реализованный в tf.keras
с использованием пользовательской функции потерь, он концептуально выглядит следующим образом:
model = Sequential([
...
])
def loss(labels, logits):
# Compute the cross-entropy on the legitimate examples
cross_ent = tf.losses.softmax_cross_entropy(labels, logits)
# Compute the adversarial examples
gradients, = tf.gradients(cross_ent, model.input)
inputs_adv = tf.stop_gradient(model.input + 0.3 * tf.sign(gradients))
# Compute the cross-entropy on the adversarial examples
logits_adv = model(inputs_adv)
cross_ent_adv = tf.losses.softmax_cross_entropy(labels, logits_adv)
return 0.5 * cross_ent + 0.5 * cross_ent_adv
model.compile(optimizer='adam', loss=loss)
model.fit(x_train, y_train, ...)
Это хорошо работает для простой сверточной нейронной сети.
Во время вызова logits_adv = model(inputs_adv)
модель вызывается во второй раз.Это означает, что он будет использовать другие маски пропуска, чем в исходном проходе с прямой связью с model.inputs
.inputs_adv
, однако, были созданы с tf.gradients(cross_ent, model.input)
, то есть с масками выпадения из исходного прохода прямой связи.Это может быть проблематично, так как разрешение модели использовать новые маски отсева, вероятно, ослабит эффект состязательной партии.
Поскольку реализация повторного использования масок отсева в Keras будет громоздкой, меня интересует фактический эффектповторного использования масок.Имеет ли это значение для точности теста как на законных, так и на состязательных примерах?