본문 바로가기
Coursera 강의/Deep Learning

Basics of Neural Network programming (Week 1, 2)

by 별준 2020. 8. 30.
해당 내용은 Coursera의 딥러닝 특화과정(Deep Learning Specialization)의 첫 번째 강의 Neural Networks and Deep Learning를 듣고 정리한 내용입니다. (Week 2)

 

1주차 내용은 딥러닝에 대해서 소개하는 내용과 수업의 전반적인 방향을 이야기해주어서, 따로 게시글을 쓰는 것이 아닌 여기에서 간단하게 정리하고 넘어가겠다.

 

딥러닝 특화과정에서는 5개의 강의가 있으며, 각 강의에서는 다음과 같은 내용을 다룬다.

1. Nueral Network(NN) and Deep Learning(DL)

- NN과 DL에 대해서 배우며, NN을 만드는 방법과 데이터를 학습하는 방법에 대해서 배울 것이다(고양이 이미지 인식기도 만들어 볼 것이다).

 

2. Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization

- DL의 실질적인 부분을 알아가며, 어떻게 잘 동작하게 만드는 지 배우게 될 것이다.

 

3. Structuring Machine Learning Projects

- 머신러닝을 어떻게 구조화할 것인가에 대해서 배우고 여러가지 경험을 공유한다.

 

4. Convolutional Neural Network(CNN)

- 주로 이미지 인식/처리에 사용되는 CNN에 대해서 배운다.

 

5. Squence Models

- 시퀀스 데이터 처리에 유용하게 사용되는 Recurrent Neural Network(RNN), LSTM 모델을 배운다. 이것들은 자연어처리나 음성인식, 음악생성에 사용된다.

 

그리고 현재 듣고 있는 Nerual Networks and Deep Learning 수업은 4주차 강의로 각 강의에서는 다음과 같은 내용으로 진행한다.

Week 1 : Introduction

Week 2 : Basics of Neural Network programming

Week 3 : One hidden layer Neural Networks

Week 4 : Deep Neural Networks

 

1주차 내용은 거의 이전 Machine Learning 수업에서 들었던 내용을 다시 한 번 되새기는 내용이 대부분이기 때문에 따로 정리하지 않고 2주차로 바로 넘어가서 정리를 해보도록 하겠다.

 

- Logistic Regression as a Neural Network

신경망을 구현할 때에는 중요한 기술들이 몇 가지 있다. 

만약 m개의 Training Set이 있으면 m개의 example에 대해서 for문을 사용하지 않고 처리해왔을 수도 있지만, 신경망을 구현할 때는 전체 Training Set을 학습하는데 for문을 사용하지 않고 처리하는 것을 강의를 통해 배울 것이다.

또 다른 것으로는 NN을 구현할 때 Forward Propagation(FP, 순전파), 그 다음에는 BackPropagation(BP, 역전파) 계산법을 사용하는데, 왜 FP와 BP를 이용해서 계산하는지 알아보도록 할 것이다.

 

NN을 설명하기 전에 Logistic Regression을 다시 살펴보면서 이해를 돕도록 하겠다.

[Binary Classification]

 

 

입력 이미지가 있을 때, 이 이미지가 고양이인지 아닌지 분류하는 Binary Classification(이진 분류) 문제가 있다.

이미지를 인식해서 고양이라면 1로, 고양이가 아니라면 0으로 Label을 출력한다. 

컴퓨터는 이미지를 왼쪽아래와 같이 RGB 데이터를 pixel별로 인식하며, 여기서는 이미지가 64px x 64px이라고 가정하겠다. 그래서 입력은 Red, Green, Blue 이렇게 3개로 분리된 행렬을 사용한다. 그리고 Red, Green, Blue의 값들을 하나의 feature vector \(x\)에 나열해보면, 64x64x3의 차원으로 나타난다. 즉, 전체 차원은 12288이 되며, 우리는 x의 차원을 의미하는 \(n_x\)는 12288이 된다.

 

사용되는 표기법(Notation)들을 정리하고 넘어가자.

- \(\begin{matrix} (x, y) & x \in \mathbb{R}^{n_x}, y \in \{0, 1\} \end{matrix}\) : 한 개의 example을 나타낸다.

- m trainig example : \(\{(x^{(1)}, y^{(1)}), (x^{(2)}, y^{(2)}), ..., (x^{(m)}, y^{(m)})\}\)

- Training Set이나 Test Set을 표시하기 위해서 \(m_{train}, m_{test}\)로 쓰기도 함

- 모든 입력 x를 나타내기 위한 행렬을 대문자 X로 표기한다.(\(X \in \mathbb{R}^{n_x \times m}\))

\(X = \begin{bmatrix} | & | & & | \\ x^{(1)} & x^{(2)} & ... & x^{(m)} \\ | & | & & | \end{bmatrix}\)

- 출력 label y 또한 행렬도 나타내며 대문자 Y로 표기한다.(\(Y \in \mathbb{R}^{1 \times m}\))

\(Y = \begin{bmatrix} y^{(1)} & y^{(2)} & ... & y^{(m)} \end{bmatrix}\)

 

[Logistic Regression]

Logistic Regression에서는 결국 다음와 같이 정의할 수 있다.

\[\text{Given } x \text{,  want  } \hat{y} = P(y = 1 | x), x \in \mathbb{R}^{n_x}\]

주어진 input x에 대해서 y가 1이 될 수 있는 확률을 구하는 것인데, 여기서 \(\hat{y}\)에서 y위에 붙은 표기를 hat이라고 읽으며, 통계학에서 추정치를 의미한다.

그리고 우리는 Ouput 함수를 parameter \(w \in \mathbb{R}^{n_x}\)와 \(b \in \mathbb{R}\)로 다음과 같이 나타낼 수 있다.

\[\text{Output } \hat{y} = w^Tx + b\]

하지만 위 함수는 binary classification으로는 별로 좋은 함수는 아니다. 왜냐하면 이진 분류에서는 y의 값은 확률로 0과 1사이의 의 값으로 나타내야 하는데, 위 함수는 y의 값이 1보다 클 수도 있고, 음수가 될 수 있기 때문이다. 

이를 해결하기 위해서 우리는 sigmoid 함수를 사용한다.

 

출처 : 위키백과

 

위와 같은 그래프의 모양을 가지는 함수를 sigmoid함수라고 하며, 다음과 같이 나타낸다.

\[\sigma(z) = \frac{1}{1 + e^{-z}}, \begin{matrix} \text{ if } z \text{ is large, } \sigma{z} \approx \frac{1}{1 + 0} = 1 \\ \text{ if } z \text{ is small, } \sigma(z) \approx \frac{1}{1 + \infty} = 0 \end{matrix}\]

 

따라서, Ouput은 다음과 같이 사용할 수 있다.

\[\text{Output } \hat{y} = {\color{blue}\sigma}(\underbrace{w^Tx + b}_{z}) \]

 

[Notation 정리] - 만약 이전 강의를 듣지 않았으면 신경쓰지 않아도 된다.

이전에 Machine Learning 강의를 들었으면, \(x_0\)과 \(\theta\)라는 파라미터를 사용했을 것이다.

\(x_0 = 1, x \in \mathbb{R}^{n_x + 1}\) 이며, output \(\hat{y} = \sigma(\theta^Tx)\)로 Logistic Regression 문제를 나타냈다. NN에서는 이 파라미터보다 \(w\)와 \(b\)를 사용하는 것이 더 유용하며, 우리가 알던 \(\theta\)와 비교하면 다음과 같다.

\[\theta = \begin{matrix} \begin{bmatrix} \theta_0 \\ \theta_1 \\ \vdots \\ \theta_{n_x} \end{bmatrix} \end{matrix}\]

여기서 \(\theta_0 \rightarrow b\)이며, 나머지 부분은 \(\begin{bmatrix} \theta_1 \\ \vdots \\ \theta_{n_x} \end{bmatrix} \rightarrow w\) 이다.

 

[Logistic Regression Cost Function]

이제 우리는 \(w\)와 \(b\) 파라미터를 학습시키기 위해서 먼저 Cost Function(비용 함수)를 정의해야 한다.

우선 표기법을 먼저 정의하자면 \(x^{(i)}, y^{(i)}, z^{(i)}\)에서 위 첨자 i는 i번째 Training Example을 의미한다.

 

Logstic Regression 문제를 다시 정리하면 다음과 같다.

\[\begin{align*} &\hat{y} = \sigma(w^Tx + b), \text{ where } \sigma(z) = \frac{1}{1 + e^{-z}} \\ &\text{Given } \{(x^{(1)}, x^{(2)}), ..., (x^{(m)}, y^{(m)}) \}, \text{ want } \hat{(i)} \approx y^{(i)} \end{align*}\]

 

그리고 Loss(error) function으로 

\(\mathscr{L}(\hat{y}, y) = \frac{1}{2}(\hat{y} - y)^2\) 을 사용할 수 있지만, 이러한 비용함수는 non-convex하기 때문에 Local Optima에 빠질 경우가 있어서 적합하지 않다. 

따라서, 우리는 위 Error Function과 유사한 역할을 하는 Loss함수를 정의해서 사용해서 Convex한 최적화 문제를 풀도록 할 것이다.

다음과 같은 Loss Function을 사용한다.

\[\mathscr{L}(\hat{y}, y) = -(ylog\hat{y} + (1 - y)log(1 - \hat{y}))\]

 

이렇게 정의한 Loss 함수가 적절한가 ?? 우리는 두 가지 케이스를 살펴보면서 이 Loss 함수가 왜 적절한 지 알아보자.

(Machine Learning 수업을 들었다면 넘어가도 좋다)

 

만약 y가 1 이라면,

\(\mathscr{L}(\hat{y}, y) = -log\hat{y} \leftarrow \text{ want } log(\hat{y}) \text{ large}, \text{ want } \hat{y} \text{ large}\)

만약 y가 0 이라면,

\(\mathscr{L}(\hat{y}, y) = -log(1- \hat{y}) \leftarrow \text{ want } log(1 - \hat{y}) \text{ large}, \text{ want } \hat{y} \text{ small}\)

이다.

(개인적으로 이 내용보다는 Machine Learning 강의의 Logistic Regression 수업에서의 설명이 조금 더 이해가 잘 되는 것 같다. 필요하다면 아래 게시글을 참조하면 좋다.)

2020/08/07 - [ML and DL/Machine Learning] - [Machine Learning] Logistic Regression 2 (Cost Function, Gradient Descent, Multi-Class Classification)

 

위의 Loss 함수는 하나의 example에 대해서 정의된 것이다. 이제 비용함수를 정의해보자.

\[\begin{align*} \text{Cost Function : } J(w, b) &= \frac{1}{m}\sum_{i = 1}^{m} \mathscr{L}(\hat{y}^{(i)}, y^{(i)}) \\ &= -\frac{1}{m}\sum_{i = 1}^{m} \left [ y^{(i)}log(\hat{y}^{(i)}) + (1 - y^{(i)})log(1 - \hat{y}^{(i)}) \right ] \end{align*}\]

비용함수 Cost Function은 위와 같이 나타내며 파라미터에 대한 비용을 의미한다. 그리고 모델을 학습하면서 파라미터 \(w, b\)를 찾고 전제적인 학습 모델의 비용 \(J\)를 줄일 것이다.

 

 

* Logistic Regression은 아주 작은 NN이다. 

 

[Gradient Descent 경사하강법]

다음으로는 Gradient Descent를 사용해서 어떻게 파라미터 \(w\)와 \(b\)를 Training Set에서 학습할 수 있는지 알아보자.

 

 

우리는 앞서 Logistic Regression의 Cost Function \(J(w, b)\)를 알아봤고, 이 Cost Function은 파라미터 \(w, b\)가 얼마나 적합한지 측정한다. 그래서 우리는 이 Cost Function을 최소화시키는 \(w, b\)를 찾는다.

Cost Function의 그래프는 위와 같이 나타낼 수 있다. 표에 나타나기 위해서 \(w, b\)는 실수라고 가정하였다. 우리는 여기서 \(J(w, b)\)를 최소화하는 파라미터 \(w, b\)를 찾는데, 여기서 이 J 함수는 여러개의 Local Optima가 있는 non-convex가 아닌 convex(볼록함수)이다. 그렇기 때문에 우리는 이러한 Cost Function을 사용하는 것이다.

 

Gradient Descent를 정리하면 다음과 같다.

첫 번째로는 \(w, b\)를 초기화한다.(일반적으로 0으로 초기화하지만, 랜덤으로 초기화해도 된다)

그리고 기울기가 가장 높은 방향으로 내려가면서 최소값을 찾는다.

결과적으로 이상적인 Global Optima나 근접한 값에 도달할 것이다.

 

 

 

간단한 그래프로 나타내기 위해서 b를 생략하고 1차원의 w가 있다고 가정하면, Cost Function의 그래프는 왼쪽 그래프처럼 될 것이다. 그리고 우리는 Global Optima를 찾는 과정인 Gradient Descent를 진행한다.

Gradient Descent의 과정은 다음과 같다.

\[\begin{align*} \text{Repeat } \{ \\ w &:= w - \alpha\underbrace{\frac{dJ(w)}{dw}}_{dw} \\ \} \end{align*}\]

미분항을 \(dw\)라고 나타낸다면, \(w := w - \alpha dw\)로 나타낼 수 있다. \(\alpha\)는 Learning Rate(양수)이다.

위 그래프처럼 제일 오른쪽 위치에서 Gradient Descent를 시작한다면, 미분항 dw는 그 지점에서의 기울기이므로 양수이다. \(\alpha\)값도 양수이고 미분항도 양수이기 때문에, w의 값은 점점 감소하므로 Global Optima로 향하게 된다.

 

 

 

만약 왼쪽에 위치한 지점을 초기값으로 Gradient Descent를 진행하면, 이 지점에서의 기울기는 음수이고 결국 w는 증가하는 방향으로 이동하면서 Global Optima를 향하게 될 것이다.

 

위에서 오직 \(w\)에 대한 Gradient Descent를 알아봤는데, 실제 Logistic Regression에서는 \(w, b\)의 파라미터가 존재한다.

따라서 \(J(w, b)\)에 대한 Gradient Descent는 다음과 같다.

\[\begin{align*} \text{Repeat } \{ \\ w &:= w - \alpha\frac{\partial J(w, b)}{\partial w} \\ b & := b - \alpha\frac{\partial J(w, b)}{\partial b} \\ \} \end{align*}\]

 

여기서 위에서는 w에 대한 Gradient Descent는 \(d\)를 사용했고, w, b에 대한 Gradient Descent는 \(\partial\)을 사용했다. 미적분학에서는 한 개의 변수를 가진 함수에 대해서는 \(d\)를 사용하고, 두 개 이상의 변수를 가진 함수에는 \(\partial\)을 사용한다.(크게 중요하지는 않다)

 

[Derivatives]

미적분학에 대해서 걱정이 있을 수 있지만, 실제 딥러닝에서 미적분학의 깊은 이해를 요구하지는 않는다. 나중에 보겠지만, forward propagation 함수와 backpropagation 함수가 미적분학과 관련되어 있기 때문에 미적분에 대해서 언급한다.

 

(고등학교 과정에서 수많이 봤을 것 같아서.. 따로 정리하지 않고 넘어가겠습니다)

 

 

 

 

 

 

 

 

 

[Computation graph]

NN의 계산이 FP를 통해서 결과값을 계산하고, BP를 통해서 기울기나 미분을 계산하는데, 왜 이런 구조를 갖는지 Computation Graph(계산 그래프)를 통해서 알아보자.

 

계산 그래프를 그려보기 위해서, 아래의 조금 더 쉬운 예제를 가지고 살펴보자.

\[J(a, b, c) = 3(a + bc)\]

이 함수를 계산하는 방법에는 아래와 같이 3가지의 절차가 있다.

\[\begin{align*} &u = bc \\ &v = a + u \\ & J = 3v \end{align*}\]

이러한 3가지 절차를 통해서 다음과 같은 계산 그래프를 그릴 수 있다.

 

 

만약 a = 5, b = 3, c = 2라는 값을 가진다면, u = 6, v = 11, 결국 J는 33이 된다.

 

이렇게 각각 나누어져서 특정 결과값에 대한 변수가 있는 경우에 계산 그래프로 유용하게 사용할 수 있다.(ex, J를 최적화시키는 경우)

이렇게 왼쪽에서 오른쪽으로 가면서 J를 계산하는 것을 보았고, 다음으로 오른쪽에서 왼쪽으로 통과하면서 미분을 계산하는 방법을 살펴보자.

 

[Derivatives with a Computation Graph]

 

 

우리는 J의 v에 대한 미분을 구한다고 생각해보자. \(\frac{dJ}{dv} = ?\)

만약 우리가 \(v\)의 값을 살짝 바꾼다고 하면 J는 어떻게 될까? \(v\)의 값을 0.001 증가시킨다면 아래와 같이 될 것이다.

\[\begin{align*} &J = 3v \\ &v = 11 \rightarrow 11.001 \\ &J = 33 \rightarrow 33.003 \end{align*}\]

여기서

\[\frac{dJ}{dv} = 3\]

이 된다.

 

여기서 우리가 마지막 변수 결과값(여기서는 \(J = 3v\))의 미분을 계산하기 위해서 BP에서 한단계를 진행했다.

다음으로 \(\frac{dJ}{da}\)는 어떻게 될까?

다시 말해서 a의 값을 0.001만큼 증가시키면, J는 어떻게 되는지 살펴보자.

\[\begin{align*} &a = 5 \rightarrow 5.001 \\ &v = 11 \rightarrow 11.001 \\ &J = 33 \rightarrow 33.003 \end{align*}\]

위에서 볼 수 있듯이 a를 0.001만큼 증가하면, J는 0.003만큼 증가하게 된다.

결국 J의 증가가 a의 증가분과 비교했을 때, 3배가 되는 것이다.

\[\frac{dJ}{da} = 3\]

이것을 분해해서 나타내면 a를 변경하면 v가 변경되고, 그리고 v가 변경되면 J가 변경되는 것이다.

그러므로 a값을 증가시켰을 때의 총 J의 변화량은 아래와 같이 나타낼 수 있다.

\[\frac{dJ}{da} = 3 = \frac{dJ}{dv}\frac{dv}{da}\]

미적분학에서는 이것을 chain rule(연쇄법칙)이라고 하는데, a가 v에 영향을 주면 결국 J에 영향을 주게되고, [a값이 변경될 때 변하는 v의 변화량 x v값이 변경될 때 변하는 J의 변화량]으로 나타낼 수 있다.

여기서 dv/da의 값은 1이 된다.

\[\frac{dv}{da} = 1\]

 

여기서 우리는 \(\frac{dv}{da}\)를 구했고, 이 값과 첫번쨰 단계에서 구했던 \(\frac{dJ}{dv}\)를 사용해서 \(\frac{dJ}{da}\)를 구할 수 있다. BP에서 또 한단계 진행한 것이다.

 

[새로운 표기법]

SW에서 이 미분항들을 표기하려면 아주 긴 이름을 사용해야 될 수도 있는데, 우리는 앞으로 편의상 'dvar'이라고만 나타낼 것이다. 'dvar'의 의미는 var값이 변경될 때, 최종 결과값 J의 변화량이며 \(\frac{dJ}{dvar}\)을 의미한다. 위 예제에서 \(\frac{dJ}{da}\)는 da로, \(\frac{dJ}{dv}\)는 dv로 표기할 것이다.

 

같은 방법으로 du, db, dc도 아래와 같이 구할 수 있다.

 

 

\[\begin{matrix} \frac{dJ}{du} = 3 & \frac{dJ}{db} = 6 & \frac{dJ}{dc} = 9 \end{matrix}\]

 

위 예제에서 가장 중요한 결론은 미분을 계산하고, 식에서 존재하는 모든 미분들을 계산할 때 가장 효율적인 방법은 오른쪽에서 왼쪽으로 가면서 미분을 구하는 것이다. 이 예제에서 dv에 대해서 먼저 구했고, 이것은 da와 du를 구하는 데 유용하게 사용된다. 그리고 여기서 du는 db와 dc를 구하는데 유용하게 사용된다.

 

[Logistic Regression Gradient Descent]

이번에는 Logistic Regression에서 Gradient Descent를 적용하기 위해서 미분을 구하는 방법에 대해서 알아보자.

이전에 우리는 Logistic Regression을 통해서 다음과 같은 식들을 설정했다.

 

 

그리고 여기 예제에서는 \(x_1, x_2\) 두 가지의 feature만 존재한다고 가정한다.

계산 그래프에서는 아래와 같은 순서로 \(z, \hat{y}, \mathscr{L}\)을 계산할 것이다(FP).

 

 

이제 거꾸로 미분을 계산하는 방법에 대해서 알아보자(BP).

첫 번째로 우리는 Loss함수 \(\mathscr{L}(a, y)\)를 \(a\)에 대해서 미분한 값 \(\frac{d\mathscr{L}(a, y)}{da}\), 'da'를 구해야 한다. 결과값은 아래와 같다.

\[\text{da } = \frac{d\mathscr{L}(a, y)}{da} = -\frac{y}{a} + \frac{1 - y}{1 - a}\]

(계산 과정은 아래 접은 글에 정리해두었다)

 

두 번째로는 'dz', 즉, \(\frac{dL}{dz}\)를 구할 수 있고 결과는 다음과 같다.

\[\begin{align*} \text{dz } &= \frac{dL}{dz} \\ &= a - y \\ &= \frac{dL}{da}\frac{da}{da} \end{align*}\]

 

마지막 단계에서는 w와 b에 대한 변화량을 계산해야 한다.

'\(\text{dw}_1\)', 즉, \(\frac{\partial L}{\partial w_1}\)와 \(\text{dw}_2, \text{db}\)를 구하면 다음과 같다.

\[\begin{matrix} \text{dw}_1 = x_1\text{dz} & \text{dw}_2 = x_2\text{dz} & \text{db} = \text{dz} \end{matrix}\]

그리고 위 공식들을 사용해서 w와 b는 다음과 같이 업데이트 한다.

\[\begin{align*} w_1 &:= w_1 - \alpha\text{dw}_1 \\ w_2 &:= w_2 - \alpha\text{dw}_2 \\ b &:= b - \alpha\text{db} \end{align*}\]

 

더보기

\(\frac{dL}{dz}\)의 미분 계산 방법

Step 1: \(\frac{dL}{da}\) 계산

\(L = -(ylog(a) + (1 - y)log(1 - a))\)

\(log(f(x))\)에 대한 미분값은 \(\frac{{f(x)}'}{f(x)}\) 이다. 따라서, 

\(\frac{dL}{da} = -y \times \frac{1}{a} - (1 - y) \times \frac{1}{1 - a} \times -1 = \frac{a - y}{a(1 - a)}\)

 

Step 2: \(\frac{da}{dz}\) 계산

\(\frac{da}{dz} = \frac{d}{dz}\sigma(z)\)

sigmoid함수의 미분결과는 다음과 같으며, 계산방법은 아래 이전 게시글을 참조하길 바람.

\(\frac{d}{dz}\sigma(z) = \sigma(z) \times (1 - \sigma(z))\)

(시그모이드 함수 미분 계산 :

2020/08/15 - [ML and DL/Machine Learning] - [Machine Learning] Backpropagation in Practice)

우리는 \(\sigma(z) = a\)로 사용하므로, 결국

\(\frac{da}{dz} = a(1 - a)\) 가 된다.

 

Step 3: \(\frac{dL}{dz}\) 계산

\(\frac{dL}{dz} = \frac{dL}{da} \times \frac{da}{dz}\)

Step1, Step2에 의해서

\(\frac{dL}{dz} = \frac{a - y}{a(1 - a)} \times a(1 - a) = a - y\)

가 된다.

Andrew Ng의 표기법(파이썬에서의 표기)를 따라서,

\(\text{dz } = a - y\)

이다.


 

여기까지 한 개의 example에 대한 Gradient Descent를 적용하는 것을 배웠다. 다음으로 m 개의 Training Example에 대해서 Gradient Descent를 적용해보자.

 

[Gradient Descent of m examples]

우리는 이제 모든 example에 대해서 Gradient Descent를 적용해야한다. 따라서 위첨자 i를 추가해서 다음과 같이 나타낼 수 있다.

\(\rightarrow a^{(i)} = \hat{y}^{(i)} = \sigma(z^{(i)}) = \sigma(w^Tx^{(i)} + b)\)

그리고 각각의 training example에 대해서 \(\text{dw}_1^{(i)}, \text{dw}_2^{(i)}, \text{db}^{(i)}\)를 구할 수 있다.

 

 

그리고 위 Cost Function을 \(\text{dw}_1\)로 미분을 하면 다음과 같이 나타낼 수 있다.

\(\frac{\partial}{\partial w_1}J(w, b) = \frac{1}{m}\sum_{i = 1}^{m}\underbrace{\frac{\partial}{\partial w_1}\mathscr{L}(a^{(i)}, y^{(i)})}_{\text{dw}_1^{(i)}}\)

즉, 각 exmaple의 \(\text{dw}_1\)을 구하고 평균치를 구하면 Gradient Descent에 바로 적용할 수 있다.

 

Gradient Descent를 코드로 나타내면 다음과 같다.


 

 


위에서 feature가 2개이기 때문에 \(dw_1, dw_2\)만 구했지만, feature의 개수가 더 많다면, 그 개수만큼 계산해주어야 한다. 그리고 이렇게 계산한 미분값들을 사용해서 w, b를 업데이트하면 된다.

\(w_1 := w_1 - \alpha dw_1\)

\(w_2 := w_2 - \alpha dw_2\)

\(b := b - \alpha db\)

 

딥러닝에서 코드에 for반복문이 있으면 비효율적으로 계산이 이루어진다. 엄청나게 큰 데이터에서는 for반복문을 사용하지 않고 vectorization 테크닉을 사용해서 for문을 제거할 수 있다. 딥러닝에서는 효율을 위해서 for문을 반드시 제거하는 것이 매우 중요하다.

 

댓글