CS231n Lecture 7 강의 요약

미남로그·2021년 8월 23일
0
post-custom-banner

| 강의 자료

Lecture 7 | Training Neural Networks II

| 강의 목차

  1. Review :
    • 3:39 ~ 13:46
  2. Optimization
    • Momentum, RMSProp, Adam, etc
    • 13:47 ~ 44:58 (강의 슬라이드: 13 ~38p)
  3. Rugularization
    • Dropout, etc
    • 44:59 ~ 55:47(강의 슬라이드: 39 ~ 59p)
  4. Transfer learning
    • 55:47 ~(강의 슬라이드: 60 ~98p)

Neural networks

Neural Network에서 실제로 사람들이 사용하고 있는
Regularization 전략에 대해 다뤄볼 예정입니다.

  • Regularization
  • Transfer learning

Optimization 알고리즘(part1)

지난 6강에서는 네트워크의 Train/Test Error 간의 격차를 줄이고자 사용하는 추가적인 기법인 Regularization에 대해서 배웠다. Neural network에서 가장 중요한 것은 바로 최적화 문제이고, Nerwork의 가중치에 대해서 손실 함수를 정의해 놓으면 이 손실 함수는 그 가중치가 얼마나 좋은지 나쁜지를 알려준다.

2차 행렬로 표현된 가중치 그래프가 있다. x, y축 모두 w1, w2이다. 이 손실함수는 가중치에 대한 landscape으로 표현될 수 있다. 이 색깔은 Loss 값의 의미이고, 여기 2차원으로 표현된 가중치에서 w1, w2 를 최적화 시키기 위해서 우리가 가야할 곳은 중앙의 빨간 지점이다. 여기가 가장 낮은 loss이기 때문이다.

지금까지 배운 가장 간단한 최적화 알고리즘은 바로 이 경사하강법이었다. 이는 코드로 세 줄로 표현된다.

batch size로 나눠둔 모델에 가중치를 곱해서 loss를 줄이는 방법이다.

SGD

미니 배치 안에서 Loss 계산하는 것이 SGD이다. SGD는 그레디언트 반대 방향을 이용해 파라미터 벡터를 업데이트한다. Loss를 줄여야하기 때문에 내려가는 방향이어야 한다. 붉은색 지역으로 수렴해야한다. 하지만 이 SGD의 방법엔 문제점이 있는데, Loss는 수직 방향의 가중치 변화에 훨씬 더 민감하게 반응한다는 것이다. 수평일 경우 아주 미세하게 줄어든다. Loss 는 bad condition number을 가진다고 말할 수 있다.

loss가 이렇게 생겼다면, 저 빨간 점이 원점까지 가기 위해선 수평적 이동이 아니라 수직적 이동을 해야하고, 이 모양이 지그재그로 이동하기 때문에 아주 지저분하게 학습을 한다는 단점이 있다.

※ 헤시안 행렬

위의 예시는 우리가 본 예시 그림은 2차원 밖에 되지 않는다. 실제로는 가중치가 수천 수억개 일 수 있기 때문에, 이 지점의 Hessian maxrix의 최대/최소 singular values 값의 비율이 매우 안좋다는 뜻이 된다.

강사는 이를 taco shell 모양이라 설명 중(맛있겠다)

한 방향으로는 엄청나게 민감하지만 다른 방향으로는 완만하기 때문에 민감한 상태에 있다.

SGD가 학습되는 모양

  • x축: W
  • y축: loss

문제점

  1. local minima
    valley가 있는 모양에선 gradient가 0이 되면서 멈춰버린다. 그레디언트를 계산하고 학습이 멈춰버리는 것. SGD의 동작을 생각해보면 gradient를 계산하고 그 반대방향으로 이동하는 것인데 저 상황에선 opposite gradient 이 0이 되고 다시 반대 방향은 loss가 커지는 방향이기 때문에 학습이 멈춰버린다.

  2. saddle point?
    local minima는 아니지만 한쪽 방향으로는 증가하고 있고 다른 한쪽 방향으로는 감소하고 있다. 이럴 때도 gradient가 0이 된다.

gradient noise가 생기는 문제점이고 Loss를 줄이는데 시간이 오래 걸린다. 이를 보완하기 위한 방법이

SGD + Momentum

vx가 추가되었다. (velocity 사용)
rho 비율(하이퍼파라미터)로 맞춰주는데 보통 0.9와 같은 높은 값을 사용

공이 내려오는 모양을 보면, local minima에 도달해도 여전히 velocity를 갖고 있기 때문에 gradient = 0 이라도 움직이게 된다.

지그재그로 움직이는 상황이라면 momentum이 이 변동을 서로 상쇄시켜 버린다. 이를 통해서 loss에 만감한 수직 방향의 변동은 줄여주고 수평방향의 움직임은 점차 가속화 된다. momentum을 추가하게 되면 high condition number problem을 해결하는 데 도움이 됨!

  • Nesterov Momentum

AdaGrad

AdaGrad는 훈련도중 계산되는 gradients를 활용하는 방법이다. Adagrad는 velocity term 대신에 grad squared term을 이용한다. 그리고 Update를 할때 Update term을 앞서 계산한 gradient 제곱 항으로 나눠준다.

gradient 가 작은 값일 수록 제곱시 더 작아지기 때문에 가속도가 붙는다. 문제점은 진행할 수록 값이 점점 작아진다. (작은 수를 제곱하면 더 작아지는 걸 생각하면 된다.) 업데이트하며 gradient 제곱이 계속 더 작아지기 때문에 Step size를 더 smaller 하게 해줘야 한다. 이는 convex case에서는 좋은 특징이지만 non-convex cads에서는 좋은 특징이 아니다. saddle point에 걸려 버린다면 AdaGrad는 멈춰버리기 때문에.

RMSProp

AdaGrad의 변형 모델이다. RMSProp에서는 AdaGrad의 gradient 제곱 항을 그대로 사용한다. 기존의 누적 값에 decay_rate를 곱해줍니다. 이 값은 기존의 momentum 수식과 유사하게 생겼지만, gradients의 제곱을 계속해서 누적해 나간다. RMSProp에서는 gradient 제곱 항에 쓰는 decay rate는 보통 0.9 또는 0.99정도를 자주 사용합니다. 그리고 '현재 gradient의 제곱'은 (1 - decay rate) 를 곱해줘서 더해준다. RMSProp은 gradient 제곱을 계속 나눠준다는 점에서 AdaGrad와 유사하다. 이를 통해 step의 속도를 가속/감속 시킬 수 있습니다.

Adam

모멘텀과 RMS를 합쳐둔 개선된 모양이다. Adam은 추가 보충 예정.

이 그래프를 통해 어떤 식으로 학습하는지 볼 수 있다. 에포크가 커질 수록 로스 값이 커지거나 작아지는 모양. 오른쪽은 rate decay가 발생하는 지점이다.

→ 현재까지 배운 Optimization 알고리즘은 모두 1차 미분을 활용한(first-order) 방법이다.

First-Order Optimization

손실함수가 있다고 생각하면 현재 빨간점에 있고, 여기서 gradient 계산하는 것이다. 손실함수를 선형함수로 근사시키는 것을 1차 테일러 근사라고 한다. 이를 실제 손실함수라 생각하고 step을 계속해서 내려간다. 실제로 멀리갈 순 없다. 1차 미분값이기 때문에.

Second-Order Optimizaion

2차 근사를 이용하면 minima에 더 잘 접근할 수 있다. 2차 근사 함수의 minima로 이동. learning rate가 불필요. 매 step마다 minima의 방향으로 이동하기 때문에 learning rate가 없다. Optimization 알고리즘들은 training error를 줄이고 손실함수를 최소화 시키기 위한 역할을 수행한다. Training error 보다 Train/Test error 격차를 줄이는게 더 중요하고, 가장 중요한 것은 validation set의 성능을 최대화 시키는 것이다.

Model Ensembles

모델을 하나만 학습 시키는 것이 아닌 10개의 모델을 독립적으로 학습 시키는 것. 이를 모델 앙상블이라 부른다. 결과로는 10개 모델 결과의 평균을 이용한다. 모델의 수가 늘어날수록 overfitting이 줄어들고 성능이 조금씩 향상된다. (보통 2% 정도 증가)

학습 도중 모델을 저장(snapshot)하고 앙상블로 사용하기도 한다. 예측값들의 평균을 이용한다.

learning rate를 엄청 올렸다가 내렸다가 반복. 손실함수에 다양한 지역에 수렴할 수 있도록 한다. 한 번만 train 시켜도 성능 향상된 결과를 얻을 수 있다.

모델 사이즈, learning rate, 다양한 regularization 기법 등을 통해 앙상블 할 수 있다. 앙상블이 아닌 단일 모델의 성능을 향상 시키기 위한 방법이 있을까?

앙상블하려 한다면 test time에 10개의 모델을 돌려야 한다. 모델이 많을 수록 학습 시간은 증가. 단일 모델로 성능을 올리는 것이 좋을 수도 있다. 우리가 지난 시간에 배운 Regularization이 이와 관련된다. 정칙화에서도 다양한 기법을 배웠다.(L1, L2, Elastic net(L1+L2))

Dropout

Dropout을 설명할 때, 99%의 확률로 보여주는 사진이다. Dropout은 솔직히 다른 개념보다 그렇게~ 어려운 개념은 아닌 것 같다.

Neural network에서 가장 많이 사용하는 regularization은 바로 dropout이다. Neural network에선 L2를 잘 사용하지 않는다고 한다. 설명은 교수가 해주지 않는다.

Dropout은 forward pass 과정에서 임의로 뉴런을 0으로 만든다. forward pass 할 때마다 0이 되는 뉴런이 바뀐다. 이걸 random 하다고 말할 수 있다. Dropout은 한 layer씩 진행한다. 한 layer의 출력을 전부 구하고 임의로 일부를 0으로 만든다. 위의 이미지는 동일한 네트워크의 더 작아진 버전처럼 보인다. forward pass iteration 마다 달라진다.

학생들의 질문을 통해 정리해보면

  1. 무엇을 0으로 두는지? activation 을 0으로 놓는다.
    각 레이어에서 next activ= prev activ * weight 으로 계산하고, 현재 activations의 일부를 0으로 만들면 다음 레이어의 일부는 0과 곱해질 것.

  2. 어떤 layer에서 사용하는지?

    fc layer에서 주로 사용하지만 conv layers에서도 종종 볼 수 있다. conv layers는 channels이 있기 때문에 일부 channel 자체를 dropout 시킬 수 있다.

Dropout이 좋은 이유?

일부 값들을 0으로 만들면서 training time의 네트워크를 심각하게 훼손시키는 것처럼 보인다. 대략적으로 말씀드리면, Dropout은 특징들 간의 상호작용(co-adaptation)을 방지한다고 볼 수 있다. 이는 overfiting을 막아주는 것과 관련이 있다. 그래서 Dropout은 단일 모델로 앙상블 효과를 가질 수 있다.

  • 요약: Dropout은 아주 거대한 앙상블 모델을 동시에 학습 시키는 것이라 볼 수 있음

Dropout을 사용하게 되면 Neural network의 동작 자체가 변하게 됨. 가중치 w와 입력 x에 대한 함수 f(x)가 있으면 이 수식에 z가 추가 됨. z는 random을 뜻한다.

z가 임의적으로 0이 되면 f(x)의 값이 0이 되기 때문이다. 네트워크가 이미 학습된 네트워크의 test time에는 이러한 임의성(stochasticity)가 적절하지 않다. 대신 임의성을 average out 시켜 버린다. Dropout을 사용하게 되면 전체 학습시간이 늘어난다. 각 스텝마다 업데이드되는 파라미터의 수가 줄어들기 때문이다. 다시 말해 Dropout을 사용하게 되면 전체 학습시간은 늘어나지만 모델이 수렴한 후에는 더 좋은 일반화 능력을 얻을 수 있다.

사실 Dropout은 여기 보이는 일반적인 regularization 전략을 구체화시킨 하나의 예시에 불과하다. 이 전략은 Train time에는 네트워크에 무작위성(randomness)을 추가해 training data에 너무 fit하지 않게 합니다. 네트워크를 마구잡이로 흩뜨려 놓으므로써 training data에 fit하는 것을 방해하는 것이다. 그리고 Test time에서는 randomness을 평균화 시켜서 generalization 효과를 준다.

Batch Normalize

Batch normalization 또한 이와 비슷한 동작을 할 수 있다. Train time의 BN를 상기해보면 mini batch로 하나의 데이터가 샘플링 될 때 매번 서로 다른 데이터들과 만나게 된다. Train time에서는 각 데이터에 대해서 이 데이터를 얼마나 어떻게 정규화시킬 것인지에 대한 stochasticity이 존재했다. 하지만 test time에서는 정규화를 mini batch 단위가 아닌 global 단위로 수행함으로써 stochasticity를 평균화 시킨다. 이런 특성 때문에 BN 은 Dropout과 유사한 Regularization 효과를 얻을 수 있었다.

Train time에는 stochasticity(noise)가 추가되지만 Test time에서는 전부 평균화 되기 때문이다. 실제로 BN을 사용할 때는 Dropout을 사용하지 않는다. BN에도 충분히 regularization 효과가 있기 때문이다. 하지만 여전히 Dropout은 쓸모 있다. 우리가 자유롭게 조절할 수 있는 파라미터 p가 있기 때문이다. BN에는 하이퍼 파라미터가 없다.

Data augmentation

이러한 Regularization 패러다임에 부합하는 또 한가지 전략이 바로 data augmentation 이다. 기본 버전의 학습과정에서는 데이터가 있고 레이블이 있고 이를 통해 매 스텝 CNN을 업데이트했다. 하지만 그 대신 train time에 이미지를 무작위로 변환시켜 볼 수 있다. 레블은 그대로 놔둔 채로 가능하다.

이제 우리는 원본 이미지를 사용하는 것이 아니라 무작위로 변환시킨 이미지로 학습시키게 된다. 가령 이미지가 horizontal flips 할 수 있다. 이미지가 반전되도 고양이는 여전히 고양이다. 혹은 이미지를 임의의 다양한 사이즈로 잘라서(crop) 사용할 수도 있다. 그래도 여전히 이미지는 고양이다!

일반적으로 data augmentation는 어떤 문제에도 적용해 볼 수 있는 아주 "일반적인 방법" 이라고 할 수 있다. 어떤 문제를 풀려고 할 때, 이미지의 label을 바꾸지 않으면서 이미지를 변환시킬 수 있는 많은 방법들을 생각해 볼 수 있다. Train time에 입력 데이터에 임의의 변환을 시켜주게 되면
일종의 regularization 효과를 얻을 수 있다. 그 이유를 다시 정리해보면 train time에는 stochasticity가 추가되고 test time에는 marginalize out 되기 때문이다.

지금까지 세 가지의 예시를 살펴보았다.

  1. dropout
  2. batch normalization
  3. data augmentation

DropConnect

DropConnect은 activation이 아닌 weight matrix를 임의적으로 0으로 만들어주는 방법이다. Dropout과 동작이 아주 비슷하다.

Fractional max pooling

보통 2x2 maxpooling 연산은 고정된 2x2 지역에서 수행한다.

위 이미지를 참고하면 max pooling의 기본적 기법에 대한 이해가 쉬울 것이다.

하지만 fractional max pooling에서는 그렇게 하지 않고 pooling연산을 수행 할 지역이 임의로 선정된다. 그리고 test time에 stochasticity를
average out 시키려면 pooling regions를 고정시켜 버리거나 혹은 여러개의 pooling regions을 만들고 averaging over 시킨다. 많이 사용하는 방법은 아니지만 참 좋은 아이디어라고 설명한다.

stochastic depth

2016년에 파격적인 논문이 발표되었다고 한다. (솔직히 내가 파격적이라 느낄 이유는 없다.)

왼쪽의 네트워크를 아주 깊은 네트워크라 생각하고 보면, 현재 train time에 네크워크의 레이어를 randomly drop한다. Train time에는 layer 중 일부를 제거해 버리고 일부만 사용해서 학습한다.

layer를 드롭해버리는 게 파격적인 부분 같다. 그리고 오른쪽은 test time인데 전체 네트워크를 다 사용한다. 여기서 교수가 또 "정말 놀라운 연구가 아닐 수 없습니다."라고 말하는데, 그 의미가 무엇인지 정확히는 모르겠다.

train time에서 drop 시켜서 error를 줄이고 test에선 과감하게 다 쓰는 방법을 선택해서일까? 이 부분에 대해서 더 생각해보고 싶다.

하지만 이 방법의 regularization 효과는 dropout과 같은
다른 방법들과 유사하다고 설명한다.

학생의 중간 질문

  1. 보통 하나 이상의 regularization 방법을
    사용하는지?
  • 답변: 일반적으로는 batch normalization를 많이 사용한다.
    대부분의 네트워크에서 보통 잘 동작하기 때문이다. 아주 깊은 네트워크에서도 수렴을 잘 하도록 도와준다. 대게는 BN만으로 충분합니다만 overfitting이 발생한다 싶으면 Dropout과 같은 다양한 방법을 추가해 볼 수 있다고 한다. 보통은 이를 가지고 blind cross-validation를 수행하지는 않는다. 대신에 네트워크에 overfit의 조짐이 보일때 하나씩 추가시켜 보는 것이다.

Transfer learning

Transfer learning은 "CNN 학습에는 엄청많은 데이터가 필요함"
이라는 미신을 무너뜨려버린다. 이때까지 overfitting의 원인을 소규모 데이터라 많이 꼬집었는데, 여기서는 소규모 데이터를 학습하면서 과적합에 대해 Regularization 대신 해결할 수 있는 방법 중 또 하나인 Transfer learning을 소개해준다.

이 CNN을 가지고 우선은 ImageNet과 같은 아주 큰
데이터셋으로 학습을 한번 시킨다. 이정도 데이터셋이면 전체 네트워크를 학습시키기에 충분한 양이다. 여기서 할 일은 Imagenet에서 학습된 features를 우리가 가진 작은 데이터셋에 적용하는 것이다.

그런데 이제는 1000개의 ImageNet 카테고리를 분류하는 것이 아니라 10종의 강아지를 분류하는 문제를 풀 수 있다. 데이터는 엄청 적고 Class는 겨우 10개 뿐이다.

일반적으로 떠올릴 수 ㅇ있는 방법은 우선 가장 마지막의 FC Layer는 최종 feature와 class scores간의 연결인데 이를 초기화시킨다.

기존에 ImageNet을 학습시킬 때는 4,096 x 1,000 차원의 행렬이었다. 그리고 방금 정의한 가중치 행렬은 초기화시킨다. 그다음 나머지 이전의 모든 레이어들의 가중치는 freeze시켜버리는 것이다. 그렇게 되면 linear classifier를 학습시키는 것과 같다. 오로지 마지막 레이어만 가지고 데이터를 학습시키는 것이다. 이 방법은 사용하면 아주 작은 데이터셋일지라도 아주 작 동작하는 모델을 만들 수 있다. 만일 데이터가 조금 더 있다면 전체 네트워크를 fine-tuning 할 수 있다.

transfer learning을 수행 함에 있어서 이 2x2 표로 정리할 수 있다.

Transfer learning with CNNs

왼쪽은 Object Detection과 관련된 다이어그램이고, 오른쪽은 Image Captioning과 관련된 것이다. 두 모델 모두 CNN구조를 가지고 있고 기본적으로 이미지를 처리한다.

요즘에는 거의 모든 computer vision 관련 응용 알고리즘들이
모델들을 밑바닥부터(from scrtch) 학습시키지 않는다고 한다. 대부분은 ImageNet pretrained-model을 사용하고 현재 본인의
task에 맞도록 fine tune 한다.

captioning의 경우 word vectors를
pretrain하기도 한다. pretrained CNN 뿐만 아니라 규모가 큰 말뭉치로부터 학습된 pretrained word vectors도 함께 이용할 수 있다. captioning task에서는 pretrained word vectors을
사용하는 경우가 그닥 많지 않고 크게 중요하지 않다.

문제가 있다면 만약 데이터셋이 크지 않은 경우라면 우선 여러분의 task와 유사한 데이터셋으로 학습된 pretrained model 다운로드 받고, 이 모델의 일부를 초기화시키고 여러분 데이터로 모델을 fine-tune 하는 방법이 있다.

만약 Training data가 적당히만 있다면 아마 아주 잘 동작할 것이다. 이런 경우가 너무 흔하기 때문에 대부분의 딥러닝 소프트웨어
패키지들은 model zoo를 제공한다. 단지 접속만 하면 다양한 모델들의 pretrained 버전을 손쉽게 다운로드 받을 수 있다.

model zoo
tensorflow
Pytorch

강의 정리

  • Optimization
  • Regularization
  • Transfer learning
profile
미남이 귀엽죠
post-custom-banner

0개의 댓글