✨ 공부 기록/딥러닝

[홀로서기 4] 딥러닝 홀로서기 강의 정리(chap 11, 12, 13, 14)

LaonMoon 2022. 8. 15. 21:51

<수강한 강의>

[#11.Lec] How to Parameterize DL Code - 딥러닝 홀로서기

[#12.Lab] Run Pytorch on GPU - 딥러닝 홀로서기

[#13.Lec] Overfitting, Regularization - 딥러닝 홀로서기

[#14.Lec] Hyperparameter Tuning Guide - 딥러닝 홀로서기

 

수강 날짜 : 220814-

 

<내용 정리>

 

[#11.Lec] How to Parameterize DL Code - 딥러닝 홀로서기

 

- How to parameterize Entire code

설정해야 하는 하이퍼파라미터들이 많다. 이걸 어떻게 관리할 것인지? => args로 한 곳에 모아 관리

- 왜 변수화를 해야 하는가?

    - 다양한 변수를 한곳에서 관리하기 위해서

    - 세이프 코딩을 위한 목적(코드 안에 상수로 남아있는 값이 있으면 하이퍼파라미터를 바꿨어도 별 변화없는 것으로 아고 넘어가버릴 수 있어서)

    - Re-usability(재사용), Readability(가독성)

    - hyperparameter의 optimizer를 사용할 수도 있다.

 

- hyperparameter란? non-trainable하다.

 

<Hyper-parameter 구성요소>

- 모델을 결정하는 하이퍼 파라미터(layer수, unit 수 등)

- optimizer를 결정하는 하이퍼 파라미터(예. adam)

- training/evaluation process related(epoch을 몇 번 돌릴 건지, batch_size, 데이터 양이 많다면 언제마다 evaluate할 건지)

- device(gpu, cpu)

- saving exp result(실험결과, 모델 이름)

 

<Argparse>

import argparse
parser = argparse.ArgumentParser()
args = parser.parse_args("")

print(args)
args.batch_size = 100
print(args.batch_size)

args.in_dim = 256
args.in_dim = 128

- python 내장 라이브러리

- dictionary type으로 정리를 하면 되는데, 그중에서 간편하게 쓰기 위해 argparse를 쓰는 것.

- 만약 args를 dictionary로 바꾸고 싶다면? vars(args) 이렇게 해주면 된다.

 

[#12.Lab] Run Pytorch on GPU - 딥러닝 홀로서기

 

- CPU와 GPU를 사용하는 것의 차이 : cpu의 경우 for문을 돌린다면, gpu는 병렬적으로 처리가 가능.

- 그러면 pytorch에서 어떻게 GPU를 사용할 수 있을까?

 

model = MLPModel(784,10,[1000])

device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')

model.to(device)

 

device에서 cpu냐 cuda:0(GPU)이냐를 적어주면 된다. 이 때, 데이터들에도 적용시켜주도록 한다.

 

input_X = input_X.to(device)

true_y = true_y.to(device)

print(torch.couda.is_available()) -> 이걸 이용해서 if문으로 gpu나 cpu 사용을 표현할 수도 있다.

 

=> device = 'cuda:0' if torch.cuda.is_available() else 'cpu'

그리고 데이터를 다룰 때도 마찬가지로 input_X = input_X.to(device)와 같은 식으로 넣어주어야 한다. true_y = true_y.to(device)

그 이후에는 numpy도 cpu 관련 코드로 바꿔주어야 한다.

 

[#13.Lec] Overfitting, Regularization - 딥러닝 홀로서기

 

<MLP에서의 Overfitting>

- Model Capacity : 파라미터를 늘릴 수록 capacity가 커지고, 그러면 복잡한 현상을 예측할 수 있다.

그렇지만 막 capacity를 늘리면 overfitting 문제(일반적인 경우에서는 적용되지 않는)가 발생한다.

 

- True Risk vs Empirical Risk : overfitting이 되면 empirical risk는 줄어들고, true risk는 늘어난다.

=> 즉, training loss(empirical risk)와 validation loss(approximated true risk)를 잘 비교해봐야 함.

 

(16:46)

<Regularizations L2 Regularization and Dropout>

- L2 Regularization

(예) Loss = MSE + R(람다)

강제로 overfitting을 방지.

 

- Dropout

각각의 노드들을 꺼버린다. -> 모델 capacity(파라미터의 개수)를 줄여준다.

그렇게 하면 각각의 뉴런을 보다 효율적으로 사용할 수 있게 된다.

 

어떤 식으로 꺼버리는가에 따라 모델이 달라지기 때문에 복잡한 하나의 모델 보다는 간단한 여러개의 모델을 종합하여 결과를 얻을 수 있다.(앙상블 기법의 일종)

 

이 때, training을 할 때만 dropout을 적용하고, test를 할 때에는 dropout 없이 진행한다.

 

(27:24)

<Problems of MLP Gradient Vanishing>

- Gradient Vanishing

: 한번 0에 가까운 값이 되어 버리면 gradient가 0 가까이에서 거의 바뀌지 않는다.

=> ReLU Activation function을 이용해 해결

 

(34:28)

<Xavier Initialization and Batch Normalization>

- Xavier Initialization

: weight 초기화 방법 중 하나.  

- Batch Normalization

 

[#14.Lec] Hyperparameter Tuning Guide - 딥러닝 홀로서기

 

- Hyperparameter Tuning의 목적은? 모델의 true risk를 줄이기 위해서(=validation set의 loss를 줄이는 것)

- 접근법은?

1) Model Related

: hidden layer, hidden unit의 개수, activation function

2) Optimization Related

: optimizer의 종류(SGD, Adam), Learning rate, L2 coef, Dropout Rate, Batch Size, Epoch

 

* 모델을 정하고 -> 학습 관련 요소들을 정하는 것을 추천

 

- Batch size를 일단 최대한 키우고(학습 시간이 빨라진다), 그 후에 batch_size를 줄여본다. 

 

- hyper parameter를 찾는 방법

1) grid search

2) Random

3) 직접 해보기

4) Bayesian Optimization

+) AutoML