æŠèŠ
å人çãªåå¿é²ãå ŒããPyTorchã®åºæ¬çãªè§£èª¬ãšãŸãšãã§ããGPTç·šã§ã¯GPTã¿ã€ã ïŒèªå·±ååž°åã®èšèªã¢ãã«ïŒã®äºååŠç¿ã®æŒç¿ã§åŠãã ããšããŸãšããŠãããŸããå®éã«å°åã®GPTã¢ãã«ã§äºååŠç¿ããŠã¿ãŸãããä»åã¯ãããŠTransformerãããã¯ã®èªäœããããPyTorchã®é¢æ°ã䜿ããã§ããã ãç°¡åã«GPTã¿ã€ããåçŸããããšãå¿ãããŸããã
| 確èªãããäºé | éæåºŠ |
|---|---|
| åŠç¿ããŒã¿ã®åçŸã»æå³ã®ããæç« ãçæããŠãããïŒãããã | â |
| åŠç¿ããŒã¿ã«é¡äŒŒã®æããã®æå³ã®ããæç« ãçæã§ãããïŒã | â³ãâ |
| åŠç¿åéå€ã®å 容ããæç« ãçæã§ãããïŒããããããããã | â |
次ã®ãããªæãã®æç« ãšãªããŸãã
å³ïŒçæçµæã®ãµã³ãã«
æ±ãå 容
- GPTã¿ã€ãã®äºååŠç¿
- Datasetã¯ã©ã¹ã®ã«ã¹ã¿ãã€ãº
- Flash Attention
- æ¥æ¬èªããŒã¿ã§ã®åŠç¿
æ¹é
- ã§ããã ãåãã³ãŒãé²è¡
- ã§ããã ãç°¡æœïŒçްããå 容ã¯å²æïŒ
æŒç¿çšã®ãã¡ã€ã«
-
ããŒã¯ãã€ã¶ãŒ: livedoor_homme_tokenizer_8k.json
- Livedoorãã¥ãŒã¹ã³ãŒãã¹ã®HOMMEã«ããŽãªãŒãããŒã¿ãšããŠbytelevel BPEã§åŠç¿ãã8KããŒã¯ãã€ã¶ãŒ
-
åŠç¿ããŒã¿ïŒlivedoorãã¥ãŒã¹ã³ãŒãã¹ã®livedoor-hommeã«ããŽãªãŒ
-
äºååŠç¿æžã¿ã¢ãã«ïŒhomme_seq_512_bpe_8k.model
- ç³»åé·512ã®ã¢ãã«ãseq_len=512ã§åäœããŸãã
-
ã³ãŒã: sample_38.ipynb
1. ããŒã¿
livedoorãã¥ãŒã¹ã³ãŒãã¹ã®hommeã«ããŽãªãŒã«åé¡ãããŠããããã¹ãããŒã¿ã䜿ããŸãã
- ãã§ã«ããçšåºŠã®ååŠçãè¡ãããŠãããéåžžã«äœ¿ããããç¹
- ãã¥ãŒã¹èšäºãªã®ã§ãããããªæç« ã«ãªã£ãŠããç¹
- ååéããŸãšãŸã£ãŠããç¹
- ãã¡ã€ã«ããšã«å 容ããŸãšãŸã£ãŠããç¹
livedoorã®ãã¥ãŒã¹ã³ãŒãã¹ã¯9ã€ã®åéã«åãããŠãããšæããŸãããä»ã®åéãæ··ãããšãåŠç¿æéãããããŸãããïŒåéåºå®ããæ°æ¥œð
ååŠç
- æé ãã3è¡ã®URLãæ¥ä»ãã¿ã€ãã«ã®åé€ (æŒç¿ã¯ãã®ç¶æ ã§äºååŠç¿ããŸãã)
- ã©ã€ã»ã³ã¹çã«æ¹å€ããããŒã¿ãã¢ããããŒãã§ããªãã®ãæ®å¿µ ð
ð
ååŠçã®è¿œå ç·šã®åèäŸ
ããŒã«ã«LLMãå©çšããŠå å·¥ãããšå¥œã¿ã®æäœã«çµ±äžã§ãããšæããŸãã
- æäœããã§ãã»ãŸãã調ã«èª¿æŽ
- äœèšæ¢ãã§ããéããæã«ãªãããã«èª¿æŽ
2. ããŒã¯ãã€ã¶ãŒ
ããŒã¯ãã€ã¶ãŒãèªäœããŸã1ãByteLevelã®BPEã§ãååŠçæžã¿ããŒã¿ãå©çšããŠããŒã¯ã³æ°8,000ã§åŠç¿ããŠã¿ãŸãããç¹æ®ããŒã¯ã³ã¯ãæç« ã®åºåãã衚ã<|endoftext|>çãªãã®ãäžã€ããã°äºååŠç¿ãšæç« çæãŸã§ã§ããã®ã§ãããæç€ºãã¥ãŒãã³ã°ãèŠéã«å ¥ããŠããããã远å ããŠããŸãð
ãã¯ãªãã¯ã§å±éãããŒã¯ãã€ã¶ãŒçæã³ãŒãã®å šäœåãšãªããŸãã
import glob
from tokenizers import Tokenizer, models, trainers, pre_tokenizers, normalizers
tokenizer_filename = "./tokenizer/livedoor_homme_tokenizer_8k.json" # tokenizerã®ãã¡ã€ã«å
data_dir = "./data/homme" # åŠç¿ããŒã¿ã®ä¿åãã£ã¬ã¯ããªãŒ
vocab_size = 8_000 # èªåœæ°
tokenizer = Tokenizer(models.BPE()) # (1) BPE
tokenizer.normalizer = normalizers.NFKC() # (2) æ£èŠå
tokenizer.pre_tokenizer = pre_tokenizers.ByteLevel(add_prefix_space=False) # (3) ByteLevel
# (4) Trainer
trainer = trainers.BpeTrainer(
vocab_size=vocab_size,
special_tokens=["<pad>", "<eod>", "<system>", "<assistant>", "<user>"],
min_frequency=2,
initial_alphabet=pre_tokenizers.ByteLevel.alphabet(),
)
# (5) data_dirãã£ã¬ã¯ããªå
ã®txtãã¡ã€ã«ãååŸ
data_files = sorted(glob.glob(f"{data_dir}/*.txt"))
# (6) è€æ°ã®txtãã¡ã€ã«ãé çªã«èªã¿èŸŒã
def iterator(filenames):
for filename in filenames:
with open(filename, "rt", encoding="utf-8") as f:
for line in f:
yield line
# (7) åŠç¿
tokenizer.train_from_iterator(
iterator(data_files),
trainer=trainer
)
# (8) ä¿å
tokenizer.save(tokenizer_filename)
print("åŠç¿çµäº")
åŠç¿ããããŒã¯ãã€ã¶ãŒã®ç¹æ®ããŒã¯ã³ãšèªåœæ°ã確èªããŠãããŸããããèªåœæ°ã6,000ã10,000ããããªããããã«æç« ãçæã§ããããªð
from tokenizers import Tokenizer
tokenizer_filename = "./tokenizer/livedoor_home_tokenizer_8k.json"
# å©çšããããŒã¯ãã€ã¶ãŒ
tokenizer = Tokenizer.from_file(tokenizer_filename)
print("ç¹æ®ããŒã¯ã³ID:")
print(f"<pad>: {tokenizer.token_to_id('<pad>')}")
print(f"<eod>: {tokenizer.token_to_id('<eod>')}")
print(f"<system>: {tokenizer.token_to_id('<system>')}")
print(f"<assistant>: {tokenizer.token_to_id('<assistant>')}")
print(f"<user>: {tokenizer.token_to_id('<user>')}")
print(f"size: {tokenizer.get_vocab_size()}")
# ç¹æ®ããŒã¯ã³ID:
# <pad>: 0
# <eod>: 1
# <system>: 2
# <assistant>: 3
# <user>: 4
# size: 8000
ããŒã¯ãã€ãºã®äŸ
ãããByteLevelã®BPEïŒåŠç¿ããŒã¿ã«ååšããªãçµµæåãã¡ãããšåŸ©å
ãããŠããŸãã
å ¥å : ð ããã«ã¡ã¯ð
ID : [177, 258, 251, 227, 225, 298, 300, 270, 379, 282, 177, 258, 243, 235]
埩å : ð ããã«ã¡ã¯ð
å šè§è±æ°èšå·ã¯åè§åããŠããŒã¯ãã€ãºãæ£èŠåãããŸãæ©èœããŠããããã§ãã
å ¥å : ïŒïŒïŒïŒïŒ English
ID : [37, 38, 39, 10, 1877, 23, 9, 3458, 82, 75, 80, 77, 87, 76]
埩å : ABC&123% English
ãããããŠãèšå·ã®ïŒ
ããã©ã³ãã®éœåã§å
šè§ã£ãœã衚瀺ãããŠãããããããŸããããåè§ã«ãªã£ãŠããŸã![]()
次ã«ããŒã¿ãIDåããéšåã«ã€ããŠã§ãã
3. åŠç¿ããŒã¿ã®äœæ
ååŠçæžã¿ã®æ¥æ¬èªããŒã¿ãštokenizerãå©çšããŠidåããŠãããŸããããŒã¿ãµã€ãºã倧ãããªããšäºåã«idåããæ¹ãããããå¹ççãªããã§ããä»åã¯æåæ°ã70äžæåããããªã®ã§Datasetã¯ã©ã¹å ã§idåããŠãããŸã2ãtokenizerããããã倿ŽããŠè©Šããããšããçç±ããããŸãã
ãã ããããŒã¿éãã®ã¬ã¯ã©ã¹ã«ãªããšä»ã®æ¹æ³ã䜿ããªããšå®å šã«ãæäžãð€·ââ
Datasetã¯ã©ã¹ã®ã«ã¹ã¿ãã€ãº
ã«ã¹ã¿ã Datasetã¯ã©ã¹ã¯ç¹æ®ã¡ãœããã®__init__()ã__len__()ã__getitem__()ãå®çŸ©ããã°å®æã§ããããŒã¿ãã¡ã€ã«ã§ã¯ãªããŠãããã¹ãããŒã¿ã®ãã£ã¬ã¯ããªãŒãåŒæ°ãšããŸãã
import torch
from torch.utils.data import Dataset # ã«ã¹ã¿ã Datasetäœæ
from pathlib import Path
class GPTtypeDataset(Dataset):
# (1) tokenizer.encode(text).idsãtextã®IDå
def __init__(self, data_dir, tokenizer, context_size=8, stride=2):
self.context_size = context_size
eod_id = tokenizer.token_to_id("<eod>")
filenames = sorted(Path(data_dir).glob("*.txt")) # ãã¡ã€ã«äžèЧ
# (2) textã«çžåœãããã®ãäœæ
all_ids = []
for filename in filenames:
text = filename.read_text(encoding="utf-8")
document_ids = tokenizer.encode(text, add_special_tokens=False).ids
all_ids.extend(document_ids) # æç« ã®è¿œèš
all_ids.append(eod_id) # åãã¡ã€ã«ã®æ«å°Ÿã«<eod>
# (3) IDåãä¿æãã
self.ids = torch.tensor(all_ids, dtype=torch.long)
# (4) åãµã³ãã«ã®éå§äœçœ®ããããããèšç®
self.starts = range(0, len(self.ids) - context_size, stride)
# (5) ããŒã¿æ°
def __len__(self):
return len(self.starts)
# (6)
# startããcontext_sizeãŸã§ãå
¥åããŒã¿
# start+1ããcontext_sizeãŸã§ã次ã®ããŒã¯ã³äºæž¬ã®ã©ãã«ããŒã¿
def __getitem__(self, idx):
# å
¥åãšã¿ãŒã²ããã®ãã¢ãäœæ
start = self.starts[idx]
x = self.ids[start:start + self.context_size]
y = self.ids[start + 1:start + self.context_size + 1]
return {"ids": x, "labels": y}
説æã¡ã¢
-
(1) __init__()ã®åŒæ°
- context_sizeïŒæç« ã®é·ã
- strideïŒç§»åå¹
filenamesã¯å©çšããtxtãã¡ã€ã«ã®Pathãªããžã§ã¯ãã®ãªã¹ãã«ãªã£ãŠããŸãã倿°åã¯filepathsã®æ¹ãããã®ãããããŸããã
-
(2) filenamesã®ããã¹ããã¡ã€ã«æ¯ã«ãããã¹ãã®èªã¿èŸŒã¿ (Path.read_text())ãidså (tokenizer.encode)ãall_idsãªã¹ããž
ids+eod_idã远å ããŸãã -
eod_idã¯ãã¡ã€ã«ã®æ«å°Ÿã«è¿œå ãããç¹æ®IDã§ãããã¡ã€ã«ããšã«å 容ã倧ããå€ããã®ã§ãæç« ã®å€§ããªåºåãã衚ãããã«<eod>ã䜿ããŸãã -
(3) all_idsãLongTensorãžå€æãæåããŒã¿ãé·ããidåãšããŠä¿ç®¡ãããŠããŸãã40äžããŒã¯ã³ã»ã©ã«ãªããŸã3ã
-
(4) idsããstrideã®å€§ããã§ç§»åãã€ã€ãcontext_sizeããšã«åå²ãããããã®æºåãéå§äœçœ®ã ããstartsãšããŠä¿ç®¡ããŸããrangeãå©çšããŠcontext_sizeæ¯ã«åå²ããããã®éå§äœçœ®çªå·ãæ±ããŸããstrideæ¯ã«ãããã®ãrangeã䜿ãã°ç°¡åã«æ±ãŸããŸãããããããŒã¿ã®indexã«çžåœããŸãã
-
(5) __len__()ã¯context_sizeã«åºåãããããŒã¿æ°ãã€ãŸããéå§äœçœ®çªå·ã®åæ°ãšçãããªããŸãã
-
(6) å ¥åIDåãšæåž«ããŒã¿IDåãäœæããéšåã§ããå ¥åIDã¯ãéå§äœçœ®ããcontext_sizeãŸã§ã®ç³»åé·ãæåž«ããŒã¿IDåã¯ãïŒããŒã¯ã³ããããé·ãcontext_sizeã®IDåãšãªããŸãã
å
·äœäŸ
é°å²æ°ã確èªããããã«ã
- context_sizeã®é·ãã«èª¿æŽ context_size=8
- strideã§ããŒã¿éãªãå ·åãèª¿æŽ stride=2
ãšããŠè¡šç€ºããŠã¿ãŸãããð
data_dir = "./data/homme" # åŠç¿çšããŒã¿ã®ãã£ã¬ã¯ããª
config = ModelConfig(tokenizer=tokenizer)
dataset = GPTtypeDataset(data_dir, tokenizer, context_size=8, stride=2)
- idsãlabelsïŒç³»åé·ïŒ
- idsãšlabelsã¯ïŒããŒã¯ã³ãã
- dataset[0]ãšdataset[1]ã§ïŒããŒã¯ã³ (strideå) ãããŠããã¯ã
idsãšlabelsã¯ïŒããŒã¯ã³ãããdataset[0]ãšdataset[1]ã§ïŒããŒã¯ã³éãã«ãªãã¯ãã§ãã
dataset[0]
{'ids': tensor([3411, 593, 438, 407, 6871, 6903, 527, 265]),
'labels': tensor([ 593, 438, 407, 6871, 6903, 527, 265, 3068])}
dataset[1]
{'ids': tensor([ 438, 407, 6871, 6903, 527, 265, 3068, 5911]),
'labels': tensor([ 407, 6871, 6903, 527, 265, 3068, 5911, 2630])}
å®éã®åŠç¿å Žé¢ã§ã¯ãéå§äœçœ®ãåºå®ãããŠããŸããšããåé¡ãé¿ããããGPTtypeDatasetã®éå§äœçœ®ãã©ã³ãã åããRandomGPTDatasetã¯ã©ã¹ãäœæããŸãã
4. ã¢ãã«èšå®ãšåŠç¿
GPTã¿ã€ãã®åŠç¿ã¯ããæ¬¡ã®åèªäºæž¬åé¡ããè§£ãããšã§ããã³ãŒãã®æµããä»ãŸã§ãšåæ§ã«ã§ããã¯ãïŒ
ããŒã¿ã®èªã¿èŸŒã¿ãštorchãã³ãœã«ãžã®å€æã(4.1)
ãããã¯ãŒã¯ã¢ãã«ã®å®çŸ©ãšäœæã(4.2)
èª€å·®é¢æ°ãšèª€å·®æå°åã®ææ³ã®éžæã(4.3)
倿°æŽæ°ã®ã«ãŒãã(4.4)
æ€èšŒã(4.5)
4.1 ããŒã¿ã®èªã¿èŸŒã¿ãštorchãã³ãœã«ãžã®å€æ
å©çšããã©ã€ãã©ãªãŒãèªã¿èŸŒã¿ãŸãã
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader # ã«ã¹ã¿ã Datasetäœæ
from tokenizers import Tokenizer
from pathlib import Path
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"{device=}")
å©çšããããŒã¿ã»ããã®ãã£ã¬ã¯ããªãŒãããŒã¯ãã€ã¶ãŒãåŠç¿ããã¢ãã«ã®ä¿åãã¡ã€ã«åãæå®ããŸãã
data_dir = "./data/homme/" # åŠç¿çšããŒã¿ã®ãã£ã¬ã¯ããª
tokenizer_filename = "tokenizer/livedoor_home_tokenizer_8k.json"
pretrain_filename = "model/homme_seq_512_bpe_8k.model"
GPTtypeDatasetã¯ã©ã¹ãã©ã³ãã åããDatasetã¯ã©ã¹ã«ãªããŸãã
éå§äœçœ®ãåºå®ããã«ãtorch.randint()ã䜿ã£ãŠéå§äœçœ®ãã©ã³ãã ã«ããã ãã§ãã![]()
class RandomGPTDataset(Dataset):
# (1) åæåéšå
def __init__(
self,
data_dir,
tokenizer,
context_size=256,
samples_per_epoch=10_000,
):
self.context_size = context_size
self.samples_per_epoch = samples_per_epoch
eod_id = tokenizer.token_to_id("<eod>")
filenames = sorted(Path(data_dir).glob("*.txt"))
# (2) textãèªã¿èŸŒã¿ãidå
all_ids = []
for filename in filenames:
text = filename.read_text(encoding="utf-8")
document_ids = tokenizer.encode(text, add_special_tokens=False).ids
all_ids.extend(document_ids)
all_ids.append(eod_id)
# (3) IDãLongTensorãž
self.ids = torch.tensor(all_ids, dtype=torch.long)
# (4) ããŒã¿æ°
def __len__(self):
# 1 epochãããã«äœåã®ã©ã³ãã çªãåŠç¿ããã
# 10,000åïŒåïŒïŒãããã©ã«ãå€
return self.samples_per_epoch
# (5) idxã¯äœ¿ãããæ¯åã©ã³ãã ãªéå§äœçœ®ãéžã¶
def __getitem__(self, idx):
start = torch.randint(
low=0,
high=len(self.ids) - self.context_size,
size=(1,),
).item()
x = self.ids[start:start + self.context_size]
y = self.ids[start + 1:start + self.context_size + 1]
return {"ids": x, "labels": y}
# (6) ããŒã¯ãã€ã¶ãŒåŒã³åºã
tokenizer = Tokenizer.from_file(tokenizer_filename)
# (7) datasetã®äœæãå®éã¯configã®ããšã«å©çšããŸãã
dataset = RandomGPTDataset(
data_dir=data_dir,
tokenizer=tokenizer,
context_size=512, # config.context_size,
samples_per_epoch=10_000, # config.samples_per_epoch
)
æ¢åºã®GPTtypeDatasetã¯ã©ã¹ãã©ã³ãã éå§äœçœ®ã«å€æŽããã ããªã®ã§å€§æ ã«å€æŽã¯ãããŸãããããããéå§äœçœ®ãã©ã³ãã åããããšã§ãããŸããŸãªææžã®æžãåºããåŠç¿ããã¯ãïŒãšããæå³ããããŸãã
説æã¡ã¢
- (1) éå§äœçœ®ãã©ã³ãã ã«éžæãããã®ã§ stride ãšããæŠå¿µããªããªããŸããå€ããã«ãéå§äœçœ®ã®åæ°ãæå®ããŸãã
- (2) pathlib䜿ã£ãŠååŸããtxtãã¡ã€ã«äžèЧã®filenamesãããã¡ã€ã«ãæœåºããŠãããã¹ãããŒã¿ãtextãšããŸããtokenizer.encodeã䜿ãIDåã«å€æããŸããïŒãã¡ã€ã«ããšã«çµç«¯IDã®<eod>ã远å ããŸãã
- (3) all_idsãšããIDåãLongTensorãžå€æããŸãã
- (4) ããŒã¿ã®åæ°ã衚ã__len__()ã¯ãã©ã³ãã ã«æœåºãããåæ°ãªã®ã§samples_per_epochãã®ãã®ã§ãã
- (5)
torch.randint()ãå©çšããŠãéå§äœçœ®ãååŸããŸãã__getitem__()ã®åŒæ°ã§ããidxã«ç¡é¢ä¿ã«ãã©ã³ãã ã«IDåãéžæããããã«ããŸãã
ä»ãŸã§ã®æµãã«åãããã®ã§ããã®äœçœ®ã«ããŒã¿ååŸãæ¥ãŠããŸãããcontext_sizeãsamples_per_epochãã¢ãã«èšå®ã¯ã©ã¹ã«èšèŒãã圢ã®ã»ããã¹ããŒãã«èŠããŸããæ¬æ¥çã«ã¯ããå°ãåŸåã«ããŒã¿ååŸãèšèŒããã»ããèŠããããšæããŸã![]()
![]()
![]()
4.2 ãããã¯ãŒã¯ã¢ãã«ã®å®çŸ©ãšäœæ
ModelConfigã¯ã©ã¹ã§ãç³»åé·ãç¹æ®ããŒã¯ã³ã®IDãããããµã€ãºãªã©ã®åºæ¬çãªæ°å€ãå®ããŸããDNNã¯ã©ã¹ã§GPTã¿ã€ãã®ãããã¯ãŒã¯ã¢ãã«ãæ§æããŸãã
4.2.1 ã¢ãã«ã®èšå®
class ModelConfig:
def __init__(self, tokenizer):
# ã¢ãã«æ§é
self.vocab_size = tokenizer.get_vocab_size()
self.seq_len = 512 # VRAMè¶³ããªãå Žåã¯128ãžãSFTãèãããš256ã¯å¿
èŠ
self.d_model = 256 # 512 ã¢ãã«åŠç¿ãããŸãè¡ããªãå Žå512ã«ãããVRAMãå¢ããã®ã§æ³šæ
self.nhead = 8
self.dim_feedforward = 4*self.d_model
self.num_layers = 6
self.dropout = 0.1
# ç¹æ®ããŒã¯ã³ID
self.pad_token_id = tokenizer.token_to_id("<pad>")
self.eod_token_id = tokenizer.token_to_id("<eod>")
# åŠç¿ããŒã¿ã«é¢ããèšå®
self.context_size = self.seq_len # åŠç¿ã§ããé·ã
self.context_stride = self.context_size # éãªãå
·åã®èª¿æŽïŒäœ¿ããªãïŒ
self.samples_per_epoch=10_000 # 1epochã®ããŒã¿æ°ãã©ã³ãã éå§äœçœ®ã®åæ°
# åŠç¿èšå®
self.batch_size = 128 # VRAMèŠãªããseq_lenãšåãããŠèª¿æŽ
self.learning_rate = 0.001 # ããã ãšããã©ã«ããšå€ãããªã
self.num_steps = 5500 # ç¹°ãè¿ãã¹ãããæ°
self.max_grad_norm = 1.0
ModelConfigã¯ã©ã¹ãšãã£ãŠããæ°å€ã䞊ã¹ãŠãã ãã®ã¯ã©ã¹ã§ããç³»åé·ã衚ãseq_lenã«ã¯æ³šæãå¿ èŠã§ããå°ãããããšæç« ãããŸãçæããããšãã§ããŸãããã倧ããªæ°å€ã ãšãæ¶è²»ãããVRAMã巚倧åããŸããç°¡æçãªãæç€ºãã¥ãŒãã³ã°ãŸã§èæ ®ãããšã256ããŒã¯ã³ä»¥äžã¯å¿ èŠãšæãããŸããäºååŠç¿ããŠæç« ã®çæçµæã確èªããã ããªããç³»åé·ã®seq_len=128ãšããŠã10åçšåºŠ (Colab T4) ã§åŠç¿ãçµäºããŸãã
4.2.2 GPTã¿ã€ãã®ãããã¯ãŒã¯ã¢ãã«

å³ïŒGPTã¿ã€ãã®ãããã¯ãŒã¯æ§é
GPTã¿ã€ãã®ãããã¯ãŒã¯ã¢ãã«ã¯ã倧ãŸãã«ããåã蟌ã¿å±€ãcausalãã¹ã¯ä»ãã®transformerå±€ãå šçµåå±€ã§æ¬¡ã®åèªäºæž¬ããšãã圢ã«ãªããŸããåããŒã¯ã³ããšã«ãæ¬¡ã«æ¥ãããŒã¯ã³ããäºæž¬ããèªå·±ååž°ã¢ãã«ãšãªããŸãã
class DNN(nn.Module):
def __init__(self, config: ModelConfig):
super().__init__()
self.config = config
# (1) åã蟌ã¿å±€ pad id åŠç¿ããªã(ä»åååšããªãã¯ã)
self.token_embedding = nn.Embedding(num_embeddings=config.vocab_size, embedding_dim=config.d_model, padding_idx=config.pad_token_id)
self.pos_embedding = nn.Embedding(num_embeddings=config.seq_len, embedding_dim=config.d_model)
self.dropout = nn.Dropout(config.dropout)
# (2) Transformer layers
# TransformerEncoderã ãã©ãå³äžè§ã«maskã€ããã®ã§ãã¹ã¯ä»ãèªå·±æ³šæã®ã¿ã€ãã«ãªã
causal_transformer_layer = nn.TransformerEncoderLayer(
d_model=config.d_model,
nhead=config.nhead,
dim_feedforward=config.dim_feedforward,
dropout=config.dropout,
activation="gelu",
batch_first=True,
norm_first=True # æ£èŠåã®å Žææå®
)
self.transformer = nn.TransformerEncoder(causal_transformer_layer, num_layers=config.num_layers, enable_nested_tensor=False)
# (3) æåŸã®åºåã«åããæ£èŠåãšFCå±€ãæçµçã«åèªæ°ã«ãªã
self.layer_norm = nn.LayerNorm(config.d_model)
self.fc = nn.Linear(config.d_model, config.vocab_size,bias=False)
self.apply(self._init_weights) # åã蟌ã¿éšåã®åæéã¿å€æŽ
self.fc.weight = self.token_embedding.weight # (4) å
šçµåå±€ãšåã蟌ã¿å±€ã®éã¿å
±æ
# (5)
def _init_weights(self, module):
if isinstance(module, nn.Linear):
nn.init.normal_(module.weight, mean=0.0, std=0.02)
if module.bias is not None: # fc 㯠bias=False ãªã®ã§ã¹ããã
nn.init.zeros_(module.bias)
elif isinstance(module, nn.Embedding):
nn.init.normal_(module.weight, mean=0.0, std=0.02)
if module.padding_idx is not None: # 㯠None ãªã®ã§ã¹ããã
with torch.no_grad():
module.weight[module.padding_idx].zero_()
def forward(self, x):
seq_len = x.size(1)
positions = torch.arange(seq_len,device=x.device)
tok_emb = self.token_embedding(x)
pos_emb = self.pos_embedding(positions).unsqueeze(0)
x = tok_emb + pos_emb
x = self.dropout(x)
# (6) nn.Transformer.generate_square_subsequent_mask ã䜿ã£ãŠãã¹ã¯ãçæ
causal_mask = nn.Transformer.generate_square_subsequent_mask(seq_len, dtype=torch.bool, device=x.device)
# (7) èªå·±ååž°å transformer (transformer decoder)
x = self.transformer(x, mask=causal_mask, is_causal=True)
x = self.layer_norm(x)
# NTPïŒæ¬¡ã®ããŒã¯ã³äºæž¬
logits = self.fc(x)
return logits
説æã¡ã¢
- (1) ããŒã¯ã³ããã¯ãã«åãã
token_embeddingãšãäœçœ®æ å ±ããã¯ãã«åããpos_embeddingãè¶³ãåãããŸãã - (2) PyTorchã§ã®ååãTransformerEncoderLayerãªã®ã§æ³šæããéšåãcausal mask(å³äžäžè§ã®ãã¹ã¯)ãä»ããŠéããŸãããããéèŠãªãã€ã³ãïŒ
TransformerEncoderLayerã䜿ã£ãŠããã®ã«ãæªæ¥ã®ããŒã¯ã³ãèŠããªããããšã§ãå®è³ªãã³ãŒã(èªå·±ååž°)ãšããŠåäœãããŠããŸãã - (3)
LayerNormâfcã§vocab_size次å ã«å°åœ±ããããåäœçœ®ã§ã®æ¬¡ããŒã¯ã³ã®ã¹ã³ã¢(logits)ãšãªããŸãã
泚æç¹
- (2) Pre-LNãšåŒã°ããçœ®ãæ¹ã
norm_first=Trueãªãã·ã§ã³ãå©çšããããšã§ãæ£èŠåãåãµãå±€ã®åã«çœ®ãGPT-2以éã®Pre Layer NormalizationãšãªããŸããæ·±ãã¢ãã«ã§ãåŸé ãå®å®ãããããªããŸããä»åã¯æµ ãã§ããã
- (4) éã¿å
±æ (weight tying) ãšåŒã°ããææ³ã§ããå
¥ååã蟌ã¿ãšåºåå°åœ±ã®éã¿ãå
±æããŠããŸãããã©ã¡ãŒã¿åæžãšæ§èœåäžãçãã§ãå
šçµåå±€
fcã®ãã€ã¢ã¹é ãbias=FalseãšããŠå ±æã«åãããŠããŸãã2026幎çŸåšãéã¿å ±æããªã髿§èœã¢ãã«ãç»å ŽããŠãããè³åŠäž¡è«ã®ç¶æ ïŒïŒãã®ã¬ãã«æã§ã¯å šãç¡æå³ã§ãã
- (5) GPT-2åŒã®åæåãä»åå°å
¥ãããè¿·ã£ãæ¹æ³ã§ãã
std=0.02ã®æ£èŠååžã§åæåããã®ã¯ã©ããGPTã¿ã€ãã®å®çªèšå®ã®ãããªã®ã§ããã¯ãå°å ¥ããŸãã
2ã€ããifæã§ãããbiasãpadã䜿ã£ãŠããªãã®ã§ãäºå®äžæ©èœããŠããªãã®ã§ãããæ £äŸã£ãœãã®ã§ã€ããŠããŸã£ãã - (6) Encoder + causal mask = decoderåã«ããèªå·±ååž°ã¢ãã«ã®å®è£
ã
nn.TransformerEncoderã¯BERTã¿ã€ãã§ãå©çšããããã«ãã¹ã¯ãªãã®åæ¹åã¢ãã«ãšãªããŸãããããïŒgenerate_square_subsequent_mask ã§äœã£ãå æãã¹ã¯ãæž¡ãããšã§ãäœçœ® i ãåç §ã§ããã®ã 0ãi ã ãã«å¶éã§ããŸããããã§æ¬¡ããŒã¯ã³äºæž¬ãæ£ããæç«ããŸããboolãã¹ã¯ãªã®ã§ True ã®äœçœ®(æªæ¥åŽ)ããèŠãªãã ãšããæå³ã«ãªããŸãã - (7) is_causal=True
ãã¹ã¯ãæž¡ãã€ã€ãã®ãã©ã°ãç«ãŠãã®ã¯ãããã®ãã¹ã¯ã¯å æãã¹ã¯ã ããšããæé©åã®ãã³ããšãªããŸããèªåçã«å æãã¹ã¯ãäœæãããããã§ã¯ãªãã®ã§èŠæ³šæã§ãã
ã¢ãã«ã®ç¢ºèª
tokenizerãæå®ããŠãModelConfigã䜿ã£ãŠèšå®ãèªã¿èŸŒã¿ãŸããModelConfigãã¢ãã«é¢é£ã®éšåãšåŠç¿é¢é£ã®éšåã«åå²ããã»ããè¯ãããã§ããðŸ
config = ModelConfig(tokenizer)
model = DNN(config).to(device)
torchinfoã§å€§ãŸããªæ§é ãšãã©ã¡ãŒã¿æ°ã確èªããŸããã
from torchinfo import summary
summary(model)
summaryéšåã«ã²ãšå·¥å€«ããã°ãå ¥åºå圢ç¶ã衚瀺ãããããã§ãã
==========================================================================================
Layer (type:depth-idx) Param #
==========================================================================================
DNN --
ââEmbedding: 1-1 2,048,000
ââEmbedding: 1-2 131,072
ââDropout: 1-3 --
ââTransformerEncoder: 1-4 --
â ââModuleList: 2-1 --
â â ââTransformerEncoderLayer: 3-1 789,760
â â ââTransformerEncoderLayer: 3-2 789,760
â â ââTransformerEncoderLayer: 3-3 789,760
â â ââTransformerEncoderLayer: 3-4 789,760
â â ââTransformerEncoderLayer: 3-5 789,760
â â ââTransformerEncoderLayer: 3-6 789,760
ââLayerNorm: 1-5 512
ââLinear: 1-6 2,048,000
==========================================================================================
Total params: 8,966,144
Trainable params: 8,966,144
Non-trainable params: 0
==========================================================================================
ð€900äžãã©ã¡ãŒã¿ãšãªããŸãð€ ã¢ãã«ãµã€ãºã9Mãå¿é
ãªãããå°ããã§ã![]()
4.3 èª€å·®é¢æ°ãšèª€å·®æå°åã®ææ³ã®éžæ
ååããããŸãå€ãã£ãŠããŸããã
optimizer = torch.optim.AdamW(model.parameters(),lr=config.learning_rate)
criterion = nn.CrossEntropyLoss()
AdamWã䜿ã£ãŠããã®ã§ãéã¿æžè¡° (weight decay)ãããã£ãŠããŸãããã®ããããæ€èšã®äœå°ãã![]()
4.4 倿°æŽæ°ã®ã«ãŒã
ããããåŠç¿ã«ãŒãã§ããRandomGPTDatasetã¯ã©ã¹éšåã§å ¥åãããããŒã¿ã¯æ¯åã·ã£ããã«ãããŸããDataLoaderã§ã®ã·ã£ããã«ã¯Falseã§OKã§ããã¹ãããæ°ã§ã«ãŒãã®ç®¡çãããŸãã
# datasetã®äœæ
dataset = RandomGPTDataset(
data_dir=data_dir,
tokenizer=tokenizer,
context_size=config.context_size,
samples_per_epoch=config.samples_per_epoch
)
dataloader = DataLoader(
dataset=dataset,
batch_size=config.batch_size, # ã¡ã¢ãªè¶³ããªãå Žåã¯å°ãããã
shuffle=False, # shuffleã¯Datasetã¯ã©ã¹ã§è¡ãããŠãã
drop_last=True,
num_workers=0, # é
ãå Žåã¯ïŒãïŒïŒ
pin_memory=torch.cuda.is_available(), # GPU䜿ãæTrue
)
# stepæ°ã§ç®¡çããããã®ããŒã¿ããŒããŒé¢æ°
def infinite_loader(dataloader):
while True:
for batch in dataloader:
yield batch
data_iter = infinite_loader(dataloader) # epochã§ã¯ãªããstepæ°ã§èšæž¬
# ---- åŠç¿ã«ãŒãã®èšå®ãtqdmã䜿ããªãã»ããã·ã³ãã«
from tqdm import tqdm # tqdmã䜿ãé²æç¶æ³è¡šç€ºãããŠã¿ã
max_iters = config.num_steps # stepæ°
total_token = 0 # 环ç©ããŒã¯ã³æ°ãåæå
pbar = tqdm(range(max_iters))
use_bf16 = torch.cuda.is_available() and torch.cuda.is_bf16_supported() # flash attentionãå©çšã®å€å®
# ---- ããããåŠç¿ã«ãŒã
model.train() # trainã¢ãŒããæç€º
for step in pbar:
batch = next(data_iter)
input_ids = batch["ids"].to(device, non_blocking=True)
labels = batch["labels"].to(device, non_blocking=True)
optimizer.zero_grad()
# GPUã察å¿ããŠããå Žåã¯ãbf16ãžå€æŽããŠflash attentionã䜿ã
with torch.autocast(device_type=device.type, dtype=torch.bfloat16, enabled=use_bf16):
outputs = model(input_ids) # [batch, seq_len, vocab_size]
loss = criterion(
outputs.view(-1, config.vocab_size), # [batch * seq_len, vocab_size]
labels.view(-1), # [batch * seq_len]
)
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=config.max_grad_norm) # åŸé
ã¯ãªãã
optimizer.step()
# ãã®stepã®ããŒã¯ã³æ° ïŒããããµã€ãºÃç³»åé·ïŒãå ç®
total_token += input_ids.shape[0] * input_ids.shape[1]
# set_postfixã¯èŸæžãåŒæ°ã«ãªã
pbar.set_postfix({"loss": f"{loss.item():.4f}", "tokens": f"{total_token/1e6:.2f}M"})
if (step+1) % 500 == 0:
tqdm.write(f"{step+1}-step:\tloss:{loss.item():.3f}\ttokens:{total_token:,}")
衚瀺çšã®èšå®ãšåœ¢ç¶å€æŽã§ãè€éã«èŠããŸãããåºæ¬æ§é ã¯ååããå€ãã£ãŠããŸãã![]()
for ã«ãŒã
input_ids, labelsïŒå
¥åããŒã¿ãšæåž«ããŒã¿
optimizer_zero_grad()
outputs = model(input_ids)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
lossã1ãäžåããããã«ãªããŸã§é 匵ã£ãŠåŠç¿ãããŸããåŠç¿ããŒã¿ãã¢ãã«ãèªåœãµã€ãºã®é¢ä¿ãããªã®ã詳现ã¯äžæã§ãããlossã¯0.5çšåºŠãäžåããšæããŸããæç« ãå šæèšããã¬ãã«æã§ã4ãããå人çã«ããã€ã³ãïŒããšæãéšåã§ããGPTã¢ãã«ã®äºååŠç¿æŒç¿ã ãšãã¢ãã«ã®æ§é ã«éç¹ã眮ãããŠããã®ã§ãå°ãå€ã ãã©æ¥æ¬èªã£ãœãæç« ãçæããããšããå 容ã§çµããããšãå€ãå°è±¡ããããŸããåŠç¿ããŒã¿ã®ã³ããŒã«è¿ãå 容ã§ãã£ãŠããã£ããããæç« ã衚瀺ããããšã¢ãããŒã·ã§ã³ã»ãã³ã·ã§ã³ãäžããã®ã¯ç§ã ãããªð
ã¡ã¢ãªãŒãè¶³ããªããšãããšãã¯ç³»åé·ãããããµã€ãºãç°å¢ã«åãããŠèª¿æŽããŠãã ããã15åçšåºŠã§çµäºã«ãªããšæããŸããä»åã¯åŠç¿çåºå®ã§ããããwarmup + cosine decayããšããã®ããã®åéã®å®çªã®ããã§ãã
説æã¡ã¢
-
(1) Flash Attentionã䜿ããGPUã®ãšãã¯äœ¿ããšããåå²ãšãªããŸããColab T4ã®å Žå㯠æ®å¿µãªããFlash Attention 䜿ããªã (T_T)
-
nn.TransformerEncoderLayer ãå©çšããŠããæç¹ã§ãscaled_dot_product_attentionãå éšã§åããŠããŸããç¹ã«ã¢ãã«ã®éšåã§ãããŒã¿ã®åãFlash Attentionãéžæãããããã®æ¡ä»¶ã§ããbf16ã«å€æŽããã°ãå¯èœãªãã°Flash Attentionãé©çšãããã¯ã
5ã -
lossã¯çŸåšåŠç¿äžã«ãããã«å¯ŸããŠã®æå€±ãšãªããŸãã衚瀺ãããlossãåæ§ã§ããããŸããŸæå€±ãå°ãããšããããšãããããŸãã
4.5 æ€èšŒ
åŠç¿ã§åå°œããð¢
æç« çæã®é¢æ°ã¯ãæå€§ç¢ºçãšãªãããŒã¯ã³ãç¹ãã§ããçŽ æŽãªGreedyã¿ã€ãã§ããtop_ã颚ãå°ãå
ãŸã§èŠãŠããã¿ãããªããŒã ãµãŒãã岿ããŸãã
ãã®ããããããã調ã¹ãŠã¿ãããª![]()
@torch.inference_mode()
def generate_text(
model,
input_ids,
max_new_tokens=config.seq_len,
eos_token_id=None,
):
model.eval() # è©äŸ¡ã¢ãŒããž
generated = input_ids.to(device)
seq_len = model.config.seq_len
# greedyã§åçŽã«çæ
# eos_token_idãorãmax_new_tokensãŸã§ã§çæçµäº
for _ in range(max_new_tokens):
logits = model(generated[:, -seq_len:]) # åèªäžã®ç¢ºçãèšç®
next_token = logits[:, -1, :].argmax(dim=-1, keepdim=True) # 確çãæå€§ã®ããŒã¯ã³éžæ
generated = torch.cat([generated, next_token], dim=1) # äºæž¬idã远èš
# çµäºå€å®
if eos_token_id is not None and next_token.item() == eos_token_id:
break
return generated
idåãããæååinput_idsãå ¥åããŠãmodelã䜿ããæ¬¡ã®ããŒã¯ã³ãäºæž¬ããŠãããŒã¯ã³è¿œå ãç¹°ãè¿ãã ãã§ããæç« çæçµç«¯IDã®eos_token_idãäºæž¬ããããæç« çæçµäºãšãªããŸããeos_tokenãšããŠã<eod>ãå©çšããŸãã
from tokenizers import decoders
tokenizer.decoder = decoders.ByteLevel()
# 次ã®åèªã«ç¶ããããæãå
¥åãåçŽã«äžŠã¹ãŠããŸã£ã(ç¬)
prompt = "ãšãŒãããæå€§ã®ãã£ãããã¹ãã·ã³ã¡ãŒã«ãŒ"
#prompt = "ãã¬ãã®ãã©ãšãã£çªçµãªã©ã§ç¬ããå·»ãèµ·ãããç¬ãèžäºº"
#prompt = "ãã¥ã¢ã«ã¯ã©ããA/Tãã¢ã«ãã¡TCTã"
#prompt = "転è·ã«ãããåžå ŽäŸ¡å€ãã¢ãããããããã®ã¹ãã«ãç¥èãããŠããŠ"
#prompt = "æ°ååžå Žã«ããã䟡å€ãã¢ãããããããã®ã¹ãã«ãç¥èãããŠããŠ"
#prompt = "SNSã§ã®é
åãã¢ãããããããã®ã¹ãã«ãšç¥è" # NG
#prompt = "å³ã§èããåã«ãã£ãŠãåé¡ãæŽçã»åæ"
model_input = tokenizer.encode(prompt, add_special_tokens=False)
input_ids = torch.tensor([model_input.ids], dtype=torch.long, device=device)
output_ids = generate_text(
model=model,
input_ids=input_ids,
max_new_tokens=256,
eos_token_id=config.eod_token_id,
)
# å
šæããã³ãŒã
print("--- çæçµæ ---")
generated_text = tokenizer.decode(output_ids[0].tolist(), skip_special_tokens=False)
print(generated_text)
åŠç¿ããŒã¿ã«ããæžãåºãã ãšãã»ãŒåŠãã æãåºåãããšæããŸããç°ãªãå 容ã ãšããŸãã§ãã¡ãªæç« ãšãªããŸãã
çæçµæã®äŸïŒ
- å ¥åæïŒããšãŒãããæå€§ã®ãã£ãããã¹ãã·ã³ã¡ãŒã«ãŒã
åŠç¿ããŒã¿ã«é¡äŒŒã®æç« ïŒç°ãªãæç« ïŒããã§ãã
--- çæçµæ ---
ãšãŒãããæå€§ã®ãã£ãããã¹ãã·ã³ã¡ãŒã«ãŒããã¯ããžã ã瀟ã¯ãã2010 FIFAã¯ãŒã«ãã«ããåã¢ããªã«å€§äŒãã®ãã£ãããã¹ãã·ã³ã®ãªãã£ã·ã£ã«ã»ãµãã©ã€ã€ãŒã«éžå®ãããŸããã
å倧äŒã§ã¯ããã¯ããžã 瀟ããåºå Ž32ã¶åœäž16ã¶åœã®åããŒã ã®ããŒã¹ãã£ã³ããåœéã¡ãã£ã¢ã»ã³ã¿ãŒããããŠãå²äžåãšãªã審å€å¡æœèšã®å
š18ã¶æã®ãã¬ãŒãã³ã°æœèšã«ãã£ãããã¹ãã·ã³ãèšçœ®ããŸãã
ãã¯ããžã ã®æ¬ç€Ÿãããã€ã¿ãªã¢ãã¯ããããã©ã³ã¹ããã©ãžã«ãã€ã®ãªã¹ãã¢ã«ãŒã³ãã³ã®åŒ·è±ªãã£ã³ããªã³åè£ããŒã ã®ã»ããéå¬åœã®åã¢ããªã«ãæ¥æ¬ã®éžæãã¡ãå«ãããã¯ããžã ã®ãã·ã³ã§ãã¬ãŒãã³ã°ãè¡ãã詊åã«æãããšã«ãªããŸãã
åãã¬ãŒãã³ã°ã»ã³ã¿ãŒã«å°å
¥ããã補åã¯ä»¥äžã®éãã§ãã
ã»KINESIS:çåããã©ã³ã¹åãæè»æ§ãåæã«éããããšãã§ãããã·ã³ããµãã«ãŒã«ãããç¹å®ã®åãã®ãã¬ãŒãã³ã°ãå¯èœã§ãã
ã»FLEXabilility:æªæã®äºé²ã«æ¬ ãããªãã¹ãã¬ãããçŽ æ©ãç確ã«è¡ãããã·ã³ã
ã»VARIO:åçŽãªã¹ãããåäœãã倧ããªã¹ãã©ã€ãåäœãŸã§ãèªç±ãªåããå¯èœãªæ°æèŠã®ãšãªã
éäžããåŠç¿ããŒã¿ãšåäžã®åºåã«ãªã£ãŠããŸããããæå³çãéãã§ãã
çæçµæã®äŸïŒ
- å ¥åæïŒããã¥ã¢ã«ã¯ã©ããA/Tãã¢ã«ãã¡TCTã
<eod>ã§æç« çæãæ¢ãŸããŸãã
--- çæçµæ ---
ãã¥ã¢ã«ã¯ã©ããA/Tãã¢ã«ãã¡TCTã瀟ã®ããŒãããã¡Tããããã«ã¢ã€ããªã³ã°ã¹ãããã·ã¹ãã ãæèŒãã仿§ãå°å
¥ãããäºå®ã§ãã
ä»åãäŒå Žã«å±ç€ºãããã®ã¯ãæé«åºå235ps/5500rpmãæå€§ãã«ã¯34.6kg-m/1900rpmã®1.75ãªãã¿ãŒçŽåŽã¬ãœãªã³ã¿ãŒããšã³ãžã³ãš6éM/TãæèŒããæäžçŽã¢ãã«ã1750 TBiãã§ããã¬ã¶ãŒå
è£
ãã¯ã¢ããªãã©ãªãªãŽã§ã«ããšã³ãã¬ã ã18ã€ã³ãã¢ã«ããã€ãŒã«ãªã©ã泚ç®ãéããŸããã<eod>
ããŒãããã¡Tãã®æ«å°Ÿã«ããæ¬åŒ§ãæ°ã«ãªããŸãããããããªæç« ãçæããŠããŸãã
çæçµæã®äŸïŒ
- å ¥åæïŒãããã«ã¡ã¯ã
åŠç¿ããŒã¿ã«ååšããªãæžãåºãã ãšãå€ãªåºåã«ãªããŸããéäžããããªã«ãã®ã³ããŒæãžç§»ããŸãããã®ããããéåŠç¿ãã圱é¿ã§ããäœäºããªãã£ããã®ããã«ãéäžããåŠç¿ããæç« ãåºåããã®ãè峿·±ãã§ãããð€
--- çæçµæ ---
ããã«ã¡ã¯ãå®¶æã倧äºã«å€ãã£ãŠãããã§ããããããšãã€ãããå®¶æãžã®å¥œæåºŠãèªããŸããã
ä»åã®ãã«ã¢ãã«ãã§ã³ãžã§2代ç®ãšãªãæ°ã©ã¯ãã£ã¹ã¯ãå
šé·4ã¡ãŒãã«ã®ã³ã³ãã¯ãããã£ãªãããããšãã®ãã宀å
空éãšäœçè²»ãå®çŸãããã³ã³ãã¯ã2BOXãã§ããæ±ãããã5ãã³ããŒãµã€ãºãç¶æãã€ã€ãèµ°è¡çè²»ã20km/Lãšãããšã³ã«ãŒæžçšå¯Ÿè±¡å
ã«èšå®ãããªã©ããŠãŒã¶ãŒãžã®é
æ
®ãæããããç¹ããã€ã³ãã§ãã
ãŸããããšãã®ããåŸéšåº§åžã®è¶³å
ã¹ããŒã¹ãããããããŒãã®é«ãã2段éã«èª¿æŽã§ããã¢ãžã£ã¹ã¿ãã«ãããããŒãã®æ¡çšãªã©ãå€çšéã§è€æ°äººã§ã®äœ¿çšãåæãšããèšèšããªãããŠããç¹ãããã¡ããªãŒãŠãŒã¶ãŒã匷ãæèããŠããããšãæããããŸãã
ãšã³ãžã³ãµã€ãºã¯1.3ãªããã«ãš1.5ãªããã«ãš1.5ãªããã«ã®2ã¿ã€ãã§ã4WDè»ãã©ã€ã³ã¢ãããããŸããè²©å£²äŸ¡æ Œã¯144äž5000åããã§ãã
ãã©ã¯ãã£ã¹1.3L äž»èŠã¹ããã¯ã
å
šé·Ãå
šå¹
Ãå
šé«:3995Ã1695Ã1585
ãã€ãŒã«ããŒã¹:1485/1475
è»äž¡éé:1090
ä¹è»å®å¡:5
é§åæ¹åŒ:F
çæçµæã®äŸïŒ
- å ¥åæïŒãæšå€ã®å°é¢šã¯10幎ã«äžåºŠã®èŠæš¡ã ã£ãã
åŠç¿ããŒã¿ãšå
šãç¡é¢ä¿ã®å
¥åæã§ãããªã«ãã®ã€ã³ã¿ãã¥ãŒïŒã®ãããªåºåçµæãšãªããŸãããç¡çããåŠç¿ããŒã¿ã®å
容ã«åãããŠããæããããŸã![]()
--- çæçµæ ---
æšå€ã®å°é¢šã¯10幎ã«äžåºŠã®èŠæš¡ã ã£ããã§ããã?
éå:ä»ãŸã§ã®å¹
ã«å
¥ã£ã話ã§ã¯ãªããã©ãææ®µãéžã°ãªãææ®µãéžã°ãªãã§ã極ããŠäžè¬çãªã¹ã¿ã€ã«ã¯èšãããã®ã¹ã¿ã€ã«ã¯èšãã³ããããã¯ãªã§ããããä»ã§ã¯ããã®ã¹ã¿ã€ã«ã¯æä»äºã§ã»ã¬ã¯ããããªãããæ¥ããããæããç¹ãè²ã®è©±ãé²ãã§åž°ã£ãŠãããšèšã£ãŠèŠããŸããéã«ããã®äžã§ããããŒã«ãã¡ãã·ã§ã³ãã§ãªãªãžãã«ãã©ã³ããæ¥ããããæããã ãã§ãé«ããããããŸãããç¹ã«äžè¬çãªç¹ã§ã¯ããã¡ãã·ã§ã³é¢ã§ãé«ããããããŸããã
ããªãªãžãã«ãã©ã³ãã®å©ççã¯ãã©ã®ãããã§ãã?ã
Wãã:ã»ã¬ã¯ãã·ã§ããã«ãããã£ãŠããã«ã¯ãããæ°ãå¢ããããšã¯å©ççãé«ãã§ãããããéã«ããã®è¯ããã§ãããéã«ãå©ãâãã£ã³ãã€ã³ããä»ã§ã¯ãä»ã§ã¯ãæ©èœãé«ããããããŸããã
Wãã:æã ã£ãããã»ã¬ã¯ãã·ã§ããããªãªãžãã«ããªãªãžãã«ãã©ã³ããå質åããŠããã«ã¯è¶³ããªãã§ãããããã¡ã¹ããã¡ãã·ã§ã³ã®ãŸãªèªå®
ãäŸ¡æ Œãšãã£ãé¢ã§ãæ²èŒãããå¿
èŠããããšæããŸãã
ããããã£ããºã¬ãåºãŠããŠããçŸç¶ã§ãªãªãžãã«ãã©ã³ãã§ãªãªãžãã«ãã©ã³ãã§æŠã£ãŠããã«ã¯?ã
Tãã:äŸãã°ããããŒã·ãã¯ãªãã¶ã€ã³ã«åŒ·ããããããã«åŒ·ãããšããããã«ãããããã«ã»ã¬ã¯ãã·ã§ããããããšã«ç¹åŸŽã¯ãããšæããã§ãããã ããããã®ç¹åŸŽãä»ãŸã§ä»¥äžã«æã¡åºã
GPTã¿ã€ããæ§é ã¯åçŽãªã®ã§ããããªããªãé£ããããå ããŠãããŒã¿ã®åéãšæŽåœ¢ãæãã®å€é¢åã ã£ã![]()
次å
äºååŠç¿ããéã¿ãå©çšããŠãåé¡åé¡ãæç€ºãã¥ãŒãã³ã°ãªã©ããã£ãŠã¿ããã
åèã«ããæžç±ãšãµã€ã
ä»åã¯è«æã§ã¯ãªããŠã解説æ¬ãäžå¿ã«å匷ããŸããã
-
æè€ åº·æ¯ (2026)
ããŒãããäœãDeep Learning â» âLLMç·šããªã©ã€ãªãŒã»ãžã£ãã³- ãšãŠããããæãããããå€è²å·ãã§å³è§£ãäžå¯§ããðæ²èŒãããŠããã³ãŒãããšãã£ã¿ãŒã®ããã«è²åããããŠããŠãé©ã
- ãšãŠããããæãããããå€è²å·ãã§å³è§£ãäžå¯§ããðæ²èŒãããŠããã³ãŒãããšãã£ã¿ãŒã®ããã«è²åããããŠããŠãé©ã
-
Sebastian Raschka å·£ç± æ èŒ (ç£ä¿®), æ ªåŒäŒç€Ÿã¯ã€ãŒã èš³ (2025)
ãã€ãããªããåŠã¶ïŒLLM èªäœå ¥éããã€ããåºç- ãã¡ããæåãåèã»è𳿬ããããOKããªãããŒãããããã®åã«ãäžè©±ã«ãªããŸãããå°å³ã«ç·Žç¿åé¡ãšãã®è§£çãçè§£ä¿é²ã«åœ¹ç«ã¡ãŸããð
-
ã¯ãžã©é£è¡æº ïŒ2025ïŒ
ãPythonã§ãŸãªã¶ ããŒã«ã«LLMã®èšç·Žãšäœ¿ãããªãããœã·ã- ããŒã«ã«LLMã®æžç±ãªã®ã§ãããå®ã¯GPTã¿ã€ãã®äºååŠç¿ã«ã€ããŠãè§ŠããããŠããŸããå å®¹ãæºèŒð æžç±ãéããïŒ
-
- åŒã®å±éãããããã€ããªããåèã«ããŠããŸããèŠããã³å 容ãå¢ããŠããã
ç®æ¬¡ããŒãž
泚
-
第25åã®ããŒã¯ãã€ãºç·šã»BPEã«åŸã£ãŠäœæããŸããã â©
-
第33åã®Datasetã¯ã©ã¹ã®ã«ã¹ã¿ãã€ãºã«ã€ããŠãå©çšããŠãtokenizerã«å¿ãã圢ã§idåãäœæããDatasetã¯ã©ã¹ãäœæããŸãã â©
-
70äžæåã40äžããŒã¯ã³ã«ãªããŸãã®ã§ãååããå€ããšããæãã â©
-
lossãïŒãäžåããšãããŒãã¬ãã·ãã£ã¯ã2ã3ã®éã«ãªã£ãŠããŸãã2ã3ããŒã¯ã³ããæ¬¡ã®åèªãäºæž¬ã§ããã¬ãã«æãªã®ã§ãã»ãŒäžžæèšç¶æ ã«è¿ããªã£ãŠããŸãã â©
-
ãã¶ãèªåçã«å€ããã¯ããªã®ã§ãããFlash Attentionã«ã€ããŠã¯ã»ãšãã©çè§£ããŠããŸããããã®ãã¡å匷ããããšæãã€ã€ãªããªãé²ãŸãªã
â©
