I vores tidligere indlæg dykkede vi ned i årsagerne bag brugen af en sigmoid funktion til den logistiske regression frem for en normal lineær funktion. I dette indlæg vil vi fortsætte med at dele om omkostningsfunktionen.
Kostfunktionen er vigtig, fordi den giver os fejlene i vores forudsigelser og efterfølgende er nødvendig for vores læringsalgoritme. Helt konkret vil vi gerne minimere fejlene i vores forudsigelser, dvs. minimere omkostningsfunktionen. Ideelt set, hvis alle vores fejl er nul, svarer det til at spille et dartspil, hvor alle vores dartpile rammer lige i kugleøjet. På den anden side af argumentet betyder det, at hvis vores fejl er meget store, betyder det, at vores forudsagte værdier mangler alle de sande observerede værdier, dvs. at vores dartpile generelt ikke rammer plet.
Selv om vi gerne vil have nul fejl, når vi kører vores omkostningsfunktion med vores hypoteser (perfekt forudsigelse for hver værdi), er dette måske ikke et godt scenarie, da det kan føre til et fænomen kaldet “høj varians”. Vi vil komme nærmere ind på dette spørgsmål i senere artikler.
For at vende tilbage til formuleringen af tabsfunktionen, vil en typisk tabsfunktion være at minimere summen af kvadrerede fejl, dvs.
Denne funktion kan dog give anledning til flere lokale optimeringer i løbet af optimeringsprocessen, hvilket betyder, at din optimerede løsning måske ikke er den mest optimerede (der er en chance for, at der kan være en bedre løsning). Ideelt set ønsker vi, at den optimerede løsning skal være det globale minimum, snarere end det lokale minimum.
Som det fremgår af ovenstående diagram, kan vi utilsigtet initialisere parametrene og optimere dem til det lokale minimum uden at nå det “sande” globale minimum. Derfor ville den førnævnte tabsfunktion ikke være ideel for os at bruge.
Hvad kunne vores tabsfunktion så være?
En tabsfunktion, der almindeligvis anvendes til logistikregression, er denne:
Bemærk, at jeg brugte omkostninger og tab i flæng, men for dem, der er vant til Andrew Ng’s foredrag, er “tabsfunktionen” for et enkelt træningseksempel, mens “omkostningsfunktionen” tager gennemsnittet over alle træningseksempler.
For at se, hvorfor denne tabsfunktion giver mening: Hvis vi antager y = 1 og fokuserer på den øverste ligning, -log(h⊖(x)), ønsker vi, at den skal være meget negativ, da dette er en tabsfunktion (Husk, at vi ønsker at minimere tabsfunktionen som et mål). Som følge heraf vil h⊖(x) være stor. Når det er sagt, skal man huske, at h⊖(x) er begrænset til den maksimale værdi på 1 på grund af den sigmoide funktion, der begrænser den estimerede hypoteseværdi mellem 0 og 1:
h⊖(x) = ŷ = σ(z)
Herfor har vi, når y=1, tabsfunktionen minimeret til det ekstreme, når ŷ = 1. En perfekt forudsigelse, som har lidt eller ingen tab/omkostninger pådraget sig.
Omvendt, hvis y = 0, og med fokus på den nederste del af ligningen, -log(1- h⊖(x)). Vi kan godt lide, at dette er meget negativt på grund af vores målsætning om tabsminimering. Som følge heraf vil 1- h⊖(x) være meget stor, og konsekvensen heraf vil være, at h⊖(x) vil være meget lille. Husk dog på, at h⊖(x) er begrænset til minimumsværdien 0 på grund af den sigmoide funktion, der gør den estimerede hypoteseværdi mellem 0 og 1.
Dermed har vi, når y=0, en tabsfunktion, der er minimeret til det ekstreme, når ŷ = 0. En perfekt forudsigelse, som har lidt eller ingen tab/omkostninger påført.
De tilsvarende grafer vil illustrere ovenstående punkter:
Som du kan se på den venstre graf (y = -log(h⊖(x))), når y = 1, går omkostningerne til 0, når den antagne værdi er 1, og går til uendelig, når den antagne værdi er tæt på 0.
På samme måde er den højre graf (y = -log(1 – h⊖(x)), når y = 0, går omkostningerne til 0, når den hypotetiske værdi er 0, og går til uendelig, når den hypotetiske værdi er tæt på 1.
Kombinerer man begge dele i en pæn ligning, får man omkostningsfunktionen for logistikregression med m træningseksempler:
hvorved i går fra 1 til m for m træningseksempler.
I AI og maskinlæring vil der blive kastet rundt med mange notationer, og det vil være nyttigt at få en fornemmelse af dem.
Ved træning af logistikregressionsmodellen tilstræber vi at finde de parametre, “w” og “b”, der minimerer den samlede omkostningsfunktion. I næste artikel vil vi berøre det næste vigtige segment, Gradient Descent.
I numpy kan vi kode omkostningsfunktionen på følgende måde:
import numpy as npcost = (-1/m) * np.sum(Y*np.log(A) + (1-Y)*(np.log(1-A)))
For at forklare:
- np.sum summerer over elementerne i arrayet (Y*np.log(A) + (1-Y)*(np.log(1-A)), hvilket i dette tilfælde ville være summen over alle træningseksemplerne. Læs mere her.
- np.log tager den naturlige logaritme, elementvis for elementerne i arrayet. Se mere her.
- “*” tager elementerne i et array og multiplicerer dem, elementvis, med elementerne i et andet array. Dette er ikke matrixmultiplikation, som har et formkrav fra begge arrays: Antallet af kolonner i det første array skal være lig med antallet af rækker i det andet array.