Maschinelles Lernen als Pipeline für flexible Anwendungsszenarien

KI mit niedriger Einstiegshürde: Tipps für das erste Projekt
Keine Kommentare

Kaum ein technischer Bereich wird derzeit so viel diskutiert, wie das Thema künstliche Intelligenz, egal ob von technischer, gesellschaftlicher oder philosophischer Seite. Viele Entwickler beschäftigen sich derzeit mit einer steigenden Anzahl unterschiedlicher Frameworks. In diesem Artikel erfahren Sie, welche Techniken wirklich sinnvoll sind und wie man als normalsterblicher Softwareentwickler den Überblick behält.

Selbstfahrende Fahrzeuge, digitale Assistenten im Onlineshopping oder in der modernen Genforschung – in all diesen Bereichen kommt an den einen oder anderen Stellen das Thema künstliche Intelligenz (KI) auf. Doch was genau ist KI und ab wann ist eine Software eigentlich „intelligent“?

Genau genommen ist dieses Thema nichts wirklich Neues. Künstliche Intelligenz begleitet uns in technischen Anwendungen bereits seit vielen Jahren. Schon in den 90er Jahren des letzten Jahrhunderts wurden lernende bzw. trainierbare Algorithmen genutzt, um unterschiedlichste Anwendungen umzusetzen. Angefangen bei der einfachen Erkennung und Umwandlung von geschriebenem Text (OCR) und dem bekannten Anbieten ähnlicher und anhand des Kaufverhaltens potenziell interessanter Artikel in einem Onlineshop.

Durch immer leistungsfähigere Geräte und Serverfarmen bekommen intelligente Anwendungen inzwischen zunehmend größere Bedeutung und Verbreitung. Vor allem durch den Siegeszug verteilten Rechnens und Cloud-Computings ist es auch für kleinere Softwareunternehmen möglich, auf große Rechenleistung zurückzugreifen und entsprechende Applikationen zu entwickeln. Doch wie entwickelt man nun künstliche Intelligenz und welche Werkzeuge muss man dafür einsetzen?

Darf es etwas intelligenter sein?

Wann ist eine Software flexibel oder konfigurierbar und wann schon intelligent? Diese Grenze ist teils fließend und kann zumeist auch nicht als ein Entweder-oder betrachtet werden. Selbst eine Anwendung, die auf KI basiert, kann unflexibel und wenig anpassbar sein, und dennoch als „intelligent“ gelten. Eine andere Anwendung, die z. B. modular oder in hohem Maße konfigurierbar ist, besitzt jedoch noch lange keine Intelligenz. Die Mischung aus Anpassbarkeit und Intelligenz ist das, was sowohl dem Endnutzer durch Intelligenz einen Mehrwert bringt als auch dem Entwickler durch einfache Anpassungsmaßnahmen eine flexible Anwendung ermöglicht.

Neben dem Begriff der künstlichen Intelligenz fallen aber auch immer wieder die Begriffe maschinelles Lernen, Deep Learning und neuronale Netzwerke. Hierbei muss man verstehen, dass künstliche Intelligenz einen Überbegriff für die weiteren Begriffe darstellt und schlicht Anwendungsszenarien beschreibt, in denen durch Lernprozesse bestehende Datensätze über entsprechende mathematische Algorithmen in der Lage versetzt werden, Voraussagen zu treffen. Jetzt wird auch klar, warum eine flexible Anwendung oder ein Programmablauf, dessen Parameter konfiguriert werden können, noch keine Intelligenz zugesprochen werden kann.

Künstliche Intelligenz basiert grundsätzlich auf dem Verfahren, bereits bekannte Daten zu nutzen und anhand eines definierten mathematischen Algorithmus für den geeigneten Anwendungsfall ein sogenanntes Modell zu erstellen. Dieser Vorgang wird Training genannt. Im zweiten Schritt werden ebenfalls bereits vorhandene Daten genutzt, die jedoch nicht im Training verwendet wurden, um das ermittelte Modell zu verifizieren. Erweist sich das Modell, also der gewählte Algorithmus, bei eventuell manuell festgelegten Parametern sowie bei trainierten Parametern als geeignet für den gewählten Anwendungsfall, kann es verwendet werden. Bei der Verwendung des Modells werden unbekannte Daten evaluiert und ein möglichst korrektes Ergebnis bzw. eine Vorhersage/Hypothese erwartet.

Hier wird schnell ersichtlich, dass es ein hundertprozentig sicheres Ergebnis oder eine klare Entscheidung im Gegensatz zu einem nach Regeln umgesetzten Algorithmus mit boolescher Logik nicht geben kann. Im Bereich künstlicher Intelligenz geht es immer wieder um statistische Informationen und entsprechenden Schwellwerte.

Wird nun von maschinellem Lernen gesprochen, wird genau dieser erste Anwendungsfall beschrieben. Feste mathematische Operationen und entsprechende Testdaten erzeugen ein Modell, das genutzt werden kann. Beim Training kann man zwischen dem überwachten und unüberwachten Lernen unterscheiden. Das überwachte Lernen beschreibt das Training von Datensätzen, bei denen das Ergebnis in den Testdaten bereits bekannt ist (z. B. lautet bei der Ampelfarbe Rot das Ergebnis STOP); das erfordert das entsprechende Aufbereiten der Testdaten. Das unüberwachte Lernen versucht selbstständig zu schlussfolgern, wie die Daten einzuteilen und einzuschätzen sind (z. B. haben bei der Ampelfarbe Rot Fahrzeuge im Zeitverlauf immer eine Geschwindigkeit von 0 km/h).

Neben dem maschinellen Lernen anhand fest definierter Algorithmen gibt es die Untergruppe Deep Learning bzw. neuronale Netzwerke. Hier wird ein Eingangssignal durch diverse Ebenen einer gewissen Anzahl von sogenannten künstlichen Neuronen geschleust. Jede Verbindung hat dabei eine entsprechende Gewichtung und erst ab einem gewissen Schwellwert werden die gewichteten Eingangssignale weitergegeben. Durch immer und immer wiederkehrende Durchläufe versucht ein neuronales Netzwerk diese Gewichtungen und Schwellwerte im Training selbst zu ermitteln, um das gewünschte Ergebnis zu erlernen. Bei falschen Ergebnissen bestraft sich das Netzwerk, passt seine Gewichtungen an und versucht den Trainingsvorgang erneut. Dadurch wird bei Deep Learning wesentlich mehr Rechenleistung und -energie benötigt als bei konventionellem maschinellem Lernen. Eine auf den ersten Blick sehr undurchsichtige Art des Trainings, jedoch eine sehr effektive, da damit die unterschiedlichsten Anwendungsfälle behandelt werden können.

Von der Windows-Entwicklung zur KI?

Nachdem die Begrifflichkeiten soweit geklärt wurden, stellt sich natürlich die Frage, wie man von der normalen .NET-Anwendungsentwicklung zur Entwicklung von künstlicher Intelligenz kommen kann. Immerhin ist das ein recht abstraktes, mathematisches Gebiet und war bis dato nicht mit der Entwicklung von z. B. Webservices zu vergleichen.

Im Normalfall nutzen sogenannte Data Scientists gerne Python oder C/C++ zur Entwicklung von Anwendungen im Bereich der künstlichen Intelligenz. Durch immer bessere Frameworks ist es mit wenigen Wochen Einarbeitung möglich, eigene KI-Projekte zu realisieren, ohne in die Tiefe der genutzten Algorithmen einsteigen zu müssen. Das bekannteste Framework hierfür ist sicherlich TensorFlow, das vom Google Brain Team entwickelt und als Open-Source-Projekt veröffentlicht wurde. TensorFlow basiert auf Python und C++, kann aus Python-Anwendungen heraus genutzt werden, aber bietet auch weitreichende APIs für andere Programmiersprachen.

Für .NET-Anwendungen gibt es seit wenigen Monaten ein Pendant in einer stabilen Version von Microsoft, das so genannte ML.NET-Framework.

Mit dem ML.NET-Framework ist es relativ einfach, typische Maschine-Learning-Szenarien umzusetzen. Das betrifft z. B. die Klassifikation (z. B. zu welcher Kategorie gehört die Pflanze XYZ), die Erkennung von Anomalien (z. B. plötzlicher Abfall des Energieverbrauchs) oder auch die einfache statistische Vorhersage von Daten (z. B. wie viele Artikel werde ich verkaufen). Hierfür hat Microsoft die notwendigen Komponenten abstrahiert und dem Entwickler als einfach implementierbare Bausteine zur Verfügung gestellt.

Jedes einzelne Szenario hat hier dennoch seine individuellen Eigenheiten bei der Nutzung des API. Auch das Anbinden von Datenquellen erfordert in diesem Fall einige Eigenarbeit und die entsprechende Konvertierung in für ML.NET interpretierbare Informationen. Das bedeutet das Festlegen des Datenmodells in Klassen und ggf. das Umwandeln von Informationen aus oder in die entsprechenden Datenquellen.

ML.NET versteht sich auf jeden Fall als Entwicklungs-Framework und erfüllt als solches auch wunderbar seinen Zweck. Bei der Nutzung von ML.NET muss jedoch klar sein, dass jeder Anwendungsfall die Umsetzung eines entsprechenden Softwareprojektes benötigt und das Handling der Daten prinzipiell Handarbeit bedeutet. Die Nutzung solcher Entwicklungsframeworks hat hierbei den Vorteil, relativ schnell die eigentlichen ML-Projekte umzusetzen. Jedoch baut man sich immer wieder selbst eine eigene ML-Runtime auf, die langfristig betreut werden muss. Jede Anpassung an der Struktur der Eingangsdaten oder Parameteranpassungen haben letztendlich auch eine notwendige programmatische Anpassung zur Folge.

Dieses Vorgehen ist immer geboten, wenn man sich mit den Einzelheiten eines ML-Frameworks auseinandersetzen möchte und vielleicht ein einzelnes KI-Projekt hat. Oftmals müssen jedoch mehrere Datenquellen mit unterschiedlichsten KI-Modellen betrachtet werden. Die Nutzung eines solchen ML-Frameworks macht es demnach notwendig, über kurz oder lang eigene Abstraktionen zu entwickeln oder Code doppelt vorzuhalten. Will man nicht so arbeiten, sind weiter Tools hilfreich, wie im Folgenden gezeigt wird.

KI- und ML-Projekte nicht als „Entwicklungsarbeit“ verstehen

Derzeit werden Machine-Learning-Projekte als typische Entwicklungs- (oder besser ausgedrückt: als Programmierarbeit) verstanden. Zudem besteht die Auffassung, dass KI-Projekte von Data Scientists umgesetzt werden müssen. Das mag in Spezialfällen oder komplexen Anwendungen sicherlich der Fall sein, jedoch nicht für kleinere KI-Aufgaben. Vergleichbar ist das mit der Entwicklung von grafischen Oberflächen. Selbstverständlich gibt es Spezialfälle, wie z. B. CAD-Anwendungen oder 3D-Rendering, bei denen es Entwickler benötigt, die sich mit hardwarenaher Grafikentwicklung und der Nutzung von entsprechenden Frameworks wie OpenGL oder DirectX auskennen. Jedoch trifft das nicht auf den Entwickler zu, der eine WinForms-Anwendung erstellt, oder auf einen Webdesigner, der mit HTML und CSS ebenfalls wundervolle grafische Oberflächen umsetzen kann. Es erwartet niemand, dass z. B. ein .NET-Entwickler sich mit dem gesamten GDI- und DirectX-Umfeld auskennt, um einen Dialog zu entwerfen.

Oft ist es in der Praxis jedoch so, dass entschieden wird, was mit vorliegenden Eingangsdaten geschehen soll. Also z. B., dass Daten klassifiziert werden müssen, Vorhersagen getroffen werden sollen, Anomalien entdeckt oder Objekte in Bilder erkannt werden. Der Workflow ist dabei unabhängig vom Ziel immer der Gleiche. Eingangsdaten werden mit einem Modell in Ausgangsdaten umgewandelt. Davor und danach werden die Daten vielleicht noch transformiert. Selbst bei ML-Frameworks wie TensorFlow oder ML.NET kommt der Entwickler jedoch zwangsweise mit Eigenheiten des gewählten Algorithmus und Besonderheiten im Ablauf des ML-Frameworks in Berührung. Viele Entwickler und damit auch Produkt- oder Projektverantwortliche schreckt das jedoch ab, selbst recht einfache KI-Aufgaben in ihre Produkte und Software zu integrieren.

Das ist mir besonders in den ersten KI-Projekten und in der Kommunikation innerhalb der Developercommunities aufgefallen. Letzten Endes geht es hauptsächlich um die Qualität der Eingangsdaten und des gewählten Algorithmus.

Vom Code zu Pipelines

Daher war ich auf der Suche nach einer Lösung für mich und andere Entwickler (vielleicht auch Datenbankentwickler/-Administratoren), mit der Projekte im Bereich Machine Learning einfacher angegangen werden können. Aus dieser Idee entstand das Projekt schnell.AI, das eine Open-Source Runtime inkl. entsprechender SDKs darstellt, in der modulare AI-Projekte ausgeführt werden können.

Der erste Schritt war die Vereinfachung und Abstraktion hin zu einer generisch gehaltenen Definitionsdatei (AI-Projektdatei) als JSON, in der sowohl Eingabe- und Ausgabedaten, Modelle und die einzelnen Machine-Learning-Prozesse (Training, Evaluieren, Testen) beschrieben werden können.

Jede einzelne Komponente ist in einem Modul untergebracht, das letztendlich ein separates .NET-Projekt ist und über ein Web- oder File-Repository ähnlich wie mit einem Paketmanager installiert werden kann.

Mit einem offenen SDK, das via NuGet zur Verfügung gestellt wird, können hier neben den bereits vorhandenen Providern für Datenquellen auch eigene Provider (Daten-Importer und -Exporter) geschrieben und in der AI-Projektdatei genutzt werden. Dadurch stehen nicht nur die Standardbausteine zur Verfügung, sondern sie können bei Bedarf erweitert werden.

Das gilt ebenso für die einzelnen Machine-Learning-Bausteine (Training, Testing, Evaluation). Es gibt eine Auswahl an Standardbausteinen und -algorithmen, die derzeit hauptsächlich auf ML.NET basieren. Jedoch ist es auch hier mit dem SDK möglich, Bausteine zu entwickeln und entweder vollständig eigene ML-Algorithmen zu nutzen oder sie als Abstraktionsschicht für ein anderes ML-Framework (wie z. B. TensorFlow oder Cloud AI von Google) zu nutzen.

schnell.AI ist als KI-Runtime zu verstehen, die die grundsätzlichen Abläufe abstrahiert und nicht an ein bestimmtes ML-Framework gebunden ist. Durch das Design der Runtime als Kommandozeilenapplikation, ist es möglich, auch Einsteiger oder Nichtentwickler an das Thema ML und AI heranzuführen. Zusätzlich ermöglicht es ein einfaches Scripting und die Automatisierung von ML-Prozessen, was die Integration in bestehende Projektlandschaften besonders einfach macht.

Alle in einer Projektdatei definierten Bausteine können ganz einfach über definierbare Pipelines beliebig kombiniert werden. Somit können über unterschiedliche Pipelines und Variablen unterschiedliche Fälle oder Umgebungen abgehandelt werden. Was bei einer solchen Änderung in einem wie üblich (z. B. als Python oder .NET-Projekt) programmierten AI-Projekt zu einer Programmanpassung, Debugging und Neuauslieferung geführt hätte, kann hier über das Editieren der Projektdatei relativ einfach umgesetzt werden.

Die Runtime kann einfach über die Webseite des Projekts heruntergeladen werden. Hierfür stehen sowohl für Windows als auch für Linux (als Betaversion) entsprechende Skripte zur Verfügung.

Nach der Installation kann schnell.AI über die Kommandozeile bedient werden. Hierfür kann einfach der Befehl schnell.ai eingegeben werden. Daraufhin wird die aktuell installierte Version dargestellt. Für weitere Informationen und Hilfe steht der Befehl schnell.ai -? zur Verfügung, der die verfügbaren Aktionen auf einfache Weise auflistet.

Ein Projekt beginnen

Mit dem Kommandozeilentool kann recht komfortabel ein neues Projekt begonnen werden. Dazu wird in das gewünschte Zielverzeichnis des Projekts gewechselt und folgender Befehl eingegeben:

schnell.ai project-mk

Nachfolgend werden alle verfügbaren Templates aufgelistet, aus denen eins ausgewählt werden kann. Daraufhin wird das entsprechende Template heruntergeladen und in das Zielverzeichnis geladen.

Die Projektdatei

Zentraler Baustein des Projekts ist die Datei ai.project.json (Abb. 1). In dieser Datei wird wie zuvor erwähnt das gesamte Projekt definiert. Dazu zählen die referenzierten Module, die die einzelnen .NET-basierten Komponenten darstellen. Ebenso die Artefakte, die sowohl Eingangs- als auch Ausgangsdaten inklusive der Datenquellen und -ziele beschreiben. Hierunter fallen auch Modelle als Dateireferenzen, die z. B. trainiert oder genutzt werden können. Ebenfalls werden die einzelnen Schritte, wie z. B. das Training, Transformieren, Testen und Evaluieren in der Datei festgehalten. Zuletzt sind alle einzelnen Pipelines inkl. der einzelnen Schritte definiert. Die Vorlagen und Beispiele, die unter GitHub gehostet sind, helfen hier, möglichst einfach neue Projekte umzusetzen.

Abb. 1: Projektdatei in Visual Studio Code

Abb. 1: Projektdatei in Visual Studio Code

Durch die Definition des gesamten KI-Projekts als JSON-Datei ist es auch für Nichtentwickler relativ einfach, möglich Anpassungen an dem Projekt vorzunehmen, ohne Detailkenntnisse über maschinelles Lernen und seine Eigenheiten besitzen zu müssen.

Weitere Informationen über den Aufbau der Projektdatei, findet man in der Anwendungsdokumentation.

Die KI zum Leben erwecken

Ist die Projektdatei und damit alle benötigten Bausteine entsprechend der eigenen Anforderungen definiert, kann sie in der schnell.AI Runtime ausgeführt werden. Das geschieht ebenfalls über das Kommandozeileninterface. Es können einzelne Aktionen oder Pipelines ausgeführt werden. Für das Ausführen einer Pipeline wird folgender Befehl angewendet:

schnell.ai run -pipeline myPipeline1

Nun werden alle Module geladen und die jeweiligen Schritte ausgeführt. Sobald die Schritte durchgeführt wurden, wird die Runtime beendet.

Weiterhin ist es möglich, über in der Projektdatei definierbare Variablen unterschiedliche Fälle, Eingangsdaten, etc. zu nutzen, um hier eine möglichst hohe Variabilität zu gewährleisten und möglichst viele Anwendungsbereiche abdecken zu können. Das Kommandozeileninterface ist dabei das zentrale Tool, um diese Projekte immer einfach in einem Workflow zu integrieren oder zu automatisieren.

Fazit

Die Hemmschwelle, ein KI-Projekt zu beginnen, ist selbst für erfahrene Entwickler oft recht hoch. Viele Unbekannte und Details gilt es hier zu beachten. Zusätzlich steht man auch noch vor der Wahl des richtigen Frameworks. Mit einer Abstraktion, wie hier mit schnell.AI, können sowohl unterschiedliche Frameworks für unterschiedliche Anwendungsszenarien genutzt als auch eine vereinfachte Sicht auf die Dinge geschaffen werden. Das ermöglicht es unter anderem, auch Nichtentwicklern oder Einsteigern eine relativ niedrige Hürde zu bieten.

Nur mit einer breiten Nutzerbasis und möglichst einfachen Tools wird der Mythos künstliche Intelligenz etwas aufgelöst und kann so einen echten Nutzwert für alle haben.

Windows Developer

Windows DeveloperDieser Artikel ist im Windows Developer erschienen. Windows Developer informiert umfassend und herstellerneutral über neue Trends und Möglichkeiten der Software- und Systementwicklung rund um Microsoft-Technologien.

Natürlich können Sie den Windows Developer über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. Außerdem ist der Windows Developer weiterhin als Print-Magazin im Abonnement erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu:
X
- Gib Deinen Standort ein -
- or -