brunch

매거진 딥러닝 101

You can make anything
by writing

C.S.Lewis

by TUGU Jan 05. 2019

m개의 데이터에 대한 Gradient Descent

딥러닝 101_Chapter 11

지난 글에서는 1개의 데이터에 대한 Logistic Regression의 Back Propagation 및 Gradient Descent의 과정에 대해서 알아보았다.  복습하실 분들은 옆 링크 참조. https://brunch.co.kr/@minsukshin/32 


그런데 학습은 물론 1개의 데이터로만 이루어지지 않는다. 100개, 100개, 혹은 수십, 수백만 개의 데이터로 학습이 진행된다. 특히 딥러닝에 있어서는 학습에 사용되는 데이터의 수는 많으면 많을수록 좋다.  데이터의 개수가 m 개일 때의 logistict regression의 과정을 알아보자. 




m 개의 데이터에 대한 Cost 함수는 어려울 것 없다.  1번째 데이터의 loss 값, 2번째 데이터의  loss 값,,, m 번째 데이터의 loss 값을 모두 합한 후 m으로 나누어 평균값을 구하는 것이다. 이것이 m 개의 데이터에서의 Cost의 정의이다. 여기서 위 첨자 (i)는 i 번째의 데이터를 뜻한다. 수식에서 보듯이 시그마  i=1부터 m까지의 데이터를 합하는 것일 뿐이다.  

m 개의 데이터에서 Cost 함수 J(w, b)


그리고 Gradient Descent 알고리즘을 이용하여 파라미터 w, b를 업데이트하는 과정을 아래 Pseudocode를 통해 한번 살펴보자. (Pseudocode란 coding 문법에 맞지 않지만 의미적으로 이해하기 쉽게 적어놓은 약식 code를 의미한다)


m 개의 데이터에서의 Logistic Regression과 Gradient Descent



위의 Pseudocode를 위에서부터 순차적으로 분석해보겠다.


1) 우선 가장 첫 번째로 J, dw1, dw2, db를 모두 0으로 초기화 시킨다. 


2) 그리고 For 구문을 써서 i=1부터 m까지 반복해가며  Cost 함수를 구한다

물론 이 과정에서 z = wx + b, 그리고 활성함수를 통하는 a = σ (z)의 값을 구하고 Cost 함수인 J를 구해야 한다. 이때 모든 수식에서는 1번째 데이터부터 m 번째 데이터의 값이 각각 따로 구해지게 된다.




3) 그리고 뒤이어 Backpropagation과 Gradient Descent 실행을 위하여 dz, dw1, dw2, db의 값을 구한다. 

여기서는 w가 2개밖에 안되지만, 일반적으로 딥러닝에서는 무수히 많은 w1, w2, w3.......... 가 필요하다. 예를 들어 w가 1000개라면 위의 code 형식에서는 1000줄의 반복적인 code를 작성해야 할 것이다. 그래서 여기서도 사실 For 구문이 한 번 더 필요할 것이다. 다만 여기서는 2개의 w 값만 있기 때문에 그냥 일일이 적은 것 일 뿐이다.

이 수식에서 += 의미는 더한 값으로 업데이트한다는 뜻이다. dw1 += x*dz는 dw1+x*dz를 다시 dw1에 덮어쓰기 한다는 의미이다. 원래 dw = x*dz로 정의되는데, 앞서 dw1=0으로 초기화 시켰기 때문에 처음 시작은 dw1 + x*dz = x*dz이다.




3) 그리고  m 개의 데이터에 대한 것이므로, 마지막에 각각의 값을 m으로 나누어 평균을 취하도록 한다.  

=/ 표시는 나눈 값으로 업데이트한다는 뜻이다. dw1 /= m 은 dw1/m을 다시 dw1에 덮어쓰기 한다는 의미이다.



4) 마지막으로는 m 개의 데이터에 대해서 업데이트된 dw1, dw2, db를 Gradient Descent 알고리즘을 통해서 최종적으로 w1, w2, b를 업데이트하게 된다.



이렇게 해서 m 개의 데이터에 대한 Logistic Regression의  Gradient Descent 알고리즘의 순서를 Pseudocode를 통해 짚어 보았다. 물론 실제 C언어나 파이썬 등을 통해서 알고리즘을 구현한다면  당연히 그에 맞는 문법으로 coding을 해 나아가야 한다. 하지만 이 글의 목적은 coding 수업은 아니므로 단순히 Pseudocode로 설명이 충분하다.


그리고 위에서 For 구문이 2번 쓰일 수 있다고 하였는데 하나는 1부터 m 번째의 데이터에 대한 반복, 그리고 다른 하나는 w가 여러 개일 때 이에 대한 반복, 이렇게 2가지에 해당된다. 그런데 For 구문은 최대한 줄일 수 있으면 줄이는 것이 속도 측면에서 좋다. 여기서 데이터를 벡터화(Vectorization) 시킬 필요성이 나오게 된다. 벡터화 시키게 되면 앞서 언급했던 두 가지의 For 구문은 필요하지 않게 된다.


다음 글에서는 이를 해결하기 위해서 m 개의 데이터와 n 개의 Feature(w의 개수와 관련된)를 벡터화(Vectorization) 해서 알고리즘을 구현하는 방법에 대해서 한번 얘기해보도록 하겠다.




참조 : 강의 원본 출처 (앤드류 응 교수 딥러닝 강의)

Gradient Descent on m Examples (C1W2L10)

https://www.youtube.com/watch?v=KKfZLXcF-aE&list=PLkDaE6sCZn6Ec-XTbcX1uRg2_u4xOEky0&index=16




매거진의 이전글 역전파를 수학적으로 이해하자!
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari