Search

CNN-2 : Training Methodologies

카테고리
DL/ML
Index
DeepLearning
날짜
2024/11/19

3. Training Methodologies

1. Dropout

뉴런을 임의로 삭제하면서 학습하는 방법
Training 작업에서 hidden layer의 뉴런을 무작위로 골라서 삭제하는 방법
Training 작업에서는 dropout 할 뉴런을 제외하고 데이터를 전달하고, Test 작업에서는 모든 뉴런에 데이터 전달

2. Loss function

1.
MSE(Mean Squared Error) - 평균제곱 오차
2.
Cross Entropy Loss
Entropy : 확률분포의 무작위성, 불확실성을 측정하는 함수
→ 예측하기 힘들 수록 entropy 값은 커짐
Cross Entropy : 서로다른 두 확률분포의 다른 정도를 측정하는 함수
ex) 만약 일반적인 주사위 P와 찌그러진 주사위 Q(1이 1/2 확률, 나머지는 1/10의 확률)의 Cross Entropy?
3.
Focal Loss
Class 불균형이 심한 경우에 효과적인 loss
의료 영상분할을 다룬 RetinaNet 논문에서 제안 됨.

3. Normalization

Normalization이란 모든 데이터들의 스케일을 동일하게 만들어서 각 feature값들이 동등한 중요도를 갖도록하는 작업
만약에 y = Wx 라는 single layer가 있을 때, input data x의 분포가 0을 기준으로 고르게 분포하지 않을 수 있음
편향되어 있을 수도 있거나→ large bias, 너무 분포가 넓을 수도 있음
처음 원본 데이터의 분포는 고른상태였지만 여러 레이어를 통과하면서 network 내부에서 데이터 분포가 편향되게 shift 할 수 도 있음.
→ input data의 불균형에 따라서 모델 성능이 낮아질 수 있기 때문에 normalization 이 필요함
1.
Batch Normalization
각 feature 별로 정규화 하는 방법으로 한 mini-batch에 대해서 summed input의 평균과 분산을 구한 z score로 정규화를 진행하는 방법
각 layer의 activation function을 통과하기 전에 배치 차원에서 정규화 작업을 진행해서 내부 covariance를 줄이고 일반화하는 방법
보통 FC layer나 Convolution layer 뒤에 삽입하거나, activation function layer 전에 삽입됨
[문제 1] 만약에 N(0, 1)로 정규화를 하는 것이 데이터에 너무 강력한 규제를 하는 것이면?
데이터가 가지고 있는 분포의 특성을 전혀 살리지 못하는 것도 문제임!
xˉi,j \bar{x}_{i,j} ~~  N(βj,γj)~ N(\beta_{j},\gamma_{j}) 를 따를 수 있도록 Learnable scale과 shift parameter γ(= 기존 데이터의 표준편차 σ\sigma), β(=기존 데이터의 평균 μ\mu) 도입!
우선적으로 z-score 스케일링을 하고, γjx^i,j+βj\gamma_{j}\hat{x}_{i,j} + \beta_j 로 기존 데이터의 분포를 유지할 수 있도록 shift
[문제2] batch normalization은 mini-batch 단위로 진행되기 때문에 Test 과정에서는 평균과 분산을 구할 수 없는 문제가 발생!
Training 과정의 μ \mu 의 평균, Training 과정의 σ \sigma 의 평균을 사용해서 테스트시 normalization 수행!
μ,σ\mu, \sigma의 average 값으로 normalization을 하게 되면 특정 배치에 의한 정규화가 아닌 배치와 독립적인 linear한 정규화가 일어나게 됨 (During testing, batch norm becomes a linear operator)
이렇게 고정된 transformation을 하게되면, 고정된 평균과 분산을 이용해서 정규화 과정을 미리 계산해서 이전 레이어의 가중치에 통합(fusing)할 수 있음.
새로운 W=γσ2+ϵ W' = \frac{\gamma}{\sqrt{\sigma^2 + \epsilon}} WW, 새로운 b=γσ2+ϵ(bμ)+βb' = \frac{\gamma}{\sqrt{\sigma^2 + \epsilon}} (b - \mu) + \beta
이렇게 BatchNorm의 효과를 이전 레이어에 반영하면 테스트 시에 별도의 BatchNorm 레이어가 필요없게 되어서 네트워크가 간소화되고, inference 속도를 높일 수 있음
Batch Normalization의 장점
Deep network를 학습 시키는 것이 훨씬 쉬워짐
improves gradient flow
→ 학습의 안정성을 향상시키고 기울기 소실 문제를 완화
allows higher learning rates, faster convergence
→ 학습의 수렴속도를 높이고, 가중치 초기화에 대해 강건해짐
일종의 regularization 역할도 수행 (모델 과적합 방지를 위해 가중치를 조정하거나 제약을 두는 역할)
Batch Normalization의 단점
미니 배치 크기에 의존하고, 배치 사이즈가 너무 작은 모델에서는 잘 작동하지 않음
→ batch size가 1일때 분산크기가 0이 되기 때문에 배치 정규화의 효과가 극단적이게 될 수 있음
RNN Model과 같이 sequence 데이터를 다루는 모델에서는 적용시키기 어려움
→ 각 시점마다 다른 사이즈의 데이터가 연속적으로 나오기 때문에 적용시키기 어려움.

4. Optimizer

1.
Gradient Descent
스텝크기 λ\lambda, 반복횟수 N, loss function f(x)f(x) 일때
a.
초기값 설정 : x(0) x(0),
반복단계 k=1,,N k = 1,…,N에 대해서
b. 탐색방향 설정 : Δ\Deltax=f(xk1)x = -\nabla f(x_{k-1})
c. x값 업데이트 : xk=xk1λΔxx_k = x_{k-1} - \lambda\Delta{x}
2.
탐색방향 기반 알고리즘
: 학습률을 고정시킨 채 탐색방향(gradient)을 변경
SGD(Stochastic Gradient Descent)
: 전체 N개의 데이터 중 m개만 임의로 추출(mini-batch)하여 그래디언트 계산에 사용하는 방법
→ batch size(mini-batch의 데이터 수) 와 epoch(반복 횟수)를 하이퍼파라미터로 사용
→ 해당 시점(데이터)에 대한 가장 정확한 그래디언트 값이 아니어도 적당한 배치차이즈만 찾는다면 빠른 속도로 그래디언트 추정이 가능해서 딥러닝 학습 속도를 크게 개선시킬 수 있음
a.
초기값 설정
b.
전체 데이터를 임의로 섞어줌
c.
전체 데이터에서 개수가 m개인 mini-batch 생성
d.
각 mini-batch 마다 다음을 반복
mini-batch 에 대한 gradient로 탐색 방향 설정 : x=f(xk1)x = -\nabla f(x_{k-1})
learning rate λ\lambda 설정
x값 업데이트 : xk=xk1λΔxx_k = x_{k-1} - \lambda\Delta{x}
e.
한 개의 mini-batch에 대한 연산이 끝나면, d 번과정을 epoch수 많큼 반복
Momentum
: 이동 벡터가 이전 기울기에 영향을 받도록 하는 방법으로 기존 SGD 방법에 관성계수 γ\gamma (0~1사이 값)를 도입
→ 국소최적해에 빠지지 않게 하기 위해서 전 단계의 탐색방향의 누적합 + 현재 단계의 gradient에 의한 탐색방향을 더한 값을 사용!
vt=γvt1+λf(xt1)v_t = \gamma v_{t-1} + \lambda\nabla f(x_{t-1})
xt=xt1vtx_t = x_{t-1} - v_t
3.
learning-rate 기반 알고리즘, Adaptive 알고리즘
learning rate를 고정하지 않고 매번 적절한 learning rate를 계산
→ 하나의 고정된 학습률을 사용하게 되면 각 방향마다 크기의 불균형이 있는 경우 한쪽으로 치우칠 수 밖에 없기 때문에 매 단계마다 학습률을 다르게 설정해서 초반에는 빠른 수렴속도로 최적의 파라미터의 추정치 근처로 수렴하다가 점차 학습률이 낮아져 안정적인 최적의 파라미터로 정확하게 수렴할 수 있음
Adagrad
: 데이터별로 학습률을 다르게 계산 하기 위해서 누적 기울기 값 gtg_t 도입
→ 탐색 방향은 SGD와 동일, 각 방향별로 learning rate를 계산하는 것이 다름
→ 볼록성을 갖는 loss function에는 잘 수렴하지만, 볼록함수가 아닌 신경망 모델에는 성능이 낮음
gtg_t 값은 초기값부터 일정하게 더해져 반복 횟수가 큰 상황에는 뒷 단계에서는 국소최적해와 상관 없이 learning rate 값이 0에 가까워지는 단점이 있음(learning-rate decay)
gt=gt1+f(xt1)f(xt1)g_t = g_{t-1} + \nabla f(x_{t-1})\cdot\nabla f(x_{t-1})
xt=xt1λϵ+gtf(xt1)x_t =x_{t-1} - \frac{\lambda}{\epsilon + \sqrt{g_t}} \cdot \nabla f(x_{t-1})
RMSProp
: Adagrad의 Learning rate 소실 문제를 보완하기 위해서 단기 누적 그래디언트 크기 γ\gamma 를 사용
→ 누적기울기 값을 얼만큼 반영할 건지에 대한 파라미터로, 너무 오래된 그래디언트 크기를 없앨 수 있음
gt=γgt1+(1γ)(f(xt1))2g_t = \gamma g_{t-1} + (1-\gamma)(\nabla f(x_{t-1}))^2
xt=xt1λϵ+gtf(xt1)x_t =x_{t-1} - \frac{\lambda}{\epsilon + \sqrt{g_t}} \cdot \nabla f(x_{t-1})
Adam (RMSProp + Momentum)
: 탐색 방향과 학습률 모두 적응형 접근법으로 탐색하는 방법으로 현재까지 딥러닝을 위한 최적화 알고리즘 중, 하이퍼파라미터에 가장 robust하다고 알려진 알고리즘
→ Momentum을 위한 관성 계수 β1 \beta_1, RMSProp을 위한 단기 누적 업데이트 계수 β2 \beta_2 도입
m^,g^ \hat{m}, \hat{g} 는 초기값이 0인 것을 고려해서 보정한 값
mt=β1mt1+(1β1)f(xt1)m_t = \beta_1 m_{t-1} + (1-\beta_1)\nabla f(x_{t-1})
gt=β1gt1+(1β1)f(xt1)2g_t = \beta_1 g_{t-1} + (1-\beta_1)\nabla f(x_{t-1})^2
mt^=mt1β1t,gt^=gt1β2t\hat{m_t} = \frac{m_t}{1-\beta_1^t}, \hat{g_t} = \frac{g_t}{1-\beta_2^t}
xt=xt1λϵ+gtmt^x_t =x_{t-1} - \frac{\lambda}{\epsilon + \sqrt{g_t}} \cdot \hat{m_t}

5. Transfer Learning

전이학습은 어떤 도메인의 데이터로 사전학습한 모델을 다른 도메인에 적용해서 성능을 향상시키는 방법
→ 마지막 FC 레이어를 제외하고는 사전학습에서 사용된 가중치를 사용하고(freeze) 분류를 위한 마지막 Fully-Connected layer만 새로운 데이터로 재학습