본문 바로가기
Computer Technology 기록부/인공지능 학습 기록부

CS231n Lecture 06. Training Neural Network

by Amins 2022. 2. 7.

인공신경망을 학습시키는 방법에 대해 알아보자

목차

- Activation Functions
- Data Preprocessing
- Weight Initialization
- Batch Normalization
- Babysitting the Learning Process
- Hyperparameter Optimization

Activation Functions

입력을 받아 w와 가중치 연산된 후 활성함수가 적용되어 다음 퍼셉트론으로 이동

Activation Function - Sigmoid

  • 각 입력을 받아서 그 입력을 [0, 1] 사이 값이 되도록 해줌
  • 입력의 값이 크면 Sigmoid의 출력은 1에, 작으면 0에 가깝게 됨
  • 0 근방의 모습은 선형성을 띔

 

 

sigmoid의 문제점 1. : Saturated neurons “kill” the gradients

saturated : activation value가 극단적 값만 가지게 되는 경우

  • What happens when x = -10? : 기울기값이 0
  • What happens when x = 0? : 기울기 값이 선형적으로 잘 정해짐
  • What happens when x = 10? : 기울기값이 0 

활성함수를 적용한 출력값 하나가 0에 수렴하게 되면 Chain Rule에 의해 gradient를 구할 때 “곱” 연산을 지속적으로 하면 gradient는 점점 0이 된다. -> 정상적 웨이트 업데이팅 불가능해짐

 

 

 

sigmoid의 문제점 2. Sigmoid outputs are not zero-centered

  • 시그모이드를 사용한 모델의 역전파 계산 시 입력값(upstream gradient)이 양수인 경우 출력값도 항상 양수가 된다.(x가 음수일 경우 출력값도 음수) => 마지막 출력층의 local gradient 부호가 모든 w들의 부호를 결정함!!! (결국 한번 업데이트 될때 모든 w들은 모두 +나 모두 -로 갈 수 밖에 없다!!) 
  • 이때 w를 좌표평면에 나타내 보면, w는 항상 ( + , + ) 또는 ( - , - ) 로밖에 움직이지 못하기 때문에 자유로운 영역은 1,3 사분면 뿐이고, 2, 4사분면에선 지그재그 패턴으로 움직이게 된다. -> 수렴 속도가 느려져 비효율적!
  • this is also why you want zero-mean data! - 평균이 0인 데이터를 쓰면 모든 영역 에서 효율적 이동 가능

 

 

sigmoid의 문제점 3. exp() is a bit compute expensive

  • 식 내 지수함수가 있어 계산비용이 비쌈

Activation Function - tanh

  • -1~1 사이 값으로 모음
  • 0을 중앙으로 하는 비선형함수
  • 여전히 saturated 가 될시 gradient 0으로 수렴되버림

Activation Function - ReLU

 

  • Does not saturate (in +region) : 양수부분에선 satuartion 발생 x
  • Very computationally efficient : 계산적 이점 多(+일때 기울기 선형인 심플한 함수)
  • Converges much faster than sigmoid/tanh in practice : 수렴이 기존 활성함수보다 빠름
  • Actually more biologically plausible than sigmoid : 실제로 생물학적인 기작과 더 유사
  • 실제로 가장 많이 쓰임

 

 

문제점

  • Not zero-centered output
  • 0보다 작은 부분의 gradient는 0이 됨. 즉 전체 gradient의 절반을 사멸시킴(Dead ReLU) 

ReLU에서는 평면의 절반만 activate 됨

각 평면(초록 빨강 직선)이 각 ReLU를 의미

 

"dead ReLU" 발생 조건

  • ReLU가 data cloud에서 떨어져 있는 경우 - 초기화가 잘못된 경우 활성함수가 어떤 데이터에서도 activate 되지 않고, 모두 0이 되어 backprop 발생 x
  • Leraning rate가 지나치게 높은 경우 - 처음에 "적절한 ReLU" 로 시작할 수 있다고 해도 만약 update를 지나치게 크게 해 버려 가중치가 날뛴다면 ReLU 가 데이터 범주를 벗어나게 됨.

Activation Function - Leaky ReLU

음수부분에 약간의 기울기 부여 - x가 음수면 gradient가 무조건 0이 되는 단점을 극복하기 위해 고안

  • 장점
    • Does not saturate (in +region) : 양수부분에서 포화 x
    • Very computationally efficient (exp이 없어서) : 매우 간단한 계산식 - 컴퓨팅 시간 단축
    • Converges much faster than sigmoid/tanh in practice : 수렴이 매우 빠름 
    • will not die : 기울기 0 되는 경우 x

해당 함수처럼 음수부의 기울기마저 학습 가능한 파라미터로 두고 최적의 기울기를 찾게하는 ReLU 함수도 존재


  • 음수부에 지수함수를 붙임
  • relu함수의 모든 장점 취합
  • zero mean output에 가까운 출력값 산출
  • 계산비용 高
  • 음수부에서 노이즈를 더 생성했기 때문에 보다 robust함 - 적당한 saturation이 존재

  • Relu와 Leaky Relu 일반화한 것
  • 입력값의 기본형식을 미리 정의하지 않음
  • 2개의 선형 결합 사용 - 포화 x : gradient 소멸 x
  • 선형결합이 2개라 파라미터 개수 2배

Data Preprocessing 데이터 전처리

가장 대표적인 전처리 과정 : "zero-mean"으로 변경 후 "normalize"

 

zero-mean data로 변경하는 이유?

평균이 0인 데이터가 아닌경우 gradient값의 다양성이 감소하고, 이는 최적의 파라미터를 찾는 시간을 증가시킴

따라서 zero-mean data로 변경하여 최적화된 gradient를 찾을 수 있게 해야함

 

Nomalize의 이유?

Nomalization을 통해 모든 데이터를 차원이 동일한 범위 안에 있게 맵핑하여 전부 동등한 기여를 하게 해줌 

이미지의 경우 nomalize는 잘 하지 않음 : 이미 각 차원 간 스케일이 어느정도 맞춰져 있는 경우가 多

 

 

 

 

다른 데이터 전처리 방식(PCA, Whitening 등) - 잘 쓰이진 않음


Weight Initialization

 

- A : 모든 뉴런이 같은 일을 한다 -> 모든 뉴런이 같은 출력값(gradient)을 산출한다. -> 모든 파라미터가 동일한 값으로 업데이트된다 -> 모든 뉴런이 같아짐 -> 최적의 파라미터 찾지 못함

 = 가중치를 동일하게 초기화시키면 발생하는 일!

 

가중치 초기화 방법 1. Small random numbers

평균0, 표준편차 0.01 인 가우시안분포를 따르는 w

  • 임의의 아주 작은 값을 초깃값으로 설정 - 초기 W를 표준정규분포(standard gaussian) 에서 샘플링
  • 작은 네트워크에서 효용 有, 네트워크가 깊어지면 문제 발생 가능성 高

레이어 10개, 뉴런 500개, active func = tanh 인 신경망

  • 각 레이어 출력의 평균, 표준편차 그래프(상단)를 보면 모두 0으로 수렴(평균이 0인건 tanh라 문제가 없지만, 표준편차가 0인건 값이 모두 0근처로 수렴해버렸다는 뜻)
  • 레이어당 평균 및 표준편차 그래프(하단)를 보면 첫번째 레이어에서는 잘 분포가 되었지만, 2번째부터 급격히 0으로 수렴하더니 3번째부터는 0이 됨

 

-> w가 너무 작은 값이라 곱하면 곱할수록 출력값이 급격히 줄어들기 때문!!!(결국 0에 수렴)  

 

해당 상황에서 가중치에 해당하는 gradient의 값

  • w가 0에 가까운 매우 작은 수이므로 wx또한 매우 작은 수가 됨 -> 여기에 계속하여 w를 곱하기 때문에 w1*x * w2 * w3 ....이 반복되다 보면 결국 마지막 레이어에서 wx값도 0에 수렴하게 된다.

 

  • Backporp 과정은 "upstream gradient" x "local gradient"
  • 이때 Wx를 W로 미분한 것이 local gradient : Wx/dW = x
  • 즉 local gradient = x
  • x가 엄청 작은 값이기 때문에(?) gradient도 작을 것이고 결국 업데이트가 잘 일어나지 않음

 

가중치 초기화 방법 2. Big random numbers

표준편차 0.01 -> 1.0 으로 변경시 

 

  • 모든 뉴런의 activation 값은 -1or 1(tanh의 포화점) - 모든 뉴런 포화 
  • gradient는 0 ->가중치 업데이트가 일어나지 x
  • Vanishing gradient 발생

 

 

가중치 초기화 방법 3. Xavier/He initialization

  • 합리적인 웨이트 초기화 방식
  • 가우시안으로 추출한 w값을 입력수에 루트를 취한 값으로 나누어 /출력의 분산을 맞춰주는 것 
    • the distribution of the outputs from a randomly initialized neuron has a variance that grows with the number of inputs(? 이해 더 필요)
  • 레이어의 출력값들이 적절한 분포를 보임

 

문제점 - ReLU 사용시 작동 x

  • Xavier initialization을 사용하기 위해 가정한 것이 현재 선형 활성함수 내부에 있다고 보는 것
  • ReLU는 비선형 함수, 음수부에서 모든 gradient를 0으로 만들어 버리므로 분산도 절반이 0이 됨. 즉,  W가 매우 작아저 gradient가 0에 가까워진다.

 

해결방안 - (He) W initialization

가중치 초깃값에 입력수에 루트를 취한 값을 나눠줄때, 추가적으로 2를 더 나눠준다.

뉴런들 중 절반(음의 영역)이 사라져 실제 입력은 반 밖에 안되는 것을 고려하기 위함


Batch Normalization

가우시안 범위 내로 activation을 유지시키는 또다른 방법

 

강제로, 해당 레이어의 출력값이 가우시안 내에 분포하도록 조절해버리자! 라는 아이디어

 

 

 

 

 

    • 어떤 레이어로 부터 나온 배치 단위만큼의 출력값들간의 평균과 분산을 구함
    • 각각의 출력을 앞에서 구한 한 배치 내의 평균과 분산을 이용해 nomalize 함
    • 학습마다 각 레이어에서 이러한 과정 진행
    • 기존엔 깊은 네트워크에서 각 레이어의 너무 작거나 큰 W가 지속적으로 곱해져서 Bad scaling effect가 발생했지만, Normalization을 하면 계속 linear한 공간 내에 존재할 수 있음

 

 

Batch Nomalization의 위치 - FC나 Conv 직후에 위치(활성함수 적용하기 직전)

 

Conv layer에서 Batch Nomalization 사용시 주의사항

같은 Activation Map의 같은 채널에 있는 요소들은 같이 Normalize

Activation map 마다 평균과 분산을 하나만 구하고, 현재 Batch 에 있는 모든 데이터로 Normalize

 

 

- nomalization을 통해 saturation을 모두 없애는게 과연 좋은 걸까?

그렇지는 않다. 아예 일어나지 않는 것보다는, 원하는 만큼만 일어나는 것이 더 좋으므로, 마지막에 scaling 연산을 더함

  • 학습 가능한 파라미터 감마, 베타값으로 스케일링을 주어, nomalization의 유연성을 확보한다.
  • 만약, 네트워크가 감마와 베타를 우측 박스 안의 값으로 학습한 경우, 해당 레이어의 activation에서 nomalize는 상쇄되어 사라진다.

장점

  • gradient 흐름을 더욱 robust하게 만들어준다
  • 더 높은 learning rate를 사용 가능
  • 초기화 의존도 줄여줌 - (배치 내 데이터 전부에서 평균 분산 구해서 노말라이징 한 데이터[정규화된 데이터]를 활성함수에 넣으니까 이상한 웨이트로 explode 하거나 0으로 죽을 확률 감소)
  • dropout 필요성 감소

 

 


Babysitting the learning process

학습 과정 총 정리

  • 평균이 0이되는 데이터로 변경 후 nomalize  

 

 

 

  • 알맞은 모델 선택

 

Step3 : 초기 loss 확인

  • 파라미터 초기화 후 모델이 사용하는 loss func의 초기 세팅에 맞는 오류가 산출되는지 확인
  • regularization 행을 삽입한 경우 오류값이 증가해야함 

 

Step4 : 모델 학습 - learning rate 조절

train 과정 속 loss, accuracy 상태 확인 - loss가 감소하고, accuracy가 1에 가까워지면 학습이 잘 되고 있는 것을 의미

  • loss가 변하지 않음 : learning rate가 너무 작다
  • loss exploding(cost = NaN) 발생 : learning rate가 너무 크다

Hyperparameter Optimization

 

방법1. Cross-validation strategy

  •  넓은 범위에서 적은 에폭으로 학습을 진행시켜 파라미터가 잘 작동하는 대략적인 범위 산출(loss가 줄어드는지, Nan이 뜨는 지를 보고 판단)
  • 대략적으로 찾은 범위를 보다 세밀하게 쪼개어 학습시키고 최적 파라미터값을 찾음

위의 그림은 coarse, 아래 그림은 fine search 예시

 

 

 

 

방법2. Random Search vs. Grid Search

  • Grid search : 하이퍼 파라미터를 고정된 값과 간격으로 샘플링하여 최적의 값을 찾는 방법
  • Random search : 하이퍼 파라미터를 랜덤으로 샘플링하여 최적의 값을 찾는 방법

 

Grid search보다 Random search가 더 효과적. grid search는 일정한 간격으로 파라미터를 대입하므로 최적 값 찾기가 쉽지 않음 

 


learning rate에 따른 loss 변화

 

 

 

validation/train accuracy의 갭차이가 나타내는 의미

train accuracy가 val accuracy에 비해 너무 높다면, 이는 overfitting을 의미함

댓글