네이버 부스트캠프 AI Tech 5기 회고-week2

홍찬우·2023년 3월 17일
0
post-custom-banner

Intro

어느덧 1주 차가 끝나고 2주 차까지 마무리됐다. 1주 차에 비하면 시간이 굉장히 빨리 간 것 같았다. 아직까지는 계획대로 실행하고 있지만, 점점 내용은 어려워지고 모르는 것이 많아지고 있다.
이번 주는 딥러닝 프레임워크인 PyTorch 기초에 대해 학습했다. 남들이 짜둔 코드 이해하지 못한 채 내 것에 맞게 수정했던 경험은 있지만, 기초부터 배우려니 많이 어려웠다.


PyTorch

Introduction to PyTorch

PyTorch

  • high, low level을 모두 지원해줌
  • Numpy 구조를 가지는 tensor 객체로 array를 표현
  • 자동 미분(Autograd)을 지원하며 딥러닝 연산 지원
  • 다양한 형태의 딥러닝을 지원하는 함수와 모델

PyTorch vs. TensorFlow

  • TensorFlow는 Define and Run 방식으로, 그래프를 먼저 정의 후 실행 시점에 데이터를 넣는다. (Static)
  • PyTorch는 Define by Run 방식으로, 실행을 하며 그래프를 동적으로 생성하며 디버깅이 쉽다. (Dynamic)

PyTorch Basics

Tensor

  • 다차원 arrays를 표현하는 pytorch class
  • numpy의 ndarray와 동일
  • 슬라이싱, data.flatten(), ones_like(data) 등 numpy 함수와 동일

reshape & view

  • view함수는 메모리 주소를 그대로 사용해 표현하는 형태만 바꿔 줌
  • reshape 함수는 copy해 복사해 원래 값과 다르게 사용
  • 거의 view 함수를 사용

squeeze & unsqueeze

  • squeeze함수는 크기가 1인 차원을 삭제하고, unsqueeze(index) 함수는 index번 째 차원에 크기가 1인 차원을 추가
  • 이 때 함수 파라미터로 dim을 사용하며, 이는 numpy에서 axis와 같은 역할이다.
    dim = 0 : channel, dim = 1 : height, dim = 2 : width

Tensor Operations

  • Tensor은 +, -, * 연산을 지원하며, 스칼라 연산도 가능하다.
  • 행렬곱 연산 함수는 dot이 아닌 mm 또는 matmul을 이용 (웬만하면 mm을 사용)
    mm함수는 broadcasting을 지원하지 않고 matmul 함수는 지원

Autograd

t = torch.tensor(2.0, requires_grad=True)  # requires_grad=True로 설정해야 자동미분
x = t**2
y = 10*x + 25
y.backward()  # 자동미분 함수
t.grad

x = t2
y = 10x + 25
따라서 t의 gradient는 2t * 10 = 40

a = torch.tensor([2., 3.], requires_grad=True)
b = torch.tensor([6., 4.], requires_grad=True)
Q = 3*a**3 – b**2
external_grad = torch.tensor([1., 1.]) 
Q.backward(gradient=external_grad)
a.grad  # [36. , 81.]
b.grad  # [-12. , -8.]

Q = 3a3-b2
두 변수 a, b에 대해 편미분 가능
이 때, external_grad처럼 tensor의 크기를 지정해 줘야 함


PyTorch Project Structure

jupyter notebook은 개발 과정에는 유리하나 배포 및 공유에 어려움
프로젝트는 OOP와 모듈을 사용

PyTorch Project Template

  • config.json 파일에서 hyperparameter들을 설정해줌

train.py의 ConfigParser

  • from_args : 재료(argument)를 넣어주면 객체를 생성해주는 패턴

parse_config.py

  • config = read_json(cfg_fname)에서 utils 內 read_json은 file을 OrderedDict 형태로 불러옴
  • return cls : ConfigParser 클래스 객체 리턴
    ※ class 메서드 : instance 메서드와 달리 인자에 self가 아닌 cls를 사용하며 return cls()를 통해 클래스 자체 인스턴스를 반환할 수 있다.
  • __getitem__(name) : name 값을 넣어주면 config 파일에서 해당 name 밸류를 뽑아옴
    getitem은 대괄호를 사용하면 자동으로 호출된다.
    e.g. self[name] -> config 파일의 name의 value를 가리키며, self는 object 자기 자신을 가리킴

그 외

  • train.py의 init_obj(‘data_loader’, module_data) : config json file의 값들을 불러옴
  • getattr(module, module_name) : module(class) 내 module name을 가져옴
  • 클래스를 새로 생성했을 때 config json 파일에서만 수정하면 되도록 하는 방식
    e.g. data_loader를 하나 더 생성했을 때, 바뀐 내용을 일일이 코드 수정하지 않고 config에서만 수정함으로써 효율을 늘림 (data_loader 뿐만 아니라 model 수정도 동일)
  • Trainer : 모델, 데이터, 로스 종류 등 파라미터를 전달해 학습 시작
    실제로 학습하는 코드는 base_trainer.py 파일에 존재
  • _save_checkpoint 함수로 중간중간 모델 학습 결과를 저장함

회고

학습 정리

강의를 들으며 배운 내용을 워드에 기록하다, 금주 중반부터 Notion을 이용해 필기하기 시작했다. 처음엔 사용법이 어려울 것 같아 시도도 안 하고 있었는데, 첫 강의 학습 정리부터 쓰지 않은게 후회될 정도로 너무 편리하고 예쁘게 정리되는 것 같다. 모르는 내용이 많아지며 정리해야 할 내용도 계속 늘어나는데, Notion을 잘 활용해 나만의 학습 노트를 잘 만들어 놔야겠다.

마스터 클래스

ChatGPT와 AI 엔지니어를 하기 위해 필요한 역량들을 말씀해주셨다. NLP 분야를 희망하는 나로서 ChatGPT는 혁신이긴 하지만 동시에 일자리에 대한 두려움도 키웠다. 이런 내 상황에 마스터님께서 해 주시는 조언들은 나에게 너무 큰 도움이 되었고, 내가 앞으로 AI 엔지니어링 분야에서 경쟁력을 높이고 살아 남기 위해서 어떤 것들을 공부해야 하는지 감을 잡을 수 있는 시간이었다.

profile
AI-Kid
post-custom-banner

0개의 댓글