[파이토치로 시작하는 딥러닝 기초]07_MLE, Overfitting, Regularization, Learning Rate

2020. 12. 28. 11:03·AI Study/DL_Basic
반응형

Maximum Likelihood Estimation(MLE, 최대우도추정법)

observation을 가장 잘 설명하는 theta를 찾아내는 과정
우리가 관찰한 데이터를 가장 잘 설명하는 어떤 확률 분포의 함수의 파라미터를 찾아내는 과정

 

Optimization via Gradient Descent

𝜃←𝜃−𝛼∇𝜃𝐿(𝑥;𝜃)

 

Overfitting

  • 과도한 훈련으로 모델이 훈련셋에만 최적화 되어있을 떄
  • 훈련셋과 테스트셋을 나누어서 학습할 때 오버피팅을 낮출 수 있다.

오버피팅을 해결하는 방법, Regularization

  • Early Stopping : Validation Loss가 더이상 낮아지지 않을 때 학습을 멈추는 것
  • Reducing Network Size : neural network의 사이즈를 줄이는 것
  • Weight Decay : neural network weight 파라미터의 크기를 제한하는 것
  • Dropout
  • Batch Normalization

DNN 학습할 때 기본 접근 방법 : Basic Approach to Train DNN

  1. NN의 아키텍쳐를 만든다.(Make a neural network architecture)
  2. 모델이 오버피팅 됏는지 확인한다. (train and check that model is over-fitted)
    • if it is not, increase the model size(deeper and wider)
      • 오버피팅이 아닐 경우, 모델을 더 깊고 정교하게 만든다. 
    • if it is, add regularization, such as drop-out, batch normalization
      • 오버피팅인경우, regularization을 실행한다. 
  3. step 2부터 반복.(repeat from step-2)

실습

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

torch.manual_seed(1)
x_train = torch.FloatTensor([[1, 2, 1],
                            [1, 3, 2],
                            [1, 3, 4],
                            [1, 5, 5],
                            [1, 7, 5],
                            [1, 2, 5],
                            [1, 6, 6],
                            [1, 7, 7]
                            ])
y_train = torch.LongTensor([2, 2, 2, 1, 1, 1, 0, 0])
x_test = torch.FloatTensor([[2, 1, 1], [3, 1,2], [3, 3, 4]])
y_test = torch.LongTensor([2, 2, 2])
# 모델정의
class SoftmaxClassifierModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(3, 3)
    def forward(self, x):
        return self.linear(x)
# 모델 선언
model = SoftmaxClassifierModel()
# optimizer 설정
optimizer = optim.SGD(model.parameters(), lr = 0.1)
def train(model, optimizer, x_train, y_train):
    nb_epochs = 20
    for epoch in range(nb_epochs):
        
        #H(x) 계산
        prediction = model(x_train)
        
        # cost 계산
        cost = F.cross_entropy(prediction, y_train)
        
        # cost로 H(x) 계선
        optimizer.zero_grad()
        cost.backward()
        optimizer.step()
        
        print('Epoch {:4d}/{} Cost: {:.6f}'.format(
            epoch, nb_epochs, cost.item()
        ))
def test(model, optimizer, x_test, y_test):
    prediction = model(x_test)
    predicted_class = prediction.max(1)[1]
    correct_count = (predicted_class == y_test).sum().item()
    cost = F.cross_entropy(prediction, y_test)
    
    print('Accuracy: {}% Cost: {: .6f}'.format(
        correct_count / len(y_test) * 100, cost.item()
    ))
train(model, optimizer, x_train, y_train)

>>>
Epoch    0/20 Cost: 2.203667
Epoch    1/20 Cost: 1.199645
Epoch    2/20 Cost: 1.142985
Epoch    3/20 Cost: 1.117769
...
Epoch   16/20 Cost: 1.007872
Epoch   17/20 Cost: 1.001586
Epoch   18/20 Cost: 0.995419
Epoch   19/20 Cost: 0.989365
test(model, optimizer, x_test, y_test)

Learning Rate

learning rate이 너무 크면 diverge 하면서 cost가 점점 늘어난다. (overshooting)

model = SoftmaxClassifierModel()
optimizer = optim.SGD(model.parameters(), lr = 1e5)
train(model, optimizer, x_train, y_train)

>>>
Epoch    0/20 Cost: 1.280268
Epoch    1/20 Cost: 976950.750000
Epoch    2/20 Cost: 1279135.125000
...
Epoch   17/20 Cost: 940566.562500
Epoch   18/20 Cost: 931638.250000
Epoch   19/20 Cost: 1971322.625000

learning rate가 너무 작으면 cost가 거의 줄지 않는다.

model = SoftmaxClassifierModel()
optimizer = optim.SGD(model.parameters(), lr = 1e-10)
train(model, optimizer, x_train, y_train)

>>>
Epoch    0/20 Cost: 3.187324
Epoch    1/20 Cost: 3.187324
Epoch    2/20 Cost: 3.187324
...
Epoch   17/20 Cost: 3.187324
Epoch   18/20 Cost: 3.187324
Epoch   19/20 Cost: 3.187324

적절한 숫자로 시작해 발산하면 작게, cost가 줄어들지 않으면 크게 조정하자

Data Preprocessing

x_train = torch.FloatTensor([[73, 80, 75],
                            [93, 88, 93],
                            [89, 91, 90],
                            [96, 98, 100],
                            [73, 66, 70]])
y_train = torch.FloatTensor([[152], [185], [180], [196], [142]])

standardization => 정규분포화

$${x'_{j} = \frac{x_{j} - \mu_{j}}{\sigma_{j}}}$$

 

mu = x_train.mean(dim = 0)
sigma =x_train.std(dim = 0)
norm_x_train = (x_train - mu) / sigma

print(norm_x_train)

>>>
tensor([[-1.0674, -0.3758, -0.8398],
        [ 0.7418,  0.2778,  0.5863],
        [ 0.3799,  0.5229,  0.3486],
        [ 1.0132,  1.0948,  1.1409],
        [-1.0674, -1.5197, -1.2360]])

출처 : 

www.boostcourse.org/ai214/lecture/42291

 

파이토치로 시작하는 딥러닝 기초

부스트코스 무료 강의

www.boostcourse.org

 

반응형

'AI Study > DL_Basic' 카테고리의 다른 글

[파이토치로 시작하는 딥러닝 기초]10.2_visdom  (0) 2020.12.31
[파이토치로 시작하는 딥러닝 기초]10.1_Convolutional Neural Network  (0) 2020.12.30
[파이토치로 시작하는 딥러닝 기초]06_Softmax Classification  (0) 2020.12.28
[파이토치로 시작하는 딥러닝 기초]05_ Logistic Regression  (0) 2020.12.22
[파이토치로 시작하는 딥러닝 기초]04.02_Loading Data  (0) 2020.12.21
'AI Study/DL_Basic' 카테고리의 다른 글
  • [파이토치로 시작하는 딥러닝 기초]10.2_visdom
  • [파이토치로 시작하는 딥러닝 기초]10.1_Convolutional Neural Network
  • [파이토치로 시작하는 딥러닝 기초]06_Softmax Classification
  • [파이토치로 시작하는 딥러닝 기초]05_ Logistic Regression
자동화먹
자동화먹
많은 사람들에게 도움이 되는 생산적인 기록하기
    반응형
  • 자동화먹
    자동화먹의 생산적인 기록
    자동화먹
  • 전체
    오늘
    어제
    • 분류 전체보기 (144)
      • 생산성 & 자동화 툴 (30)
        • Notion (24)
        • Obsidian (0)
        • Make.com (1)
        • tips (5)
      • Programming (37)
        • Python (18)
        • Oracle (6)
        • Git (13)
      • AI Study (65)
        • DL_Basic (14)
        • ML_Basic (14)
        • NLP (21)
        • Marketing&Recommend (4)
        • chatGPT (0)
        • etc (12)
      • 주인장의 생각서랍 (10)
        • 생각정리 (4)
        • 독서기록 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    파이토치로 시작하는 딥러닝 기초
    notion
    파이토치
    cnn
    Python
    데이터베이스
    nlp
    git
    pytorch
    ML
    seq2seq
    python기초
    빅데이터
    git commit
    딥러닝
    dl
    자연어처리
    머신러닝
    노션첫걸음
    Transformer
    Google Cloud Platform
    노션
    Github
    빅데이터분석
    GPT
    LSTM
    데이터분석
    gcp
    Jupyter notebook
    기초
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
자동화먹
[파이토치로 시작하는 딥러닝 기초]07_MLE, Overfitting, Regularization, Learning Rate
상단으로

티스토리툴바