EECS 498-007 Lecture 10 | Training Neural Networks I

shyoon·2025년 2월 5일
0

EECS 498-007

목록 보기
7/13
post-thumbnail

해당 시리즈 포스팅은 미시간 대학의 EECS 498-007 강의 내용을 정리한 글입니다. cs231n 강의와 유사하여 해당 시리즈 포스팅과 겹치는 부분이 많이 있을 수 있습니다.


Activation Functions

이전 강의에서 우리는 linear function으로부터 수집, 합산 된 결과를 다음 layer로 넘겨주기 전 activation function을 적용한다고 이야기 했었다. 이는 모델에 비선형성을 주기 위함이었다.


오늘은 지난번엔 지나가듯이 보았던 다양한 activation function들에 대해서 자세히 알아보자.


Sigmoid

  • 입력을 받아서 [0, 1] 사이의 값이 되도록 해준다.
  • 입력 값이 클수록 1에, 작을수록 0에 가깝다.
  • 뉴런의 firing rate를 saturation(포화) 시키는 것으로 해석 가능

단점

  1. Vanishing gradients

입력 X값이 큰 음의 값이나 양의 값(포화된 경우)을 가지게 되면 시그모이드 함수에서 flat한 부분이 되고, 이런 부분은 gradient가 거의 0에 수렴한다. 이런 값이 계속해서 backpropagation을 통해 곱해져 간다면 gradient가 죽어버리고(0에 가까워짐), 하류로 계속 넘어가게 된다.

→ 하류 layer에서 gradient를 훈련할 신호가 없어지게 됨.


  1. Not zero-centered

위 구조에서 ww에 대한 ff의 미분값은 xx값 자체가 되는데, 만약 input xx값이 양수로만 이루어지게 된다면, 상류에서 backprop 된 gradient와 local gradient를 곱해서 나오는 gradient의 부호는 변하지 않는다. 이는 ww가 모두 같은 방향으로만 움직일 것을 의미. 파라미터를 업데이트 할 때 다같이 증가하거나 다같이 감소하게 된다.


그렇게 되면 좌표평면을 그렸을 때 1사분면이나 3사분면 방향으로만 업데이트가 가능하게 되고(최초 WW는 원점으로 초기화된다고 가정), 만약 최적의 ww가 4사분면에 있었다면 sigmoid의 gradient로는 도달 불가능하다. 이러한 특성은 WW가 고차원으로 확장될 수록 기하급수적으로 악화된다.

→ 우리가 zero-mean 데이터를 원하는 이유. (xx값이 음수/양수 다양)

→ Mini-batch gradient descent 를 사용하게 되면 어떤 batch는 모든 양수, 어떤 batch는 모든 음수이고 이들을 평균 낸다면 이런 제약 조건을 어느 정도 완화는 가능하다.


  1. Exp() is a bit compute expensive

지수함수 연산 계산 비용이 다른 연산에 비해 큰 편이다. 하지만, 큰 틀에서 보면 내적 같은 연산에 비해서는 계산 비용이 그렇게 큰 건 아니라서 GPU를 쓸 땐 큰 문제는 아니라고 함


Tanh

  • sigmoid랑 유사하지만 범위가 [-1, 1] 로 다르다.
  • zero-centered를 만족함.
  • 여전히 gradient vanishing 문제가 발생한다.

ReLU (Rectified Linear Unit)

  • 입력이 음수면 0을 내보내고, 양수면 입력 값 그대로 출력한다.
  • 적어도 양의 입력값들은 saturation 되지 않는다. (가장 큰 장점)
  • 단순 max 연산으로 계산이 빠름.

단점

  1. zero-centered가 아니다.
  2. 음의 input인 경우엔 saturation되어 gradient 절반은 죽는다.

위 그림처럼 Training set에 대한 Data cloud가 있고, W1X1+W2X2W_1 X_1 + W_2X_2와 같은 선형식에 ReLU 연산을 통과했을 때 가중치로 이루어지는 hyperplane에 따라 반은 positive, 반은 negative가 된다. 이 때 ReLU의 연산으로 생긴 초평면으로 그 어떤 값도 activate가 되지 않고 이에 따라 업데이트도 되지 않는다면 이를 Dead ReLU라고 하고, activate 되는 값이 있다면 Active ReLU라고 한다. 이를 위해 0.01 정도의 positive bias를 추가해주는 경우도 있다.

보통 Dead ReLU는 가중치 초기화를 잘못하거나, Learning rate를 너무 크게 잡는 경우 발생하게 된다. 보통 실제로 학습을 다 시켜 놓은 네트워크를 살펴보면 10~20%가량은 dead ReLU가 되어 있다고 한다.


Leaky ReLU & Parametric ReLU

  • negative space에서도 기울기를 살짝 주어 saturation이 발생하지 않음
  • 여전히 계산 효율적
  • Dead ReLU 더 이상 발생하지 않음

계수인 α\alpha를 0으로 고정하면 ReLU, 하이퍼파라미터로 설정해서 0.1, 0.01 정도로 설정하면 Leaky ReLU, 아예 learnable parameter로 설정하면 Parametric ReLU라고 보면 될 것 같다.

하지만 ReLU, PReLU, Leaky ReLU 모두 원점에서 미분 불가하다는 특성을 가진다.


  • zero-mean 에 가까운 출력값을 보인다.
  • Leaky ReLU와 비교했을 때, negative space에서 또 다시 saturation된다.
  • 오히려 이런 saturation으로 인한 deactivation이 노이즈에 강할 수 있다는 주장
  • ReLU와 leaky ReLU의 중간 정도
  • exp 연산이 있어서 느린 편이다.

SELU

  • ELU의 scaled version (λ\lambda를 통해)
  • self-normalizing 특성을 가짐으로써 BatchNorm 없이도 깊은 네트워크 학습 가능

Summary

이렇게 다양한 activation function들을 한 아키텍처에 적용해서 CIFAR10 데이터에서의 분류 정확도를 그린 플롯이다. 결과적으로, 각 activation function 별 추세는 일관되지 않으므로, 우선 ReLU를 사용해본 후 조금이라도 performance를 올리고 싶다면 ReLU의 변형 함수들을 사용해보자. (sigmoid나 tanh는 빼고..)


Data Preprocessing

보통 Neural Network에 데이터를 입력하기 전, 전처리를 수행하게 되는데, zero-centering은 original data에서 평균을 빼주어 평균을 0으로 맞추는 과정이고, 이에 표준 편차로 나누어주는 정규화 작업을 보통 진행해준다.


앞에서 sigmoid activation에 발생하는 non zero-centered의 특징과 비슷하게, input image의 픽셀 값이 모두 양수이거나 음수이게 되면 output도 여전히 모두 양수거나 음수이게 되기에, 전처리 과정의 정규화로 zero-centered를 맞춰주는 것이 좋다.


정규화 방법 외에도 PCA나 Whitening같은 기법들(이미지에선 잘 안쓰임)이 쓰일 수도 있는데, train set에서 공분산 행렬을 구하여 가운데처럼 input data cloud를 회전시켜 uncorrelated로 만들거나, 이후 각 feature에 대해 평균 0, 표준편차 1로 통일하여 오른쪽처럼 data cloud를 구의 형태로 만들어 사용할 수도 있다.


그래서 데이터를 정규화 할 때의 장점이 뭘까?

→ Linear classifier를 학습시킨다고 할 때, 정규화를 적용해주지 않는다면(좌측), linear classifier의 기울기를 조금만 바꿔도 분류 결과는 예민하게 반응할 수 있다. 하지만 정규화를 진행한다면 오른쪽처럼 weight의 작은 변화에도 강건하고, 최적화도 더 용이해진다.


그리고 이미지의 경우, 정규화를 하는 데에도 각기 다른 방법을 채택할 수 있는데, AlexNet의 경우엔 zero-centering을 할 때 전체 이미지의 평균을 빼 주는 방법을 썼고, VGGNet의 경우엔 각 channel 별 평균을 빼 주었다. 그리고 ResNet의 경우엔 이에 추가로 표준편차로 나누는 과정도 각 channel 별 표준편차를 사용하였다.


Weight Initialization

만약 network를 학습시킬 때, 맨 처음 weight값과 bias들을 모두 0으로 초기화한다면 어떻게 될까?

→ 모든 출력도 0, 따라서 모든 gradient도 0이 되고, 이에 따라 가중치 업데이트가 일어나지 않게 된다.


다음으로 생각해볼 수 있는 방법은 평균 0, 표준편차 0.01의 작은 랜덤 값들로 초기화하는 방법이다. 이는 얕은 network에서는 잘 동작하지만, 깊은 network에서는 잘 동작하지 않는 문제가 발생한다.


평균 0, 표준편차 0.01의 랜덤 값들로 weight를 초기화하게 되면 위 플롯처럼 layer를 통과할수록 활성화 된 값들이 대부분 0으로 붕괴된다. 모든 activation이 0이면 gradient도 마찬가지로 0이 되고, 결국 가중치 초기화는 일어나지 않는다.


표준편차 0.01을 0.05로 늘려서 초기화한다면, 이번엔 Tanh activation 값들은 양쪽 끝으로 몰리게 되고, 이 또한 gradient가 0이 되는 문제로 귀결된다.


Xavier initialization은 weight를 layer의 입력 차원의 제곱근으로 나누어 스케일링한다. 이는 입력과 출력의 분산을 유지하여 네트워크의 깊이와 상관없이 좋은 분포의 activation을 출력할 수 있다.

CNN이라고 가정하면, 입력 차원은 필터 사이즈 제곱에 입력 채널을 곱해준 값이 된다.


하지만 Xavier initialization은 activation function이 Tanh처럼 zero-centered를 가정하는 방법이라, ReLU activation의 경우엔 위 플롯처럼 학습이 잘 진행되지 않는다.


이를 위해 나온 방법이 Kaiming / MSRA initialization (저자인 Kaiming He 님의 이름을 따서 대부분 He initialization이라고 함) 인데, std값을 sqrt(2 / Din) 으로 설정하는 것이다. (위 코드엔 반영이 안 된 것 같다..)


하지만 CNN의 baseline architecture인 ResNet의 경우엔 residual block의 분산이 계속 증가하는 경향이 있기 때문에(매 번 output에 input값을 더해주니) kaiming initialization과는 맞지 않아서, residual block에서 처음 conv layer는 kaiming initialization을 사용하고, 두 번째 conv layer는 0으로 초기화하는 방법을 사용한다.


Regularization

적절한 전처리와 가중치 초기화로 이제 모델이 학습은 가능하지만, 오버피팅이 발생하므로 regularization을 추가해주어야 한다.


흔히 손실 함수에 λR(W)\lambda R(W) term을 더해주는 방식을 딥러닝에서도 사용할 수 있지만,

이 외에도 다른 방법의 정규화들이 있다.


Dropout

그 중 dropout은 각 뉴런의 값을 랜덤 50% 확률로 0으로 만들어버리는 방법이다. 이 방법이 잘 작동하는 이유는, layer에서 중복된 정보를 가지거나 co-adaptation feature를 가지는 것을 방지하고, 파라미터를 공유하는 하나의 거대한 앙상블 모델을 학습 시키는 것과 유사하기 때문이다.


하지만 Test 시에도 dropout을 사용하게 되면 입력 xx와 가중치 ww를 받아서 ff 함수에 통과시켜 결과를 얻는 방식에 random dropout mask인 zz라는 입력이 추가된다. 이런 임의성(stochasticity)을 띄는 값은 test 시에 주는 것은 좋지 않고, 대신 zz를 여러 번 샘플링해서 test time에 average out 시키는 방법을 쓸 수 있지만 이 역시 랜덤성을 만들 수 있다.


xxyy라는 두 개의 input을 받아서 각각 w1w1w2w2와 곱해서 aa를 얻는다고 할 때, test 시에는 w1x+w2yw_1x + w_2y의 기댓값을 갖지만 train 시에는 이 절반만큼의 기댓값을 갖게 된다. 그래서 간단히 test 시에 stochasticity를 사용하지 않고 단순히 test 출력에 dropout probability를 곱해주는 방법을 사용한다.


또 다른 구현 방식인 “Inverted Dropout”인데, 위처럼 dropout proabability를 곱한다는 아이디어는 동일한데, 이를 training 시에 미리 나눠주는 식으로 구현한 방법이다.

테스트 시 최대한 효율적이게 되도록 보통 이 방식을 사용한다.


하지만 보통 dropout을 사용하는 경우는 VGGNet이나 AlexNet처럼 신경망 마지막에 fully-connected layers가 있는 경우에 사용이 되고, 최신 아키텍처인 GoogLeNet과 ResNet처럼 fully-connected layers 대신 max pooling을 적용하는 것들엔 잘 사용되지 않는다.


그래서 해당 아키텍처들은 L2 Norm이나 Batch Norm을 주로 사용하게 된다.


Data Augmentation

우리가 가진 input data를 다양한 방식으로 변환하고 같은 레이블의 input으로 활용하는, 말그대로 데이터를 증강해주는 것이다.

Train time에 입력 데이터에 임의의 변환을 시켜주면 학습 시엔stochasticity가 추가되고 test 시에는 marginalize out(관심있는 변수에 집중)이 되기 때문에 regularization 효과가 있다.


Horizontal Flips

→ 이미지를 좌우 반전 시키는 방법


Random Crops and Scales

→ 이미지를 임의의 다양한 사이즈로 잘라서 활용하는 방법.


Color Jitter

→ 학습 시 이미지의 contrast, brightness를 바꿔주는 방법. PCA의 방향을 고려하여 color offset을 조절하는 방법도 있다.


Data Augmentation은 학습 목적과 데이터 셋의 특징에 따라 알맞은 방법들을 잘 골라서 적용해야 한다. 예를 들면, 왼손과 오른손을 잘 구별해야 하는 경우엔 flipping을 적용하면 안 될수도 있고, 세포 조직 이미지의 경우엔 rotation을 잘 적용하면 좋을 수 있다. (병리학의 경우, 색상 정보도 중요하므로 color jittering을 주면 안 된다.)


그렇게 보통, 학습 시엔 randomness로 augmentation을 추가하여 학습하고, 테스트 시에는 randomness는 해소한 후 테스트한다.


DropConnect

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


Fractional Pooling

기존의 2x2 max pooling에서 처럼 고정된 2x2 지역에서 pooling을 하는 것이 아니라, 임의의 지역에서 pooling 연산을 한다.


Stochastic Depth

Train time에 layer 중 일부를 제거하고 나머지 일부만 사용해서 학습하고, test 시에는 전체 네트워크를 다 사용한다.


Cutout

이미지의 특정 영역을 0으로 만들어 정보를 없애서 학습하고, test시엔 전체 이미지를 사용한다. CIFAR10와 같은 작은 데이터 셋에서는 잘 동작하지만 ImageNet과 같은 큰 데이터 셋에서는 잘 동작하진 않는다고 한다.


Mixup

이미지를 랜덤한 비율로 섞어서 해당 blend weight의 값을 그대로 출력하도록 학습한다. 테스트 시엔 original image를 사용한다.


  • 일반적으로 large fully-connected layers가 있는 네트워크엔 dropout을 사용한다.
  • 보통은 Batch Norm과 data augmentation 만으로도 잘 학습 가능하다.
  • 작은 classification datasets에는 cutout이나 mixup을 사용하면 잘 동작한다.

Reference

유튜브 강의: https://www.youtube.com/watch?v=qcSEP17uKKY&list=PL5-TkQAfAZFbzxjBHtzdVCWE0Zbhomg7r&index=4

PDF: https://web.eecs.umich.edu/~justincj/slides/eecs498/FA2020/598_FA2020_lecture10.pdf

profile
큰 사람이 되겠어요

0개의 댓글

관련 채용 정보