국문과 유목민

[일일리포트] Day 10 본문

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

[일일리포트] Day 10

논곰 2022. 1. 28. 13:29

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

Kaggle code 보기

 멘토님께서 추천해주신 캐글 내 파이토치 코드를 살펴보면서, 코드의 전체적인 흐름과 눈에 익지 않은 라이브러리나 함수들의 사용법을 익히고자 했다. Kaggle의 데이터 셋은 Natural Language Processing with Disaster Tweets이며, 참고한 코드는 다음과 같다. 

  • Pytorch text classification : Torchtext + LSTM: TorchText와 LSTM을 활용한 코드로 파이토치의 전체적인 프로세스가 잘 정리되어 있던 것 같다.
  • BERT, Huggingface, PyTorch: BERT임베딩과 HuggingfFace를 활용한 코드로서 자연어처리에서 가장 인기있는(?) 두 가지 키워드가 모두 사용되어있다는 점에서 배울게 많았던 코드라고 생각한다.

 다음으로 해당 코드를 보면서 잘 몰랐었던 부분이나 새로 알게 된 부분들에 대한 내용입니다. 궁금증을 해결하기 위해서 참고했던 다른 블로그나 사이트의 링크를 간단한 정의와 함께 첨부해서 올린다.

 

  • Class Method & Static Method
    • self, cls의 키워드의 차이점은 매소드 타입에 있다. instance 매소드를 사용하면 self 키워드를 사용하고, class 매소드(ClassMethod)를 사용하면 cls 키워드를 사용한다. 클래스 메소드는 클래스 상태를 변경하거나 클래스 레벨에서 동작하는 메소드를 정의할 때 유용합니다.static 매소드는 속성에 접근할 수 없기 때문에 사용하는 키워드가 없습니다.
  • StaticMethod:  @staticmethod를 명시해서 생성하는 함수. 인스턴스화 하지 않고 메소드를 호출 할 수 있다는 것이 가장 큰 특징이며, static 메소드는 독립적으로 사용되기 때문에 다른 속성에 액세스하거나 해당 클래스 내의 다른 메소드를 호출 할 수 없다.
  • ClassMethod: @classmethod를 명시해서 생성하는 함수. class 매소드 또한 static 매소드와 마찬가지로 클래스를 인스턴스화 하지 않아도 호출이 가능하다. 차이점은 다른 메소드 및 클래스 속성에 액세스 할 수있는 기능에 의존하고 있지만, 인스턴스 속성은 없다.

인스턴스 메소드와 클래스 메소드의 비교

class MyClass:
    class_variable = 0  # 클래스 변수

    def __init__(self, value):
        self.value = value

    def instance_method(self):
        print(f'인스턴스 변수: {self.value}')

    @classmethod
    def class_method(cls):
        print(f'클래스 변수: {cls.class_variable}')

# 인스턴스 생성
obj = MyClass(10)

# 인스턴스 메소드 호출
obj.instance_method()  # 출력: 인스턴스 변수: 10

# 클래스 메소드 호출
MyClass.class_method()  # 출력: 클래스 변수: 0

[참조링크] Python의 매소드 타입과 cls, self 키워드의 차이

 

eval()

  • evaluation 과정에서 사용하지 않아야 하는 Layer들을 알아서, off시키도록 하는 함수이다. evaluation/validation 과정에서 보통 model.eval()과 torch.no_grad()를 함께 사용한다.
  • evaluation 작업이 끝난 후에는 잊지말고. train mode로 모델을 변경해줘야 하는데, 이것은 .train() 함수를 실행시키면 된다.
def train(model, iterator):
    epoch_loss = 0
    epoch_acc = 0
    model.train()
      # 생략

def evaluate(model, iterator):
    epoch_acc = 0
    model.eval()
    with torch.no_grad():
      # 생략

train_loss, train_acc = train(model, train_iterator)
valid_acc = evaluate(model, valid_iterator)

 [참조링크] model.eval() 의미


torch.manual_seed(seed)

  • 파이토치에서 random seed를 고정하기 위해 사용하는 메소드

멘토링 정리 

import math
# mnist_resnet18 분류 모델을 학습하기
MNIST_CLASS_NUM = 10
mnist_resnet18.fc = torch.nn.Linear(in_features=512, out_features=MNIST_CLASS_NUM, bias=True) # resnet18.fc의 in_features의 크기는? 512 이를 10으로 바꿔줘야 한다. 
torch.nn.init.xavier_uniform_(mnist_resnet18.fc.weight) # ← 해당 부분 질문
stdv = 1.0 / np.sqrt(512) 
mnist_resnet18.fc.bias.data.uniform_(-stdv, stdv)

Q1. xavier_uniform을 하는 이유와 분산을 왜 output layer의 input값으로 나눠줘야 하는지?

A. xavier_uniform을 weight에 적용하는 것을 weight_initialize라고 한다. 이를 하는 이유는 정규분포로 계산을 하게 되면, 계산 결과의 분산이 커지기 때문이라고 한다. 그리고 1/np.sqrt(input_size) 를 하는 이유는 들어오는 값이 커지면 이에 따라 분산이 커지기 때문에 값을 줄이기 위해서 나눠준다고 한다.

 

Q2. optimizer를 Adam으로 사용하는 이유

A. Weight 업데이트를 위해서 optimizer를 사용하는데, 그 중에서 Adam이 자주 사용되는 것뿐이지 다른 optimizer도 사용될 수 있다고 한다. 

 

Q3. tqdm 변수 출력하는 방법

A. tqdmwith ~~ as tqdm변수명로 정의하고, 안에서 set_desciption(f"String{epoch}") 처럼 구현한 후 for문을 새로만든 변수로 설정하면 된다.

Q4. 하이퍼파라미터 튜닝을 하나만 한다고 했을 때 어떤 하이퍼파라미터를 선택할 지?

A. Epoch는 early stop이 있다면, Batch사이즈를 선택하는게 괜찮을 것 같다. 왜냐하면, 배치는 배치 사이즈에 영향을 받는 모델들이 종종 있기 때문이다. 

Q5. Train/Valid/Test 셋을 나누는 이유

A. 보통 Train은 모델 학습, Valid는 하이퍼파라미터 세팅에 사용하고, Test는 최종평가를 하는데 사용한다. Valid데이터셋의 경우 하이퍼파라미터 세팅에 사용되면 이 자체로 모델 학습 단계에 관여를 한 것이기 때문에, Valid데이터셋을 이용해 모델 평가를 진행하면 안 된다. 따라서 최종 모델 평가를 하기 위해 Test 데이터셋까지 나눌 필요가 있다. 

별도로 배운 내용

  • Embedding: 자연어처리 분야에서 임베딩이란, 사람이 쓰는 자연어를 기계가 이해할 수 있는 숫자의 나열인 벡터로 바꾼 결과 혹은 그 일련의 과정 전체를 의미한다. 단어나 문장 각각을 벡터로 변환해 벡터 공간으로 끼워넣는다(embed)는 의미에서 임베딩이라는 이름이 붙었다. 

▶ Review (생각)

 오늘은 기존 강의나 과제를 정리하는 것도 좋지만, 모처럼 생긴 시간이기도 했고 추후 스페셜 피어세션, 피어세션, 마스터 클래스, 멘토링까지 예정되어 있어서 간단히 할 수 있는 것을 생각했다. 그래서 과제를 풀면서 헷갈렸던 부분 중 멘토님에게 여쭤볼만한 부분을 정리하고, 멘토님이 추천해주셨던 캐글 베이스라인 코드를 봤다. 신기했던 것은 다른 사람들이 짠 코드를 보면서 어느정도 이해를 할 수 있었다는 것이다. 종종 익숙하지 않은 함수들이나 프로세스 등의 경우 검색을 통해서 부족한 부분을 보충했다. 그렇게 주석없이 코드를 보면서 흐름에 대해서 더 이해할 수 있었던 것 같다. 또한 추천해주셨던 책(한국어 임베딩)에 대해서도 볼 수 있는 시간이 있어서 1강을 봤는데, 헷갈렸던 개념들을 잡을 수 있었고 가독성이 좋아서 쉽게 읽을 수 있었다. 시간이 날 때마다 읽어두면 강의를 따라가는데 도움이 될 것 같다는 생각을 했다.

 

 부스트캠프를 진행하면서 공부하는 방법과 방향을 익힐 수 있는 것 같아서 좋은 것 같다. 만약 혼자서 공부를 했다면 맞는 방향이라고 할 지라도 마음을 잡을 때까지 시간이 걸렸을 것 같은데, 괜찮은 방향, 좋은 방향 등을 제시해주고 생각해볼 수 있는 방법 등을 제시해주기 때문에 수월한 것 같다.

Comments