본문 바로가기
데이터 과학 관련 스터디/cs231n

cs231n 4강 Introduction to Neural Networks정리

by inhovation97 2020. 10. 31.

3강까지는 Loss function(손실 함수)의 정의를 알아보고 종류도 살펴봤습니다.

우리는 이 손실함수를 최소로하는 방향으로 가중치 W를 수정하는 optimization의 개념도 배웠습니다.

 

이번 4강은 가중치 W를 수정하는 방식에 대해 여러가지 예시로 자세히 살펴본 뒤, Neural Network의 개념을 배웁니다.

  • 3가지 예시를 통한 Back propagation
  • Neural Network

 

<Back propagation>

 

우선 우리가 3강에서 배운 것을 복기합니다.

이미지를 분류하기 위한 각 class별 스코어를 알려주는 scores function인 Wx를 배웠습니다.

그리고 Loss function(손실 함수)도 힌지로스와 cross-entropy 2가지를 배웠는데 여기서 과적합을 방지하기위한 규제항도 배웠습니다.

 

2번째 슬라이드는 3강에서의 슬라이드인데 4장은 저번 시간에 배운 loss function을 최소화 하는 가중치 w를 수정하는 방식에 대해서 더 자세히 배우게됩니다. 

 

*슬라이드에 규제항이 포함된 손실 함수는 씨그마가 들어가 있는데, 굳이 구분하기를 data point하나하나에 초점을 맞춘 함수는 Loss function이라고 하고, 전체 Loss function을 평균해준 함수를 cost function이라고 부른다고합니다. 해당 강의에서는 이를 구분하지는 않네요. 보통 후자의 함수를 최소화하는 방향으로 가중치 w를 수정합니다.

 

정리하자면, 우리는 Gradient Descent(경사 하강법)을 이용해 손실 함수가 최소화되는 가중치 w를 수정해나갈 것입니다. 여기서 계산방식의 효율이 높은 analytic gradient 방식으로 chain rule(합성 함수의 미분)을 이용합니다. 이 계산 방식을 3가지의 예제를 통해 익힐 것이며, 여기서 쓰이는게 바로 Back propagation(오차 역전파)입니다. 결과값에서 거꾸로 거슬러서 가중치 w를 계산해주는 것입니다!

 

용어들이 굉장히 헷갈리는 시점이 꼭 옵니다! 오차역전파는 가중치를 계산하는 방식으로 생각하고, 경사 하강법은 가중치를 업데이트하는 방식으로 생각하면 됩니다. 그래서 이번 4장은 업데이트가 아닌 가중치를 계산하는 방법만 다룹니다.

위 모델들을 보면, input부터 loss함수를 도출할 때까지의 노드들이 엄청납니다. 우린 이런 방대한 모델의 가중치를 계산해야합니다. 하지만 우리는 Back propagation으로 chain rule통해 반복적인 계산으로 전부 구할 수 있습니다.

 

 

<첫번째 예시>

  • 우선 쉬운 함수 f를 정의했습니다.
  • 우리는 반대로 거슬러 올라가면서 가중치를 계산해 줄 겁니다. 이게 바로 Back propagation인 것이죠.
  • 우선 최종 f값은 df/df이므로 자기자신을 미분했으니 1이 될 겁니다.

 

  • f=qz로 정의했고, df/dz를 계산합시다.
  • z의 가중치는 q이므로 3(=5-2)이 됩니다.

  • 같은 방식으로 q의 가중치는 z인 -4가 됩니다.
  • 이제 더하기 노드인 x와y의 가중치를 구합니다.
  • df/dq*dq/dy로 체인룰을 이용합니다.
  • 빨간색 사각형안에 식을 보면 dq/dx, dq/dy는 1로 우리가 이미 구해놨습니다.
  • df/dq(=-4) * dq/dy(=1) = -4가 되는 것입니다. 
  • x도 똑같습니다.

그럼 이제 공식을 알아봅시다.

 

  • 우리는 체인룰을 이용해서 합성함수의 미분을 풀어냅니다.
  • 체인룰은 위와같이 global gradient*local gardient 로 표현합니다.
  • dL/dx의 예로 봅시다.
  • dL/dz은 global gradient가 되고, dz/dx는 local gradient가 됩니다.

 

항상  global gradient는 앞 노드에서 구해지기 때문에 체인룰을 이용하면 항상 계산이 가능합니다!

다른 예시로 더 익혀봅시다.

 

<두번째 예시>

 

이번 함수는 3강에서 제가 말한 시그모이드 함수가 예시로 나왔습니다.

아래 4개의 미분값들은 여러 함수들의 미분 값들을 표시해놓은 것입니다.

 

  • 마지막 노드의 f 미분값부터 구해봅니다.
  • 자기 자신을 미분하면 1이 나옵니다.
  • 1/x 노드에서는 이를 미분하면 빨간색 박스에 그 미분값이 있습니다.
  • (-1/1.37)^2은 위에서 말한 local gradient가 되고, 1은 global gradient가 되기에 그 곱인 -0.53이 나옵니다.

  • 1/x노드를 반대로 거쳤으니 f는 다시 c+x의 형태가 됩니다.
  • 여기서 global gradient가 -0.53이고  local gradientc+x를 미분하면 1이 되므로 그 곱인 -0.53이 그대로 계산됩니다.

 

  • exp노드입니다. exp은 사실 많이 사용하는 이유중에 하나가 미분값이 그대로이기 때문입니다.
  • 체인룰을 적용하면, global gradient는 -0.53 local gradient는 e의 역수가 되는데 e는 약 2.71이므로 -0.53을 2.71로 나누면 그 값은 -0.2에 수렴하기 때문에 저런 값이 나온겁니다.

계속해서 앞선 노드에서 global gradient 값이 나오기 때문에 체인룰에 의해 계산이 매우 쉽습니다.

 

  • local gradient이 -1이므로 0.2가 나왔습니다.

 

  • 더하기 노드는 이렇게 가중치를 뿌려줍니다.

  • 곱하기 노드는 서로의 값을 바꿔줍니다. 서로가 서로의 계수가 되니까 말이죠.

 

  • 사실 우리가 여태껏 체인룰을 통해서 구해온 저 파란색 박스 부분은 sigmoid gate로 한번에 계산이 가능합니다. 일반화된 공식이 있습니다! 시그모이드 함수의 장점입니다!

 

이제 우리는 gate들을 이렇게 일반화 시킬 수 있습니다.

더하기 게이트는 현재의 가중치를 다음 단계로 뿌려주기 때문에 gradient distributor라고 칭하네요.

맥스 게이트는 큰 값에 부여해줍니다.

곱하기 게이트는 서로의 값을 바꿔줍니다!

우리는 이제 공식을 일반화시켰기 때문에 이를 이용해 빠른 계산이 가능합니다!

 

우리는 이미지 데이터를 다룹니다. 일전에도 말했지만, 이미지 데이터는 모든 픽셀 값들을 1차원 array로 재배치하기 때문에 차원이 굉장히 높습니다. class도 여러개인 이미지 데이터의 가중치는 엄청나게 큰 행렬일 수 밖에 없습니다. 이럴 경우에는 Jacobian matrix(행렬의 미분연산)를 이용한다는 설명입니다. 이 행렬은 너무 크지만 diagonal의 특성으로 대각행렬만 계산하면 되기 때문에 간단하다는 설명입니다!

 

<세번째 예시>

  • 이번에는 L2 정규화를 한 함수 f를 알아봅시다. x는 n차원 W는 n*n 차원입니다.
  • 이 예시는 2장에 linear regression의 예시로 접해본 구성입니다. 클래스가 3개라서 w의 차원이 x 차원보다 많았었죠.

 

  • L2의 최종값은 0.116이 나왔고, 출력노드의 미분값은 당연히 1입니다.
  • [0.22, 0.26]의 값은 W와 x의 행렬 연산으로 간단히 나온 값입니다.

 

  • f(q)로 함수를 지정했을때, 맨아래 식 처럼 q^2의 sum으로 표현 가능합니다.
  • 이들은 전부 2q로 미분 되므로 가중치는 곱하기 2를 해준 [0.44, 0.52]가 됩니다.

  • 이제 곱하기 게이트입니다.
  • 곱하기 게이트는 서로가 서로의 계수이기 때문에 서로 바꿔주면 된다고 위에서 설명했습니다.
  • [0.2, 0.4] * [0.44, 0.52] 를 서로 행렬 계산해서 2*2 행렬을 만들어 줍니다! W가 2*2 행렬이기 때문이죠.
  • 그래서 [[0.2*0.44, 0.4*0.44], [0.2*0.52, 0.4*0.52]]의 값이 도출된 것입니다.

공식으로 x에는 local gradient가 w값들이 됩니다!

전치를 조심해야합니다. 트랜스포즈를 한 이유는 wx에서 x1에 들어가는 w가 0.1과 0.3이기 때문입니다.

따라서 (0.1*0.44)+(-0.3*0.52)=-0.112, (0.5*.044) + (0.8 * 0.52) = 0.636 의 값이 도출된 것입니다.

 

이렇게 Back propagation(오차 역전파)를 마무리합니다. 파이썬 코드와 과제에 대한 슬라이드는 넘어갑니다.

 

<Neural Network>

 

우리는 이제 단순한 Linear regression이 아니라 히든레이어를 추가합니다.

히든 레이어를 input노드와 ouput노드 사이에 100개를 추가했고, 이를 102 - layer라고 하는게 아니라, 2 - layer NN이라고 합니다.

이는 예로 들었을때, NN(Nerest Neighbor)와 같은 모델은 각각 하나의 클래스에 하나의 분류기로만 이용해서 그 특징에만 부합한 클래스만 부여했던 것인데 히든레이어를 포함하므로써 한개의 클래스에도 여러개의 분류기가 생겨 다양한 특징을 잡아 분류할 수 있게 된 것입니다.

 

이렇게 2-layer, 3-layer NN을 만드는데, 함수는 max함수를 이용하게 됩니다.

이는 활성화 함수를 말하는데 예전에는 시그모이드를 활성화 함수로 많이 이용했지만, 최근에는 relu함수를 많이 이용하죠. relu 함수는 아래에 나옵니다.

이런 뉴럴 네트웍이 꼭 우리의 신경망과 너무나도 비슷한 것이죠. 

데이터를 input해서 w를 부여하고 활성화 함수를 통해 출력값을 출력하는 것입니다.

위에서 말한 시그모이드 함수가 바로 대표적인 예입니다.

 

하지만 실제 생물학과는 다른 면이 많으니 혼동하지 말라고 주의를 주네요 ㅋㅋ

 

사실 활성화 함수는 많은 과정을 거쳤습니다.

이게 사실 기울기 소실이라는 문제 때문인데 이는 설명하지 않고 여러 활성화 함수들을 설명하네요.

나중에 더 자세히 다룰 듯 합니다.

 

이렇게 인풋, 여러 개의 히든, 아웃풋 레이어는 전부 서로의 모든 노드에 관여하여 값을 도출합니다.

그래서 이를 FC(Fully Conneted) 라고 합니다.

 

이번 강의의 핵심은 Back propagation으로 w 가중치 계산법이었고,

뉴럴네트웍을 살짝 살펴봤습니다.

5장은 이제 드디어 CNN의 구조를 살펴볼 것 같습니다!

 

*강의자료

cs231n.stanford.edu/2017/syllabus.html

 

Syllabus | CS 231N

Lecture 8 Thursday April 27 Deep Learning Software Caffe, Torch, Theano, TensorFlow, Keras, PyTorch, etc [slides] [video]

cs231n.stanford.edu

 

댓글