국문과 유목민

[일일리포트] Day 23 (DL 기초_문제정의) 본문

IT 견문록/2022_부스트캠프 AITech 3기(100일)

[일일리포트] Day 23 (DL 기초_문제정의)

논곰 2022. 2. 22. 23:31

해당 일일리포트에서는 네이버 커넥트에서 진행하는 '부스트캠프 AI Tech 3기'에서 배운 내용을 다루고 있습니다. 저작권 이슈 때문에 관련 자료를 올릴 수는 없기에 핵심 이론과 코드를 요약해서 올리고 있기에 내용이 부족할 수 있습니다.

▶ Today I Learned (핵심 요약 정리)

Problem Definition

Competition을 들어가기 앞서서 문제 정의에 대해서 얘기를 간단하게 해보면, 아무리 쉬운 문제더라도 문제 정의는 도움이 된다. 다음과 같은 질문을 통해서 어떤 식으로 문제를 해결할 것인지에 대해서 생각해봐야 한다.

  • 내가 지금 풀어야 할 문제가 무엇인가?
  • 이 문제의 Input과 Output은 무엇인가?
  •  이 솔루션은 어디서 어떻게 사용되어지는가? (일반화에 도움이 된다)  

Competition을 통해서 머신러닝 파이프라인의 Process를 이해하고자 한다.

  • Domain Understanding
  • Data Mining
  • Data Analysis
  • Data processing
  • Modeling
  • Training
  • Deploy

EDA

 EDA란 '탐색적 데이터 분석'이라고 하며, 데이터를 이해하기 위한 노력이다. 사실 이미지는 EDA할 만한 요소가 많지는 않다. 하지만 어떤 문제에서든지 다음과 같은 느낌으로 EDA를 이해할 수 있다.

  • '주어진 데이터에 대한 본인의 생각을 자유롭게 서술하시오'의 서술형 문제

 EDA를 통해서 내가 진짜로 궁금한 것을 체크하는 것이다. 실제로 데이터의 분포는 어떨까? 주제와 데이터의 연관성은 어떨까? 데이터를 통해서 주제에 대한 어떤 인사이트를 찾을 수 있지 않을까?와 같은 궁금증을 EDA를 통해서 해결할 수 있다. 

DataSet

모델을 학습하기 위해 Vanilla Data를 모델이 좋아하는 데이터 형태의 DataSet으로 만들어야 한다.

Pre-Processing

 전처리 과정은 데이터 사이언스 전체를 봤을 때 매우 중요하다. Competition처럼 가공된 데이터가 주어진 경우 전처리가 별로 중요하지 않다고 생각할 수 있지만 실제 현업에서 전처리 과정은 매우 중요하다. 좋은 모델을 만들기 위해서는 좋은 데이터가 있어야 하지만 현업에서는 잘 가공된 데이터를 찾기 힘들다. 따라서 좋은 데이터를 만들기 위한 전처리 과정이 매우 중요하다고 한다.

Data Augmentation

 데이터가 부족할 때, 데이터를 변형시켜 복제함으로써 데이터를 추가적으로 생성하는 방법을 DataAugmentation이라고 한다. 이미지 데이터의 경우 'torchvision.transforms' 를 통해서 Original, RandomCrop, Flip 등의 작업을 진행할 수 있다. 그런데 우선 우리의 Task에서 실제 이러한 Augmentation 기법이 필요할 지에 대해서 생각해야 한다. 그리고 그러기 위해서는 도메인 지식이 필요하다. 그 외에도 주어진 데이터가 가질 수 있는 Case(경우), State(상태)의 다양성, 문제가 만들어진 배경과 모델의 쓰임새를 살펴보면 힌트를 얻을 수 있다.

  •  Albumentations: Augmentation 기법인데 pip로 설치할 수 있다. 더 빠르고 다양한 기법들을 제공해준다. 
'무조건'이라는 단어를 제일 조심해야 한다. 함수들은 여러가지 도구 가운데 하나일 뿐이고, 적용하면 무조건 좋은 결과를 가져다 주는 않는다. 따라서 앞서 정의한 Problem(주제)을 깊이 관찰해서 어떤 기법을 적용하면 데이터가 다양성을 가질 수 있겠다라는 가정을 수립하고 실험을 통해 증명해야 한다.

Data generator

DataFeeding은 모델에 먹이(Data)를 준다는 의미이다. 이때 모델에 먹이를 주는 역할을 하는 게 바로 Data Generator이다. Data Generator와 Model의 Batch를 맞춰줘야 학습에서 좋은 성능을 낼 수 있다.

 

Data Generation을 할 때에 Input에 대한 전처리가 들어가게 되는데, 이 때 전처리 순서도 성능에 영향을 미치게 된다. 예를 들어 이미지 데이터에 대해 RandomRoataion과 Resize를 수행하고자 할 때, Resize로 이미지의 크기를 늘리고 회전을 시킨 경우와 회전을 시키고 이미지의 크기를 늘린 경우 수행시간에서 큰 차이가 나타난다.

DataSets

Vanilla Data에 전처리나 Augmentation등을 사용한 데이터의 집합

from torch.utils.data import Dataset
class MyDataSet(Dataset):
    def __init__(self): pass # MyDataset클래스가 처음 선언 되었을 때 호출
    def __getitem__(self, index): return None # MyDataset의 데이터 중 index 위치의 아이템을 리턴
    def __len__(self): return None # MyDataset 아이템의 전체 길이

DataLoader

 내가 만든 Dataset을 효율적으로 사용할 수 있도록 관련 기능을 추가하는 클래스이다. 쉽게 말해 Batch별로 Dataset을 쪼개서 모델에 넣어주는 역할을 수행하는 것이 DataLoader이다. DataLoader는 한 개만 만들어주면, Dataset을 변경해서 사용이 가능하다. 

  • batch_size: batch개수 만큼 이미지를 넣어준다.
  • num_worksers: 병렬로 일을 처리할 수 있게 해준다.
  • drop_last: 이미지의 개수가 나누어 떨어지지 않을 때 버릴 수 있다.
  • collate_fn: batch마다 특정 작업을 해주고 싶을 때 설정한다.
from torch.utils.data import DataLoader
loader = DataLoader(data_set, batch_size=batch_size, num_workers=num_workers, drop_list=True)
DataSet은 Vanilla데이터를 원하는 형태로 출력해주는 클래스이다. DataLoader는 Dataset을 더 효율적으로 사용하기 위한 클래스이다.

▶ Review (생각)

 이번 주부터 P-Stage가 시작되면서 머신러닝 파이프라인에 대한 강의 10개가 열렸다. 해당 강의들은 Competition을 할 때 필요한 모델의 각 Process에 대해서 빠르게 훑는 느낌이었다. 그러다보니 몇 주 전에 배웠던 내용들이 많아서 복습하는 느낌으로 들었던 것 같다. 그리고 코드를 직접 짜는 실습 과제를 하면서 확실히 이론과 실제는 다르다는 것을 느꼈던 것 같다. 머리로는 알고 있지만 이를 코드로 직접 구현하기 어려웠던 것 같다. 그런 의미에서 이번 실습 과제는 꼭 해야겠다는 생각이 들었다.

 

 또한 오늘부터 목요일까지 자소서 작성에 관한 강의를 듣게 되었는데, 9시부터 11시까지 진행이 되다보니 시간이 꽤나 부족하다고 느껴졌다. 시간을 효율적으로 쓰면서 최대한 목요일 Competition 전까지 강의와 실습 문제를 다 해결해봐야겠다. 그리고 자소서 특강이 꽤나 도움이 됐던 것 같다. 이번에 Competition이 끝나고, 토요일에 자격증 필기도 다 끝나게 되면 자소서를 꾸준히 써봐야겠다. 

Comments