Data/Data Science

[deeplearning.ai] Coursera 필기정리 1

재융 2020. 7. 2. 13:20
반응형

 

Logistic Regression cost function

로지스틱 회귀란 binarary classification을 위한 알고리즘이라고하는데. 회귀분석 모델에서 W와 b파라미터를 트레이닝시키기 위해서는 cost function을 정의해야함

 

한가지 방법은 L = 1/2(y' - y) 인데 로지스틱 회귀분석법에서는 이렇게 잘하지않는다고함. 이유는 이러한 공식으로 하게된다면 local optimization 문제를 갖게되고 global optimization을 못찾게된다고함. 즉, Gradient Descent가 잘안나온다는 단점이있음. 따라서 로지스틱 회귀분석법에는 다른 방식의 cost function을 이용하게됨. regression loss함수를 사용한다고 나옴(빨간 밑줄 공식).

 

J(w,b)=m1i=1mL(yhat(i),y(i))=m1i=1m(y(i)logyhat(i)+(1y(i))log(1yhat(i)))

 

loss function은 single training example에서의 오차값, cost function은 파라미터의 오차값(즉, all training example)을 나타냄. 따라서 로지스틱 회귀모델을 학습을 시킨다는뜻은, W와 B라는 최적의 파라미터 값을 찾고 cost function의 최소값을 찾는것.

 

Gradient Descent

w,b 값 업데이트는 원래의 w값에서 learning rate(사진에서는 알파) 곱하기 cost function의 업데이트 값 대상으로 미분(w면 dw, b면 db, d: derivatives미분)된 값을 빼면 됨. 사진에서의 밑에 두개 수식.

Derivatives (미분)

사실 수학을 배우신분들이라면 잘 아시는 내용일듯. 나도 복습차원에서 다시공부

미분이란 특정 그래프를 미분할경우 해당 지점의 기울기 값을 얻을수가있음

- 직선의 형태의 그래프는 어느 구간에서 기울기를 계산해도 똑같은 값이 나옴

- 직선의 형태의 그래프가 아닐경우 미분을 하면 기울기 값의 함수를 얻을 수가 있음

Computation Graph

forward propagation -> Computation Graph로 설명 cost function값이 나오는 과정

back propagation -> Computation Graph에서 맨 마지막 노드의 값을 어떻게 해야 줄일지 forward propagation방식을 거꾸로 거치는 과정

Derivatives with a Computation Graph

back propagation 의 예제로 앞서 설명한 Computation Graph로 설명함.

사실 J에서 모든 식을 풀어 놓은다음에 input 변수에 따라서 미분하는 방식으로 진행하면될듯. 만약에 변수가 남아있는 미분식이 나온다면 앞에 나온 미분값으로 분해. 예를들어서 dj/db (j를 b로 미분) 값을 얻고싶은데 j를 풀어 헤치면 j = 3a + 3bc. j에서 b로 미분을 진행하면

j' = 3c 가 나오게 되는데 c의 값을 얻을 수가없음. 이럴땐 dj/db = dj/du * du/db 이런식으로 b 앞에있는 식 (u=bc)를 이용하여 계산.

The derivative of a final output variable with respect to various intermediate quantities

Logistic Regression Gradient Descent

일단 1개의 학습 데이터 대상으로 보았을 때, 특성 두개 (x1, x2)가 있는 로지스틱 회귀모델을 학습시킨다고했을 때, yhat(또는, a)은 예측 값이고, L(a,y)은 loss function이다. 그림과 같이 loss function의 값을 계산하게 된다. 이제 진행해야하는건 w1, w2, b 파라미터를 어떻게 조정해야지 loss function이 줄어들지 이다. 따라서 이제 앞서 배운 미분을 이용하여 파라미터를 얼마나 조정해야하는지 계산을 해야한다.

yhat은 예측 값, L(a,y)는 loss function, z는 logistic function

loss function에서의 dw1, dw2, db값을 계산하여 learning rate값과 곱한 값을 w1, w2, b에 업데이트 해줘야한다(그림 오른쪽 아래).

그림에서 보면 결국 dz는 a-y인데 이걸 유도하는 공식은 다음 링크에서 볼수가 있다

https://www.coursera.org/learn/neural-networks-deep-learning/discussions/weeks/2/threads/ysF-gYfISSGBfoGHyLkhYg

 

Coursera | Online Courses & Credentials From Top Educators. Join for Free | Coursera

Learn online and earn valuable credentials from top universities like Yale, Michigan, Stanford, and leading companies like Google and IBM. Join Coursera for free and transform your career with degrees, certificates, Specializations, & MOOCs in data science

www.coursera.org

이제 m개의 학습 데이터가 있을때는 마지막에 계산된 dw1, dw2, db등에 1/m을 곱해줘야한다.

Vectorization

vectorization은 for loop을 제거하기 위해서 만들어진것인데. 로지스틱 회귀모델에서는 총 두개의 for loop가 활용된다. 첫번째로는 m개의 학습데이터에 대한 for loop, 두번째로는 n개의 Feature를 가진 학습데이터의 w,b값을 업데이트할때의 for loop이다. for loop는 시간복잡도에 의하면 굉장히 컴퓨팅 파워가 많이 필요로하는 계산인데. 여기서 for loop를 없애기위해서 vectorization을 이용한다.

z 란 n차원의 w 벡터와 x벡터를 곱해야 나오는 결과 값인데. 만일 non-vectorized이면 for loop를 통해서 인자 한개한개씩 곱해준다음에 마지막에 b의 값을 더해줘야한다.

하지만 vectorized이면 numpy 라이브러리를 이용하여 간단한 한줄 코드로 계산할수 있게된다.

 

해당 강의에서 실제로 for loop를 이용한 계산시간과 numpy 를 이용한 계산시간을 비교하는데 거의 300~400배 시간 차이가 난다. numpy는 100만 차원의 벡터를 곱했을때 약 1.5초~3초 시간이 걸린다. numpy에서는 별도의 계산방법을 사용한다고한다.

 

vectorization을 이용하면 밑에 엑스박스 쳐저있는곳을 numpy로 변경할수있다.

 

반응형