Machine Learning/ 신경망

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

신경망(Neural Network)

http://www.opennn.net/

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

신경망의 가설함수

https://www.coursera.org/learn/machine-learning/

  • 신경망의 가설함수는 feature와 파라미터를 곱한 후 시그모이드 함수에 대입하는 방식을 사용한다는 점에서 로지스틱 회귀와 동일하다. 다만 그 로지스틱 회귀를 각 노드별로 계산하며, feature와 파라미터가 이전 레이어의 노드(결과값)와 이전 레이어에서 현재 노드로 오는 엣지(가중치, θ)들로 이루어진다는 점에서 차이가 있다.
  • input layer를 제외하고 모든 노드는 이전 레이어의 노드와 이전 레이어의 각 노드에서 자신으로 향하는 모든 가중치(θ)를 이용하여 로지스틱 회귀 문제를 푼다.
    • 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라고 표기하는데, 하나의 히든 레이어에는 여러개의 노드들이 있고, 신경망 전체에 히든 레이어는 다시 여러개가 있으므로, 히든 레이어에 속하는 하나의 노드는 위첨자로 레이어, 아래첨자로 해당 레이어 속의 순서를 표기하여 노드를 구분한다.
    • 신경망 전체는 행렬이 되며, 각 레이어는 벡터가 된다.
  • 신경망의 노드 사이에 엣지가 대단히 많은 관계로 신경망에서 θ는 노드와 노드 사이의 모든 엣지를 하나의 행렬로 표기한다. 그에 따라 Ɵ(대문자 세타)로 표기한다.
    • 신경망에서 Ɵ는 위첨자로 레이어를, 아래첨자로 두 노드를 표기하여 어느 노드에서 출발하여 어느 노드로 향하는지를 나타내는데, 다음 노드가 먼저 표기 되니 주의 Ɵ23은 앞선 레이어의 3번째 노드에서 다음 노드의 2번째 노드로 향하는 엣지를 의미한다.

신경망의 Forward Propagation

https://www.coursera.org/learn/machine-learning/

  • 신경망의 Forward Propagation이란 신경망 각 노드의 계산을 앞쪽 레이어에서부터 순차적으로 계산해서 최종 output layer까지 전개해 나간다는 의미이다.
    • 비용 함수를 계산한 후에 Gradient Descent를 할 때는 이 과정을 거꾸로 전개하는데, 이를 Backward Propagation이라 한다. 아래 내용 참조.
  • 계산이 중첩되므로 위 이미지를 예로 들면
    1. 2번째 레이어의 1번째 노드 a12의 값은 input layer의 모든 노드들과 input layer에서 a12로 향하는 모든 가중치를 곱한 후 시그모이드 함수에 넣어 최종 결과를 계산한다.
      • 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번째 레이어의 노드를 계산한다.
      • 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까지 계산한다.

https://www.coursera.org/learn/machine-learning/

  • 신경망은 분류 문제인데, multi-class 분류를 하려면 최종 output layer의 노드를 여러개를 두면 된다.

신경망의 비용함수

https://www.coursera.org/learn/machine-learning/

  • 신경망은 로지스틱의 복잡한 버전이기 때문에, 비용함수 계산은 로지스틱의 비용 함수와 동일하다. 다만 한 번에 여러 분류를 풀어야 하는 경우, 그 분류 수만큼 loop를 더 돌아야 하므로 비용함수 식은 아래와 같다.
    • J(\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
      • m은 데이터셋의 개수, K는 분류의 개수를 의미한다.
      • 신경망에서 θ는 각 레이어별로 뒷레이어의 노드수 x (앞레이어의 노드수 + 1)의 개수를 가지므로, Regularization에서 모든 θ를 더하기 위해 3번의 loop를 돈다. (각 루프를 돌 때 θ의 제곱 값을 더하고 λ / 2m 으로 나누는 것은 이전과 같다)

신경망의 Back Propagation

https://www.coursera.org/learn/machine-learning/

  • Back Propagation은 신경망의 비용값을 기준으로 output layer에서부터 이전 레이어로 거꾸로 계산을 올라가는 것을 의미한다. Forward Propagation이 input layer에서 다음 레이어로 가는 것의 반대 방향이다. –왜 반대방향으로 계산해야 하는지는 아래 내용 참조.
  • 개념 정의
    • 신경망 각 노드의 비용값을 δ(델타)라고 하고 l 레이어의 j 요소의 비용 값을 δjl 이라고 표기한다.
    • ouput layer의 비용값 계산은 쉽다. 최종 ajl 값을 실제 yj 값과의 차이를 구하면 된다.
      • 만일 ouput layer가 4라면 δj4 = aj4 – yj 가 된다.
    • ouput layer에서 계산된 비용값은 바로 이전 레이어의 비용값을 계산하는데 사용된다.
      • 이때 이전 레이어의 각 노드의 비용 값은 자기 자신에서 다음 레이어의 레이어로 진행된 모든 경로의 비용을 함께 계산해야 한다. 그 비용은 노드의 비용과 그 노드로 향한 θ의 곱으로 표현된다.
      • 만일 ouput layer가 4이고, layer 3의 1번째 노드에서 output layer로 2개의 경로가 있었다면, δ13 = Θ113 δ14 + Θ213 δ24 가 된다.
      • 이렇게 계산된 layer 3 의 비용값은 layer의 2의 비용 값을 계산하는데 사용된다.이런식으로 output layer에서부터 거꾸로 계산이 진행되기 때문에 –input layer는 계산하지 않는다– Back Propagation이 된다.
  • 개념적인 Back Propagation의 내용은 위와 같은데, 실제 계산식은 좀 복잡하다. 강의에서도 이 부분에 대해서는 자세히 설명 안하니 그냥 식만 적으면 아래와 같다.
    • l이 output layer인 경우 layer l의 비용값 계산 (행렬 계산)
      • \delta^l = a^l - y
    • l가 output layer가 아닌 경우 layer l의 비용값 계산 (행렬 계산)
      •  \delta^l = (\Theta^l)^T \delta^{l+1} .* g'(z^l)
        • .*는 Element-Wise라고 하는 행렬 계산 방식인데, 행렬의 각 요소끼리의 곱을 의미한다. 행렬을 다루는 프로그램상에서 편의적으로 사용하는 것일뿐, 실제 수학에서 사용하는 개념은 아니다.
        • g'(zl)은 al .* (1 – al) 와 계산적으로 같다.

  • 머신러닝에서 비용함수를 계산하는 것은 비용을 최소화 하도록 θ 값을 조절하기 위함이다. 위의 계산은 각 노드별로 비용값 –θ를 이용하여– 을 계산한 것이고, 이것을 최소화 하기 위한 절차는 다음을 따른다.
    • m 개의 트레이닝 셋에 대하여 Δ –대문자 δ– 를 설정한다. Δijl 로 설정되는, i는 트레이닝셋, l은 레이어, j는 레이어의 요소를 의미한다.
    • 위의 노드별 δ를 구하여 Δ를 설정한 후에 Δ를 다음의 식을 이용하여 업데이트 한다.
      • \Delta_{ij}^l := \Delta_{ij}^l  + a_j^l \delta_i^{l+1}
    • 업데이트된 Δ의 평균치를 구하고 regularization을 통해 최종 D를 구한다. 이 D는 비용함수 J(Θ)의 Θijl에 대한 편미분값이 된다.
      • j가 0이면
        • D_{ij}^l := \frac{1}{m} \Delta_{ij}^l
      • j가 0이 아니면
        • D_{ij}^l := \frac{1}{m} \Delta_{ij}^l + \lambda \Theta_{ij}^l
    • 이전까지는 편미분된 값을 구하면 그걸 이용해서 θ를 업데이트 했는데, 여기서는 그냥 D를 구하는 것까지만 하고 끝난다.
[ssba]

The author

지성을 추구하는 디자이너/ suyeongpark@abyne.com

댓글 남기기

This site uses Akismet to reduce spam. Learn how your comment data is processed.