Effecten van het randomiseren van de volgorde van invoer naar een neuraal netwerk

Voor mijn Advanced Algorithms en Data Structures-klasse vroeg mijn professor ons een onderwerp te kiezen dat ons interesseerde. Hij vertelde ons ook om het te onderzoeken en te proberen er een oplossing in te implementeren. Ik koos voor Neural Networks omdat het iets is dat ik al heel lang wilde leren.

Ik heb een AND, OR en XOR geïmplementeerd met behulp van een neuraal netwerk waarvan de neuronen een stapfunctie gebruiken voor de activator. Daarna probeerde ik een achterwaarts voortplantend neuraal netwerk te implementeren dat de XOR-operator leert herkennen (met behulp van een sigmoid-functie als activator). Ik kon dit 90% van de tijd laten werken door een 3-3-1-netwerk te gebruiken (1 bias op de invoer en de verborgen laag, met willekeurige gewichten willekeurig geïnitialiseerd). Op andere momenten lijkt het vast te lopen in wat ik denk dat een lokale minima is, maar ik weet het niet zeker (ik heb hier eerder vragen over gesteld en mensen hebben me verteld dat er geen lokale minima zouden moeten zijn).

De 90% van de tijd dat het werkte, presenteerde ik consequent mijn invoer in deze volgorde: [0, 0], [0, 1], [1, 0], [1, 0] met de verwachte uitvoer ingesteld op [0, 1, 1, 0] . Wanneer ik de waarden consistent in dezelfde volgorde presenteer, leert het netwerk uiteindelijk het patroon. Het maakt eigenlijk niet uit in welke volgorde ik het instuur, zolang het maar exact dezelfde volgorde is voor elk tijdperk.

Vervolgens heb ik een randomisatie van de trainingsset geïmplementeerd, dus deze keer is de volgorde van de ingangen voldoende willekeurig verdeeld. Ik heb nu gemerkt dat mijn neurale netwerk vastloopt en de fouten afnemen, maar met een zeer kleine snelheid (die steeds kleiner wordt in elk tijdperk). Na een tijdje beginnen de fouten te oscilleren rond een waarde (dus stopt de fout met afnemen).

Ik ben een beginneling in dit onderwerp en alles wat ik tot nu toe weet is autodidact (tutorials lezen, papers, etc.). Waarom verandert de volgorde van presentatie van invoer het gedrag van mijn netwerk? Is het omdat de verandering in fout consistent is van de ene invoer naar de volgende (omdat de volgorde consistent is), wat het voor het netwerk gemakkelijk maakt om te leren?

Wat kan ik doen om dit op te lossen? Ik ga over mijn backpropagation-algoritme om te controleren of ik het goed heb geïmplementeerd; momenteel wordt het geïmplementeerd met een leerfrequentie en een momentum. Ik overweeg om naar andere verbeteringen te kijken, zoals een adaptief leerritme. Het XOR-netwerk wordt echter vaak afgebeeld als een heel eenvoudig netwerk en daarom denk ik dat ik geen geavanceerd backpropagation-algoritme hoef te gebruiken.

4

1 antwoord

de volgorde waarin je de waarnemingen (invoervectoren) van je trainingsset aan het netwerk presenteert, doet er maar één toe - gerandomiseerde rangschikking van de waarnemingen volgens de responsvariabele heeft sterk de voorkeur versus geordende rangschikking.

Stel dat u 150 waarnemingen hebt die uw trainingsset bevatten en voor elke variabele één van de drie klassenlabels (klasse I, II of III), zodat de waarnemingen 1-50 in klasse I, 51-100 in klasse II en 101-50 in klasse III. Wat u niet wilt doen, is ze in die volgorde aan het netwerk presenteren. Met andere woorden, u wilt niet dat het netwerk alle 50 waarnemingen in klas I ziet, dan alle 50 in klas II, dan alle 50 in klas III.

Wat gebeurde er tijdens het trainen van je classifier? In eerste instantie presenteerde u de vier observaties aan uw netwerk, ongeordend [0, 1, 1, 0].

Ik vraag me af wat de volgorde was van de invoervectoren in die gevallen waarin uw netwerk niet kon convergeren? Als het [1, 1, 0, 0] of [0, 1, 1, 1] was, stemt dit overeen met deze goed gedocumenteerde empirische regel die ik hierboven noemde.

On the other hand, i have to wonder whether this rule even applies in your case. The reason is that you have so few training instances that even if the order is [1, 1, 0, 0], training over multiple epochs (which i am sure you must be doing) will mean that this ordering looks more "randomized" rather than the exemplar i mentioned above (i.e., [1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0] is how the network would be presented with the training data over three epochs).

Some suggestions to diagnose the problem:

  1. Zoals ik hierboven al vermeldde, kijk naar de volgorde van uw invoervectoren in de niet-convergentie-gevallen - worden ze gesorteerd op responsvariabele?

  2. Kijk in de gevallen zonder convergentie naar uw gewichtsmatrices (ik neem aan dat u er twee hebt). Zoek naar waarden die erg groot zijn (bijv. 100x de andere, of 100x de waarde waarmee deze is geïnitialiseerd). Grote gewichten kunnen overflow veroorzaken.

7
toegevoegd
Bedankt voor de informatie doug. Nogmaals, aangezien ik een beginneling ben, ben ik niet erg bekend met alle voorwaarden. Wat bedoel je met de "niet-convergentie-zaken"? Wat de gewichten betreft, heb ik twee gewichtsvectoren: één voor de invoer naar de verborgen laag en één voor de invoer naar de uitvoerlaag.
toegevoegd de auteur Vivin Paliath, de bron
Het was een stomme fout die me deed. De ingangen kwamen niet overeen met de uitgangen die ervoor zorgden dat het netwerk niets leerde! Ik heb ook mijn backpropagation-algoritme aangepast om de gewichten alleen aan te passen nadat de fout voor alle knooppunten in het netwerk is berekend.
toegevoegd de auteur Vivin Paliath, de bron
Bedankt voor die link; het ziet er erg nuttig uit! Dank u ook voor uw suggesties om mijn code minder foutgevoelig te maken!
toegevoegd de auteur Vivin Paliath, de bron
@VivinPaliath "niet-convergentie" gevallen verwijst alleen naar die gevallen waarin het netwerk niet convergeerde op een resultaat - d.w.z., welk gegevenspunt ervoor zorgde dat het vast kwam te zitten. Laat me voorstellen. Kent u de veelgestelde vragen over neuraal netwerkcomp.ai? IMO, verreweg de beste NN-bron, de meest gezaghebbende, meest uitgebreide en verrassend gemakkelijkst te lezen (geheel in FAQ-indeling). faqs.org/faqs/ai-faq/neural- netten/part1/preamble.html . Er zijn 7 delen, je kunt alle 7 in pdf-formaat downloaden.
toegevoegd de auteur doug, de bron
@VivinPaliath blij om te weten dat je het oplost. Dus je hebt je invoerarrays opnieuw geordend, maar vergat om de overeenkomstige doelen op dezelfde manier opnieuw te ordenen - ik heb dat misschien een miljoen keer gedaan. als je python of matlab gebruikt, een eenvoudige manier om het te vermijden, bewaar je invoer + doelen samen als een enkele 2D ('data') matrix, dus gebruik in plaats van elk aan een afzonderlijke variabele (invoer, doelen) alleen index/slice notatie op de gecombineerde gegevensmatrix om te verwijzen naar, bijvoorbeeld, invoeren zijn gegevens [:,: - 1], doelen zijn gegevens [:, - 1]
toegevoegd de auteur doug, de bron