Från vårt tidigare inlägg fördjupade vi oss i orsakerna bakom att använda en Sigmoid-funktion för logistisk regression istället för en normal linjär funktion. I det här inlägget fortsätter vi att dela med oss av kostnadsfunktionen.
Kostnadsfunktionen är viktig eftersom den ger oss felen i våra förutsägelser och därefter behövs för vår inlärningsalgoritm. Konkret vill vi gärna minimera felen i våra förutsägelser, dvs. minimera kostnadsfunktionen. Om alla våra fel är noll är det som att spela en pilmatch där alla våra pilar träffar mitt i prick. Å andra sidan, om våra fel är mycket stora, innebär det att våra förutsägelser saknar alla de sanna observerade värdena, dvs. att våra pilar i allmänhet inte träffar mitt i prick.
Vi vill gärna ha noll fel när vi kör vår kostnadsfunktion med våra antagna värden (perfekt förutsägelse för varje värde), men det är kanske inte ett bra scenario eftersom det kan leda till ett fenomen som kallas ”hög varians”. Vi kommer att beröra detta mer i senare skrifter.
Om vi återgår till att formulera förlustfunktionen skulle en typisk förlustfunktion vara att minimera summan av kvadrerade fel, dvs.
Denna funktion kan dock ge upphov till flera lokala optimeringar under optimeringsprocessen, vilket innebär att din optimerade lösning kanske inte är den mest optimerade (det finns en chans att det kan finnas en bättre lösning). Helst vill vi att den optimerade lösningen ska vara det globala minimumet, snarare än det lokala minimumet.
Som framgår av diagrammet ovan kan vi oavsiktligt initialisera parametrarna och optimera dem till det lokala minimumet utan att nå det ”sanna” globala minimumet. Därför skulle den ovannämnda förlustfunktionen inte vara idealisk för oss att använda.
Vad skulle vår förlustfunktion då kunna vara?
En förlustfunktion som vanligtvis används för logistikregression är denna:
Observera att jag använde kostnad och förlust omväxlande, men för de som är vana vid Andrew Ngs föreläsningar, så gäller ”förlustfunktionen” för ett enskilt träningsexempel medan ”kostnadsfunktionen” tar genomsnittet över alla träningsexempel.
För att se varför denna förlustfunktion är meningsfull: Om vi antar att y = 1 och fokuserar på den översta ekvationen, -log(h⊖(x)), vill vi att den ska vara mycket negativ eftersom detta är en förlustfunktion (Kom ihåg att vi vill minimera förlustfunktionen som ett mål). Som ett resultat kommer h⊖(x) att vara stor. Med det sagt, kom ihåg att h⊖(x) är begränsad till det maximala värdet 1 på grund av att Sigmoid-funktionen begränsar det uppskattade hypotesvärdet mellan 0 och 1:
h⊖(x) = ŷ = σ(z)
Därmed, när y=1, har vi förlustfunktionen minimerad till det extrema när ŷ = 1. En perfekt förutsägelse som har liten eller ingen förlust/kostnad som uppstått.
Omvänt, om y = 0, och med fokus på den nedre delen av ekvationen, -log(1- h⊖(x)). Vi vill att detta ska vara mycket negativt på grund av vårt mål att minimera förlusterna. Som ett resultat av detta skulle 1- h⊖(x) vara mycket stor, och följden av detta skulle vara att h⊖(x) skulle vara mycket liten. Kom dock ihåg att h⊖(x) är begränsad till minimivärdet 0 på grund av att den sigmoida funktionen gör att det uppskattade hypotesvärdet ligger mellan 0 och 1.
Därmed har vi, när y=0, en förlustfunktion som minimeras till det extrema när ŷ = 0. En perfekt förutsägelse som har liten eller ingen förlust/kostnad som uppstår.
Dess motsvarande grafer illustrerar ovanstående punkter:
Som du kan se i den vänstra grafen (y = -log(h⊖(x)), när y = 1, går kostnaden till 0 när det antagna värdet är 1 och går till oändlighet när det antagna värdet är nära 0.
På liknande sätt är den högra grafen (y = -log(1 – h⊖(x)), när y = 0, går kostnaden till 0 när det antagna värdet är 0 och går till oändlighet när det antagna värdet är nära 1.
Kombinera båda i en snygg ekvation så får du kostnadsfunktionen för logistikregression med m träningsexempel:
därvid i går från 1 till m för m träningsexempel.
I AI och maskininlärning kommer det att finnas många beteckningar som används och det skulle vara bra att få en uppfattning om dem.
När vi tränar logistikregressionsmodellen strävar vi efter att hitta de parametrar, ”w” och ”b”, som minimerar den totala kostnadsfunktionen. I nästa artikel kommer vi att beröra nästa viktiga segment, Gradient Descent.
I numpy kan vi koda kostnadsfunktionen på följande sätt:
import numpy as npcost = (-1/m) * np.sum(Y*np.log(A) + (1-Y)*(np.log(1-A)))
För att förklara:
- np.sum summerar över elementen i matrisen (Y*np.log(A) + (1-Y)*(np.log(1-A)), vilket i det här fallet skulle vara summan över alla träningsexempel. Läs mer här.
- np.log tar den naturliga loggen, elementvis för elementen i matrisen. Läs mer här.
- ”*” tar elementen i en array och multiplicerar dem, elementvis, med elementen i en annan array. Detta är inte matrismultiplikation, som har ett formkrav från båda matriserna: Det krävs att antalet kolumner i den första matrisen är lika med antalet rader i den andra matrisen.