Neural Networks

Fórumok

Üdv mindenki!
Eléggé elvetélt próbálkozás, de azért elkezdtem gyúrni ezeket a neuron hálókat.
Van valaki köztetek, aki ért ezekhez? :D
Lenne pár kérdésem.

Hozzászólások

Használok neurális hálózatot a diplomamunkámban (MATLAB), bár még kezdő vok a témában. Azért mondjad a kérdéseket, hátha van ötletem.

Jajj, de jó! Köszi!

Az első és legfontosabb kérdés, amire nem kapok semmilyen leírásban választ:
"Miképpen lesz mondjuk egy 'hello' stringből, megfelelő input adat?"
illetve:
"Milyen a megfelelő input adat? 0 és 1 közötti törtszám, vagy egy tetszőleges nagyságú szám?"

A karakterek ASCII kódja is megfelel input-nak, a cellák lehetnek binárisak (ekkor viszonylag sok lesz a bemenő rétegben a cellák száma),
vagy folytonosak attól függetlenül, hogy diszkrét értékeket kapnak. Így karakterenként egy cella a bemenő rétegben. (Az első esetben ugye 8-szor annyi.)
A gond mindíg az, hány cella legyen a rejtett rétegben, egyáltalán hány rejtett réteg legyen. Erre nincs recept.
A kimeneti rétegben a cellák száma annyi, ahány adatot vársz, illetve amennyi a döntést reprezentálni tudja. Esetedben ha jól értem ez 1.

igen, érzésem szerint pont a bemeneti neuronok száma az (egyik) achilles-sarka az egésznek.

Kezdjük az egyszerűbbel:
A kimeneti neuronok száma lehet 2. Legegyszerűbb megközelítésben [1 0] pl a káromkodás és [0 1], ha nem. Mindenképp minimum 2D állapotvektorokkal érdemes dolgozni, mert nyilván sose fogod a fenti vektorokat kapni a hálótól csak mindenféle [0.234 0.893]-öket, és így biztosabban lehet kategorizálni, mintha csak egy számot köpne ki.
Kezdetnek sztem jó a 3 rétegű backpropagation. Kérdés a középső (hidden) rétegbeli neuronok száma. Van erre is kiindulásnak egy ökölszabály, csak a könyvem épp Pesten van én meg otthon :). Aztán persze reszelni kell a neuronok számát, az biztos.

A bementi neuronokra (régen az volt) a mondás, h minél jobban le kell redukálni a bemenő adatmennyiséget, persze úgy, h az értékes infó benne maradjon. Ugyanis a bemeneti neuronok száma meghatározó a tanításhoz szükséges lépések számára nézve. Persze a mai számítási sebességeknél már ez se igazán téma.

Hogy miképp adagold be a szavakat, azon még gondolkozom... skylooker verziója jó ugródeszka.

Kezdem érteni :)

Most az van, hogy van egy valami programom.
Betanítom szépen (4 szóra) egy 10000-es loopban. Beállítódnak szépen az értékek. a Bias és a súly is. Namost akármit írok neki utána, mindig ugyanaz az output értékpár lesz. Minden inputra. :S
Asszem holnap folytatom.
Köszi a segítséget azért, nagyon! Szerintem lesz még kérdésem! :)

Még mindig gondolkozom a bemeneti neuronokon... ami nem tetszik nekem, az ugye a változó szóhossz, ez zavar kicsit a bemenetnél. Még az az eretnek ötletem támadt, h ki kéne próbálni, mennyire működik a rendszer, ha nem a szavakat, hanem minden szó esetében egy hisztogramot adunk be. Kifejtem, mire gondolok.
Csinálsz egy tömböt (vektort), minden eleme megfelel az ABC egy betűjének (+még kategória az írásjeleknek meg vmi "egyéb", ahova minden más megy). Alapból ki van nullázva. Bejön a szó, és egyszerűen megszámolod, melyik betűből (írásjelből) hány darab van benne. És ezt a fix elemű tömböt adod be a hálózatnak.

Ez csak egy ötlet, lehet hülyeség. De lehet pl kombinálni a rendes bemenettel. Mindegyik fajta bemenettel csinálni külön 1-1 hálózatot, aztán a végén még a kettő kimenetét is össze lehet hasonlítani. A tanítást lehet ugyanazzal a halmazzal csinálni, szal nem sok plusz meló egyáltalán.

Ami még érdekes: a tanítóhalmaz: összeszedni sok jó szót meg a káromkodásoknak normál meg mindenféle elfajult (&urva #ny#dat) formáját. Létezik ilyen készen, vagy Magadanak kell megcsinálni? Max veszel vmi magyar szótár file-t, kiszedsz belőle egy rakat jó szót és hozzáírsz egy adag káromkodást :) Az elején szórakoztató feladat mindenféle válfaját kitalálni :D

Az, h nem működik fogható a hidden layer neuronjainak a számára is. Ti. akkor se képes általánosítani, ha túl kevés, ill. ha túl sok. Ezzel kell bűvészkedni.

Ha esetleg lenne kéznél MATLAB Neural Network Toolbox, annak elég jó a helpje, általánosan is magyarázza a működésüket. De asszem mintha ez a help külön is letölthető lenne a www.mathworks.com-ról (némi turkálás után) pdf formátumban.

Nu.
Kezdjünk valami egyszerűbbel: szórzó AI.
2 inputja van, amelyek a szorzandó számok
1 outputja, ami megadja az eredményt.

2:2:1 -es felállásra gondolok (tán elég ennyi)
Megtanítom úgy, hogy mutatok neki 2 inputot meg 1 eredményt, persze sok variációt sokszor.

Mi ebben a tudnivaló? Milyen lesz az output-om? Rábírhatom-e valahogy arra, hogy ne törtszámot adjon, hanem a szorzatot? A back propogatoin a fent említett link szerint működik "még". De ezzel azt érem el tényleg, hogy midnen inputra ugyanaz az eredmény jön :'(

Rövid kérdés a témához: ti 0ról megírtátok az ehhez szükséges dolgokat, vagy vmi libraryt használtok?

A bemeneti réteg celláinak számát az határozza meg, max hány betű lehet a vizsgált szó. ha pl. 15 betűre méretezed és a szó csak 6 betű, a többi tele lesz 0-val, erről gondoskodni kell.
A kimeneti cellák száma itt egyértelműen 1.
Ilyesmihez legalább 2 rejtett réteg kell, de inkább 3. Csak becslés.
Nagyon nagy számú bemeneti minta esetén azonban nem hiszem, hogy jó lesz,
illetve ha tanulásnál nagy mintaszámból tanul, kaotikus lehet.

Nézd meg ezt:
http://www.heatonresearch.com/articles/5/page2.html

Ilyen kétállapotú dolgoknál jobban jársz, ha két neuron ül a kimeneten.
[1 0] ha rendes szó
[0 1] ha káromkodás
És ezekkel kell tanítani.

Tegyük fel, hogy egy neuronod van, és azon megjelenik, h 0.22 (0 jelent káromkodás, 1 nem az). Ez alapján azt gondolnánk, obszcén szóval van dolgunk.
Namost alkalmazzunk két neuront. Ekkor jön egy olyan kimenet, h [0.22 0.35]. Innen már látszik, h kétséges, h jól tippelt-e a hálózat, ugyanis az második kimeneti neuron is kis értéket mutat, holott obszcén szónál annak 1-hez közelinek kéne lennie.

Egy ilyen szorzat-készítő hálózatnak milyen aktivációs függvényt érdemes megadni?
Illetve elvárhatom-e a hálózattól, hogy a 2 inputon beadott számból az 1 outputon kijöjjön a pontos szorzat?
tehát ha
input1:=5
input2:=4
akkor
output:=20
??

Na találtam egy howtoszeráséget:
http://www.codeproject.com/useritems/brainnet.asp#4.1.%20Training%20Pha…

Ez lett belőle ccc-ben, de hibás:

static TRAIN:=10000
static LEARNING_RATE:=0.5

static ipl:={}
static hl:={}
static ol:={}
static test_pat:={}

static NUM
static MAX_INP:=2
static MAX_HID:=3
static MAX_OUT:=1

******************************************************

class neuron(object)
method initialize
attrib weight
attrib a
attrib threshold
attrib E
attrib change
attrib t_change

******************************************************

function neuron.initialize(this,NUM)
local i
this:weight:=array(NUM)
this:change:=array(NUM)
this:E:=0
this:t_change:=0
this:a:=0

for i:=1 to len(this:weight)
this:weight[i]:=(random()%399+1)/1000
this:change[i]:=0
next

this:threshold:=(random()%399+1)/1000

return this

******************************************************

function sigmoid(x)
return 1/(1+exp(-x))

******************************************************
function populate_arrays()
local i

for i:=1 to len(ipl)
ipl[i]:=neuronNew(MAX_INP)
next

for i:=1 to len(hl)
hl[i]:=neuronNew(len(ipl))
next

for i:=1 to len(ol)
ol[i]:=neuronNew(len(hl))
next
return NIL

******************************************************

function output_error(expout)
local i

for i:=1 to MAX_OUT
ol[i]:E:=expout-ol[i]:a
ol[i]:t_change:=ol[i]:a*(1-ol[i]:a)*ol[i]:E
next

return NIL

******************************************************

function hidden_error()
local i,sum,j

for i:=1 to MAX_HID
sum:=0
for j:=1 to MAX_OUT
sum+=(ol[j]:t_change*hl[i]:weight[j])
next
hl[i]:E:=sum
hl[i]:t_change:=hl[i]:a*(1-hl[i]:a)*hl[i]:E
next
return NIL

******************************************************

function update_params()
local i,j

for i:=1 to MAX_HID
hl[i]:threshold:=hl[i]:threshold + LEARNING_RATE * 1 * hl[i]:t_change
for j:=1 to len(hl[i]:weight)
hl[i]:weight[j]:=hl[i]:weight[j] + LEARNING_RATE * 1 * ipl[j]:a * hl[i]:t_change
next
next

for i:=1 to MAX_OUT
ol[i]:threshold:=ol[i]:threshold + LEARNING_RATE * 1 * ol[i]:t_change
for j:=1 to len(ol[i]:weight)
ol[i]:weight[j]:=ol[i]:weight[j] + LEARNING_RATE * 1 * hl[j]:a * ol[i]:t_change
next
next

return NIL

****************************************************************************
****************************************************************************
****************************************************************************
function teach()
local in1,in2
local i,j
local tab:={{0,0,0},{0,1,0},{1,0,0},{1,1,1}}

for i:=1 to TRAIN
for j:=1 to len(tab)
test_pat:={}
aadd(test_pat,tab[j][1])
aadd(test_pat,tab[j][2])

run_network()
output_error(tab[j][3])
hidden_error()
update_params()
next
next

return NIL

******************************************************

function run_network()
local i,j
local sum

for i:=1 to MAX_INP
sum:=0
for j:=1 to NUM
sum:=sum+ipl[i]:weight[j]*test_pat[j]
next
ipl[i]:a:=sigmoid(sum+ipl[i]:threshold)
next

for i:=1 to MAX_HID
sum:=0
for j:=1 to MAX_INP
sum:=sum+hl[i]:weight[j]*ipl[j]:a
next
hl[i]:a:=sigmoid(sum+hl[i]:threshold)
next

for i:=1 to MAX_OUT
sum:=0
for j:=1 to MAX_HID
sum:=sum+ol[i]:weight[j] * hl[j]:a
next
ol[i]:a:=sigmoid(sum+ol[i]:threshold)
next

return NIL

******************************************************

function main(in1,in2)
local i
NUM:=2
ipl:=array(MAX_INP)
hl:=array(MAX_HID)
ol:=array(MAX_OUT)

populate_arrays()

teach()

aadd(test_pat,val(in1))
aadd(test_pat,val(in2))

run_network()

for i:=1 to MAX_OUT
? "Output preceptron value #"+tostrtrim(i)+"= "+tostrtrim(ol[i]:a)
next

xquit()

return NIL

Mi a napi gyakorlatban használunk neuronhálókat, virtuális
kísérleti adatok előállítására. Az ezzel kapcsolatos
publikációkat megtalálod a public_kukac_meditor_pont_hu
ftp szerveren, a jelszó egy üres [enter].

Mindegyik cikket érdemes elolvasnod, különösen a HM_*.pdf-eseket.

Itt jegyzem meg, hogy a neurális hálók teljesítményével
elégedetlen voltam, ezért kifejlesztettem az ún. "matematikai
kristály"-okat (Zorax-kristályok). Ez utóbbiak segítségével
nagyságrendekkel gyorsabban kapunk sokkal pontosabb erednényt.

A ZORAX kristályokkal kapcsolatban itt találsz néhány apróságot:

http://www.meditor.hu/z_axidef.php

A legújabb fejlesztésekről, amelyek életszerű, kaotikus
rendszerekben (pl tőzsde) vágnak rendet, publikáció nincs,
de ha érdekel néhány részeredményt szívesen közlök.

Üdv: Végvári Lajos [meditor]

> Sol omnibus lucet.

Nu.
odáig eljutottam, hogy látszólag működik. De csak az utolsó tanítási eredményt jeyzi meg. Mit lehet ezzel kezdeni?

Hi!

Kicsit eltérve az általános kérdésektől (és talán kicsit off); ezúttal egy konkrét feladatom van:
van egy szótáram, benne szavakkal (településnevek, utcanevek, etc.)

A user által beadott stringet kellene "azonosítanom" a szótár elemeinek valamelyikével.
A gond az, hogy előfordulhatnak elírások, előfordulhatnak (pl. utcanevekben) plusz elemek (pl. a hivatalosan Kossuth utcára valaki Kossuth Lajos utcaként keres rá, etc.)

Több megoldás is eszembe jutott. Az egyik egy kissé optimalizált levenshtein algoritmus lenne pl.
Kérdés: neurális hálókat meg lehet ilyesmire megbízhatóan tanítani? Van vkinek tapasztalata ilyen téren?
Ha igen, akkor merre induljak el a témában? (ezúttal célirányosan már)

Kösz előre is,
kl223

Üdv!

Érdemes egy meglévő neuron háló motort használni, pl:
www.jooneworld.com
java alapú és komoly több mint 100 oldalas doski tartozik hozzá. Érdemes a 2-es verziót letölteni ha valakit érdekel, illetve alig pár sorból lehet készíteni egy hálót.

Most képfelismeréssel, közlekedési tábla és betű felismeréssel foglalkozom hobbi szinten, ha valakit érdekel, írjon zoltan.hanisch@gmail.com-ra.