※ 본 내용은 stanford에서 제공하는 cs231n 강의, 강의자료를 바탕으로 작성하였습니다.

 

Lecture5에서는 Convolutional Neural Network이 무엇이고, 어떻게 동작하는지에 대해 설명하고 있다.

 

- History

먼저 CNN의 역사에 대해 설명하고 있다.

다양한 이미지를 보여주면서 고양이의 뇌파를 추적해본 유명한 실험이다. 

각각의 모양, 특징마다 반응하는 영역이 달랐다. 

 

이후 초기의 CNN구조에 대한 연구에서도 층을 hierical하게 쌓고, sandwich 구조를 통해 

간단한 특징과 복잡한 특징에 대해 구분되어 반응할 수 있도록 설계하게 된다. 

 

이어서 AlexNet과 같은 최근의 구조를 설명하고,

다양한 쓰임(classification, 동작 인식, segmentation 등)에 대해 간단하게 소개하고 있다. 

 

- 구조

● Convolution Layer

먼저 기존의 Nueral Network에서 다뤘던 layer인 fully connect layer는 input을 하나의 vector로 전환하고, weight vector와 곱하여 output을 출력한다.

 

이와 다른 Convlution Layer의 가장 큰 특징은 input의 spatial structure를 유지한다는 것이다.

 

Convolution 연산

기본적으로 Filter가 input image의 각 영역을 slide하며 연산을 수행하게 된다.

위 이미지는 32x32x3 크기의 이미지의 하나의 영역과 5x5x3 filter의 연산을 나타내는 이미지로, 각 영역마다 하나의 값을 출력하게 된다. 

연산 내용을 벡터로 나타내고 있는데, elementwise 곱의 sum과 동일하다. 

(※ 사실 기존에 convolution 연산에서 필터와 각 영역의 elementwise곱을 하는 것이 어떤 의미인지 정확히 감이 안왔었는데, 내적으로 이해하면 filter가 특정 영역에 반응한다는 것이 어떤 의미인지 더 와닿았다.)

 

stirde = 1 이라고하면 출력은 28x28x1 이 될 것이고, 또 다른 필터를 적용하면 새로운 28x28x1 output이 출력될 것이다. 

(stride : filter가 이동하는 보폭)

※ 수업 질문 :

Q) stride 설정 시 고려할 점은 무엇인지?

A)

downsampling : pooling과 같은 효과를 stride를 통해서도 얻을 수 있음.

# of parameters : 전체 모델의 parameters 수를 줄일 수 있음. 

                       그러나 stride를 늘려 parameter를 줄이는 것은 information loss이므로, 성능에는 안 좋을 수 있음.

(모델 크기-복잡도 trade-off)

 

ConvNet 구조

ConvNet은 기본적으로 위와 같은 구조를 갖게 된다. 

앞서 간단한 특징부터 복잡한 특징까지 서로 다른 영역이 반응한다고 했는데, CNN 역시 그런 특징을 보인다.

 

VGG-16(CNN 모델)의 학습된 Weight를 시각화한 결과이다.

앞의 layer의 weight일수록 '선'과 같이 비교적 low-level feature를 보이고, 깊어질수록 high-level feature를 보인다. 

각 layer의 출력 시각화

Pooling에 대해서는 아직 다루지 않았지만, 결국 CNN의 원리를 다음과 같이 정리할 수 있다.

 

(1) 각 filter별로 학습된 weight는 feature에 대한 정보이다. 즉, 각 filter별로 어떠한 특징에 반응한다.

('Deep learning에서는 feature를 스스로 학습한다'는 의미가 더욱 와닿는다.)

Convolution 연산을 거치며 주어진 image에서 해당 feature 관련 정보를 추출한다.

 

(2) 깊은 layer의 filter일수록 복잡한 feature 정보를 추출한다.

 

(3) 마지막 layer에서 각 feature 정보를 종합한 새로운 feature(사람이 이해하기 어려운)가 출력될 것이고, 해당 feature를 통해 fully connect layer를 거쳐 classification을 진행한다. 

 

● Padding

Padding의 필요성

stride = 3, 7x7 크기의 이미지라면 3x3 크기의 필터를 적용할 수 없을 것이다. 

따라서 상하좌우로 0을 채워 이미지 크기를 조정할 때, zero padding을 사용한다.

padding의 필요성

7x7 크기의 이미지에 pad = 1을 적용한 후, 3x3 filter를 거치면 output은 input의 shape와 동일한 7x7 이미지가 된다.

이처럼 output 크기를 조정하기 위해서도 padding은 사용된다. 

 

 

Input의 크기, filter의 크기, padding 정보 그리고 stride 값이 주어질 때, output의 크기는 위와 같이 공식화 할 수 있다.

 

 

● Pooling layer

Pooling layer는 학습되는 layer는 아니다.

연산을 통해 image를 downsampling하는 등의 역할을 수행한다.

 

대표적으로 max poling 연산이 있다.

※ 수업 중 나온 질문 :

Q) Average pooling보다 max pooling이 선호되는 이유?

A) Average pooling도 사용할 수 있다. 다만 max pooling을 사용하면 어떤 특징에 response하는지 안하는지에 대해서 좀 더 집중할 수 있을 것이다. 

 

● Fully Connected Layer

앞서 정리한 것처럼, convolution layers를 거치며 추출된 정보를 input하는 일반적인 nueral network처럼 동작한다. 

 

※ 수업 질문 :

Q) 그럼 언제쯤(얼마나 많은 convolution layer를 지나고) fully connected layer를 삽입해야되는지?

A) 실험적으로 결정해야 된다.

각 layer의 의미를 고려하면서 여러 실험을 진행하면 좋다.

'Computer Vision > cs231n' 카테고리의 다른 글

[Lec 7] Training Neural Networks, Part2  (0) 2022.01.15
[Lec6] Training Neural Networks, Part 1  (0) 2022.01.10
[cs231n] Assignment1-Q5  (0) 2022.01.01
[Assignment1 - Q4] 2-layer NN  (0) 2022.01.01
[Lec 4] Backpropagation and Neural Network  (0) 2021.12.30


※ 본 내용은 stanford에서 제공하는 cs231n 강의, 강의자료를 바탕으로 작성하였습니다.

 

Assignment1의 마지막 과제인 Q5에서는 이미지로부터 feature를 extraction한 후 extraction한 feature에 대해 학습하는 내용을 다루고 있다.

feature extraction 코드로 제공되고, 앞선 과제에서 만들어둔 model을 이용하여 실험을 진행한다.

 

Lecture3의 슬라이드로, feature eatraction을 거친 후 training하는 것과 raw pixel을 통해 training하는 과정의 차이를 보여준다.

 

- 0. Extract Feature

우선 앞선 과제들과 동일하게 CIFAR10 데이터를 사용하고, 제공되는 feature extraction 코드를 이용해 새로운 data로 생성한다.

ex) X_train -> X_train_feats

 

참고로 Histogram of Oriented Gradients(HDG) 와 color histogram에 대한 feature를 추출한다고 한다.

 

- 1. Train Linear SVM

먼저 Linear SVM 모델에 대해 학습을 진행해본다.

learing_rate 등의 파라미터를 조정하여 40% 이상의 정확도가 나와야 된다고 한다.

 

실험에 대한 코드는 생략하고,

learning rate와 regularization strength 그리고 num_iters를 적절히 조정하여 조정하여 47%의 정확도를 얻을 수 있었다.

 

Q2에서 SVM을 통한 정확도가 40% 정도로 나왔던 것을 생각해보면, 단순 raw pixel을 이용한 것보다 더 좋은 성능을 보이는 것을 확인할 수 있다.

- train 2-layer network

다음으로는 2-layer network에 대해 실험을 진행한다. 

 

여태까지 실험한 모델들 중 가장 좋은 성능을 보일 것이라고 한다.

(55%~60%의 정확도)

 

이미 dropout을 추가로 구현해놨기 때문에, learning_rate와 num_epochs 만 간단하게 조정하면서 실험을 진행한 결과, 

59%의 정확도를 달성할 수 있었다.

 

2 layer net만으로도 60% 정도의 정확도를 달성할 수 있을 정도로, feature extraction을 통해 큰 성능 향상을 얻을 수 있었다.

 

 

 

 

'Computer Vision > cs231n' 카테고리의 다른 글

[Lec6] Training Neural Networks, Part 1  (0) 2022.01.10
[Lec5] Convolutional Neural Network  (0) 2022.01.09
[Assignment1 - Q4] 2-layer NN  (0) 2022.01.01
[Lec 4] Backpropagation and Neural Network  (0) 2021.12.30
[Assignment1 - Q3] Softmax  (0) 2021.12.30

 


※ 본 내용은 stanford에서 제공하는 cs231n 강의, 강의자료를 바탕으로 작성하였습니다.

 

Q4에서는 affine 계층 및 SVM, softmax loss를 layer로 구현한 후, layer들을 이어붙여 2-layer Neural Network를 구현하는 내용을 다룬다. 

 

- Setup

이전 과제들과 마찬가지로 CIFAR10 data를 load하여 사용하고, shape는 위와 같다. 

 

- Affine Layer (Forward/Backward)

Forward

Affine layer의 forward 연산은 굉장히 단순하므로 코드는 생략하겠다. 

N : 데이터의 수, D : 데이터의 차원, M : class의 수라고 할 때,

X = NxD, W = DxM 으로, X와 W의 곱만 수행하면 된다(+bias). 그 결과는 NxM 크기의 행렬이 된다. 

 

Backward

역전파의 경우도 사실 계산은 간단하기 때문에 코드는 생략하겠다.

X, W, b에 관한 미분을 각각 dX, dW, db 라고 하면 

위와 같이 계산된다.

 

사실 affine 계층의 역전파 수식은 자주 쓰여서 알고 있었고, 또 shape를 맞추면 된다는 설명을 통해서 쉽게 기억할 수 있었다.

그러나 행렬과 행렬의 미분을 유도하는 과정은 쉽지 않았다.

 

(0) 행렬과 행렬의 미분?

행렬의 미분

가장 문제가 된 부분은 위와 같은 미분이다. 

막상 유도를 하려다 보니 행렬과 행렬의 미분 자체에 대한 정의가 애매했다.

구글링을 해봐도 행렬과 행렬의 미분에 대한 정의가 명확하게 나온 자료가 없었고, 사실 수학적으로 명확한 정의가 없다는 내용도 있었다.

matrix-scalar 미분 -> matrix-vector 미분 -> matrix-matrix 미분 의 순서로 확장하면 미분을 정의할 수 있다고 한다. 

 

그러나 계산 그래프를 이용하는 대부분의 경우에는 아래와 같이 행렬과 행렬의 미분을 적용하지 않고도 바로 역전파를 계산할 수 있다.

 

(1) L이 scalar인 경우

http://cs231n.stanford.edu/handouts/linear-backprop.pdf)의 자료를 바탕으로 이해했다. 

(※ 이 부분에 대한 설명은 위 링크의 자료를 이용하였습니다.)

 

$\frac{\partial Y}{\partial W} $를 직접 계산하기 보단, chain룰을 이용한다. 

 

간단하게 X와 W가 위와 같다고 하자.

$ \frac{\partial L}{\partial Y}$는 스칼라를 행렬로 미분하는 방법을 통해 얻을 수 있다. 

스칼라를 행렬로 미분하는 방법을 몰랐더라도, 위 식을 보면 이해할 수 있을 것이다. 

마찬가지로 $ \frac{\partial L}{\partial X}$도 식 (6)과 같이 나타낼 수 있고, $ x_{1, 1}$의 식에 집중하면 식 (7)과 같이 나타낼 수 있다.

(2개의 시그마가 붙는 이유에 대해서는 편미분을 확인하면 된다.)

다시 (7)의 식을 좀 더 직관적으로 표시해보면, 

(10) -> (11)로 가는 과정이 이상하게 보일 수 있는데, 식 (7)의 시그마를 간단히 표현하기 위해 나타낸 것이라고 생각하면 된다. 

다른 경우에 대해서도 일반화해보면 $ \frac{\partial L}{\partial Y}$ 의 식은 유도할 수 있다.

 

- ReLU (forward/backward)

● Forward

마찬가지로 ReLU도 forward는 매우 간단하므로, 구현은 생략하겠다.

 

Backward

Backward는 직관적으로 구현하긴 했지만,

활성화되는 경우는 그대로 전달되므로 미분값이 1, 그렇지 않으면 0으로 구현했다.

결국 정답은 맞았지만 이 부분도 행렬과 행렬의 미분이라 조금 더 생각해봐야한다.

 

- 기타 layers

추가로 softmax와 svm loss를 layer로 구현했다.

해당 부분은 Q2, Q3에서 다룬 내용과 거의 동일하므로 생략하겠다.

 

- 2-Layer Net

다음으로 앞서 구현한 layer들을 이용하여 2-layer network를 구현했다. 

먼저 구현 내용을 계산 그래프로 구현하면 위와 같다.

 

코드로 구현한 내용은 위와 같다.

'dropout 계층 추가 실험' 주석 밑의 if문을 제외하면 앞서 계산그래프와 동일하다.

~_forward 연산은 앞서 구현했고 코드를 생략한 내용이지만 직관적으로 이해할 수 있을 것이다.

 

다만 반환값의 경우 (forward 연산값, input) 값이다. 역전파 계산시 필요한 값을 forward에서 return하고 cache_~ 로 저장하여 관리한다.

 

※ 수정 : Dropout의 출력이 잘못되어있다. Dropout을 적용할 시, test time에는 dropout확률을 곱해줘야한다. 

 

● dropout

dropout은 뒷부분에서 튜닝을 통해 성능을 올리는 과제를 진행하는 과정에서 추가한 것인데, 코드가 나왔으므로 같이 살펴 보겠다.

먼저 계산 그래프로는 다음과 같다.

dropout 역시 하나의 layer로 생각하면 된다.

dropout에 대해서는 다음 그림이 잘 설명하고 있다.

학습 시에 random하게 일부 class에 대한(hidden layer일 경우라도 class라고 표현했다.) score를 비활성화하여(0으로 만들어서 없는 것처럼 동작) 줄여 과적합을 방지하는 기법이다.

코드를 보면 dropout이 True인 경우 random하게 선택된 class의 score를 0으로 만든다는 것을 확인할 수 있다.

 

 

다음으로 loss를 계산하고 미분값도 return하는 코드이다. 

loss를 계산하면서 동시에 미분을 계산하는 방식으로 구현되어 있다.

미분은 각 layer마다 backward로 구현해두어서, 역전파 순서대로만 진행을 하면 된다.

 

dropout의 경우 drop한 class의 열에만 0을 곱해주면 된다.

(ReLU의 경우와 비슷하다.)

 

추가로 앞서 설명에 regularization term이 빠져있는데, 그 부분만 추가해주면 2-layer network가 완성된다. 

(regularization term은 미분의 편리함을 위해 0.5를 곱해준다)

- train

다음으로 Solver class를 이용해서 train을 진행하는 내용이다.

 

Solver의 경우 train을 진행해주는 class로 model(앞서 구현한 2-layer network)과 데이터 그리고 기타 설정을 인자로 전달해주면 model을 학습시켜주는 class라고 이해하면 된다.

 

제공된 코드로 꽤 복잡하지만 우선 핵심적으로 다음 흐름만 이해하면 될 것 같다.

 

 - init을 통해 여러 설정 초기화(learning rate, batch size 등등)

 - train이 시작되면 매 iteration마다 step 호출

 - step에서는 SGD를 활용하여 weight update

 

사용 자체는 매우 간단하다.

 

제공된 설명에 따르면 default 세팅으로 처음 train을 돌리면 대략 36% 정도의 validation 정확도가 나와야된다고 하는데, 기본설정에서도 40% 이상의 정확도가 나오긴했다.

(첫번째 실험 시에는 dropout을 추가하지 않았음.)

 

train 과정
weight 시각화

시각화 코드도 제공해서, 꽤 높은 퀄리티로 training process를 경험해볼 수 있다. 

 

● Tuning

마지막으로 튜닝을 통해서 validation 성능을 48%이상으로 높이고 test 성능도 48% 이상 나오게 하라는 과제가 있었다.

다양한 수정을 해도 상관이 없다고 한다(ex) dropout).

최종 코드는 위와 같지만, 실험은 다음과 같이 진행했다.

 

  1. learning_rate와 reg(regularization strength)와 num_epochs의 여러 조합에 대해 비교

  2. 그 중 가장 좋은 model을 찾았지만 validation accuracy가 48%를 넘지 못했음.

  3. 시각화 결과 과적합 문제가 있어서, dropout도 추가(2-Layer Net에 추가로 구현한 부분)

 

 (Solver._step()에서 loss를 계산할 때(미분을 계산할 때) dropout 옵션을 True로만 설정하면 된다.)

 

그 결과 validation과 test에 대해 각각 50%와 49%의 정확도를 달성할 수 있었다.

최대 score가 52% 라고 한다.

 

 

 

 

 

'Computer Vision > cs231n' 카테고리의 다른 글

[Lec5] Convolutional Neural Network  (0) 2022.01.09
[cs231n] Assignment1-Q5  (0) 2022.01.01
[Lec 4] Backpropagation and Neural Network  (0) 2021.12.30
[Assignment1 - Q3] Softmax  (0) 2021.12.30
[Assignment1 - Q2] SVM  (0) 2021.12.30


※ 본 내용은 stanford에서 제공하는 cs231n 강의, 강의자료를 바탕으로 작성하였습니다.

 

Lecture 4 에서는 역전파(Backpropagation) 과 Neural Network에 대해 다루고 있다. 

<Backpropagation>

- Backpropgation이란?

Backpropagation이란, 계산 그래프와 연쇄 법칙(chain rule)을 통해 미분을 간단하게 하는 방법이다.

계산 그래프

먼저 간단한 계산 그래프는 위와 같다.

f = (x+y)z의 계산과정에서, 각 연산을 node 단위로 나눠 표현할 수 있다.

 

이렇게 하면 각 node 별 미분 값(local 미분 값)은 간단하게 구할 수 있는데, 이에 연쇄법칙까지 적용하면 각 변수에 대한 미분을 쉽게 구할 수 있다는 것이 역전파의 아이디어이다. 

(물론 f = (x+y)z 는 이러한 단계를 거치지 않아도 쉽게 미분할 수 있지만, 복잡한 경우 역전파를 이용하면 훨씬 간단하게 계산할 수 있다.)

 

역전파 적용

빨간색으로 표현된 값이 역전파를 통해 계산된 미분값이다. 

순전파와 반대의 순서대로 1에서 부터 시작하여 local 미분값과 역전파를 통해 전달되는 값을 곱하면 전체 결과에 대한 해당 노드의 미분값을 계산할 수 있다.

 

역전파 예시2

조금 더 복잡한 함수에서 역전파를 통해 미분을 수행한 예시이다.

간단한 미분과 곱셈을 계속해서 수행하면 복잡한 미분을 수행할 수 있다.

 

- Backpropagation for Vectorized Operations

input과 output이 vector인 경우에도 역시 backpropagation을 적용할 수 있다.

이때 input과 미분의 shape는 동일하다.

 

행렬곱의 결과의 L2 norm을 구하는 과정에 대한 미분 과정을 통해, 그 예시를 살펴보겠다. 

2x2 행렬 W와 크기가 2인 vector x의 내적결과

에 대한 L2 norm을 구하는 계산 그래프이다.

 

먼저 L2 노드에 대한 미분 값을 살펴보면, 

$ \frac{\partial f}{\partial q_i} = 2q_i $ 라는 것은 $ f(q) = q_1^2 + ... + q_n^2$ 이라는 점을 생각하면 쉽게 이해할 수 있고, 

위와 같은 벡터의 미분을 나타낼 때  $ \nabla_qf $ 와 같이 나타낸다고 한다. (역삼각형은 '나블라'라고 한다.)

$ 2q $와 역전파를 통해 전달되는 값 1.00을 곱해주면 미분값이 된다. 

 

 

다음으로 $ \frac{\partial f}{\partial W} $를 구하는 과정이다.

$ \frac{\partial q_k}{\partial W_(i, j) }$ 표현이 조금 복잡한데,

우선 $ 1_{k = i}$는 k == i 인 경우 1이라는 것을 의미하고, 결국 아래 결과를 풀어쓴 것이다.

$ q_1 = W_{(1,1)}x_1 + ... + W_{(1, n)}x_n$ 이라는 점을 생각해보면 쉽게 미분 결과에 대해 이해할 수 있을 것이다.

마지막으로 역전파를 통해 전달된 값과 local 미분값을 곱해주면 $ \frac{\partial f}{\partial W}$를 구할 수 있다.

 

q에 대한 미분도 동일한 방법으로 계산할 수 있다.

 

<Neural Network>

앞서 하나의 weight로 구현한 linear classifier를 다뤘는데, Neural Network에서는 Weigth, Layer를 여러 층 쌓는다. 

템플렛을 거친 결과에 대해 또 새로운 템플렛과 비교해보는 과정이라 생각해보면 된다. 

예를 들어 첫 템플릿($ W_1$)에서는 모양에 대해 비교하고, 두 번째 템플렛($ W_2$)에서는 방향에 대해 비교해보는 등의 방식으로 더 정교하게 예측이 가능해질 것이다. 

 

lecture4에서는 자세한 개념에 대해서는 다루지 않았다. 

 

이러한 neural network의 구조는 뉴런에서 영감을 얻었다고 한다.

각각의 뉴런은 impulses를 전달받고 해당 수치들에 대해 어떠한 연산을 수행한 결과(ex)NN에서 Weight를 곱하는 것)가 임계점 이상이면 다음 뉴런으로 신호를 전달하고, 그렇지 않으면 신호를 전달하지 않는다고 한다. 

 

그러나 엄밀히는 뉴런과 NN이 정확히 동일하지는 않다고 한다.

우선 뉴런에 여러 타입이 있고, 처리하는 연산이 Linear하게 Weight를 곱하는 것과 다르다는 등의 이유가 나와있다.

 

뉴런에서 임계점을 기준으로 신호를 전달하고 말지를 결정하는 것처럼, NN에서도 연산 결과를 다음 층으로 어떻게 전달할지 activation function을 통해 결정한다. 

위 그림처럼 다양한 종류가 있고 앞으로의 강의에서 계속해서 살펴볼 것이라고 한다. 

 

'Computer Vision > cs231n' 카테고리의 다른 글

[cs231n] Assignment1-Q5  (0) 2022.01.01
[Assignment1 - Q4] 2-layer NN  (0) 2022.01.01
[Assignment1 - Q3] Softmax  (0) 2021.12.30
[Assignment1 - Q2] SVM  (0) 2021.12.30
[Lec 3] Loss Functions and Optimization  (0) 2021.12.30

+ Recent posts