5-1 Cost function and Backpropagation 본문
뉴럴넷을 학습시키는 방법에 대해 알아본다.
이전에 배웠던 내용이지만, 만약 Binary classification 문제를 풀고자 한다면 마지막 레이어의 unit은 하나만 있으면 된다.
그리고 class의 수가 K인 분류 문제를 풀고자 한다면 마지막 레이어의 unit 수는 K개가 있으면 된다. 따라서 각 h(x)는 K차원의 벡터가 된다.
뉴럴넷의 Cost function을 정의하기 전 로지스틱 회귀에서 우리가 정의했던 cost function은 다음과 같다.
앞에서 Loss값을 구하고 뒤에서 Regularization을 이용하여 파라미터 θ의 값이 작아지도록 하면서 균형을 유지하도록 하였다.
뉴럴넷에서 h(x)가 K차원의 벡터이고 h(x)_i가 output 레이어의 i번째 unit이라고 할 때 cost function J(θ)는 다음과 같이 정의된다.
먼저 regularization term이 아닌 앞부분을 보면
하나의 sample을 집어넣으면 마지막 레이어에서 K개의 h(x)값이 나오게 된다. K개의 h(x)값을 다 더한 것이 계산한 Loss가 될 것이고 이러한 과정이 m개의 sample에서 이루어지므로 시그마가 2개가 된 것이다.
Regularization term을 보면 시그마가 3개나 있다.
s는 Layer l에서 존재하는 unit의 수다. (bias는 제외)
만약 어떤 레이어 l의 unit이 5개이고 그 다음 레이어 (l + 1)의 unit이 4개라면 두 레이어 사이에 존재하는 파라미터 θ에 대한 행렬의 크기는 (다음 레이어의 unit 수) x (현재 레이어의 unit 수 +1)가 된다. 현재 레이어의 unit 수에 +1을 하는 이유는 bias까지 포함하기 위함이다
뉴럴넷의 cost function을 최소화하는 방법에 대해 알아본다.
뉴럴넷의 Cost function J는 위와 같이 정의하였다. 결국 Cost function으로 하고자 하는 것은 똑같다. J(θ)가 최소화되도록 하는 파라미터 θ를 찾는 것이 목표이며 그걸 찾기 위해 Gradient descent 알고리즘을
사용하면 J(θ)의 값과 각 파라미터에 대한 J(θ)의 편미분 값을 구해서 파라미터 θ를 업데이트해주면 된다.
우선 트레이닝 데이터가 하나만 있다고 가정한다.
일단 J(θ)값을 구하기 위해서 입력을 뉴럴넷에 넣고 출력 레이어에서 나오는 값 h(x)를 target값과 비교하여 cost 값을 구해야 한다.
그렇게 하기 위해 하나의 sample을 입력 레이어에 unit에 넣어 뉴럴넷을 통해 Forwad propagation시킨다.
이제 cost값을 구했으니 미분값을 구해야 한다. 뉴럴넷에선 역전파 알고리즘을 사용하여 미분값을 구하게 된다.
우선 각 노드에 대한 델타 값을 계산하는 것이 필요하다. 델타는 l 레이어에서 j라는 노드가 얼마나 error를 냈는지 나타낸 값이다.
델타 값이 크다면 해당 노드가 cost 값에 그만큼 많이 기여했을 것이다.
4개의 unit이 있는 출력 레이어에서 시작하여 델타값을 구해보자. 이 값은 활성화된 노드 값 a^4에서 yi를 뺀 것과 같다. a^4는 출력 레이어의 노드의 값이므로 h(x)라 할 수 있다. 다시 말해, 델타^4의 값은 출력 레이어의 한 유닛과 target값 사이의 차이가 된다.
그리고 델타는 벡터화 시켜서 더 편하게 구할 수 있다. 델타, a, y는 모두 class가 K일 때 k차원의 벡터가 된다.
이렇게 출력 레이어에서 델타^4에 대한 값을 구했으면 이제 이전 레이어에서 델타 값을 구해야 한다.
델타^4를 구했으니 델타^3을 구하기 위해선 다음과 같은 식을 통해 계산할 수 있다.
델타^3를 구하기 위해 θ^3의 transpose와 델타^4를 곱한 뒤 g'(z)를 곱한다.
g'은 sigmoid의 미분이다. g'(x) = g(x) * (1 - g(x))이므로 뒤에 곱해지는 g'(z)는 a와 1-a의 곱으로 표현할 수 있다.
이런 식으로 출력 레이어부터 거꾸로 델타 값을 계산할 수 있다. 그리고 입력 레이어는 입력 값이 들어오기 때문에 델타가 존재하지 않는다.
일단 Regularization을 제외하고 생각해보면 뉴럴넷에서 결국 우리가 구해야 하는 cost function J의 편미분 값은 다음과 같이 정리할 수 있다.
이제 트레이닝 set이 m개일 때 역전파 알고리즘이 어떻게 동작하는지 보자
Input 레이어를 제외한 각 레이어에서 델타 값을 구해나가면 된다. H(x)가 계산되기 전에 처음 델타는 0일 것이다.
앞에서 봤듯이 결국 이 델타는 우리가 cost function의 편미분 값을 구하기 위해 사용된다.
이제 m개의 샘플에 대한 편미분 값을 구하기 위해 이러한 For문을 반복한다.
처음에 입력 x를 받고, forward propagation으로 활성화 값 a를 계산해가며 출력 레이어까지 간다.
출력 레이어에서 나온 h(x) = a^L을 target값 y와 비교하여 델타^L을 구한다. 출력 레이어에서 델타를 구했으니 역전파로 입력 레이어 전까지 델타값을 구한다. 그리고 이렇게 계산되는 편미분 값을 저장해둔다. (이부분은 빨간식 처럼 벡터화시킬 수 있음)
이제 m개 샘플에 대한 델타 값을 구해놨으므로 for문을 나와 D를 계산한다.
j=0일 때 bias항을 뜻하기 때문에 람다항이 없다.
그 외 =0이 아닐 때는 regularization을 넣은 값으로 구한다.
증명은 하지 않지만 결국 이렇게 구한 D 값이 우리가 구하고자 했던 cost function에서 각 파라미터 θ에 대한 편미분 값이다.
이제 우리는 이렇게 구한 미분계수 값을 사용해서 learning rate를 가지고 파라미터 θ를 업데이트 시킬 수 있을 것이다.
Backpropagation에 대해 알아본다.
Input부터 시작해서 output layer에서 출력값을 내기까지 각 뉴런에서 이전 레이어로부터 값을 받아 다 더한 뒤 활성화 함수에 넣어준 값을 다음 레이어로 전달하는 Forward Propagation 과정을 거쳤다. 만약 3번째 레이어의 첫번째
unit(bias 제외)의 input 값 z를 구해보면 연결된
connection들의 파라미터 θ와 이전 레이어의 값 a들을 곱하여 구할 수 있다.
역전파가 어떻게 동작하는지 알아보기 위해 출력 레이어의 unit이 1개인 binary
classification의 cost function을 사용해보자.(출력 레이어의 unit이 한 개이기 때문에 앞에 시그마가 1개임, Regularization도 일단 사용 안 한다고 가정함)
뉴럴넷에서 각 레이어의 델타는 출력 레이어에서 시작하여 거꾸러 가면서 구할 수 있다.
델타^2_2가 구해지는 과정은 다음과 같다.
Forward pass 시 해당 뉴런의 edge가 2개 이므로 두 개의 파라미터 θ를 통해 다음 레이어로 전파시켰을 것이다. 따라서 역전파에서도 해당 뉴런에 연결된 파라미터를 가지고 구한다. 최종적으로 그 값은 연결된 3번째 레이어의 델타 값과 그 사이의 파라미터의 곱으로 구할 수 있다.
델타라는 건 결국 cost값에 해당 뉴런이 어느 정도의 영향을 끼쳤는지?로 해석할 수 있을 것 같다.
만약 델타^(3)_1을 구하기 위해 해당 뉴런의 이전 레이어에서 온 weighted sum = z^(3)_1를 cost function의 편미분 값을 구하여 얼만큼 영향을 줬는지 구한다.
'ML & DL > Coursera-ML' 카테고리의 다른 글
6-1 Evaluating a Learning Algorithm (0) | 2019.01.21 |
---|---|
5-2 Backpropagation in Practice (0) | 2019.01.21 |
4-3 Applications (0) | 2019.01.16 |
4-2 Neural Networks (0) | 2019.01.15 |
4-1 Neural Networks Motivation (0) | 2019.01.15 |