Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

study

CS231 6강 training neural networks 1 본문

CS231n

CS231 6강 training neural networks 1

채승완 2020. 12. 3. 04:17

 

sigmoid함수는 0과 1 사이로 변환해주어 많이 사용된 활성화 함수입니다

하지만 역전파 과정에서 기울기가 없어지는(기울기 : 0) 문제가 발생합니다

이를 vanishing gradient라고 부릅니다

 

구체적으로 sigmoid 함수를 사용하였을 때 vanishing gradient 문제가 발생하는지 알아보겠습니다

X의 값이 10인 경우 시그모이드 함수에 넣어주면 1 / (1+e-10) = 0.999의 값이 나오고

이를 역전파 시키기 위해 시그모이드 함수 미분값인 (1-∂(x))(x) 수식에 0.999를 넣어주면 됩니다

(1-0.999)(0.999) = 0.0000999가 나오는 것을 확인할 수 있습니다

 

X의 값이 -10인 경우 시그모이드 함수에 넣어주면  1 / (1+e10) = 0.0000453값이 나오고

이를 역전파 시키기 위해 시그모이드 함수 미분값인 (1-∂(x))(x) 수식에 0.0000453을 넣어주면 됩니다

(1-0.0000453)(0.0000453) = 0.00004529794가 나오는 것을 확인할 수 있습니다

 

X의 값이 0인 경우 시그모이드 함수에 넣어주면  1 / 1 / (1+e0) = 0.5값이 나오며

이를 역전파 시키기 위해 시그모이드 함수 미분값인 (1-∂(x))(x) 수식에 0.5를 넣어주면 됩니다

(1-0.5)(0.5) = 0.25가 나오는 것을 확인할 수 있습니다

 

즉 파랑색 부분에 해당하는 경우에는 역전파가 제대로 전달되지만 빨강색 부분에 해당하는 경우에는

gradient vanishing 문제가 발생하는 것을 확인할 수 있습니다

 

sigmoid함수에 2번째 문제는 함수값 중심이 0이 아닙니다

이것이 왜 문제가 되는지 구체적으로 설명하겠습니다

 

sigmoid함수를 통과하면 x의 값은 모두 양수가 됩니다

파랑색 네모박스 식에서 xi는 항상 양수의 값을 가지게 되며 이 함수를 w에 대해서 미분을 하게되면 df/dwi = xi가 나옵니다

dL/dwi을 편미분 형태로 다시 분해를 하게 되면 dL/df * df/dwi가 나옵니다 여기서 df/dwi는 xi로 항상 양수입니다

그렇다면 dL/dwi와 dL/df는 항상 동일한 기호를 가져야 합니다

왜냐하면 dL/df가 음수면 dL/df(음수) * xi(양수)로 dL/dwi도 음수가 나오게 됩니다

w0과 w1이 항상 같은 부호일 때만 역전파가 진행되기 때문에 초록색에 해당하는 경우만 역전파가 일어납니다

이상적인 경우 파랑색 화살표처럼 이동해야하는데 모두 양수 또는 음수일때만 역전파가 진행되어 지그재그 형태인 것을 

알 수 있습니다 그렇기 때문에 매우 느리게 역전파가 계산됩니다

 

sigmoid함수의 3번째 단점은 exp함수의 경우 연산량이 매우 많습니다

 

다음으로 소개할 활성화 함수는 tanh입니다

tanh의 경우 -1에서 1사이로 변환하며 함수의 중심값이 0입니다

하지만 sigmoid함수처럼 x의 값이 매우 작거나 크면 gradient vanishing문제가 발생할 수 있습니다

 

다음으로 소개할 활성함 함수는 대중적으로 많이 사용하는 relu입니다

relu 함수의 특징

  • x>0 이면 기울기가 1인 직선이고(양수의 경우 값이 그대로 전달되어 자기 자신을 미분하기 때문에 1), x<0이면 함수값이 0이된다
  • sigmoid, tanh 함수와 비교시 학습이 훨씬 빨라진다
  • 연산 비용이 크지않고, 구현이 매우 간단하다
  • 함수의 중심값이 0이 아니다
  • x<0인 값들에 대해서는 기울기가 0이기 때문에 뉴런이 죽을 수 있는 단점이 존재한다

gradient는 local gradient와 global gradient로 계산이 됩니다

위의 경우 x가 음수가 나오게 되면 aL/a∂ = 0으로 기울기가 0으로 나옵니다

 

다음으로 소개할 활성화 함수는 Leaky Relu입니다

relu함수는 x가 음수의 경우 문제가 생길 수 있어 최솟값을 0.01로 설정하였습니다

PRelu의 경우 max(∂x, x)로 ∂값을 학습을 통해 설정하는 것을 의미합니다

 

다음으로 소개할 활성화 함수는 ELU입니다

ELU 의 특징은 다음과 같습니다

  • ReLU의 모든 장점을 포함한다.
  • “Dying ReLU” 문제를 해결했다.
  • 출력값이 거의 zero-centered에 가깝다
  • 일반적인 ReLU와 달리 exp함수를 계산하는 비용이 발생한다.(exp 함수 자제가 연산량이 많다)

드디어 마지막으로 소개할 활성화 함수는 Maxout입니다

이 함수는 ReLU가 가지는 모든 장점을 가졌으며, dying ReLU문제 또한 해결합니다

max(w1 . w2)가 있는데 일반적으로 하나의 뉴런은 하나의 w만 가지기 때문에 Maxout의 경우 연산량이 많습니다

 

지금까지 소개한 활성화 함수를 정리하겠습니다

1. 일반적으로 relu를 사용합니다

2. 실험이 필요한 경우 Leaky relu / Maxout / ELU 사용합니다

3. tanh의 경우 큰 성능이 나오지 않습니다

4. sigmoid의 경우 현재는 거의 사용하지 않습니다

 

다음으로는 데이터 전처리와 관련된 내용을 소개하겠습니다

 

zero-center는 각각에 대해서 전체의 평균값으로 빼주는 것으로 계산된다

정규화 작업은 표준편차로 나누어 특정 범위(-1,1)에 값이 들어가게 해준다

이미지의 경우 zero-center는 일반적으로 하지만 normalized는 하지 않는다

왜냐하면 normalized 자체가 특정 범위에 값이 들어가게 하는데 이미지의 경우 이미 0~255 사이의 값을 가지기 때문입니다

 

 

 

이미지의 경우 PCA(차원축소)와 Whitening(이미지의 중복성을 줄여주는 역할)을 일반적으로 해주지 않는다

 

즉 이미지의 대해서는 zero centered만 해주면 된다

 

zero centered의 구체적인 방법에 대해 소개하겠습니다

CIFAR-10의 경우 32*32*3의 image를 가진다

AlexNet에서는 32*32*3 image의 평균값을 빼주는 방법을 사용하였다

VGGNet의 경우는 3가지 channel의 평균값을 각각 빼주는 방식을 사용하였다

 

두 번째 방법이 더 편리하다 왜냐하면 3개의 값에 대해서만 빼주면 되기 때문이다

 

 

다음은 가중치 초기화에 대해서 설명하겠습니다

만약 모든 layer의 w값이 0이면 전부 같은 연산을 하기 때문에 의미가 없다

그래서 작은 값의 난수(랜덤 번호)를 생성하여 가중치를 초기화하게 됩니다

하지만 네트워크가 작은 경우는 문제가 없지만 큰 경우는 문제가 발생할 수 있다

 

다음은 tanh를 사용한 초기화 모습으로 mean값은 당연히 0이며 표준편차의 경우 0으로 급격하게 수렴하는 것을 알 수 있다

활성화 함수가 0이 되어버리고 역전파가 제대로 일어나지 않음을 알 수 있다

 

 

이번에는 W가 0.01이 아닌 1을 주게 되면 -1과 1로 변하게 되어 gradient도 그 값이 0이 되어버린다

input 개수가 많으면 W가 작아지며 inputdml 개수가 적으면 W가 커지는 초기화 방식이다

매우 합리적인 방식인것을 알 수 있다

tanh의 대해서는 W가 합리적으로 초기화 되었지만 Relu에서 문제가 발생하였다

 

위의 문제를 해결하기 위해 카이밍 해가 발표한 초기화 방법으로 기존 방법에서 /2를 추가하여 

Relu에 맞는 W 초기화 방법이다

지금까지 vanishing gradient 문제를 해결하기 위해 활성화 함수와 W 초기화 방법에 대해서 알아보았습니다

하지만 이런 방법들은 근본적으로 해결하지 못하기 때문에 2015년에 Batch Normalization이 등장하게 됩니다

Batch Normalization의 가정은 레이어가 통과됨에 따라 분포가 달라진다고 생각하여 분포를 정규화 해주는 것을 말합니다

 

N은 데이터 수 D는 feature 수로 미니배치를 뽑아서 평균과 분산을 계산하여 정규화를 해준다

 

Batch Normalization은 Fully connected와 활성화 함수 사이에 들어가는 것이 일반적이다

 

Batch Normalization의 경우 감마와 베타를 통해 정규화 값을 조정해줄 수 있다

장점

  - learning rate가 다소 크더라도 그것을 허용해주어 보다 빠른 학습이 가능하다

  - 초기화 함수에 너무 의존하지 않아도 된다

  - Batch Normalization을 하는 경우 dropout을 하지 않는 경향이 있다 

 

Batch Normalization은 주의할 점이 있습니다

바로 train, test시 적용되는 기준이 다릅니다

train인의 경우 Batch를 기준으로 정규화하며 test를 하는 경우는 전체를 기준으로 정규화가 진행된다

그래서 학습을 할 때 미리 평균과 분산을 계산해야 한다