IV.- LABOR Előrecsatolt többrétegű hálók tanítása IV.- LABOR Előrecsatolt többrétegű hálók tanítása A dolgozat célja: az előrecsatolt többrétegű neuronhálók tanítása, időben változó értékű tanító együtthatók alkalmazása, a háló méretének optimalizálása a háló méretének csökkentésével vagy növelésével, a többrétegű neuronhálókkal kapcsolatos MATLAB függvények alkalmazása neuronhálók tanítására és tesztelésére Elméleti alapfogalmak Alapvető MATLAB függvények az előrecsatolt többrétegű hálók tanítására: newff- egy új többrétegű előrecsatolt perceptron típusú háló létrehozása sim-a háló kimenetének előállítása egy adott bemenetre (előhívási fázis) train-a háló tanítása NEWFF letrehoz egy előrecsatolt neuronhálót net = newff(pr,[s1 S2...SNl],{TF1 TF2...TFNl},BTF,BLF,PF) PR -- R x 2 matrix, tartalmazza a minimális és maximális értékeket egy R elemű bemeneti vektorra Si az ik réteg neuronjainak száma, az utolsó (kimeneti réteg) neuronjainak a számát a feladat határozza meg) TFi i-ik réteghez tartozó aktivációs függvények típusa:tansig, logsig, purelin (alapértelmezett = 'tansig') BTF- backpropagation training function trainbfg- -quasi-newton backpropagation trainlm -Levenberg-Marquardt backpropagation traingd -Gradient descent backpropagation traingdm -Gradient descent with momentum backpropagation traingda -Gradient descent with adaptive learning rate backpropagation traingdx -Gradient descent with momentum and adaptive learning rate backpropagation BLF - Backprop weight/bias learning function, default = 'learngdm' LEARNGD-Gradient descent weight/bias learning function LEARNGDM-Gradient descent w/momentum weight/bias learning function PF- Performance function, default = 'mse'. MSE Mean squared error performance function. MSEREG Mean squared error with regularization performance function. MAE Mean absolute error performance function. Példa P = [0 1 2 3 4 5 6 7 8 9 10]; T = [0 1 2 3 4 3 2 1 2 3 4]; tanító halmaz net = newff([0 10],[5 1],{'tansig' 'purelin'}); % a háló felépítése 23
Mesterséges Intelligencia Labor net = train(net,p,t); %a háló tanítása Y = sim(net,p); %a háló kimenetének kiszámolása Ötletek a tanítási algoritmus gyorsítására, a lokális minimumokba való ragadás elkerülésére Milyen értéket kell választani a tanítási együtthatónak? a) Túl nagy tanítási együttható esetében az algoritmus nem konvergens. b) Igen kicsi tanítási együttható esetében a tanulás lassú, és gyakran elakad lokális minimumokban c) Javasolt a változó értékű tanítási együtthatónak az alkalmazása, kezdetben nagyobb együttható biztosítja a gyors tanítást, a tanítás végén pedig egyre kisebb értékű együttható alkalmazása eredményezi a pontos finom a tanulást. Egy javaslat a 1 változó értékű tanítási együttható kiszámítására µ [ k] = µ 0 ahol µ 0 -a tanítási 1+ Tk együttható kezdeti értéke, k-adik tanítási ciklus, T- egy paraméter, melynek segítségével a tanítási együttható változásának meredekségét lehet hangolni, µ [ k] -a tanítási együttható értéke a k-adik tanítási ciklusban 24 d) A lokális minimumokba való elakadás elkerülésére javasolt a momentum módszer alkalmazása. A Widrow Hoff (delta) szabályt egy újabb taggal, úgynevezett momentummal kell kiegészíteni. A momentumos tagnak a lényege, hogy figyelembe veszi a súlyzók módosításának az irányát az előbbi lépésből. Amint az algoritmus nevéből is kiszűrhető, egy tehetetlenségi tagról van szó. w [k + 1] = w [k] + µ δi f ( s ) x [k] + mw [k 1] w -az l-ik réteg i-ik neuronja és j-ik bemenet közötti súlyzó értéke µ l-ik réteghez tartozó tanítási együttható δi -a réteg kimenetén a hiba (a kimeneti réteg esetében a háló kimenetén kiszámolt hiba, rejtett rétegek esetében pedig a visszaáramoltatott hiba) x j [k] -az l-ik réteg j-ik bemenete a k-ik tanítási ciklusban m -momentum tag, 0 és 1 között vehet fel értéket e) Egy módszer a tanítás gyorsítására: ha a tanulás stagnál, duplázzuk meg a tanítási együtthatót ha a tanulás elég gyors, marad a tanítási együttható értéke az előbbi tanítási ciklusból ha a hiba növekedni kezd, felezzük a tanítási együtthatót A neuronháló méretének az optimalizálása Nem elég a feladatot megoldani, hanem a leggyorsabb megoldást szeretnénk elérni. Ha a neuronháló szoftveres megvalósításáról van szó, a háló kimenetének a kiszámítása (és tanítása) annál gyorsabb, minél kevesebb számítást kell elvégeznünk. A háló méretének az optimalizálása az elvégzendő számítások csökkentését eredményezi. A neuronháló optimális mérete a következőképpen határozható meg a) A háló méretének növelésével. Egy kisebb méretű hálóból kiindulva elvégezzük a tanítást. A tanítás végén ellenőrizzük, hogy elfogadható-e a megoldás. Ha nem elfogadható, újabb neuronokat építünk a hálóba. Egy rejtett réteget és egy kimeneti réteget tartalmazó háló esetében a rejtett rétegben egy újabb neuronnak a bevitele a súlyzómátrixoknak a következő módosításait igényli i j
IV.- LABOR Előrecsatolt többrétegű hálók tanítása a rejtett réteg súlyzó mátrixához hozzá kell adni egy újabb oszlopot, a kimeneti réteghez hozzá kell adni egy újabb sort Újra és újra elvégezzük a háló tanítását, amíg a hiba a megfelelő érték alá nem csökken. Az új neuron bevitele után a hiba csökkenése lesz észlelhető. Ha a hiba csökkenése stagnál, egy újabb neuron bevitelére kerül sor. b) A háló méretének a csökkentésével. Egy nagyobb méretű hálóból kiindulva (amely biztosan megoldja a feladatot) optimalizáljuk a háló méretét csökkentve a rejtett rétegben levő neuronok számát. A neuronok kivágásánál felmerül a kérdés, hogy melyik neuronokat lehet kivágni a hálóból. A neuron hálóból kivághatóak azok a neuronok, amelyek teljesítik a következő feltételeket: Ha két neuronnak a kimenete hasonló a tanítóhalmaz minden elemére A tanítóhalmaz minden elemére egyes neuronok kimenete nulla (vagy nullához közeli) Egy neuron kivágása után továbbtanítjuk a neuronhálót. Első fázisban a hiba növekedése lesz észlelhető, de ha a háló képes megoldani a feladatot, a hiba az elvárt érték alá csökken. Tehát egy újabb neuront kell kivágni. Addig ismételjük a neuronok kivágását, amíg a hiba az elvárt érték alá nem csökken. Az alábbiakban egy példaprogram látható, amelyben 5x7 méretű alfabetikus karaktereket tanítunk egy előrecsatolt többrétegű mesterséges idegsejthálóval a MATLAB Neural Networks Tolbox függvényeit alkalmazva. clf; figure(gcf) echo on % NEWFF - az elırecsatolt háló inicializálása % TRAINGDX - a háló tanítása gyors backpropagation algoritmussal % SIM - a neurális háló szimulációja %% KARAKTER FELISMERÉS % A TANÍTÓ HALMAZ FELÉPÍTÉSE % ========================== %prprob tartalmazza a tanító halmazt (26 karakter) és az elvárt kimenetet [alphabet,targets] = prprob; [R,Q] = size(alphabet); [S2,Q] = size(targets); %% MEGHATÁROZZUK A HÁLÓ STRUKTÚRÁJÁT % ================================== % logsig típusú aktivációs függvényeket alkalmazunk a rejtett és a kimeneti % rétegbe %S1-a rejtett retegben levı neuronok száma %S2-a kimeneti rétegben levı neuronok száma S1 = 10; net = newff(minmax(alphabet),[s1 S2],{'logsig' 'logsig'},'traingdx'); net.lw{2,1} = net.lw{2,1}*0.01; net.b{2} = net.b{2}*0.01; %a COMMAND ablakba beírva a net változót, láthatjuk, hogy milyen paramétereket %tartalmaz és ha szükséges, módosíthatjuk azokat. %például net.trainparam.lr -a tanítási együttható lekérdezése %például net.trainparam.lr=0.001 %net.layers{1}.transferfcn % a rejtett réteg aktivációs függvényének 25
Mesterséges Intelligencia Labor %lekérdezése %net.layers{2}.transferfcn % A második (kimeneti) réteg aktivációs %függvényének lekérdezése %net.layers{1}.transferfcn='tansig' -tansig aktivációs függvény alkalmazása %a rejtett rétegbe %% TANÍTJUK A HÁLÓT (ZAJMENTESEN) % ================================== % Beállítjuk a tanítási paramétereket net.performfcn = 'sse'; % Sum-Squared Error kritérium függvény net.trainparam.goal = 0.1; % a cél hiba net.trainparam.show = 20; % a hiba kirajzolásának frissítése net.trainparam.epochs = 5000; % a maximális tanítási korszakok száma net.trainparam.mc = 0.95; % momentum értéke P = alphabet; %-a tanítandó karakterek T = targets; %-az elvárt kimenet [net,tr] = train(net,p,t); % a háló tanítása %% A HÁLÓ TANÍTÁSA ZAJOS KÖRNYEZETBEN % ================================== netn = net; %lementjük a régi hálót netn.trainparam.goal = 0.6; % a cél hiba netn.trainparam.epochs = 300; % maximális tanítási korszakok száma % A hálót 10 cikluson át tanítjuk, az eredeti karaktereket torzítva T = [targets targets targets targets]; for pass = 1:10 fprintf('sikeres = %.0f\n',pass); P = [alphabet, alphabet,... (alphabet + randn(r,q)*0.1),... (alphabet + randn(r,q)*0.2)]; [netn,tr] = train(netn,p,t); echo off end echo on %% TANITJUK A HÁLÓT AZ EREDETI (nem zajos) KARAKTERKRE % ========================================= % biztosítva ezáltal, hogy az eredeti karaktereket helyesen azonosítja netn.trainparam.goal = 0.1; % célhiba netn.trainparam.epochs = 500; % maximális tanítási korszakok száma net.trainparam.show = 5; % a hiba kirajzolásának frissítése a net hálóra P = alphabet; T = targets; [netn,tr] = train(netn,p,t); %a háló tanítása %% A HÁLÓ TESZTELÉSE % A TESZT PARAMÉTEREK BEÁLLÍTÁSA noise_range = 0:.05:.5; max_test = 100; network1 = []; network2 = []; T = targets; 26
IV.- LABOR Előrecsatolt többrétegű hálók tanítása % A TESZT ELVÉGZÉSE for noiselevel = noise_range fprintf('a háló tesztelése %.2f zajszintre.\n',noiselevel); errors1 = 0; errors2 = 0; for i=1:max_test P = alphabet + randn(35,26)*noiselevel; % AZ ELS? HÁLÓ TESZTELÉSE (net) A = sim(net,p); % a háló szimulációja a bemenetekre AA = compet(a); % errors1 = errors1 + sum(sum(abs(aa-t)))/2; %a hiba összegzése % A MÁSODIK HÁLÓ TESZTELÉSE An = sim(netn,p); %a háló szimulációja a bemenetekre AAn = compet(an); errors2 = errors2 + sum(sum(abs(aan-t)))/2; %a hiba összegzése echo off end % ÁTLAGHIBA SZÁMOLÁSA 100 x 26 KARAKTERRE network1 = [network1 errors1/26/100]; %elsı háló átlag hibavektora network2 = [network2 errors2/26/100]; %második háló hibavektora end echo on % AZ EREDMÉNY ÁBRÁZOLÁSA % ======================= clf plot(noise_range,network1*100,'--',noise_range,network2*100); title('felismerési HIBA %-ban kifejezve'); xlabel('zajszint'); ylabel('elsı háló(zajmentes tanítás) - - Második háló (Zajos tanítás) - --'); Feladat I. A III. Labor órán megtervezett előrecsatolt többrétegű háló tanítását végezzük el a következő esetekre a. a súlymódosításnál vegyük figyelembe a büntető tagot µλ w, melynek hatására a tanítás után a súlyzók értéke kicsi lesz (közel nullához). A büntető tag alkalmazásával a súlymódósítás a következőképpen alakul : w [ k + 1] = w [ k] + µ δ x µλ w. A büntetőtagot csak azon súlyzókra alkalmazzuk, melyek abszolút értéke egy küszöb alatt van w < θ, ellenkező esetben a háló nem fog tanulni. b. λ felejtési együttható. A büntető tag alkalmazásának a célja, hogy a tanítás elvégzése után egyszerűsítsük a háló struktúráját, kiejtve a hálóból azokat a neuronokat, melyek kimenete a teljes tanítási ciklusra nulla körüli értéket vesz fel. A feladat, hogy a tanítás elvégzése után határozzuk meg az optimális neuronhálótopológiát. 1 c. A tanítás során alkalmazzunk időben változó tanítási együtthatókat µ [ i] = µ 0 1+ ki ahol µ 0 -a tanítási együttható kezdeti értéke, i-az i-edik tanítási ciklus, k- egy paraméter, melynek segítségével a tanítási együttható változásának meredekségét lehet hangolni µ [ i] -a tanítási együttható értéke az i-edik tanítási ciklusban d. Tervezzünk egy többrétegű előrecsatolt perceptron típusú optimális méretű hálót 1. kiindulva egy kisebb méretű hálóból (kevesebb neuron a rejtett rétegben), és növelve a rejtett rétegben levő neuronok számát 2. kiindulni egy nagyobb méretű hálóból (mely biztosan megoldja a i j 27
Mesterséges Intelligencia Labor II. feladatot) és csökkenteni a rejtett rétegben (rétegekben) levő neuronok számát. (Azokat a neuronokat távolítsuk el, melyek kimenete a teljes tanítási halmazra nullához közeli értéket ad, vagy melyek nem változnak a tanítás ideje alatt.) Hasonlítsunk össze különböző gradiens alapú algoritmusokat, alkalmazva a NeuralNetworkToolbox függvényeit. Az összehasonlítást alkalmazzuk karakterosztályozásos feladatra. (Az osztályozandó számjegyek 0 9, a karakterek mérete 5x7) A fontosabb függvények, melyek segítségével a feladat elkészíthető, a következők:newff, sim és train 28