728x90
Overview the Training
One time Setup
- Activation functions
- Preprocessing
- Weight initialization
- Regularization
- Gradient Checking
Training Dynamics
- Babysitting the learning process
- Parameter updates
- Hyperparameter optimization
Evaluation
- model ensembles
Activation Functions
역할
노드에서 합쳐진 wx+b의 sum에 대해 f(sum)하는 것
종류
[sigmoid]
- sig(x) = 1 / (1+exp(-x))
- 입력 값들을 0~1 사이로 산출
- 문제점
- Vanishing gradient
- Active region of sigmoid(x=0 주변, 값이 0,1이 아닌 지점)에서만 sigmoid가 제대로 활동함
- 값이 1,0이 되는 부분은 Flat하기 때문에 x의 값이 너무 크거나 작을 경우 local gradient가 0이 됨
- sigmoid gate의 global gradient는 dL/dsig, local gradient는 dsig/dx
- 시그모이드 함수 그래프에서 시그모이드를 x에 대해 미분하면(기울기), 1과 0에 해당하는 flat지역의 기울기는 0에 가까워짐
- 이에 backpropagation을 할 때 x의 값에 따라 backprop이 중지될 수 있음
- Not zero centered
- x가 모두 양수라고 가정해보면, backprop시 w가 모두 같은 방향으로 움직여서 최적의 w를 찾는 것이 어려워짐
- f = ∑wx+b일때, df/dw=x이다.
- dLoss/dw = dLoss/df * df/dw = dLoss/df*x가 됨 → 모든 w에 대한 gradient가 같은 부호가 됨
- 지그재그 형식의 gradient update가 되어 효율적이지 않음
- x가 모두 양수라고 가정해보면, backprop시 w가 모두 같은 방향으로 움직여서 최적의 w를 찾는 것이 어려워짐
- exp 계산이 비효율적이다(별로 안 중요한 단점)
- Vanishing gradient
[tahn]
- 모든 input을 -1~1사이의 출력으로 전환시킴
- zero centered되어 sigmoid의 단점을 극복
- 시그모이드에 비해 0(원점)에 대칭되어 상대적으로 0 부근에 데이터가 더 많이 분포됨
- 하지만 여전히 gradient가 사라지는 문제점이 있음
[ReLU]
- f(x) = max(0,x)
- 양수 영역에서는 satured되지 않음
- 계산 효율적
- 시그모이드, 탄보다 더 converge됨(모인다?)
- 문제점
- zero centered되지 않음
- x가 음수인 영역에선 ReLU가 작동되지 않으며, 이 경우 gradient가 죽어버림 (절반을 날리는 것)
- x가 양수일 경우 기울기는 무조건1, 음수일 경우 무조건0.
[Leaky ReLU]
- f(x) = max(0.01*x,x)
- gradient vanishing문제, dying문제가 해결됨
- PReLU
- f(x) = max(a*x,x) 파라미터로 a를 둠. backprop으로 학습하는 파라미터
[ELU]
- f(x) = x (if x>0), a * (exp(x)-1) (if x<=0)
- ReLU의 장점은 그대로 유지
- zero mean에 좀 더 가까워짐 (0 근처에 데이터가 좀 더 있음)
- 오히려 Leaky ReLU보다 에러에 강인할 것
[Maxout Neuron]
n개의 선형 함수 중 최대 결과 값을 취하는 뉴런으로 비선형(Max)임
ReLU와 Leaky ReLU를 일반화시킬 수 있음
선형 영역이 있기 때문에 vanishing gradient, dying 문제가 없음
parameter,neuron이 n개 만큼 필요함
Data Preprocessing
[Preprocess the data]
zero-centered
- X-=np.mean(X,axis=0)
- 데이터를 zero-mean, 즉 원점을 중심으로 데이터를 모이게 하는 것
- 시그모이드에서처럼 zero-mean하지 못할 경우 w에 대한 gradient가 지그재그모양으로 업데이트 되는 문제가 발생
normalize
- X /=np.std(X,axis) (after zero-mean)
- 데이터 별로 동등한 기여를 할 수 있도록 (특정 범위 안에 들어가도록)표준편차로 나누어 정규화
- 이미지는 이미 각 픽셀값이 0~255 사이에 분포하기 때문에 정규화하지 않아도 됨
PCA/Whitening
- PCA : data가 diagonal covariance 행렬일 경우
- Whitening : covariance matrix가 identity matrix일 경우
- 이미지엔 잘 수행하지 않음
Weight Initialization
[Zero initialization]
- W=0이 되면 뉴런이 모두 같은 연산을 수행하게 되어 출력도, gradient도 같음 (W가 동일하게 초기화되는 경우에도 유사)
- input=x1,x2, w_i=a, b=0으로 초기화하면 output =f(a(x1+x2)) → Loss에 동일한 영향/기울기를 갖게 됨
- 서로 다른 뉴런이 서로 다른 것을 학습하게 해야 하는데 이를 못하게 함
[Small random numbers]
- W = 0.01 * np.random.randn(D,H)
- 가우시안 분포(mean:0, std: 1e-2)에 해당하는 랜덤 숫자들에 0.01을 곱한 아주 작은 값
- Vanishing gradient : 작은 네트워크엔 작동하지만 deep network에선 문제가 있음
- W가 작은데 W를 레이어마다 반복해서 곱하므로 output 값이 작아짐
- 각 레이어의 mean, std가 레이어가 많아질수록 0에 수렴하게 됨
- backprop을 하게 되어도, df/dw=x, input으로 들어온 x들은 이미 이전 w에 의해 작은 상태이므로 gradient도 작아져서 0에 수렴하게 됨
[Big random numbers]
- W = 1.0 * np.random.randn(fan_in,fan_out)
- Saturating : 모든 뉴런들이 -1 혹은 1로 몰리게 되며(활성함수로 tahn을 쓴 예시임) gradient vanished됨
[Xavier Initialization]
- W = np.random.randn(fan_in, fan_out) / np.sqrt(fan_in)
- randn(m,n) → m*n의 행렬에 가우시안 분포 랜덤 값을 배정
- W가중치를 가우시안 분포로 맞춘 다음, 입력 값의 개수의 제곱근으로 나누는 것 → 입출력의 분산을 맞춰주고자 함
[Xavier Initialization for ReLU]
- W = np.random.randn(fan_in, fan_out) / np.sqrt(fan_in/2)
- Xavier 를 비선형 함수인 ReLU에 적용했을 때,문제가 발생함 (분포의 형태가 가우시안의 양수부분느낌만으로 살아있다가 사라짐)
- 이에 ReLU가 양수에만 active하다는 점을 반영하여 입력값을 반으로 나눠서 적용
Batch Normalization
- Batch단위로 DNN에서 학습을 수행하다보면 배치마다 입력 데이터의 분포가 다르게 나타날 수 있음 (Internal Covariate Shift)
- Internal Covariate Shift
- 학습 과정에서 계층별로 입력 데이터 분포값이 다르게 나타나는 문제
- feature가 각 계층에 입력되고, 계층마다 연산(ConV, FC..&활성함수)하게 되면 데이터 분포가 달라짐
- Batch단위로 학습을 하게 되어도 이와 같이 Batch간 데이터 분포가 다르게 나타나게됨
- Internal Covariate Shift
- 이를 방지하기 위해, 각 미니 배치마다 정규화를 시행함
- 미분 가능한 식이기 때문에 Backprop 가능
- 현재 배치에 N개의 D차원의 데이터가 있을 때,
- 차원마다 mean, variance를 구한 다음 이를 활용해서 x_k를 모두 정규화하는 것
- 주로 FC,Conv 레이어와 활성 함수 레이어 사이에 들어가게 됨
- (Conv의 경우 차원마다가 아니라, 같은 Activation map의 같은 채널에 있는 요소들끼리 정규화하게 됨)
- 이 때 정규화는 값이 mean0, std1 분포에 있게 하는 것이므로, tanh에 적용될 경우 tanh그래프의 선형 부분 (-1~1)에만 해당하게 데이터를 입력해주는 것이 되어 tanh의 문제였던 saturation이 해결됨
- ReLU 이전에 들어가게 되면 정규화된 값의 절반이 날라가게 되는 꼴 (ReLU는 음수를 모두 0으로 만들기 때문)
- 이를 해결하기 위해 정규화를 조정할 수 있음. 이 때 gamma, Beta값을 조정하여 정규화 이전의 값으로 원상복구 할 수 있음
- 정규화 조정
- y = gamma * (x-mean/var) + Beta
- gamma : scaling
- Beta : shifting
- Gamma, Beta는 파라미터로 학습을 통해 적정 값을 찾아가게 됨
- 정규화 조정
- Batch Norm의 장점
- Gradient의 흐름을 개선함
- learning rate의 범위를 확장시킬 수 있음
- Initialization에 대한 의존도를 낮출 수 있음
- regularization으로서도 역할함
- Test set에서의 BatchNorm은 Train set에서 구해놓은 Batchnorm (ex. running average) 을 사용
Babysitting the Learning Process
[Step1. Preprocess the data]
- 데이터 전처리를 수행한다
- zero-centered data
- normalized data
[Step2. Choose the architecture]
- input layer, hidden layer, output layer 등의 수를 통해 구조를 짠다
- Loss가 적절한 지 확인한다
- 모델에 데이터를 넣고 Loss값을 확인한다
- Regularization 을 활성화 했을 때 loss에 변화가 있는지 확인한다 (sanity check)
- 아주 작은 수의 데이터를 넣고 overfit하는 지 확인해본다 (sgd사용, regularization off).
- Learning rate 찾기
- regularization을 아주 작게 설정해보고 loss를 작게 만드는 learning rate을 찾는다 (다양한 lr수를 적용해보면서)
Hyperparameter Optimization
[Cross-validity strategy]
먼저, 몇개의 epoch를 통해 어떤 params이 작동하는지에 대한 러프한 아이디어를 얻는다
다음으론, 더 많은 epoch를 통해 더 나은 파라미터를 찾아본다..이를 계속 반복..!
만약 cost가 기존의 cost의 3배 이상이 나오면 잘못되고 있는 것이기 때문에 멈추면 됨
예제
- regression과 learning rate에 임의의 값을 배정한다
- 이 때 learning rate는 gradient에 곱해지기 때문에 log scale로 사용하여 아주 작은 값으로 만든다.
- 이 중 acc가 높게 나온 epoch의 결과값을 토대로 finer search를 다시 한다
[Random Search vs Grid Search]
Grid Search
- 두 파라미터를 일정한 grid 모양으로 배치하여 적절한 값을 찾는 것
- 다양한 값을 시도하려면 차원의 저주에 갖히게 됨
- 각 파라미터 별 3개의 값만 비교하는 것
Random Search
- 두 파라미터를 다양한 값으로 배치한 후 랜덤하게 search하는 것
- Grid 보다 다양한 파라미터 조합을 확인할 수 있음 (파라미터마다 마다 9개의 값)
[Monitor & Visualize]
1. Loss
2. Accuracy
train-valid 데이터 간 accuracy 모니터링을 통해 과적합과 과소적합을 판단해서 하이퍼 파라미터를 조율
3. Ratio of Weight updates
- param scale = 기존 W 가중치 값
- update scale = 기존 W 가중치를 미분한 값 * 학습률
- 두 값의 비율은 0.001 사이인 것이 가장 좋음
- *ravel : 1차원 변환
'👩💻LEARN : ML&Data > Lecture' 카테고리의 다른 글
[CS231n] Lecture8. Deep Learning SW - Pytorch (1) | 2023.05.16 |
---|---|
[CS231n] Lecture6. Training Neural Networks 2 (0) | 2023.05.15 |
[CS231n] Lecture5. Convolutional Neural Networks (0) | 2023.05.14 |
[CS231n] Lecture4. Backpropagation and Neural Networks (0) | 2023.05.11 |
[CS231n] Lecture3. Loss Functions and Optimization (1) | 2023.05.10 |