Я реализую состязательное обучение с помощью метода 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)
. Это включает два подвопроса:
1. Какую статистику следует использовать для нормализации?
Здесь я вижу три варианта:
- Используйте среднее значение и дисперсию партии состязательных примеров. Таким образом, активации нормализуются к стандартному нормальному распределению, как и во время обучения.
- Используйте среднее значение и дисперсию серии законных примеров. Во время вывода у нас не будет доступа к статистике серии состязательных примеров. Поэтому мы должны сделать модель устойчивой к состязательным примерам, даже если она должна использовать статистику допустимых примеров.
- Использовать статистику населения, так как она будет использоваться при выводе.
2. Нужно ли обновлять статистику населения?
Два варианта, которые, я думаю, могут быть оправданы:
- Да - если мы ожидаем атак противника во время вывода. Тогда состязательные примеры следует рассматривать как часть нашего набора данных, так же как и законные примеры. Поэтому они должны быть включены в статистику населения для надлежащей нормализации состязательного примера во время вывода.
- Нет - если мы используем только состязательное обучение для регуляризации. Тогда мы не увидим состязательный пример при выводе и поэтому не должны включать их в статистику населения.