I den foregående artikel “Introduktion til klassifikation og logistisk regression” beskrev jeg det matematiske grundlag for den logistiske regressionsalgoritme, hvis opgave er at adskille ting i træningseksemplet ved at beregne beslutningsgrænsen.
Den logistiske regressionsalgoritme kan beskrives ved hjælp af en ligning. Som ved lineær regression vil den logistiske regressionsalgoritme kunne finde de bedste \thetas parametre for at få beslutningsgrænsen til rent faktisk at adskille datapunkterne korrekt. I denne artikel vil vi se, hvordan man beregner disse \thetas.
Sæt, at vi har et generisk træningssæt
\{ (x^{(1)}, y^{(1)}), (x^{(2)}, y^{(2)}), \dots, (x^{(m)}, y^{(m)}) \}
udformet af m træningseksempler, hvor (x^{(1)}, y^{(1)}) er det 1. eksempel og så videre. Mere specifikt er x^{{(m)} inputvariablen for det m-te eksempel, mens y^{(m)} er dets outputvariabel. Da der er tale om et klassifikationsproblem, har hvert eksempel naturligvis output y, der er begrænset mellem 0 og 1. Med andre ord er y \i {0,1}.
Hvert eksempel repræsenteres som sædvanligt ved sin featurevektor
\vec{x} = \begin{bmatrix} x_0 \\ x_1 \\ \\dots \\ x_n \end{bmatrix}
hvor x_0 = 1 (det samme gamle trick). Dette er et generisk eksempel, vi kender ikke det nøjagtige antal features.
Sidst har vi hypotesefunktionen for logistisk regression, som vi så i den foregående artikel:
h_\theta(x) = \frac{1}{1 + e^{\theta^{\top} x}}}
Vores opgave er nu at vælge de bedste parametre \thetas i ovenstående ligning, givet det aktuelle træningssæt, for at minimere fejlene. Husk, at \theta ikke er en enkelt parameter: den udvider sig til ligningen for beslutningsgrænsen, som kan være en linje eller en mere kompleks formel (med flere \thetas at gætte).
Proceduren svarer til den, vi gjorde for lineær regression: definér en omkostningsfunktion og prøv at finde de bedst mulige værdier for hver \theta ved at minimere omkostningsfunktionens output. Minimeringen vil blive udført af en gradient descent-algoritme, hvis opgave er at analysere omkostningsfunktionens output, indtil den finder det laveste minimumspunkt.
Den omkostningsfunktion, der blev anvendt i lineær regression, vil ikke fungere her
Du husker måske den oprindelige omkostningsfunktion J(\theta), der blev anvendt i lineær regression. Jeg kan med det samme fortælle dig, at den ikke vil fungere her med logistisk regression. Hvis du forsøger at bruge den lineære regressions omkostningsfunktion til at generere J(\theta) i et logistisk regressionsproblem, vil du ende op med en ikke-konveks funktion: en mærkeligt formet graf uden et let at finde globalt minimumspunkt, som det ses på billedet nedenfor.
Dette mærkelige resultat skyldes, at vi i logistisk regression har den sigmoide funktion omkring, som er ikke-lineær (dvs. ikke en linje). Med den J(\theta), der er afbildet i figur 1. kan gradientafstigningsalgoritmen sidde fast i et lokalt minimumspunkt. Derfor har vi stadig brug for en pæn konveks funktion som ved lineær regression: en skålformet funktion, der letter gradient descent-funktionens arbejde med at konvergere mod det optimale minimumspunkt.
En bedre omkostningsfunktion til logistisk regression
Lad mig et øjeblik vende tilbage til den omkostningsfunktion, vi brugte ved lineær regression:
J(\vec{\theta}) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) – y^{(i)})^2
som kan omskrives på en lidt anden måde:
J(\vec{\theta}) = \frac{1}{m} \sum_{i=1}^{m} \frac{1}{2}(h_\theta(x^{(i)}) – y^{(i)})^2
Der skete ikke noget skræmmende: Jeg har bare flyttet \frac{1}{2} ved siden af summationsdelen. Lad os nu gøre det mere generelt ved at definere en ny funktion
\mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)})) = \frac{1}{2}(h_\theta(x^{(i)}) – y^{(i)})^2
Med andre ord, en funktion \mathrm{Cost}, der tager to parametre i input: h_\theta(x^{{(i)}) som hypotesefunktion og y^{(i)} som output. Man kan se det som den omkostning, algoritmen skal betale, hvis den laver en forudsigelse h_\theta(x^{{(i)}), mens den faktiske etiket var y^{(i)}.
Med denne nye brik i puslespillet kan jeg omskrive omkostningsfunktionen for den lineære regression som følger:
J(\theta) = \dfrac{1}{m}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)})
Vi ved imidlertid, at den lineære regressions omkostningsfunktion ikke kan anvendes i logistiske regressionsproblemer. Så hvad handler det her om? Jo, det viser sig, at vi for logistisk regression blot skal finde en anden \mathrm{Cost}-funktion, mens summationsdelen forbliver den samme.
Logistisk regressions omkostningsfunktion
For logistisk regression er \mathrm{Cost}-funktionen defineret som:
\mathrm{Cost}(h_\theta(x),y) =\begyn{cases}-\log(h_\theta(x)) & \text{hvis y = 1} \\-\log(1-h_\theta(x)) & \text{if y = 0}\end{cases}
Indekserne i er fjernet af hensyn til overskueligheden. Med andre ord er dette den omkostning, som algoritmen betaler, hvis den forudsiger en værdi h_\theta(x), mens det faktiske omkostningsmærke viser sig at være y. Ved at bruge denne funktion vil vi give konveksitet til den funktion, som gradientafstigningsalgoritmen skal behandle, som beskrevet ovenfor. Der findes også et matematisk bevis herfor, som ligger uden for rammerne af dette introduktionskursus.
I tilfælde y = 1 nærmer outputtet (dvs. de omkostninger, der skal betales) sig 0, efterhånden som h_\theta(x) nærmer sig 1. Omvendt vokser omkostningerne til at betale mod uendeligt, når h_\theta(x) nærmer sig 0. Det kan man tydeligt se i plot 2. nedenfor, venstre side. Dette er en ønskværdig egenskab: vi ønsker en større straf, når algoritmen forudsiger noget, der ligger langt fra den faktiske værdi. Hvis etiketten er y = 1, men algoritmen forudsiger h_\theta(x) = 0, er resultatet helt forkert.
Omvendt gælder den samme intuition, når y = 0, som er afbildet i plot 2. nedenfor, højre side. Større straffe, når etiketten er y = 0, men algoritmen forudsiger h_\theta(x) = 1.
Supplerende optimeringer af omkostningsfunktionen
Det, vi netop har set, er den mundrette version af omkostningsfunktionen for logistisk regression. Vi kan gøre den mere kompakt til et en-linjers udtryk: dette vil hjælpe med at undgå kedelige if/else-udsagn, når formlen konverteres til en algoritme.
\mathrm{Cost}(h_\theta(x),y) = -y \log(h_\theta(x)) – (1 – y) \log(1-h_\theta(x))
Bevis: Prøv at erstatte y med 0 og 1, og du vil ende med de to dele af den oprindelige funktion.
Med optimeringen på plads kan den logistiske regressions omkostningsfunktion omskrives som:
\begin{align}J(\theta) & = \dfrac{1}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)}) \\& = – \dfrac{1}{m}{m} \\\end{align}
Jeg har flyttet minustegnet udenfor for at undgå yderligere parenteser.
Sammenkobling af omkostningsfunktionen og gradientafstigningen
Hvad er der tilbage? Vi har hypotesefunktionen og omkostningsfunktionen: Vi er næsten færdige. Det er nu tid til at finde de bedste værdier for \thetas parametre i omkostningsfunktionen, eller med andre ord at minimere omkostningsfunktionen ved at køre gradientafstigningsalgoritmen. Fremgangsmåden er identisk med den, vi gjorde for lineær regression.
Mere formelt set ønsker vi at minimere omkostningsfunktionen:
\min_{\theta} J(\theta)
Hvilket vil give et sæt parametre \theta, de bedste (dvs. med mindre fejl). Når det er gjort, vil vi være klar til at foretage forudsigelser på nye inputeksempler med deres egenskaber x, ved at bruge de nye \thetas i hypotesefunktionen:
h_\theta(x) = \frac{1}{1 + e^{\theta^{\top} x}}
Hvor h_\theta(x) er outputtet, forudsigelsen eller endnu sandsynligheden for, at y = 1.
Måden, hvorpå vi skal minimere omkostningsfunktionen, er ved hjælp af gradientafstigning. Den gode nyhed er, at proceduren er 99% identisk med det, vi gjorde for lineær regression.
For at minimere omkostningsfunktionen skal vi køre gradient descent-funktionen på hver parameter:
\begin{align} \text{gennemfør indtil konvergens \{} \\\\theta_j & := \theta_j – \alpha \frac{\partial}{\partial \theta_j} J(\theta) \\ \text{\}}}\end{align}
Husk at opdatere alle \theta_j samtidigt, som vi gjorde i den lineære regressions modstykke: hvis du har n funktioner, dvs. en funktionsvektor \vec{\theta} = , skal alle disse parametre opdateres samtidigt ved hver iteration:
\begin{align} \text{gennemfør indtil konvergens \{} \\\\theta_0 & := \cdots \\ \theta_1 & := \cdots \\ \\cdots \\ \\theta_n & := \cdots \\ \\ \text{\}}\end{align}
Tilbage til algoritmen, jeg vil spare jer for beregningen af den skræmmende afledte \frac{\partial}{\partial \theta_j} J(\theta), som bliver:
\frac{\partial}{\partial \theta_j} J(\theta) = \dfrac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) – y^{(i)}) x_j^{(i)}
Så ovenstående sløjfe kan omskrives som:
\begin{align} \text{repeat until convergence \{} \\\\theta_j & := \theta_j – \alpha \dfrac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) – y^{(i)}) x_j^{(i)} \\ \text{\}}\end{align}
Overraskende nok ser det identisk ud med det, vi gjorde for den multivariate lineære regression. Det, der dog er ændret, er definitionen af hypotesen h_\theta(x): for lineær regression havde vi h_\theta(x) = \theta^{{\top}{x}, mens vi for logistisk regression har h_\theta(x) = \frac{1}{1 + e^{\theta^{{\top} x}}.
Fra nu kan du anvende de samme teknikker til at optimere gradientafstigningsalgoritmen, som vi har set for lineær regression, for at sikre, at konverteringen til minimumspunktet fungerer korrekt. I næste kapitel vil jeg dykke ned i nogle avancerede optimeringstricks, samt definere og undgå problemet med overfitting.