이 글은...
Andrew Ng 교수의 Deep Learning 강좌 C1W2L10 까지의 내용을 정리한 것이다. 계산 그래프를 이용해서 미분 해보고 이를 로지스틱 회귀의 경사하강법에 적용해 보았다.
내용 요약
계산그래프로 미분하기

- 파라미터 $a$, $b$, $c$가 $J$의 결과값에 어떤 영향을 미치는지 알아낼 수 있음
- 위 그래프의 오른쪽에서 왼쪽으로 미분을 이용하여 파라미터 관계를 알아내는 방법을 설명함
- 이 때 미분의 연쇄법칙을 이용함
- ${dJ \over da} = {dJ \over dv}{dv \over da}$
- Andrew Ng 교수는 코드에서 미분값을 의미하는 변수를 선언할 때 아래처럼 표기하기로 함
- $d Finaloutputvar \over dvar$ -->
dvar
- $d Finaloutputvar \over dvar$ -->
로지스틱 회귀의 경사하강법

계산 그래프를 이용한 미분법으로 파라미터 $w_1$이 손실함수 $L$에 미치는 영향을 계산해보면 아래와 같음을 알 수 있다.
${dL \over dw_1} = x_1dz$
여기서 $dz$는 앞서 언급했던 표기법에 의해서 ${dL \over dz}$를 의미한다. 그리고 ${dL \over dz}$를 계산해보면 $a-y$가 나온다. 강의에서 교수님도 언급하셨지만, 미분을 직접 풀어내지 못해도 결과가 이렇게 나온다는 것을 알고 코드로 구현할 수 있으면 된다.
m개 샘플의 경사하강법
앞에서 배웠던 지식을 모두 종합하여 로지스틱 회귀의 경사하강법을 Pseudo code로 구현한다.
J = 0
dw_1 = 0
dw_2 = 0
b = 0
for i = 1 to m:
z[i] = w_t * x[i] + b
a[i] = sigmoid(z[i])
J += -(y_1 * log(a[i]) + (1 - y[i]) * log(1 - a[i]))
dz[i] = a[i] - y[i]
# 이곳에 for문 들어가게됨
dw_1 += x_1[i] * dz[i]
dw_2 += x_2[i] * dz[i]
db += dz[i]
J /= m
dw_1 /= m
dw_2 /= m
db /= m
w_1 := w_1 - alpha * dw_1
w_2 := w_2 - alpha * dw_2
b := b - alpha * db
위 코드에서는 명시적으로 표기된 for 문은 1개이지만 실제 구현하게 되면 for 문 2개가 중첩된다. (주석으로 표시한 부분) 이렇게 되면 효율이 높지 않기 때문에 벡터화(vectorization)라는 개념을 사용하게 될 것이라 한다. 벡터화를 사용하게 되면 for 문 없이 구현된다고 한다.
'연구 노트 > 머신러닝' 카테고리의 다른 글
[TIL] 210331 - Deep LearniNg (~C1W2L15) (0) | 2021.03.31 |
---|---|
[TIL] 210330 - Deep LearniNg (~C1W2L13) (0) | 2021.03.30 |
[TIL] 210326 - Deep LearniNg (~C1W2L07) (0) | 2021.03.26 |
[TIL] 210325 - Deep LearniNg (~C1W2L03) (0) | 2021.03.25 |
[TIL] 210324 - Deep LearniNg (~C1W1L04) (0) | 2021.03.24 |