일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- multi-head attention
- 백준
- Eliza
- Relation Extraction
- MT-DNN
- pytorch
- BLEU Score
- Chatbot
- 취업
- FSML
- Conversation System
- huggingface
- BELU
- bert
- layer normalization
- NLP
- Dialogue System
- text classification
- GPT-1
- Transformers
- Transformer
- KLUE-RE
- scaled dot-product attention
- KLUE
- boj
- beam search
- fine-tuning
- Prompt Tuning with Rules for Text Classification
- ai-tech
- BoostCamp
Archives
- Today
- Total
dukim's blog
[WK03-Day011][21.08.17.Tue] PyTorch Basics 본문
Intro
- PyTorch Basics라서 에이 뭐 쉽겠네하고 방심했는데, 압도적인 과제량과 퀄리티에 다시 한 번 정신차리게 된 하루.
- 복습 내용은 다 적기 보다는 어떤 개념이 언제 필요하다 정도만 정리했습니다.
강의 복습 내용
PyTorch Basics
view vs. reshape
- 결론부터 말하면 view를 쓰면 변환 이전과 이후 tensor가 동일한 메모리 주소를 참조, 하지만 reshape은 다른 메모리 주소에 새로 쓴다. 잘 모르겠으면 view를 쓰자.
- 관련 용어
- contiguous tensor : 메모리에 배열의 값이 연속적으로 저장된 텐서, 텐서를 최초로 만들면 일렬로 펼친 배열로 메모리에 연속적으로 저장됨.
- stride: shape의 각 차원에서 인덱스를 1 증가시킬 때 일렬로 펼쳐진 배열에서 건너 뛰어야할 원소의 개수
- 텐서의 모양을 변경하는 함수 중에는 메모리에 새로 쓰지 않고, 각 차원에 대한 stride만 변경해서 바뀐 모양을 처리하는 함수 또는 메서드들이 있다(변환 전후의 텐서모두 같은 메모리 주소를 참조함)
view
,transpose
,narrow
,expand
- 위 함수들로 변환해 얻은 텐서는 바뀐 모양이 원래 메모리 상에서 저장되어있어야할 순서(즉, 처음부터 그 모양대로 만들었을 때 메모리에 저장된 순서)와 실제 저장된 순서가 다르다. 이러한 텐서를 non-contiguous tensor라 한다.
- non-contiguous tensor는 텐서를 펼칠 때(.view(-1)) 에러가 발생한다. 이와 관련된 내용은 titania7777님의 post 'contiguous란'을 참고
- 이 경우엔
contiguous
(non-contiguous tensor를 contiguous tensor로 만들어주는 메서드)를 사용하여 해결 - 추가 참고 : https://f-future.tistory.com/entry/Pytorch-Contiguous
dot vs. mm vs. matmul
dot
: 스칼라, 벡터의 내적, 행렬 연산 미지원mm
: 행렬곱, 스칼라, 벡터 연산 미지원matmul
:mm
과의 차이점은 broadcasting 지원여부.matmul
은 boradcasting을 지원함# mm은 broadcsting 다음 연산에서 에러발생 a = torch.rand(5,2, 3) b = torch.rand(5) a.mm(b) # matmul은 boradcasting을 지원하므로 0, 1 차원에 대해 broadcasting 적용되 계산됨 a = torch.rand(5, 2, 3) b = torch.rand(3) # broadcasting -> [3, 1] a.matmul(b). # [5, 2, 3] @ [3, 1] -> [5, 2]
unsqueeze vs. squeeze
- 불필요한 차원 제거 / 차원 추가
cartesian_prod
- 두 배열을 입력 받아 각 배열의 원소를 하나씩 선택할 떄 가능한 모든 경우의 수가 담긴 배열을 리턴
import itertools a, b = [1, 2, 3], [4, 5] list(itertools.product(a, b)) # >>> [(1, 4), (1, 5), (2, 4), (2, 5), (3, 4), (3, 5)] import torch tensor_a = torch.tensor(a) tensor_b = torch.tensor(b) torch.cartesian_prod(tensor_a, tensor_b) ''' tensor([[1, 4], [1, 5], [2, 4], [2, 5], [3, 4], [3, 5]]) '''
PyTorch 프로젝트 구조 이해하기
- (프로젝트 템플릿 모범 사례(victoresque/pytorch-template))[https://github.com/victoresque/pytorch-template]
- 이 파트는 내용 정리로는 설명하기 어렵고, 아직 다 살펴보지 못 했다.
- 이번주 내내 pytroch 간단한 tutorial 코드를 이 template 형식으로 작성하는 작업 진행하면서 배울 예정
과제 수행 과정 / 결과물
Custom Model 개발하기
PyTorch OOP 구조
nn.Module
class : 여러 기능들을 담아두는 container 역할, 보다 구체적으로는basic building block
:nn.Module
에 여러 기능을 담아둔 경우Deep Learning Model
:basic building block
을 모아 구성한 모델
Container
- Module을 묶어서 관리할 때 쓰는 자료형
torch.nn.Sequential
: Module들을 하나로 묶어 순차적으로 실행시킬 때torch.nn.ModuleList
: 리스트 형태로 단순히 담아두기만 할 때torch.nn.ModuleDict
:dict
처럼 key, value pair로 담아둘 때
Parameter vs. Tensor vs. Buffer
- Parameter: 모듈 안에서 모델의 weight로써 gradient를 계산하는 텐서(requires_grad=True)로 등록됨
- Tensor: pytorch의 데이터 자료형, gradient를 계산하지 않음
- Buffer: gradient를 계산하지는 않지만 모델과 함꼐 저장되어야하는 tensor(e.g. Batch Normalization에서 mean), 생성자(
__init__
)에서self.register_buffer([buffer 이름], [tensor])
로 등록
named_childeren vs. named_modules vs. named_buffers
- 모델의 메서드로 내부의 module(named_buffers의 경우엔 buffer)의 (이름, 객체) 목록을 iterator 객체로 반환
named_children
: 한 단계 아래읜 sub module까지만 표시named_modules
: 자신에게 속하는 모든 sub module들을 표시named_buffers
: 자신에게 속하는 모든 buffer들을 표시
get_submodule vs. get_parameter vs.get_buffer
- 모델의 메서드로, 각 객체의 이름(위에서 알 수 있음)을 입력 받아 해당 객체를 반환
hook
- 개념: 패키지화된 코드에서 다른 개발자가 custom 코드를 중간에 실행시킬 수 있게 만들어놓은 인터페이스
- 적용 상황:
- 프로그램 실행 로직 분석시
- 프로그램에 기능 추가시
PyTorch의 hook
- 등록하는 곳에 따라 크게 2가지:
Tensor
,Module
Tensor
- 확인:
_backward_hooks
attribute - 등록:
register_hook([hook function])
- 상황: 모델 파라미터의 gradient에 직접 접근할 때, (e.g. `model.[layer].[nn.Parameter].register_hook() 형태로 모델의 parameter의 gradient에 접근 가능)
- hook function 형태:
def tensor_hook(grad): pass
- 확인:
Module
- 확인:
__dict__
로 한 번에 확인 - 상황: Module(의 forward 연산)을 기준으로, input, output gradient를 가져올 떄
- 등록: 실행시점에 따라 hook이 3가지가 있음
register_forward_pre_hook
:- hook function 형태:
def pre_hook(module, input): pass
- hook function 형태:
register_forward_hook
- hook function 형태:
def hook(module, input, output): pass
- hook function 형태:
register_full_backward_hook
- hook function 형태:
def module_hook(module, grad_input, grad_output): pass
- hook function 형태:
- 확인:
- 활용
- gradient값의 변화를 시각화
- gradient값이 특정 임계값을 넘으면 gradient exploding 경고 알림
- 특정 tensor의 gradient값이 너무 커지거나 작아지는 현상이 관측되면
해당 tensor 한정으로 gradient clipping 등
apply
- 상황: 하나의 모델 내의 하위 module 들에 일괄적으로 custom function을 적용할 때(e.g.
.cpu()
, weight initialization) - 작동방식: Postorder Traversal 방식으로 하위 module을 순회하며 custom function 적용
- 조각 코드: apply custom function 예시
- 특정 class name을 가지는 Module에 대해서만 weight initialization
def weight_initialization(module): module_name = module.__class__.__name__ if module_name.find('Function') != -1: print(module_name) module.W.data.fill_(1.0) # apply는 적용된 module return함 initialized_module = model.apply(weight_initialization)
- 특정 class name을 가지는 Module에 대해서만 weight initialization
기타 유용한 정보들
- 모델 검색 소스
- 라이선스 문제, 인용 문제(이 부분은 시간날 때, 필요할 때 다시 볼 것)
피어세션
발표
최한준: 알고리즘 정리
- 최단경로 알고리즘
- Dijkstra Algorithm
- 목적 : 한개의 정점에서 다른 모든 정점으로의 거리를 알고 싶을 때 사용
- Bellman-Ford
- Dijkstra 와의 차이점 : 음수 가중치에대해서도 가능
- 주의할 점 : 음수 사이클이 없으면 다익스트라 ( 시간 복잡도 )
- Floyd-Warshall
- 목적 : 모든 정점에 대해서 모든 경우의 수를 고려하여 최단경로를 갱신 ( 시작 ,중간, 끝 노드를 가질 때)
- Dijkstra 와의 차이점 : 시작 정점이 정해져 있지 않다.
한진: P Stage 향후 계획
- Dijkstra Algorithm
- 전체적인 구조:
Data Exploration -> Data Preprocess -> Model Selection -> HyperParameter Optimization -> Ray tune -> Search Space - Model 로 다른 조와 정확도 차이점 내기 힘들다. 따라서 Data preprocess,Search Space 에 집중하여 정확도를 높여보자
기타 자유 주제
알고리즘이 필요할까?
- 딥러닝 자체엔 필요 없지만 문제해결능력의 객관적인지표
- 개발을 할 때 알고리즘 가끔 필요
- 코드 작성능력 ( 깔끔 )
프로젝트 향후 계획
- 사람이 많아 세부사항을 생각하여 나누자 (기간 , Task 크기)
- Image classification Tutorial -> template화 해서 내용 복습하면서 플젝 대비 준비 운동하자
앞으로의 발표
- P Stage에서 쓰이는 기술을 요약하여 발표 ( Tutorial )
모델 어떤 것을 사용 ?
- CLIP , SOTA중 구현되지 않은 논문 구현..? ( 조금 어려움 ), 그런 모델 말고 사용하기 쉬운 모델에서 파라미터를 조정하여 진행하자
학습 회고
- 분량이 상당해서 내용을 미처 다 소화하지 못 했다.
오늘 남은 학습 내용
- 시각화: 3-1 text. 실습
- PyTorch: 3강 프로젝트 구조 이해: 직접 작성하면서 내용 파악하기
- 필수과제: gather, scatter, linalg.qr, 등 일부 함수의 작동원리, 3D gather, scatter 처리(이거 나중에 NLP 모델 구현시 꼭 필요한 내용)
'Boostcamp AI Tech 2th' 카테고리의 다른 글
[WK03-Day013][21.08.19.Thu] PyTorch Project Template 뜯어보기, Transfer Learning & Hyper Parameter Search (0) | 2021.08.20 |
---|---|
[WK03-Day012][21.08.18.Wed] PyTorch Datasets & DataLoader (0) | 2021.08.19 |
[WK02-Day010][21.08.13.Fri] Generative Models, 주간 회고 (0) | 2021.08.13 |
[WK02-Day009][21.08.12.Thu] RNN, Sequential Models Git&Github 특강 (0) | 2021.08.13 |
[WK02-Day008][21.08.11.Wed] CNN (0) | 2021.08.11 |
Comments