Search
Duplicate

Machine Learning/ 신경망

주의) 이 페이지에서는 공식의 유도 과정 같은 것은 정리하지 않는다. 공식의 유도 과정은 <코세라 강의> 참조.

신경망(Neural Network)

인간의 뉴런 네트워크를 모사하여 데이터를 분류하는 방법.
이전 노드들의 결과에 영향을 받아 현재 노드가 활성화가 될지 비활성화가 될지가 결정되고 최종적으로 output이 결정된다.
결국 노드는 활성화/비활성화로 결정되기 때문에 신경망은 로지스틱 회귀의 복잡한 버전이라고 생각하면 된다.
신경망으로 예측문제를 풀 수 있는지는 모르겠다. 코세라 강의에서는 분류 문제만 푸는데, 최종 output node가 각각의 분류에 해당하기 때문에 모델 자체가 분류 문제에 적합한 모양으로 보임
맨 앞의 입력과 맨 뒤의 출력 사이에 있는 레이어는 히든 레이어(hidden layer)라 불리며, 각 히든 레이어의 각 노드들은 하나의 로지스틱 회귀에 해당한다.
신경망을 단순화 하여 논리게이트 (AND, OR, XOR) 연산을 할 수도 있지만 그 내용에 대해서는 생략.

신경망의 가설함수

신경망의 가설함수는 feature와 파라미터를 곱한 후 시그모이드 함수에 대입하는 방식을 사용한다는 점에서 로지스틱 회귀와 동일하다. 다만 그 로지스틱 회귀를 각 노드별로 계산하며, feature와 파라미터가 이전 레이어의 노드(결과값)와 이전 레이어에서 현재 노드로 오는 엣지(가중치, θ\theta)들로 이루어진다는 점에서 차이가 있다.
input layer를 제외하고 모든 노드는 이전 레이어의 노드와 이전 레이어의 각 노드에서 자신으로 향하는 모든 가중치(θ\theta)를 이용하여 로지스틱 회귀 문제를 푼다.
a12=g(θ101x0+θ111x1+θ121x2+θ131x3)a_{1}^{2} = g (\theta_{10}^{1} x_{0} + \theta_{11}^{1} x_{1} + \theta_{12}^{1} x_{2} + \theta_{13}^{1} x_{3})
계산은 앞쪽 레이어에서부터 시작하여 그 결과가 뒤쪽 레이어에 반영 되기 때문에 뒤쪽 레이어의 함수에서 앞쪽 레이어의 함수가 중첩되어 나타난다.
히든 레이어의 노드들은 편의상 a라고 표기하는데, 하나의 히든 레이어에는 여러개의 노드들이 있고, 신경망 전체에 히든 레이어는 다시 여러개가 있으므로, 히든 레이어에 속하는 하나의 노드는 위첨자로 레이어, 아래첨자로 해당 레이어 속의 순서를 표기하여 노드를 구분한다.
신경망 전체는 행렬이 되며, 각 레이어는 벡터가 된다.
신경망의 노드 사이에 엣지가 대단히 많은 관계로 신경망에서 θ\theta는 노드와 노드 사이의 모든 엣지를 하나의 행렬로 표기한다. 그에 따라 Θ\Theta(대문자 세타)로 표기한다.
신경망에서 Θ\Theta는 위첨자로 레이어를, 아래첨자로 두 노드를 표기하여 어느 노드에서 출발하여 어느 노드로 향하는지를 나타내는데, 다음 노드가 먼저 표기 되니 주의 Θ23\Theta_{23}은 앞선 레이어의 3번째 노드에서 다음 노드의 2번째 노드로 향하는 엣지를 의미한다.

신경망의 Forward Propagation

신경망의 Forward Propagation이란 신경망 각 노드의 계산을 앞쪽 레이어에서부터 순차적으로 계산해서 최종 output layer까지 전개해 나간다는 의미이다.
비용 함수를 계산한 후에 Gradient Descent를 할 때는 이 과정을 거꾸로 전개하는데, 이를 Backward Propagation이라 한다. 아래 내용 참조.
계산이 중첩되므로 위 이미지를 예로 들면
1.
2번째 레이어의 1번째 노드 a12a_{1}^{2}의 값은 input layer의 모든 노드들과 input layer에서 a12a_{1}^{2}로 향하는 모든 가중치를 곱한 후 시그모이드 함수에 넣어 최종 결과를 계산한다.
a12=g(θ101x0+θ111x1+θ121x2+θ131x3)a_{1}^{2} = g (\theta_{10}^{1} x_{0} + \theta_{11}^{1} x_{1} + \theta_{12}^{1} x_{2} + \theta_{13}^{1} x_{3})
2.
같은 방식으로 2번째 레이어의 모든 노드를 계산한 후, 해당 레이어의 결과를 이용해 3번째 레이어의 노드를 계산한다.
a13=g(θ102a0+θ112a1+θ122a2+θ132a3)a_{1}^{3} = g (\theta_{10}^{2} a_{0} + \theta_{11}^{2} a_{1} + \theta_{12}^{2} a_{2} + \theta_{13}^{2} a_{3})
3.
같은 방식으로 최종 output layer까지 계산한다.
신경망은 분류 문제인데, multi-class 분류를 하려면 최종 output layer의 노드를 여러개를 두면 된다.

신경망의 비용함수

신경망은 로지스틱의 복잡한 버전이기 때문에, 비용함수 계산은 로지스틱의 비용 함수와 동일하다. 다만 한 번에 여러 분류를 풀어야 하는 경우, 그 분류 수만큼 loop를 더 돌아야 하므로 비용함수 식은 아래와 같다.
J(θ)=1m[i=1mk=1Kykilog(hθ(xi))k+(1yki)log(1hθ(xi))k]+λ2ml=1L1i=1slj=1sl+1(θijl)2J(\theta) = -\frac{1}{m} [ \sum_{i=1}^{m} \sum_{k=1}^{K} y_k^i \log (h_\theta(x^i))_k + (1 - y_k^i) \log (1 - h_\theta(x^i))_k ] + \frac{\lambda}{2m} \sum_{l=1}^{L-1} \sum_{i=1}^{s_l} \sum_{j=1}^{s_{l+1}} (\theta_{ij}^{l})^2
mm은 데이터셋의 개수, KK는 분류의 개수를 의미한다.
신경망에서 θ\theta는 각 레이어별로 뒷레이어의 노드수 x (앞레이어의 노드수 + 1)의 개수를 가지므로, Regularization에서 모든 θ\theta를 더하기 위해 3번의 loop를 돈다. (각 루프를 돌 때 θ\theta의 제곱 값을 더하고 λ2m{\lambda \over 2m}으로 나누는 것은 이전과 같다)

신경망의 Back Propagation

Back Propagation은 신경망의 비용값을 기준으로 output layer에서부터 이전 레이어로 거꾸로 계산을 올라가는 것을 의미한다. Forward Propagation이 input layer에서 다음 레이어로 가는 것의 반대 방향이다. –왜 반대방향으로 계산해야 하는지는 아래 내용 참조.
개념 정의
신경망 각 노드의 비용값을 δ\delta(델타)라고 하고 ll레이어의 jj요소의 비용 값을 δjl\delta_{j}^{l}이라고 표기한다.
ouput layer의 비용값 계산은 쉽다. 최종 ajla_{j}^{l}값을 실제 yjy_{j}값과의 차이를 구하면 된다.
만일 ouput layer가 4라면 δj4=aj4=yj\delta_{j}^{4} = a_{j}^{4} = y_{j}가 된다.
ouput layer에서 계산된 비용값은 바로 이전 레이어의 비용값을 계산하는데 사용된다.
이때 이전 레이어의 각 노드의 비용 값은 자기 자신에서 다음 레이어의 레이어로 진행된 모든 경로의 비용을 함께 계산해야 한다. 그 비용은 노드의 비용과 그 노드로 향한 θ의 곱으로 표현된다.
만일 ouput layer가 4이고, layer 3의 1번째 노드에서 output layer로 2개의 경로가 있었다면, δ13=Θ113δ14+Θ213δ24\delta_{1}^{3} = \Theta_{11}^{3} \delta_{1}^{4} + \Theta_{21}^{3} \delta_{2}^{4} 가 된다.
이렇게 계산된 layer 3 의 비용값은 layer의 2의 비용 값을 계산하는데 사용된다.이런식으로 output layer에서부터 거꾸로 계산이 진행되기 때문에 –input layer는 계산하지 않는다– Back Propagation이 된다.
개념적인 Back Propagation의 내용은 위와 같은데, 실제 계산식은 좀 복잡하다. 강의에서도 이 부분에 대해서는 자세히 설명 안 하니 그냥 식만 적으면 아래와 같다.
ll이 output layer인 경우 layer ll의 비용값 계산 (행렬 계산)
δl=aly\delta^l = a^l - y
ll가 output layer가 아닌 경우 layer ll의 비용값 계산 (행렬 계산)
δl=(Θl)Tδl+1.g(zl)\delta^l = (\Theta^l)^T \delta^{l+1} .* g'(z^l)
..*는 Element-Wise라고 하는 행렬 계산 방식인데, 행렬의 각 요소끼리의 곱을 의미한다. 행렬을 다루는 프로그램상에서 편의적으로 사용하는 것일뿐, 실제 수학에서 사용하는 개념은 아니다.
g(zl)g'(z^{l})al.(1al)a^{l} .* (1 - a^{l}) 와 계산적으로 같다.
머신러닝에서 비용함수를 계산하는 것은 비용을 최소화 하도록 θ\theta 값을 조절하기 위함이다. 위의 계산은 각 노드별로 비용값 –θ\theta를 이용하여– 을 계산한 것이고, 이것을 최소화 하기 위한 절차는 다음을 따른다.
mm개의 트레이닝 셋에 대하여 Δ\Delta를 설정한다. Δijl\Delta_{ij}^{l}로 설정되는, ii는 트레이닝셋, ll은 레이어, jj는 레이어의 요소를 의미한다.
위의 노드별 δ\delta를 구하여 Δ\Delta를 설정한 후에 Δ\Delta를 다음의 식을 이용하여 업데이트 한다.
Δijl:=Δijl +ajlδil+1Δ\Delta_{ij}^l := \Delta_{ij}^l  + a_j^l \delta_i^{l+1}\Delta
업데이트된 Δ\Delta의 평균치를 구하고 regularization을 통해 최종 DD를 구한다. 이 DD는 비용함수 J(Θ)J(\Theta)Θijl\Theta_{ij}^{l}에 대한 편미분값이 된다.
jj00이면
Dijl:=1mΔijlD_{ij}^l := \frac{1}{m} \Delta_{ij}^l
jj00이 아니면
Dijl:=1mΔijl+λΘijlD_{ij}^l := \frac{1}{m} \Delta_{ij}^l + \lambda \Theta_{ij}^l
이전까지는 편미분된 값을 구하면 그걸 이용해서 θ를 업데이트 했는데, 여기서는 그냥 D를 구하는 것까지만 하고 끝난다.