- Einführung des Konzepts des Typs
Uncertain<T> als neue Abstraktion, um Unsicherheit auf Code-Ebene zu behandeln
- Dieser Typ wendet Methoden des probabilistischen Programmierens an und modelliert statt traditioneller Boolescher Logik die Zuverlässigkeit oder Wahrscheinlichkeit von Werten
- Bietet Funktionen, um rauschbehaftete reale Daten wie GPS- oder Sensordaten als mathematische Wahrscheinlichkeitsverteilungen zu behandeln
- Unterstützt mit Sampling-Techniken wie SPRT und Monte Carlo die Balance zwischen Recheneffizienz und Zuverlässigkeit der Ergebnisse
- Lässt sich schrittweise in bestehenden Code integrieren und ist dadurch sehr praxistauglich
Unsicherheit in Code fassen: die Lücke zwischen Zuversicht und realen Daten
- Es wird das Phänomen erwähnt, dass viele Menschen zu stark auf Bestätigung angewiesen sind
- Es wird darauf hingewiesen, dass man mit wachsender Erfahrung in der Softwareentwicklung immer häufiger sagt: „Es kommt darauf an“
- Im Code wiederholt sich jedoch weiterhin das Muster, sich nur auf Wahr/Falsch-Entscheidungen zu stützen
- Kritisiert wird insbesondere die Realität, dass selbst beim Umgang mit unsicheren Daten wie GPS nur Boolesche Werte verwendet werden
- Programmiermodelle teilen die reale „Unsicherheit“ zu früh binär auf und verdecken dadurch die Komplexität
Die Wahl der richtigen Abstraktion
- 2014 schlugen die University of Washington und Microsoft Research ein Konzept vor, das Unsicherheit direkt im Typsystem abbildet
- Das Paper "Uncertain<T>: A First-Order Type for Uncertain Data" zeigte, dass ein probabilistischer Programmieransatz praktikabel ist
- Ein nach Swift portierter Code des Konzepts wurde in einem GitHub-Repository veröffentlicht
- Mit
Uncertain<T> lassen sich auch Vergleichsergebnisse als relative Wahrscheinlichkeiten ausdrücken; statt Wahr/Falsch wird ein Uncertain<Bool> zurückgegeben
- GPS-Ortungsfehler werden passend zu den Eigenschaften realer Daten modelliert, etwa mit der Rayleigh-Verteilung
Die Praxis vielfältiger Unsicherheitsoperationen
- Unterstützt verschiedene Operatoren und Wahrscheinlichkeitsverteilungsmodelle, erstellt Rechengraphen und führt Sampling nur bei Bedarf aus
- SPRT (Sequential Probability Ratio Testing) dient zur effizienten Steuerung der Anzahl an Samples
- Im Beispielcode wird der Unterschied in der benötigten Sample-Anzahl zwischen einfachen und zusammengesetzten Vergleichen erläutert
- Mit dieser Abstraktion wird Unsicherheit nicht ignoriert, sondern natürlich in den Rechenprozess eingebunden, wodurch sich „intelligenterer“ Code schreiben lässt
Einsatz der Monte-Carlo-Methodik
- Zur Analyse von Wahrscheinlichkeitsverteilungen und zur Berechnung von Erwartungswerten wird Monte-Carlo-Sampling eingesetzt
- Durch wiederholte Simulation von Slotmaschinen-Ergebnissen lassen sich Erwartungswerte leicht ableiten
- Auch ohne komplexe analytische Berechnungen können durch wiederholtes computerbasiertes Sampling realistische Ergebnisse erzielt werden
Reichhaltige Modellierung von Wahrscheinlichkeitsverteilungen
Uncertain<T> enthält integrierte Konstruktoren für verschiedene Wahrscheinlichkeitsverteilungen, um reale Daten wie Sensorrauschen, Nutzerverhalten oder Netzwerk-Latenz präzise zu modellieren
- Unterstützt die Parametrisierung für unterschiedliche Situationen, darunter Mischverteilungen (mixture), Bernoulli, exponential und normal
- Um das intuitive Verständnis der einzelnen Verteilungen zu fördern, wird zusätzlich ein interaktives Visualisierungsprojekt bereitgestellt
Statistische und analytische Operationen
- Bietet verschiedene statistische Funktionen wie Erwartungswert, Standardabweichung, Konfidenzintervall, Schiefe (skewness), Kurtosis und Entropie
- Bei den Ergebnissen lässt sich auch die Anzahl der Samples steuern, wodurch ein Trade-off zwischen Präzision und Effizienz möglich ist
- Mithilfe der kumulativen Verteilungsfunktion (CDF) lässt sich auch die Wahrscheinlichkeit, dass ein Wert unterhalb eines bestimmten Grenzwerts liegt, leicht berechnen
Leitfaden für den Praxiseinsatz
- Es wird erklärt, welche Probleme in Apps entstehen können, wenn Unsicherheit ignoriert wird (z. B. völlig unrealistische GPS-Geschwindigkeitsanzeigen)
- Betont wird ein schrittweiser Übergang: empfohlen wird,
Uncertain<T> zunächst teilweise in zentrale Pfade wie bestehende Distanzmessungen zu integrieren
- Über Einstellungen zu den Rechenkosten wie der Sample-Anzahl lässt sich die Balance zwischen Genauigkeit und Performance steuern
- Für die Praxis wird der aktive Einsatz von Profiling-Tools wie Instruments.app empfohlen
- Ziel ist nicht, Unsicherheit zu beseitigen, sondern ihre Existenz anzuerkennen und angemessene Entwicklungsmuster für den Umgang damit zu etablieren
Fazit und Ausblick
- Entwickler können die Behandlung von Unsicherheit zunächst in kleinen Bereichen einführen und so Verbesserungen bei Nutzbarkeit und Fehlerdämpfung erwarten
- Wer akzeptiert, dass vollständige Sicherheit nicht existiert, kann mit geeigneten Werkzeugen und Abstraktionen die Qualität von Software auf ein neues Niveau heben
- Praktisch gesehen ist der richtige Umgang mit tatsächlich vorhandener Unsicherheit selbst die eigentliche Verbesserung in der realen Entwicklung
1 Kommentare
Hacker-News-Kommentare
y = m * x + bdenkt, ist sie, solange all diese Werte Literale sind, nur eine einfache Renderfunktion. Wenn die Variablen jedoch die gesamte Struktur des abgeleiteten Rechenwegs enthalten, kann man je nach Rechenrichtung Werte vorhersagen und rendern (Forward Pass) oder automatisch Gradienten/Ableitungen berechnen und damit sogar das Training neuronaler Netze verbinden. Wenn man diese Ergebnisse mathematisch sampelt, kann man die Gewichte gewinnen, die das Modell bilden. Jede Schicht im Deep Learning ist so konstruiert, und Systeme wie PyTorch können optimalen Code kompilieren, wenn man nur die Kombination der Operationen angibt. Mit anderen Worten: Uncertain<T> ist nur ein Ausgangspunkt, und es wäre ein sehr spannendes Experiment, sich vorzustellen, dass jede numerische Variable jederzeit als Metadaten möglicher Werte definiert werden kann und sich diese Metadaten so einfach manipulieren lassen wie ein Variablenwert.(-2,2)*(-2,2)berechnet, erhält man(-4,4), aber probabilistisch ist die gleichzeitige Realisierung der Extremwerte viel unwahrscheinlicher, sodass ungefähr(-2.35,2.35)realistischer wäre.certain Tangeben müsste.