본문 바로가기
경제학코딩 2023

[Decoder Data Step]

by 개발도사(진) 2023. 12. 17.

이번 포스팅부터는 위 참조 그림의 우측에 해당하는 영역에 대해 알아본다.

 

우선 실습을 위해 Shakespear의 작품이 담긴 dataset을 가져온다.

!wget "https://raw.githubusercontent.com/Joocheol/Transformer/b96eaede3556f79a0948ef8dc666848380dc9e6e/input.txt"

우리는 이 text를 input 으로 하여 새로운 text를 만들어내는 것을 목표로 한다.

 

필요한 기능들을 import하고 변수를 세팅한다.

import torch
import torch.nn as nn
from torch.nn import functional as F

batch_size = 32
block_size = 8
max_iters = 3000

learning_rate = 1e-3
device = "cuda" if torch.cuda.is_available() else "cpu"

n_emb = 32

block size가 8이라는 것은 한 번에 8글자씩 묶어 한 블럭으로 처리하겠다는 의미, max_iters가 3000이라는 것은 한 번 training을 시킬 때 3000번 iteration할 것이라는 의미이다. n_emb=32는 token 하나를 32 차원 vector로 보겠다는 뜻이다.

 

text를 열고, text에 나오는 문자들의 집합을 만든다.

with open("input.txt", "r", encoding="utf-8") as f:
    text = f.read()
chars = sorted(list(set(text)))

그리고 이 character 들에 대해 각각 index를 지정해 준다. 컴퓨터는 문자 그 자체가 아닌 숫자료 변환해야 이해할 수 있다.

stoi = {ch: i for i, ch in enumerate(chars)}

위 코드를 실행시키고 나면 stoi는 하나의 dictionary가 된다. 따라서 어떤 문자가 몇 번 값을 가지고 있는지 stoi['c']와 같은 식으로 직접 확인할 수 있다. 

 

반대 논리로, 숫자를 다시 문자로 변환하기 위한 인덱싱도 해 줘야 한다.

itos = {i: ch for i, ch in enumerate(chars)}

이제 이 함수들을 이용해서 문자를 숫자로, 숫자로 문자로 변환시키는 함수를 구현한다.

encode = lambda s: [stoi[c] for c in s]
decode = lambda x: "".join([itos[i] for i in x])

 

이제 앞서 다운로드받은 셰익스피어의 text를 숫자로 바꾸고, 앞 90%는 train data로, 뒤 10%는 validation data로 지정해 준다.

data = torch.tensor(encode(text), dtype=torch.long)
n = int(0.9*len(data)) #90%까지만 train data
train_data = data[:n]
val_data = data[n:]

 

 

def get_batch(split):
    data = train_data if split == "train" else val_data
    ix = torch.randint(len(data)-block_size, (batch_size,))
    x = torch.stack([data[i:i+block_size] for i in ix])
    y = torch.stack([data[i+1:i+block_size+1] for i in ix])
    x, y = x.to(device), y.to(device)
    return x, y

위 함수는 매개변수로 받은 값에 따라 train data를 다룰 것인지 validation data를 다룰 것인지 결정하고, 해당 data를 우리가 원하는 (앞서 지정한 batch size*block 형태로) 반환해 주는 역할을 한다. 해당 함수를 통해 traind data의 x를 살펴보면

xb, yb = get_batch('train')
xb

 

'경제학코딩 2023' 카테고리의 다른 글

[Decoder Generator]  (1) 2023.12.17
[Decoder Model]  (1) 2023.12.17
[Attention Mask]  (1) 2023.12.17
[Scaled dot product]  (1) 2023.12.17
[Encoder Only Model with imdb]  (0) 2023.12.17