Hoe kies je het aantal verborgen lagen en knooppunten in een feedforward neuraal netwerk?

Bestaat er een standaard en aanvaarde methode voor het selecteren van het aantal lagen, en het aantal knooppunten in elke laag, in een feed-forward neuraal netwerk? Ik ben geïnteresseerd in geautomatiseerde manieren om neurale netwerken te bouwen.

Oplossing

Ik realiseer me dat deze vraag beantwoord is, maar ik denk niet'dat het bestaande antwoord echt op de vraag ingaat, behalve dat het verwijst naar een link die in het algemeen verband houdt met het onderwerp van de vraag's. In het bijzonder beschrijft de link één techniek voor programmatische netwerkconfiguratie, maar dat is geen "[een] standaard en geaccepteerde methode" voor netwerkconfiguratie. Door een kleine reeks duidelijke regels te volgen, kan men programmatisch een bekwame netwerkarchitectuur instellen (d.w.z. het aantal en type neuronale lagen en het aantal neuronen waaruit elke laag bestaat). Als je dit schema volgt, krijg je een bekwame architectuur, maar waarschijnlijk geen optimale. Maar als dit netwerk eenmaal geïnitialiseerd is, kun je de configuratie tijdens de training iteratief bijstellen met behulp van een aantal aanvullende algoritmen; één familie hiervan werkt door het snoeien van knooppunten op basis van (kleine) waarden van de gewichtsvector na een bepaald aantal trainingsepoches - met andere woorden, het elimineren van overbodige/redundante knooppunten (hieronder meer hierover). Elk NN heeft dus drie soorten lagen: input, hidden, en output.


Het maken van de NN-architectuur betekent dus het bedenken van waarden voor het aantal lagen van elk type en het aantal nodes in elk van deze lagen. De inputlaag Simpel - elke NN heeft er precies één - geen uitzonderingen waar ik me van bewust ben. Wat betreft het aantal neuronen waaruit deze laag bestaat, deze parameter wordt volledig en uniek bepaald zodra u de vorm van uw trainingsgegevens kent. Meer bepaald is het aantal neuronen waaruit deze laag bestaat gelijk aan het aantal kenmerken (kolommen) in uw gegevens. Sommige NN-configuraties voegen een extra node toe voor een bias term.
De Uitgangslaag Net als de inputlaag heeft elk NN echt één outputlaag. Het bepalen van de grootte (aantal neuronen) is eenvoudig; deze wordt volledig bepaald door de gekozen modelconfiguratie. Draait uw NN in machinemodus of regressiemodus (de ML-conventie om een term te gebruiken die ook in de statistiek wordt gebruikt, maar er een andere betekenis aan te geven, is erg verwarrend). Machinemodus: geeft een klassenlabel terug (bv. "Premium Account"/"Basic Account"). Regressiemodus retourneert een waarde (bv. prijs). Als het NN een regressor is, dan heeft de uitvoerlaag een enkel knooppunt. Als het NN een classificator is, heeft het ook een enkel knooppunt, tenzij softmax wordt gebruikt in welk geval de uitvoerlaag één knoop heeft per klasse-etiket in uw model. De Verborgen Lagen Deze paar regels bepalen dus het aantal lagen en de grootte (neuronen/laag) voor zowel de input- als de outputlagen. Dan blijven de verborgen lagen over. Hoeveel verborgen lagen? Wel, als je gegevens lineair scheidbaar zijn (wat je vaak al weet tegen de tijd dat je een NN begint te coderen), dan heb je helemaal geen verborgen lagen nodig. Natuurlijk heb je ook geen NN nodig om je gegevens op te lossen, maar het zal nog steeds het werk doen. Buiten dat, zoals je waarschijnlijk weet, is er'een berg commentaar op de kwestie van verborgen laagconfiguratie in NNs (zie de waanzinnig grondige en inzichtelijke NN FAQ voor een uitstekende samenvatting van dat commentaar). Eén kwestie binnen dit onderwerp waarover consensus bestaat, is het verschil in prestaties door het toevoegen van extra verborgen lagen: de situaties waarin de prestaties verbeteren met een tweede (of derde, enz.) verborgen laag zijn zeer beperkt. Eén verborgen laag is voldoende voor de grote meerderheid van de problemen. Hoe zit het dan met de grootte van de verborgen laag (lagen) - hoeveel neuronen? Er zijn enkele empirisch afgeleide vuistregels, waarvan de meest gebruikte is 'de optimale grootte van de verborgen laag ligt gewoonlijk tussen de grootte van de input- en die van de output-lagen'. Jeff Heaton, auteur van Introduction to Neural Networks in Java biedt er nog een paar aan. Kortom, voor de meeste problemen zou men waarschijnlijk een behoorlijke prestatie kunnen krijgen (zelfs zonder een tweede optimalisatiestap) door de configuratie van de verborgen lagen in te stellen met slechts twee regels: (i) het aantal verborgen lagen is gelijk aan één; en (ii) het aantal neuronen in die laag is het gemiddelde van de neuronen in de input- en output-lagen.
Optimalisatie van de netwerkconfiguratie Pruning beschrijft een reeks technieken om de netwerkgrootte te reduceren (door knooppunten, niet door lagen) om de rekenprestaties en soms de resolutie te verbeteren. De essentie van deze technieken is het verwijderen van knooppunten uit het netwerk tijdens de training door die knooppunten te identificeren die, als ze uit het netwerk verwijderd zouden worden, geen merkbare invloed zouden hebben op de netwerkprestaties (d.w.z. de resolutie van de gegevens). (Zelfs zonder een formele pruning-techniek te gebruiken, kun je een ruw idee krijgen van welke knooppunten niet belangrijk zijn door na de training naar je gewichtsmatrix te kijken; kijk naar gewichten die heel dicht bij nul liggen - het zijn de knooppunten aan weerszijden van die gewichten die vaak worden verwijderd tijdens het prunen). Het is duidelijk dat als je een pruning algoritme gebruikt tijdens de training, begin dan met een netwerk configuratie die meer kans heeft om overtollige (d.w.z. 'prunable') knooppunten te hebben--met andere woorden, wanneer je beslist over een netwerk architectuur, kies dan voor meer neuronen, als je een pruning stap toevoegt. Anders gezegd, door tijdens de training een snoei-algoritme op je netwerk toe te passen, kun je de optimale netwerkconfiguratie benaderen; of je dat in één enkele "up-front" kunt doen (zoals een op een genetisch-algoritme gebaseerd algoritme) weet ik niet'al weet ik wel dat vooralsnog deze optimalisatie in twee stappen gebruikelijker is.

Commentaren (16)

Ik ben momenteel bezig met een empirische studie hiervan (en nader een processor-century van simulaties op onze HPC faciliteit!). Mijn advies zou zijn om een "groot" netwerk en regularisatie te gebruiken, als je regularisatie gebruikt dan wordt de netwerk architectuur minder belangrijk (mits het groot genoeg is om de onderliggende functie die we willen vastleggen weer te geven), maar je moet wel de regularisatie parameter goed afstellen.

Een van de problemen met architectuurselectie is dat het een discrete, in plaats van continue, controle van de complexiteit van het model is, en daarom een beetje een bot instrument kan zijn, vooral wanneer de ideale complexiteit laag is.

Dit is echter allemaal onderworpen aan de "no free lunch" stellingen: hoewel regularisatie in de meeste gevallen effectief is, zullen er altijd gevallen zijn waarin architectuurselectie beter werkt, en de enige manier om erachter te komen of dat voor het probleem in kwestie geldt, is beide benaderingen uit te proberen en te kruisvalideren.

Als ik een geautomatiseerde neurale netwerkbouwer zou bouwen, zou ik Radford Neal's Hybrid Monte Carlo (HMC) sampling-gebaseerde Bayesiaanse aanpak gebruiken, en een groot netwerk gebruiken en over de gewichten integreren in plaats van de gewichten van een enkel netwerk te optimaliseren. Dat is echter rekentechnisch duur en een beetje een "zwarte kunst" maar de resultaten die Prof. Neal bereikt suggereren dat het de moeite waard is!

Commentaren (2)

Voor zover ik weet is er geen manier om automatisch het aantal lagen en neuronen in elke laag te kiezen. Maar er zijn netwerken die hun topologie automatisch kunnen opbouwen, zoals EANN (Evolutionary Artificial Neural Networks, die Genetische Algoritmen gebruiken om de topologie te ontwikkelen).

Er zijn verschillende benaderingen, een min of meer moderne die goede resultaten leek te geven was NEAT (Neuro Evolution of Augmented Topologies).

Commentaren (0)