논문

하루에도 수만개의 글자를 읽고 있습니다. 하루에도 수백장의 종이를 들춰 읽습니다.
이것은 그 읽기에 대한 일기입니다.

UFLDL Tutorial 8. Supervised Neural Networks – Multi-Layer Neural Network

http://deeplearning.stanford.edu/tutorial/

Supervised Neural Networks - Multi-Layer Neural Network

트레이닝 샘플 $\big( x^{(i)}, y^{(i)} \big)$에 레이블이 달려 있어 이것을 사용할 수 있는 supervised learning 문제를 생각해 봅시다. 신경망(Neural networks)은 복잡한 비선형 형태의 hypotheses $h_{W, b} (x)$를 파라미터 $W, b$를 이용하여 정의하고 우리가 가진 데이터에 맞출 수 있도록 도와줍니다.

신경망을 이해하기 위해, 가장 간단한 신경망, 단일 뉴런(single neuron)이라 불리는 것으로부터 설명을 시작해봅시다. 그리고 단일 뉴런을 표현하기 위해 아래와 같은 다이어그램을 사용하고자 합니다.

SingleNeuron

이 뉴런은 입력 $x_1, x_2, x_3$과 절편(intercept)항 +1을 계산에 사용하여 $\textstyle h_{W,b}(x) = f(W^Tx) = f(\sum_{i=1}^3 W_{i}x_i +b)$을 출력으로 내놓는 유닛입니다. 여기서 $f : \Re \mapsto \Re$는 활성 함수(activation function)이라고 부릅니다. 여기에서는 $f(\cdot)$에 시그모이드(sigmoid) 함수를 사용할 것입니다.

$$f(z) = \frac{1}{1+\exp(-z)}$$

따라서 우리의 이 단일 뉴런은 logistic regressio과 완전히 똑같은 입력-출력 관계를 가집니다.

시그모이드 함수를 사용하지 않더라도, 일반적으로 사용되는 다른 함수는 hyperbolic tangent (tanh) 함수가 있습니다.

$$f(z) = \tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}}$$

최근 연구에서는 또다른 활성 함수가 발견되었는데, 바로 rectified linear function입니다. 이는 주로 깊은 신경망에서 더 잘 동작하는 것으로 나타낫습니다. 이 활성 함수는 시그모이드나 tanh 함수와는 다르게 출력 값에 경계가 없고, 미분 가능하지도 않습니다. Rectified linear activation 함수는 다음과 같습니다.

$$f(z) = \max(0,x)$$

다음 그림은 시그모이드 함수와 tanh, rectified linear functin을 비교한 그림입니다.

ActivationFunctions

$tanh(z)$ 함수는 시그모이드 함수의 리스케일된(rescaled) 버전이며 그 출력 또한 시그모이드의 $[0, 1]$에서 $[-1, 1]$로 바뀌어집니다. Rectified linear function는 일부 선형인 부분과 0으로 saturate되는 부분으로 구성되는데, 그 경계는 $z$가 0인 지점입니다. 0보다 작을 경우 출력은 0으로 고정되게 됩니다.

다른 강의들과는 달리 여기서는 절편 값의 편의를 위해 $x_0 = 1$을 사용하지 않고, 따로 절편 항을 꺼낸 뒤 이에 대한 파라미터를 $b$로 사용하도록 하겠습니다.

마지막으로 후에 유용하게 사용될만한 것이 있는데, 시그모이드 함수 $f(z) = 1/(1+\exp(-z))$의 미분 함수는 $f'(z) = f(z) (1-f(z))$입니다. 만약 $f$가 tanh 함수라면 미분 함수는 $f'(z) = 1- (f(z))^2$가 됩니다. 아마 여러분이 직접 함수를 미분을 해보면 동일한 결과가 나올 것입니다. Rectified linear 함수는 $z \leq 0 $ 구간에서는 0의 그래디언트를 가지며, 나머지 구간에서는 1을 가집니다. 하지만 $z=0$인 지점에서는 그래디언트를 정의할 수 없습니다. 하지만 실제 적용시 이는 문제가 되질 않는데, 대부분의 경우 최적화 시 많은 트레이닝 데이터의 그래디언트를 평균하여 사용할 것이기 때문입니다.

Neural Network model

이러한 단일 뉴런을 여러개 모아 서로 얽히게 연결하면 그것이 바로 신경망입니다. 이제 한 뉴런의 출력은 다른 뉴런의 입력으로 들어가게 됩니다. 다음은 작은 신경망의 예입니다.

이 그림에서 원은 신경망으로의 입력을 나타냅니다. “+1” 표시가 있는 원은 bias unit이라고 부르며, 절편(intercept)항에 해당하는 것입니다. 신경망의 가장 왼쪽 층은 입력층(input layer), 가장 오른쪽 층은 출력층(output layer)라고 부릅니다. 이 신경망에서는 출력층은 하나의 노드만을 가지는 것을 알 수가 있습니다. 여러 노드들로 구성된 중간 층은 은닉층(hidden layer)라고 불립니다. 그 이유는 트레이닝셋에서 그 값들이 관측되어있지는 않기 때문입니다. 이 신경망은 3개의 입력 유닛(bias unit은 세지 않습니다)과, 3개의 은닉 유닛, 1개의 출력 유닛으로 구성되어있습니다.

이제 신경망의 층 수를 $n_l$로 나타내어봅시다. 여기서는 $n_l=3$이 됩니다. 또한 각 층들을 $L_l$로 나타냅니다. 따라서 $L_1$은 입력층을 의미하고 출력층은 $L_{n_l}$이 됩니다. 신경망은 파라미터로 $(W, b) = (W^{(1)}, b^{(1)}, W^{(2)}, b^{(2)}) $를 가지는데, 파라미터 $W_{ij}^{(l)}$$l$번째 층의 $j$ 유닛으로부터 $l+1$번째 층의 $i$유닛으로의 연결과 관련된 파라미터, 혹은 가중치를 나타냅니다. 또한 $b_i^{(l)}$$l+1$층의 $i$번째 유닛에 대한 bias를 담당합니다. 따라서 이 예제에서는 $W^{(1)} \in \Re^{3 \times 3} $, $W^{(2)} \in \Re^{1 \times 3} $의 파라미터를 가집니다. Bias 유닛은 밖에서 들어오는 입력이나 연결을 갖지 않고 언제나 +1의 값을 출력하는 것에 유의합시다. 또한 $s_l$$l$번째 층의 노드의 수를 나타냅니다. 역시 이번에도 bias 유닛은 세지 않습니다.

또한 $l$번째 층의 $i$ 유닛의 활성(activation), 즉 출력 값을 $a_i^{(l)}$이라고 씁시다. $l=1$에서는 $i$번째 입력 값을 그대로 사용하기 때문에 $a_i^{(1)} = x_i$이 됩니다. 어떤 고정된 파라미터 $W, b$가 주어졌을 때 이 신경망은 hypothesis $h_{W, b}(x)$의 결과로 실수 값을 출력하게 됩니다. 좀더 자세히 살펴보면 이 신경망의 계산은 다음과 같이 나타낼 수 있습니다.

$$a_1^{(2)} = f(W_{11}^{(1)}x_1 + W_{12}^{(1)} x_2 + W_{13}^{(1)} x_3 + b_1^{(1)}) \\ a_2^{(2)} = f(W_{21}^{(1)}x_1 + W_{22}^{(1)} x_2 + W_{23}^{(1)} x_3 + b_2^{(1)}) \\ a_3^{(2)} = f(W_{31}^{(1)}x_1 + W_{32}^{(1)} x_2 + W_{33}^{(1)} x_3 + b_3^{(1)}) \\ h_{W,b}(x) = a_1^{(3)} = f(W_{11}^{(2)}a_1^{(2)} + W_{12}^{(2)} a_2^{(2)} + W_{13}^{(2)} a_3^{(2)} + b_1^{(2)})$$

다음으로, $z_i^{(l)}$$l$번째 층의 $i$ 유닛으로 들어오는 입력들의 가중치 합을 나타냅니다. 이 때에는 bias 항을 포함합니다.

$$\textstyle z_i^{(2)} = \sum_{j=1}^n W^{(1)}_{ij} x_j + b^{(1)}_i$$

따라서 이 값을 활성함수에 포함시키면 비로소 출력 값이 계산됩니다.

$$a_i^{l} = f(z_i^{(l)})$$

이런 방식을 사용함으로써 좀더 축약적인 표현이 가능해집니다. 만약 활성 함수 $f(\cdot)$를 element-wise fashion으로 벡터에 적용한다면, 그러니까 $ f([z_1, z_2, z_3]) = [f(z_1), f(z_2), f(z_3)] $와 같은 식으로 사용해야 경우, 각 식을 다음과 같이 간단히 표현할 수 있습니다.

$$\begin{align} z^{(2)} &= W^{(1)} x + b^{(1)} \\ a^{(2)} &= f(z^{(2)}) \\ z^{(3)} &= W^{(2)} a^{(2)} + b^{(2)} \\ h_{W,b}(x) &= a^{(3)} = f(z^{(3)}) \end{align}$$

이러한 과정을 전방 전파(forward propagation)이라고 합니다. 좀 더 일반화하여 표현하면, 입력 층의 출력 $a^{(1)} = x$와, 각 층의 activation $a^{(l)}$들을 이용하여 다음 $l+1$층의 activation $a^{(l+1)}$을 계산할 수 있습니다.

$$\begin{align} z^{(l+1)} &= W^{(l)} a^{(l)} + b^{(l)} \\ a^{(l+1)} &= f(z^{(l+1)}) \end{align}$$

여기에 사용되는 파라미터들을 행렬로 표현하고, 계산 과정에서 행렬-벡터 연산을 사용하면, 빠른 선형 대수 루틴들을 이용하여 신경망 계산을 빠르게 수행할 수 있습니다.

지금까지 하나의 신경망을 기준으로 설명하였지만, 다른 구조(architeture)를 갖는 신경망을 만들 수 있습니다. 여기서 구조란 뉴런들을 연결하는 패턴을 의미합니다. 여기에는 여러 은닉층을 가지는 구조 또한 포함합니다. 가장 일반적인 경우는 $n_l$층을 가지는 신경망으로, 층 $1$은 입력층이고, 층 $n_l$은 출력 층이며, 각 층 $l$은 다음 층 $l+1$과 촘촘하게 연결되어있는 구성입니다. 이런 구조에서 신경망의 출력을 계산하기 위해서는 층 $L_2$의 모든 activation을 먼저 계산하고 다음 $L_3$으로 넘어가, $L_{n_l}$까지 순차적으로 전방 전파 계산을 수행하여야 합니다. 이것은 feedforward 신경망의 한 예이며, 연결 그래프를 보면 directed loop나 cycle을 가지지 않는 것을 알 수 있습니다.

신경망은 여러 출력을 가질 수도 있습니다. 아래 그림은 2개 은닉층과 출력층에서는 2개의 유닛을 갖는 망을 나타내고 있습니다.

이러한 망을 훈련시키기 위해서는 레이블 $y^{(i)} \in \Re^2 $을 갖는 트레이닝 샘플 $ \big( x^{(i)}, y^{(i)})$이 필요합니다. 이러한 종류의 망은 예측하고자 하는 것이 여러 값을 가질 경우 유용합니다. 의학 진단 애플리케이션을 예로 들면, 벡터 $x$는 환자의 특징으로 주어지며, 각 출력 값 $y_i$들은 서로 다른 질병에 대한 유무를 나타내는 문제를 생각해볼 수 있습니다.

Backpropagation Algorithm

우리가 가지고 있는 트레이닝 셋이 $m$개의 샘플 $\{ (x^{(1)}, y^{(1)}), \ldots, (x^{(m)}, y^{(m)}) \}$로 구성되어있다고 가정해봅시다. 우리의 신경망을 배치(batch) 그래디언트 디센트(gradient descent)를 이용하여 훈련시킬 수 있습니다. 좀더 자세히 살펴봅시다. 하나의 트레이닝 샘플 $(x, y)$에 대해서 cost function는 다음과 같이 정의될 수 있습니다.

$$\begin{align} J(W,b; x,y) = \frac{1}{2} \left\| h_{W,b}(x) - y \right\|^2 \end{align}$$

이것은 제곱-에러 (squared-error) cost function의 형태(반으로 나누었지만)입니다. 만약 $m$개의 샘플 셋이 주어진다면 모든 샘플에 대한 cost function은 다음과 같습니다.

$$\begin{align} J(W,b) &= \left[ \frac{1}{m} \sum_{i=1}^m J(W,b;x^{(i)},y^{(i)}) \right] + \frac{\lambda}{2} \sum_{l=1}^{n_l-1} \; \sum_{i=1}^{s_l} \; \sum_{j=1}^{s_{l+1}} \left( W^{(l)}_{ji} \right)^2 \\ &= \left[ \frac{1}{m} \sum_{i=1}^m \left( \frac{1}{2} \left\| h_{W,b}(x^{(i)}) - y^{(i)} \right\|^2 \right) \right] + \frac{\lambda}{2} \sum_{l=1}^{n_l-1} \; \sum_{i=1}^{s_l} \; \sum_{j=1}^{s_{l+1}} \left( W^{(l)}_{ji} \right)^2 \end{align}$$

이 식 $ J(W,b)$의 첫번째 항은 제곱-에러의 평균입니다. 두번째 항은 regularization 항으로 가중치의 크기를 감소하도록 유도하여 오버피팅을 막는데 도움을 줍니다. 이것을 weight decay 항이라고도 부릅니다.

보통 weight decay는 $J(W, b)$의 정의에 따라 bias 항인 $b_i^{(l)}$에는 적용하지 않습니다. Weight decay를 bias 유닛에 적용시키는 것은 망의 최종 단계에서 보면 아주 작은 변화만을 만들어 내는 수준이지만, 스탠포드의 CS229(Machine Learning)이나 YouTube의 비디오 강의를 보았다면 파라미터의 Gaussian prior와 MAP estimation에서처럼, 이 weight decay는 근본적으로 Bayesian regularization 계통의 한 방법임을 알 수 있을 것입니다.(?)

Weight decay의 파라미터 $\lambda$는 두 항 간의 상대적인 중요도를 결정하는 항입니다. 여기서 한가지 주의할 점은 $J(W,b;x,y)$는 한 샘플에 대한 제곱-에러 cost를 나타내는 항이지만, $ J(W,b)$는 전체 cost function을 나타내며 거기에 weight decay 항까지 포함하고 있다는 점입니다.

위의 cost function은 보통 분류(classification)이나 regression 문제에서 사용됩니다. 분류 문제에서는 두개의 레이블에 대해서 $y=0 \text{or} 1$로 정의하여 사용합니다. 앞에서 시그모이드 활성 함수는 그 출력이 $[ 0, 1 ]$이었고 tanh 활성 함수는 -1, +1을 사용하여 레이블을 표현한 것을 생각하면 되겠습니다. Regression 문제에서는 먼저 출력이 $[0, 1]$사이에 오도록 스케일을 조절한 다음 사용하면 됩니다. 마찬가지로 tanh 함수에서는 $[-1, 1]$로 조절하면 됩니다.

우리가 하려는 일은 $W$$b$에 대한 cost function $J(W, b)$를 최소화하는 것입니다. 신경망을 훈련시키기 위해서 각 파라미터 $W_{ij}^{(l)}, b_i^{(l)}$를 랜덤하게 선택된 0에 가까운 작은 값으로 초기화할 것입니다. 이 값들은 분포 ${Normal}(0,\epsilon^2)$에서 추출할 것이며, $\epsilon$은 작은 값, $0.01$을 사용할 것입니다. 그 다음 batch gradient descent 알고리즘을 이용하여 최적화를 수행할 것입니다. $J(W, b)$는 non-convex 함수이기 때문에 gradient descent는 local ptima 문제에 빠지기 쉽습니다. 하지만 실제로는 생각보다 gradient descent가 잘 작동합니다. 마지막으로, 파라미터를 0보다는 랜덤한 수로 초기화하는 것이 중요합니다. 모든 파라미터를 동일한 값으로 초기화된 상태에서 학습을 시작하면 모든 은닉층의 유닛들은 입력에 대해서 모두 동일한 출력을 내게끔 학습이 될 것입니다. 다시 말하면 $W_{ij}^{(1)}$은 모든 $i$에 대해 같은 값을 가지게 되어 출력 또한 $a^{(2)}_1 = a^{(2)}_2 = a^{(2)}_3 = \ldots$으로 같게 되어버립니다. 따라서 랜덤 초기화는 symmetry breaking을 위한 목적을 가지고 있습니다.

Gradient descent를 한번 수행하면 파라미터 $W, b$를 업데이트하게 됩니다.

$$\begin{align} W_{ij}^{(l)} &= W_{ij}^{(l)} - \alpha \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b) \\ b_{i}^{(l)} &= b_{i}^{(l)} - \alpha \frac{\partial}{\partial b_{i}^{(l)}} J(W,b) \end{align}$$

$ \alpha$는 학습률(learning rate)입니다. 가장 중요한 것은 편미분 값을 계산하는 것입니다. 이제 이를 위한 알고리즘인 역전파(backpropagation) 알고리즘을 살펴보겠습니다. 이것은 편미분 값을 효율적으로 계산할 수 있게 해줍니다.

먼저 어떻게 $\textstyle \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x, y)$$\textstyle \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x, y)$를 구하는데 역전파 알고리즘이 이용될 수 있는지 살펴보고, 한 샘플 $(x, y)$에 대해서 cost function $J(W,b;x,y)$의 편미분이 어떻게 정의되는지 살펴볼 것입니다. 한 샘플에 대해서 계산할 수 있게 되면 모든 샘플에 대한 cost function $J(W, b)$의 편미분 또한 다음과 같이 계산됨을 알 수 있게 됩니다.

$$\begin{align} \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b) &= \left[ \frac{1}{m} \sum_{i=1}^m \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x^{(i)}, y^{(i)}) \right] + \lambda W_{ij}^{(l)} \\ \frac{\partial}{\partial b_{i}^{(l)}} J(W,b) &= \frac{1}{m}\sum_{i=1}^m \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x^{(i)}, y^{(i)}) \end{align}$$

두개의 식이 약간 다른 이유는 weight decay가 $W$에만 적용이 되어있고 $b$에는 사용되지 않기 때문입니다.

역전파 알고리즘은 다음과 같은 개념에서 출발합니다. 샘플 $(x, y)$가 주어진 경우, 먼저 “forward pass”를 수행하여 신경망의 모든 activation과 hypothesis $h_{W, b}(x)$의 출력 값을 계산합니다. 다음 층 $l$의 각 노드 $i$마다 “에러 항(error term)” $\delta^{(l)}_i$를 계산하여 현재 출력 값의 에러에 대해서 각 노드가 얼마나 영향(responsible)을 주었는지 측정하고자 합니다. 출력 노드에서는 신경망의 최종 activation 값과 실제 목표 값과의 차이를 살펴봄으로써 그 값을 $\delta_i^{(n_l)}$로 정의할 수 있습니다. 여기서 층$n_l$은 출력층을 뜻합니다. 그렇다면 은닉층의 유닛들은 어떻게 할까요? 그것들은 $a_i^{(l)}$을 입력으로 사용하여 노드의 에러항들을 계산한다음 그것들을 가중치 평균하여 $\delta_i^{(l)}$로 사용합니다. 그 역전파 알고리즘의 자세한 과정은 아래와 같습니다.

  1. Feedforward pass를 실행한다. 그 과정에서 층 $L_2, L_3$을 거쳐서 $L_{n_l}$까지의 activation들을 계산된다.
  2. 출력 층 $n_l$의 각 유닛 $i$에 대해서 다음을 계산한다.

    $$\begin{align} \delta^{(n_l)}_i = \frac{\partial}{\partial z^{(n_l)}_i} \;\; \frac{1}{2} \left\|y - h_{W,b}(x)\right\|^2 = - (y_i - a^{(n_l)}_i) \cdot f'(z^{(n_l)}_i) \end{align}$$

  3. 이제 상위 층에서 하위 층의 $l = n_l-1, n_l-2, n_l-3, \ldots, 2$순으로 내려오면서, 층 $l$의 각 노드 $i$에 대해서 다음을 계산한다.

    $$\delta^{(l)}_i = \left( \sum_{j=1}^{s_{l+1}} W^{(l)}_{ji} \delta^{(l+1)}_j \right) f'(z^{(l)}_i)$$

  4. 우리가 원하는 편미분 값을 계산한다.

    $$\begin{align} \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b; x, y) &= a^{(l)}_j \delta_i^{(l+1)} \\ \frac{\partial}{\partial b_{i}^{(l)}} J(W,b; x, y) &= \delta_i^{(l+1)} \end{align}$$

이제 위의 알고리즘을 행렬-벡터 표현으로 다시 써 봅시다. 여기서는 “$\textstyle \bullet$“를 사용할 것인데, 이것은 요소단위(element-wise) 곱을 나타냅니다. MATLAB이나 Octave에서는 .*로 계산되는 Hadamard product를 나타냅니다. $\textstyle a = b \bullet c$이라면 $\textstyle a_i = b_ic_i$입니다. 비슷한 방법으로 $\textstyle f(\cdot)$$\textstyle f'(\cdot)$에 대해서도 벡터의 요소에 각각 함수를 적용함을 의미합니다. 따라서 $ \textstyle f'([z_1, z_2, z_3]) = [f'(z_1), f'(z_2), f'(z_3)]$ 입니다.

알고리즘은 다음과 같이 쓸 수 있습니다.

  1. 1Feedforward pass를 실행한다. 그 과정에서 층 $L_2, L_3$을 거쳐서 $L_{n_l}$까지의 activation들을 계산되며 이는 전방전파에서 정의한 수식으로 계산된다.
  2. 출력 층 $n_l$에서 $\begin{align} \delta^{(n_l)} = - (y - a^{(n_l)}) \bullet f'(z^{(n_l)}) \end{align}$를 계산한다.
  3. 하위층 $l = n_l-1, n_l-2, n_l-3, \ldots, 2$에 대해서 $\begin{align} \delta^{(l)} = \left((W^{(l)})^T \delta^{(l+1)}\right) \bullet f'(z^{(l)}) \end{align}$을 계산한다.
  4. 편미분 값은 다음으로 계산할 수 있다.

    $$\begin{align} \nabla_{W^{(l)}} J(W,b;x,y) &= \delta^{(l+1)} (a^{(l)})^T, \\ \nabla_{b^{(l)}} J(W,b;x,y) &= \delta^{(l+1)} \end{align}$$

구현 노트 : 2번과 3번 과정에서 각 노드 $i$에 대한 $\textstyle f'(z^{(l)}_i)$를 계산하여야 합니다. $f(z)$로 시그모이드 활성 함수를 사용할 경우, 이미 forward pass 과정에서 $\textstyle a^{(l)}_i$를 계산해 가지고 있습니다. 따라서 앞에서 살펴본 $\textstyle f'(z)$의 식을 이용하면 $\textstyle f'(z^{(l)}_i) = a^{(l)}_i (1- a^{(l)}_i)$로 쉽게 계산할 수 있습니다.

드디어 gradient descent 알고리즘을 완전히 설명할 준비가 되엇습니다. 아래의 수도코드에서 $\textstyle \Delta W^{(l)}$$W^{(l)}$과 같은 차원을 가지는 행렬입니다. $\textstyle \Delta b^{(l)}$$b^{(l)}$과 같은 차원을 가지는 벡터입니다. $\textstyle \Delta W^{(l)}$$W^{(l)}$$\textstyle \times \Delta W^{(l)}$가 아니라 하나의 행렬을 가리키는 것입니다. 다음의 수도코드는 batch gradient descent의 한 반복을 설명한 것입니다.

  1. 모든 $l$에 대해서 $\textstyle \Delta W^{(l)} := 0$, $\textstyle \Delta b^{(l)} := 0$로 초기화한다.
  2. $i=1$ to $m$에 대해서,
    1. 역전파를 이용하여 $\textstyle \nabla_{W^{(l)}} J(W,b;x,y)$$\textstyle \nabla_{b^{(l)}} J(W,b;x,y)$를 계산한다.
    2. $\textstyle \Delta W^{(l)} := \Delta W^{(l)} + \nabla_{W^{(l)}} J(W,b;x,y)$로 업데이트한다.
    3. $\textstyle \Delta b^{(l)} := \Delta b^{(l)} + \nabla_{b^{(l)}} J(W,b;x,y)$로 업데이트한다.
  3. 파라미터를 업데이트 한다.

    $$\begin{align} W^{(l)} &= W^{(l)} - \alpha \left[ \left(\frac{1}{m} \Delta W^{(l)} \right) + \lambda W^{(l)}\right] \\ b^{(l)} &= b^{(l)} - \alpha \left[\frac{1}{m} \Delta b^{(l)}\right] \end{align}$$

신경망을 학습시키기 위해 위의 gradient descent 과정을 반복하여 cost function $\textstyle J(W,b)$를 줄여나갈 수 있습니다.


Tags:
Add a Comment Trackback