Connect with us

Entwicklung & Code

Künstliche Neuronale Netze im Überblick 4: Verlustfunktionen


Neuronale Netze sind der Motor vieler Anwendungen in KI und GenAI. Diese Artikelserie gibt einen Einblick in die einzelnen Elemente. Der vierte Teil der Serie stellt die gängigsten Verlustfunktionen vor, leitet ihre Gradienten ab und zeigt dann, wie man die grundlegende Gradientenabstiegs-Aktualisierungsregel und ihre komplexeren Varianten entwickelt.


Michael Stal

Michael Stal

Prof. Dr. Michael Stal arbeitet seit 1991 bei Siemens Technology. Seine Forschungsschwerpunkte umfassen Softwarearchitekturen für große komplexe Systeme (Verteilte Systeme, Cloud Computing, IIoT), Eingebettte Systeme und Künstliche Intelligenz.

Er berät Geschäftsbereiche in Softwarearchitekturfragen und ist für die Architekturausbildung der Senior-Software-Architekten bei Siemens verantwortlich.

Um einem neuronalen Netzwerk nützliche Aufgaben beizubringen, müssen wir quantifizieren, wie gut seine Vorhersagen mit den Zielwerten übereinstimmen. Eine Verlustfunktion ist ein skalares Maß für den Fehler, den der Trainingsprozess durch Anpassung der Netzwerkparameter minimieren soll.

Wenn die Aufgabe des Netzwerks darin besteht, kontinuierliche Größen vorherzusagen, ist der mittlere quadratische Fehler eine naheliegende Wahl. Angenommen, wir haben einen Datensatz mit N Beispielen, wobei jedes Beispiel i einen Zielwert yᵢ hat und das Netzwerk eine Vorhersage ŷᵢ liefert. Der mittlere quadratische Fehler L ist definiert durch

L(ŷ, y) = (1/N) Σᵢ (ŷᵢ − yᵢ)²

Dieser Ausdruck summiert die quadrierten Differenzen zwischen Vorhersage und Zielwert über alle Beispiele und dividiert sie durch N, um einen Durchschnitt zu erhalten. Durch die Quadrierung des Fehlers werden große Abweichungen stärker bestraft als kleine, und durch den Durchschnitt wird der Verlust unabhängig von der Größe des Datensatzes.

Um zu sehen, wie dieser Verlust die Parameteraktualisierungen beeinflusst, berechnen wir seine Ableitung in Bezug auf eine einzelne Vorhersage ŷⱼ:

∂L/∂ŷⱼ = (2/N) (ŷⱼ − yⱼ)

Während der Rückpropagation wird dieser Gradient durch das Netzwerk weitergeleitet und steuert jede Gewichtsaktualisierung in Richtung einer Verringerung des quadratischen Fehlers.

In PyTorch schreibt man:


import torch
import torch.nn as nn

# Angenommen, `model` ordnet Eingaben den Vorhersagen ŷ der Form (batch_size, 1) zu
loss_fn = nn.MSELoss()  # erstellt ein Modul für den mittleren quadratischen Fehler
predictions = model(inputs)  # Vorwärtsdurchlauf erzeugt ŷ
loss = loss_fn(predictions, targets)


Hier kapselt nn.MSELoss() die obige Formel. Wenn wir später loss.backward() aufrufen, berechnet PyTorch ∂L/∂parameters automatisch, indem es die partiellen Ableitungen durch den Berechnungsgraphen verkettet.

Wenn die Aufgabe die Klassifizierung in eine von C Klassen ist, gibt das Netzwerk typischerweise einen Vektor von Logits z ∈ ℝᶜ für jedes Beispiel aus. Um diese Logits in eine Wahrscheinlichkeitsverteilung p umzuwandeln, wenden wir die Softmax-Funktion an:

softmax(z)ᵢ = exp(zᵢ) / Σⱼ exp(zⱼ)

Wenn die wahre Klassenbezeichnung für Beispiel i als One-Hot-Vektor y codiert ist, wobei yᵢ = 1 und yⱼ = 0 für j ≠ i, dann ist der Kreuzentropieverlust

L(z, y) = − Σᵢ yᵢ · log( softmax(z)ᵢ )

Da nur ein Eintrag von y ungleich Null ist, vereinfacht sich dies zu der negativen Log-Wahrscheinlichkeit, die der richtigen Klasse zugewiesen wird. Bei Verwendung von PyTorch’s nn.CrossEntropyLoss fusioniert die Implementierung die Softmax- und Log-Schritte auf numerisch stabile Weise und erwartet rohe Logits und ganzzahlige Klassenindizes:


import torch.nn as nn

loss_fn = nn.CrossEntropyLoss() # erstellt einen kombinierten Log-Softmax + NLL-Verlust
logits = model(inputs) # Form (batch_size, num_classes)
loss = loss_fn(logits, class_indices)


Im Hintergrund ist der Gradient von L in Bezug auf jedes Logit zₖ

∂L/∂zₖ = softmax(z)ₖ − yₖ,

was genau der Differenz zwischen der vorhergesagten Wahrscheinlichkeit und der tatsächlichen Beschriftung für jede Klasse entspricht.

Sobald ein Verlust festgelegt wurde, ist die einfachste Regel zur Parameteraktualisierung der Gradientenabstieg. Bezeichnen wir mit θ einen einzelnen Skalarparameter (einen Eintrag einer Gewichtungsmatrix oder eines Bias-Vektors) und mit L(θ) den Verlust als Funktion von θ. Die Gradientenabstiegsregel aktualisiert θ in Richtung des steilsten Abstiegs:

θ ← θ − η · ∂L/∂θ

Hier ist η > 0 die Lernrate, ein Hyperparameter, der die Schrittgröße steuert. Ein kleiner η-Wert führt zu einer langsamen, aber stabilen Konvergenz, während ein großer η-Wert dazu führen kann, dass der Verlust schwankt oder divergiert.

In der Praxis unterscheidet man drei Varianten: Wenn der Gradient vor jeder Aktualisierung über den gesamten Datensatz berechnet wird, spricht man von Batch-Gradientenabstieg; wenn für jede Aktualisierung nur ein einziges Beispiel verwendet wird, spricht man von stochastischem Gradientenabstieg; und wenn kleine Teilmengen von Beispielen (Mini-Batches) verwendet werden, spricht man von Mini-Batch-Gradientenabstieg. Mini-Batch-Aktualisierungen stellen einen Kompromiss zwischen verrauschten, aber schnellen stochastischen Aktualisierungen und stabilen, aber kostspieligen Batch-Aktualisierungen dar.

PyTorch bietet über das Paket torch.optim eine einfache Möglichkeit, Gradientenabstieg mit Mini-Batches durchzuführen. Um beispielsweise den einfachen stochastischen Gradientenabstieg mit Momentum zu verwenden, schreibt man:


import torch.optim as optim

optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
# für Eingaben, Ziele in data_loader: data_loader liefert Mini-Batches
optimizer.zero_grad()  # alle akkumulierten Gradienten löschen
outputs = model(inputs)  # Vorwärtsdurchlauf
loss = loss_fn(outputs, targets)  # Verlust berechnen
loss.backward()  # Rückwärtspropagierung zur Berechnung der Gradienten
optimizer.step()  # Parameter an Ort und Stelle aktualisieren


Der Aufruf von optimizer.zero_grad() löscht die Gradientenpuffer aller Parameter, sodass sich Gradienten aus früheren Iterationen nicht ansammeln. Der Aufruf von loss.backward() füllt das Attribut .grad jedes Parameters mit dem berechneten ∂L/∂θ, und optimizer.step() verwendet diese Gradienten, um die Parameter gemäß der gewählten Aktualisierungsregel zu aktualisieren.

Während einfaches Momentum die Konvergenz in Tälern der Verlustfunktion beschleunigen kann, passen adaptive Methoden die Lernrate jedes Parameters individuell auf der Grundlage der Historie seiner Gradienten an. RMSProp behält einen exponentiell gewichteten gleitenden Durchschnitt der vergangenen quadrierten Gradienten bei:

sₜ = γ·sₜ₋₁ + (1−γ)·gₜ²

θ ← θ − (η / sqrt(sₜ + ε)) · gₜ

wobei gₜ = ∂L/∂θ zum Zeitpunkt t, γ typischerweise um 0,9 liegt und ε eine kleine Konstante für die numerische Stabilität ist. In PyTorch wird dies wie folgt konstruiert:

optimizer = optim.RMSprop(model.parameters(), lr=0.001, alpha=0.99, eps=1e-8)

Adam kombiniert Momentum und RMSProp, indem es sowohl einen gleitenden Durchschnitt der Gradienten mₜ als auch der quadrierten Gradienten vₜ beibehält und eine Bias-Korrektur anwendet:

mₜ = β₁·mₜ₋₁ + (1−β₁)·gₜ

vₜ = β₂·vₜ₋₁ + (1−β₂)·gₜ²

m̂ₜ = mₜ / (1−β₁ᵗ)

v̂ₜ = vₜ / (1−β₂ᵗ)

θ ← θ − η · ( m̂ₜ / ( sqrt(v̂ₜ) + ε ) )

mit den Standardwerten β₁=0,9, β₂=0,999 und ε=1e-8.

Im Code:

optimizer = optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.999), eps=1e-8)

Jeder dieser Optimierer erfordert die Abstimmung seiner Hyperparameter – Lernrate, Abklingraten und Epsilon –, um die beste Leistung für ein bestimmtes Problem zu erzielen.

Der nächste Teil der Serie zeigt, wie diese Komponenten zu einer vollständigen Trainingsschleife zusammengesetzt werden. Anschließend untersucht er die Unterschiede zwischen dem Training mit und ohne explizite Minibatches und stellt Techniken wie Dropout und Gewichtsabnahme zur Verbesserung der Generalisierung vor.


(rme)



Source link

Entwicklung & Code

Nvidia: Updates gegen hochriskante Lücken in KI-Software


close notice

This article is also available in
English.

It was translated with technical assistance and editorially reviewed before publication.

In diverser KI-Software von Nvidia haben die Entwickler Sicherheitslücken gefunden. Diese stellen teils ein hohes Risiko dar. Aktualisierte Software respektive Repositories stehen bereit, mit denen Betroffene die Software absichern können.

Betroffen sind die Nvidia-Projekte Apex, Isaac-GR00T, Megatron LM, Merlin Transformers4Rec, NeMo Framework sowie WebDataset. Die Schwachstellenbeschreibungen nennen als Auswirkungen der Sicherheitslücken, dass Angreifer etwa beliebigen Code ausführen, ihre Rechte ausweiten, Informationen ausspähen oder Daten manipulieren können.

Details zu den einzelnen Lücken nennt das Unternehmen in den einzelnen Sicherheitsmitteilungen nicht, sondern erörtert lediglich, was bösartige Akteure damit anrichten können:

In den einzelnen Security-Advisories verweist Nvidia jedoch auf die jeweiligen Github-Repositories und die einzelnen Commits, die die aufgeführten Sicherheitslecks stopfen. IT-Verantwortliche sollten dafür Sorge tragen, dass die Aktualisierungen in der eingesetzten Software auch angewendet werden, um die Angriffsfläche zu reduzieren.

Zuletzt wurden im März Schwachstellen in KI-Software von Nvidia bekannt. Die HGX-Software „Hopper HGX for 8-GPU“ enthielt zwei Sicherheitslücken, die Angreifer zum Ausführen von Schadcode oder zum Lahmlegen der Software (DoS) missbrauchen konnten.


(dmk)



Source link

Weiterlesen

Entwicklung & Code

Testing Unleashed: Studierende für das Testen begeistern


In dieser englischsprachigen Podcastfolge sprechen Richard Seidl und Dmitrij Nikolajev über die Kunst, der nächsten Generation das Testen von Software beizubringen. Nikolajev, der an der Universität Vilnius lehrt, legt großen Wert auf praktisches, praxisnahes Lernen. Er integriert Tools wie Postman und Selenium, um die Studierenden mit Automatisierung und Performanztests vertraut zu machen.

„So we have automation classes where people need to test, students need to write automation scripts and that’s how they got introduced to what is a test case. And you would have to automate it.“ – Dmitrij Nikolajev

Dieser Podcast betrachtet alles, was auf Softwarequalität einzahlt: von Agilität, KI, Testautomatisierung, bis hin zu Architektur- oder Code-Reviews und Prozessoptimierungen. Alles mit dem Ziel, bessere Software zu entwickeln und die Teams zu stärken. Frei nach dem Podcast-Motto: Better Teams. Better Software. Better World.

Richard Seidl spricht dabei mit internationalen Gästen über modernes Software Engineering und wie Testing und Qualität im Alltag gelebt werden können.

Die aktuelle Ausgabe ist auch auf Richard Seidls Blog verfügbar: „Studenten für das Testen begeistern – Dmitrij Nikolajev“ und steht auf YouTube bereit.


(mai)



Source link

Weiterlesen

Entwicklung & Code

GPT-5 im Vergleich: Softwareentwicklung sehr gut, Kreativität nur ausreichend


Am 7. August ist das von vielen mit Spannung erwartete GPT-5 erschienen. So offen OpenAI mit den wenige Tage zuvor veröffentlichten GPT-OSS-Modellen umgeht, so wenig ist über die Architektur von GPT-5 bekannt. Daher müssen viele Details Spekulation bleiben. Und wie so oft bei neuen Modellen gehen die Meinungen in der Community stark auseinander.




Prof. Dr. Christian Winkler beschäftigt sich speziell mit der automatisierten Analyse natürlichsprachiger Texte (NLP). Als Professor an der TH Nürnberg konzentriert er sich bei seiner Forschung auf die Optimierung der User Experience.

Dass OpenAI einige Ideen für die GPT-OSS-Modelle dem kurz danach veröffentlichten großen GPT-5 entliehen hat, wäre anzunehmen. Vieles deutet aber darauf hin, dass GPT-5 nicht auf das schlanke MXFP4-Format setzt, das GPT-OSS so effizient macht. Die Gründe kennt nur OpenAI. Es ist schade, dass Unternehmen wie Anthropic, OpenAI und in gewissem Maße auch Google so wenig über die Architektur ihrer großen Modelle verraten.

Klar ist aber zumindest, dass GPT-5 ein sogenanntes Routing-Modell ist. Je nach Komplexität der Frage beantwortet das Modell sie entweder direkt oder gibt sie an ein Reasoning-Modell weiter, das dann versucht, das Problem strukturiert zu lösen. Leider klappt das nicht immer, wie die im Folgenden gezeigten ersten Versuche belegen.

Anders als die bisher von OpenAI veröffentlichten Modelle steht GPT-5 allen Nutzerinnen und Nutzern direkt zum Start zur Verfügung. Die interessante Strategieänderung könnte darauf zurückzuführen sein, dass das neue Modell dank Routing deutlich effizienter arbeitet und OpenAI damit Infrastruktur und somit Geld sparen kann, wenn möglichst viele das neue Modell nutzen.

OpenAI hat nach der Veröffentlichung von GPT-5 für viele User ältere Modelle wie GPT-4o und GPT-o3 in den unterschiedlichen Varianten nicht mehr bereitgestellt. Das Vorgehen hat OpenAI allerdings inzwischen korrigiert, sodass zumindest zahlende Kunden auch wieder alte Modelle wählen können.

Bei ersten Versuchen zeigt sich, dass GPT-5 Wissensfragen kompetent beantwortet:



Die Informationen zum Heise Verlag sind weitgehend fundiert, auch wenn die heise Developer World zuletzt vor neun Jahren auf der CeBIT stattfand.

Das Routing zu den Reasoning-Modellen funktioniert gut und verarbeitet den Erdbeertest korrekt. Im Netz kursieren aber auch Berichte über von GPT-5 falsch beantwortete Varianten der Strawberry-Challenge auf Englisch.



Den Erdbeertest löst GPT-5, wobei das Reasoning durch das Spezialmodell auf Englisch erfolgt und lustigerweise Großschreibung kleingeschrieben ist.

Bei komplexeren Fragen kommen allerdings nicht immer die richtigen Antworten heraus. Die Frage nach der Primfaktorenzerlegung von 220+1 beantwortet das Modell zwar eloquent und mit vielen Formeln, die Antwort ist aber leider falsch:



Dass GPT-5 die falsche Antwort plausibel begründet, ist ein typisches Phänomen bei LLMs.

Ein interessantes Detail an dieser Konversation ist, dass GPT-5 manchmal die LaTeX-Notation verwendet, manchmal aber auch nicht. Offenbar hat es aus unterschiedlichen Trainingsdaten gelernt. Durch deren Harmonisierung könnte OpenAI sicher die Performance verbessern. Allerdings sind weder der Trainingsprozess noch die dazugehörigen Gewichte bekannt. Der Fehler in der Rechnung erklärt sich dadurch, dass 220+1 nicht durch 241 dividierbar ist, die richtige Primfaktoren-Zerlegung wäre 17*61.681, das richtige Ergebnis also 61.681.

Hinsichtlich des Trainings reicht das Wissen von GPT-5 wie bei GPT-OSS bis zum Juni 2024. Die im Artikel gezeigten Chats sind auf der ChatGPT-Seite zu finden.

Erwartungsgemäß ist die Community in Bezug auf GPT-5 gespalten. User gewöhnen sich an Sprachmodelle wie an alte Freunde, und wenn sie plötzlich anders agieren, sind einige besonders begeistert, andere reagieren mit Ablehnung. Einige Meinungen treten auffällig häufig auf: weniger kreative Antworten, gut für die Softwareentwicklung geeignet, Enttäuschung im Vergleich zum Wettbewerb und Fortschritte beim Frontend.

Verringerte Kreativität: Nutzer kritisieren oft, dass das Modell weniger kreativ antwortet als die GPT-4-Modelle. Das könnte damit zusammenhängen, dass die Frage über das das Routing an ein simpleres Modell gelangt, das nicht über das notwendige Wissen für eine kreative Antwort verfügt.

Gut fürs Programmieren: Viele, die das Modell gut finden, sind besonders überzeugt von den Programmierfähigkeiten. Auch hier könnte ein Spezialmodell dahinterstehen, an das GPT-5 die Prompts weitergibt. Es ist denkbar, dass OpenAI dieses Modell mit gruppenbezogener Strategieoptimierung (Group Relative Policy Optimization, GRPO) trainiert hat, einer Methode, die das chinesische Unternehmen DeepSeek erfunden und veröffentlicht hat.

Vergleich mit Claude und Gemini 2.5 Pro: Viele Nutzerinnen und Nutzer sind enttäuscht und bevorzugen die Modelle von Anthropic und Google. Auch hier könnten Bias oder Gewöhnungseffekte eine entscheidende Rolle spielen. Harte Fakten wie die größere Kontextlänge (400.000 für GPT-5 im Vergleich zu bis zu einer Million Token bei anderen Anbietern) sprechen auch für die Modelle der Wettbewerber.

Frontend: Dass OpenAI mächtig aufgeräumt hat und unter anderem mehr Themes anbietet, sieht die Community allgemein positiv.



Source link

Weiterlesen

Beliebt