일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 이진탐색
- 그래프이론
- 이코테
- mrc
- dp
- 그리디
- 백트랙킹
- 파이썬 3
- 구현
- 알고리즘스터디
- Level2
- Level1
- 부스트캠프_AITech_3기
- 백준
- 주간회고
- 부스트캠프_AITech3기
- 최단경로
- 정렬
- 개인회고
- U_stage
- 알고리즘_스터디
- ODQA
- 다시보기
- python3
- 기술면접
- 단계별문제풀이
- Level2_PStage
- 글또
- 프로그래머스
- dfs
- Today
- Total
국문과 유목민
[일일리포트] Day 17 본문
해당 일일리포트에서는 네이버 커넥트에서 진행하는 '부스트캠프 AI Tech 3기'에서 배운 내용을 다루고 있습니다. 저작권 이슈 때문에 관련 자료를 올릴 수는 없기에 핵심 이론과 코드를 요약해서 올리고 있기에 내용이 부족할 수 있습니다.
▶ Today I Learned (핵심 요약 정리)
심화과제 풀면서 알게된 것
이번주 심화과제는 VIT(Visual Transformer)와 AAE(Adversarial AutoEncoder)였다. 이번 주에는 Transformer에 대해 공부를 2~3일 정도 쓴 것 같아서 ViT에 대해서 이해한 게 많았던 것 같다. Transformer에 관해 공부한 내용은 이전 리포트에서 다뤘기 때문에 코드를 보면서 이해했던 부분들을 적어두고자 한다. (코드를 올릴 수 없기에 정리하고 싶은 부분만 올릴 예정입니다. 따라서 코드를 전체적으로 보는데 어려울 수 있습니다.)
einops
%pip install einops
from einops import rearrange, repeat, reduce
from einops.layers.torch import Rearrange, Reduce
x.size()
torch.Size([1, 1, 28, 28])
# batchsize, channel, width, height
def __init__(self, in_channels: int = 3, img_size: int = 224, patch_size: int = 16, emb_dim: int = 16*16*3):
super().__init__()
self.rearrange = Rearrange('b c (num_w p1) (num_h p2) -> b (num_w num_h) (p1 p2 c)', p1=patch_size, p2=patch_size) # patch size기준으로 나눈다.
self.linear = nn.Linear(in_channels * patch_size * patch_size, emb_dim)
Einstein Operation이라고 하는 einops는 이번에 처음 봤는데, 파이토치에서 차원을 변경할 때 사용하는 라이브러리라고 한다. 처음에는 낯설었는데 코드를 읽고 다른 코드와 비교해봤을 때 뭔가 더 직관적이었던 것 같아 꽤나 좋아보인다고 생각했다. 위의 Rearrange부분을 보면 기존 b, c, width, height 4차원에서 width와 height를 patch_size로 나눠
b (width/p1 height/p1) (p1 p2 c)의 3차원으로 변경해주는 것을 확인할 수 있다.
더 알고싶다면 다음 포스팅 참고 이제 차원 관리는 einops
encoder block stack
이번에 과제를 하면서 간과했던 부분 중에 하나가 인코더를 쌓는 것이었다. Transformer모델에서도 인코더를 여러 개 쌓을 수 있고, 그렇게 함으로써 성능을 높일 수 있다고 한다. 하지만 처음에 코드로만 봤을 때 해당 부분에 대해서 이해하지 못해서 이 부분을 간과했었다. 아래에서 보면 encoder_block을 ModuleList로 받아줘야 하고, 이 값을 Forward Process에서 리스트로 받아줘야 한다는 것을 기억해야 한다.
class vision_transformer(nn.Module):
""" Vision Transformer model
classifying input images (x) into classes
"""
def __init__(self, in_channel: int = 3, img_size:int = 224,
patch_size: int = 16, emb_dim:int = 16*16*3,
n_enc_layers:int = 15, num_heads:int = 3,
forward_dim:int = 4, dropout_ratio: float = 0.2,
n_classes:int = 1000):
super().__init__()
# image_embedding과 encoder_block은 정의되어있다고 가정
self.image_embeder = image_embedding(in_channel, img_size, patch_size, emb_dim)
self.encoders = nn.ModuleList([encoder_block(emb_dim, num_heads, forward_dim, dropout_ratio) for _ in range(n_enc_layers)])
# self.encoder_module = encoder_block(emb_dim, num_heads, forward_dim, dropout_ratio)
"""
~~생략~~
"""
def forward(self, x):
# 임베딩 정의
x = self.image_embeder(x)
# Transformer 인코더
attentions = []
for encoder in self.encoders:
x, att = encoder(x)
attentions.append(att)
"""
~~생략~~
"""
Stack
마지막으로 Stack에 관한 것이 있는데, Stack의 경우 어느 부분에서 사용해야 하는 것을 알겠다는 느낌이 있었지만 왜 사용하나에 대해서 확답을 하지 못했었다. 그래서 멘토님에게 여쭤본 결과 지정된 Dimension에 tensor를 쌓아주는 역할을 하는 것이라고 말씀하셨다. 아직까지도 '왜'에 대한 해답은 얻지 못했지만 그래도 어느 정도 윤곽이 잡히는 것 같다는 생각이 들었다.
Transformer Attention연산
이번 주 퀴즈로 나왔던 부분이었는데, 조에서도 softmax함수 부분에 대해서 이해가 잘 안돼 멘토님에게 여쭤봤다. 그리고 친절하게 손수 계산을 해서 보내주셔서 확실히 이해할 수 있었다. 따라서 해당 문제를 변형해서 풀어본 내용을 올리도록 하겠다.
오토인코더의 모든 것 _링크
오토인코더 강의로 유명한 이활석님의 '오토인코더의 모든 것' 강의를 듣게 됐다. AE, VAE, GAN과 같은 Generative 모델과 관련된 배경부터 천천히 설명해주시기에 이해하기가 쉬웠던 것 같다. 오토인코더에 대해 알고 싶다면 3시간 30분이 아깝지 않을 것 같다고 생각한다. 해당 강의에 대한 정리는 나중에 기회가 되면 해보고 포스팅으로는 간단하게 강의가 어떤 내용에 대해 다루고 있는지만 얘기하겠다.
해당 강의는 1강부터 3강까지로 나뉘어져 있다. 내가 궁금했던 부분은 2강까지의 내용으로 충분히 설명이 되었고, 시간이 부족해 3강까지는 듣지 못했다. 1강에서는 우선, AE에 대한 간단한 설명을 시작으로 머신러닝에 관한 기본 지식 loss function과 Maximumlikelihood 등을 위주로 진행이 된다. 그리고 manifold learning을 통한 차원 축소와 Density estimation 등에 대해서 설명을 진행하고, AE에 대한 얘기로 구성되어 있다.
2강에서는 VAE나 AAE처럼 앞선 AE의 개념과 연관된 모델 위주로 설명이 진행되었으며, GAN은 마지막에 조금 다루게 된다. 아마 강의의 핵심 주자고 오토인코더이며, 생성모델이 아니기 때문인 것 같다. 2강을 들으면서 새삼 놀랐던 것은 VAE가 AE와 사실은 수학적으로 정의하면 다르지만, 구현을 하려고 봤을 때 같아졌다는 점이었다. 당연히 AE에서 발전되었을 것이라고 생각했는데 아니었다는 점이 좀 신기했던 것 같다.
오토인코더의 모든 것 강의는 딥러닝 분야에 대해서 발만 담궈본 사람도 이해하기 쉬울 정도로 설명을 잘 해준다. 특히 수학적인 부분도 모델의 기반이 되는 것부터 왜 사용이 됐는지에 대해서 설명을 해주기 때문에 궁금증이 많이 해소가 된 거 같다. KL-Divergence를 할 때 예측값과 실제값의 거리를 구하기 위해서라고 막연히 알고만 있었는데 이런 부분들도 알게 됐고, AAE가 GAN의 Discriminator구조를 채택한 이유 등에 대해서도 확실히 알게 된 것 같다. 빠른 시일내에 3강까지 듣고 정리를 한 번 해야겠다고 생각은 드는데, 수학 수식이 많아 할 수 있을지는 잘 모르겠다.
▶ Review (생각)
오늘은 위에서 거의 생각 위주로 정리한 것 같아서 간단하게 넘어가고 주간 회고록에서 정리하도록 하겠다. (금요일날 일일리포트가 길어지면 주간회고록 쓰기가 어렵다....)
'IT 견문록 > 2022_부스트캠프 AITech 3기(100일)' 카테고리의 다른 글
[일일리포트] Day 18 (0) | 2022.02.14 |
---|---|
[4주차] 개인 회고 (0) | 2022.02.11 |
[일일리포트] Day 16 (0) | 2022.02.10 |
[일일리포트] Day 15 (0) | 2022.02.09 |
[일일리포트] Day 14 (RNN 계열) (0) | 2022.02.08 |