Sissejuhatus
Mulle tundub see küsimus tõesti huvitav, eeldan, et keegi on selle kohta paberi välja pannud, kuid see on minu vaba päev, nii et ma ei taha minna viiteid taga ajama.
Nii et võiksime seda pidada väljundi esituseks / kodeeringuks, mida ma selles vastuses teen. Jään jätkuvalt arvama, et on olemas parem viis, kus saate lihtsalt kasutada veidi teistsugust kadumisfunktsiooni. (Võib-olla summa ruutude erinevustest, kasutades lahutamise moodulit 2 $ \ pi $).
Aga edasi tegeliku vastusega.
Meetod
Pakun, et nurk $ \ teeta $ on esindatud väärtuste paarina, selle siinus ja koosinus.
Seega on kodeerimisfunktsioon: $ \ qquad \ qquad \ quad \ theta \ mapsto (\ sin (\ theta), \ cos (\ theta)) $
ja dekodeerimise funktsioon on: $ \ qquad (y_1, y_2) \ mapsto \ arctan \! 2 (y_1, y_2) $
Kui arctan2 on pöördpuutuja, säilitades suuna kõigis kvadrantides)
Teoreetiliselt võite ekvivalentselt töötada otse nurkadega, kui teie tööriist kasutab kihifunktsioonina toetust atan2
(võttes täpselt 2 sisendit ja tekitades ühe väljundi). TensorFlow teeb seda nüüd ja toetab sellel gradientlaskumist, ehkki see pole mõeldud selleks kasutamiseks. Uurisin out = atan2 (sigmoid (ylogit), sigmoid (xlogit))
kaotusfunktsiooniga min ((pred - out) ^ 2, (pred - out - 2pi) ^ 2)
. Leidsin, et see treenis palju halvemini kui outs = tanh (ylogit) , outc = tanh (xlogit))
koos kadumisfunktsiooniga 0.5 ((sin (pred) - outs) ^ 2 + (cos (pred) - outc) ^ 2
. Mis ma arvan võib seostada gradiendi katkematusega atan2
Minu testimisel käivitatakse see eeltöötlusfunktsioonina
Selle hindamiseks määrasin ülesanne:
Mustvalge pilt, mis tähistab ühte joont tühjal taustal. Väljenda, millise nurga all see rida on positiivse x-telje suhtes
Rakendasin funktsiooni, mis genereeris need pildid juhuslikult, juhuslike nurkadega joontega (NB: selle postituse varasemates versioonides kasutati juhuslikke nõlvu, mitte juhuslikke nurki. Tänud @Ari Hermanile selle välja märkimise eest. See on nüüd fikseeritud) Ehitasin ülesande täitmise hindamiseks mitu närvivõrku. Täielikud üksikasjad rakendamise kohta on selles Jupyteri märkmikus. Kood on kõik Julias ja ma kasutan Mocha närvivõrgu teeki.
Võrdluseks esitan selle alternatiivsete meetodite abil, mis võimaldavad suurendada skaalat väärtuseni 1.1.ja 500 prügikasti paigutamise ning pehme siltiga softmaxi kasutamisega. Ma pole viimasega eriti rahul ja tunnen, et vajan näpistama. Seetõttu proovin ma erinevalt teistest ainult 1000 korduse korral, võrreldes kahe teise, mida käidi 1000 ja 10 000 korral.
Eksperimentaalne seadistamine
Piltide hind oli 101 dollarit \ times101 $ pikslit, kusjuures joon on keskel ja läheb servani. Pildil ei olnud müra jne. Valgel taustal oli lihtsalt must joon.
Iga raja kohta 1000 koolitus ja juhuslikult genereeriti 1000 katsepilti.
Hindamisvõrgustikul oli üks varjatud kiht laiusega 500. Varjatud kihis kasutati sigmoidseid neuroneid.
Selle koolitas Stochastic Gradient Decent, fikseeritud õppemääraga 0,01, ja fikseeritud impulss 0,9.
Reguleerimist ega väljalangemist ei kasutatud. Samuti ei olnud mingit konvolutsiooni vms. Lihtne võrk, mis loodetavasti viitab sellele, et need tulemused üldistavad
Neid parameetreid on testkoodis väga lihtne kohandada ja ma julgustada inimesi seda tegema. (ja otsige testist vigu).
Tulemused
Minu tulemused on järgmised:
| | 500 prügikasti | skaalal 0-1 | Patt / Cos | skaalal 0-1 | Patt / Cos || | 1000 Iter | 1000 Iter | 1000 iterit 10 000 Iter | 10 000 iter |
| ------------------------ | -------------- | --------- ------- | -------------- | ---------------- | ---------- ---- || tähenda_viga | 0,4711263342 | 0,2225284486 | 2.099914718 | 0,1085846429 | 2.1036656318 || std (vead) | 1.1881991421 | 0,4878383767 | 1.485967909 | 0,2807570442 | 1.4891605068 || miinimum (vead) 1.83E-006 | 1.82E-005 | 9.66E-007 | 1.92E-006 | 5.82E-006 || mediaan (vead) | 0,0512168533 | 0,1291033982 | 1,8440767072 | 0,0562908143 | 1,8491085947 || maksimaalne (vead) 6.0749693965 | 4.9283551248 | 6.2593307366 | 3.735884823 | 6.2704853962 || täpsus | 0,00% | 0,00% | 0,00% | 0,00% | 0,00% || täpsus_punkti001 | 2,10% | 0,30% | 3,70% | 0,80% | 12,80% || täpsus_punkti01 | 21,90% | 4,20% | 37,10% | 8,20% | 74,60% || täpsus_punkti1 | 59,60% | 35,90% | 98,90% | 72,50% | 99,90% |
Kui viitan veale, on see närvivõrgu väljastatava nurga ja tegeliku nurga vahe absoluutväärtus. Nii et keskmine viga (näiteks) on selle erinevuse 1000 testjuhtumi keskmine. Ma ei ole kindel, et ma ei peaks seda uuesti skaleerima, tehes vea näiteks $ \ frac {7 \ pi} {4} $ olema võrdne veaga $ \ frac {\ pi} {4} $).
Esitan ka täpsust erinevatel detailsuse tasemetel. Täpsus on testjuhtumite osa, mille see eemaldati. Nii et täpsus_to_punkt01
tähendab, et see loeti õigeks, kui väljund oli tegeliku nurga all 0,01. Ükski esitus ei saavutanud ideaalseid tulemusi, kuid see pole üldse üllatav, arvestades ujukoma matemaatika toimimist. / p>
Kui vaatate selle postituse ajalugu, näete, et tulemustel on natuke müra, iga kord, kui ma seda kordan, on see veidi erinev. Kuid üldine väärtuste järjekord ja skaala jäävad samaks; võimaldades meil seega teha mõned järeldused.
Arutelu
Softmaxiga ühendamine toimib kõige halvemini, kuna ma ütlesin, et ma pole kindel, et ma pole rakenduses midagi keerutanud. See toimib siiski marginaalselt üle arvamise määra. kui see lihtsalt aimaks, saaksime keskmise vea $ \ pi $
sin / cos-kodeering toimiks oluliselt paremini kui skaleeritud 0-1-kodeering. Parandus on sel määral, et 1000 koolituse korral it / it / sin / cos toimib enamiku mõõdikute puhul umbes 3 korda paremini kui skaleerimine 10 000 iteratsiooni korral.
Ma arvan, et osaliselt on see seotud üldistuse parandamisega, kuna mõlemad said keskmise ruudu vea üsna sarnaseks treeningkomplekt, vähemalt üks kord tehti 10 000 kordust.
Selle ülesande parimal võimalikul täitmisel on kindlasti ülempiir, arvestades, et nurk võib olla enam-vähem mis tahes tegelik arv, kuid mitte kõik sellised inglid toodavad erinevaid jooni eraldusvõimega $ 101 \ times101 $ pikslit. Nii et kuna näiteks nurgad 45.0 ja 45.0000001 on mõlemad selle eraldusvõimega seotud sama pildiga, ei saa ükski meetod kunagi mõlemat täiesti õigeks.
Samuti tundub tõenäoline, et absoluutsel skaalal sellest esitusest kaugemale liikumiseks on parem närvivõrk orki on vaja. Selle asemel, et eksperimentaalses seadistuses ülalkirjeldatud väga lihtne olla.
Järeldus.
Tundub, et siin uuritud esituste põhjal on sin / cos-esitus kõige parem. See on loogiline, kuna sellel on ringis liikumisel sujuv väärtus. Mulle meeldib ka see, et pöördvõimalust saab teha arctan2 abil, mis on elegantne.
Usun, et esitatud ülesanne on võrgu jaoks mõistlik väljakutse esitamiseks piisav. Kuigi ma arvan, et tegelikult õpitakse lihtsalt kõverat sobitama väärtusele $ f (x) = \ frac {y1} {y2} x $, nii et võib-olla on see liiga lihtne. Ja võib-olla halvem võib see olla paaristatud esinduse eelistamine. Ma arvan, et see pole, aga siin on juba hilja, nii et mul võib olla midagi vahele jäänud. Kutsun teid uuesti minu koodi üle vaatama. Soovitage täiustusi või alternatiivseid ülesandeid.