Wie wir im vorherigen Beitrag erfahren haben, ist Software für Maschinelles Lernen anfällig für bestimmte Angriffe durch künstlich veränderte Eingabedaten, die zu Fehlern des Modells führen. Solche unvorhergesehenen und absichtlich herbeigeführten Ausfälle sind für Anwendungen, an denen Menschen beteiligt sind und deren Entscheidungen das Leben von Menschen beeinflussen, dringend abzuwehren. Somit ist die Zuverlässigkeit eines KI-Systems eine primäre Anforderung, sodass mehrere Techniken entwickelt wurden, um die sogenannte „adversariale Robustheit“ zu erreichen.
Was können wir gegen Adversarial Examples tun?
Seitdem die „Adversarial Attacks“ ein Forschungsgebiet geworden sind, hat sich auch der Schutz vor Adversarial Attacks entwickelt. Wie bei jeder Art von Schutz ist es wichtig, vorher zu wissen, wovor wir das System schützen wollen. Wenn wir wissen, welche Art von Angriffen zu erwarten sind oder zumindest, worauf die Angreifer abzielen, können wir ein System konstruieren, das dahingehend gründlich auf die Robustheit überprüft wurde. Somit bereitet man das System auf „bekannte Unbekannte“ vor. Ein größeres Problem stellen jedoch die sogenannten „unbekannten Unbekannten“ dar. Populär wurde dieser Begriff nach einem Nachrichtenbriefing mit US-Verteidigungsminister Donald Rumsfeld, demzufolge die Hauptgefahr in den Angriffen liegt, die wir nicht kennen und nicht erwarten.
Dabei wissen wir aufgrund der langen Vorgeschichte der Adversarial Examples schon recht viel darüber, was zu erwarten ist: Handelt es sich um einen Versuch, das Modell und die Modellparameter zu stehlen oder seine Funktionalität zu beeinträchtigen? Wenn Letzteres der Fall ist, werden die Angreifer versuchen, die Trainingsdaten zu verändern oder zu „vergiften“, um später Hintertüren zu haben oder Eingaben zu erzeugen, die das Modell zu Fehlern zwingen (auch „poisining attacks“ genannt)? Sind die Angreifer in der Lage, die Architektur, die Parameter und die Gradienten des Modells zu stehlen, oder müssen sie einen Ersatz für diese konstruieren? All diese Fragen können uns dabei helfen, ein Angriffsmodell zu erstellen, das uns auf Adversarial Attacks vorbereitet.
Dabei sollte zusätzlich immer der Aufwand, um das Modell für Adversarial Attacks robust zu machen, im Auge gehalten werden. Wenn das System nicht öffentlich zugänglich ist und nur für den internen Gebrauch gedacht ist (was bedeutet, dass Eingaben nur von zuverlässigen, verantwortlichen Mitarbeitenden gemacht werden), sind Angriffe auf ein System in der Praxis sehr unwahrscheinlich. Es ist möglicherweise nicht notwendig, das System gegen Angriffe zu schützen. Die Zeit und der Aufwand könnten besser in die Stärkung der Netzwerksicherheit investiert werden, um unerwünschte Zugriffe auf das Modell von vornherein zu verhindern.
Eine weitere wichtige Frage, die man sich stellen muss, ist, ob ein Angreifer in irgendeiner Weise von der Nutzung von Rechenressourcen für einen Angriff profitieren kann. Im Fall von Spam-Filtern ist der Nutzen klar – der Angreifer bekommt die Möglichkeit, Spam-Nachrichten einzuschleusen, um Geld zu ergaunern. Aber in einigen Fällen macht die Ausgabe des Systems keinen großen Unterschied, zum Beispiel bei Anwendungen zur Alterserkennung in der Unterhaltungsbranche bei spielerischen Apps, wo der Angreifer nur eine falsche Vorhersage erhält.
Ansätze zum Schutz vor Adversarial Examples
Es gibt mittlerweile eine Vielzahl von Schutztechniken für Machine Learning-Modelle. Jede von ihnen ist für bestimmte Angriffsszenarien geeignet und kann im selben Moment gegen andere Angriffe schwach sein.
Der einfachste Ansatz ist, die Angriffe, die sich gegen das System richten, zu verfolgen und abzufangen und das System jedes Mal zu aktualisieren – also neu zu trainieren. Ein ähnlicher Ansatz existiert in der Software-Entwicklung: Angreifer oder sogar speziell angeheuerte Spezialisten versuchen, Schwachstellen zu finden und diese zu verbessern. Im Anschluss wird eine neue korrigierte Version veröffentlicht, die gegen diese Schwachstellen schützt. Andererseits können wir auch versuchen, alle Informationen über das Modell (Architektur, Parameter, Gradienten) zu schützen und zu verbergen, so dass es keine Chance gibt, einen Angriff zu generieren. Ein weiterer Weg ist der Versuch, ein universell robustes System zu entwickeln, was wegen der vielen Unbekannten, die berücksichtigt werden müssen, viel schwieriger ist.
Im Folgenden stellen wir drei High Level-Ansätze für ein robusteres System vor:
Adversariale Training: Wie im letzten Artikel erläutert, werden adversarial Examples hauptsächlich so generiert, dass der Verlust des Modells für die jeweilige geänderte Eingabe maximiert wird. Die Idee dieses spezialisierten Trainingsansatzes besteht darin, das Verlustminimierungsproblem in ein Minimax-Problem umzuwandeln. Das passiert wie folgt: Zuerst wird der der Trainingsverlust maximiert, in dem wir die Eingaben verändern. Im Grunde werden in diesem Punkt bis zu einem gewissen Grad mögliche adversarial Examples erzeugt. Im Anschluss wird dieser maximal mögliche Verlust, der bei solchen adversarial Examples entsteht, minimiert, um die finalen Parameter des Netzwerks zu erhalten. Dabei befasst sich dieser Schutz mit den „epsilon pertubation adversarial examples“, das heißt mit Beispielen, die sehr nahe an den Originalen liegen. Damit dieser Schutz funktioniert, müssen wir davon ausgehen, dass die Daten der realen Welt glatt sind und kleine Änderungen die Vorhersage nicht drastisch verändern sollten. Dies trifft im Allgemeinen für Bilder- oder Textdaten zu. Ein solches regularisiertes Training in verschiedenen Formen ist die beliebteste Methode, um robuste Modelle zu erzeugen. Eine intuitive Erklärung für diesen Ansatz ist, dass ein solches Training mit der Erzeugung einer glatteren Verlustfläche verbunden ist und sich damit die Chance verringert, ein naheliegendes Beispiel mit hohem Fehler zu erzeugen.
Zusätzlich können wir dem Modell auch direkt schlechte Beispiele zeigen, damit es lernt, wie man solche Eingaben erkennt. Die normalen Trainingsdaten werden mit generierten adversarial Examples und korrekten Bezeichnungen gemischt. Ein solches Training führt zu Modellen, die gegenüber ähnlichen adversarial Examples robust sind. Dennoch ist die Generierung des Maximalverlust-Beispiels ein mühsamer Prozess und auch adversarial Inputs, die auf eine andere Weise generiert werden, überwinden diesen Schutz.
Formale Verifikation eines Modells: Idealerweise würde man sich eine formale Verifikation wünschen, die beweist, dass das Modell nicht von einem Angreifer überlistet werden kann. Für tiefe neuronale Netze hat sich dies als schwierig erwiesen. Ein Ansatz besteht darin, ein neuronales Netzwerk in ein logisch nachvollziehbares Modell zu übersetzen und die Robustheit dieses nachvollziehbaren Modells zu verifizieren. Ein von der Softwaresicherheit inspirierter Ansatz besteht darin, das Modell gegen adversarial Examples auf den Trainingsdaten und einigen zusätzlichen Referenzdaten zu testen. Für die modernsten Deep Learning Modelle, die eine solche Verifizierung erfordern, ist dies sehr rechenintensiv. Die vorgeschlagenen Methoden sind im Moment nur für die shallow Modelle praktikabel. Denn im Gegensatz zu Deep Learning Modellen verwenden shallow Modelle nur 1-2 hidden layer für ihr neuronales Netz.
Identifikation im Vorfeld: Eine weitere große Gruppe von Schutzansätzen befasst sich mit der Identifizierung von gegnerischen Eingaben, bevor ein Fehler auftritt. Diese Aufgabe ist stark verwandt mit den Aufgaben der Ausreißererkennung (outlier detection), der Erkennung von Verteilungsabweichungen (out-of-distribution detection) und der Unsicherheitsmessung (uncertainty measurement). Sie alle haben im Grunde das gleiche Ziel, nämlich die Eingaben zu identifizieren, die für unser Modell ungewöhnlich sind und zu unvorhersehbarem Verhalten führen könnten. Das kann auf verschiedene Arten geschehen: Entweder durch Modifizierung der Eingaben, so dass adversarial Examples gutartig werden, oder durch die Einrichtung eines Detektors vor dem Modell, der ein adversarial Example zurückweist. Eine interessante Technik schlägt vor, dem Modell selbst zu erlauben, adversarial Examples (oder alle out-of-distribution Beispiele) in einer separaten NULL-Klasse zu klassifizieren und so Fehler an ihnen zu verhindern. Das Hauptproblem sind hier Epsilon-Pertubationsbeispiele, da sie von den natürlichen Beispielen fast nicht zu unterscheiden sind. Insgesamt sind diese Ansätze sehr kontextspezifisch. Für viele von ihnen wurde gezeigt, dass sie nicht allzu gut zu verallgemeinern sind, so dass dieser Weg den Ansatz des adversen Trainings unterliegt.
Gibt es eine universelle Anleitung für den Schutz der ML Modelle?
Um einen universellen Schutzmechanismus zu beschreiben, müssten wir alle „unbekannten Unbekannten“ beschreiben, was per Definition unmöglich ist. Alles, was wir also tun können, ist, die verwendeten Trainingsdaten zu schützen:
- um die Erstellung eines Modells mit Hintertüren für Angreifer zu vermeiden;
- alle Informationen über das Modell zu schützen, wie zum Beispiel Trainingsdaten und Algorithmus, Architektur und seine Parameter;
- ein Modell unter Berücksichtigung aller „bekannten Unbekannten“ zu erstellen und es reaktiv neu zu trainieren, wenn neue Angriffe beschrieben werden.
Zudem sollten wir ein maximal mögliches Wissen über die Aufgabe und die Domäne haben: Manchmal kann eine kleine Änderung der Eingabe die Ausgabe tatsächlich drastisch ändern. Die aktuelle Forschung ist sehr aktiv und es könnte sein, dass in einiger Zeit auch eine formale Verifikationsmethode vorgeschlagen wird. Aber bis dahin müssen wir sicherstellen, dass alle kritischen Anwendungsbereiche maximal geschützt sind.