Connect with us

Entwicklung & Code

Testing Unleashed: Ist wirklich jeder für Qualität verantwortlich?


In dieser Folge sprechen Richard Seidl und Gitte Ottosen darüber, wie Teams Qualität in der agilen Welt organisieren. Sie diskutieren, wer in einem crossfunktionalen Team für das Testen zuständig ist und was ein Tester über die Tools hinaus beiträgt. Das Gespräch spannt den Bogen von der Teststrategie bis zur KI-Unterstützung, mit einem klaren Blick auf Risiken, Daten und Verzerrungen.

„But if you ask many Scrum masters today, and unfortunately a few coaches as well, what does the Agile manifesto say or what are the 12 principles of Agile? They don’t know.“ – Gitte Ottosen

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: „Ist wirklich jeder für Qualität verantwortlich? – Gitte Ottosen“ und steht auf YouTube bereit.


(mdo)



Source link

Entwicklung & Code

Webentwicklung ohne Grenzen Teil 3: Der Praxis-Guide für barrierefreies Design


Barrierefreiheit heißt nicht nur, konform zu Gesetzen und Richtlinien zu sein und technische Maßnahmen umzusetzen. Vielmehr ist ein Perspektivwechsel nötig, damit Entwicklerinnen und Entwickler gemeinsam mit den Nutzern zu mehr Teilhabe beitragen. Darum geht es nun im letzten Teil der Artikelserie zu barrierefreiem Design.


Marie-Christin Lueg

Marie-Christin Lueg

Marie-Christin Lueg arbeitet als Wissenschaftliche Mitarbeiterin im Fachgebiet Rehabilitationssoziologie der TU Dortmund. Ihr Schwerpunkt liegt im Bereich digitale Teilhabe und partizipative Forschung.


Nele Maskut

Nele Maskut

Nele Maskut ist Lehramtsanwärterin an einer Förderschule mit dem Förderschwerpunkt Geistige Entwicklung. Ein besonderes Anliegen ist ihr die Förderung der digitale Teilhabe von Menschen mit Behinderung.

Die vier Grundprinzipien Wahrnehmbarkeit, Bedienbarkeit, Verständlichkeit und Robustheit helfen dabei, einzelne Funktionen in der Webentwicklung zu implementieren und zu prüfen, etwa die formale und sprachliche Gestaltung einer Webseite (siehe Teil 2 der Serie). Content-Management-Systeme (CMS) und Developer-Tools vereinfachen es, Barrierefreiheit gemäß der in Teil 1 beschriebenen aktuell geltenden Richtlinien umzusetzen. Das sind wichtige Grundvoraussetzungen digitaler Barrierefreiheit. Um Softwareprodukte konsequent für alle zugänglich und nutzbar zu gestalten, plädieren wir dafür, noch einen weiteren Schritt zu wagen und die Perspektiven und Wünsche der Nutzerinnen und Nutzer stärker einzubeziehen.

In der realen Nutzung unterscheiden sich individuelle Bedürfnisse nicht nur starr zwischen verschiedenen Menschen und Usergruppen. Auch die Bedürfnisse einer einzelnen Person können beispielsweise situations- oder tagesformabhängig variieren. Hier bedarf es also individueller und flexibel anpassbarer Lösungen. Eine besondere Herausforderung besteht in der Umsetzung von Barrierefreiheit für Menschen, die Schwierigkeiten damit haben, komplexe (sprachliche) Inhalte und Strukturen zu verstehen. Das betrifft nicht nur Menschen mit kognitiven Beeinträchtigungen und Lernschwierigkeiten, sondern auch solche mit Fluchterfahrungen, mit geringer Lese- und Schreibkompetenz, mit Wahrnehmungsbeeinträchtigungen oder mit altersbedingten Einschränkungen. Diese Personengruppen benötigen an ihre individuellen Bedürfnisse angepasste, vereinfachte Webseiten. Um das zu verdeutlichen, möchten wir Ihnen gerne drei Personen vorstellen:


Symbolbild Paul

Symbolbild Paul

(Bild: Freepik)

Paul arbeitet als Projektmanager. Als Mensch im Autismus-Spektrum empfindet er Webseiten als herausfordernd, die zu viele Sinneseindrücke gleichzeitig ansprechen und die von ihm verlangen, sich auf jeder Webseite auf ein neues Layout einzulassen. Besonders ablenkend sind für ihn schmückende Bilder und Werbeinhalte. Hier wünscht er sich die Möglichkeit, solche Inhalte nach einem kurzen Check auszuschalten und eine Ansicht des Textes einzustellen, die auf allen Websites gleich aussieht.


Symbolbild Julia

Symbolbild Julia

(Bild: Freepik)

Julia besucht in ihrer Freizeit gerne Kochseiten im Internet. Als Mensch mit Lernschwierigkeiten versteht sie nicht immer alle Zutaten und Anweisungen. Sie verrutscht beim Lesen häufig in der Zutatenliste und kann viele Rezepte nicht zubereiten. Sie wünscht sich, zu einzelnen Wörtern zusätzliche Informationen abrufen zu können, um beispielsweise alternative Erklärungen oder Bilder zu erhalten. Zudem möchte sie eine Hilfestellung, um die Zeile wiederzufinden, die sie zuletzt gelesen hat.


Symbolbild Enrique

Symbolbild Enrique

(Bild: Freepik)

Enrique studiert als internationaler Student an einer deutschen Universität. Ein großer Teil der Informationen auf der Website der Universität sind mindestens ins Englische übersetzt, sodass er sie verstehen kann. Immer wieder stößt er allerdings auf deutschsprachige Webseiten oder Passagen. Er wünscht sich die Möglichkeit, Texte direkt auf der Website zu übersetzen und bei ihm noch unbekannten Wörtern Erklärhilfen nutzen zu können.

Die aufgeführten Personen stehen beispielhaft für viele weitere Menschen, deren Bedürfnisse und Individualität bei der Umsetzung von digitaler Barrierefreiheit mitbedacht werden sollten. Denn wie bereits in Teil 1 ausführlich diskutiert, gilt auch in diesem Fall: Alle Personen profitieren von zusätzlichen Einstellungen der Barrierefreiheit – von den Leserinnen und Lesern mit Lernschwierigkeiten über Durchschnittsbesucherinnen und -besucher bis hin zu den Webentwicklerinnen und -entwicklern selbst.

Mittlerweile existieren einige Software-Tools, die Websites an die individuellen Bedürfnisse von Menschen anpassen. Am bekanntesten dürften Overlay-Tools sein, die in bestehende Websites integrierbar sind. Die Tools können Websites für viele Menschen besser zugänglich und nutzbar machen. Overlay-Tools sind aber selbst nicht immer barrierefrei umgesetzt und somit nicht immer kompatibel mit genutzten Hilfsmitteln, beispielsweise Screenreadern. Zudem unterscheiden sich die Tools untereinander hinsichtlich ihrer Platzierung und Werkzeuge, sodass sich Nutzerinnen und Nutzer bei jeder Website neu mit dem entsprechenden Overlay-Tool auseinandersetzen müssen. Das kann zeitaufwendig sein und lenkt von den eigentlichen Inhalten der Webseite ab. Mehr Informationen zu Overlay-Tools stehen hier zur Verfügung: BITVTest (2022), Barrierekompass (2022) oder bfit-bund (2024).

Ein anderer Ansatz wurde bei der Entwicklung des Softwaretools Easy Reading in einem Forschungsprojekt gemeinsam mit Menschen mit Lernschwierigkeiten gewählt. Der Prototyp der Easy-Reading-Toolbox steht als Browser-Add-on für Mozilla Firefox und Google Chrome zur Verfügung und kann kostenfrei über die Projektwebsite heruntergeladen werden. Die Hilfen sind auf jeder beliebigen Internetseite einsetzbar und ermöglichen so eine userzentrierte Steuerung der Anpassungen. Aber was bedeutet das genau?

Nutzerinnen und Nutzer können mit den verschiedenen Funktionen prinzipiell jede beliebige HTML-basierte Webseite an ihre aktuellen Unterstützungsbedürfnisse anpassen. Da die Anpassungen immer nur für die aktuelle Browseransicht gelten, können sie zu jeder Zeit zum ursprünglichen Text und zur Originalansicht zurückkehren. Inhalte gehen durch die Anpassungen nicht verloren, wie das etwa bei der Übersetzung in Leichte Sprache geschieht, die nur für bestimmte Informationen zur Verfügung steht. Die Hilfen in Easy Reading sind in vier Funktionsbereiche unterterteilt: Lesehilfen, Erklärhilfen, Gestaltungshilfen und Übersetzungen (siehe Abbildung 1).


Eine Übersicht über die Funktionen von Easy Reading (Abb. 1).

Eine Übersicht über die Funktionen von Easy Reading (Abb. 1).

Eine Übersicht über die Funktionen von Easy Reading (Abb. 1).


Screenshot der Desktopversion von Easy Reading. Die Funktionen Leselineal und Symbolsuche sind aktiviert (Abb. 2).

Screenshot der Desktopversion von Easy Reading. Die Funktionen Leselineal und Symbolsuche sind aktiviert (Abb. 2).

Screenshot der Desktopversion von Easy Reading. Die Funktionen Leselineal und Symbolsuche sind aktiviert (Abb. 2).


Screenshot der mobilen Version von Easy Reading. Die Funktionen Leselineal, Zeilenabstand sowie Farbe ändern und Übersetzung sind aktiviert (Abb. 3).

Screenshot der mobilen Version von Easy Reading. Die Funktionen Leselineal, Zeilenabstand sowie Farbe ändern und Übersetzung sind aktiviert (Abb. 3).

Screenshot der mobilen Version von Easy Reading. Die Funktionen Leselineal, Zeilenabstand sowie Farbe ändern und Übersetzung sind aktiviert (Abb. 3).

Easy Reading setzt grundsätzlich nicht voraus, dass eine Website barrierefrei umgesetzt ist. Das Add-on funktioniert aber am zuverlässigsten, wenn die Webseiten standardkonform in HTML5 implementiert sind.

Das Softwaretool Easy Reading wurde im Rahmen eines bereits abgeschlossenen Forschungsprojekts als Prototyp entwickelt, sodass einige Funktionen aufgrund der Weiterentwicklung technischer Standards nicht mehr korrekt ausführbar sind. Der Code des Easy-Reading-Frameworks wurde mit Ende des Projekts als Open-Source-Repository auf GitHub veröffentlicht. Die Community ist herzlich eingeladen, sich an der Weiterentwicklung zu beteiligen.

Wie ist es möglich, Bedürfnisse und Barrieren über gesetzliche Richtlinien hinaus zu identifizieren und zu beachten – insbesondere, wenn der Kontakt und die Erfahrung mit Menschen mit Behinderungen fehlen? Wie gelingt es zu prüfen, welche Hilfen eine Webseite bieten sollte, um für möglichst viele Menschen zugänglich zu sein?

Die Orientierung an den Erfahrungen und Bedürfnissen der Endnutzerinnen und -nutzer spielt eine entscheidende Rolle. Häufig ist die Beteiligung von Menschen mit Behinderungen bei der Konzeption und Entwicklung von neuen Technologien und technischen Systemen jedoch nur auf einzelne Schritte beschränkt. Sie werden ganz am Anfang eines Projekts befragt oder in Usability-Tests zur Evaluation des Endprodukts [1, 2] eingebunden. Ein erfolgreicher Entwicklungsprozess sollte die Perspektive der betreffenden Usergruppe jedoch fortlaufend einbeziehen, um individuelle Herausforderungen und Bedürfnisse möglichst früh und über den gesamten Prozess aufzudecken und zu berücksichtigen. Sogenannte partizipative Projekte beteiligen die Zielgruppe, das heißt, die unmittelbar von den Forschungs- und Entwicklungsergebnissen beeinflussten Personen, konsequent und bei jedem Forschungs- und Entwicklungsschritt gleichberechtigt [3].

Dass sich partizipative Projekte lohnen, zeigt sich unter anderem an Easy Reading: Durch konsequente gemeinsame Entwicklung und Testung des Easy-Reading-Systems mit Menschen mit Lernschwierigkeiten sind Funktionen entstanden, die den konkreten Bedürfnissen der Zielgruppe gerecht werden und ebenso Vorteile für weitere Personen bieten. So können individuelle Lösungen zur Verbesserung der Zugänglichkeit für bis dahin noch zu wenig berücksichtigte individuelle Bedürfnisse geschaffen werden.

Die stärkere Beteiligung von Menschen mit Behinderungen an Softwareentwicklung ist notwendig, damit gut nutzbare Produkte für eben diese Personengruppe entstehen. Einige Einrichtungen und deren Angebote setzen sich aktiv für die Beteiligung von Menschen mit Behinderungen ein. Wer Fragen zur barrierefreien Umsetzung von Websites hat, seine Website auf Barrierefreiheit prüfen lassen möchte oder Interesse an einer Zusammenarbeit hat, kann diese Einrichtungen kontaktieren.

In Deutschland sind vor allem die PIKSL-Labore als positives Beispiel hervorzuheben. Ihr Ziel ist es, Menschen mit und ohne Behinderungen zusammenzubringen und darüber Inklusion und innovative Ideen zu fördern. Derzeit richten PIKSL-Labore an zwölf Standorten Workshops für Menschen mit und ohne Behinderungen aus, um Medienkompetenzen und digitale Teilhabe zu stärken. Zusätzlich bieten sie Beratungen zur Umsetzung von Barrierefreiheit sowie Prüfungen von Produkten auf ihre Verständlichkeit an. Mehr Informationen zu den Angeboten sind auf der Website zu finden.

Die Artikelserie „Webentwicklung ohne Grenzen“ hat das Ziel, einen Überblick über die digitale Barrierefreiheit zu schaffen. Die selbstverständliche barrierefreie Umsetzung von Websites stellt dabei nicht nur eine notwendige, sondern auch eine lohnenswerte Herausforderung dar.

Dabei ist es unerlässlich, Barrierefreiheit als fortlaufenden Prozess zu betrachten, in den Menschen mit Behinderungen eingebunden sind. Wie andere Aspekte einer Webseite oder einer digitalen Anwendung sind auch die Werkzeuge zur Umsetzung der Barrierefreiheit kontinuierlich zu überprüfen und zu verbessern – insbesondere, wenn neue Technologien eingesetzt und neue Inhalte hinzugefügt werden. Denn nur so ist der Aufwand, der sich aus der Umsetzung von Barrierefreiheit ergibt, profitabel und kommt jeder Person nachhaltig zugute.

Barrierefreie Websites und zugängliche digitale Anwendungen ermöglichen es allen Menschen, unabhängig von ihren Behinderungen, gleichberechtigt an der digitalen Welt teilzuhaben. Für Entwicklerinnen und Entwickler bedeutet das, dass sie die Gruppe der Personen, die auf digitale Inhalte zugreifen, maßgeblich erweitern können – vorausgesetzt, dass sie potenzielle Bedürfnisse von Nutzerinnen und Nutzern kennen und ihnen mit barrierefreien Lösungen entgegenkommen.

  1. Dirks, S. (2019). Empowering Instead of Hindering – Challenges in Participatory Development of Cognitively Accessible Software. In: Antona, M., Stephanidis, C. (eds) Universal Access in Human-Computer Interaction. Theory, Methods and Tools. HCII 2019. Lecture Notes in Computer Science(), vol 11572. Springer, Cham. https://doi.org/10.1007/978-3-030-23560-4_3
  2. Heumader, P., Edler, C., Miesenberger, K., & Wolkerstorfer, S. (2018). Requirements Engineering for People with Cognitive Disabilities – Exploring New Ways for Peer-Researchers and Developers to Cooperate. Computers Helping People with Special Needs, 439–445. doi:10.1007/978-3-319-94277-3_68
  3. Hartung, S., Wihofszky, P. & Wright, M. (2020). Partizipative Forschung. Ein Forschungsansatz für Gesundheit und seine Methoden. Springer: Wiesbaden.


(
mai)



Source link

Weiterlesen

Entwicklung & Code

Künstliche Neuronale Netze im Überblick 6: Convolutional Neural Networks


Neuronale Netze sind der Motor vieler Anwendungen in KI und GenAI. Diese Artikelserie gibt einen Einblick in die einzelnen Elemente. Der sechste Teil widmet sich den Convolutional Neural Networks (CNNs).


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.

Convolutional Neural Networks, im Deutschen auch faltungsneuronale Netze genannt, sind für die Verarbeitung von Daten mit einer gitterartigen Topologie wie Bildern konzipiert. Anstatt jede Eingabe vollständig mit jeder Ausgabe zu verbinden, verknüpft ein Convolutional Layer jede Ausgabe mit einem lokalisierten Bereich der Eingabe. Diese lokalisierte Verbindung nutzt die räumliche Struktur der Daten, um die Anzahl der Parameter zu reduzieren und Muster zu erfassen, die auch bei einer Verschiebung über die Eingabe hinweg aussagekräftig bleiben.

Das Herzstück einer Faltungsschicht ist die diskrete zweidimensionale Faltungsoperation. Wenn wir das Eingangsbild mit I und einen lernfähigen Filter oder Kernel mit K bezeichnen, dann wird die Faltung an der räumlichen Position (i, j) durch die doppelte Summe definiert:

(I * K)[i, j] = Σ_{m=0}^{k_h−1} Σ_{n=0}^{k_w−1} K[m, n] · I[i + m, j + n]

Hier sind k_h und k_w die Höhe und Breite des Kernels. Das Ergebnis ist eine Merkmalskarte, die alle Stellen im Bild hervorhebt, an denen das vom Kernel kodierte Muster auftritt.

PyTorch stellt eine 2D-Faltungsschicht durch die Klasse torch.nn.Conv2d bereit. Dieses Modul verwaltet einen Satz von Filtern mit der Form (out_channels, in_channels, k_h, k_w) und wendet sie auf einen gebündelten Eingabetensor der Form (batch_size, in_channels, height, width). Die Faltung verwendet außerdem einen Stride-Parameter, um Positionen zu überspringen, und einen Padding-Parameter, um einen Rand aus Nullen um die Eingabe herum einzufügen. Die Höhe und Breite der Ausgabe werden berechnet durch:

H_out = floor((H_in + 2·padding − dilation·(k_h − 1) − 1) / stride + 1)

W_out = floor((W_in + 2·padding − dilation·(k_w − 1) − 1) / stride + 1)

Nachfolgender Code erstellt eine Faltungsschicht und wendet sie auf einen Stapel von RGB-Bildern mit einer Größe von jeweils 32×32 Pixeln an.


import torch
import torch.nn as nn

# Erstellen Sie einen Stapel von acht RGB-Bildern mit einer Größe von 32×32
batch_size, in_channels, H, W = 8, 3, 32, 32
images = torch.randn(batch_size, in_channels, H, W)

# Definieren Sie eine Faltungsschicht mit 16 Ausgangskanälen, einem 3×3-Kernel, einem Schritt von eins und einer Auffüllung von eins
conv = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, stride=1, padding=1)

# Wende die Faltung auf die Bilder an
features = conv(images)

# features hat die Form (8, 16, 32, 32)


Wenn die Schrittweite eins ist und die Auffüllung gleich (kernel_size−1)/2 für ungerade Kernel-Größen ist, hat die Ausgabe-Feature-Map die gleichen räumlichen Dimensionen wie die Eingabe. Die Beibehaltung der Dimensionen auf diese Weise ist in frühen Phasen der Bildverarbeitungsnetzwerke üblich. Im Gegensatz dazu führt ein Stride größer als eins oder die Verwendung von Pooling-Layern zu einer Verringerung der räumlichen Dimensionen. Ein Zwei-mal-Zwei-Max-Pooling-Layer mit Stride zwei halbiert beispielsweise sowohl die Höhe als auch die Breite seiner Eingabe.

Pooling führt eine Form der lokalen Translationsinvarianz ein und reduziert den Rechenaufwand in tieferen Schichten. Eine Max-Pooling-Operation über ein p×p-Fenster ersetzt jedes Fenster durch seinen Maximalwert, während Average Pooling das Fenster durch seinen Mittelwert ersetzt. Im Code erstellt man eine Pooling-Schicht, indem man torch.nn.MaxPool2d oder torch.nn.AvgPool2d instanziiert.

Convolutional Layers lassen sich sequenziell stapeln, um tiefe Merkmalshierarchien aufzubauen. Frühe Schichten lernen, einfache Muster wie Kanten und Texturen zu erkennen, und spätere Schichten kombinieren diese Muster zu abstrakteren Darstellungen wie Formen und Objekten. Nach mehreren Convolutional- und Pooling-Stufen flacht man die resultierenden Merkmalkarten oft zu einem Vektor ab und leitet diesen durch vollständig verbundene Schichten, um eine Klassifizierung oder Regression durchzuführen.

Ein minimales Convolutional Network in PyTorch könnte wie folgt aussehen. Jede Zeile des Codes erfasst einen Aspekt der Architektur.


import torch
import torch.nn as nn

class SimpleCNN(nn.Module):
    def __init__(self, num_classes=10):
        super(SimpleCNN, self).__init__()
        # Erster Faltungsblock: 3→16 Kanäle, Kernel 3×3, Auffüllung zur Beibehaltung der Größe
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, padding=1)
        
        # Normalisieren Sie jede Merkmalskarte über den Batch auf einen Mittelwert von Null und eine Varianz von Eins
        self.bn1 = nn.BatchNorm2d(num_features=16)
        # Einführen von  Nichtlinearität
        self.relu = nn.ReLU()
        # Zweiter Faltungsblock: 16→32 Kanäle
        self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, padding=1)
        self.bn2 = nn.BatchNorm2d(num_features=32)
        # Downsampling um den Faktor zwei
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        
        # Vollständig verbundene Schicht, die abgeflachten Merkmale auf Klassenscores abbildet
        self.fc = nn.Linear(in_features=32 * 16 * 16, out_features=num_classes)

    def forward(self, x):
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu(x)
        x = self.conv2(x)
        x = self.bn2(x)
        x = self.relu(x)
        x = self.pool(x)
        x = x.view(x.size(0), -1)
        scores = self.fc(x)
        return scores

model = SimpleCNN(num_classes=10)
input_tensor = torch.randn(8, 3, 32, 32)
output_scores = model(input_tensor)
# output_scores hat die Form (8, 10)


Der erste Faltungsblock wandelt die dreikanalige Eingabe in sechzehn Merkmalskarten gleicher räumlicher Größe um. Die Batch-Normalisierung stabilisiert anschließend die Verteilung der Aktivierungen, was häufig das Training beschleunigt. Eine ReLU-Nichtlinearität führt die erforderliche Nichtlinearität ein. Der zweite Block wiederholt dieses Muster und reduziert nach dem Max-Pooling die Höhe und Breite jeder Merkmalskarte von 32 auf 16. Schließlich formen wir alle Merkmalskarten in einen zweidimensionalen Tensor der Form (batch_size, 32×16×16) um und leiten ihn durch eine lineare Schicht, um eine Bewertung pro Klasse zu erzeugen.

Convolutional Neural Networks bilden die Grundlage für modernste Modelle in der Bildverarbeitung und darüber hinaus.

Der nächste Teil der Serie widmet sich rekursiven neuronalen Netzen, die für die Verarbeitung sequenzieller Daten ausgelegt sind.


(rme)



Source link

Weiterlesen

Entwicklung & Code

Jenseits des Hypes: Wie Künstliche Intelligenz wirklich funktioniert


In diesem Artikel erkläre ich Ihnen innerhalb weniger Absätze einen KI-Algorithmus, den Sie danach von Grund auf verstanden haben. Dabei nutze ich keine Vereinfachung und keine Abstraktion. Und ich bin mir sicher: Wenn Sie diesen Artikel gelesen haben, werden Sie einen wichtigen Baustein der Künstlichen Intelligenz durchschauen. Und nicht nur das. Sie werden nämlich auch erkennen, warum viele der Prinzipien, die wir hier im Kleinen sehen, genauso für die großen, komplexen Systeme gelten, über die heute alle reden. Es geht dabei nicht um ChatGPT oder neuronale Netze. Es geht nicht um Sprachmodelle oder um Bilderkennung, sondern wir schauen uns stattdessen einen Algorithmus an, der so einfach ist, dass er in wenigen Schritten erklärt ist. Und gleichzeitig so tiefgehend, dass er die zentralen Ideen moderner KI in sich trägt. Und dieser Algorithmus heißt k-Means.


the next big thing – Golo Roden

the next big thing – Golo Roden

Golo Roden ist Gründer und CTO von the native web GmbH. Er beschäftigt sich mit der Konzeption und Entwicklung von Web- und Cloud-Anwendungen sowie -APIs, mit einem Schwerpunkt auf Event-getriebenen und Service-basierten verteilten Architekturen. Sein Leitsatz lautet, dass Softwareentwicklung kein Selbstzweck ist, sondern immer einer zugrundeliegenden Fachlichkeit folgen muss.

Das klingt unscheinbar, gar unspektakulär, ist aber ein perfektes Beispiel dafür, wie Künstliche Intelligenz tatsächlich arbeitet. Und warum gerade k-Means? Ganz einfach: Weil er in einer klaren und leicht nachvollziehbaren Form zeigt, worum es bei KI im Kern geht: Muster in Daten finden, Strukturen erkennen, die man auf den ersten Blick nicht sieht, und Entscheidungen treffen, die nicht eindeutig richtig oder falsch sind, sondern die auf Wahrscheinlichkeiten und Annäherungen beruhen. Und genau das ist es, was KI im Großen auch macht, nur eben mit sehr viel mehr Daten, sehr viel mehr Dimensionen und sehr viel mehr Rechenleistung.

Vielleicht denken Sie jetzt:

„Ja gut, aber so ein kleiner Algorithmus, was soll mir das denn bringen?“

Die Antwort ist: tatsächlich sehr viel. Denn wenn Sie einmal verstanden haben, wie k-Means funktioniert, dann werden Sie viele Eigenheiten von KI und von anderen Algorithmen wiedererkennen, die sonst wie Magie wirken: Warum Ergebnisse manchmal unterschiedlich ausfallen, warum die Wahl der Kriterien ausschlaggebend ist und warum Datenqualität über Erfolg oder Misserfolg entscheidet.

Stellen Sie sich eine Landkarte vor. Auf dieser Landkarte sind sehr viele Punkte eingezeichnet, und jeder Punkt steht für einen einzelnen Menschen, der irgendwo lebt. Manche Punkte liegen weit auseinander, manche hingegen dichter zusammen, und an manchen Stellen sammeln sich so viele Punkte, dass man sofort erkennt: Dort liegt ein Ballungsraum, dort ist eine Stadt oder eine Siedlung. Und die Aufgabe, die wir jetzt lösen wollen, klingt einfach: Wir wollen diese Ballungszentren finden (also die Orte, an denen sich viele Menschen häufen) – und zwar automatisiert. Genau hier kommt k-Means ins Spiel. Der Algorithmus macht nämlich genau das: Er sucht Gruppen in Daten, sogenannte Cluster.

Empfohlener redaktioneller Inhalt

Mit Ihrer Zustimmung wird hier ein externes YouTube-Video (Google Ireland Limited) geladen.

KI verstehen in 10 Minuten // deutsch

Wie funktioniert das? Stellen Sie sich vor, wir setzen am Anfang wahllos ein paar Marker auf die Landkarte. Die Anzahl dieser Marker nennen wir k. Also k Marker für k Cluster (da kommt übrigens der erste Teil des Namens des Algorithmus her, deshalb heißt er „k-Means“). Diese Marker platzieren wir zunächst, wie gesagt, zufällig irgendwo. Das bedeutet, am Anfang haben sie noch nichts mit den tatsächlichen Ballungszentren zu tun, sondern sie stehen sozusagen einfach nur irgendwo in der Gegend herum.

Doch jetzt passiert der erste Schritt: Jeder Einwohner, also jeder Punkt auf unserer Karte, sucht sich den Marker aus, der ihr oder ihm am nächsten liegt. Und damit entstehen Gruppen: Jeder Punkt gehört nun zu genau einem Marker. Im zweiten Schritt bewegen wir dann jeden Marker in die Mitte seiner Gruppe. Das heißt, wir schauen uns alle Punkte an, die dem Marker zugeordnet sind, und verschieben ihn dorthin, wo der Durchschnitt liegt. Im Englischen heißt Durchschnitt übrigens mean bzw. im Plural means, und damit wissen Sie jetzt auch, wo der zweite Namensbestandteil des Algorithmus herkommt.

Dann wiederholen wir das Ganze: Jeder Punkt prüft wieder neu, welcher Marker ihm am nächsten liegt, und manche Punkte wechseln anschließend die Gruppe. Die Marker werden dann erneut in die Mitte ihrer jeweiligen Gruppe verschoben. Dieses Vorgehen wiederholt sich dann so lange, bis sich irgendwann nichts mehr ändert. Dann liegt das Ergebnis vor: Die Marker liegen genau dort, wo sich die Ballungszentren befinden.

Das Spannende ist: Dieses Verfahren funktioniert erstaunlich gut, obwohl wir am Anfang zufällige Startpunkte gewählt haben. Aber (und das ist wichtig): Diese Zufälligkeit hat natürlich einen gewissen Einfluss. Denn je nachdem, wo die Marker am Anfang stehen, können sich die Ergebnisse am Ende durchaus unterscheiden. Manchmal landen sie in sehr ähnlichen Positionen, manchmal aber auch in deutlich unterschiedlichen.

Genau hier liegt die erste wichtige Erkenntnis: KI ist nicht immer deterministisch. Gleiche Daten können zu unterschiedlichen Ergebnissen führen, und zwar einfach nur deshalb, weil die Startbedingungen anders waren. Das bedeutet: Zufall spielt eine Rolle und ist ein Faktor, der sich in sehr vielen Bereichen der KI wiederfindet. Wenn man das einmal verstanden hat, dann begreift man, dass KI nicht mit absoluten Wahrheiten arbeitet, sondern mit Wahrscheinlichkeiten und Annäherungen.

Nun können wir das Ganze aber noch ein bisschen komplexer machen: Stellen Sie sich vor, wir hätten keine Landkarte mit Einwohnern, sondern ein Whiteboard, auf das wir alle unseren persönlichen Lieblingssong schreiben. Irgendwohin, wo gerade Platz ist. Jeder Song ist wieder ein Datenpunkt. Und unsere Aufgabe lautet wieder: Wir wollen Gruppen bilden. Wir wollen herausfinden, welche Songs sich ähneln und welche sich unterscheiden. Doch nun wird es spannend, denn anders als bei der Landkarte gibt es hier keine natürliche räumliche Position. Wenn ich einen Song auf dem Whiteboard ganz links hinschreibe und einen anderen ganz rechts, dann sagt das über ihre Ähnlichkeit überhaupt nichts aus. Der Abstand auf dem Whiteboard hat keinerlei Bedeutung.

Das heißt, wir müssen Kriterien definieren, nach denen wir die Songs vergleichen wollen. Genau das macht k-Means, oder besser gesagt: Das müssen wir vorher festlegen, damit k-Means überhaupt etwas Sinnvolles machen kann. Welche Kriterien könnten das bei Musik nun sein? Da wäre zum Beispiel das Tempo, gemessen in Beats pro Minute (also BPM). Ein anderer Faktor wäre vielleicht die durchschnittliche Lautstärke, gemessen in Dezibel. Oder die Klangfarbe, also welche Instrumente dominieren. Oder ob es Gesang gibt oder nicht. Sie können sich leicht vorstellen, dass es noch zahlreiche andere Faktoren gibt, die man in Betracht ziehen könnte.

Das Interessante ist nun: Je nachdem, welche Kriterien wir wählen, entstehen völlig unterschiedliche Cluster. Wenn wir nur auf das Tempo schauen, dann landen ein schneller Techno-Track und ein klassisches Stück im Presto-Tempo plötzlich im selben Cluster, obwohl sie musikalisch nicht allzu viel miteinander gemeinsam haben. Wenn wir dagegen aber nach Lautstärke gehen, dann stehen vielleicht eine ruhige Jazz-Ballade und ein Ambient-Track nebeneinander. Und wenn wir den Gesang als Kriterium nehmen, dann tauchen auf einmal eine Arie aus einer Oper und ein Rocksong in derselben Gruppe auf.

Damit kommen wir zur zweiten Erkenntnis: Die Ergebnisse hängen immer davon ab, welche Merkmale wir auswählen. Daten sind nicht einfach „die Wahrheit“. Sie sind vielmehr eine Sammlung von Eigenschaften, die wir interpretieren und gewichten müssen. Erst durch unsere Entscheidung, welche Dimensionen wir betrachten, bekommt das Clustering eine Bedeutung. Dieser Punkt zeigt sich bei komplexeren Daten noch weitaus stärker. Denn wenn wir über Sprachmodelle oder über Bilderkennung sprechen, dann geht es nicht mehr nur um zwei Aspekte wie beispielsweise Tempo und Lautstärke, sondern um hunderte oder gar tausende Merkmale, die man gar nicht mehr intuitiv erfassen kann. Aber das Prinzip bleibt dasselbe: Was am Ende herauskommt, hängt davon ab, wie wir die Daten beschreiben.

Wenn wir noch kurz bei den Songs bleiben, dann wird noch ein weiteres Problem sichtbar: Manche Eigenschaften lassen sich nämlich problemlos messen, sind aber überhaupt nicht vergleichbar. Nehmen Sie zum Beispiel die Länge eines Songs in Sekunden und das Tempo in Beats pro Minute. Beides sind Zahlen, beide (vermutlich) dreistellig, aber die Bedeutung ist völlig verschieden. Ein Song mit 240 Sekunden Dauer ist nicht vergleichbar mit einem Song, der 240 Beats pro Minute hat. Trotzdem würde ein Algorithmus diese Werte ohne weitere Anpassung unter Umständen einfach nebeneinanderlegen, und schon entsteht ein schiefes Bild.

Das Gleiche gilt auch für Skalen. Das Tempo in BPM ist eine lineare Skala: 90 BPM sind 30 BPM schneller als 60 BPM, und 120 BPM sind nochmal 30 BPM schneller als 90 BPM. Der Unterschied bleibt immer gleich. Bei Lautstärke in Dezibel ist das aber ganz anders. Auch dort ist der Unterschied zwischen 60 dB und 90 dB rein rechnerisch 30 dB. Aber in Wirklichkeit bedeutet dieser Unterschied eine gewaltige Vervielfachung der Lautstärke, denn hier haben wir es mit einer logarithmischen Skala zu tun. Und wenn wir nun Werte dieser Skalen direkt vergleichen, dann hat das Ergebnis keinerlei Aussagekraft.

Deshalb müssen Daten üblicherweise zunächst normalisiert werden, das heißt, damit die Daten überhaupt sinnvoll verarbeitet werden können, müssen sie in vergleichbare Größenordnungen gebracht werden. Man sorgt also dafür, dass kein einzelnes Kriterium nur deshalb dominiert, weil es in einem größeren Zahlenbereich liegt. Ohne Normalisierung könnte zum Beispiel die Länge eines Songs alle anderen Eigenschaften überdecken, weil die Sekundenwerte oft größer sind als das Tempo oder die Lautstärke.

Hinzu kommt noch eine weitere Herausforderung, nämlich kategoriale Werte. Stellen Sie sich vor, wir wollen berücksichtigen, ob ein Song Gesang enthält oder nicht. Das ist ein Ja-Nein-Kriterium, das man leicht als Null und Eins kodieren kann. Aber sobald es mehr als zwei Werte gibt, etwa beim Genre, wird es schwieriger. Denn dann muss man sehr sorgfältig darauf achten, wie Abstände zwischen den Werten interpretiert werden, damit der Algorithmus daraus keine falschen Schlüsse zieht.

Damit sind wir bei der dritten Erkenntnis: Ergebnisse hängen nicht nur von der Wahl der Kriterien ab, sondern genauso stark von deren Skalierung, Normalisierung und Aufbereitung. Wenn die Daten unsauber sind oder die Skalen nicht vergleichbar, dann kann kein Algorithmus der Welt ein sinnvolles Ergebnis liefern.

Aus diesen Gründen ist Datenqualität für mich persönlich ein so wichtiges Thema. Sie ist nicht irgendwelches schmückendes Beiwerk, sondern sie ist die Grundlage. Ohne gute Datenvorbereitung bleibt jede noch so komplexe KI ein reines Glücksspiel. Deswegen erwähne ich auch immer wieder, dass Event-Sourcing eine hervorragende Basis für KI sein kann, weil es saubere und nachvollziehbare Daten von Anfang an bereitstellt.

Wenn wir an dieser Stelle einmal kurz innehalten, dann sehen wir: Selbst ein so einfacher Algorithmus wie k-Means zeigt bereits eine ganze Menge an Prinzipien, die auch in komplexeren KI-Systemen gelten:

  • Zufall beeinflusst die Ergebnisse.
  • Die Auswahl der Kriterien bestimmt, was wir überhaupt messen.
  • Die Skalierung, die Normalisierung und nicht zuletzt auch die Qualität der Daten entscheiden darüber, ob das Ergebnis sinnvoll oder völlig verzerrt ist.

Wenn wir das auf größere Systeme übertragen (also neuronale Netze, Sprachmodelle, Bilderkennung und so weiter), dann wird sofort klar, warum diese Verfahren so schwer zu durchschauen sind. Es gibt nicht mehr nur drei oder vier Kriterien wie Tempo, Lautstärke oder Songlänge, sondern plötzlich hunderte, tausende, manchmal Millionen von Dimensionen. Und jede Dimension beeinflusst das Ergebnis, aber niemand kann noch nachvollziehen, welche genau in welchem Maß ausschlaggebend ist.

Mit anderen Worten: Die Grundidee bleibt gleich, aber die Komplexität explodiert. Bei k-Means im zwei- oder dreidimensionalen Raum können Sie (im wahrsten Sinn des Wortes) noch sehen, wie sich die Marker verschieben, wie sich die Cluster bilden und warum bestimmte Punkte augenscheinlich zusammengehören. Bei neuronalen Netzen laufen nun zwar dieselben Mechanismen ab, aber so hochdimensional, dass man sich das nicht mehr vorstellen kann. Nähe und Abstand verlieren hier ihre intuitive Bedeutung, weil wir Menschen uns solche Räume nicht mehr vor Augen führen können.

Die Konsequenz daraus ist entscheidend: KI findet keine objektive Wahrheit, KI erkennt lediglich Strukturen, die in den Daten vorhanden sind, und bietet uns eine Annäherung und eine Wahrscheinlichkeit. Mehr Rechenleistung, größere Modelle und mehr Daten ändern dabei nichts am Grundprinzip. Sie verbessern zwar die Ergebnisse, machen sie stabiler und oft erstaunlich präzise, aber die Basis bleibt: Es sind Muster in Daten, keine absoluten Wahrheiten.

Aus diesem Grund ist es so wichtig, dass wir KI nicht blind vertrauen, sondern verstehen, wie sie arbeitet. Dass wir begreifen, dass das, was wie Intelligenz wirkt, in Wirklichkeit lediglich das Erkennen von Wahrscheinlichkeiten in einem Raum voller Datenpunkte ist. Wer das verstanden hat, die oder der kann Ergebnisse richtig einordnen, und das ist oft viel wertvoller, als sie einfach nur zu konsumieren.

Nun waren das, was wir uns in diesem Artikel angeschaut haben, zwei sehr einfache Beispiele. In der Praxis sind die Daten natürlich nicht so schön übersichtlich wie eine Landkarte oder wie eine kleine Sammlung von Songs. Sie sind weitaus komplexer, vielschichtiger und oft voller Widersprüche. Außerdem sind üblicherweise auch die Anforderungen deutlich höher: Es reicht nicht, dass ein Algorithmus „irgendwie“ funktioniert, sondern er muss nachvollziehbar, zuverlässig und in eine bestehende Systemlandschaft integrierbar sein.

Und genau hier wird es spannend: Denn die eigentliche Herausforderung liegt nicht primär im Algorithmus selbst, sondern in der Architektur, die ihn umgibt.

  • Woher kommen die Daten?
  • Wie werden sie aufbereitet?
  • Wie stellen wir sicher, dass die Ergebnisse nicht nur in einem Experiment gut aussehen, sondern auch im Alltag tragfähig sind?

All das sind die Fragen, an denen viele KI-Projekte scheitern, und genau das sind die Fragen, die man beantworten muss, wenn man KI wirklich produktiv einsetzen will. Denn am Ende geht es eben nicht nur darum, einen Algorithmus zu verstehen, sondern darum, ihn zielgerichtet und lösungsorientiert einsetzen zu können.


(mai)



Source link

Weiterlesen

Beliebt