W jaki sposób wyprowadza się funkcję kosztu z regresji logistycznej

29

Robię kurs Machine Learning Stanford na Coursera.

W rozdziale dotyczącym regresji logistycznej funkcja kosztu jest następująca: wprowadź opis zdjęcia tutaj

Następnie uzyskuje się tutaj: wprowadź opis zdjęcia tutaj

Próbowałem uzyskać pochodną funkcji kosztu, ale dostałem coś zupełnie innego.

Jak otrzymuje się pochodną?

Jakie są kroki pośrednie?

oktawski
źródło
+1, sprawdź odpowiedź @ AdamO w moim pytaniu tutaj. stats.stackexchange.com/questions/229014/…
Haitao Du
„Całkowicie inny” nie jest tak naprawdę wystarczający, aby odpowiedzieć na twoje pytanie, poza tym, że mówi ci to, co już wiesz (prawidłowy gradient). Byłoby o wiele bardziej przydatne, gdybyś dał nam wynik swoich obliczeń, a następnie pomożemy ci znaleźć się tam, gdzie popełniłeś błąd.
Matthew Drury,
@MatthewDrury Przepraszam, Matt, ułożyłem odpowiedź tuż przed pojawieniem się twojego komentarza. Octavian, czy wykonałeś wszystkie kroki? Przeredaguję, aby później dodać mu pewną wartość dodaną ...
Antoni Parellada,
2
kiedy mówisz „pochodny”, czy masz na myśli „zróżnicowany” czy „pochodny”?
Glen_b

Odpowiedzi:

41

Na podstawie notatek z kursu, które nie są dostępne (w tym to wyprowadzenie) poza notatkami wniesionymi przez studentów na stronie kursu Coursera Machine Learning Andrew Ng .


W dalszej części indeks górny oznacza poszczególne pomiary lub „przykłady” treningu.(i)

J(θ)θj=θj1mi=1m[y(i)log(hθ(x(i)))+(1y(i))log(1hθ(x(i)))]=linearity1mi=1m[y(i)θjlog(hθ(x(i)))+(1y(i))θjlog(1hθ(x(i)))]=chain rule1mi=1m[y(i)θjhθ(x(i))hθ(x(i))+(1y(i))θj(1hθ(x(i)))1hθ(x(i))]=hθ(x)=σ(θx)1mi=1m[y(i)θjσ(θx(i))hθ(x(i))+(1y(i))θj(1σ(θx(i)))1hθ(x(i))]=σ1mi=1m[y(i)σ(θx(i))(1σ(θx(i)))θj(θx(i))hθ(x(i))(1y(i))σ(θx(i))(1σ(θx(i)))θj(θx(i))1hθ(x(i))]=σ(θx)=hθ(x)1mi=1m[y(i)hθ(x(i))(1hθ(x(i)))θj(θx(i))hθ(x(i))(1y(i))hθ(x(i))(1hθ(x(i)))θj(θx(i))1hθ(x(i))]=θj(θx(i))=xj(i)1mi=1m[y(i)(1hθ(x(i)))xj(i)(1yi)hθ(x(i))xj(i)]=distribute1mi=1m[yiyihθ(x(i))hθ(x(i))+y(i)hθ(x(i))]xj(i)=cancel1mi=1m[y(i)hθ(x(i))]xj(i)=1mi=1m[hθ(x(i))y(i)]xj(i)


Pochodną funkcji sigmoidalnej jest

ddxσ(x)=ddx(11+ex)=(1+ex)(1+ex)2=ex(1+ex)2=(11+ex)(ex1+ex)=(11+ex)(1+ex1+ex11+ex)=σ(x)(1+ex1+exσ(x))=σ(x)(1σ(x))

Antoni Parellada
źródło
1
+1 za wszystkie wysiłki !, może użycie zapisu macierzowego może być łatwiejsze?
Haitao Du
czy mogę powiedzieć w regresji liniowej, celem jest a pochodna to , gdzie , w regresji logistycznej jest podobne, pochodna to gdzie , a ? Axb22ATee=AxbATee=pbp=sigmoid (Ax)
Haitao Du
2
dlatego doceniam twój wysiłek. spędzasz czas na języku OP!
Haitao Du
1
Rozumiem, że istnieją problemy z wypukłością, które sprawiają, że minimalizacja błędu kwadratu jest niepożądana dla nieliniowych funkcji aktywacyjnych. W notacji macierzowej będzie to . J(θ)θ=1mX(σ(Xθ)y)
Antoni Parellada,
1
@MohammedNoureldin Właśnie wziąłem pochodną cząstkową w licznikach w poprzednim wierszu, stosując regułę łańcucha.
Antoni Parellada,
8

Aby uniknąć wrażenia nadmiernej złożoności materii, spójrzmy tylko na strukturę rozwiązania.

Z uproszczeniem i pewnym nadużyciem notacji, niech będzie terminem w sumie , a jest funkcją : G(θ)J(θ)h=1/(1+ez)z(θ)=xθ

G=ylog(h)+(1y)log(1h)

Możemy użyć zasadę łańcucha: i rozwiązać jeden po one ( i są stałe).dGdθ=dGdhdhdzdzdθxy

dGh=yh1y1h=yhh(1h)
Dla sigmoid utrzymuje, co jest tylko mianownikiem poprzedniej instrukcji.dhdz=h(1h)

Na koniec .dzdθ=x

Łączenie wyników razem daje poszukiwane wyrażenie: Nadzieja, która pomaga.

dGdθ=(yh)x
garej
źródło
0

Podziękowania dla tej odpowiedzi należą się Antoniemu Parelladzie z komentarzy, które moim zdaniem zasługują na bardziej znaczące miejsce na tej stronie (ponieważ pomogło mi to, gdy wiele innych odpowiedzi tego nie zrobiło). Ponadto, nie jest to pełne wyprowadzenie, ale bardziej wyraźne stwierdzenie . (Aby uzyskać pełne wyprowadzenie, zobacz inne odpowiedzi).J(θ)θ

J(θ)θ=1mXT(σ(Xθ)y)

gdzie

XRm×n=Training example matrixσ(z)=11+ez=sigmoid function=logistic functionθRn=weight row vectory=class/category/label corresponding to rows in X

Ponadto implementacja w języku Python dla tych, którzy chcą obliczyć gradient w odniesieniu do .Jθ

import numpy
def sig(z):
return 1/(1+np.e**-(z))


def compute_grad(X, y, w):
    """
    Compute gradient of cross entropy function with sigmoidal probabilities

    Args: 
        X (numpy.ndarray): examples. Individuals in rows, features in columns
        y (numpy.ndarray): labels. Vector corresponding to rows in X
        w (numpy.ndarray): weight vector

    Returns: 
        numpy.ndarray 

    """
    m = X.shape[0]
    Z = w.dot(X.T)
    A = sig(Z)
    return  (-1/ m) * (X.T * (A - y)).sum(axis=1) 
CiaranWelsh
źródło
0

Dla tych z nas, którzy nie są tak silni w rachunku różniczkowym, ale chcieliby bawić się dostosowując funkcję kosztów i muszą znaleźć sposób na obliczenie pochodnych ... skrót do rachunku ponownego uczenia się to narzędzie online do automatycznego zapewniania wyprowadzenie, wraz z objaśnieniami krok po kroku reguły.

https://www.derivative-calculator.net

Przykład obliczania funkcji kosztu aktywacji sigmoidalnej w regresji logistycznej

Yaoshiang
źródło