이번 시간에는 Neural Network를 훈련시키기 위한 다양한 요령을 배워보도록 하겠다.
일단 세 가지 설정이 필요하다.
1. 초기 설정
- 활성화 함수의 종류
- 데이터의 전처리
- 가중치의 초기화
- 정규화
2. train단계에서 동적으로 조절하는 것
- learning rate 조절
- Large-Batch 학습
-> mini-batch랑 다른 점은 large batch
- 하이퍼 파라미터 조절
3. 추가적인 작업
- 모델 앙상블
- 전이학습
Activation Functions
하나의 뉴런을 확대해서 보여준 그래프
input x와 weights w를 dot product하여 activation func의 input으로 들어가고 1개의 output이 나오는데 이것은 다음 레이어의 input값이 되게 된다.
Activation Function의 종류
1. Sigmoid
가장 고전적인 activation function이고, 그래프가 S자를 그려서 Sigmoid이다!
- 0에서 1사이의 범위로 압축시킨다.
- 'firing rate'은 뉴런 신호의 강도를 나타내는데, 0이 최소이고 1이 최대 활성화로 확률적으로 해석할 수 있게 한다. 따라서 옛날에는 인기가 많았다고 한다.
하지만 이제는 쓰이지 않는 3가지 이유가 존재하는데...
문제 1. Saturated neurons "kill" the gradients
saturation의 뜻은 weight의 업데이트가 멈추는 현상. 접선의 기울기가 0이면 업데이트가 멈춤.
뒤쪽의 Layer이 Saturation이 되면 앞의 모든 Layer도 Saturation이 되어 w의 업데이트가 중지된다.
sigmoid function의 모양은 양 끝이 평면인 형태를 띄고 있다.
기울기가 0인 부분이 포화 상태를 가지는데, 이는 기울기가 죽게하여 역전파 단계에서 학습이 더디게 되도록 한다.
역전파 과정에서 downstream gradient가 0이 되는 문제
만약 x가 매우 작은 값이거나 매우 큰 값일때 sigmoid function이 어떻게 동작하는가?
backprop과정에서 local gradient(sigmoid gate안에 있는 식)은 0에 가깝게 수렴하고, upstream gradient가 무엇이 되든 간에 downstream gradient는 chain rule을 통해 0으로 수렴할 것! 이는 매우 작은 값만큼 update됨을 의미하게 된다.
초반에 이렇게 수렴하면 레이어가 깊어질수록 학습이 진행되지 않은 죽은 레이어들이 생기겠지?
이를 기울기 소실이라고 칭한다!
문제 2. Sigmoid outputs are not zero-centered
시그모이드 함수는 input에 상관없이 값이 모두 양수인 output을 내는데, 이전 레이어에서도 시그모이드를 썼다면? input Xi의 값은 양수겠지? 이때 Wi의 gradient는?
sigmoid의 output(0~1)및 sigmoid의 편미분(기울기, 0~0.025, Local Gradient)가 모두 양수이므로 w의 업데이트량의 부호가 통일된다.
-> x가 항상 양수이기 때문에(시그모이드 함수에서 양수는 모두 positive한 값) w에 대한 local gradient는 항상 positive한 값이 된다. 하지만, chain rule에 의해서 곱해질 upstream gradient는 positive나 negative값 둘 중 하나이다. 이는 항상 downstream gradient가 upstream gradient와 같은 부호를 가지게 된다는 뜻이다. 이렇게 되면 아래 그림처럼 항상 같은 부호를 갖고 업데이트를 하기 때문에 지그재그현상이 일어나 학습이 느려진다!
2개의 w를 가지고 있다고 가정
위 그림은 w_1, w_2 두개의 weight만 시각화한 것이나, 여러 차원으로 확장한다면 이러한 노이즈는 더욱 증가한다고 한다.
그래도 이 문제는 데이터 1개만 진행하기보다는 minibatch를 사용한다면 각 데이터 예제의 기울기를 평균하여 계산하게 되는데, 평균화하면 이러한 현상이 상쇄될 수 있다고 한다. 어떤 데이터에서는 양수가 많지만 다른 데이터에서는 음수가 ㅁ낳아서 부호가 번갈아가는 문제가 완화될 수 있다. (모르겠어..질문하자..그래도 결국 다 양수 되는거 아님..?)
문제 3. exp() is a bit compute expensive
exponential 연산이 1번 할 때 많은 클락사이클이 필요하나, 한 사이클 만에 연산이 수행되는 ReLU에 비하면 연산량이 ㅁ낳은 것을 알 수 있다.
GPU를 사용할 때에는 메모리들 사이 데이터 이동이 대부분의 시간이어서 상관없지만 이외의 상황에서는 매우 나쁘다!
다음은 새로운 Activation function이다.
2. Tanh
이건 Sigmoid를 rescale한 함수인데, zero-centered하지 않다는 문제를 해결하였다. -> 지그재그 문제 해결
하지만 여전히 기울기가 0인 부분이 많, 연산량이 많다는 시그모이드의 단점을 그대로 가지고 있다.
다음은... 가장 심플하고 non-linear하고 빠른 activation이 나타난다!!
3. ReLU
이는 가장 빠르고 심플한 activation function이다.
input이 양수여도 위에 sigmoid에서 발생했던 satuation(기울기 0으로 소실)문제도 해결하였다. 왜냐 양수로 가면 0인 부분이 없기 때문에! 그래도 음수로 가면 나타날 수 있나보다..(여기 알아보기)
그리고 sign bit만 체크하면 되어서 빠르게 수행된다. -> AlexNet에서 사용시 sigmoid보다 6배 빠르게 학습이 완료된다고 한다.
하지만.. zero-centered는 아니다. 그래서 여전히 output이 positive한 값만을 가져 지그재그 현상이 발생한다고 한다. 근데 근본적으로 속도가 빨라서 덜 신경쓸 수 있는 문제라고 한다.
그렇다면 만약 input x가 0보다 작으면? local gradient(기울기)가 정확히 0이 되어 downstream gradient가 0이 되고, 이는 아예 업데이트가 멈추게 된다.
이는 때로 sigmoid보다 나쁜 결과를 만들어내는데, sigmoid는 0에 수렴한 수이기 때문!(0은 아니다)
dead ReLU
이거 해석 제대로 하기..
이렇게 gradient가 0이 되어버린 ReLU를 dead ReLU라고 부르는데, dead ReLU는 함수가 반응하지 않고 죽어버리는 부분이다. 이 데이터 클라우드에서 ReLU를 적용할 시 절반만 active되는 것을 알 수 있다.
언제 활성화되지 않을까?
1. 초기화를 잘못한 경우
-> 가중치 평면이 데이터 클라우드에서 멀리 떨어져 있을 때, 어떤 입력 데이터에서도 active 되는 경우가 존재하지 않다.
2. learning rate가 높은 경우
-> weight update가 지나치게 커지면 가중치가 날뛰게 되어 데이터의 manifold를 벗어나서 처음에 학습이 잘되더라도 갑자기 죽어버리는 경우 발생한다. (여기 더 자세히 하자)
그래서!! 이 문제를 해결하기 위해 아주 작은 양의 bias를 더해 초기화하기도 한다. -> ReLU의 입력이 항상 양수가 되도록
근데 여기에서...bias를 activation func 이후에 넣어야 하나..?왜냐면 0이 된 값에 더해줘야 하지 않을까..?
4. Leaky ReLU
ReLU의 문제를 해결하고자 하는 새로운 버전!!
1. zero-centered문제 해결
2. zero gradient 가지는 문제 해결
=> 음수면 0 출력하는게 아니라 hyperparameter인 임의의 작은 양수를 곱해주어 gradient가 0이 되는 상황 피함!
그리고 이 하이퍼파라미터를 파라미터로 만들어 이것도 학습시키는 PReLU라는 Activation도 있다.
또 ReLU계열의 모든 함수는 0에서 미분 불가능이어서 임의로 0+나 0-의 기울기로 선택!
0으로 입력이 주어지는 경우는 매우 드물어서 상관이 없다고 한다.
또 머게요 여기서 발전을 또시켜요 참 쉽지 않네
5. Exponential Linear Unit(ELU)
ELU는 입력이 음수일 때 exp연산에서 1을 빼주는데, exp는 기울기가 0이 아니기 때문에 0이 되는걸 막기 위함이고, 거기에다 하이퍼파라미터를 곱해 스케일한다.
생겨난 이유는 Leaky ReLU는 엄청나게 이상한 값이 들어왔을 때 쳐낼 수 없는 단점이 있는데, 이를 극복하기 위함이라고 한다. ex) -1000이 들어와도 -10이 됨(근데 아까부터 궁금했던게 음수가 이상한 값이야..?)
ELU는 ReLU의 모든 장점을 가지고 있다. output의 평균 값이 0 주변에 위치하는 특성이 있다.
그리고 ReLU와 다르게 음의 구간에서도 부드럽게 감소하고, 작은 음수 값이 노이즈로 인해 발생할 경우 더 부드럽게 처리해서 출력에 큰 영향을 미치지 않게 한다. (이거 더 알아보기)
이렇게 장점들이 존재하지만 exp연산이 있어서 연산량이 크다는 한계가 있다.
또 다른 함수다.
6. Scaled Exponential Linear Unit (SELU)
ELU를 스케일 한 함수이다. 여기에서 alpha와 lambda는 엄청나게 긴 상수로 주어진다. fullyconnected만 쌓고 이런 상수를 사용하면 깊은 레이어에서도 자체 normalization이 되어 output이 평균 0, 표준편차 1로 유지되게 해주어 기울기소실과 폭주 문제를 막아준다고 한다. 이 숫자가 나오게 된 결과는 엄청난 수학 문제를 풀어야 한다.
but 입력 특성이 반드시 표준화(평균0, 표준편차1)이 되어 있어야 한다는 점!
그런데...지금까지 많은 함수를 봐왔으나 CIFAR10 데이터셋을 가지고 각각 다른 모델에서 각 activation function을 사용해 정확도를 확인해 본 결과,, 그냥 다 큰 차이 없으니 일단 ReLU 기본으로 사용하고 선택에 스트레스를 받지 말어라..
지금까지 summary!
1. 특별한 이유 없으면 ReLU써라
2. 0.1%의 정확도라도 올리고 싶다면 다른 것들 써봐라.
3. sigmoid나 tanh쓰지 마라!
'인공지능' 카테고리의 다른 글
[코스모스 8주차] Object Detection, Segmentation (0) | 2024.05.09 |
---|---|
[코스모스 7주차] Self-Supervised Learning (0) | 2024.05.07 |
[코스모스 5주차] ATTENTION ~ TRANSFORMER (0) | 2024.04.04 |
[모각코 3주차] GAN (0) | 2024.03.21 |
[코스모스 1주차] Variational Auto-Encoders (1) | 2024.03.07 |