A korábbi bejegyzésünkben elmélyedtünk abban, hogy miért használunk a logisztikus regresszióhoz egy szimmoid függvényt a normál lineáris függvény helyett. Ebben a bejegyzésben folytatjuk a költségfüggvény megosztását.
A költségfüggvény azért fontos, mert megadja az előrejelzéseink hibáit, és ezt követően szükség van rá a tanulási algoritmusunkhoz. Konkrétan, szeretnénk minimalizálni az előrejelzéseink hibáit, azaz minimalizálni a költségfüggvényt. Ideális esetben, ha minden hibánk nulla, az olyan, mintha egy darts-játékot játszanánk, amelyben minden nyílvesszőnk célba találna. Az érvelés másik oldalán, ha a hibáink nagyon nagyok, ez azt jelenti, hogy a megjósolt értékeink nem találják el az összes valódi megfigyelt értéket, azaz a dartsunk általában nem találja el a célt.
Míg a költségfüggvényünk futtatásakor a feltételezett értékeinkkel (tökéletes előrejelzés minden értékre) nulla hibát szeretnénk elérni, ez nem biztos, hogy jó forgatókönyv, mivel ez a “nagy variancia” nevű jelenséghez vezethet. Erre a későbbi írásokban még kitérünk.
A veszteségfüggvény megfogalmazására visszatérve, egy tipikus veszteségfüggvény a négyzetes hibák összegének minimalizálása lenne, azaz.
Ez a függvény azonban az optimalizálási folyamat során több lokális optimumot is eredményezhet, ami azt jelenti, hogy az optimalizált megoldásunk nem feltétlenül a legoptimálisabb (van rá esély, hogy van jobb megoldás is). Ideális esetben azt szeretnénk, ha az optimalizált megoldás nem a lokális minimum, hanem a globális minimum lenne.
A fenti ábrán látható módon előfordulhat, hogy véletlenül inicializáljuk a paramétereket, és a lokális minimumra optimalizáljuk őket anélkül, hogy elérnénk a “valódi” globális minimumot. Ezért a fent említett veszteségfüggvény nem lenne ideális számunkra.
Mi lehet akkor a veszteségfüggvényünk?
A logisztikai regresszióhoz általánosan használt egyik veszteségfüggvény a következő:
Figyelem, a költséget és a veszteséget felváltva használtam, de azok számára, akik Andrew Ng előadásaihoz szoktak, a “veszteségfüggvény” egyetlen képzési példára vonatkozik, míg a “költségfüggvény” az összes képzési példa átlagát veszi.
Hogy lássuk, miért van értelme ennek a veszteségfüggvénynek: Feltételezve, hogy y = 1, és a felső egyenletre összpontosítva, -log(h⊖(x)), azt akarjuk, hogy nagyon negatív legyen, mivel ez egy veszteségfüggvény (Emlékezzünk vissza, hogy a veszteségfüggvényt mint célkitűzést akarjuk minimalizálni). Ennek eredményeként h⊖(x) nagy lesz. Ennek ellenére emlékezzünk arra, hogy h⊖(x) az 1 maximális értékre korlátozódik, mivel a Sigmoid függvény a becsült hipotézisértéket 0 és 1 között korlátozza:
h⊖(x) = ŷ = σ(z)
Ezért, ha y=1, akkor a veszteségfüggvényünk a szélsőértékig minimalizált, ha ŷ = 1. Tökéletes előrejelzés, amelynél alig vagy egyáltalán nem keletkezik veszteség/költség.
Megfordítva, ha y = 0, és az egyenlet alsó részére koncentrálva, -log(1- h⊖(x)). A veszteségminimalizálási célunk miatt szeretnénk, ha ez nagyon negatív lenne. Ennek eredményeképpen 1- h⊖(x) nagyon nagy lenne, és ennek következménye, hogy h⊖(x) nagyon kicsi lenne. Emlékezzünk azonban arra, hogy h⊖(x) a minimális 0 értékre korlátozódik, mivel a Sigmoid függvény a becsült hipotézisértéket 0 és 1 közé teszi.
Ezért, ha y=0, akkor a veszteségfüggvényt a végletig minimalizáltuk, amikor ŷ = 0. Tökéletes előrejelzés, amelynél alig vagy egyáltalán nem keletkezik veszteség/költség.
A fenti pontokat a megfelelő grafikonok szemléltetik:
Amint a bal oldali grafikonon látható (y = -log(h⊖(x)), ha y = 1, a költség 0-ra megy, ha a feltételezett érték 1, és végtelenbe megy, ha a feltételezett érték közel van a 0-hoz.
A jobb oldali grafikon (y = -log(1 – h⊖(x)), ha y = 0, a költség 0-ra megy, ha a feltételezett érték 0, és a végtelenbe megy, ha a feltételezett érték közel van az 1-hez.
A kettőt egy takaros egyenletben kombinálva megkapjuk a logisztikai regresszió költségfüggvényét m gyakorló példával:
mivel i 1-től m-ig terjed m gyakorló példára.
A mesterséges intelligenciában és a gépi tanulásban sok jelöléssel dobálóznak, és hasznos lenne, ha eligazodnánk rajtuk.
A logisztikai regressziós modell képzésénél arra törekszünk, hogy megtaláljuk azokat a paramétereket, “w” és “b”, amelyek minimalizálják a teljes költségfüggvényt. A következő cikkben érintjük a következő fontos szegmenst, a Gradient Descentet.
Numpy-ban a következőképpen kódolhatjuk a költségfüggvényt:
import numpy as npcost = (-1/m) * np.sum(Y*np.log(A) + (1-Y)*(np.log(1-A)))
Magyarázom:
- Az np.sum összegez a tömb elemei felett (Y*np.log(A) + (1-Y)*(np.log(1-A)), ami ebben az esetben az összes képzési példa felett összegezne. Bővebben itt olvashatsz.
- Az np.log a természetes logot veszi elemenként a tömb elemeire. Bővebben itt.
- A “*” egy tömb elemeit veszi és elemenként megszorozza egy másik tömb elemeivel. Ez nem mátrixszorzás, amely mindkét tömbtől alaki követelményt támaszt: Az első tömb oszlopainak számának meg kell egyeznie a második tömb sorainak számával.