인공신경망을 학습시키는 방법에 대해 알아보자
목차
Activation Functions
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함수의 모든 장점 취합
- 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
= 가중치를 동일하게 초기화시키면 발생하는 일!
가중치 초기화 방법 1. Small random numbers
- 임의의 아주 작은 값을 초깃값으로 설정 - 초기 W를 표준정규분포(standard gaussian) 에서 샘플링
- 작은 네트워크에서 효용 有, 네트워크가 깊어지면 문제 발생 가능성 高
- 각 레이어 출력의 평균, 표준편차 그래프(상단)를 보면 모두 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이 뜨는 지를 보고 판단)
- 대략적으로 찾은 범위를 보다 세밀하게 쪼개어 학습시키고 최적 파라미터값을 찾음
방법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을 의미함
'Computer Technology 기록부 > 인공지능 학습 기록부' 카테고리의 다른 글
딥러닝 레이어 이해하기 linear, Convolution (0) | 2022.02.08 |
---|---|
Deep network 종류 (0) | 2022.02.08 |
CS231n Lecture 05. CNN - Convolution Neural Network (0) | 2022.02.06 |
CS231n Lecture 04. Introduction to Neural Networks (0) | 2022.01.28 |
신경망(Neural Network)이란? (0) | 2022.01.25 |
댓글