Lec6) Training Neural Network

0

FC, CNN등의 연산 알고리즘

1) 데이터가 들어오면 각 가중치와 곱함 + bia term
2) 계산한 값 활성화 함수 연산을 거침

활성화 함수
sigmoid (만만한 뇨속)
입력을 받아서 입력을 [0, 1] 사이 값으로 변환
뉴런의 발화 빈도를 0에서 1사이로 변환한다고 생각 (1이면 최대 빈도로 발화, 0이면 아예 발화 안함)

시그모이드의 문제점
1) 입력값이 너무 크거나 작으면 미분값이 0에 수렴함. (입력값 크기에 따라 문제가 발생할 가능성 높음)
2) 0mean data가 아니다. (0기준으로 대칭적이지가 않음)

  • 입력값이 모두 양수이거나 음수인 경우, 미분값이 같이 감소하거나 같이 증가함 -> 기울기를 찾기가 비효율적임
    그래디언트의 방향은 사분면 중 2방향으로 밖에 이동할 수 없음
    3) exp계산이 상대적으로 복잡할 수 있음

tanh(x)

입력을 받아서 [-1. 1] 사이 값으로 변환
1) 여전히 입력값에 따라 미분값이 사라짐
2) 0 중심인점은 좋다.

Re?LU
f(x) = max(0,x)
입력값이 음수면 0 양수면 값을 그대로 출력
미분값이 포화되지 않음 (양수일 때는 선형)
선형이기 때문에 계산도 빠름
뉴런의 생물학적 타당도가 ReLU에 더 가까움

Imagenet 2012년 우승자인 AlexNet가 사용

그러나 ReLU는 더이상 zero-centered가 아님
양의 경우 포화가 일어나지 않지만, 음의경우에는 여전히 가능
Dead ReLU
DATA CLOUD(training data 모음)에서 벗어나는 경우 dead ReLU가 되어버림(역전파 미발생)
학습이 지속되다보면 가중치를 업데이트하는 도중 dead ReLU가 되는 경우가 있음

positive bias 를 추가 (절대값? 등) : 효과는 있는지 없는지 모름

'' 실험단계인 활성 함수''
Leaky ReLU
f(x) = max(0.01x, x)

Parametric Rectifier (PReLU)
f(x) = max(ax, x)

ELU
f(x) = x if x>0
a(exp(x)-1) if x<=0
장점을 모아서 만든 느낌.

Maxout "Neuron"
지금까지의 활성함수와는 달리 입력에 대한 기본형식이 없슴
max(w_1x+b_1, w_2x+b_2)
2개의 선형함수가 합쳐져있음 (대신 파라미터가 2배)

일반적으로 일반 ReLU를 많이 사용
대신 Learning Rate를 잘 조절해야함

데이터 전처리(Preprocess the data)

Zero-Centering
입력이 전부 양수인 경우 Gradient도 전부 양수 (문제가 되기 때문)

Normalization
모든 차원의 범위를 지정해 동등한 기여를 하도록 전체 데이터의 평균을 빼줌
(Scale로 인해 특정 Feature만 과하게 영향을 주지 않도록함)

ex) 이미지의 경우
Zero-Centering만 함(어차피 모든 픽셀의 범위는 0~255이기 때문에)

PCA, whitening등 복잡한 전처리 방법도 있지만 이미지는 잘 안씀

Normalization을 통해 Zero-mean을 해준다고해도
일시적으로 sigmoid와 같은 Non-zero-centered 활성함수의 문제를
해결할 수 있지만, 모델이 deep해진다면 이후 연산값은 조정이 어렵기때문에
지속적인 해결은 어렵다고 볼 수 있다.

Weight Initialization(가중치 초기화)

hidden layer의 초기가중치 -> 이후 Back prob에 의해 수정된다.

만약 초기 가중치가 다 0이라면?
모든 뉴런(노드)들은 다 같은 연산을 수행하며, 출력도 다 같고 기울기도 같다.
-> Symmtry breaking

따라서 임의의 작은 값으로 초기화함

W = 0.01*np.random.randn(D,H)

정규분포를 따르는 값을 따라 난수를 넣음 (평균 = 0, 편차 0.01)
(작은 모델에서 효과적, 큰 모델에서는 가중치가 여러번 곱해지므로 결국 0에 수렴 : Bad :()

  • Back prop에서도 마찬가지로 가중치가 점점 줄어드므로 기울기가 소실 가능성이 있다.
    반대로 가중치가 너무 큰 경우 Saturation(포화)가 일어나 가중치 업데이트가 사라질 수 있다.
    -> 적절한 초기 가중치를 구하기가 쉽지 않다.

Xavier intialization : 입 출력의 분산을 맞춰줌
입력이 많은경우 - 작은 가중치, 입력이 적은경우 - 큰 가중치
Linear activation 안에 있어야함.

  • 활성함수 tanh : 출력이 -1~1 사이의 분산을 가지도록 해서 좋음
  • 활성함수 ReLU : -1~0 사이에서 분산이 사라지므로, 가중치와 분산이 점점 사라짐

He et al.,(2015) : Xavier intialization에서 RuLU를 쓰면 노드가 반토막나므로
매 입력마다 분산의 0.5배를 추가적으로 더해줌

적절한 초기화의 방법은 아직도 계속 연구중

Batch Normalization(2015)
우리는 활성함수를 지난 값들이 Unit gaussian(정규분포)이길 원하므로
Normalization(평균을 빼고 표준편차로 나눠줌)을 통해 강제로 정규분포를 만들 수 있음

가중치 초기화 대신, 각 레이어(FC or Conv)에 Normalization을 해주는 것으로 가능하다.
-> 상수인 평균과 분산을 가지고 있으므로 정규분포로 언제나 미분가능한 함수가 만들어짐(Back prop가능!)

tahh 활성화 함수를 지날때 항상 Linear영역에 존재하도록 함 -> 포화가 일어나지 않음

But 때로는 적당히 포화가 일어나도록 조정하는것이 더 좋으므로
Scaling 연산을 추가함 = 표준편차에 해당하는 값(γ)를 곱하고 평균(β)에 해당하는 값을 더함
β와 γ의 값은 학습가능한 파라미터이기 때문에 데이터를 얼마나 saturation시킬지
학습이 가능하고, 때문에 유연성을 가질수 있다.

γx+β (감마가 scaling, 베타가 이동하도록 함)

또한 regularization의 역할도 알아서 해줄 수 있다.
각 하나의 입력들이 평균과 표준편차에 의해서 모든 입력에 연관된 값이 되기때문에
(deterministic 하지 않다)

입력데이터가 항상 정규분포를 따르진 않지만 이에대한 가정이 수반됨

초기 트레이닝
초반에 Batch의 크기를 줄여 Loss가 잘 감소하는지 일단 확인해야함

이후 전체 데이터를 통해 Regularizion을 준 후

Learning Rate를 정함(가장 중요한 하이퍼 파라미터)

너무 작으면 그래디언트 업데이트가 잘 일어나지 않아 로스가 잘 안줄어듬
너무 크면 손실함수가가 발산해 버릴 수 있음 (아마도 진동하는 형태로?)

Hyper Parameter 정하기

*learning rate의 경우 log scale을 사용하는 것이 좋다 10^0 ~ 10^-6 정도
하이퍼 파라미터를 최적화해서 가장 좋은것을 선택하려면
Cross-validation 전략을 사용 (training으로 훈련, Validation으로 검증)

  1. Coarse stage : 넓은 범위에서 값을 골라 적은 Epoch에서 하이퍼 파라미터가 잘동작하는지 확인 가능
  2. Fine stage : 더 좁은 범위에서 많은 Epoch를 수행, 손실함수가 빠르게 오른다면 다른 하이퍼 파라미터 사용

최적 Learning Rate가 중간에 오도록 범위를 정해주는게 좋음

Grid Search vs Random Search

많은 경우 Random Search를 쓰는 것이 다양한 값을 샘플링할 수 있으므로
적절한 하이퍼파라미터를 찾는데 도움을 줄 수 있음

결론 : R아서 적절한 값을 찾아라
epoch에 따른 손실함수 그래프를 그려서 시각화 하는것이 도움이 된다.

loss가 갑자기 급격하게 내려가는 경우 (가중치 초기화의 문제 가능성 높음)
Train_acc와 Validation_acc가 차이가 큰 경우 overfit가능성이 높음

가중치 / 가중치에 따른 변화 비율을 지켜봐야함 : 0.001~0.01가 적당(때에따라 다름)

파라미터의 절대값을 통해 변화 비율을 예측 가능

0개의 댓글