Hoe u uw eigen neurale netwerk helemaal opnieuw kunt maken in Python. Neurale netwerken: wat zijn ze en hoe merken ze gebruiken

De juiste formulering van de vraag zou moeten zijn: hoe train je je eigen neurale netwerk? U hoeft zelf geen netwerk te schrijven, u moet enkele kant-en-klare implementaties nemen, waarvan er veel zijn, eerdere auteurs gaven links. Maar op zichzelf is deze implementatie als een computer waarop geen programma's zijn gedownload. Om ervoor te zorgen dat het netwerk uw probleem oplost, moet het worden aangeleerd.

En hier komt het belangrijkste dat je hiervoor nodig hebt: DATA. Er zijn veel voorbeelden van taken die naar de input van een neuraal netwerk worden gestuurd, en de juiste antwoorden op deze taken. Het neurale netwerk zal hier vanzelf van leren om deze juiste antwoorden te geven.

En hier ontstaan ​​een heleboel details en nuances die bekend en begrepen moeten worden, zodat dit alles een kans heeft om een ​​acceptabel resultaat te geven. Het is onrealistisch om ze hier allemaal te behandelen, dus ik zal slechts enkele punten opsommen. Ten eerste de hoeveelheid data. Dit is een heel belangrijk punt. Grote bedrijven, waarvan de activiteiten gerelateerd zijn aan machine learning, hebben meestal speciale afdelingen en medewerkers die zich alleen bezighouden met het verzamelen en verwerken van gegevens voor het trainen van neurale netwerken. Vaak moeten er gegevens worden gekocht en al deze activiteit vertaalt zich in een aanzienlijke uitgave. Ten tweede de presentatie van de gegevens. Als elk object in je probleem wordt vertegenwoordigd door een relatief klein aantal numerieke parameters, dan is er een kans dat ze in zo'n ruwe vorm aan een neuraal netwerk kunnen worden gegeven en kan een acceptabel resultaat worden verkregen aan de output. Maar als de objecten complex zijn (afbeeldingen, geluid, objecten met variabele afmetingen), dan zult u hoogstwaarschijnlijk tijd en moeite moeten steken om de kenmerken te isoleren die van belang zijn voor het probleem dat wordt opgelost. Dit alleen al kan erg lang duren en een veel grotere impact hebben op het eindresultaat dan zelfs het type en de architectuur van het neurale netwerk dat voor gebruik is gekozen.

Er zijn vaak gevallen waarin echte gegevens te ruw en onbruikbaar zijn zonder voorafgaande verwerking: ze bevatten hiaten, ruis, inconsistenties en fouten.

Gegevens moeten ook niet zomaar, maar vakkundig en doordacht worden verzameld. Anders kan het getrainde netwerk zich vreemd gedragen en zelfs een heel ander probleem oplossen dan de auteur bedoelde.

Je moet je ook voorstellen hoe je het leerproces correct organiseert, zodat het netwerk niet overtraind blijkt te zijn. De complexiteit van het netwerk moet worden gekozen op basis van de dimensie van de gegevens en hun hoeveelheid. Sommige gegevens moeten voor de test apart worden gehouden en niet tijdens de training worden gebruikt om de werkelijke kwaliteit van het werk te beoordelen. Soms moeten verschillende objecten uit de trainingsset verschillende gewichten krijgen. Soms is het handig om deze gewichten tijdens de training te variëren. Het is soms handig om te beginnen met trainen op een stukje data en de rest van de data toe te voegen terwijl je traint. Over het algemeen kan dit worden vergeleken met koken: elke huisvrouw heeft haar eigen methoden om zelfs dezelfde gerechten te koken.

Ik heb lange tijd kennis gemaakt met neurale netwerken. Mijn houding ten opzichte van hen als middel om toegepaste problemen op te lossen is nogal tegenstrijdig. Enerzijds kon ik geen enkel probleem oplossen waarvoor ik de netwerken met een bevredigend resultaat gebruikte (maar het moet worden opgemerkt dat de taken super ingewikkeld waren), en aan de andere kant was ik in staat om de kracht voldoende in te schatten van het analytische potentieel van neurale netwerken en hun vermogen om schattingen en voorspellingen te doen op een grote verscheidenheid aan sets.

Omdat mijn interesse in netwerken de afgelopen jaren periodiek ontstond, ontstond het idee om processing te schrijven voor het bouwen en trainen van een neuraal netwerk, zoals ze zeggen. Het idee werd echter pas in de laatste paar (eerlijk gezegd, ik weet niet eens meer hoeveel) maanden gerealiseerd. De strijd voor jezelf is in de eerste plaats een strijd met jezelf, of liever, met je eigen luiheid en onwetendheid. En deze ronde bleef me bij :) Omdat ik het in de eerste plaats voor mezelf deed - verspreid ik wat ik heb gekregen, helemaal voor niets.

Wat is deze ontwikkeling? Ik zal de belangrijkste kenmerken en functionaliteit opsommen. Tegelijkertijd houden we er rekening mee en onthouden dat het alleen wordt geïmplementeerd op beheerde formulieren.

1. Projectdashboard ... In mijn termen, onderopdrachtwordt opgevat als het geheel van het neurale netwerk zelf, de initiële gegevens voor training, de instellingen van de trainingsparameters en het opslaan van de resultaten. Met het projectconfiguratiescherm kunt u de componenten van de taak bewerken (behalve het neurale netwerk), het trainingsproces beheren en de resultaten van het trainen van het netwerk volgen. Er zijn ook opties voor het opslaan en laden van taken en kant-en-klare netwerken. Afzonderlijk merk ik de aanwezigheid op van de optie om de resultaten op te slaan. Als het project een geladen / gemaakt netwerk heeft en een reeks initiële gegevens wordt geladen, worden de netwerkparameters berekend en worden de resultaten gedownload naar een extern bestand (een tabel met waarden of een Excel-werkmap). Op dezelfde manier kunt u de resultaten achterhalen die door het netwerk worden geretourneerd voor elke set interactief ingevoerde argumenten.

2. Neurale netwerkeditor (meerlaags percepton). Biedt de mogelijkheid om een ​​neuraal netwerk te maken en te bewerken. Visueel wordt het netwerk weergegeven als een structuur van gekleurde ballen. De groene ballen zijn de invoerkernen, de rode zijn de uitvoerkernen en de gele zijn de kernen van de binnenste lagen. Het is mogelijk om het aantal lagen en kernen daarin in te stellen. Voor belaste taken en netwerken, evenals in het geval dat er al gegevens zijn geladen voor het trainen van het project, wordt het aantal input- en outputcores gelijk gesteld aan het aantal bestaande argumenten en resultaten. Wanneer u op de knop "Netwerk opslaan" klikt, wordt het netwerk opgeslagen in de verwerkingsparameters en worden de initiële gewichten van de randen willekeurig geïnitialiseerd. Dat wil zeggen, zelfs als we de structuur van het netwerk niet hebben gewijzigd, kan het worden gewist uit de resultaten van de vorige training door het opnieuw op te slaan in de editor.

3. Subsysteem voor het analyseren van de voortgang van het leren ... Het subsysteem is heel eenvoudig en is een grafiek die de voortgang van netwerktraining in een bepaald project laat zien. De stap van het verzamelen van statistieken en het totale aantal trainingsstappen worden geconfigureerd in het "Project Control Panel". Statistieken kunnen tijdens de training niet in realtime worden bekeken. Het is evenzeer een integraal onderdeel van het project als de netwerk- en trainingsdatasets en zal na voltooiing van de training worden bijgewerkt en vastgelegd in het project, samen met de nieuwe netwerkparameters. Dienovereenkomstig, als in het geladen project tijdens de vorige training de statistiekoptie was ingeschakeld, is het bekijken van de benaderingsfoutgrafieken direct na het laden van de taak (project) beschikbaar.

4. Verwerkingsmodule ... Ik scheid de verwerkingsmodule ook in een apart subsysteem vanwege de aanwezigheid van exportfuncties en procedures waarmee trainingsnetwerken kunnen worden getraind en rekenresultaten van het netwerk kunnen worden ontvangen met behulp van externe oproepen. Eigenlijk zijn deze functies voor mij het belangrijkste in ontwikkeling. Het projectspecificatiebestand is bijgevoegd en elk project dat op enigerlei wijze in overeenstemming met deze specificatie is gemaakt, kan worden getraind en het gewenste resultaat kan worden verkregen uit het netwerk dat is gemaakt in overeenstemming met de specificatie. Maar aangezien het creëren, bewerken en trainen van netwerken in de praktijk een nogal moeizaam en creatief proces is, zijn visuele editors en een controlepaneel een vrij logische stap om de kwaliteit van het werk te vereenvoudigen en te verbeteren. Maar ik herhaal het nog een keer - in theorie zou het mogelijk zijn om zonder hen te doen, omdat de verwerkingsmodule volledig voldoende functionaliteit biedt om met kant-en-klare taken en netwerken te werken. De rest van de subsystemen zijn slechts mijn versie van het keukenontwerp voor hun voorbereiding.

Nu zal ik je iets vertellen over de netwerkparameters en het leerproces.

Onder de menigte activeringsfuncties van neuronenvoor dit project heb ik gekozen voor de logistieke Fermi sigmoid. De meest populaire functie in neurale netwerken en (als je begrijpt wat de essentie van leren is) is heel gemakkelijk te differentiëren.

Algoritme leren- terugverspreiding van de fout. Voor details, indien geïnteresseerd, ga naar Google.

Leersnelheid - aangepaste. Op het stratum wordt de in de parameters gespecificeerde waarde genomen, maar tijdens de training kan de leersnelheid veranderen. Het principe van snelheidsmodificatie is dat in het geval dat de richting van de gradiënt voor de netwerkrand niet verandert tussen de leerstappen, de leersnelheid wordt vermenigvuldigd met de coëfficiënt K> 1, en in het geval van een verandering in het teken van de gradiënt wordt de factor K<1. Таким образом, норма обучения хотя и остается важнейшим параметром обучения, но ее неправильный выбор может быть в значительной степени скорректирован модификаторами.

Trainingsvoorbeeld... Alle gegevens die als argumenten en resultaten worden doorgegeven, worden vóór de training willekeurig verdeeld in 3 delen (Training, Test en Verificatie) in een verhouding van 7: 2: 1. Bovendien is deze random elke keer anders en worden de gegevens voor elke trainingscyclus verdeeld. Als resultaat zie je een beeld dat bij het starten van de tweede (derde, enz.) trainingscyclus van hetzelfde project, de benaderingsfouten sterk kunnen dalen of springen bij de eerste stappen. Dit is niet omdat het verkeerde netwerk is genomen - alleen een nieuwe willekeurige steekproef en nieuwe foutwaarden.

Wat zijn deze monsters? De trainingsruimte is begrijpelijk. Test - neemt niet direct deel aan training, maar de fout is zichtbaar in het proces. Afgaand op de waarde van de trainingsfout, of beter gezegd, door de dynamiek ervan te zien in vergelijking met de trainingsfout, kan men beoordelen of het netwerk overtraind is (fouten lopen uiteen) en, in het algemeen, hoe adequaat het netwerkmodel is geconstrueerd voor de gegevens .

Het verificatievoorbeeld is pas aan het einde van de training zichtbaar voor de gebruiker. Omdat we in het leerproces de steekproef kunnen volgen, is het ook indirect een leerobject. In dit geval is verificatie de laatste en meest onbevooroordeelde beoordelaar van de kwaliteit van het resulterende netwerk.

Een klassiek voorbeeld van een opnieuw getraind netwerk is wanneer de trainings- en testfouten eerst afnemen, dan divergeren, en de testfout oneindig toeneemt. Het netwerk is er misschien in geslaagd om de hele trainingssteekproef te "memoriseren" en past zich nu niet aan de generaliserende kenmerken van de hele steekproef aan, maar "polijst" alleen de trainingsgegevens. Dit gebeurt in de regel wanneer het initiële monster te klein of te uniform is en/of het aantal binnenlagen en neuronen te groot is.

Nu over de manieren om het leerproces te starten vanuit het verwerkingsformulier. Er zijn er maar 3:

1. Normale start van het proces. We beginnen met trainen in de huidige sessie en wachten op het einde. Omdat er tot het einde van de serveroproep niets kan worden teruggestuurd naar de klant - we wachten en hopen dat alles in orde komt.

2. Doorloop een achtergrondtaak van externe verwerking. Ik denk dat hier alles min of meer duidelijk is. Uiteraard dient de verwerking geregistreerd te zijn in de directory van aanvullende rapportages en verwerkingen en dient de configuratie een BSP-versie te bevatten die niet lager is dan 1.2.1.4. In dit geval werkt alles prima voor mij.

3. Voer de configuratieverwerking uit via een achtergrondtaak. Dit is als u de verwerking zo leuk vindt dat u deze regelmatig gaat gebruiken en in de configuratie inbouwt. Hier is het natuurlijk mogelijk om aan te bevelen dat u het starten van de achtergrondtaak voltooit, maar u kunt het ook via de BSP proberen. Dat is gewoon de versie die zou moeten zijn, ik weet niet eens welke, maar behoorlijk fris.

De opties met de start in de achtergrondtaak zijn het handigst en informatiefst, aangezien u nog steeds iets op het formulier kunt doen en de informatie tijdens de training periodiek wordt bijgewerkt door berichten van de achtergrondtaak te ontvangen en te verwerken.

Ik zal ook een paar woorden zeggen over de pre-trainingsoptie. Ik zal geen link geven naar een slim artikel, waarin wordt bewezen dat een voorlopige selectie van de gewichten van neurale synapsen een significante toename van de kwaliteit en een vermindering van de trainingstijd van het netwerk geeft. Ik kan alleen maar zeggen dat ik de gerespecteerde kandidaten van de wetenschap op hun woord geloofde. Ik schreef een blok voor voorlopige selectie en evaluatie van initiële gewichten en ... Ik merkte geen significante vooruitgang. Hier gaan de ski's niet of niet alles is zoals nodig bij mij, maar ik heb de optie behouden. U kunt het gebruiken voordat u begint met het leren van een nieuw netwerk, of u kunt het niet gebruiken.

Wat zit er in het bijgevoegde archief? Beschrijving van de samenstelling van het netwerkproject (specificatie) voor zelfontwikkelingsprojecten ( MS Word ), project- en netwerkdemobestanden, evenals een set van 2 demogegevensbestanden. Gegevens zijn tabellen met waarden met sets van argumenten en resultaten.

De verwerking is vastgelegd in een apart bestand voor het gemak van bijwerken en vervangen door nieuwe versies. Het belangrijkste onderdeel van de aanvullende materialen is dat de specificatie van het netwerkontwerp is opgenomen in de verwerkingshulp, dus in principe kunt u alleen de verwerking zelf downloaden om $ te besparen m ... In dit geval ontvangt u de functionaliteit en documentatie volledig.

Hierop, denk ik, is het de moeite waard om te beëindigen. De tekst is al een beetje te veel. Natuurlijk zult u tijdens het gebruik van verwerking op specifieke gegevens en echte voorbeelden veel vragen en opmerkingen hebben. De belangrijkste antwoorden en tips worden hierboven gegeven - dat wil zeggen, we lezen eerst de beschrijving aandachtig. Er is ook hulp in het hoofdverwerkingsformulier. Je kunt het ook lezen. Welnu, voor al het andere dat niet is beschreven of niet duidelijk is - opmerkingen.

Dienovereenkomstig neemt het neurale netwerk twee getallen als invoer en moet het een ander getal aan de uitgang geven - het antwoord. Nu over de neurale netwerken zelf.

Wat is een neuraal netwerk?


Een neuraal netwerk is een opeenvolging van neuronen die verbonden zijn door synapsen. De structuur van het neurale netwerk kwam rechtstreeks uit de biologie naar de programmeerwereld. Dankzij deze structuur verwerft de machine de mogelijkheid om verschillende informatie te analyseren en zelfs te onthouden. Neurale netwerken zijn ook in staat om niet alleen binnenkomende informatie te analyseren, maar ook om deze uit hun geheugen te reproduceren. Voor geïnteresseerden, bekijk zeker 2 video's van TED Talks: Video 1 , Video 2). Met andere woorden, een neuraal netwerk is een machinale interpretatie van het menselijk brein, dat miljoenen neuronen bevat die informatie doorgeven in de vorm van elektrische impulsen.

Wat zijn neurale netwerken?

Voor nu zullen we voorbeelden bekijken van het meest elementaire type neurale netwerken - dit is een feedforward-netwerk (hierna FNS genoemd). Ook in volgende artikelen zal ik meer concepten introduceren en vertellen over terugkerende neurale netwerken. DSS is, zoals de naam al aangeeft, een netwerk met een seriële verbinding van neurale lagen, waarin informatie altijd maar in één richting gaat.

Waar zijn neurale netwerken voor?

Neurale netwerken worden gebruikt om complexe problemen op te lossen die analytische berekeningen vereisen die vergelijkbaar zijn met die van het menselijk brein. De meest voorkomende toepassingen voor neurale netwerken zijn:

Classificatie- gegevensverdeling per parameters. Er wordt bijvoorbeeld een groep mensen bij de ingang gegeven en het is noodzakelijk om te beslissen wie van hen een lening geeft en wie niet. Dit werk kan worden gedaan door een neuraal netwerk dat informatie zoals leeftijd, solvabiliteit, kredietgeschiedenis, enz. analyseert.

Voorspelling- het vermogen om de volgende stap te voorspellen. Bijvoorbeeld de stijging of daling van een aandeel op basis van de situatie op de aandelenmarkt.

Herkenning- momenteel het meest wijdverbreide gebruik van neurale netwerken. Gebruikt op Google wanneer u op zoek bent naar een foto of in telefooncamera's wanneer het de positie van uw gezicht detecteert en het opvalt en nog veel meer.

Laten we nu, om te begrijpen hoe neurale netwerken werken, eens kijken naar de componenten en hun parameters.

Wat is een neuron?


Een neuron is een rekeneenheid die informatie ontvangt, er eenvoudige berekeningen op uitvoert en deze verder doorstuurt. Ze zijn onderverdeeld in drie hoofdtypen: ingang (blauw), verborgen (rood) en uitgang (groen). Er is ook een bias-neuron en een context-neuron, waar we het in het volgende artikel over zullen hebben. In het geval dat een neuraal netwerk uit een groot aantal neuronen bestaat, wordt de term laag geïntroduceerd. Dienovereenkomstig is er een invoerlaag die informatie ontvangt, n verborgen lagen (meestal niet meer dan 3) die deze verwerken en een uitvoerlaag die het resultaat uitvoert. Elk van de neuronen heeft 2 hoofdparameters: invoergegevens en uitvoergegevens. In het geval van een inputneuron: input = output. In de rest komt de totale informatie van alle neuronen uit de vorige laag in het invoerveld, waarna het wordt genormaliseerd met behulp van de activeringsfunctie (voor nu, representeer het gewoon f (x)) en komt in het uitvoerveld.


Belangrijk om te onthouden dat neuronen werken met getallen in het bereik of [-1,1]. Maar wat, vraag je, dan omgaan met getallen die buiten dit bereik vallen? In dit stadium is het eenvoudigste antwoord om 1 te delen door dat getal. Dit proces wordt normalisatie genoemd en wordt heel vaak gebruikt in neurale netwerken. Hierover later meer.

Wat is een synaps?


Een synaps is een verbinding tussen twee neuronen. Synapsen hebben 1 parameter - gewicht. Dankzij hem verandert de invoerinformatie wanneer deze van het ene neuron naar het andere wordt verzonden. Laten we zeggen dat er 3 neuronen zijn die informatie doorgeven aan de volgende. Dan hebben we 3 gewichten die overeenkomen met elk van deze neuronen. Voor het neuron met het grootste gewicht zal die informatie dominant zijn in het volgende neuron (bijvoorbeeld kleurmenging). In feite is de set gewichten van een neuraal netwerk of een matrix van gewichten een soort brein van het hele systeem. Dankzij deze gewichten wordt de ingevoerde informatie verwerkt en omgezet in een resultaat.

Belangrijk om te onthouden dat tijdens de initialisatie van het neurale netwerk de gewichten willekeurig worden toegewezen.

Hoe werkt een neuraal netwerk?


In dit voorbeeld is een deel van een neuraal netwerk afgebeeld, waarbij de letters I de inputneuronen aanduiden, de letter H de verborgen neuron en de letter w de gewichten. Uit de formule blijkt dat de invoerinformatie de som is van alle invoergegevens vermenigvuldigd met de bijbehorende gewichten. Dan geven we de invoer 1 en 0. Zij w1 = 0,4 en w2 = 0,7 De invoergegevens van het neuron H1 zullen als volgt zijn: 1 * 0,4 + 0 * 0,7 = 0,4. Nu we de invoer hebben, kunnen we de uitvoer krijgen door de invoerwaarde te vervangen door de activeringsfunctie (daarover later meer). Nu we de output hebben, geven we deze door. En dus herhalen we voor alle lagen totdat we bij het uitgangsneuron komen. Nadat we voor het eerst zo'n netwerk hebben gelanceerd, zullen we zien dat het antwoord verre van correct is, omdat het netwerk niet is getraind. We gaan haar trainen om haar resultaten te verbeteren. Maar voordat we leren hoe we dit moeten doen, laten we eerst een paar termen en eigenschappen van een neuraal netwerk introduceren.

Activeringsfunctie:

Een activeringsfunctie is een manier om invoergegevens te normaliseren (we hebben hier eerder over gesproken). Dat wil zeggen, als u een groot aantal bij de ingang hebt, nadat u het door de activeringsfunctie hebt geleid, krijgt u een uitgang in het bereik dat u nodig hebt. Er zijn veel activeringsfuncties, dus we zullen de meest elementaire functies beschouwen: lineair, sigmoid (logistiek) en hyperbolische tangens. Hun belangrijkste verschil is het bereik van waarden.

Lineaire functie


Deze functie wordt bijna nooit gebruikt, behalve wanneer u een neuraal netwerk moet testen of een waarde moet overdragen zonder transformaties.

sigmoïde


Dit is de meest voorkomende activeringsfunctie en het bijbehorende waardenbereik. Hierop worden de meeste voorbeelden op het web getoond, het wordt ook wel de logistieke functie genoemd. Dienovereenkomstig, als er in uw geval negatieve waarden zijn (aandelen kunnen bijvoorbeeld niet alleen stijgen, maar ook dalen), dan heeft u een functie nodig die ook negatieve waarden vastlegt.

hyperbolische tangens


Het is logisch om de hyperbolische tangens alleen te gebruiken wanneer uw waarden zowel negatief als positief kunnen zijn, aangezien het bereik van de functie [-1,1] is. Het is ongepast om deze functie alleen met positieve waarden te gebruiken, omdat dit de resultaten van uw neurale netwerk aanzienlijk zal verslechteren.

Trainingsset

Een trainingsset is een reeks gegevens waarop een neuraal netwerk werkt. In ons geval, de exclusieve of (xor) hebben we slechts 4 verschillende uitkomsten, dat wil zeggen dat we 4 trainingssets hebben: 0xor0 = 0, 0xor1 = 1, 1xor0 = 1.1xor1 = 0.

iteratie

Dit is een soort teller die elke keer dat het neurale netwerk één trainingsset doorloopt, hoger wordt. Met andere woorden, dit is het totale aantal trainingssets dat door het neurale netwerk wordt doorlopen.

Tijdperk

Bij het initialiseren van het neurale netwerk wordt deze waarde op 0 gezet en is er een handmatig ingesteld plafond. Hoe groter het tijdperk, hoe beter het netwerk is getraind en dus ook het resultaat. Het tijdperk neemt toe elke keer dat we de hele set trainingssets doorlopen, in ons geval 4 sets of 4 iteraties.


Belangrijk verwar iteratie niet met tijdperk en begrijp de volgorde van hun toename. Eerste n
zodra de iteratie toeneemt, en dan het tijdperk en niet omgekeerd. Met andere woorden, je kunt een neuraal netwerk niet eerst op de ene set trainen, dan op een andere, enz. Je moet elke set één keer per tijdperk trainen. Zo voorkom je fouten in berekeningen.

Fout

Fout is een percentage dat de discrepantie aangeeft tussen verwachte en ontvangen reacties. De fout wordt elk tijdperk gevormd en zou moeten afnemen. Gebeurt dit niet, dan doe je iets niet goed. De fout kan op verschillende manieren worden berekend, maar we zullen slechts drie hoofdmanieren beschouwen: Mean Squared Error (hierna MSE), Root MSE en Arctan. Er is geen beperking op het gebruik zoals in de activeringsfunctie, en u bent vrij om te kiezen welke methode u de beste resultaten geeft. Men hoeft er alleen rekening mee te houden dat elke methode fouten op verschillende manieren telt. In Arctan zal de fout bijna altijd groter zijn, omdat het werkt volgens het principe: hoe groter het verschil, hoe groter de fout. Root MSE zal de kleinste fout hebben, daarom wordt meestal MSE gebruikt, wat een balans houdt in de foutberekening.


Kunstmatige intelligentie, neurale netwerken, machine learning - wat betekenen al deze populaire concepten eigenlijk? Voor de meeste niet-ingewijden, die ik zelf ben, leken ze altijd iets fantastisch, maar in feite ligt hun essentie aan de oppervlakte. Ik had al heel lang het idee om in eenvoudige taal te schrijven over kunstmatige neurale netwerken. Leer voor jezelf en vertel anderen wat deze technologie is, hoe het werkt, overweeg de geschiedenis en vooruitzichten. In dit artikel probeerde ik niet in de jungle te komen, maar eenvoudig en in de volksmond te vertellen over deze veelbelovende richting in de wereld van geavanceerde technologieën.


Kunstmatige intelligentie, neurale netwerken, machine learning - wat betekenen al deze populaire concepten eigenlijk? Voor de meeste niet-ingewijden, wat ik zelf ben, leken ze altijd iets fantastisch, maar in feite ligt hun essentie aan de oppervlakte. Ik had al heel lang het idee om in eenvoudige taal te schrijven over kunstmatige neurale netwerken. Leer voor jezelf en vertel anderen wat deze technologie is, hoe het werkt, overweeg de geschiedenis en vooruitzichten. In dit artikel probeerde ik niet in de jungle te komen, maar eenvoudig en in de volksmond te vertellen over deze veelbelovende richting in de wereld van geavanceerde technologieën.

Een beetje geschiedenis

Voor het eerst ontstond het concept van kunstmatige neurale netwerken (ANN) toen men probeerde de processen van de hersenen te simuleren. De eerste grote doorbraak op dit gebied kan worden beschouwd als de oprichting van het McCulloch-Pitts neurale netwerkmodel in 1943. Wetenschappers ontwikkelden eerst een model van een kunstmatig neuron. Ze stelden ook de constructie voor van een netwerk van deze elementen om logische bewerkingen uit te voeren. Maar het belangrijkste is dat wetenschappers hebben bewezen dat zo'n netwerk in staat is om te leren.

De volgende belangrijke stap was de ontwikkeling door Donald Hebb van het eerste algoritme voor het berekenen van ANN in 1949, dat de komende decennia fundamenteel werd. In 1958 ontwikkelde Frank Rosenblatt de parceptron, een systeem dat de processen van de hersenen nabootst. Ooit had de technologie geen analogen en is nog steeds fundamenteel in neurale netwerken. In 1986, praktisch gelijktijdig, onafhankelijk van elkaar, verbeterden Amerikaanse en Sovjet-wetenschappers de fundamentele methode voor het aanleren van het meerlagige perceptron aanzienlijk. In 2007 ondergingen neurale netwerken een wedergeboorte. De Britse computerwetenschapper Jeffrey Hinton was de pionier van een deep learning-algoritme voor meerlaagse neurale netwerken, dat nu bijvoorbeeld wordt gebruikt om zelfrijdende auto's te besturen.

Kort over de hoofdzaak

In de algemene zin van het woord zijn neurale netwerken wiskundige modellen die werken volgens het principe van netwerken van zenuwcellen in een dierlijk organisme. ANN's kunnen worden geïmplementeerd in zowel programmeerbare als hardwarematige oplossingen. Om de waarneming te vergemakkelijken, kan een neuron worden voorgesteld als een bepaalde cel, die veel ingangsgaten en één uitgangsgat heeft. Hoeveel inkomende signalen worden omgezet in uitgaande, bepaalt het berekeningsalgoritme. Effectieve waarden worden geleverd aan elke ingang van een neuron, die vervolgens worden gepropageerd langs interneuronale verbindingen (synopsis). Synapsen hebben één parameter - gewicht, waardoor de invoerinformatie verandert bij het verplaatsen van het ene neuron naar het andere. De eenvoudigste manier om je voor te stellen hoe neurale netwerken werken, kan worden weergegeven door het voorbeeld van kleurmenging. De blauwe, groene en rode neuronen hebben verschillende gewichten. De informatie van dat neuron, waarvan het gewicht dominanter zal zijn in het volgende neuron.

Het neurale netwerk zelf is een systeem van veel van dergelijke neuronen (processors). Individueel zijn deze processors vrij eenvoudig (veel eenvoudiger dan een pc-processor), maar wanneer ze zijn aangesloten op een groot systeem, zijn neuronen in staat om zeer complexe taken uit te voeren.

Afhankelijk van het toepassingsgebied kan een neuraal netwerk op verschillende manieren geïnterpreteerd worden. Vanuit het oogpunt van machine learning is een ANN bijvoorbeeld een patroonherkenningsmethode. Vanuit wiskundig oogpunt is dit een probleem met meerdere parameters. Vanuit het oogpunt van cybernetica is het een model van adaptieve besturing van robotica. Voor kunstmatige intelligentie is ANN een fundamenteel onderdeel voor het modelleren van natuurlijke intelligentie met behulp van computationele algoritmen.

Het belangrijkste voordeel van neurale netwerken ten opzichte van conventionele rekenalgoritmen is hun leervermogen. In de algemene zin van het woord bestaat leren uit het vinden van de juiste koppelingscoëfficiënten tussen neuronen, het generaliseren van gegevens en het identificeren van complexe afhankelijkheden tussen ingangs- en uitgangssignalen. In feite betekent een succesvolle training van een neuraal netwerk dat het systeem het juiste resultaat kan identificeren op basis van gegevens die niet aanwezig zijn in de trainingsset.

Situatie van vandaag

En hoe veelbelovend deze technologie ook zou zijn, tot dusver zijn ANN's nog ver verwijderd van de mogelijkheden van het menselijk brein en denken. Desalniettemin worden neurale netwerken al op veel gebieden van menselijke activiteit gebruikt. Tot nu toe zijn ze niet in staat om zeer intellectuele beslissingen te nemen, maar ze zijn in staat om iemand te vervangen waar hij eerder nodig was. Onder de talrijke toepassingsgebieden van ANN's kan men opmerken: het creëren van zelflerende systemen van productieprocessen, onbemande voertuigen, beeldherkenningssystemen, intelligente beveiligingssystemen, robotica, kwaliteitsbewakingssystemen, spraakinteractie-interfaces, analysesystemen en nog veel meer . Een dergelijk wijdverbreid gebruik van neurale netwerken is onder meer te danken aan de opkomst van verschillende manieren om ANN-leren te versnellen.

Tegenwoordig is de markt voor neurale netwerken enorm - het is miljarden en miljarden dollars. Zoals de praktijk laat zien, verschillen de meeste technologieën van neurale netwerken over de hele wereld weinig van elkaar. Het gebruik van neurale netwerken is echter een zeer kostbare aangelegenheid, die zich in de meeste gevallen alleen door grote bedrijven kan veroorloven. Voor het ontwikkelen, trainen en testen van neurale netwerken is grote rekenkracht nodig, het is duidelijk dat grote spelers in de IT-markt daar genoeg van hebben. Tot de belangrijkste bedrijven die de ontwikkeling op dit gebied leiden, behoren Google DeepMind, Microsoft Research, IBM, Facebook en Baidu.

Natuurlijk is dit allemaal goed: neurale netwerken ontwikkelen zich, de markt groeit, maar tot nu toe is de hoofdtaak niet opgelost. De mensheid is er niet in geslaagd een technologie te creëren die zelfs maar in de buurt komt van de mogelijkheden van het menselijk brein. Laten we eens kijken naar de belangrijkste verschillen tussen het menselijk brein en kunstmatige neurale netwerken.

Waarom zijn neurale netwerken nog ver verwijderd van het menselijk brein?

Het belangrijkste verschil dat het principe en de efficiëntie van het systeem fundamenteel verandert, is de verschillende signaaloverdracht in kunstmatige neurale netwerken en in het biologische netwerk van neuronen. Het feit is dat neuronen in de ANN waarden verzenden die echte waarden zijn, dat wil zeggen getallen. In het menselijk brein worden impulsen met een vaste amplitude doorgegeven, en deze impulsen zijn bijna onmiddellijk. Daarom zijn er een aantal voordelen aan het menselijke netwerk van neuronen.

Ten eerste zijn communicatielijnen in de hersenen veel efficiënter en zuiniger dan in ANN's. Ten tweede zorgt het impulscircuit voor de eenvoud van de technologie-implementatie: het is voldoende om analoge circuits te gebruiken in plaats van complexe rekenmechanismen. Uiteindelijk zijn impulsnetwerken beschermd tegen akoestische interferentie. Geldige getallen zijn gevoelig voor ruis, wat de kans op fouten vergroot.

Resultaat

Natuurlijk heeft de ontwikkeling van neurale netwerken het afgelopen decennium een ​​enorme vlucht genomen. Dit komt vooral doordat het leerproces van de ANN veel sneller en gemakkelijker is geworden. Ook begonnen de zogenaamde "vooraf getrainde" neurale netwerken actief te worden ontwikkeld, wat het proces van technologische implementatie aanzienlijk kan versnellen. En als het te vroeg is om te zeggen of neurale netwerken ooit in staat zullen zijn om de capaciteiten van het menselijk brein volledig te reproduceren, wordt de kans dat in het komende decennium ANN's in een kwart van de bestaande beroepen de mens zullen kunnen vervangen steeds groter en groter. waar.

Voor wie meer wil weten

  • De grote neurale oorlog: waar Google echt mee bezig is
  • Hoe cognitieve computers onze toekomst kunnen veranderen

Naar bladwijzers

We zullen je in een paar stappen vertellen hoe je een eenvoudig neuraal netwerk maakt en het leert beroemde ondernemers op foto's te herkennen.

Stap 0. Begrijpen hoe neurale netwerken werken

De gemakkelijkste manier om de principes van neurale netwerken te begrijpen, is de Teachable Machine, een educatief project van Google.

Als input - wat verwerkt moet worden door het neurale netwerk - gebruikt de Teachable Machine een beeld van een laptopcamera. Als output - wat het neurale netwerk moet doen na het verwerken van de binnenkomende gegevens - kun je een GIF of geluid gebruiken.

U kunt de leerbare machine bijvoorbeeld leren 'hallo' te zeggen met uw handpalm naar boven. Met de duim omhoog - "Cool", en met een verbaasd gezicht met een open mond - "Wow".

Eerst moet je het neurale netwerk trainen. Om dit te doen, hef je je handpalm op en klik je op de Train Green-knop - de service maakt enkele tientallen foto's om een ​​patroon in de afbeeldingen te vinden. Een set van dergelijke snapshots wordt gewoonlijk een "dataset" genoemd.

Nu blijft het om de actie te kiezen die moet worden aangeroepen bij herkenning van de afbeelding - zeg een zin, laat een GIF zien of speel een geluid af. Op dezelfde manier trainen we het neurale netwerk om een ​​verrast gezicht en een duim te herkennen.

Zodra het neurale netwerk is getraind, kan het worden gebruikt. De leerbare machine laat de "vertrouwensfactor" zien - hoe zeker het systeem is dat het een van de vaardigheden wordt getoond.

Een korte video over de leerbare machine

Stap 1. De computer voorbereiden om met een neuraal netwerk te werken

Laten we nu ons eigen neurale netwerk maken, dat bij het verzenden van een afbeelding rapporteert wat op de afbeelding wordt getoond. Eerst leren we het neurale netwerk bloemen te herkennen in een afbeelding: kamille, zonnebloem, paardenbloem, tulp of roos.

Om je eigen neurale netwerk te maken, heb je Python nodig - een van de meest minimalistische en meest voorkomende programmeertalen, en TensorFlow - de open bibliotheek van Google voor het maken en trainen van neurale netwerken.