개발자로 후회없는 삶 살기

[22.04.27] 딥러닝 PART.CS231n 6강 본문

[AI]/[네이버 BoostCamp | 학습기록]

[22.04.27] 딥러닝 PART.CS231n 6강

몽이장쥰 2022. 12. 27. 18:06

서론

※ 이 포스트는 다음 강의의 학습이 목적임을 밝힙니다.
http://cs231n.stanford.edu/

 

Stanford University CS231n: Deep Learning for Computer Vision

Course Description Computer Vision has become ubiquitous in our society, with applications in search, image understanding, apps, mapping, medicine, drones, and self-driving cars. Core to many of these applications are visual recognition tasks such as image

cs231n.stanford.edu

 

본론

Training Neural Network

이 파트의 목적은 활성화 함수 개념 정리가 아닌 전처리 및 가중치 초기화 시 문제점 정리입니다. 모두 학습과정에서 포화나 경사 소실이 일어나는 것을 막아주어 효과적인 학습을 보장합니다.

 

 

- 활성화 함수 정리

 

1. sigmoid

1) Z centered 하지 않은 문제

로컬 gradient가 양수이면 글로벌 gradient에 좌지우지된다?

 

Q : 아니 sigmoid는 항상 양의 기울기 아닌가요?
A : 그래프 모양으로 보면 안 되는 부분입니다.

 

Q : 왜 그런가요? 퍼셉트론이랑 Saturated는 모양으로 보잖아요?
A : sigmoid는 입력 x를 직접 다룹니다.

 

2) Saturated

경사 소실과 동일한 개념, 그냥 에서 WX+b가 너무 BIG or SMALL 하면 기울기가 ZERO가 됩니다.


2. 렐루
1) 극복한 내용

역시 f(wx+b)가 들어올 것이고 인자가 양수이면 포화가 일어나지 않습니다.

 

2) 극복하지 못한 내용

① Z centered, 인자가 0보다 작으면 기울기가 0

 

② 함수 그래프 모양상 절반이 0이라서 절반이 죽는 현상 발생

 

-> dead relu : 그라디언트의 절반을 죽입니다.

문제점 : 평면의 절반이 업뎃도 안되고 활성화도 안됩니다.

 

발생 원인 : ① 가중치 초기화를 멀리해서 wx+b가 커서 렐루가 data에서 멀리 생긴 경우, ② lr를 너무 크게 해서 가중치가 날뛴 경우

 

 

- 데이터 전처리

1) z centered : 데이터도 0 중심이 좋습니다. mean 만큼 이동 -> zero centered가 됩니다.

 

2) 표준편차로 스케일링
데이터와 activation function의 zero centered 차이

 

1. 활성함수 : x축 위, 아래 = 음의 값인가 양의 값인가를 나타냅니다.
2. 데이터 : 정규화


3) normalization

 

 

- W 초기화

중요성 : 가중치가 0이면 어떨까요?
-> 모든 뉴런이 다 같은 연산을 합니다. : 출력, 기울기가 똑같아서 가중치 업데이트가 똑같고 모든 뉴런이 똑같은 모양으로 생깁니다.

 

=> 방법 1

초기 W를 엄청 작은 애로 주기!

 

-> 문제점 : W가 너무 작아서 f(wx+b)도 작고 역전파를 구할 때 로컬 gradient를 구할 텐데 로컬도 작아서 업데이트가 잘 안 일어납니다. ∴ 편차가 없어서 다 평균(tanh의 경우 0)으로 모입니다.

 

 

=> 방법2

초기 W를 엄청 큰 애로 주기!

문제점

 

1) wx+b가 크니 tanh의 출력값이 항상 -1 or +1 일 겁니다.
2) 기울기는 0으로 포화가 됩니다. (wx+b가 크거나 작을 때의 sigmoid와 같은 원인)

※ 가중치가 너무 작으면 사라져 버리고 너무 크면 포화됩니다.

 

 

- 최고의 방식

Xavier : 입력의 수로 스케일링

1) 입력의 수가 작으면 작은 수로 나누는 거니 더 큰 값을 얻습니다.
2) 반대는 작은 값을 얻습니다.

 

 

★고찰★

우리는 입력의 수가 적으면 큰 가중치를 원합니다. -> 작은 입력의 수가 가중치와 곱해지기 때문에 가중치가 커야 출력이 분산만큼 큰 값을 얻습니다., 반대로 입력의 수가 많으면 더 작은 가중치를 원합니다.

 

3) 렐루 + Xavier : 절반이 죽는 현상 때문에 2를 더 나눠줍니다.

 

 

- Batch Normalization

개념 : layer의 출력이 가우시안 정규분포를 따르기를 바랍니다. 따라서 layer의 출력에 Norm 함수를 구현하자는 의도입니다.

 

> batch 단위로 들어오는 모든 값을 이용하여 평균과 분산을 구함 구한 평균과 분산으로 norm을 합니다. (CNN이라면 activation map 당 평균과 분산을 구합니다.)

+ ★ normalization이 하는 일 : 입력이 tanh의 linear 한 영역에만 존재하도록 강제하는 것 > saturation이 전혀 일어나지 않습니다.

 

 

- 하이퍼 파라미터 조절

=> sanity check

1. 데이터 전처리로 z centered를 만듭니다.
2. 네트워크를 초기화하고 forward pass를 해서 loss가 그럴듯해야 합니다. ex) cross entropy의 sanity check로 loss가 대강 어떻게 분포해야 하는지를 알고 있으니 비교해 봅니다.

3. 정규화를 추가해 보고 loss가 증가 하나를 체크합니다. (모델을 train에서 멀어지게 하는 것이기 때문입니다.)
4. 데이터의 일부만 학습시켜봅니다. -> 데이터가 적으면 당연히 overfit 됩니다.


=> 학습 시작

전체 데이터 셋으로 하고 lr을 찾습니다. (lr을 찾는 게 1순위입니다.)


1. loss가 줄지 않으면 lr이 지나치게 작은 것입니다.
2. lr을 크게 해 보고 발산하면 NAN이 나옵니다.
3. 점점 줄여가며(e.g. 3e-3 > 1e-3 > 1e-5) cross validation 합니다.


=> 하이퍼 파라미터 조정

cross validation이 우선입니다. -> cost가 커지면 잘 못하고 있는 것이니 다른 하이퍼 파라미터를 선택해야 하니다.

 

-> 찾을 때 주의점

1) 내가 최적의 값이라고 생각한 값이 범위의 중앙에 위치하도록 해야 합니다 i.e. 내가 찾은 게 local minima일 수도 있다는 얘기!


2) cross validation으로 먼저 중앙이라고 생각되는 점을 찾고 그걸 중앙에 위치시켜 그리디 or 랜덤 서치를 합니다.

 

 

- 그래프 모니터링

 

 

1. loss가 발산하면 lr이 높은 것
2. 평평하면 낮은 것
3. 잘 내려가다가 멈추면 여전히 높아서 날라간 것
4. loss가 안 되다가 갑자기 뚝 떨어지면 W 초기화가 잘 안 되다가 학습이 되면서 회복된 것입니다.

 

 

트레인과 테스트의 차이가 크면 과대적합이다 + 최적은 지속적인 감소

Comments