본문 바로가기
Study/CS231n

CS231n - Lecture 7 (Regularization)

by 세이(Sayer) 2021. 6. 8.
728x90

CS231n Lecture7 - Training Neural NetworksⅡ의 후반부를 듣고, 동아리 세미나 수강 후 정리한 내용입니다. 오류를 발견하시면 댓글로 말씀해주세요.

 

CS231n Convolutional Neural Networks for Visual Recognition

Table of Contents: Learning In the previous sections we’ve discussed the static parts of a Neural Networks: how we can set up the network connectivity, the data, and the loss function. This section is devoted to the dynamics, or in other words, the proce

cs231n.github.io




위의 그래프는 훈련에 대한 정확도는 높고, 검증(실제 테스트)에 대한 정확도가 낮은 것을 의미한다. 이를 오버피팅(overfitting)이라고 하는데, 이 상황을 개선하기 위해 사용하는 여러 방법들을 지금부터 알아볼 것이다.


먼저 살펴볼 방법은 모델 앙상블 방식이다. 모델 앙상블 방식이란, 여러 개의 모델을 학습시키고, 테스트 시 이 결과들을 평균을 내서 사용함으로써 최종 성능을 향상시킬 수 있는 방식이다. 그러나 매번 여러 개의 모델을 학습시키는 것은 시간/비용적 부담이 있기 때문에 상단 그림처럼 학습 중간 중간에 여러 번 저장을 해서(그림에는 깃발로 표시되어 있다.) 그것을 각각의 모델처럼 취급하는 방법이 사용되기도 한다. 또한, 하단 그래프처럼 여러 개의 learning rate를 사용해서 여러 지점에 수렴하도록 할 수도 있다.



다음으로는 여러 가지 정규화 방식을 알아보자.

첫 번째로 dropout 방식이다. 상당히 직관적인 방식으로, forward pass 과정에서 일부 뉴런들의 activation 값을 랜덤하게 0으로 만들어버리는 방식이다. 이때 얼마나 drop할지는 hyperparameter로 우리가 직접 정해주게 되는데, 보통은 0.5로 설정한다. 이 방식은 fully-connected layer에서 주로 많이 사용되며, cnn layer에서도 사용된다.

이렇게 랜덤으로 activation 값을 0으로 '꺼버린다'는 것이 어떤 의미인지 궁금할 수 있다. 이 부분에 대해서 CS231n 강의에서의 설명을 빌려보자면, '사공이 많으면 배가 산으로 간다.'가 적용된 방법이라고 할 수 있다. 그림의 뉴런에서 하나의 노드를 '하나의 feature에 대한 1명의 전문가'라고 해보자. 하나의 벡터에 대해 너무 많은 전문가들이 있는 것은 성능 향상에 큰 도움이 되지 않기 때문에, 오히려 이런 전문가들의 수를 줄여서 feature가 co-adaptation 되는 것을 막아준다는 의미다. 이때 전문가의 능력이 떨어지는 것이 아니고, 하나의 feature에 대해서 과하게 많은 전문가가 있는 상황을 막아주는 방식이 dropout이다!

아래는 co-adaptaion이 무엇인지 궁금해서 찾아본 내용

co-adaptation : 어떤 뉴런이 다른 특정 뉴런에 의존적으로 변하는 것

상호적응 문제는, 신경망의 학습 중 어느 시점에서 같은 층의 두 개 이상의 노드의 입력 및 출력 연결 강도가 같아지면, 아무리 학습이 진행되어도 그 노드들은 같은 일을 수행하게 되어 불필요한 중복이 생기는 문제를 말한다. 즉 연결 강도들이 학습을 통해 업데이트 되더라도 이들은 계속해서 서로 같은 입출력 연결 강도들을 유지하게 되고 이는 결국 하나의 노드로 작동하는 것으로써, 이후 어떠한 학습을 통해서도 이들은 다른 값으로 나눠질 수 없고 상호 적응하는 노드들에는 낭비가 발생하는 것이다. 결국 이것은 컴퓨팅 파워와 메모리의 낭비로 이어진다.

요약하자면.. 두 개 이상의 노드가 같은 일을 수행하게 되어서 불필요한 중복이 생긴다. 낭비다!! 라는 뜻으로 이해했다. 이렇게 중복으로 인한 낭비가 발생하기 때문에 dropout을 통해서 문제를 해결하는 것이었다.

 

이러한 dropout 방식은 앞서 말했던 모델 앙상블의 일종으로도 이해할 수 있다. 노드 하나를 하나의 모델로 생각해보면, dropout은 일종의 모델 내에서의 앙상블이라고 이해할 수 있다. 하나의 모델에서 랜덤한 dropout을 통해서 랜덤한 서브 네트워크가 형성되면서 앙상블의 효과를 낼 수 있기 때문이다. 오른쪽 그림을 보자. 왼쪽의 베이스 네트워크를 여러 가지 방식으로 dropout 하면서 변조를 줌으로써, 오른쪽 표처럼 다양한 서브 네트워크가 생기게 되고, 이러한 것들이 앙상블의 효과를 내면서 overfitting을 감소시킬 수 있게 되는 것이다.


수식으로 살펴보자. 인풋에서 아웃풋을 계산할 때 추가적으로 랜덤한 마스크가 추가된다. 그래서 이때 랜덤한 아웃풋이 도출되는데, 테스트를 할 때는 이렇게 매번 랜덤한 모델로 결과를 도출하면 안 된다. 그렇기 때문에 이렇게 부여된 랜덤니스를 average-out할 수 있는 방법이 필요하다.


다른 regularization 방식으로 batch normalization이 있다. 이는 mini batch를 사용하는 방식인데 하나의 데이터를 매번 다른 데이터들과 조합해서 랜덤성을 부여하는 방식이다. 마찬가지로 테스트를 할 때는 매번 랜덤하게 결과를 도출하면 안 되기 때문에, 테스트를 할 때는 mini batch를 사용하지 않고 글로벌하게 수행을 해서 이때 생긴 randomness를 average-out 시켜준다.


다음으로는 data augmentation이 있다. 이는 training set과 test set 사이에 괴리감이 있을 때 사용되는 방식이다. 이미지에 임의의 잡음이나 translation을 가해서 괴리감을 줄이고, 성능을 향상시켜준다. 하나의 이미지를 여러 가지 방식으로 변조하기 때문에 기존 데이터의 크기가 작은 경우에 데이터 셋을 늘려주는 효과도 있다. 오른쪽 그림처럼 라벨은 그대로 보존을 하고 이미지만 여러 방식으로 변형을 해서 데이터를 증강시켜주는 방식이다.


augmentation의 예시를 살펴보자. 가장 기본적으로 이미지를 랜덤하게 자르거나(빨간 네모 참고), 회전, 반전, 비율 변경 등 다양한 방법으로 이미지를 변조해서 랜덤성을 부여한다. 오른쪽은 augmentation의 종류 중 하나인 color jitter이다. 학습 과정에서 랜덤하게 밝기, hue, saturation 등 색에 변화를 주는 방식이다.


또 다른 augmentation 방식으로 random erasing 방식이 있다. 그림처럼 이미지의 랜덤한 부분을 noise로 없애는 방식이다. 그 외에도 오른쪽 그림처럼 수 없이 다양한 방식의 augmentation이 존재하고, 이는 실제로 대부분의 모델을 학습할 때 매우 보편적으로 사용이 되는 방식들이다.


다음으로 살펴볼 dropconnect 방식은, 이름부터 dropout과 굉장히 비슷하다! dropout은 뉴런 자체를 끊어서(그림을 보면 dropout에 해당하는 노드 몇개가 랜덤으로 꺼져있는 상태인 것을 확인할 수 있다.) 연결된 가중치를 제거하는 방식이었다면, dropconnect는 연결된 부분의 가중치를 0으로 만들어서 별도로 0으로 만들어주는 방식이다.


fractional max pooling이다. max pooling은 fully-connected layer를 배울 때 다룬 적이 있다! training을 할 때 보통의 maxpooling은 일정하게 정해진 영역을 pooling한다. 반면에 fractional max pooling은 pooling layer마다 pooling하는 영역을 그림처럼 랜덤하게 바꿔주면서 진행하게 된다. 이 방법을 통해 랜덤성이 부여가 되는데 테스트를 할 때는 고정된 pooling 영역을 사용해서 이 랜덤성을 average-out 시켜준다.


마지막으로 stochastic depth 방식이다. 왼쪽 그림이 training 할 때의 그림이고, 오른쪽이 test 할 때의 그림이다. training을 할 때는 왼쪽처럼 네트워크의 depth를 랜덤하게 drop해주고, test를 할 때는 drop하지 않고 전체 네트워크를 사용한다. 이 방식은 dropout과 유사한 효과를 낸다.


지금까지 여러 정규화 방식을 살펴봤다. 이 방식들을 일반화해 패턴을 찾아보자면,

* training을 할 때는 랜덤한 noise를 줌으로써 randomness를 더해주고
* test를 할 때는 이러한 randomness를 average-out 시켜주면서 일관성 있는 결과를 낼 수 있도록 한다.

정규화는 이러한 방식으로 보통 진행되며, 가장 많이 사용되는 방식은 batch regularization이나, augmentation, 그리고 dropout 등등이라고 한다.



 

transfer learning은 사전에 미리 학습된 모델을 사용하는 것이다. 우리가 풀고자 하는 문제와 비슷하고, 사이즈가 큰 데이터로 미리 학습이 되어 있는 모델을 이용하는 방식이다. 오른쪽 그림을 보며 전이학습의 과정을 간단하게 살펴보자.

(1) 큰 데이터 셋으로 먼저 학습을 시켜준다.
(2) 사용하고자 하는 데이터 셋이 굉장히 작을 경우, 아래 레이어들은 전부 얼려주고(freeze), 마지막 부분의 레이어만 다시 초기화하고 학습해서 우리가 원하는 데이터 셋을 적용시켜준다.
(3) 데이터 셋이 클 경우에는 좀 더 많은 레이어들을 직접 학습해도 좋은 결과를 낼 수 있다.


CNN에서의 전이학습을 좀 더 자세히 살펴보자. CNN, 그 중에서도 image classification 모델의 구조를 살펴보면 크게 convolutional base와 classifier로 이루어져 있다. convolutional base는 이미지에서 특징을 추출하는 부분이고, classifier는 convolutional base에서 추출된 특징을 입력받아서 최종적으로 이미지의 카테고리를 결정하는 classification을 진행하는 부분이다. convolutional base를 거쳐서 classification으로 간다고 이해하면 된다!

Quadrant 1
가진 데이터가 크고 기존에 학습된 데이터와 많이 다를 경우

큰 데이터를 가지고 있기 때문에 그냥 전체 모델을 다시 학습시켜주는 것이 좋은 선택일 수 있다.
Quadrant 2
가진 데이터가 크고 기존과 유사한 경우

일반적으로 가장 좋은 경우다! 몇몇 레이어들만 적당히 freeze 시키고 나머지를 학습시켜줄 수 있다.
Quadrant 3
가진 데이터가 작은데 기존과도 다를 경우

일반적으로 가장 어려운 경우. 여러 가지 방법을 시도해보면서 일부 레이어들을 학습시키는 방향으로 진행하는 것이 좋다고 한다.
Quadrant 4
가진 데이터가 작고 기존과 유사할 경우

convolutional base는 그대로 얼려두고 마지막 classifier 부분에서만 새로운 데이터로 학습을 시켜주면 좋은 결과를 얻을 수 있을 것이다.



그래서 이런 전이 학습을 사용한다면 높은 정확도를 얻을 수 있고 시간 단축도 가능하기 때문에 굉장히 많이 사용된다. 다음은 이러한 전이 학습에 많이 사용되는 여러 네트워크들이다.

먼저 왼쪽은 ResNet이다. residual block들로 구성이 되어 있고 pytorch에서 기본적으로 여러 레이어들을 갖는 resnet 모델이 제공이 된다. 오른쪽은  VGG이다. 이 역시 n개의 층을 가진 vgg-11, vgg-13 등등 다양한 모델이 학습된 상태로 pytorch에서 제공이 되고 있다. 이외에도 GoogLeNet, AlexNet, SqueezeNet, DenseNet, ShuffleNetv2 등등 다양한 모델을 활용할 수 있다. 지금은 모두에게 공개되어 있는 큰 데이터 셋이 많기 때문에, transfer learning을 통해서 여러 가지를 시도해볼 수 있을 것이다.

'Study > CS231n' 카테고리의 다른 글

CS231n - Lecture 7 (Optimizer)  (0) 2021.06.06
CS231n - Lecture 6 (Training Neural Networks I)  (0) 2021.05.14
CS231n - Lecture 5 (ConvNet)  (0) 2021.05.09
CS231n - Lecture 4 (Backpropagation)  (0) 2021.05.09
CS231n - Lecture 3 (Loss Functions)  (3) 2021.04.08

댓글