Split Learning
Beim Split Learning wird ein neuronales Netzwerk an einer Zwischenschicht aufgeteilt. Die Clients behalten die Rohdaten und frühen Schichten, während ein Server den Rest anhand der Aktivierungen trainiert.
Split Learning ist ein kollaboratives Verfahren für verteiltes Training, bei dem ein neuronales Netzwerk an einer ausgewählten Trennschicht zwischen einem Dateneigentümer (dem Client) und einem Server aufgeteilt wird. Der Client führt die Schichten vor der Trennung mit seinen privaten Daten aus und sendet nur die daraus resultierenden Aktivierungen, die manchmal als zerschlagene Daten bezeichnet werden. Der Server führt die übrigen Schichten aus, berechnet den Loss und sendet den Gradienten an der Trennstelle zurück, damit der Client seine Schichten aktualisieren kann. Die rohen Trainingsdaten verlassen den Client nie, und keine der beiden Seiten verfügt über das vollständige Modell. Otkrist Gupta und Ramesh Raskar vom MIT Media Lab stellten das Verfahren im Oktober 2018 in Distributed Learning of Deep Neural Network over Multiple Agents vor. Im Folgebeitrag der Gruppe vom Dezember 2018, Split Learning for Health, wurden Konfigurationen vorgeschlagen, mit denen Krankenhäuser, die unterschiedliche Patientendaten wie Aufnahmen für die medizinische Bildanalyse besitzen, gemeinsam Modelle trainieren können, ohne Rohdaten auszutauschen.
So funktioniert Split Learning#
Bei jedem Trainingsschritt wird die Trennstelle zweimal überquert: Die Aktivierungen gehen beim Vorwärtsdurchlauf vom Client an den Server, und der Gradient des Loss bezüglich dieser Aktivierungen kommt während der Backpropagation zurück. Da die Kettenregel nur diesen einen Gradienten für die Fortsetzung benötigt, sind die Aktualisierungen des Clients identisch mit denen beim Training des nicht aufgeteilten Modells. Eine Simulation in einem einzelnen Prozess mit PyTorch zeigt den Austausch:
import torch
from torch import nn
torch.manual_seed(0)
client = nn.Sequential(nn.Linear(784, 256), nn.ReLU()) # Schichten vor der Trennung, neben den privaten Daten
server = nn.Sequential(nn.Linear(256, 10)) # Schichten nach der Trennung
images, labels = torch.randn(32, 784), torch.randint(0, 10, (32,))
# Client: Vorwärtsdurchlauf bis zur Trennschicht, dann nur die Aktivierungen senden
activations = client(images)
received = activations.detach().requires_grad_()
# Server: Vorwärtsdurchlauf abschließen und bis zur Trennschicht zurückpropagieren, dann diesen Gradienten zurücksenden
nn.functional.cross_entropy(server(received), labels).backward()
# Client: Backpropagation mit dem zurückgesendeten Gradienten fortsetzen
activations.backward(received.grad)
split_grad = client[0].weight.grad.clone()
# Derselbe Schritt beim nicht aufgeteilten Modell liefert dem Client identische Gradienten
client.zero_grad()
nn.functional.cross_entropy(server(client(images)), labels).backward()
print("Same client gradients as unsplit training:", torch.equal(split_grad, client[0].weight.grad))Die Ausgabe lautet Same client gradients as unsplit training: True. Anschließend aktualisiert jede Seite ihren eigenen Optimierer. Bei mehreren Clients lässt das ursprüngliche Protokoll sie nacheinander trainieren. Jeder Client übernimmt dabei die neuesten clientseitigen Gewichte des vorherigen Clients.
Die Anordnung hängt davon ab, was vertraulich bleiben muss. Bei der einfachen Konfiguration oben werden die Bezeichnungen an den Server gesendet. Bei einer U-förmigen Konfiguration bleiben auch die letzten Schichten und die Bezeichnungen auf dem Client. Eine vertikale Konfiguration eignet sich für Organisationen, die verschiedene Merkmale derselben Datensätze besitzen:
Split Learning und föderiertes Lernen#
Auch beim föderierten Lernen bleiben die Daten auf den Geräten ihrer Eigentümer. Jeder Client trainiert jedoch eine vollständige Modellkopie und sendet Gewichtsaktualisierungen, die anschließend gemittelt werden. Beim Split Learning werden stattdessen Aktivierungen und Gradienten übertragen. Clients benötigen daher deutlich weniger Rechenleistung und halten nie das vollständige Modell vor. Die Kommunikation wächst mit der Datenmenge statt mit der Modellgröße, und die Clients trainieren nacheinander statt parallel. SplitFed Learning, 2020 von Chandra Thapa und Kollegen vorgeschlagen, kombiniert beides, indem es clientseitige Schichten parallel ausführt und sie nach Art des föderierten Lernens mittelt.
Vertikales Split Learning kommt auch im Finanzwesen zum Einsatz: Eine Bank und ein Partner, die unterschiedliche Merkmale derselben Kunden besitzen, trainieren gemeinsam ein Modell, wie im Bankmarketing-Tutorial von SecretFlow, ohne private Daten auszutauschen. Pipeline-Parallelisierung teilt ein Netzwerk auf dieselbe Weise nach seiner Tiefe auf, jedoch über GPUs in einem einzigen vertrauenswürdigen Cluster, damit ein großes Modell in den Speicher passt.
Datenschutzrisiken#
Aktivierungen und Gradienten enthalten weiterhin Informationen über die Daten. Aktivierungen früher Schichten lassen sich zu erkennbaren Bildern zurückrechnen. Wenn der Server die Bezeichnungen besitzt, können die von ihm zurückgesendeten Gradienten diese außerdem dem Client offenbaren. Dario Pasquini, Giuseppe Ateniese und Massimo Bernaschi zeigten auf der ACM CCS 2021, dass ein böswilliger Server das Training über die zurückgesendeten Gradienten manipulieren kann. So lenkt er die Client-Schichten in eine Form, die dem Server die Rekonstruktion privater Eingaben ermöglicht. Schutzmaßnahmen fügen mithilfe von Differential Privacy Rauschen hinzu, begrenzen, wie viele Informationen die Aktivierungen über die Eingabe preisgeben, oder erkennen ungewöhnliche Gradienten. Jede dieser Maßnahmen kann die Genauigkeit beeinträchtigen. Bei Bereitstellungen wird Split Learning mit Maßnahmen zur Datensicherheit wie Authentifizierung und verschlüsselter Übertragung kombiniert, da das Protokoll selbst nur regelt, was die Trennstelle überquert.
Die Trennschicht auswählen#
Die Trennschicht bestimmt das Gleichgewicht zwischen Rechenaufwand auf dem Client, Datenverkehr und Offenlegung: Eine frühe Trennung erfordert auf dem Client den geringsten Rechenaufwand, überträgt aber große Aktivierungen, die der Eingabe noch ähneln. Bei einer späteren Trennung werden abstraktere Merkmalskarten übertragen, dafür wird leistungsfähigere Client-Hardware benötigt – ein wichtiger Aspekt bei Edge-KI-Geräten. Skip-Verbindungen erschweren die Wahl, da jeder Tensor, der die Trennstelle überquert, übertragen werden muss. Wird Ultralytics YOLO26 nach seinem Backbone aufgeteilt, müssen drei Merkmalskarten übertragen werden, da die Modellkonfiguration die Ausgaben der Schichten 4, 6 und 10 an den Neck weiterleitet. Für YOLO26n mit imgsz=640 enthalten diese 1.126.400 Werte und damit fast so viele wie das Eingabebild mit 1.228.800.










