✨ 공부 기록/딥러닝

[홀로서기 5] 딥러닝 홀로서기 강의 정리(chap 15, 16, 17, 18, 19)

LaonMoon 2022. 8. 23. 23:05

<수강한 강의>

[#15.Lab] How to Write Well-Organized DL Code from Scratch(Live Coding) - 딥러닝 홀로서기

[#16.Lec] Assignment #2 Review - 딥러닝 홀로서기

[#17.Lec] Advanced Optimizer than SGD - 딥러닝 홀로서기

[#18.Lab] Handling Visualization of 'Many' Experiments - 딥러닝 홀로서기

[#19.Lec] - Assignment #3 Review - 딥러닝 홀로서기

 

수강 날짜 : 220821-220823

 

<내용 정리>

 

[#15.Lab] How to Write Well-Organized DL Code from Scratch(Live Coding) - 딥러닝 홀로서기

 

TRAINING A CLASSIFIER_Pytorch CIFAR10 tutorial를 이해하면서 코드를 적절하게 수정한다. 추후 다시 보면 좋을 것 같다.

import torch.nn as nn
import torch.nn.functional as F

class MLP(nn.Module):
    def __init__(self, in_dim, out_dim, hid_dim, n_layer, act):
        super(MLP, self).__init__()
        self.in_dim = in_dim
        self.out_dim = out_dim
        self.hid_dim = hid_dim
        self.n_layer = n_layer
        self.act = act
        
        #fully connected
        self.fc = nn.Linear(self.in_dim, self.hid_dim)
        self.linears = nn.ModuleList()

        for i in range(self.n_layer-1):
            self.linears.append(nn.Linear(self.hid_dim, self.hid_dim))
        self.fc2 = nn.Linear(self.hid_dim, self.out_dim)

        if self.act == 'relu':
            self.act = nn.ReLU()
    
    def forward(self, x):
        x = self.act(self.fc(x))
        for fc in self.linears:
            x = self.act(fc(x))
        x = self.fc2(x)
        return x
        
model = MLP(3072, 10, 100, 4, 'relu')
model

[#16.Lec] Assignment #2 Review - 딥러닝 홀로서기

 

1) colab GPU를 써도 왜 느릴까? -> Batch size를 작게 설정하는 경우 발생할 수 있다.

2) Regularization은 어떻게 구현해야 할까?

3) 결과 비교는 어떻게 해야 할까?

 

* pytorch에서 data loader를 구현할 때 batch size도 고려하는 것이 좋다.

 

[#17.Lec] Advanced Optimizer than SGD - 딥러닝 홀로서기 # 다시 듣기!

 

- overfitting : training set을 모델이 외워버리게 되는 것.

=> 해결하기 위해서는? Regularization : L2 Regularization, Dropout

- gradient vanishing : gradient가 0으로 수렴되어 버리는 것.

=> 해결하기 위해서는? ReLU Activation를 사용.

- Xavier Initialization : weight를 어떻게 초기화 할 것인지.

- Batch Normalization : activation function을 효과적으로 사용하게 만들기 위해서

 

<Gradient Descent>

- Batch Gradient Desent

: 모든 트레이닝 셋을 이용해서 gradient를 구한다.

-> 문제점? 1) Ram의 한계에 부딪힐 수 있다. 2) 한 스텝을 밟기위해 너무 오랜 시간이 걸린다.

 

- Stochastic Gradient Descent(SGD)

: training set 중에 작은 chunk(mini-batch)에 대해서면 gradient를 계산한다.

확률적(Stochastic)으로 미니 배치를 선택한다. -> local minimum도 피할 가능성이 커진다.

=> 장점? 미니배치로 계산했을 때 더 빠르다. GPU는 올리기만 하면 batch size에 상관없이 병렬적으로 계산을 하기 때문에 계산하는데 걸리는 속도는 거의 비슷한다.

 

<Advanced Gradient Descent Methods>

- Vanilla SGD 문제점) local minima를 벗어날 수 없다.

-> momentum으로 해결(일종의 관성을 이용) : 좀 더 빠른 학습도 가능.

 

momentum의 문제점) local minima는 빠져나갈 수 있지만, global minima에 도착해서도 멈추지 못할 수 있다.

-> Nesterov Accelerated Gradient(NAG)으로 해결

Vanilla SGD의 문제점) Step size is equal for every parameter

-> learning rate를 각각의 파라미터에 맞게 적용해보자. -> step size가 너무 작아질 수 있다는 문제 발생. 이걸 해결하기 위한 것이 RMSProp

 

- AdaDelta : 파라미터의 변화량도 고려함.

 

- Adam(Adaptive Moment Estimation) : 장점들을 모두 합쳐놓은 optimizer!

 

[#18.Lab] Handling Visualization of 'Many' Experiments - 딥러닝 홀로서기

 

- How to Save Experiment Results

: args에 있는 세팅 값들을 저장해야 한다.

1) 실험 세팅값들

2) epoch에 따른 loss, acc들

3) 최종 acc도 저장

 

=> 어떻게 저장할까?

중간에 프로세스가 멈춰도(인터넷이 튕기거나, 프로세스가 강제로 종료되거나...) 실험 결과들을 남기려면? json을 이용!

#json 다뤄보기
import json
a = {'value1':5, 'value2':10}

filename = 'test.json'
with open(filename,'w') as f:
    json.dump(a,f)
    
with open(filename, 'r') as f:
    result = json.load(f)
    print(result)
    
!ls
!cat test.json

json은 딕셔너리를 저장하는 것!

 

- 실험 하나당 json 파일 하나를 만든다면 파일 이름은?

주로 바뀌는 변수 값들(n_layer같은)을 파일 제목에 같이 넣어보기? 그보다는 '실험 이름+실험 세팅 값의 해쉬.json'으로 파일 이름을 정한다.(hash 값이란? 같은 인풋이 들어오면 같은 값을 내놓음.)

# hash 값 만들어보기
import hashlib
a = "my name is gildong"
hash_key = hashlib.sha1(a.encode()).hexdigest()
print(hash_key)

=> 변수들이 담긴 딕셔너리(setting)를 str(setting)을 이용해 문자열로 바꾸어서 hash값을 얻을 수 있다.

 

# hash 값 만들어보기
import hashlib
setting = {'value1':5, 'value2':10, 'seq':[1,2,3,4,5], 'exp_name':'exp1'}
exp_name = setting['exp_name']
hash_key = hashlib.sha1(str(setting).encode()).hexdigest()
filename = '{}-{}.json'.format(exp_name, hash_key)
print(filename)

이 내용을 깔끔하게 def로 정리할 수도 있다.(https://github.com/heartcored98/Standalone-DeepLearning/blob/master/Lec4/Lab6_result_report.ipynb)

 

(28:20)

- pandas 이용과 시각화(seaborn)

 

[#19.Lec] - Assignment #3 Review - 딥러닝 홀로서기