본문 바로가기
BOOSTCAMP AI TECH/3주차_Deep Learning Basics

[BOOSTCAMP AI TECH] 12일차_최적화 & CNN

by 이민우 2021. 2. 2.
728x90
반응형
  • 강의 목록

- Optimization (최적화)

- CNN 첫걸음


  • 요약

강의

 

뉴럴 네트워크의 최적화와 관련해 일반화 성능, 교차 검증, 경사 하강법, 정규화 등을 학습했다.

CNN의 개념 중 콘볼루션 연산에 대해 학습했다.

 

피어세션

 

어제의 내용을 복습하는 시간을 가졌고, 과제 코드를 함께 분석하는 시간을 가졌다.


  • 학습정리

Optimization (최적화)

 

Generalization (일반화 성능)

Generalization gap

  • 학습한 적 없는 데이터에서 얼마나 잘 작동하는지 테스트 한 것.
  • 일반화 성능은 학습 에러와 테스트 에러의 차이가 크지 않음을 의미한다.
  • 무작정 학습 에러가 적다고 좋은 것이 아니다.

 

 

Underfitting vs Overfitting

  • Underfitting (과편향) : 모델이 너무 단순해서 데이터에 내제된 구조를 학습하지 못하는 것.
  • Overfitting (과분산) : 모델이 훈련 데이터에 너무 잘 맞아 일반성이 떨어지는 것.
구분 원인 해결
오버피팅 학습 데이터 편중 다양한 훈련 데이터확보
과도한 양의 특징들 정규화, 표준화
무분별한 Noise 수용 Dropout
언더피팅 부적절한 분석 모형 분석 모델 유연성 확보
습 데이터 부족 충분한 학습데이터 확보
표준 집합 부족 Cross Validation

 

 

Cross Validation (교차검증)

  • 학습데이터와 테스트데이터를 나누어 진행한다.
  • 학습 데이터를 k개로 나누어 1개로 테스트, 나머지로 학습
  • 매번 테스트 데이터를 달리해 k번의 학습을 반복한다.
  • 특정 평가 데이터 셋에 오버피팅 되는 것을 방지할 수 있다.
  • 학습 횟수가 많기 때문에 시간이 조금 오래 걸린다.

 

 

Bias and Variance

https://work.caltech.edu/telecourse

  • Variance : 비슷한 입력에 대한 일관된 출력 정도 (작을수록 좋음)
  • Bias : 같은 입력에 대해서 출력의 평균 정도 (작을수록 좋음)
  • 학습데이터의 잡음을 최소화하는데, 하나를 올리면 하나가 내려감
  • bias와 variance를 둘 다 줄이는 것은 힘들다

 

 

 

Bootstrapping

https://www.datacamp.com/community/tutorials/adaboost-classifier-python

  • 서브 샘플링으로 학습 데이터를 나누어 여러 모델을 만드는 것.
  • 학습데이터 전체가 아니라 일부만 활용한 여러 모델을 만드는 것.
  • 딱 하나의 단일 통계치가 아니라, 여러 모델을 만들어 평균을 구한다.
  • 여러 모델의 일치도를 보기 위해 활용
  • 데이터 셋 내의 데이터 분포가 고르지 않은 경우 사용된다.
  • 데이터 셋의 분포가 고르지 않을 때 고르게 만들 수 있다.

 

Bagging (Bootstrapping aggregating)

  • 학습데이터를 전부 사용하여 한 개의 모델을 만드는 게 아니라 나눠 여러 모델을 만든다
  • 여러 모델의 아웃풋의 평균을 내기 위해 사용.

 

Boosting

  • 시퀀셜하게 간단한 모델을 만들어서 돌려본다.
  • 잘 안되는 데이터에 대해서만 모델을 추가로 만든다.
  • 이렇게 만들어진 모델들을 시퀀셜하게 합쳐 하나의 모델을 만든다.

 


 

Gradient Descent (경사 하강법)

  • 모델이 출력한 결과값과 실제값 사이의 차이인 Loss Function을 최소화 하기 위해 loss를 줄이는 방향으로 기울기를 업데이트 하는 것.
  • 근데 일반적인 GD는 모든 데이터를 전부 넣어 기울기를 계산하기에 너무 느렸다.
  • 그래서 나온 게 SGD이다.

 

1) Stochastic gradient descent (SGD)

  • 데이터 셋에서 한 개의 샘플을 추출해 error gradient를 계산하고 gradient descent 알고리즘을 적용하는 방법.
  • 상대적으로 빠르고, local optimal에 빠질 리스크가 적다.
  • 데이터를 한 개씩 처리하기 때문에 메모리에 부담이 가고, global optimal을 찾지 못할 수 있다.

 

2) Mini-batch gradient descent :

  • 데이터를 여러 미니배치로 나눠 한 개의 미니 배치마다 기울기를 구하고 모델을 업데이트.
  • SGD보다 병렬처리가 좋다.
  • 에러에 대한 정보를 미니배치 크기만큼 축적해 계산하기 때문에 SGD보다 메모리 사용이 높다.

 

3) Batch gradient descent :

  • 전체 데이터 셋으로 에러를 구한 뒤 기울기를 한 번만 계산
  • 전체 데이터에 대해 업데이트가 한 번에 이루어지기에 병렬 처리에 유리하고 global optimal로 수렴이 안정적이다.
  • 학습이 오래걸리고 local optimal 상태가 되면 빠져나오기 힘들다.

*global optimal : loss 값이 최소에 도달하는 지점

*local optimal : loss 값이 최소가 아닌데 이후에 증가한다고 프로그램이 최소로 인식하는 구간.

 

*Batch size matter

On Large-batch Training for Deep Learning: Generalization Gap and Sharp Minima, 2017

-배치 사이즈가 크면 sharp minimizer에 도달한다.

-배치 사이즈가 작으면 flat minimizer에 도달한다.

*즉, 배치 사이즈가 작은게 더 좋다.

*flat minimizer트레이닝에서 잘 되면 테스팅에서도 잘 되기에 일반화 성능이 높다

*sharp minimum에서는 트레이닝에서 얻어지는 값들이 테스트 데이터에서는 제대로 동작 안함

 

 

 

 

경사 하강법 메소드

  • 계산 자체는 프로그램이 알아서 해주지만 경사 하강법은 직접 골라야 한다.

 

1) SGD

  • 전체가 아닌 조금만 훑어보고 일단 빨리 가는 것.
  • learning rate를 잡는 것이 어렵다. 크거나 작으면 학습이 잘 안됨.

 

2) 모멘텀

  • 모멘텀이 이전의 경사를 계속 들고있는 형태.
  • 경사가 바뀔 때 이전의 경사 정보를 활용한다.
  • 일종의 가속도 개념으로, 경사 방향이 변할 때 감소하던 혹은 증가하던 방향으로 더 많이 변화한다.
  • 한 번 흘러가기 시작한 경사를 유지하여 경사가 계속 바뀌어도 학습이 잘 됨

 

3) Nesterov Accelerated Gradient (NAG)

  • 모멘텀 방법에서 현재의 파라미터 부분에 대한 부분을 수정하여 목적 함수를 사용
  • 모멘텀은 이동 벡터 VT를 계산할 때 현재 위치에서 GRADIENT와 MOMENTUM STEP을 독립적으로 계산하고 합친다.
  • NAG는 MOMENT STEP을 먼저 고려해 MOMENTUM STEP을 먼저 이동했다고 생각한 후 그 자리에서 기울기를 구해  이동한다.
  • 즉, 경사 계산시 LAG를 계산해 미리 한 번 이동한 다음 해당 위치의 경사를 누적한다.

 

4) Adagrad

  • 뉴럴 네트워크의 파라미터의 변화 정도를 파악한다.
  • 학습률이 너무 작으면 학습 시간이 너무 길고, 너무 크면 발산해서 학습이 제대로 이루어지지 않는 현상을 학습률 감소를 통해 해결한 것.
  • 많이 변한 파라미터는 적게 변화시키고, 조금 변한 파라미터는 많이 변화시킨다.
  • G에 파라미터의 변화 정도를 누적한다. (큰 값일수록 많이 변함)
  • 근데 G가 계속 커져서 학습이 진행될수록 학습이 멈춘다. (변화를 안시킴, 학습률이 0이 됨.)

 

5) Adadelta

  • G가 계속해서 커지는 현상을 막기 위해 합을 구하는 대신 지수 평균을 구한다.
  • 현재 타임스탬프 T가 주어지면 시간에 대한 파라미터의 변화를 잡는다.
  • 근데 G를 누적하는 것이 아니라 따로 두기에 학습이 진행될수록 G의 개수가 너무 많아진다.
  • 익스탠셜 무빙 에버리지로 막는다.

*Adadelta에는 LEARNING RATE이 없어 개발자가 직접 변경할 수 있는 요소가 없다.

*Learning rate이 필요없는 이유는 H가 없데이트 하려는 가중치의 변화값을 들고있기 때문

*개발자가 직접 변경할 수 없어 잘 활용하지 않는다.

 

6) RMSprop

  • AdaGrad에서 기울기의 누적으로 인해 학습률이 0이 되는 것을 방지.
  • 기울기를 단순 누적하지 않고 지수 가중 이동 평균을 사용해 최신 기울기들이 더 크게 반영되도록 했다.
  • stepsize를 넣어 기울기들의 최신 정도를 파악한다.

 

7) Adam

  • 가장 무난하게 사용하는 함수
  • 모멘텀과 AdaGrad를 융합한 방법.
  • 그래디언트의 크기가 변함에 따라 이전의 그래디언트 정보를 합친다.

 


 

Regularization

  • 일반화 성능을 잘 측정하기 위해 규제를 거는 것
  • 학습을 방해함으로써 학습 데이터에만 잘 동작하는 오버피팅을 방지한다.

 

1) Early Stopping

  • 각 EPOCH마다 성능을 측정하고, 좋은 성능이 나오면 멈춘다.
  • 이 때 검증은 학습에 활용하지 않은 데이터 셋으로 해야 한다.

 

2) Parameter Norm Penalty

  • 뉴럴 네트워크는 숫자들이 작아야 학습이 더 잘 진행된다.
  • 뉴럴 네트워크의 파라미터가 너무 커지지 않게 하는 방법
  • 비용함수에 제곱을 더하거나 절댓값을 더해서 웨이트의 크기에 제한을 준다.

*L2 weight decay (제곱값)

*L1 weight decay (절댓값)

 

3) Data Augmentation

  • 한정된 데이터를 더 많은 데이터로 늘리는 방법
  • 데이터를 자르거나, 미러링하거나, 회전하는 등으로 데이터의 수를 늘리는 것

 

4) Noise Robustness

  • 입력 데이터에 노이즈를 집어넣어 노이즈가 있는 데이터에 익숙해지게 만든다.
  • 단순히 데이터에만 하는 게 아니라 가중치에도 노이즈를 넣는다.

*Robust : 이상치나 노이즈가 들어와도 흔들리지 않고 잘 일반화 하는 것.

 

5) Label Smoothing

CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features, 2019

  • 0과 1로 이루어진 레이블을 0~1 까지의 다양한 값으로 변화 ex) [0, 1, 0] => [0.025, 0.95, 0.025]
  • 이진분류에서 모델이 둘 중 하나만 정확하게 예측하지 않게 만든다.
  • 데이터 셋 자체는 사람이 만드는 것이기 때문에 실수의 가능성이 있고, 오분류된 데이터가 있을 수 있다.
  • 이를 대비해 모델을 둘 중 하나만 정확하게 예측하게 만들지 말고, 유하게 학습시키면 효과적.
  • 학습 데이터를 두 개를 뽑아서 섞어주는 방식으로 만든다.
  • 노력 대비 성능 향상이 좋은 편.

 

6) Dropout

  • 뉴런의 일부를 랜덤으로 꺼서 랜덤한 모델을 만든다.

 

7) Batch Normalization

  • 뉴럴 네트워크는 기본적으로 숫자의 범위가 작아야 학습이 효율적으로 이루어진다.
  • 하지만 여러 레이어를 거치면 레이어의 결과로 파라미터가 계속 변화한다.
  • 더 나은 학습 효율을 위해서는 레이어의 결과로 나온 파라미터를 정규화해야 한다.
  • 하지만 일반 정규화 (평균 0, 표준편차 1)로 정규화시 활성 함수의 비선형성이 사라진다.
  • ex) sigmoid의 경우 (-1.96, 1.96)이 선형인데 이 부분에만 속할 수 있다.
  • 그래서 전체가 아닌 배치 단위 별로 평균과 분산을 이용해 정규화 한다.

 


 

CNN

 

Convolution 연산

  • 커널을 입력벡터 상에서 움직이며 선형모델과 합성함수가 적용되는 연산
  • 커널을 이용해 정보를 국소적으로 확산, 추출, 감소하는 것.
  • 커널은 정의역 내에서 움직여도 변하지 않고 주어진 신호에 국소적으로 적용한다.
  • 1차원 뿐 아니라 다양한 차원에서의 연산도 가능하다.
  • 데이터의 성격에 따라 사용하는 커널이 달라진다.

*커널 = 필터 = 가중치

 

2차원 Convolution 연산

  • 2차원 연산은 커널을 입력벡터 상에서 움직여가며 선형모델과 합성함수가 적용된다.
  • 입력 크기를 (H, W), 커널크기를 (KH,KW),출력크기를 (OH, OW)라 하면 출력크기는 다음과 같이 계산한다.

 

3차원 Convolution 연산

만약 출력을 3차원으로 구성하고 싶으면 커널을 여러 개 사용
커널이 텐서면 출력은 1차원

 

https://wikidocs.net/64066

  • 3차원 연산의 경우는 2차원 연산을 세 번 적용한다.
  • 3차원 부터는 행렬이 아닌 텐서라 칭한다.
  • 3차원 연산은 커널의 채널수와 입력의 채널수가 같아야 출력도 텐서가 된다.

 

Convolution 연산의 역전파

  • 커널이 모든 입력데이터에 공통으로 적용되기에 역전파 계산 시에도 Convolution 연산이 나온다.
  • 각 커널에 들어오는 모든 그레디언트를 더하면 결국 Convolution 연산과 같다.

 


  • 피어세션 회의 내용

#NN과 MLP의 차이

  • NN은 신경망으로 대부분 하나의 은닉층을 가진 평범한 신경망을 의미한다.
  • 두 개 이상의 Hidden Layer로 구성되어 있으면 MLP라고 한다.

 

# M.train

  • 모델 내의 파라미터들이 required_grad가 true로 변경해 train mode로 변경한다.
  • eval 시에는 false로 변경해서 test mode로 변경한다.

 

# backward를 갱신한 값을 옵티마이저 객체에 넣지 않고 어떻게 사용하는가?

  • backward()는 tensor 객체로, tensor 안에 자동으로 누적이 되어 굳이 따로 연동을 하지 않아도 상관없다.

 


  • 해야할 일

왜 파라미터 수의 범위가 좁으면 더 좋은 학습 효율이 보이는가?

  • 데이터의 수치가 넓다면, 데이터의 크기가 들쑥날쑥해지는데 모델이 데이터를 이상하게 해석할 우려가 있다.
  • 또한 수치가 높은 데이터를 모델이 중요하게 생각해서 이상한 해석이 나올 수 있다.
  • 이를 위해 데이터를 같은 정도의 중요도를 반영하도록 정규화해야 한다.

 

728x90
반응형