히비스서커스의 블로그

[CS231n 6] Training Neural Networks 1 본문

Theory/Computer Vision

[CS231n 6] Training Neural Networks 1

HibisCircus 2021. 2. 7. 17:40
728x90

내용들은 전적으로stanford university의 CS231n 2017 6강 강의 내용을 기반으로 작성하였음을 먼저 밝힙니다.

 

 

 

이전 5강에서는 Convolutional Neural Networks에 관해서 살펴보았다.

 

2021/02/01 - [Programming/CS231n] - [Lecture 5] Convolutional Neural Networks

 

[Lecture 5] Convolutional Neural Networks

※ 이 내용들은 전적으로stanford university의 CS231n 2017 5강 강의 내용을 기반으로 작성하였음을 먼저 밝힙니다.※ 이전 4장에서는 Backpropagation과 Neural Networks에 관하여배웠다. 2021/01/25 - [Progra..

biology-statistics-programming.tistory.com

 

지난 시간에 배운 내용 요약

 

CNN

 

- CNN은 Spartial structure를 사용하기 위해 Convolution layer를 사용하는 NN(Neural Network)의 특수한 형태이다.

- CNN은 다수의 필터를 사용하였고 각 필터는 서로 다른 Activation map을 만든다.

- Activation map는 필터의 갯수만큼 존재하며 각 map은 입력의 공간적인 정보를 보존하고 있다.

 

Mini-batch Stochastic Gradient Descent

 

Mini-batch SGD는 우선 데이터의 일부만 가지고 Forword pass를 수행한 뒤에 Loss를 계산한다.

그리고 gradient를 계산하기 위해서 backprop를 수행한다.

여기서 얻은 gradient를 이용해서 파마미터를 업데이트한다.

 

 


6과의 내용은 활성함수 선택, 데이터 전처리, 가중치 초기화, Regularization, gradient checking 등이다.

Training Neural Network


활성함수

데이터 입력이 들어오면 가중치를 곱한 후 비선형 연산(활성함수)을 거치게 된다.

activation 함수는 시그모이드함수, 렐루함수 등 다양한 함수가 존재한다.

Sigmoid function

시그모이드: 입력이 0과 1사이가 되도록 해준다.

어떤 값이 0에서 1 사이의 값을 가지면 firing rate라고 할 수 있다. 참고로 뉴런의 신경세포체 potential이 (시냅스 전위가) 어떤 역치값 이상으로 상승하면 뉴런이 작동하는 것을 firing이라 하고 firing되는 역치값의 주파수를 firing rate라 한다.

 

Saturation

activation function에서 기울기가 0에 가까워지는 현상을 saturated라고 한다.

 

시그모이드 함수의 3가지 문제점

시그모이드 함수를 활성화함수로 사용할 시 다음과 같은 3가지 문제가 발생한다.

1. gradient를 없앤다.

 

데이터 X에 출력이 있다. back prop에서 X가 음의 큰 값을 가질경우 (예를 들어 -10정도의 값) 이때의 gradient는 0이 된다.

이 값은 밑으로 내려가고 이값이 back prop가 될 것이다. 따라서 gradient가 죽어버리게 된고 0이 계속 전달될 것이다.

X가 0이거나 근접한 구간에서는 잘 작동할 것이다.

X의 절댓값이 10정도로 커지면 gradient가 0이 되어 잘 전달되지 않을 것이다.

 

2. 시그모이드의 출력이 zero centered하지 않다.

 

X가 가중치와 곱해지고 activation 함수를 거칠 것이다.

만약 모든 X가 양수의 값을 가질 경우 gradient의 부호는 upstream gradient의 부호와 같아질 것이다. 이는 W가 모든 같은 방향으로 전해질 것이라는 뜻이고 전부 양수나 음수로 업데이트 된다는 것은 지그재그로 움직여 비효율적이다.

3. exp()로인해 계산비용이 크다. 즉, 연산이 Exponential이 포함되어 계산이 복잡하다.

 

 

tanh(x) function

두번재 활성함수 tanh :: Activation Function을 살펴보자

1. 범위가 -1,1 이지만 입력 x의 절댓값이 커지면 saturation의 문제가 발생한다.

 

2. zero centered하다. 따라서, 모든 입력이 양수이더라도 gradient가 upstream gradient에 의존적이지 않다.

하지만 기울기가 여전히 죽는다.

 

ReLU function

세번째 활성함수는 ReLU함수이다.

1.입력이 음수이면 값이 0이 되고 양수이면 입력값 그대로 출력한다. 입력 값이 양수라면 saturated 되지 않는다.

하지만, 음의 수에서는 기울기가 죽어버린다.

 

2. 제로 센터하지 않다.

 

3. 연산이 매우 쉽다.

 

dead ReLU

아래의 data cloud는 training data라고 한다면 ReLU에서는 평면의 절반만 activate된다. 각 평면 (초록 직선과 빨간 직선)이 ReLU를 의미한다. ReLU가 data cloud에서 떨어져 있는 경우에 dead ReLU가 발생할 수 있다.

 

1. 초기화를 잘못한 경우

 

가중치 평면이 data cloud에서 멀리 떨어져 있는 경우로 어떤 데이터 입력에서도 activate 되는 경우가 존재하지 않을 것이고 backporp이 일어나지 않을 것이다. 따라서 update되지도 않을 것이다.

2. Learing rate가 지나치게 높은 경우

 

처음에 "적절한 ReLU" 로 시작할 수 있다고 해도 만약 update를 지나치게 크게 해 버려 가중치가 날뛰는 경우가 발생할 수 있다.

 

 

학생의 질문

데이터 클라우드는 훈련데이터이다.

data cloud에서 데이터가 죽는지 안죽는지를 어떻게 알 수 있는가?

간단한 2차원이다. 입력은 초평면과 데이터의 위치를 고려했을 때 동떨어져 있다는 것을 확인할 수 있다.

 

 

학생의 질문

입력이 모두 양수이면 오른쪽 지역으로 나와 0이 되지 않지만 시그모이드에서는 gradient가 0이 될 수 있다.

업데이트를 할 때 zero positive bias로 초기화한다.

 

 

Leaky ReLU, PReLU, ELU

Leaky Relu

Relu 이후에 Leaky Relu함수를 가지게 되었다. 이는 음수 지역에서도 기울기가 0이 되지 않는다.

PReLU(parametric rectifier)는 Leaky ReLU와 유사하지만 기울기가 파라미터로, 기울기 값을 정해놓은 것이 아니라 backpropagation으로 학습시킬 수 있다.

 

 

ELU

기울기 유연해지는 ELU는 zero -mean를 가지지만negative에서 기울기를 가지는 대신에 saturation이 된다.

하지만, Saturation이 되는 것 즉 deactivation이 좀 더 잡음에 강인할 수도 있다. 이는 논문에 잘 나와있다.

 

maxout neuron

두 함수 w1x+b1, w2x+b2 중 최대값을 방출한다. 이때 maxout함수는 선형함수이기 때문에 기울기가 죽지 않는다.

 

activation function 요약

  • ReLU를 써라.
  • Leaky ReLU, Maxout, ELU 등을 시도해봐라.
  • Tanh는 써보되 기대하지 마라.
  • sigmoid는 쓰지마라.

 

 


Data Preprocessing

Data Preprocessing에 대해 배워보자.

가장 대표적인 전처리 과정은 zero-mean으로 만들고 normalize하는 것이다.

zero centering의 필요성

zero centering에 대해 배웠지만 해주지 않는다면 데이터가 전부 양수이거나 0 음수일 때 그라디언트가 모두 양수이거나 음수가 된다.

정규화의 필요성

정규화는 모든 차원이 동일한 범위안에 있게 해주어 전부 동등한 기여를 할 수 있게 해준다.

이미지 데이터의 경우는 zero-centering 정도만 해준다. 정규화를 많이 해주지는 않는 이유는 각 차원 간에 스케일이 어느 정도 맞춰져 있기 때문이다.

이미지 데이터를 다룰 때는 입력을 굳이 더 낮은 차원으로 옮기지 않는다. CNN에서는 원본 자체의 공간적인 정보를 이용해 이미지의 공간적 구조를얻을 수 있도록 한다.

 

PCA와 Whitening

 

머신 러닝에서 전처리 기법으로 PCA나 Whitening을 사용하기도 한다. (보통 이미지데이터에서는 사용하지 않는다.)

PCA

PCA는 간단히 설명하자면 데이터 셋의 차원을 축소화되(원래 변수들의 선형결합을 이용) 가능한 한 많은 정보를 보존하고자 하는 기법이다.

 

Whitening

Whitening도 간단히 설명하자면 데이터를 고유값으로 나누어 정규화시키는 방법으로 분포를 고르고 깨끗하게 만들어주는 것으로 이해하면 좋다.

데이터 전처리 요약

요약을 해보자면 이미지 데이터를 다룰 때는 기본적으로 zero-mean으로 전처리를 해준다. 평균 값은 전체 training data에서 계산을 한다. test data의 이미지에도 training data에서 계산한 평균을 빼준다. VGGNet과 같은 네트워크 같은 경우 채널(RGB)마다 평균을 독립적으로 계산하는 경우도 있다.

 

학생의 질문

채널의 의미가 무엇인가?

채널은 RGB로 32X32X3 높이 너비 RGB인 것이다.

 

학생의 질문

평균을 어떻게 계산하는지?

학습 데이터 전부를 가지고 계산한다.

미니배치 단위로 학습시킨다고 해도 평균계산은 미니배치 단위 각각이 아니라 전체로 계산을 해준다.

트레이닝 데이터의 평균이다. 배치에서 뽑은 데이터도 전체 데이터에서 나온 것이기 때문에 전체의 평균으로 볼 수 있다. (중심극한정리에 의해서)

 

학생의 질문

데이터 전처리가 시그모이드를 해결해줄 수 있는가?

단지 첫번째 레이어에 대해서는 해결해줄 수 있을 것이다.

하지만 레이어가 딥해질수록 더욱 어려울 것이다.

 

 

 


가중치 초기화에 대해 알아보자

첫번째 모든 가중치 = 0이면 어떻게 될까?

모든 뉴런이 같은 일을 할 것이다. 죽지는 않을 것이고 어떤 영역에 속할 것이다.

하지만 같은 역할 모두 다 같은 연산을 수행한다는 것이다.

 

가중치가 0이라서 모든 뉴런이 다 같은 연산을 하므로 출력이 같을 것이다. 모든 뉴런이 똑같이 생성될 것이다.

출력도 모두 같을 것이고 gradient도 같을 것이다. 모든 가중치가 똑같이 업데이트를 해주기 때문이다.

따라서, Symmetry breaking(우리가 원하는 것들을 얻는 방향)이 일어날 수 없다.

 

용어 정리

upstream: 출력에서 입력으로 역전파

downstream - local gradient: 입력에서 출력으로 가는 것

 

학생의 질문

gradient는 가중치뿐 아니라 Loss에 영향을 받지 않느냐 (각각의 gradient는 다르지 않느냐?)

각 뉴런이 어떤 클래스에 연결되어 있는지에 따라 뉴런들이 서로 다른 loss는 가질 수 있다.

하지만 네트워크 전체를 보면 많은 뉴런들이 동일한 가중치로 연결되어 같은 방식으로 업데이트 될 것이다.

가중치 값을 표준정규분포의 표준편차가 0.01인 경우

가중치 값을 표준정규분포에서 크기가 0.01이 되도록 추출하는 방법을 생각해보자.

10개의 레이어로 이루어진 네트워크에 각 레이어 별 activation수치를 시각화 해보면 다음과 같다.

그림과 같이 표준편차가 줄어들게 된다. 가중치의 값이 매우 작기 때문에 가중치를 곱할수록 기울기가 0에 가까워지게 된다.

따라서, 모든 활성함수의 결과가 0이 될 것이다.

 

backward의 과정도 생각해보자. 현재 가중치를 업데이트하기 위해 upstream gradient와 local gradient를 곱해준다. local gradient는 W에 대해 미분하였을 때 입력 X가 되어 매우 작은 값이 될 것이고 여기에 upstream gradient를 곱해주어도 작게될 것이다.

 

 

가중치의 값을 좀 더 크게 해보자 표준편차를 0.01이 아닌 1로 하면 어떻게 될까?

값들이 saturation될 것이다. 가중치가 큰 값을 가지므로 출력이 항상 -1이거나 +1인 결과를 낳게 될 것이다.

값들은 Saturated되고 gradient는 0이 되면 가중치가 업데이트 되지 않을 것이다.

 

 

가장 적당한 값들을 가지게 하는 방법들은 크게 2가지가 존재한다. Xavier initialization과 He initialization이다.

Xavier initialization

잘 알려진 방법은 Xavier initialization이다.

Xavier initialization의 역할은 입/출력의 분산을 맞춰주는 것이다. 이때의 방식은 입력의 수가 작으면 더 작은 값으로 나누고 좀 더 큰 가중치 값을 가지게 하는 방식이다. 입력의 수가 작으므로 곱해지는 가중치가 더 커야 출력의 분산만큼 큰 값을 얻을 수 있기 때문이다.

하지만 단점은 활성함수로 ReLU를 쓰면 잘 작동하지 않는 것이다. 출력의 절반을 죽이기 때문에 매번 -이 되고 출력이 -이 되어 버린다.

 

He initialization

활성함수로 ReLU를 쓸 경우 가중치 초기화 방법은 He initialization을 사용한다.

 

 

 


Batch Normalization

gaussian의 범위로 activation을 유지시키는 것에 관련한 다른 아이디어로 Batch Normalization이 존재한다.

모든 레이어에서 표준정규분포를 따르는 값 중에 하나가 나오도록 해주는 방법이다.

각 레이어를 batch 단위로 들어오는 모든 값을 평균과 분산을 이용해 Normalization 해주는 것이다.

Batch당 N개의 학습데이터가 있고 각 데이터가 D 차원이라고 한다면 각 차원별로 (화살표 범위별로) 평균을 각각 구해준 후 normalize하는 것이다. 이 연산은 FC(Fully connected)나 Cov Layer 직후에 넣어준다.

이전에 깊은 네트워크에서 각 레이어의 W가 지속적으로 곱해져서 Bad scaling effect가 발생했다. Batch Normalization은 이러한 역할을 상쇄시켜주는 것이다.

 

FC layer에서 normalization 시켜줄 때와 Conv layer에서 normalization을 시켜줄 때의 차이점

Conv layer에서 normalization을 시켜줄 때는 차원마다 독립적으로 수행하는 것이 아니라 activation map의 같은 채널에 있는 요소들을 같이 normalize해준다. 그 이유는 Conv layer 특성상 같은 activation map일 경우 같은 평균과 분산으로 normalization시켜야 하기 때문이다.

 

Normalization을 시켜주는 이유?

FC layer를 거칠 때마다 매번 normalization을 해주어야 하는가?

Normalization을 시켜주는 이유는 Gaussian unit이 tanh의 입력으로 들어가 Linear한 영역에만 있게 하려는 것이다. 이럴 경우 Saturation이 일어나지 않게 된다. 하지만, saturation을 아예 안시키는 것이 아니라 적당하게 일어나도록 조절해주는 것이 더 현명한 방법이다.

따라서, 우리는 Scaling을 통해 조정해줄 수 있다.

바로 normalized된 값을 원상복구 시키는 것으로 감마는 분산 베타는 평균으로 하면 된다. 이를 통해 Batch normalization에 들어가기 전 값으로 되돌리는 것이다.

 

batch normalization 요약

BN은 gradient의 흐름을 보다 원활하게 해주며 Robust하게 (이상치에 대해 덜 민감하도록) 해준다.

또한, regularization의 역할도 하는데 이는 레이어의 출력은 하나의 샘플에 대해서 결정적인 것이 아니라 batch 안에 평균과 분산의 과정에서 모든 데이터들의 정보를 다 가지고 있기 때문에 모든 데이터의 영향을 받게 된다.

traing time에서 구한 값을 test에서 사용하므로 test에서는 따로 평균과 분산을 구하지 않는다.

 

 

 


Babysitting the Learning Process (하이퍼 파라미터의 조정)

이제 학습과정을 어떻게 모니터링하고 하이퍼파라미터를 조정할 것인지를 알아보자

첫번째로 데이터 전처리이다.

zero mean을 사용해야 한다.

그 다음은 architecture를 선택해야 한다. hidden layer 50개를 가진 모델로 가정해보자

다른 건 어떤 모델을 하든 상관이 없다.

그 다음으로 해야할 일은 가중치를 초기화해주어야 한다.

 

saint check과정

우리가 배운 내용을 토대로 softmax사용할 시 가중치가 작을 값을 가질 때 loss의 값이 2.3이라는 것은 우리가 원하는 대로 작동한다고 볼 수 있다. 이것은 good sanity check이다.

지금까지는 regularization을 0으로 설정하였기에 적용할 것이다. 이때 손실함수에 regularization term이 발생하므로 loss의 값은 증가할 것이다.

loss의 값이 3이 나왔으므로 우리가 원하는대로 잘 작동하는 것을 확인할 수 있다.

이제 적은 데이터양을 넣어주어 overfitting이 되는지 확인한다. 양이 적어도 overfitting이 되지 않는다면 문제가 있는 것이다.

overfitting이 된다는 것은 loss값은 줄어들면서 accuracy값이 커진다는 것을 통해 알 수 있다.

 

학습시작

전체 데이터를 활용하여 학습을 시킬 것이다. 가장 중요한 하이퍼파라미터는 Learning rate이다. 너무 작다면 loss가 줄어들지 않을 것이다. 반면에 너무 크다면 발산해버릴 것이다. 이를 염두하여 최적은 Learning rate값을 조정해나갈 수 있다.

 

 

 

 


Hyperparameter Optimization 하이퍼파라미터의 조정

학습과정을 다루는 것을 모니터링하고 하이퍼 파리미터를 줄 것인지

cross validation

training set으로 학습시키고 validation set으로 평가하는 방법이다.

이후 Coarse stage(큰 간격으로 찾아가는 것)을 통해 최적의 하이퍼파리미터의 범위를 설정해주고

Fine stage(섬세한 간격으로 찾아가는 것)를 통해 최적의 하이퍼파리미터를 설정해나가는 것이다.

 

하이퍼 파라미터를 찾는 또 다른 방법 grid search

랜덤서치와 그리드 서치의 차이

grid search를 이용하는 것은 일정한 간격을 두고 하이퍼 파라미터를 찾는 방법이다.

grid search보다는 random search를 하는 것이 더 좋다. 왜냐하면 random search 과정에서 다양한 sampling을 하게 되므로 변화에 대해 더 민감하게 반응한다고 볼 수 있기 때문이다.

하이퍼파라미터를 조정하는 것은 턴테이블에 knobs를 조정하는 과정과 같다고 할 수 있다. 일종의 예술이다.

learning rate가 좋고 나쁜지는 loss curve를 통해 알 수 있다.

learning rate가 높은 경우: loss가 발산한다. loss가 가파르게 내려가다가 어느 순간 정체기가 생긴다.

learning rate가 낮은 경우: loss가 평평하다.

loss curve가 갑자기 내려가는 경우는 초기화의 문제일 수 있다. 이는 gradient의 backprob이 초기에 안되다가 학습이 진해오디면서 회복이 되는 경우이다.

 

 

 

 

2021.02.08.월

 

 

-히비스서커스-

728x90

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

[CS231n 9] CNN Architectures  (2) 2021.02.21
[CS231n 7] training neural network 2  (0) 2021.02.14
[CS231n 5] Convolutional Neural Networks  (0) 2021.02.01
[CS231n 4] Introduction to Neural Networks  (0) 2021.01.25
[CS231n 3] Optimization  (0) 2021.01.18