본문 바로가기

컴퓨터공학

[CS231n 6강 정리] 신경망 학습 (Training Neural Networks)

반응형
더보기

Q. input의 3컬러채널과 필터의 내적값이 다 합해지는건가? 맞음

 

오늘은 신경망 학습시에 필요한 기본 설정들에 대해서 다뤄봅니다. 순서는 이렇습니다.


Activation Functions

앞선 강의에서도 언급했던 것처럼, input이 들어오면 가중치와 곱해지고, 비선형 함수인 활성함수를 거쳐 해당 데이터의 활성화여부를 결정해준다고 배웠습니다. 활성화 함수에는 여러가지가 있습니다. 오늘은 각 활성함수의 문제점과 이를 어떻게 개선해나갔는지에 대해 알아봅시다.

Sigmoid

문제점 1

- 음/양의 큰값에서 Saturation되는 것이 gradient를 없앤다.

- x가 0에 가까운건 잘 동작함

 

문제점 2

- 출력이 zero centered가 아니다

- 만약 x가 항상 양수일 떄, w의 gradient는 시그모이드 upstream gradient와 부호가 항상 같게 된다. 이는 W로 하여금 모두 양의 방향이나, 모두 음의 방향으로밖에 업데이트가 되지 못하게 하기 때문에, zig zag path를 따르게 되며, 비효율적이다.

 

문제점 3

- exp() 가 연산 cost가 비쌈

tanh

zero-centered 문제는 해결되었으나, saturation 문제는 여전히 존재

 

ReLU(젤 마니씀)

- x가 양수이면 saturation 되지 않는다.

- 계산 효율 좋음( sigmoid나 tanh보다 수렴 속도가 약 6배 빠름)

- 생물학적 타당성

 

문제점

- zero- centered가 아님

- 음의 영역에서는 saturation (x=0에서도 gradient 0)

- gradient의 절반을 죽인다 -> dead ReLU라고 함

Dead ReLU

- 초기화를 잘못해서 가중치 평면이 data cloud에서 멀리 떨어진 경우

- Learning rate가 지나치게 높은 경우, 가중치가 날뛰게 되며 ReLU가 데이터의 manifold를 벗어나게 됨

- 학습 다 시켜놓은 네트워크를 살펴보면 10-20퍼는 dead ReLU가 되어있는데, 이 정도는 ㄱㅊ

- 그림에서 초록빨강 평면은 ReLU의 입력 행렬을 표현한 것

- 그래서 초기화시에 positive biases를 추가해주는 경우 많음, active 될 확률 높이기

- 대부분은 zero-bias로 사용

 

여기서부터 아직 실험단계

 

Leaky ReLU

- zero-mean

- 음의 영역에서도 이제 saturation 되지 않음

- dead ReLU도 없음

PReLU

- Leaky ReLU와 비슷하지만 기울기 alpha (파라미터)로 결정됨

ELU

- zero-mean에 가까운 출력값

- 음에서 saturation. 하지만 saturation이 노이즈에 강인하다고 생각

Maxout Neuron

- 기본형식을 정의하지 않음

- 두개의 선형함수 중 큰 값을 선택 -> ReLU와 leaky RELU의 일반화 버전

- 선형이기에 saturation안되고 gradient 안죽음

- W1, W2 때문에 파라미터 수 두배됨


Data Preprocessing

- zero-mean으로 만들고 표준편차로 normalize

- 이미지의 경우 스케일이 어느정도 맞춰져 있어서 zero-mean만 해준다.

 

해주는 이유는 앞서 입력이 전부 positive한 경우를 방지하는 것과 같음. 학습최적화를 위한 것

평균값은 전체 training data에서 계산하여 test 데이터에도 동일하게 적용

RGB별로 각각 평균을 내는 경우도 있다.

 

Weight Initialization

모든 파라미터를 0으로 설정한다면?

- 모든 뉴런이 같은일을 한다

- 모든 가중치가 똑같은 값으로 업데이트됨

- 모든 가중치를 동일하게 초기화시키면 symmetry breaking이 일어날 수 없다.

- 서로 다른 loss를 가질 수 있으나 많은 뉴런들이 동일한 가중치로 연결되어 있을것이며, 모든 뉴런이 같은 방식으로 업데이트 될 것이다.

 

임의의 작은 값으로 초기화하기

- 초기 W를 표준정규분포에서 샘플링 한다

- 딥뉴럴네트워크에서 여전히 문제가 생길 수 있다.

위의 그래프처럼 출력깂이 점점 0에 가까워짐을 알 수 있다. 우리가 원하는 것이 아님

- 즉 입력 값이 0에 수렴하고, 이는 gradient를 개작게 만듬, 결국 업뎃이 잘 안일어남

 

좀 더 큰 값으로 초기화하기

- saturation되고 gradient 0

 

그래서 고안한 것이

Xavier Initalization - Glorot(2010)

- stadard gaussian으로 뽑은 값을 입력의 수로 스케일링 해준다

- 입출력의 분산을 맞춰주는 것

- 입력 수가 작으면 더 작은 값으로 나누고 좀 더 큰 값을 얻는다. 더 큰 가중치가 필요하다. 그래야 출력의 분산 만큼 큰 값을 얻을 수 있다.

- 각 레이어의 입력이 Unit gaussian이게 된다.

- 하지만 ReLU를 쓰면 출력 분산의 절반을 날려버리는 거라서 잘 작동하지 않음. 값이 너무 작아짐. 결국 비활성됨

- 이를 위해 추가적으로 2를 더 나눠주어 절반이 없어졌다는 사실을 고려하면 꽤 잘작동


Batch Normalization

- 레이어의 출력이 unit gaussian이길 바람. 강제로 그렇게 만들어보자.

- 현재 batch에서 계산한 mean과 variance를 이용해서 normalization을 할 수 있다.

- 학습동안 모든 레이어의 입력이 unit gaussian이 됐으면 좋겠다

- FC나 Cov Layer 직후에 넣는다

- Conv에서는 같은 Activation Map의 같은 채널에 있는 요소들은 같이 Normalize 해줌

하지만 unit gaussian이 되어 항상 saturation이 일어나지 않는 경우만 되는 것을 선호하진않고, saturatiaon을 조절하고 싶기 때문에 scaling 연산을 추가함.

 

BN은 gradient의 흐름을 원활하게 해주고 학습이 더 잘되게 해준다. 또한 learning rate를 키울 수 있고, 다양한 초기화 기법들도 사용할 수 있게된다. test time에서 추가적인 계산은 없다. 또한 regularization의 역할도 한다.


Babysitting the Learning Process

1. 데이터 전처리

2. 아키텍쳐 선택

3. 네트워크 초기화

4. 초기 loss 체크

- soft max라면 로그 체크, 이후 regularization term 추가후 loss 증가 체크

5. 데이터 일부만 학습시켜보기

- regularization 사용 x

- epoch마다 loss 내려가는지 확인, train accuracy 증가 확인

6. learning rate 정하기

- regulaization 약간만 주고 learning rate 찾기

- learning rate가 작으면 gradient 업데이트가 충분히 일어나지 않아 loss가 잘안줄어듬

- 너무 크면 NaNs cost발산

- 보통 e-3 e-5 사이 사용


Hyperparameter Optimization

cross-valindation은 training set으로 학습시키고 validation set으로 평가하는 방식

1. coarse stage: epoch 몇번으로 좋은지 아닌지 판단 -> 범위 결정

- 로그 스페이스에서 차수 값만 샘플링하는게 좋다

2. fine stage: 학습 좀 더 길게

- train 동안 cost 변화를 읽자. 이전 cost보다 더 커지거나 3배 높아지거나 하면 NaNs 나옴. 엄청 빠르게 오르면 멈추고 다른거 선택

- 여기서 말하는 cost가 뭔지?

- reg범위, lr 범위 정함

- 최적 값이 범위의 중앙 쯤에 위치하도록 범위를 설정

- random search를 사용하면 important variable에서 더 다양한 값을 샘플링 할 수 있어 좋다

 

loss curve

-평평하다가 갑자기 가파르게 내려감-> 초기화 문제

= gradient의 역전파가 초기에는 잘 되지 않다가 학습이 진행되면서 회복

 

train과 va accuracy가 큰 차이면 오버핏 -> regularization의 강도 높이기

gap이 없다면 아직 overfit하지 않은 것이고 capacity를 높일 여유있는 것

가중치의 크기 대비 가중치 업데이트의 비율 0.001이 좋다

가중치의 크기=파라미터의 norm 구하기

반응형