import%20marimo%0A%0A__generated_with%20%3D%20%220.18.4%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0Awith%20app.setup%3A%0A%20%20%20%20import%20importlib%0A%20%20%20%20import%20re%0A%20%20%20%20from%20importlib.metadata%20import%20version%0A%20%20%20%20from%20pathlib%20import%20Path%0A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20requests%0A%20%20%20%20import%20tiktoken%0A%20%20%20%20import%20torch%0A%20%20%20%20from%20torch.utils.data%20import%20DataLoader%2C%20Dataset%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20print(%22torch%20version%3A%22%2C%20version(%22torch%22))%0A%20%20%20%20print(%22tiktoken%20version%3A%22%2C%20version(%22tiktoken%22))%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Chapter%202%3A%20Working%20with%20Text%20Data%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%202.2%20Tokenizing%20text%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Define%20a%20downloader%20function%20for%20the%20novel%20%22The%20Verdict%22%20that%20allows%20to%20be%20used%20for%20traning.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20download_verdict_data()%3A%0A%20%20%20%20project_root%20%3D%20Path(__file__).parent.parent.parent%0A%20%20%20%20data_root%20%3D%20project_root%20%2F%20%22data%22%0A%20%20%20%20data_root.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%0A%20%20%20%20file_path%20%3D%20data_root%20%2F%20%22the-verdict.txt%22%0A%20%20%20%20if%20file_path.exists()%3A%0A%20%20%20%20%20%20%20%20print(f%22Data%20file%20already%20exists%20at%20%7Bfile_path%7D.%20Skipping%20download.%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20data_url%20%3D%20%22https%3A%2F%2Fraw.githubusercontent.com%2Frasbt%2FLLMs-from-scratch%2Fmain%2Fch02%2F01_main-chapter-code%2Fthe-verdict.txt%22%0A%20%20%20%20%20%20%20%20response%20%3D%20requests.get(data_url%2C%20timeout%3D30)%0A%20%20%20%20%20%20%20%20response.raise_for_status()%0A%20%20%20%20%20%20%20%20text_data%20%3D%20response.text%0A%20%20%20%20%20%20%20%20with%20open(file_path%2C%20%22w%22%2C%20encoding%3D%22utf-8%22)%20as%20file%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20file.write(text_data)%0A%20%20%20%20return%20file_path%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Download%20and%20read%20the%20data.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20verdict_file_path%20%3D%20download_verdict_data()%0A%20%20%20%20with%20open(verdict_file_path%2C%20%22r%22%2C%20encoding%3D%22utf-8%22)%20as%20f%3A%0A%20%20%20%20%20%20%20%20raw_text%20%3D%20f.read()%0A%0A%20%20%20%20print(%22Total%20number%20of%20character%3A%22%2C%20len(raw_text))%0A%20%20%20%20print(raw_text%5B%3A99%5D)%0A%20%20%20%20return%20(raw_text%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Split%20words%20by%20whitespace%20using%20regex.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20text_1%20%3D%20%22Hello%2C%20world.%20This%2C%20is%20a%20test.%22%0A%20%20%20%20_result%20%3D%20re.split(r%22(%5Cs)%22%2C%20text_1)%0A%20%20%20%20print(_result)%0A%20%20%20%20return%20(text_1%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Add%20period%20(.)%20and%20comma%20(%2C)%20separaters%20for%20it.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(text_1)%3A%0A%20%20%20%20result_1%20%3D%20re.split(r%22(%5B%2C.%5D%7C%5Cs)%22%2C%20text_1)%0A%20%20%20%20print(result_1)%0A%20%20%20%20return%20(result_1%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Delete%20whitespaces%20that%20is%20recognized%20as%20a%20separater%20if%20it%20is%20needed.%0A%20%20%20%20Strip%20whitespace%20from%20each%20item%20and%20then%20filter%20out%20any%20empty%20strings.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(result_1)%3A%0A%20%20%20%20_result%20%3D%20%5Bitem%20for%20item%20in%20result_1%20if%20item.strip()%5D%0A%20%20%20%20print(_result)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Try%20another%20example%20includes%20symbols%20like%20hyphen%20(-)%20or%20question%20mark%20(%3F).%20These%20symbols%20also%20can%20be%20extracted%20by%20treating%20these%20as%20separaters.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20text_2%20%3D%20%22Hello%2C%20world.%20Is%20this--%20a%20test%3F%22%0A%0A%20%20%20%20_result%20%3D%20re.split(r'(%5B%2C.%3A%3B%3F_!%22()%5C'%5D%7C--%7C%5Cs)'%2C%20text_2)%0A%20%20%20%20_result%20%3D%20%5Bitem.strip()%20for%20item%20in%20_result%20if%20item.strip()%5D%0A%20%20%20%20print(_result)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Split%20The%20Verdict%20data%20whole.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(raw_text)%3A%0A%20%20%20%20preprocessed%20%3D%20re.split(r'(%5B%2C.%3A%3B%3F_!%22()%5C'%5D%7C--%7C%5Cs)'%2C%20raw_text)%0A%20%20%20%20preprocessed%20%3D%20%5Bitem.strip()%20for%20item%20in%20preprocessed%20if%20item.strip()%5D%0A%20%20%20%20print(f%22%7Bpreprocessed%5B%3A30%5D%3D%7D%22)%0A%20%20%20%20print(f%22%7Blen(preprocessed)%3D%7D%22)%0A%20%20%20%20return%20(preprocessed%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%202.3%20Converting%20tokens%20into%20token%20IDs%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Create%20unique%20list%20of%20tokens%20by%20using%20%60set%60%2C%20then%20sort%20it.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(preprocessed)%3A%0A%20%20%20%20all_words%20%3D%20sorted(set(preprocessed))%0A%20%20%20%20_vocab_size%20%3D%20len(all_words)%0A%20%20%20%20print(_vocab_size)%0A%20%20%20%20return%20(all_words%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Create%20map%20(dictionary)%20from%20token%20to%20token%20ID%2C%20then%20show%20it.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(all_words)%3A%0A%20%20%20%20vocab%20%3D%20%7Btoken%3A%20integer%20for%20integer%2C%20token%20in%20enumerate(all_words)%7D%0A%20%20%20%20for%20_i%2C%20_item%20in%20enumerate(vocab.items())%3A%0A%20%20%20%20%20%20%20%20print(_item)%0A%20%20%20%20%20%20%20%20if%20_i%20%3E%3D%2050%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20return%20(vocab%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Define%20a%20simple%20tokenizer%20based%20on%20these%2C%20and%20implement%20not%20only%20encoder%20but%20also%20decoder%20by%20defining%20the%20inverse%20mapping.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.class_definition%0Aclass%20SimpleTokenizerV1%3A%0A%20%20%20%20def%20__init__(self%2C%20vocab)%3A%0A%20%20%20%20%20%20%20%20self.str_to_int%20%3D%20vocab%0A%20%20%20%20%20%20%20%20%23%20inverse%20mapping%0A%20%20%20%20%20%20%20%20self.int_to_str%20%3D%20%7Bi%3A%20s%20for%20s%2C%20i%20in%20vocab.items()%7D%0A%0A%20%20%20%20def%20encode(self%2C%20text)%3A%0A%20%20%20%20%20%20%20%20%23%20Split%20by%20specified%20punctuations%20and%20whitespace%0A%20%20%20%20%20%20%20%20preprocessed%20%3D%20re.split(r'(%5B%2C.%3A%3B%3F_!%22()%5C'%5D%7C--%7C%5Cs)'%2C%20text)%0A%20%20%20%20%20%20%20%20%23%20Remove%20empty%20strings%20and%20whitespace-only%20strings%0A%20%20%20%20%20%20%20%20preprocessed%20%3D%20%5Bitem.strip()%20for%20item%20in%20preprocessed%20if%20item.strip()%5D%0A%20%20%20%20%20%20%20%20%23%20Map%20to%20token%20IDs%0A%20%20%20%20%20%20%20%20ids%20%3D%20%5Bself.str_to_int%5Bs%5D%20for%20s%20in%20preprocessed%5D%0A%20%20%20%20%20%20%20%20return%20ids%0A%0A%20%20%20%20def%20decode(self%2C%20ids)%3A%0A%20%20%20%20%20%20%20%20%23%20Map%20token%20IDs%20back%20to%20strings%20by%20joining%20with%20spaces%0A%20%20%20%20%20%20%20%20text%20%3D%20%22%20%22.join(%5Bself.int_to_str%5Bi%5D%20for%20i%20in%20ids%5D)%0A%20%20%20%20%20%20%20%20%23%20Replace%20spaces%20before%20the%20specified%20punctuations%0A%20%20%20%20%20%20%20%20text%20%3D%20re.sub(r'%5Cs%2B(%5B%2C.%3F!%22()%5C'%5D)'%2C%20r%22%5C1%22%2C%20text)%0A%20%20%20%20%20%20%20%20return%20text%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Apply%20the%20encoder%20process%20to%20a%20sentence%20from%20The%20Verdict.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(vocab)%3A%0A%20%20%20%20simple_tokenizer%20%3D%20SimpleTokenizerV1(vocab)%0A%0A%20%20%20%20text_3%20%3D%20%22%22%22%22It's%20the%20last%20he%20painted%2C%20you%20know%2C%22%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Mrs.%20Gisburn%20said%20with%20pardonable%20pride.%22%22%22%0A%20%20%20%20token_ids_3%20%3D%20simple_tokenizer.encode(text_3)%0A%20%20%20%20print(token_ids_3)%0A%20%20%20%20return%20simple_tokenizer%2C%20text_3%2C%20token_ids_3%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Try%20decoding%20it%20to%20check%20whether%20it%20is%20invertive.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(simple_tokenizer%2C%20token_ids_3)%3A%0A%20%20%20%20simple_tokenizer.decode(token_ids_3)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Combine%20these.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(simple_tokenizer%2C%20text_3)%3A%0A%20%20%20%20simple_tokenizer.decode(simple_tokenizer.encode(text_3))%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20We%20cannot%20treat%20unknown%20words%20that%20are%20not%20included%20in%20the%20vocabulary.%20This%20will%20occur%20an%20error.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(simple_tokenizer)%3A%0A%20%20%20%20text_4%20%3D%20%22Hello%2C%20do%20you%20like%20tea.%20Is%20this--%20a%20test%3F%22%0A%0A%20%20%20%20simple_tokenizer.encode(text_4)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%202.4%20Adding%20special%20context%20tokens%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20To%20fix%20the%20vocabulary%20issues%2C%20the%20special%20token%20for%20unknown%20words%20should%20be%20added%20as%20%60unk%60.%20The%20special%20token%20to%20combine%20multiple%20texts%20is%20also%20added%20as%20%60endoftext%60.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(preprocessed)%3A%0A%20%20%20%20all_tokens%20%3D%20sorted(list(set(preprocessed)))%0A%20%20%20%20all_tokens.extend(%5B%22%3C%7Cendoftext%7C%3E%22%2C%20%22%3C%7Cunk%7C%3E%22%5D)%0A%0A%20%20%20%20vocab_extended%20%3D%20%7Btoken%3A%20integer%20for%20integer%2C%20token%20in%20enumerate(all_tokens)%7D%0A%20%20%20%20return%20(vocab_extended%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20The%20total%20number%20of%20the%20vocabulary%20is%20increased%20%241130%2B2%3D1132%24.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(vocab_extended)%3A%0A%20%20%20%20len(vocab_extended.items())%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Check%20the%20tail.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(vocab_extended)%3A%0A%20%20%20%20for%20_i%2C%20_item%20in%20enumerate(list(vocab_extended.items())%5B-5%3A%5D)%3A%0A%20%20%20%20%20%20%20%20print(_item)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20This%20is%20updated%20simple%20tokenier%20includes%20the%20special%20tokens.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.class_definition%0Aclass%20SimpleTokenizerV2%3A%0A%20%20%20%20def%20__init__(self%2C%20vocab)%3A%0A%20%20%20%20%20%20%20%20self.str_to_int%20%3D%20vocab%0A%20%20%20%20%20%20%20%20self.int_to_str%20%3D%20%7Bi%3A%20s%20for%20s%2C%20i%20in%20vocab.items()%7D%0A%0A%20%20%20%20def%20encode(self%2C%20text)%3A%0A%20%20%20%20%20%20%20%20preprocessed%20%3D%20re.split(r'(%5B%2C.%3A%3B%3F_!%22()%5C'%5D%7C--%7C%5Cs)'%2C%20text)%0A%20%20%20%20%20%20%20%20preprocessed%20%3D%20%5Bitem.strip()%20for%20item%20in%20preprocessed%20if%20item.strip()%5D%0A%20%20%20%20%20%20%20%20%23%20Handle%20unknown%20tokens%0A%20%20%20%20%20%20%20%20preprocessed%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20item%20if%20item%20in%20self.str_to_int%20else%20%22%3C%7Cunk%7C%3E%22%20for%20item%20in%20preprocessed%0A%20%20%20%20%20%20%20%20%5D%0A%0A%20%20%20%20%20%20%20%20ids%20%3D%20%5Bself.str_to_int%5Bs%5D%20for%20s%20in%20preprocessed%5D%0A%20%20%20%20%20%20%20%20return%20ids%0A%0A%20%20%20%20def%20decode(self%2C%20ids)%3A%0A%20%20%20%20%20%20%20%20text%20%3D%20%22%20%22.join(%5Bself.int_to_str%5Bi%5D%20for%20i%20in%20ids%5D)%0A%20%20%20%20%20%20%20%20%23%20Replace%20spaces%20before%20the%20specified%20punctuations%0A%20%20%20%20%20%20%20%20text%20%3D%20re.sub(r'%5Cs%2B(%5B%2C.%3A%3B%3F!%22()%5C'%5D)'%2C%20r%22%5C1%22%2C%20text)%0A%20%20%20%20%20%20%20%20return%20text%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Try%20to%20tokenize%20concatenated%20texts%20by%20the%20special%20token.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(vocab_extended)%3A%0A%20%20%20%20tokenizer_extended%20%3D%20SimpleTokenizerV2(vocab_extended)%0A%0A%20%20%20%20_text1%20%3D%20%22Hello%2C%20do%20you%20like%20tea%3F%22%0A%20%20%20%20_text2%20%3D%20%22In%20the%20sunlit%20terraces%20of%20the%20palace.%22%0A%0A%20%20%20%20text_extended%20%3D%20%22%20%3C%7Cendoftext%7C%3E%20%22.join((_text1%2C%20_text2))%0A%0A%20%20%20%20print(text_extended)%0A%20%20%20%20return%20text_extended%2C%20tokenizer_extended%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Then%2C%20tokenize%20it.%20You%20will%20see%20token%20ID%201130%20and%201131%20that%20are%20asigned%20for%20the%20special%20tokens.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(text_extended%2C%20tokenizer_extended)%3A%0A%20%20%20%20tokenizer_extended.encode(text_extended)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Decode%20it%20to%20check%20the%20tokenization.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(text_extended%2C%20tokenizer_extended)%3A%0A%20%20%20%20tokenizer_extended.decode(tokenizer_extended.encode(text_extended))%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%202.5%20BytePair%20encoding%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20To%20avoid%20unknown%20tokens%2C%20introduce%20byte%20pair%20encoding%20(BPE)%20by%20using%20tiktoken.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20print(%22tiktoken%20version%3A%22%2C%20importlib.metadata.version(%22tiktoken%22))%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Try%20the%20tiktoken%20tokenizer%20for%20GPT2%20model.%20The%20max%20token%20ID%2050256%20is%20assigned%20for%20%60endoftext%60.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20bpe_tokenizer%20%3D%20tiktoken.get_encoding(%22gpt2%22)%0A%0A%20%20%20%20text_5%20%3D%20(%0A%20%20%20%20%20%20%20%20%22Hello%2C%20do%20you%20like%20tea%3F%20%3C%7Cendoftext%7C%3E%20In%20the%20sunlit%20terraces%22%0A%20%20%20%20%20%20%20%20%20%22of%20someunknownPlace.%22%0A%20%20%20%20)%0A%0A%20%20%20%20bpe_token_id_5%20%3D%20bpe_tokenizer.encode(text_5%2C%20allowed_special%3D%7B%22%3C%7Cendoftext%7C%3E%22%7D)%0A%0A%20%20%20%20print(bpe_token_id_5)%0A%20%20%20%20return%20bpe_token_id_5%2C%20bpe_tokenizer%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Check%20it%20by%20using%20the%20decoding.%20It%20encodes%20all%20tokens%20in%20unique%20manner%20by%20using%20subworkds%20and%20the%20combined%20words.%20So%2C%20this%20is%20invertive.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(bpe_token_id_5%2C%20bpe_tokenizer)%3A%0A%20%20%20%20_strings%20%3D%20bpe_tokenizer.decode(bpe_token_id_5)%0A%20%20%20%20print(_strings)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20To%20know%20BPE%2C%20see%20%5Bthis%5D(..%2F..%2Fthird_party%2FLLMs-from-scratch%2Fch02%2F05_bpe-from-scratch%2Fbpe-from-scratch.ipynb).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%202.6%20Data%20sampling%20with%20a%20sliding%20window%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Use%20BPE%20tokenizer%20for%20tokenization%20of%20The%20Verdict%2C%20and%20show%20the%20size%20of%20the%20all%20tokens.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(bpe_tokenizer%2C%20raw_text)%3A%0A%20%20%20%20enc_text%20%3D%20bpe_tokenizer.encode(raw_text)%0A%20%20%20%20print(len(enc_text))%0A%20%20%20%20return%20(enc_text%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Delete%20the%20beginning%20for%20a%20later%20demonstration.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(enc_text)%3A%0A%20%20%20%20enc_sample%20%3D%20enc_text%5B50%3A%5D%0A%20%20%20%20return%20(enc_sample%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Create%20learning%20pairs%20to%20predict%20next%20tokens.%20The%20task%20is%20predicting%20the%20%60y%60%20from%20the%20%60x%60.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(enc_sample)%3A%0A%20%20%20%20context_size%20%3D%204%0A%0A%20%20%20%20x%20%3D%20enc_sample%5B%3Acontext_size%5D%0A%20%20%20%20y%20%3D%20enc_sample%5B1%3Acontext_size%2B1%5D%0A%0A%20%20%20%20print(f%22x%3A%20%7Bx%7D%22)%0A%20%20%20%20print(f%22y%3A%20%20%20%20%20%20%7By%7D%22)%0A%20%20%20%20return%20(context_size%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20The%20mappings%20will%20be%20learned%20are%20these.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(context_size%2C%20enc_sample)%3A%0A%20%20%20%20for%20_i%20in%20range(1%2C%20context_size%2B1)%3A%0A%20%20%20%20%20%20%20%20_context%20%3D%20enc_sample%5B%3A_i%5D%0A%20%20%20%20%20%20%20%20_desired%20%3D%20enc_sample%5B_i%5D%0A%0A%20%20%20%20%20%20%20%20print(_context%2C%20%22----%3E%22%2C%20_desired)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Decode%20these%20token%20IDs%20to%20check%20the%20words.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(bpe_tokenizer%2C%20context_size%2C%20enc_sample)%3A%0A%20%20%20%20for%20_i%20in%20range(1%2C%20context_size%2B1)%3A%0A%20%20%20%20%20%20%20%20_context%20%3D%20enc_sample%5B%3A_i%5D%0A%20%20%20%20%20%20%20%20_desired%20%3D%20enc_sample%5B_i%5D%0A%0A%20%20%20%20%20%20%20%20print(bpe_tokenizer.decode(_context)%2C%20%22----%3E%22%2C%20bpe_tokenizer.decode(%5B_desired%5D))%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Let's%20define%20dataset%20for%20this%20by%20using%20PyTorch.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20print(%22PyTorch%20version%3A%22%2C%20torch.__version__)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20To%20define%20PyTorch%20dataset%2C%20we%20need%20to%20define%20special%20methods%20%60__len__%60%20and%20%60__getitem__%60%20for%20iterater%20use.%20We%20implement%20the%20indexing%20for%20tokenized%20tensor%20with%20chunks%20whose%20size%20is%20%60max_length%60%20with%20%60stride%60%20step%20size%20(sliding%20window).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.class_definition%0Aclass%20GPTDatasetV1(Dataset)%3A%0A%20%20%20%20def%20__init__(self%2C%20txt%2C%20bpe_tokenizer%2C%20max_length%2C%20stride)%3A%0A%20%20%20%20%20%20%20%20self.input_ids%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20self.target_ids%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20%23%20Tokenize%20the%20entire%20text%0A%20%20%20%20%20%20%20%20token_ids%20%3D%20bpe_tokenizer.encode(txt%2C%20allowed_special%3D%7B%22%3C%7Cendoftext%7C%3E%22%7D)%0A%20%20%20%20%20%20%20%20assert%20len(token_ids)%20%3E%20max_length%2C%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Number%20of%20tokenized%20inputs%20must%20at%20least%20be%20equal%20to%20max_length%2B1%22%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20Use%20a%20sliding%20window%20to%20chunk%20the%20book%20into%20overlapping%20sequences%20of%20max_length%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(0%2C%20len(token_ids)%20-%20max_length%2C%20stride)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20input_chunk%20%3D%20token_ids%5Bi%20%3A%20i%20%2B%20max_length%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20target_chunk%20%3D%20token_ids%5Bi%20%2B%201%20%3A%20i%20%2B%20max_length%20%2B%201%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20self.input_ids.append(torch.tensor(input_chunk))%0A%20%20%20%20%20%20%20%20%20%20%20%20self.target_ids.append(torch.tensor(target_chunk))%0A%0A%20%20%20%20def%20__len__(self)%3A%0A%20%20%20%20%20%20%20%20return%20len(self.input_ids)%0A%0A%20%20%20%20def%20__getitem__(self%2C%20idx)%3A%0A%20%20%20%20%20%20%20%20return%20self.input_ids%5Bidx%5D%2C%20self.target_ids%5Bidx%5D%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Define%20a%20function%20to%20instantiate%20the%20dataloader%20class.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20create_dataloader_v1(%0A%20%20%20%20txt%2C%0A%20%20%20%20batch_size%3D4%2C%0A%20%20%20%20max_length%3D256%2C%0A%20%20%20%20stride%3D128%2C%0A%20%20%20%20shuffle%3DTrue%2C%0A%20%20%20%20drop_last%3DTrue%2C%0A%20%20%20%20num_workers%3D0%2C%0A)%3A%0A%20%20%20%20%23%20Initialize%20the%20tokenizer%0A%20%20%20%20bpe_tokenizer%20%3D%20tiktoken.get_encoding(%22gpt2%22)%0A%0A%20%20%20%20%23%20Create%20dataset%0A%20%20%20%20dataset%20%3D%20GPTDatasetV1(txt%2C%20bpe_tokenizer%2C%20max_length%2C%20stride)%0A%0A%20%20%20%20%23%20Create%20dataloader%0A%20%20%20%20dataloader%20%3D%20DataLoader(%0A%20%20%20%20%20%20%20%20dataset%2C%0A%20%20%20%20%20%20%20%20batch_size%3Dbatch_size%2C%0A%20%20%20%20%20%20%20%20shuffle%3Dshuffle%2C%0A%20%20%20%20%20%20%20%20drop_last%3Ddrop_last%2C%0A%20%20%20%20%20%20%20%20num_workers%3Dnum_workers%2C%0A%20%20%20%20)%0A%0A%20%20%20%20return%20dataloader%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20For%20debugging%2C%20define%20a%20decoder%20function%20for%20batches.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20decode_batch(batch%2C%20tokenizer)%3A%0A%20%20%20%20inputs%2C%20targets%20%3D%20batch%0A%20%20%20%20batch_size%2C%20seq_length%20%3D%20inputs.shape%0A%0A%20%20%20%20decoded_inputs%20%3D%20%5B%5D%0A%20%20%20%20decoded_targets%20%3D%20%5B%5D%0A%0A%20%20%20%20for%20i%20in%20range(batch_size)%3A%0A%20%20%20%20%20%20%20%20input_ids%20%3D%20inputs%5Bi%5D.tolist()%0A%20%20%20%20%20%20%20%20target_ids%20%3D%20targets%5Bi%5D.tolist()%0A%0A%20%20%20%20%20%20%20%20decoded_input%20%3D%20tokenizer.decode(input_ids)%0A%20%20%20%20%20%20%20%20decoded_target%20%3D%20tokenizer.decode(target_ids)%0A%0A%20%20%20%20%20%20%20%20decoded_inputs.append(decoded_input)%0A%20%20%20%20%20%20%20%20decoded_targets.append(decoded_target)%0A%0A%20%20%20%20return%20decoded_inputs%2C%20decoded_targets%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Call%20the%20function%20to%20check%20the%20data%20batches.%20The%20output%20should%20be%20the%20pair%20of%20input%20IDs%20and%20target%20IDs.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(bpe_tokenizer%2C%20raw_text)%3A%0A%20%20%20%20_dataloader_s1%20%3D%20create_dataloader_v1(%0A%20%20%20%20%20%20%20%20raw_text%2C%20batch_size%3D1%2C%20max_length%3D4%2C%20stride%3D1%2C%20shuffle%3DFalse%0A%20%20%20%20)%0A%0A%20%20%20%20data_iter_s1%20%3D%20iter(_dataloader_s1)%0A%20%20%20%20_first_batch%20%3D%20next(data_iter_s1)%0A%20%20%20%20print(f%22%7B_first_batch%3D%7D%22)%0A%0A%20%20%20%20_inputs_decoded%2C%20_targets_decoded%20%3D%20decode_batch(_first_batch%2C%20bpe_tokenizer)%0A%20%20%20%20print(f%22%7B_inputs_decoded%3D%7D%22)%0A%20%20%20%20print(f%22%7B_targets_decoded%3D%7D%22)%0A%20%20%20%20return%20(data_iter_s1%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Iterate%20again%20and%20check%20the%20next%20batch.%20You%20will%20see%20only%201%20shifted%20tokens%20from%20the%20previous%20because%20of%20%60stride%3D1%60.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(bpe_tokenizer%2C%20data_iter_s1)%3A%0A%20%20%20%20_second_batch%20%3D%20next(data_iter_s1)%0A%20%20%20%20print(f%22%7B_second_batch%3D%7D%22)%0A%0A%20%20%20%20_inputs_decoded%2C%20_targets_decoded%20%3D%20decode_batch(_second_batch%2C%20bpe_tokenizer)%0A%20%20%20%20print(f%22%7B_inputs_decoded%3D%7D%22)%0A%20%20%20%20print(f%22%7B_targets_decoded%3D%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Try%20larger%20batch%20size%20(%60batch_size%3D8%60)%20for%20robust%20training.%20To%20avoid%20overfitting%2C%20the%20stride%20is%20also%20increased%20(%60stride%3D4%60).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(bpe_tokenizer%2C%20raw_text)%3A%0A%20%20%20%20_dataloader_s4%20%3D%20create_dataloader_v1(%0A%20%20%20%20%20%20%20%20raw_text%2C%20batch_size%3D8%2C%20max_length%3D4%2C%20stride%3D4%2C%20shuffle%3DFalse%0A%20%20%20%20)%0A%0A%20%20%20%20data_iter_s4%20%3D%20iter(_dataloader_s4)%0A%20%20%20%20_inputs%2C%20_targets%20%3D%20next(data_iter_s4)%0A%20%20%20%20print(%22Inputs%3A%5Cn%22%2C%20_inputs)%0A%20%20%20%20print(%22%5CnTargets%3A%5Cn%22%2C%20_targets)%0A%0A%20%20%20%20_inputs_decoded%2C%20_targets_decoded%20%3D%20decode_batch((_inputs%2C%20_targets)%2C%20bpe_tokenizer)%0A%20%20%20%20print(f%22%7B_inputs_decoded%3D%7D%22)%0A%20%20%20%20print(f%22%7B_targets_decoded%3D%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%202.7%20Creating%20token%20embeddings%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20This%20is%20an%20example%20for%20token%20embeddings%20that%20accepts%206-dimensional%20input%20as%20the%20vocabulary%20and%20outputs%203-dimensional%20embedding%20vector.%0A%0A%20%20%20%20The%20embedding%20is%20represented%20by%20a%20matrix%20whose%20rows%20represents%20embedding%20vectors%20for%20each%20vocabularies.%0A%0A%20%20%20%20The%20representation%20matrix%20can%20be%20trained.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20_vocab_size%20%3D%206%0A%20%20%20%20_output_dim%20%3D%203%0A%0A%20%20%20%20torch.manual_seed(123)%0A%20%20%20%20%23%20randomly%20initizalize%20embedding%20layer%0A%20%20%20%20embedding_layer%20%3D%20torch.nn.Embedding(_vocab_size%2C%20_output_dim)%0A%20%20%20%20print(embedding_layer.weight)%0A%20%20%20%20return%20(embedding_layer%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Let's%20try%20the%20embedding%20for%20token%20ID%203.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(embedding_layer)%3A%0A%20%20%20%20print(embedding_layer(torch.tensor(%5B3%5D)))%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Try%20more%20embeddings.%20This%20is%20just%20referring%20the%20matrix%20as%20LUT%20(Look%20Up%20Table).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(embedding_layer)%3A%0A%20%20%20%20_input_ids%20%3D%20torch.tensor(%5B2%2C%203%2C%205%2C%201%5D)%0A%20%20%20%20print(embedding_layer(_input_ids))%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%202.8%20Encoding%20word%20positions%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Try%20positional%20encoding%20based%20on%20this%20configurations.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20_vocab_size%20%3D%2050257%0A%20%20%20%20output_dim%20%3D%20256%0A%0A%20%20%20%20token_embedding_layer%20%3D%20torch.nn.Embedding(_vocab_size%2C%20output_dim)%0A%20%20%20%20return%20output_dim%2C%20token_embedding_layer%0A%0A%0A%40app.cell%0Adef%20_(raw_text)%3A%0A%20%20%20%20max_length%20%3D%204%0A%20%20%20%20dataloader%20%3D%20create_dataloader_v1(%0A%20%20%20%20%20%20%20%20raw_text%2C%20batch_size%3D8%2C%20max_length%3Dmax_length%2C%0A%20%20%20%20%20%20%20%20stride%3Dmax_length%2C%20shuffle%3DFalse%0A%20%20%20%20)%0A%20%20%20%20data_iter%20%3D%20iter(dataloader)%0A%20%20%20%20inputs%2C%20targets%20%3D%20next(data_iter)%0A%20%20%20%20return%20inputs%2C%20max_length%0A%0A%0A%40app.cell%0Adef%20_(inputs)%3A%0A%20%20%20%20print(%22Token%20IDs%3A%5Cn%22%2C%20inputs)%0A%20%20%20%20print(%22%5CnInputs%20shape%3A%5Cn%22%2C%20inputs.shape)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Then%2C%20these%20tokens%20are%20embedded%20to%20256-dimensional%20manifold.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(inputs%2C%20token_embedding_layer)%3A%0A%20%20%20%20token_embeddings%20%3D%20token_embedding_layer(inputs)%0A%20%20%20%20print(token_embeddings.shape)%0A%0A%20%20%20%20%23%20uncomment%20%26%20execute%20the%20following%20line%20to%20see%20how%20the%20embeddings%20look%20like%0A%20%20%20%20%23%20print(token_embeddings)%0A%20%20%20%20return%20(token_embeddings%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Absolute%20positional%20embedding%20is%20also%20proceeded%20by%20using%20another%20%60torch.nn.Embedding%60%20layer.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(max_length%2C%20output_dim)%3A%0A%20%20%20%20context_length%20%3D%20max_length%0A%20%20%20%20pos_embedding_layer%20%3D%20torch.nn.Embedding(context_length%2C%20output_dim)%0A%0A%20%20%20%20%23%20uncomment%20%26%20execute%20the%20following%20line%20to%20see%20how%20the%20embedding%20layer%20weights%20look%20like%0A%20%20%20%20print(pos_embedding_layer.weight)%0A%20%20%20%20return%20(pos_embedding_layer%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Then%2C%20indexes%20represents%20absolute%20positions%20are%20input%20to%20it.%20This%20can%20be%20also%20interpreted%20as%20LUT.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(max_length%2C%20pos_embedding_layer)%3A%0A%20%20%20%20pos_embeddings%20%3D%20pos_embedding_layer(torch.arange(max_length))%0A%20%20%20%20print(pos_embeddings.shape)%0A%0A%20%20%20%20%23%20uncomment%20%26%20execute%20the%20following%20line%20to%20see%20how%20the%20embeddings%20look%20like%0A%20%20%20%20print(pos_embeddings)%20%0A%20%20%20%20return%20(pos_embeddings%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20The%20absolute%20positional%20encoding%20is%20just%20adding%20these.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(pos_embeddings%2C%20token_embeddings)%3A%0A%20%20%20%20input_embeddings%20%3D%20token_embeddings%20%2B%20pos_embeddings%0A%20%20%20%20print(input_embeddings.shape)%0A%0A%20%20%20%20%23%20uncomment%20%26%20execute%20the%20following%20line%20to%20see%20how%20the%20embeddings%20look%20like%0A%20%20%20%20print(input_embeddings)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
f1f637e55fe31ce7167d9a969aea7f39