ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LG AiMERS] Machine Learning 개론
    전공&대외활동 이야기/2024 LG AIMERS 4기 활동 2024. 1. 20. 14:42
    본 내용은 LG Aimers Module 3, 서울대학교 김건희 교수님의 강의 내용에 기반하고 있습니다

    Machine Learning이란?

    Machine Learning is a computer programing is said to learn form experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E - by T.Michell(1997)

     

    위의 정의와 같이 현재도 인공지능 알고리즘을 평가하고 설계하고 있다. 

    T: classification, regression, detection, 

    P: error rate, accuracy, margin, likelihood... 

    E: Data 

     

    기계학습의 목표는 Generalzation이다. 

    즉, 일반화인데, 이는 학습에 사용한 data에 없는 데이터에 관해서도 적절한 output을 생성하는 것이다. 

    이는 주어진 data를 통해 적절한 추상화와 pattern 학습이 필요함을 의미한다. 

     

    No Free Launch Problem

    No machine learning algorithm is universally any better than any other. 

    Task에 따라, data에 따라서 다른 알고리즘, 알고리즘의 설계를 변형해야한다. 즉, data와 task의 특성에 대해 잘 파악해야한다. 

     

    References Book

     

    수업 때 추천해주신 책으로 위에 2 책은 CS 기초를 위해, 밑에 4가지 책은 알고리즘과 기계학습에 관한 내용을 추가로 공부할 수 있는 책이라고 한다. 

     

    Model의 구성 

    모델의 구성을 아래의 코드 예시를 통해 확인해보자. 아래 코드는 CNN을 이용한 MNIST dataset을 구분하는 코드의 일부이다. 

    1. Data Set

    우선 아래와 같이 학습에 사용하고자 하는 dataset을 정의해야한다. 이때, train과 test에 사용할 dataset은 구분되어야한다. (batch등에 관한 설명은 생략한다)

    # Training settings
    batch_size = 64
    device = 'cuda' if cuda.is_available() else 'cpu'
    print(f'Training MNIST Model on {device}\n{"=" * 44}')
    
    # MNIST Dataset
    train_dataset = datasets.MNIST(root='./mnist_data/',
                                   train=True,
                                   transform=transforms.ToTensor(),
                                   download=True)
    
    test_dataset = datasets.MNIST(root='./mnist_data/',
                                  train=False,
                                  transform=transforms.ToTensor())
    
    # Data Loader (Input Pipeline)
    train_loader = data.DataLoader(dataset=train_dataset,
                                               batch_size=batch_size,
                                               shuffle=True)
    
    test_loader = data.DataLoader(dataset=test_dataset,
                                              batch_size=batch_size,
                                              shuffle=False)

    2. Model(Class Model, Hyper Model)

    model의 Base가 되는 기본 모델을 정의한다. 이번에는 Net() class의 모델을 정의했는데, 모델의 경우 각 task에 맞추어 사용하고자하는 model의 종류가 다를 것이다.

    선형모델의 경우는 $ y = ax + b$ 등과 같은 형태일 것이다. 

    이후 학습을 통해 a, b등과 같은 parameter를 학습하게 된다. 

    3. Criterion, Loss Function

    모델의 학습의 성과를 나타내는 함수로, 이를 기준으로 모델이 학습을 하게 된다. 해당 함수를 optimize하는 것이 목적이다. 즉, 위의 model의 parameter는 argmin Lossfunction를 통해 결정된다. 

    model = Net()
    model.to(device)
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)
    
    def train(epoch):
        model.train()
        for batch_idx, (data, target) in enumerate(train_loader):
            data, target = data.to(device), target.to(device)
            optimizer.zero_grad()
            output = model(data)
            loss = criterion(output, target)
            loss.backward()
            optimizer.step()
            if batch_idx % 10 == 0:
                print('Train Epoch: {} | Batch Status: {}/{} ({:.0f}%) | Loss: {:.6f}'.format(
                    epoch, batch_idx * len(data), len(train_loader.dataset),
                    100. * batch_idx / len(train_loader), loss.item()))
    ....
    
    
    if __name__ == '__main__':
        since = time.time()
        for epoch in range(1, 10):
            epoch_start = time.time()
            train(epoch)
            m, s = divmod(time.time() - epoch_start, 60)
            print(f'Training time: {m:.0f}m {s:.0f}s')
            test()
            m, s = divmod(time.time() - epoch_start, 60)
            print(f'Testing time: {m:.0f}m {s:.0f}s')
    
        m, s = divmod(time.time() - since, 60)
        print(f'Total Time: {m:.0f}m {s:.0f}s\nModel was trained on {device}!')

     

    Overfitting & Generalzation 

     

     

    Generalization Error란, 기준이 되는 error로, Universal set(= P(x,y), True Distribution, 모든 data가 존재한다는 가정하에 있는 이상적인(구하는 것이 불가능한) dataset, x와 y에 관해 모든 가능한 상관관계를 표현하고 있는 set)에서의 Loss의 기댓값으로 정의된다. 

    이 때 data는 True Distribution에서 IID 과정을 통해 얻어진 sampling된 data라고 할 수 있을 것이다. 

     

    Overfitting과 Underfitting은 이 Genearlzation Error와 Training Error를 비교했을 때, Underfitting의 경우 Training Error가 Generalization Error보다 큰 경우를, overfitting의 경우 이보다 작은 경우를 의미한다. 

     

    보다 현실적으로는 training Error가 매우 큰 경우(적절히 작지 않은 경우)가 Underfitting. 

    Training Error와 Test Error의 차이가 매우 큰 경우(Test Error가 매우 큰 경우)를 OverFitting이라고 한다. 

     

    그림으로 표현하면 아래와 같다. 

    출처: Matlab

    Overfiitng을 해결하기 위해 다음과 같은 방법이 사용된다. 

    1. Feature을 줄인다
      1. feature 중 일부를 실험자가 임의로 중요도를 따져서 선택하는 방법
      2. feature 중 일부를 model selection alogrithim을 이용해 선택하는 방법
    2. Dataset을 늘린다
    3. Regularization: 괜찮은 feature가 많을 때 사용, Feature는 모두 사용하되, 각 feature가 모델에 미치는 영향을 줄인다(reduce the magnitude of theta)
    Train set, Test set, Validation Set 
    1. Train Set: 
    학습에 사용하는 Data set 
    2. Validation Set: 
    학습 이후에 Data가 Overfitting되어있는지, 적절한 Epoch 수나, Hyperparameter를 확인하기 위한 Dataset
    해당 Dataset으로 구한 Valiation Error가 증가했다면, Overfitting의 가능성을 확인할 수 있다. 
    3. Test Set:
    모델의 성능을 평가하는데 이용 
    보통 비율은 6:2:2로 설정하나, Train set과 Validation Set을 엄격히 구분하여 사용하지 않는 경우도 많다

    Bias & Variance

    Bias와 Variance에 관한 이야기도 Model의 Complexity와 Overfitting에 관해 이야기할 때 많이 사용되는 용어이다. 

    Bias는 Correcticity에 관한 에러이다. 

    즉, 실제 정답과 얼마나 맞느냐?에 관한 Error term이다. Bias가 높다는 것은 모델 학습이 제대로 되지 않았다는 것을 의미하기에, 모델이 잘못 설계되었을 가능성이 크다. 즉 underfiitng되어있음을 의미한다. 이 경우 data의 양을 늘려주어도 해결되지 않을 가능성이 있다. 

    Variance는 data가 얼마나 널뛰는가?에 관한 에러이다. 

    즉, overfitting이 된 모델은 Variance가 높다고 할 수 있다. 정답은 잘 맞추지만, train set이 아닌 경우에 대해서는 예측을 하지 못하는, 크게 벗어나는 상태를 의미한다. 이 경우 더 다양한 dataset을 넣어줌으로 해결도 가능하고(universal set에 더 train set이 가깝게 변경), 혹은 regularzation term을 이용해 모델의 복잡성을 낮추어주는 것도 가능하다. 

     

    Bias와 Variance 사이에 Tradeoff 관계가 존재한다. 즉, 양쪽 사이에서 적절한 합의점을 찾는 것, optimal capacity를 찾는 것이 중요한데,  이를 위한 기법 중 하나로  앙상블 기법이 존재한다(이는 이후 paper리뷰나 다른 글로 정리할 예정이다).

     

Designed by Tistory.