👩‍💻LEARN : ML&Data/Lecture

[CS231n] Lecture6. Training Neural Networks 1

쟈니유 2023. 5. 14. 21:57
728x90

Overview the Training 

One time Setup

  • Activation functions
  • Preprocessing
  • Weight initialization
  • Regularization
  • Gradient Checking

Training Dynamics

  • Babysitting the learning process
  • Parameter updates
  • Hyperparameter optimization

Evaluation

  • model ensembles

 

Activation Functions

역할 

노드에서 합쳐진 wx+b의 sum에 대해 f(sum)하는 것 

종류

 

[sigmoid]

  • sig(x) = 1 / (1+exp(-x))
  • 입력 값들을 0~1 사이로 산출
  • 문제점
    • Vanishing gradient 
      • Active region of sigmoid(x=0 주변, 값이 0,1이 아닌 지점)에서만 sigmoid가 제대로 활동함
      • 값이 1,0이 되는 부분은 Flat하기 때문에 x의 값이 너무 크거나 작을 경우 local gradient가 0이 됨 
        • sigmoid gate의 global gradient는 dL/dsig, local gradient는 dsig/dx
        • 시그모이드 함수 그래프에서 시그모이드를 x에 대해 미분하면(기울기), 1과 0에 해당하는 flat지역의 기울기는 0에 가까워짐 
        • 이에 backpropagation을 할 때 x의 값에 따라 backprop이 중지될 수 있음 
    • Not zero centered 
      • x가 모두 양수라고 가정해보면, backprop시 w가 모두 같은 방향으로 움직여서 최적의 w를 찾는 것이 어려워짐
        • f = ∑wx+b일때, df/dw=x이다.
        • dLoss/dw = dLoss/df * df/dw = dLoss/df*x가 됨 → 모든 w에 대한 gradient가 같은 부호가 됨 
        • 지그재그 형식의 gradient update가 되어 효율적이지 않음 
    • exp 계산이 비효율적이다(별로 안 중요한 단점) 

[tahn]

  • 모든 input을 -1~1사이의 출력으로 전환시킴 
  • zero centered되어 sigmoid의 단점을 극복
    • 시그모이드에 비해 0(원점)에 대칭되어 상대적으로 0 부근에 데이터가 더 많이 분포됨 
  • 하지만 여전히 gradient가 사라지는 문제점이 있음 

 

[ReLU]

  • f(x) = max(0,x)
  • 양수 영역에서는 satured되지 않음 
  • 계산 효율적 
  • 시그모이드, 탄보다 더 converge됨(모인다?)
  • 문제점
    • zero centered되지 않음 
    • x가 음수인 영역에선 ReLU가 작동되지 않으며, 이 경우 gradient가 죽어버림 (절반을 날리는 것)
      • x가 양수일 경우 기울기는 무조건1, 음수일 경우 무조건0. 

[Leaky ReLU]

  • f(x) = max(0.01*x,x) 
  • gradient vanishing문제, dying문제가 해결됨 
  • PReLU
    • f(x) = max(a*x,x) 파라미터로 a를 둠. backprop으로 학습하는 파라미터 

[ELU]

  • f(x) = x (if x>0), a * (exp(x)-1) (if x<=0) 
  • ReLU의 장점은 그대로 유지
  • zero mean에 좀 더 가까워짐 (0 근처에 데이터가 좀 더 있음)
  • 오히려 Leaky ReLU보다 에러에 강인할 것 

[Maxout Neuron]

n개의 선형 함수 중 최대 결과 값을 취하는 뉴런으로 비선형(Max)임 

ReLU와 Leaky ReLU를 일반화시킬 수 있음 

선형 영역이 있기 때문에 vanishing gradient, dying 문제가 없음 

parameter,neuron이 n개 만큼 필요함 

Data Preprocessing

[Preprocess the data]

zero-centered 

  • X-=np.mean(X,axis=0)
  • 데이터를 zero-mean, 즉 원점을 중심으로 데이터를 모이게 하는 것 
  • 시그모이드에서처럼 zero-mean하지 못할 경우 w에 대한 gradient가 지그재그모양으로 업데이트 되는 문제가 발생 

 

normalize

  • X /=np.std(X,axis) (after zero-mean)
  • 데이터 별로 동등한 기여를 할 수 있도록 (특정 범위 안에 들어가도록)표준편차로 나누어 정규화
  • 이미지는 이미 각 픽셀값이 0~255 사이에 분포하기 때문에 정규화하지 않아도 됨 

 

PCA/Whitening

  • PCA : data가 diagonal covariance 행렬일 경우 
  • Whitening : covariance matrix가 identity matrix일 경우 
  • 이미지엔 잘 수행하지 않음 

Weight Initialization

[Zero initialization]

  • W=0이 되면 뉴런이 모두 같은 연산을 수행하게 되어 출력도, gradient도 같음 (W가 동일하게 초기화되는 경우에도 유사)
  • input=x1,x2, w_i=a, b=0으로 초기화하면 output =f(a(x1+x2)) → Loss에 동일한 영향/기울기를 갖게 됨 
  • 서로 다른 뉴런이 서로 다른 것을 학습하게 해야 하는데 이를 못하게 함 

[Small random numbers]

  • W = 0.01 * np.random.randn(D,H) 
  • 가우시안 분포(mean:0, std: 1e-2)에 해당하는 랜덤 숫자들에 0.01을 곱한 아주 작은 값 
  • Vanishing gradient : 작은 네트워크엔 작동하지만 deep network에선 문제가 있음 
    • W가 작은데 W를 레이어마다 반복해서 곱하므로 output 값이 작아짐 
    • 각 레이어의 mean, std가 레이어가 많아질수록 0에 수렴하게 됨 
    • backprop을 하게 되어도, df/dw=x, input으로 들어온 x들은 이미 이전 w에 의해 작은 상태이므로 gradient도 작아져서 0에 수렴하게 됨 

[Big random numbers]

  • W = 1.0 * np.random.randn(fan_in,fan_out) 
  • Saturating : 모든 뉴런들이 -1 혹은 1로 몰리게 되며(활성함수로 tahn을 쓴 예시임) gradient vanished됨 

[Xavier Initialization]

  • W = np.random.randn(fan_in, fan_out) / np.sqrt(fan_in) 
  • randn(m,n) → m*n의 행렬에 가우시안 분포 랜덤 값을 배정 
  • W가중치를 가우시안 분포로 맞춘 다음, 입력 값의 개수의 제곱근으로 나누는 것 → 입출력의 분산을 맞춰주고자 함 

 

[Xavier Initialization for ReLU]

  • W = np.random.randn(fan_in, fan_out) / np.sqrt(fan_in/2)
  • Xavier 를 비선형 함수인 ReLU에 적용했을 때,문제가 발생함 (분포의 형태가 가우시안의 양수부분느낌만으로 살아있다가 사라짐)
  • 이에 ReLU가 양수에만 active하다는 점을 반영하여 입력값을 반으로 나눠서 적용   

 

Batch Normalization

 

  • Batch단위로 DNN에서 학습을 수행하다보면 배치마다 입력 데이터의 분포가 다르게 나타날 수 있음 (Internal Covariate Shift)
    • Internal Covariate Shift
      • 학습 과정에서 계층별로 입력 데이터 분포값이 다르게 나타나는 문제
      • feature가 각 계층에 입력되고, 계층마다 연산(ConV, FC..&활성함수)하게 되면 데이터 분포가 달라짐
      • Batch단위로 학습을 하게 되어도 이와 같이 Batch간 데이터 분포가 다르게 나타나게됨 
  • 이를 방지하기 위해, 각 미니 배치마다 정규화를 시행함 
    • 미분 가능한 식이기 때문에 Backprop 가능 

  • 현재 배치에 N개의 D차원의 데이터가 있을 때, 
  • 차원마다 mean, variance를 구한 다음 이를 활용해서 x_k를 모두 정규화하는 것

 

  • 주로 FC,Conv 레이어와 활성 함수 레이어 사이에 들어가게 됨
  • (Conv의 경우 차원마다가 아니라, 같은 Activation map의 같은 채널에 있는 요소들끼리 정규화하게 됨)
  • 이 때 정규화는 값이 mean0, std1 분포에 있게 하는 것이므로, tanh에 적용될 경우 tanh그래프의 선형 부분 (-1~1)에만 해당하게 데이터를 입력해주는 것이 되어 tanh의 문제였던 saturation이 해결됨 
  • ReLU 이전에 들어가게 되면 정규화된 값의 절반이 날라가게 되는 꼴 (ReLU는 음수를 모두 0으로 만들기 때문)
  • 이를 해결하기 위해 정규화를 조정할 수 있음. 이 때 gamma, Beta값을 조정하여 정규화 이전의 값으로 원상복구 할 수 있음  
    • 정규화 조정 
      • y = gamma * (x-mean/var) + Beta 
      • gamma : scaling 
      • Beta : shifting 
      • Gamma, Beta는 파라미터로 학습을 통해 적정 값을 찾아가게 됨 

  • Batch Norm의 장점
    • Gradient의 흐름을 개선함 
    • learning rate의 범위를 확장시킬 수 있음
    • Initialization에 대한 의존도를 낮출 수 있음 
    • regularization으로서도 역할함 
  • Test set에서의 BatchNorm은 Train set에서 구해놓은 Batchnorm (ex. running average) 을 사용 

Babysitting the Learning Process

[Step1. Preprocess the data]

  • 데이터 전처리를 수행한다 
    • zero-centered data
    • normalized data

[Step2. Choose the architecture]

  • input layer, hidden layer, output layer 등의 수를 통해 구조를 짠다
  • Loss가 적절한 지 확인한다 
    • 모델에 데이터를 넣고 Loss값을 확인한다 
    • Regularization 을 활성화 했을 때 loss에 변화가 있는지 확인한다 (sanity check)
    • 아주 작은 수의 데이터를 넣고 overfit하는 지 확인해본다 (sgd사용, regularization off). 
  • Learning rate 찾기 
    • regularization을 아주 작게 설정해보고 loss를 작게 만드는 learning rate을 찾는다 (다양한 lr수를 적용해보면서)

Hyperparameter Optimization

[Cross-validity strategy] 

먼저, 몇개의 epoch를 통해 어떤 params이 작동하는지에 대한 러프한 아이디어를 얻는다

다음으론, 더 많은 epoch를 통해 더 나은 파라미터를 찾아본다..이를 계속 반복..! 

만약 cost가 기존의 cost의 3배 이상이 나오면 잘못되고 있는 것이기 때문에 멈추면 됨 

 

예제

  • regression과 learning rate에 임의의 값을 배정한다
    • 이 때 learning rate는 gradient에 곱해지기 때문에 log scale로 사용하여 아주 작은 값으로 만든다.
  • 이 중 acc가 높게 나온 epoch의 결과값을 토대로 finer search를 다시 한다 

[Random Search vs Grid Search]

Grid Search

  • 두 파라미터를 일정한 grid 모양으로 배치하여 적절한 값을 찾는 것
  • 다양한 값을 시도하려면 차원의 저주에 갖히게 됨
  • 각 파라미터 별 3개의 값만 비교하는 것 

 

Random Search

  • 두 파라미터를 다양한 값으로 배치한 후 랜덤하게 search하는 것 
  • Grid 보다 다양한 파라미터 조합을 확인할 수 있음 (파라미터마다 마다 9개의 값)

 

 

[Monitor & Visualize]

1. Loss 

2. Accuracy

train-valid 데이터 간 accuracy 모니터링을 통해 과적합과 과소적합을 판단해서 하이퍼 파라미터를 조율

3. Ratio of Weight updates 

  • param scale = 기존 W 가중치 값 
  • update scale = 기존 W 가중치를 미분한 값 * 학습률 
  • 두 값의 비율은 0.001 사이인 것이 가장 좋음 
  • *ravel : 1차원 변환