Wdrażam szkolenie kontradyktoryjne metodą FGSM z Wyjaśnianie i wykorzystywanie przykładów kontradyktoryjności przy użyciu niestandardowej funkcji straty:

Zaimplementowany w tf.keras przy użyciu niestandardowej funkcji utraty, koncepcyjnie wygląda następująco:

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, ...)

Działa to dobrze do prostej konwlolutionalnej sieci neuronowej.

Podczas wywołania logits_adv = model(inputs_adv) model jest wywoływany po raz drugi. Oznacza to, że będzie używał innych masek przerwania niż w oryginalnym przebiegu sprzężenia do przodu z model.inputs. Jednak inputs_adv zostały utworzone za pomocą tf.gradients(cross_ent, model.input), tj. Z maskami zaniku z oryginalnego przebiegu wyprzedzającego. Może to być problematyczne, ponieważ zezwolenie modelowi na użycie nowych masek odpadających prawdopodobnie osłabi efekt kontradyktoryjnej partii.

Od wdrażania ponownego użycia masek w Kerach byłby kłopotliwy, interesuje mnie rzeczywisty efekt ponownego wykorzystania masek. Czy robi różnicę W.r.t. Dokładność testu zarówno na przykładach uzasadnionych i przeciwników?

2
Kilian Batzner 20 listopad 2018, 17:34

1 odpowiedź

Najlepsza odpowiedź

Wypróbowałem ponowne użycie masek do odrzucania podczas etapu treningu przeciwnika z prostym CNN na MNIST. Wybrałem tę samą architekturę sieciową, jaka użyta w tym samouczku cleverhans z dodatkową warstwą dropout przed warstwą softmax.

Oto wynik (czerwony = ponowne użycie masek porzucania, niebieski = naiwna implementacja): tu wpisz opis obrazu

Linie ciągłe reprezentują dokładność na uzasadnionych przykładach testowych. Linie przerywane reprezentują dokładność na przeciwstawnych przykładach wygenerowanych na zestawie testowym.

Podsumowując, jeśli używasz tylko treningu przeciwnego jako regulatora w celu poprawy samej dokładności testu, ponowne użycie masek może nie być warte wysiłku. Jeśli chodzi o odporność na ataki przeciwnika, może zrobić małą różnicę. Jednak aby uzyskać bardziej pewne stwierdzenie, konieczne byłoby przeprowadzenie dalszych eksperymentów na innych zestawach danych, architekturach, losowych nasionach itp.

Aby powyższy rysunek był czytelny, pominąłem dokładność na przykładach testów kontradyktoryjnych dla modelu wytrenowanego bez treningu kontradyktoryjnego. Wartości wynoszą około 10%.

Kod tego eksperymentu znajdziesz w tym opisie. W trybie gorliwym TensorFlow wdrożenie przechowywania i ponownego używania masek dropout było dość proste.

2
Kilian Batzner 18 październik 2019, 15:59