import%20marimo%0A%0A__generated_with%20%3D%20%220.19.2%22%0Aapp%20%3D%20marimo.App()%0A%0Awith%20app.setup%3A%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%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20tiktoken%0A%20%20%20%20import%20torch%0A%20%20%20%20from%20matplotlib.ticker%20import%20MaxNLocator%0A%0A%20%20%20%20from%20my_llm.ch02%20import%20create_dataloader_v1%2C%20download_verdict_data%0A%20%20%20%20from%20my_llm.ch04%20import%20GPTModel%2C%20generate_text_simple%0A%20%20%20%20from%20my_llm.gpt_download%20import%20download_and_load_gpt2%0A%0A%20%20%20%20_pkgs%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%22matplotlib%22%2C%0A%20%20%20%20%20%20%20%20%22numpy%22%2C%0A%20%20%20%20%20%20%20%20%22tiktoken%22%2C%0A%20%20%20%20%20%20%20%20%22torch%22%2C%0A%20%20%20%20%20%20%20%20%22tensorflow%22%2C%20%20%23%20OpenAI%20%E3%81%AE%E4%BA%8B%E5%89%8D%E5%AD%A6%E7%BF%92%E6%B8%88%E3%81%BF%E9%87%8D%E3%81%BF%E7%94%A8%0A%20%20%20%20%5D%0A%0A%20%20%20%20for%20_p%20in%20_pkgs%3A%0A%20%20%20%20%20%20%20%20print(f%22%7B_p%7D%20version%3A%20%7Bversion(_p)%7D%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20%E7%AC%AC5%E7%AB%A0%3A%20%E3%83%A9%E3%83%99%E3%83%AB%E3%81%AA%E3%81%97%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A7%E3%81%AE%E4%BA%8B%E5%89%8D%E5%AD%A6%E7%BF%92%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%205.1%20%E7%94%9F%E6%88%90%E5%9E%8B%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E8%A9%95%E4%BE%A1%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%23%205.1.1%20GPT%20%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%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%20GPT_CONFIG_124M%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22vocab_size%22%3A%2050257%2C%20%20%23%20%E8%AA%9E%E5%BD%99%E3%82%B5%E3%82%A4%E3%82%BA%0A%20%20%20%20%20%20%20%20%22context_length%22%3A%20256%2C%20%20%23%20%E7%9F%AD%E7%B8%AE%E3%81%97%E3%81%9F%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E9%95%B7%EF%BC%88%E5%85%83%E3%81%AF1024%EF%BC%89%0A%20%20%20%20%20%20%20%20%22emb_dim%22%3A%20768%2C%20%20%23%20%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E6%AC%A1%E5%85%83%0A%20%20%20%20%20%20%20%20%22n_heads%22%3A%2012%2C%20%20%23%20%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%98%E3%83%83%E3%83%89%E6%95%B0%0A%20%20%20%20%20%20%20%20%22n_layers%22%3A%2012%2C%20%20%23%20%E5%B1%A4%E6%95%B0%0A%20%20%20%20%20%20%20%20%22drop_rate%22%3A%200.1%2C%20%20%23%20%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%82%A2%E3%82%A6%E3%83%88%E7%8E%87%0A%20%20%20%20%20%20%20%20%22qkv_bias%22%3A%20False%2C%20%20%23%20Query-Key-Value%20%E3%81%AE%E3%83%90%E3%82%A4%E3%82%A2%E3%82%B9%0A%20%20%20%20%7D%0A%0A%20%20%20%20torch.manual_seed(123)%0A%20%20%20%20random_model%20%3D%20GPTModel(GPT_CONFIG_124M)%0A%20%20%20%20random_model.eval()%3B%20%20%23%20%E6%8E%A8%E8%AB%96%E6%99%82%E3%81%AF%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%82%A2%E3%82%A6%E3%83%88%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%0A%20%20%20%20return%20GPT_CONFIG_124M%2C%20random_model%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%8B%E3%82%89%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3ID%E3%81%B8%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3%E9%96%A2%E6%95%B0%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20text_to_token_ids(text%2C%20tokenizer)%3A%0A%20%20%20%20%23%20%E3%83%91%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AE%E3%81%9F%E3%82%81%20EOT%20%E3%81%8C%E5%BF%85%E8%A6%81%0A%20%20%20%20encoded%20%3D%20tokenizer.encode(text%2C%20allowed_special%3D%7B%22%3C%7Cendoftext%7C%3E%22%7D)%0A%20%20%20%20encoded_tensor%20%3D%20torch.tensor(encoded).unsqueeze(0)%20%20%23%20%E3%83%90%E3%83%83%E3%83%81%E6%AC%A1%E5%85%83%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%0A%20%20%20%20return%20encoded_tensor%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3ID%E3%81%8B%E3%82%89%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%B8%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3%E9%96%A2%E6%95%B0%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20token_ids_to_text(token_ids%2C%20tokenizer)%3A%0A%20%20%20%20flat%20%3D%20token_ids.squeeze(0)%20%20%23%20%E3%83%90%E3%83%83%E3%83%81%E6%AC%A1%E5%85%83%E3%82%92%E9%99%A4%E5%8E%BB%E3%81%99%E3%82%8B%0A%20%20%20%20return%20tokenizer.decode(flat.tolist())%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%AF%E4%B8%8A%E8%A8%98%E3%81%AE%E9%96%A2%E6%95%B0%E3%82%92%E4%BD%BF%E3%81%86%E4%BE%8B%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%BE%E3%81%A0%E5%AD%A6%E7%BF%92%E3%81%97%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%80%81%E5%87%BA%E5%8A%9B%E3%81%AF%E6%84%8F%E5%91%B3%E3%82%92%E3%81%AA%E3%81%95%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(GPT_CONFIG_124M%2C%20random_model)%3A%0A%20%20%20%20_start_context%20%3D%20%22Every%20effort%20moves%20you%22%0A%20%20%20%20tokenizer%20%3D%20tiktoken.get_encoding(%22gpt2%22)%0A%0A%20%20%20%20_token_ids%20%3D%20generate_text_simple(%0A%20%20%20%20%20%20%20%20model%3Drandom_model%2C%0A%20%20%20%20%20%20%20%20idx%3Dtext_to_token_ids(_start_context%2C%20tokenizer)%2C%0A%20%20%20%20%20%20%20%20max_new_tokens%3D10%2C%0A%20%20%20%20%20%20%20%20context_size%3DGPT_CONFIG_124M%5B%22context_length%22%5D%0A%20%20%20%20)%0A%0A%20%20%20%20print(%22Output%20text%3A%5Cn%22%2C%20token_ids_to_text(_token_ids%2C%20tokenizer))%0A%20%20%20%20return%20(tokenizer%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%23%205.1.2%20%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E7%94%9F%E6%88%90%E3%81%AE%E6%90%8D%E5%A4%B1%E3%81%AE%E8%A8%88%E7%AE%97%3A%20%E4%BA%A4%E5%B7%AE%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AD%E3%83%94%E3%83%BC%E3%81%A8%E3%83%91%E3%83%BC%E3%83%97%E3%83%AC%E3%82%AD%E3%82%B7%E3%83%86%E3%82%A3%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%E5%AD%A6%E7%BF%92%E6%90%8D%E5%A4%B1%E3%81%AE%E8%A8%88%E7%AE%97%E6%96%B9%E6%B3%95%E3%82%92%E7%A4%BA%E3%81%99%E3%81%9F%E3%82%81%E3%80%81%E3%81%93%E3%82%8C%E3%82%89%E3%81%AE%E5%85%A5%E5%8A%9B%E3%81%A8%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%82%92%E4%BD%BF%E3%81%86%E3%80%82%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%20inputs%20%3D%20torch.tensor(%5B%5B16833%2C%203626%2C%206100%5D%2C%20%20%20%23%20%5B%22every%20effort%20moves%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B40%2C%20%20%20%201107%2C%20588%5D%5D)%20%20%20%23%20%20%22I%20really%20like%22%5D%0A%0A%20%20%20%20targets%20%3D%20torch.tensor(%5B%5B3626%2C%206100%2C%20345%20%20%5D%2C%20%20%23%20%5B%22%20effort%20moves%20you%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B1107%2C%20%20588%2C%2011311%5D%5D)%20%23%20%20%22%20really%20like%20chocolate%22%5D%0A%20%20%20%20return%20inputs%2C%20targets%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20random_model%20%E3%81%AE%E6%8E%A8%E8%AB%96%E3%81%A7%E3%80%81%E6%AC%A1%E3%81%AE%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3ID%E3%81%AE%E7%A2%BA%E7%8E%87%E3%82%92%E5%BE%97%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(inputs%2C%20random_model)%3A%0A%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20logits%20%3D%20random_model(inputs)%0A%0A%20%20%20%20probas%20%3D%20torch.softmax(logits%2C%20dim%3D-1)%20%23%20%E8%AA%9E%E5%BD%99%E5%86%85%E3%81%AE%E5%90%84%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E7%A2%BA%E7%8E%87%0A%20%20%20%20print(f%22%7Bprobas.shape%3D%7D%22)%20%23%20%E5%BD%A2%E7%8A%B6%3A%20(batch_size%2C%20num_tokens%2C%20vocab_size)%0A%20%20%20%20return%20logits%2C%20probas%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E8%B2%AA%E6%AC%B2%E3%81%AA%E6%96%B9%E6%B3%95%E3%81%A7%E6%AC%A1%E3%81%AE%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3ID%E3%82%92%E5%BE%97%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(probas)%3A%0A%20%20%20%20token_ids%20%3D%20torch.argmax(probas%2C%20dim%3D-1%2C%20keepdim%3DTrue)%0A%20%20%20%20print(%22Token%20IDs%3A%5Cn%22%2C%20token_ids)%0A%20%20%20%20return%20(token_ids%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%81%A8%E4%BA%88%E6%B8%AC%E3%81%AE%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3ID%E3%82%92%E6%AF%94%E8%BC%83%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(targets%2C%20token_ids%2C%20tokenizer)%3A%0A%20%20%20%20print(f%22Targets%20batch%201%3A%20%7Btoken_ids_to_text(targets%5B0%5D%2C%20tokenizer)%7D%22)%0A%20%20%20%20print(f%22Outputs%20batch%201%3A%20%7Btoken_ids_to_text(token_ids%5B0%5D.flatten()%2C%20tokenizer)%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%E3%81%9D%E3%81%AE%E5%B7%AE%E3%82%92%E5%AE%9A%E9%87%8F%E7%9A%84%E3%81%AB%E8%A9%95%E4%BE%A1%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E4%B8%8A%E8%A8%98%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%8B%E3%82%89%E3%80%81%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E7%A2%BA%E7%8E%87%EF%BC%88%E5%B0%A4%E5%BA%A6%EF%BC%89%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%60probas%60%20%E3%81%AF%20(batch_size%2C%20num_tokens%2C%20vocab_size)%20%E3%81%AE%E5%BD%A2%E7%8A%B6%E3%81%A7%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E6%80%9D%E3%81%84%E5%87%BA%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(probas%2C%20targets)%3A%0A%20%20%20%20_text_idx%20%3D%200%0A%20%20%20%20target_probas_1%20%3D%20probas%5B_text_idx%2C%20%5B0%2C%201%2C%202%5D%2C%20targets%5B_text_idx%5D%5D%0A%20%20%20%20print(%22Text%201%3A%22%2C%20target_probas_1)%0A%0A%20%20%20%20_text_idx%20%3D%201%0A%20%20%20%20target_probas_2%20%3D%20probas%5B_text_idx%2C%20%5B0%2C%201%2C%202%5D%2C%20targets%5B_text_idx%5D%5D%0A%20%20%20%20print(%22Text%202%3A%22%2C%20target_probas_2)%0A%20%20%20%20return%20target_probas_1%2C%20target_probas_2%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%82%89%E3%81%AE%20%60log%60%20%E3%82%92%E5%8F%96%E3%82%8A%E3%80%81%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AD%E3%83%94%E3%83%BC%EF%BC%88%E3%81%99%E3%81%AA%E3%82%8F%E3%81%A1%E5%AF%BE%E6%95%B0%E5%B0%A4%E5%BA%A6%EF%BC%89%E3%82%92%E5%BE%97%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(target_probas_1%2C%20target_probas_2)%3A%0A%20%20%20%20%23%20%E5%85%A8%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E7%A2%BA%E7%8E%87%E3%81%AE%E5%AF%BE%E6%95%B0%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%0A%20%20%20%20log_probas%20%3D%20torch.log(torch.cat((target_probas_1%2C%20target_probas_2)))%0A%20%20%20%20print(log_probas)%0A%20%20%20%20return%20(log_probas%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%9D%E3%81%AE%E5%B9%B3%E5%9D%87%E3%82%B9%E3%82%B3%E3%82%A2%E3%82%92%E6%B1%82%E3%82%81%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%AF%E4%BA%A4%E5%B7%AE%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AD%E3%83%94%E3%83%BC%E6%90%8D%E5%A4%B1%E3%81%A8%E5%91%BC%E3%81%B0%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(log_probas)%3A%0A%20%20%20%20%23%20%E5%90%84%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E5%B9%B3%E5%9D%87%E7%A2%BA%E7%8E%87%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%0A%20%20%20%20avg_log_probas%20%3D%20torch.mean(log_probas)%0A%20%20%20%20print(avg_log_probas)%0A%20%20%20%20return%20(avg_log_probas%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%AE%9F%E8%A3%85%E4%B8%8A%E3%81%AF%E3%80%81%E6%AD%A3%E3%81%AE%E5%AF%BE%E6%95%B0%E3%81%AE%E6%9C%80%E5%A4%A7%E5%8C%96%E3%82%88%E3%82%8A%E3%82%82%E3%80%81%E8%B2%A0%E3%81%AE%E5%AF%BE%E6%95%B0%E3%81%AE%E6%9C%80%E5%B0%8F%E5%8C%96%E3%81%8C%E5%A5%BD%E3%81%BE%E3%82%8C%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%AF%E8%B2%A0%E3%81%AE%E5%AF%BE%E6%95%B0%E5%B0%A4%E5%BA%A6%20(nll)%20%E3%81%A8%E3%82%82%E5%91%BC%E3%81%B0%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(avg_log_probas)%3A%0A%20%20%20%20_neg_avg_log_probas%20%3D%20avg_log_probas%20*%20-1%0A%20%20%20%20print(_neg_avg_log_probas)%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%E3%81%93%E3%82%8C%E3%82%89%E3%81%AE%E8%A8%88%E7%AE%97%E3%82%92%20PyTorch%20%E3%81%A7%E8%A1%8C%E3%81%86%E3%80%82%0A%20%20%20%20%E3%81%9D%E3%81%AE%E5%89%8D%E3%81%AB%E3%80%81%E6%AF%94%E8%BC%83%E3%81%AE%E3%81%9F%E3%82%81%E3%83%AD%E3%82%B8%E3%83%83%E3%83%88%E3%81%A8%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%81%AE%E5%BD%A2%E7%8A%B6%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(logits%2C%20targets)%3A%0A%20%20%20%20%23%20%E3%83%AD%E3%82%B8%E3%83%83%E3%83%88%E3%81%AF%20(batch_size%2C%20num_tokens%2C%20vocab_size)%20%E3%81%AE%E5%BD%A2%E7%8A%B6%0A%20%20%20%20print(%22Logits%20shape%3A%22%2C%20logits.shape)%0A%0A%20%20%20%20%23%20%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88%E3%81%AF%20(batch_size%2C%20num_tokens)%20%E3%81%AE%E5%BD%A2%E7%8A%B6%0A%20%20%20%20print(%22Targets%20shape%3A%22%2C%20targets.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%20PyTorch%20%E3%81%AE%E9%96%A2%E6%95%B0%E3%82%92%E9%81%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%80%81%60flatten%60%20%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(logits%2C%20targets)%3A%0A%20%20%20%20logits_flat%20%3D%20logits.flatten(0%2C%201)%0A%20%20%20%20targets_flat%20%3D%20targets.flatten()%0A%0A%20%20%20%20print(%22Flattened%20logits%3A%22%2C%20logits_flat.shape)%0A%20%20%20%20print(%22Flattened%20targets%3A%22%2C%20targets_flat.shape)%0A%20%20%20%20return%20logits_flat%2C%20targets_flat%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E7%B6%9A%E3%81%84%E3%81%A6%E3%80%81%E3%81%93%E3%82%8C%E3%82%89%E3%82%92%20%60cross_entropy%60%20%E3%81%AB%E6%B8%A1%E3%81%97%E3%81%A6%20softmax%E3%83%BBlog%E3%83%BB%E5%B9%B3%E5%9D%87%E3%83%BB%E7%AC%A6%E5%8F%B7%E5%8F%8D%E8%BB%A2%E3%82%92%E8%A1%8C%E3%81%86%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%AF%E5%89%8D%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%A8%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(logits_flat%2C%20targets_flat)%3A%0A%20%20%20%20loss%20%3D%20torch.nn.functional.cross_entropy(logits_flat%2C%20targets_flat)%0A%20%20%20%20print(loss)%0A%20%20%20%20return%20(loss%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E4%BA%A4%E5%B7%AE%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AD%E3%83%94%E3%83%BC%E3%81%AE%E6%8C%87%E6%95%B0%E3%81%AF%E3%83%91%E3%83%BC%E3%83%97%E3%83%AC%E3%82%AD%E3%82%B7%E3%83%86%E3%82%A3%E3%81%A8%E5%91%BC%E3%81%B0%E3%82%8C%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E7%A2%BA%E7%8E%87%E5%88%86%E5%B8%83%E3%81%8C%E4%B8%80%E6%A7%98%E3%81%A7%E3%81%82%E3%82%8B%EF%BC%88%E6%9C%80%E3%82%82%E4%B8%8D%E7%A2%BA%E5%AE%9F%E3%81%AA%EF%BC%89%E5%A0%B4%E5%90%88%E3%80%81%E3%83%91%E3%83%BC%E3%83%97%E3%83%AC%E3%82%AD%E3%82%B7%E3%83%86%E3%82%A3%E3%81%AF%E8%AA%9E%E5%BD%99%E3%82%B5%E3%82%A4%E3%82%BA%20%24N%24%20%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E6%AC%A1%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E6%9B%B8%E3%81%91%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%5C%5B%0A%20%20%20%20%5Cbegin%7Baligned%7D%0A%20%20%20%20PP%0A%20%20%20%20%26%3D%5Cexp%5Cleft(-%5Csum_%7Bi%3D1%7D%5EN%5Cfrac%7B1%7D%7BN%7D%5Clog%5Cfrac%7B1%7D%7BN%7D%5Cright)%20%5C%5C%0A%20%20%20%20%26%3D%5Cexp%5Cleft(-%5Clog%5Cfrac%7B1%7D%7BN%7D%5Cright)%20%5C%5C%0A%20%20%20%20%26%3DN.%0A%20%20%20%20%5Cend%7Baligned%7D%0A%20%20%20%20%5C%5D%0A%0A%20%20%20%20%E3%81%97%E3%81%9F%E3%81%8C%E3%81%A3%E3%81%A6%E3%80%81%E3%81%93%E3%82%8C%E3%81%AF%E8%AA%9E%E5%BD%99%E6%95%B0%E3%82%92%E5%8D%98%E4%BD%8D%E3%81%A8%E3%81%97%E3%81%9F%E4%BA%88%E6%B8%AC%E3%81%AE%E4%B8%8D%E7%A2%BA%E5%AE%9F%E6%80%A7%E3%81%A8%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%82%92%E6%8C%81%E3%81%A4%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(loss)%3A%0A%20%20%20%20_perplexity%20%3D%20torch.exp(loss)%0A%20%20%20%20print(_perplexity)%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%23%205.1.3%20%E5%AD%A6%E7%BF%92%E3%82%BB%E3%83%83%E3%83%88%E3%81%A8%E6%A4%9C%E8%A8%BC%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E6%90%8D%E5%A4%B1%E3%81%AE%E8%A8%88%E7%AE%97%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%E5%85%AC%E9%96%8B%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E5%B0%8F%E3%81%95%E3%81%AA%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%81%A7%E3%80%81%E3%81%93%E3%81%AE%E6%90%8D%E5%A4%B1%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%BE%E3%81%9A%E3%80%81%E3%81%9D%E3%82%8C%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E3%80%82%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%20file_path%20%3D%20download_verdict_data()%0A%20%20%20%20with%20open(file_path%2C%20%22r%22%2C%20encoding%3D%22utf-8%22)%20as%20_file%3A%0A%20%20%20%20%20%20%20%20text_data%20%3D%20_file.read()%0A%20%20%20%20return%20(text_data%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%85%88%E9%A0%AD%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(text_data)%3A%0A%20%20%20%20%23%20%E5%85%88%E9%A0%AD99%E6%96%87%E5%AD%97%0A%20%20%20%20print(text_data%5B%3A99%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%20%E6%9C%AB%E5%B0%BE%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(text_data)%3A%0A%20%20%20%20%23%20%E6%9C%AB%E5%B0%BE99%E6%96%87%E5%AD%97%0A%20%20%20%20print(text_data%5B-99%3A%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%20%E3%81%93%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E8%A6%8F%E6%A8%A1%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%E5%B0%8F%E3%81%95%E3%81%8F%E3%80%81%E5%AD%A6%E7%BF%92%E3%82%92%E8%A9%A6%E3%81%99%E3%81%AB%E3%81%AF%E5%8D%81%E5%88%86%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(text_data%2C%20tokenizer)%3A%0A%20%20%20%20_total_characters%20%3D%20len(text_data)%0A%20%20%20%20total_tokens%20%3D%20len(tokenizer.encode(text_data))%0A%0A%20%20%20%20print(%22Characters%3A%22%2C%20_total_characters)%0A%20%20%20%20print(%22Tokens%3A%22%2C%20total_tokens)%0A%20%20%20%20return%20(total_tokens%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E6%AC%A1%E3%81%AE%E5%89%B2%E5%90%88%E3%81%A7%E5%88%86%E5%89%B2%E3%81%97%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%5C%5B%0A%20%20%20%20%5Ctext%7Btrain%7D%3A%5Ctext%7Bvalid%7D%3D90%5C%25%3A10%5C%25.%0A%20%20%20%20%5C%5D%0A%0A%20%20%20%20%E9%96%A2%E6%95%B0%20%60create_dataloader_v1%60%20%E3%81%AF%5B%E7%AC%AC2%E7%AB%A0%5D(.%2Fch02.py)%E3%81%A7%E5%AE%9A%E7%BE%A9%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%E5%AE%9A%E7%BE%A9%E3%81%AF%E3%81%9D%E3%81%A1%E3%82%89%E3%82%92%E5%8F%82%E7%85%A7%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(GPT_CONFIG_124M%2C%20text_data)%3A%0A%20%20%20%20%23%20%E5%AD%A6%E7%BF%92%E3%83%BB%E6%A4%9C%E8%A8%BC%E3%81%AE%E5%89%B2%E5%90%88%0A%20%20%20%20train_ratio%20%3D%200.90%0A%20%20%20%20split_idx%20%3D%20int(train_ratio%20*%20len(text_data))%0A%20%20%20%20train_data%20%3D%20text_data%5B%3Asplit_idx%5D%0A%20%20%20%20val_data%20%3D%20text_data%5Bsplit_idx%3A%5D%0A%0A%20%20%20%20torch.manual_seed(123)%0A%0A%20%20%20%20train_loader%20%3D%20create_dataloader_v1(%0A%20%20%20%20%20%20%20%20train_data%2C%0A%20%20%20%20%20%20%20%20batch_size%3D2%2C%20%20%20%23%20%E8%A8%88%E7%AE%97%E8%B3%87%E6%BA%90%E3%82%92%E7%AF%80%E7%B4%84%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%0A%20%20%20%20%20%20%20%20max_length%3DGPT_CONFIG_124M%5B%22context_length%22%5D%2C%0A%20%20%20%20%20%20%20%20stride%3DGPT_CONFIG_124M%5B%22context_length%22%5D%2C%0A%20%20%20%20%20%20%20%20drop_last%3DTrue%2C%0A%20%20%20%20%20%20%20%20shuffle%3DTrue%2C%0A%20%20%20%20%20%20%20%20num_workers%3D0%0A%20%20%20%20)%0A%0A%20%20%20%20val_loader%20%3D%20create_dataloader_v1(%0A%20%20%20%20%20%20%20%20val_data%2C%0A%20%20%20%20%20%20%20%20batch_size%3D2%2C%0A%20%20%20%20%20%20%20%20max_length%3DGPT_CONFIG_124M%5B%22context_length%22%5D%2C%0A%20%20%20%20%20%20%20%20stride%3DGPT_CONFIG_124M%5B%22context_length%22%5D%2C%0A%20%20%20%20%20%20%20%20drop_last%3DFalse%2C%0A%20%20%20%20%20%20%20%20shuffle%3DFalse%2C%0A%20%20%20%20%20%20%20%20num_workers%3D0%0A%20%20%20%20)%0A%20%20%20%20return%20train_loader%2C%20train_ratio%2C%20val_loader%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%82%B5%E3%83%8B%E3%83%86%E3%82%A3%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(GPT_CONFIG_124M%2C%20total_tokens%2C%20train_ratio)%3A%0A%20%20%20%20if%20total_tokens%20*%20(train_ratio)%20%3C%20GPT_CONFIG_124M%5B%22context_length%22%5D%3A%0A%20%20%20%20%20%20%20%20print(%22Not%20enough%20tokens%20for%20the%20training%20loader.%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Try%20to%20lower%20the%20%60GPT_CONFIG_124M%5B'context_length'%5D%60%20or%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22increase%20the%20%60training_ratio%60%22)%0A%0A%20%20%20%20if%20total_tokens%20*%20(1-train_ratio)%20%3C%20GPT_CONFIG_124M%5B%22context_length%22%5D%3A%0A%20%20%20%20%20%20%20%20print(%22Not%20enough%20tokens%20for%20the%20validation%20loader.%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Try%20to%20lower%20the%20%60GPT_CONFIG_124M%5B'context_length'%5D%60%20or%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22decrease%20the%20%60training_ratio%60%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%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E5%8B%95%E4%BD%9C%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%82%89%E3%81%AF%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E5%85%A8%E3%83%90%E3%83%83%E3%83%81%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E7%A2%BA%E3%81%8B%E3%81%AB%E3%80%81%E5%AD%A6%E7%BF%92%E3%83%90%E3%83%83%E3%83%81%E6%95%B0%E3%81%AF9%E3%80%81%E6%A4%9C%E8%A8%BC%E3%83%90%E3%83%83%E3%83%81%E6%95%B0%E3%81%AF1%E3%81%A7%E3%81%82%E3%82%8A%E3%80%81%E5%89%B2%E5%90%88%E3%82%92%E5%8F%8D%E6%98%A0%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(train_loader%2C%20val_loader)%3A%0A%20%20%20%20print(%22Train%20loader%3A%22)%0A%20%20%20%20for%20_x%2C%20_y%20in%20train_loader%3A%0A%20%20%20%20%20%20%20%20print(_x.shape%2C%20_y.shape)%0A%0A%20%20%20%20print(%22%5CnValidation%20loader%3A%22)%0A%20%20%20%20for%20_x%2C%20_y%20in%20val_loader%3A%0A%20%20%20%20%20%20%20%20print(_x.shape%2C%20_y.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%20%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E7%B7%8F%E6%95%B0%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%80%82%E3%81%8A%E3%82%88%E3%81%9D5k%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(train_loader%2C%20val_loader)%3A%0A%20%20%20%20_train_tokens%20%3D%200%0A%20%20%20%20for%20_input_batch%2C%20_target_batch%20in%20train_loader%3A%0A%20%20%20%20%20%20%20%20_train_tokens%20%2B%3D%20_input_batch.numel()%0A%0A%20%20%20%20_val_tokens%20%3D%200%0A%20%20%20%20for%20_input_batch%2C%20_target_batch%20in%20val_loader%3A%0A%20%20%20%20%20%20%20%20_val_tokens%20%2B%3D%20_input_batch.numel()%0A%0A%20%20%20%20print(%22Training%20tokens%3A%22%2C%20_train_tokens)%0A%20%20%20%20print(%22Validation%20tokens%3A%22%2C%20_val_tokens)%0A%20%20%20%20print(%22All%20tokens%3A%22%2C%20_train_tokens%20%2B%20_val_tokens)%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%E3%81%93%E3%82%8C%E3%81%AF%E3%80%81%E3%81%93%E3%82%8C%E3%81%BE%E3%81%A7%E3%81%A8%E5%90%8C%E6%A7%98%E3%81%AB%E4%BA%A4%E5%B7%AE%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AD%E3%83%94%E3%83%BC%E6%90%8D%E5%A4%B1%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%E9%96%A2%E6%95%B0%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20calc_loss_batch(input_batch%2C%20target_batch%2C%20model%2C%20device)%3A%0A%20%20%20%20input_batch%2C%20target_batch%20%3D%20input_batch.to(device)%2C%20target_batch.to(device)%0A%20%20%20%20logits%20%3D%20model(input_batch)%0A%20%20%20%20loss%20%3D%20torch.nn.functional.cross_entropy(logits.flatten(0%2C%201)%2C%20target_batch.flatten())%0A%20%20%20%20return%20loss%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E9%96%A2%E6%95%B0%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%80%81%E6%A9%9F%E8%83%BD%E3%82%92%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E5%85%A8%E4%BD%93%E3%81%B8%E6%8B%A1%E5%BC%B5%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%60num_batches%60%20%E3%82%92%E5%B0%8F%E3%81%95%E3%81%84%E5%80%A4%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E6%90%8D%E5%A4%B1%E3%82%92%E3%82%88%E3%82%8A%E6%89%8B%E8%BB%BD%E3%81%AB%E8%A8%88%E7%AE%97%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20calc_loss_loader(data_loader%2C%20model%2C%20device%2C%20num_batches%3DNone)%3A%0A%20%20%20%20total_loss%20%3D%200.%0A%20%20%20%20if%20len(data_loader)%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20return%20float(%22nan%22)%0A%20%20%20%20elif%20num_batches%20is%20None%3A%0A%20%20%20%20%20%20%20%20num_batches%20%3D%20len(data_loader)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%23%20num_batches%20%E3%81%8C%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E3%81%AE%E3%83%90%E3%83%83%E3%83%81%E6%95%B0%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%0A%20%20%20%20%20%20%20%20%23%20%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E3%81%AE%E7%B7%8F%E3%83%90%E3%83%83%E3%83%81%E6%95%B0%E3%81%AB%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%E3%83%90%E3%83%83%E3%83%81%E6%95%B0%E3%82%92%E6%B8%9B%E3%82%89%E3%81%99%0A%20%20%20%20%20%20%20%20num_batches%20%3D%20min(num_batches%2C%20len(data_loader))%0A%20%20%20%20for%20i%2C%20(input_batch%2C%20target_batch)%20in%20enumerate(data_loader)%3A%0A%20%20%20%20%20%20%20%20if%20i%20%3C%20num_batches%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20loss%20%3D%20calc_loss_batch(input_batch%2C%20target_batch%2C%20model%2C%20device)%0A%20%20%20%20%20%20%20%20%20%20%20%20total_loss%20%2B%3D%20loss.item()%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%20%20%20%20return%20total_loss%20%2F%20num_batches%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%AF%E3%80%81%E5%AD%A6%E7%BF%92%E3%81%A8%E6%8E%A8%E8%AB%96%E3%81%AB%E9%81%A9%E3%81%97%E3%81%9F%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%82%92%E6%A4%9C%E5%87%BA%E3%81%99%E3%82%8B%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3%E9%96%A2%E6%95%B0%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20get_torch_device()%3A%0A%20%20%20%20device%20%3D%20torch.device(%22cpu%22)%0A%20%20%20%20if%20torch.cuda.is_available()%3A%0A%20%20%20%20%20%20%20%20device%20%3D%20torch.device(%22cuda%22)%0A%20%20%20%20elif%20torch.backends.mps.is_available()%3A%0A%20%20%20%20%20%20%20%20%23%20%E5%AE%89%E5%AE%9A%E3%81%97%E3%81%9F%20mps%20%E3%81%AE%E7%B5%90%E6%9E%9C%E3%82%92%E5%BE%97%E3%82%8B%E3%81%AB%E3%81%AF%20PyTorch%202.9%20%E4%BB%A5%E9%99%8D%E3%82%92%E4%BD%BF%E3%81%86%0A%20%20%20%20%20%20%20%20major%2C%20minor%20%3D%20map(int%2C%20torch.__version__.split(%22.%22)%5B%3A2%5D)%0A%20%20%20%20%20%20%20%20if%20(major%2C%20minor)%20%3E%3D%20(2%2C%209)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20device%20%3D%20torch.device(%22mps%22)%0A%20%20%20%20return%20device%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%AF%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E5%85%A8%E4%BD%93%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E6%90%8D%E5%A4%B1%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%E6%9C%80%E5%88%9D%E3%81%AE%E8%A9%A6%E3%81%BF%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%82%89%E3%82%88%E3%82%8A%E6%90%8D%E5%A4%B1%E3%82%92%E4%B8%8B%E3%81%92%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(random_model%2C%20train_loader%2C%20val_loader)%3A%0A%20%20%20%20device%20%3D%20get_torch_device()%0A%20%20%20%20print(f%22Using%20%7Bdevice%7D%20device.%22)%0A%0A%20%20%20%20random_model.to(device)%20%23%20nn.Module%20%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A7%E3%81%AF%20model%20%3D%20model.to(device)%20%E3%81%AE%E4%BB%A3%E5%85%A5%E3%81%AF%E4%B8%8D%E8%A6%81%0A%0A%20%20%20%20torch.manual_seed(123)%20%23%20%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E3%81%AE%E3%82%B7%E3%83%A3%E3%83%83%E3%83%95%E3%83%AB%E3%81%AB%E3%82%88%E3%82%8B%E5%86%8D%E7%8F%BE%E6%80%A7%E3%81%AE%E3%81%9F%E3%82%81%0A%0A%20%20%20%20with%20torch.no_grad()%3A%20%23%20%E3%81%BE%E3%81%A0%E5%AD%A6%E7%BF%92%E3%81%97%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%81%AE%E3%81%A7%E3%80%81%E5%8A%B9%E7%8E%87%E3%81%AE%E3%81%9F%E3%82%81%E5%8B%BE%E9%85%8D%E8%BF%BD%E8%B7%A1%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20train_loss%20%3D%20calc_loss_loader(train_loader%2C%20random_model%2C%20device)%0A%20%20%20%20%20%20%20%20val_loss%20%3D%20calc_loss_loader(val_loader%2C%20random_model%2C%20device)%0A%0A%20%20%20%20print(%22Training%20loss%3A%22%2C%20train_loss)%0A%20%20%20%20print(%22Validation%20loss%3A%22%2C%20val_loss)%0A%20%20%20%20return%20(device%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%205.2%20LLM%20%E3%81%AE%E5%AD%A6%E7%BF%92%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%E5%AD%A6%E7%BF%92%E3%81%AE%E6%B5%81%E3%82%8C%E3%81%AF%E6%AC%A1%E3%81%AE%E9%80%9A%E3%82%8A%E3%80%82%60evaluate_model()%60%20%E3%81%A8%20%60generate_and_print_sample()%60%20%E3%81%AF%E5%BE%8C%E3%81%A7%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20train_model_simple(model%2C%20train_loader%2C%20val_loader%2C%20optimizer%2C%20device%2C%20num_epochs%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20eval_freq%2C%20eval_iter%2C%20start_context%2C%20tokenizer)%3A%0A%20%20%20%20%23%20%E6%90%8D%E5%A4%B1%E3%81%A8%E5%87%A6%E7%90%86%E6%B8%88%E3%81%BF%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E6%95%B0%E3%82%92%E8%A8%98%E9%8C%B2%E3%81%99%E3%82%8B%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%99%E3%82%8B%0A%20%20%20%20train_losses%2C%20val_losses%2C%20track_tokens_seen%20%3D%20%5B%5D%2C%20%5B%5D%2C%20%5B%5D%0A%20%20%20%20tokens_seen%2C%20global_step%20%3D%200%2C%20-1%0A%0A%20%20%20%20%23%20%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%AE%E5%AD%A6%E7%BF%92%E3%83%AB%E3%83%BC%E3%83%97%0A%20%20%20%20for%20epoch%20in%20range(num_epochs)%3A%0A%20%20%20%20%20%20%20%20model.train()%20%20%23%20%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E5%AD%A6%E7%BF%92%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AB%E3%81%99%E3%82%8B%0A%0A%20%20%20%20%20%20%20%20for%20input_batch%2C%20target_batch%20in%20train_loader%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20optimizer.zero_grad()%20%23%20%E5%89%8D%E3%81%AE%E3%83%90%E3%83%83%E3%83%81%E5%8F%8D%E5%BE%A9%E3%81%AE%E6%90%8D%E5%A4%B1%E5%8B%BE%E9%85%8D%E3%82%92%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20loss%20%3D%20calc_loss_batch(input_batch%2C%20target_batch%2C%20model%2C%20device)%0A%20%20%20%20%20%20%20%20%20%20%20%20loss.backward()%20%23%20%E6%90%8D%E5%A4%B1%E5%8B%BE%E9%85%8D%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20optimizer.step()%20%23%20%E6%90%8D%E5%A4%B1%E5%8B%BE%E9%85%8D%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%A2%E3%83%87%E3%83%AB%E9%87%8D%E3%81%BF%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20tokens_seen%20%2B%3D%20input_batch.numel()%0A%20%20%20%20%20%20%20%20%20%20%20%20global_step%20%2B%3D%201%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E4%BB%BB%E6%84%8F%E3%81%AE%E8%A9%95%E4%BE%A1%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20global_step%20%25%20eval_freq%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20train_loss%2C%20val_loss%20%3D%20evaluate_model(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20model%2C%20train_loader%2C%20val_loader%2C%20device%2C%20eval_iter)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20train_losses.append(train_loss)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20val_losses.append(val_loss)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20track_tokens_seen.append(tokens_seen)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22Ep%20%7Bepoch%2B1%7D%20(Step%20%7Bglobal_step%3A06d%7D)%3A%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22Train%20loss%20%7Btrain_loss%3A.3f%7D%2C%20Val%20loss%20%7Bval_loss%3A.3f%7D%22)%0A%0A%20%20%20%20%20%20%20%20%23%20%E5%90%84%E3%82%A8%E3%83%9D%E3%83%83%E3%82%AF%E3%81%AE%E5%BE%8C%E3%81%AB%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20generate_and_print_sample(%0A%20%20%20%20%20%20%20%20%20%20%20%20model%2C%20tokenizer%2C%20device%2C%20start_context%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20return%20train_losses%2C%20val_losses%2C%20track_tokens_seen%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%AF%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E5%85%A8%E4%BD%93%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E6%90%8D%E5%A4%B1%E3%82%92%E5%AE%9A%E9%87%8F%E7%9A%84%E3%81%AB%E8%A9%95%E4%BE%A1%E3%81%99%E3%82%8B%E9%96%A2%E6%95%B0%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20evaluate_model(model%2C%20train_loader%2C%20val_loader%2C%20device%2C%20eval_iter)%3A%0A%20%20%20%20model.eval()%20%20%20%20%23%20%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%82%A2%E3%82%A6%E3%83%88%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%0A%20%20%20%20with%20torch.no_grad()%3A%20%20%20%23%20%E5%8B%BE%E9%85%8D%E8%A8%88%E7%AE%97%E3%82%92%E3%82%B9%E3%82%AD%E3%83%83%E3%83%97%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20train_loss%20%3D%20calc_loss_loader(train_loader%2C%20model%2C%20device%2C%20num_batches%3Deval_iter)%0A%20%20%20%20%20%20%20%20val_loss%20%3D%20calc_loss_loader(val_loader%2C%20model%2C%20device%2C%20num_batches%3Deval_iter)%0A%20%20%20%20model.train()%20%20%20%20%23%20%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%82%A2%E3%82%A6%E3%83%88%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%0A%20%20%20%20return%20train_loss%2C%20val_loss%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%AF%E3%80%81%E5%87%BA%E5%8A%9B%E3%82%92%E5%AE%9A%E6%80%A7%E7%9A%84%E3%81%AB%E8%A9%95%E4%BE%A1%E3%81%99%E3%82%8B%E9%96%A2%E6%95%B0%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20generate_and_print_sample(model%2C%20tokenizer%2C%20device%2C%20start_context)%3A%0A%20%20%20%20model.eval()%0A%20%20%20%20context_size%20%3D%20model.pos_emb.weight.shape%5B0%5D%0A%20%20%20%20encoded%20%3D%20text_to_token_ids(start_context%2C%20tokenizer).to(device)%0A%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20token_ids%20%3D%20generate_text_simple(%0A%20%20%20%20%20%20%20%20%20%20%20%20model%3Dmodel%2C%20idx%3Dencoded%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20max_new_tokens%3D50%2C%20context_size%3Dcontext_size%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20decoded_text%20%3D%20token_ids_to_text(token_ids%2C%20tokenizer)%0A%20%20%20%20print(decoded_text.replace(%22%5Cn%22%2C%20%22%20%22))%20%20%23%20%E3%82%B3%E3%83%B3%E3%83%91%E3%82%AF%E3%83%88%E3%81%AA%E8%A1%A8%E7%A4%BA%E5%BD%A2%E5%BC%8F%0A%20%20%20%20model.train()%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E9%81%8E%E5%AD%A6%E7%BF%92%E3%82%92%E6%8A%91%E3%81%88%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%60AdamW%60%20%E3%82%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%9E%E3%82%A4%E3%82%B6%E3%82%92%E4%BD%BF%E3%81%86%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(GPT_CONFIG_124M%2C%20device%2C%20tokenizer%2C%20train_loader%2C%20val_loader)%3A%0A%20%20%20%20torch.manual_seed(123)%0A%20%20%20%20model%20%3D%20GPTModel(GPT_CONFIG_124M)%0A%20%20%20%20model.to(device)%0A%20%20%20%20optimizer%20%3D%20torch.optim.AdamW(model.parameters()%2C%20lr%3D0.0004%2C%20weight_decay%3D0.1)%0A%0A%20%20%20%20num_epochs%20%3D%2010%0A%20%20%20%20train_losses%2C%20val_losses%2C%20tokens_seen%20%3D%20train_model_simple(%0A%20%20%20%20%20%20%20%20model%2C%20train_loader%2C%20val_loader%2C%20optimizer%2C%20device%2C%0A%20%20%20%20%20%20%20%20num_epochs%3Dnum_epochs%2C%20eval_freq%3D5%2C%20eval_iter%3D5%2C%0A%20%20%20%20%20%20%20%20start_context%3D%22Every%20effort%20moves%20you%22%2C%20tokenizer%3Dtokenizer%0A%20%20%20%20)%0A%20%20%20%20return%20model%2C%20num_epochs%2C%20optimizer%2C%20tokens_seen%2C%20train_losses%2C%20val_losses%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%AD%A6%E7%BF%92%E9%81%8E%E7%A8%8B%E3%81%AE%E3%83%97%E3%83%AD%E3%83%83%E3%83%88%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(project_root)%3A%0A%20%20%20%20data_root%20%3D%20project_root%20%2F%20%22data%22%20%2F%20%22ch05%22%0A%20%20%20%20data_root.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%20%20%20%20return%20(data_root%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%AD%A6%E7%BF%92%E9%81%8E%E7%A8%8B%E3%82%92%E3%83%97%E3%83%AD%E3%83%83%E3%83%88%E3%81%99%E3%82%8B%E9%96%A2%E6%95%B0%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20plot_losses(epochs_seen%2C%20tokens_seen%2C%20train_losses%2C%20val_losses%2C%20data_root)%3A%0A%20%20%20%20fig%2C%20ax1%20%3D%20plt.subplots(figsize%3D(5%2C%203))%0A%0A%20%20%20%20%23%20%E5%AD%A6%E7%BF%92%E6%90%8D%E5%A4%B1%E3%81%A8%E6%A4%9C%E8%A8%BC%E6%90%8D%E5%A4%B1%E3%82%92%E3%82%A8%E3%83%9D%E3%83%83%E3%82%AF%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E3%83%97%E3%83%AD%E3%83%83%E3%83%88%E3%81%99%E3%82%8B%0A%20%20%20%20ax1.plot(epochs_seen%2C%20train_losses%2C%20label%3D%22Training%20loss%22)%0A%20%20%20%20ax1.plot(epochs_seen%2C%20val_losses%2C%20linestyle%3D%22-.%22%2C%20label%3D%22Validation%20loss%22)%0A%20%20%20%20ax1.set_xlabel(%22Epochs%22)%0A%20%20%20%20ax1.set_ylabel(%22Loss%22)%0A%20%20%20%20ax1.legend(loc%3D%22upper%20right%22)%0A%20%20%20%20ax1.xaxis.set_major_locator(MaxNLocator(integer%3DTrue))%20%20%23%20x%E8%BB%B8%E3%81%AB%E3%81%AF%E6%95%B4%E6%95%B0%E3%83%A9%E3%83%99%E3%83%AB%E3%81%AE%E3%81%BF%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%0A%0A%20%20%20%20%23%20%E5%87%A6%E7%90%86%E6%B8%88%E3%81%BF%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E6%95%B0%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE2%E3%81%A4%E7%9B%AE%E3%81%AEx%E8%BB%B8%E3%82%92%E4%BD%9C%E3%82%8B%0A%20%20%20%20ax2%20%3D%20ax1.twiny()%20%20%23%20%E5%90%8C%E3%81%98y%E8%BB%B8%E3%82%92%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B2%E3%81%A4%E7%9B%AE%E3%81%AEx%E8%BB%B8%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%0A%20%20%20%20ax2.plot(tokens_seen%2C%20train_losses%2C%20alpha%3D0)%20%20%23%20%E7%9B%AE%E7%9B%9B%E3%82%8A%E3%82%92%E3%81%9D%E3%82%8D%E3%81%88%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E4%B8%8D%E5%8F%AF%E8%A6%96%E3%83%97%E3%83%AD%E3%83%83%E3%83%88%0A%20%20%20%20ax2.set_xlabel(%22Tokens%20seen%22)%0A%0A%20%20%20%20fig.tight_layout()%20%20%23%20%E4%BD%99%E7%99%BD%E3%82%92%E7%A2%BA%E4%BF%9D%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88%E3%82%92%E8%AA%BF%E6%95%B4%E3%81%99%E3%82%8B%0A%20%20%20%20plt.savefig(data_root%20%2F%20%22loss-plot.pdf%22)%0A%20%20%20%20plt.show()%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%B0%8F%E3%81%95%E3%81%AA%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%81%A7%E5%AD%A6%E7%BF%92%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E7%B5%90%E6%9E%9C%E3%81%AF%E9%81%8E%E5%AD%A6%E7%BF%92%E3%82%92%E7%A4%BA%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(data_root%2C%20num_epochs%2C%20tokens_seen%2C%20train_losses%2C%20val_losses)%3A%0A%20%20%20%20epochs_tensor%20%3D%20torch.linspace(0%2C%20num_epochs%2C%20len(train_losses))%0A%20%20%20%20plot_losses(epochs_tensor%2C%20tokens_seen%2C%20train_losses%2C%20val_losses%2C%20data_root)%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%205.3%20%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E6%80%A7%E3%82%92%E5%88%B6%E5%BE%A1%E3%81%99%E3%82%8B%E3%83%87%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E6%88%A6%E7%95%A5%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%60generate_text_simple%60%20%E3%81%AF%E8%B2%AA%E6%AC%B2%E3%83%87%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E6%88%A6%E7%95%A5%E3%81%AB%E3%82%82%E3%81%A8%E3%81%A5%E3%81%84%E3%81%A6%E3%81%8A%E3%82%8A%E3%80%81%E6%B1%BA%E5%AE%9A%E7%9A%84%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(GPT_CONFIG_124M%2C%20model%2C%20tokenizer)%3A%0A%20%20%20%20%23%20%E6%96%B0%E8%A6%8F%3A%20%E3%81%93%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A7%E3%81%AF%E6%8E%A8%E8%AB%96%E3%81%8C%E8%BB%BD%E3%81%8F%E3%80%81%E3%81%BE%E3%81%9F%E6%9C%AC%E6%9B%B8%E3%81%AE%E6%AE%8B%E3%82%8A%E3%81%AE%E7%AF%80%E3%81%A7%E8%AA%AD%E8%80%85%E3%81%8C%0A%20%20%20%20%23%20%E5%90%8C%E3%81%98%E7%B5%90%E6%9E%9C%E3%82%92%E5%BE%97%E3%82%89%E3%82%8C%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%80%81%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%20CPU%20%E3%82%92%E4%BD%BF%E3%81%86%0A%20%20%20%20inference_device%20%3D%20torch.device(%22cpu%22)%0A%0A%20%20%20%20model.to(inference_device)%0A%20%20%20%20model.eval()%0A%0A%20%20%20%20_token_ids%20%3D%20generate_text_simple(%0A%20%20%20%20%20%20%20%20model%3Dmodel%2C%0A%20%20%20%20%20%20%20%20idx%3Dtext_to_token_ids(%22Every%20effort%20moves%20you%22%2C%20tokenizer).to(inference_device)%2C%0A%20%20%20%20%20%20%20%20max_new_tokens%3D25%2C%0A%20%20%20%20%20%20%20%20context_size%3DGPT_CONFIG_124M%5B%22context_length%22%5D%0A%20%20%20%20)%0A%0A%20%20%20%20print(%22Output%20text%3A%5Cn%22%2C%20token_ids_to_text(_token_ids%2C%20tokenizer))%0A%20%20%20%20return%20(inference_device%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%23%205.3.1%20%E6%B8%A9%E5%BA%A6%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%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%E3%81%93%E3%82%8C%E3%81%AF%E3%80%81%E6%B1%BA%E5%AE%9A%E7%9A%84%E3%81%AA%E6%88%A6%E7%95%A5%E3%81%A8%E7%A2%BA%E7%8E%87%E7%9A%84%E3%81%AA%E6%88%A6%E7%95%A5%E3%81%AE%E9%81%95%E3%81%84%E3%82%92%E7%A4%BA%E3%81%99%E4%BE%8B%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%AF%E8%B2%AA%E6%AC%B2%E3%83%87%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%AB%E3%82%88%E3%82%8A%E6%B1%BA%E5%AE%9A%E7%9A%84%E3%81%AA%E7%B5%90%E6%9E%9C%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E3%80%82%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%20vocab%20%3D%20%7B%20%0A%20%20%20%20%20%20%20%20%22closer%22%3A%200%2C%0A%20%20%20%20%20%20%20%20%22every%22%3A%201%2C%20%0A%20%20%20%20%20%20%20%20%22effort%22%3A%202%2C%20%0A%20%20%20%20%20%20%20%20%22forward%22%3A%203%2C%0A%20%20%20%20%20%20%20%20%22inches%22%3A%204%2C%0A%20%20%20%20%20%20%20%20%22moves%22%3A%205%2C%20%0A%20%20%20%20%20%20%20%20%22pizza%22%3A%206%2C%0A%20%20%20%20%20%20%20%20%22toward%22%3A%207%2C%0A%20%20%20%20%20%20%20%20%22you%22%3A%208%2C%0A%20%20%20%20%7D%20%0A%0A%20%20%20%20inverse_vocab%20%3D%20%7Bv%3A%20k%20for%20k%2C%20v%20in%20vocab.items()%7D%0A%0A%20%20%20%20%23%20%E5%85%A5%E5%8A%9B%E3%81%8C%20%22every%20effort%20moves%20you%22%20%E3%81%A7%E3%80%81LLM%20%E3%81%8C%E6%AC%A1%E3%81%AE%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%0A%20%20%20%20%23%20%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%83%AD%E3%82%B8%E3%83%83%E3%83%88%E3%82%92%E8%BF%94%E3%81%99%E3%81%A8%E4%BB%AE%E5%AE%9A%E3%81%99%E3%82%8B%3A%0A%20%20%20%20next_token_logits%20%3D%20torch.tensor(%0A%20%20%20%20%20%20%20%20%5B4.51%2C%200.89%2C%20-1.90%2C%206.75%2C%201.63%2C%20-1.62%2C%20-1.89%2C%206.28%2C%201.79%5D%0A%20%20%20%20)%0A%0A%20%20%20%20next_probas%20%3D%20torch.softmax(next_token_logits%2C%20dim%3D0)%0A%20%20%20%20next_token_id%20%3D%20torch.argmax(next_probas).item()%0A%0A%20%20%20%20%23%20%E3%81%93%E3%81%AE%E3%81%A8%E3%81%8D%E3%80%81%E6%AC%A1%E3%81%AB%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%82%8B%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AF%E4%BB%A5%E4%B8%8B%E3%81%AE%E9%80%9A%E3%82%8A%3A%0A%20%20%20%20print(inverse_vocab%5Bnext_token_id%5D)%0A%20%20%20%20return%20inverse_vocab%2C%20next_probas%2C%20next_token_logits%2C%20vocab%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%AD%E3%82%B8%E3%83%83%E3%83%88%E3%81%8B%E3%82%89%E5%BE%97%E3%81%9F%E7%A2%BA%E7%8E%87%E3%81%AB%E3%82%82%E3%81%A8%E3%81%A5%E3%81%8F%E7%A2%BA%E7%8E%87%E7%9A%84%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E8%A9%A6%E3%81%99%E3%80%82%0A%20%20%20%20%60forward%60%20%E3%81%8C%E9%AB%98%E3%81%84%E7%A2%BA%E7%8E%87%E3%81%A7%E7%8F%BE%E3%82%8C%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E3%81%93%E3%82%8C%E3%82%82%E5%90%8C%E3%81%98%E5%8D%98%E8%AA%9E%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(inverse_vocab%2C%20next_probas)%3A%0A%20%20%20%20torch.manual_seed(123)%0A%20%20%20%20next_token_id_multinomial%20%3D%20torch.multinomial(next_probas%2C%20num_samples%3D1).item()%0A%20%20%20%20print(inverse_vocab%5Bnext_token_id_multinomial%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%20%E7%A2%BA%E7%8E%87%E7%9A%84%E3%81%AA%E6%8C%AF%E3%82%8B%E8%88%9E%E3%81%84%E3%82%92%E8%A6%8B%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E8%A4%87%E6%95%B0%E5%9B%9E%E8%A9%A6%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(inverse_vocab)%3A%0A%20%20%20%20def%20print_sampled_tokens(probas)%3A%0A%20%20%20%20%20%20%20%20torch.manual_seed(123)%20%23%20%E5%86%8D%E7%8F%BE%E6%80%A7%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E6%89%8B%E5%8B%95%E3%82%B7%E3%83%BC%E3%83%89%0A%20%20%20%20%20%20%20%20sample%20%3D%20%5Btorch.multinomial(probas%2C%20num_samples%3D1).item()%20for%20i%20in%20range(1_000)%5D%0A%20%20%20%20%20%20%20%20sampled_ids%20%3D%20torch.bincount(torch.tensor(sample)%2C%20minlength%3Dlen(probas))%0A%20%20%20%20%20%20%20%20for%20i%2C%20freq%20in%20enumerate(sampled_ids)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%7Bfreq%7D%20x%20%7Binverse_vocab%5Bi%5D%7D%22)%0A%20%20%20%20return%20(print_sampled_tokens%2C)%0A%0A%0A%40app.cell%0Adef%20_(next_probas%2C%20print_sampled_tokens)%3A%0A%20%20%20%20print_sampled_tokens(next_probas)%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%E7%A2%BA%E7%8E%87%E3%82%92%E5%88%B6%E5%BE%A1%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E6%AC%A1%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E6%B8%A9%E5%BA%A6%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%5C%5B%0A%20%20%20%20p(x%3B%5Cbeta)%20%5Cpropto%20%5Cexp%5Cleft(%5Cbeta%20p%5Cright)%0A%20%20%20%20%5C%5D%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20softmax_with_temperature(logits%2C%20temperature)%3A%0A%20%20%20%20scaled_logits%20%3D%20logits%20%2F%20temperature%0A%20%20%20%20return%20torch.softmax(scaled_logits%2C%20dim%3D0)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E6%B8%A9%E5%BA%A6%E3%81%AE%E5%80%A4%E3%82%92%E8%A9%A6%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(next_token_logits)%3A%0A%20%20%20%20%23%20%E6%B8%A9%E5%BA%A6%E3%81%AE%E5%80%A4%0A%20%20%20%20temperatures%20%3D%20%5B1%2C%200.1%2C%205%5D%20%20%23%20%E5%85%83%E3%81%AE%E5%80%A4%E3%80%81%E3%82%88%E3%82%8A%E9%AB%98%E3%81%84%E7%A2%BA%E4%BF%A1%E5%BA%A6%E3%80%81%E3%82%88%E3%82%8A%E4%BD%8E%E3%81%84%E7%A2%BA%E4%BF%A1%E5%BA%A6%0A%0A%20%20%20%20%23%20%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%97%E3%81%9F%E7%A2%BA%E7%8E%87%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%0A%20%20%20%20scaled_probas%20%3D%20%5Bsoftmax_with_temperature(next_token_logits%2C%20T)%20for%20T%20in%20temperatures%5D%0A%20%20%20%20return%20scaled_probas%2C%20temperatures%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%83%97%E3%83%AD%E3%83%83%E3%83%88%E3%81%99%E3%82%8B%E3%80%82%E6%B8%A9%E5%BA%A6%E3%81%8C%E9%AB%98%E3%81%84%E3%81%BB%E3%81%A9%E5%88%86%E5%B8%83%E3%81%8C%E3%82%88%E3%82%8A%E4%B8%80%E6%A7%98%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E5%88%86%E3%81%8B%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(data_root%2C%20scaled_probas%2C%20temperatures%2C%20vocab)%3A%0A%20%20%20%20%23%20%E3%83%97%E3%83%AD%E3%83%83%E3%83%88%0A%20%20%20%20x%20%3D%20torch.arange(len(vocab))%0A%20%20%20%20bar_width%20%3D%200.15%0A%0A%20%20%20%20fig%2C%20ax%20%3D%20plt.subplots(figsize%3D(5%2C%203))%0A%20%20%20%20for%20i%2C%20T%20in%20enumerate(temperatures)%3A%0A%20%20%20%20%20%20%20%20rects%20%3D%20ax.bar(x%20%2B%20i%20*%20bar_width%2C%20scaled_probas%5Bi%5D%2C%20bar_width%2C%20label%3Df'Temperature%20%3D%20%7BT%7D')%0A%0A%20%20%20%20ax.set_ylabel('Probability')%0A%20%20%20%20ax.set_xticks(x)%0A%20%20%20%20ax.set_xticklabels(vocab.keys()%2C%20rotation%3D90)%0A%20%20%20%20ax.legend()%0A%0A%20%20%20%20plt.tight_layout()%0A%20%20%20%20plt.savefig(data_root%20%2F%20%22temperature-plot.pdf%22)%0A%20%20%20%20plt.show()%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%60Temperature%3D0.1%60%20%E3%81%AE%E5%A0%B4%E5%90%88%E3%81%AF%E3%80%81%E3%82%88%E3%82%8A%E8%B2%AA%E6%AC%B2%E3%81%AB%E8%BF%91%E3%81%84%E5%88%86%E5%B8%83%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(print_sampled_tokens%2C%20scaled_probas)%3A%0A%20%20%20%20print_sampled_tokens(scaled_probas%5B1%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%20%60Temperature%3D5%60%20%E3%81%AF%E3%82%88%E3%82%8A%E5%A4%9A%E6%A7%98%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%8C%E3%80%81%60pizza%60%20%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E6%84%8F%E5%91%B3%E3%82%92%E3%81%AA%E3%81%95%E3%81%AA%E3%81%84%E8%AA%9E%E3%82%82%E5%A2%97%E3%81%88%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(print_sampled_tokens%2C%20scaled_probas)%3A%0A%20%20%20%20print_sampled_tokens(scaled_probas%5B2%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%20%23%23%23%205.3.2%20Top-k%20%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%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%20top-k%20%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E6%88%A6%E7%95%A5%E3%81%AF%E3%80%81%E3%82%AB%E3%83%83%E3%83%88%E3%82%AA%E3%83%95%E3%82%92%E7%94%A8%E3%81%84%E3%82%8B%E5%88%A5%E3%81%AE%E7%A2%BA%E7%8E%87%E7%9A%84%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E7%A2%BA%E7%8E%87%E9%A0%86%E4%BD%8D%E3%81%AE%E4%B8%8A%E4%BD%8D%20%24k%24%20%E5%80%8B%E3%81%AE%E5%80%99%E8%A3%9C%E3%81%A0%E3%81%91%E3%82%92%E4%BD%BF%E3%81%84%E3%80%81%E3%81%9D%E3%82%8C%E4%BB%A5%E5%A4%96%E3%81%AF%E7%84%A1%E8%A6%96%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(next_token_logits)%3A%0A%20%20%20%20top_k%20%3D%203%0A%20%20%20%20top_logits%2C%20top_pos%20%3D%20torch.topk(next_token_logits%2C%20top_k)%0A%0A%20%20%20%20print(%22Top%20logits%3A%22%2C%20top_logits)%0A%20%20%20%20print(%22Top%20positions%3A%22%2C%20top_pos)%0A%20%20%20%20return%20(top_logits%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E7%84%A1%E8%A6%96%E3%81%95%E3%82%8C%E3%82%8B%E5%80%99%E8%A3%9C%E3%81%AE%E3%83%AD%E3%82%B8%E3%83%83%E3%83%88%E3%81%AF%20-inf%20%E3%81%A7%E3%83%9E%E3%82%B9%E3%82%AF%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(next_token_logits%2C%20top_logits)%3A%0A%20%20%20%20new_logits%20%3D%20torch.where(%0A%20%20%20%20%20%20%20%20condition%3Dnext_token_logits%20%3C%20top_logits%5B-1%5D%2C%0A%20%20%20%20%20%20%20%20input%3Dtorch.tensor(float(%22-inf%22))%2C%20%0A%20%20%20%20%20%20%20%20other%3Dnext_token_logits%0A%20%20%20%20)%0A%0A%20%20%20%20print(new_logits)%0A%20%20%20%20return%20(new_logits%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E7%B5%90%E6%9E%9C%E3%81%AE%E7%A2%BA%E7%8E%87%E3%81%AF%E6%AC%A1%E3%81%AE%E9%80%9A%E3%82%8A%E3%80%82%0A%20%20%20%20%E4%BA%88%E6%B8%AC%E3%81%95%E3%82%8C%E3%82%8B%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AF%E3%80%81%E3%81%93%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%AB%E3%82%82%E3%81%A8%E3%81%A5%E3%81%84%E3%81%A6%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(new_logits)%3A%0A%20%20%20%20topk_probas%20%3D%20torch.softmax(new_logits%2C%20dim%3D0)%0A%20%20%20%20print(topk_probas)%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%23%205.3.3%20%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E7%94%9F%E6%88%90%E9%96%A2%E6%95%B0%E3%81%AE%E4%BF%AE%E6%AD%A3%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%60generate_text_simple()%60%20%E3%81%AB%E6%B8%A9%E5%BA%A6%E3%81%A8%20top-k%20%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E7%B5%84%E3%81%BF%E8%BE%BC%E3%82%80%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%AE%E7%94%9F%E6%88%90%E5%87%A6%E7%90%86%E3%81%AF%E3%80%81EOS%20%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%8C%E7%8F%BE%E3%82%8C%E3%82%8B%E3%81%BE%E3%81%A7%E7%B6%9A%E3%81%8F%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20generate(model%2C%20idx%2C%20max_new_tokens%2C%20context_size%2C%20temperature%3D0.0%2C%20top_k%3DNone%2C%20eos_id%3DNone)%3A%0A%20%20%20%20%23%20for%20%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AF%E4%BB%A5%E5%89%8D%E3%81%A8%E5%90%8C%E3%81%98%3A%20%E3%83%AD%E3%82%B8%E3%83%83%E3%83%88%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%80%81%E6%9C%80%E5%BE%8C%E3%81%AE%E6%99%82%E5%88%BB%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A0%E3%81%91%E3%81%AB%E6%B3%A8%E7%9B%AE%E3%81%99%E3%82%8B%0A%20%20%20%20for%20_%20in%20range(max_new_tokens)%3A%0A%20%20%20%20%20%20%20%20idx_cond%20%3D%20idx%5B%3A%2C%20-context_size%3A%5D%0A%20%20%20%20%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20logits%20%3D%20model(idx_cond)%0A%20%20%20%20%20%20%20%20logits%20%3D%20logits%5B%3A%2C%20-1%2C%20%3A%5D%0A%0A%20%20%20%20%20%20%20%20%23%20%E6%96%B0%E8%A6%8F%3A%20top_k%20%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A7%E3%83%AD%E3%82%B8%E3%83%83%E3%83%88%E3%82%92%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20if%20top_k%20is%20not%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E4%B8%8A%E4%BD%8D%20top_k%20%E5%80%8B%E3%81%AE%E5%80%A4%E3%81%A0%E3%81%91%E3%82%92%E6%AE%8B%E3%81%99%0A%20%20%20%20%20%20%20%20%20%20%20%20top_logits%2C%20_%20%3D%20torch.topk(logits%2C%20top_k)%0A%20%20%20%20%20%20%20%20%20%20%20%20min_val%20%3D%20top_logits%5B%3A%2C%20-1%5D%20%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E4%BB%96%E3%81%AE%E3%83%AD%E3%82%B8%E3%83%83%E3%83%88%E3%82%92%E3%83%9E%E3%82%B9%E3%82%AF%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20logits%20%3D%20torch.where(logits%20%3C%20min_val%2C%20torch.tensor(float(%22-inf%22)).to(logits.device)%2C%20logits)%0A%0A%20%20%20%20%20%20%20%20%23%20%E6%96%B0%E8%A6%8F%3A%20%E6%B8%A9%E5%BA%A6%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E9%81%A9%E7%94%A8%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20if%20temperature%20%3E%200.0%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20logits%20%3D%20logits%20%2F%20temperature%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E6%96%B0%E8%A6%8F%EF%BC%88%E6%9C%AC%E3%81%AB%E3%81%AF%E6%9C%AA%E6%8E%B2%E8%BC%89%EF%BC%89%3A%20mps%20%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%A7%E5%90%8C%E7%AD%89%E3%81%AE%E7%B5%90%E6%9E%9C%E3%82%92%E5%BE%97%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E6%95%B0%E5%80%A4%E5%AE%89%E5%AE%9A%E5%8C%96%E3%81%AE%E5%B7%A5%E5%A4%AB%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20softmax%20%E3%81%AE%E5%89%8D%E3%81%AB%E8%A1%8C%E3%81%94%E3%81%A8%E3%81%AE%E6%9C%80%E5%A4%A7%E5%80%A4%E3%82%92%E5%BC%95%E3%81%8F%0A%20%20%20%20%20%20%20%20%20%20%20%20logits%20%3D%20logits%20-%20logits.max(dim%3D-1%2C%20keepdim%3DTrue).values%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20softmax%20%E3%82%92%E9%81%A9%E7%94%A8%E3%81%97%E3%81%A6%E7%A2%BA%E7%8E%87%E3%82%92%E5%BE%97%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20probs%20%3D%20torch.softmax(logits%2C%20dim%3D-1)%20%20%23%20(batch_size%2C%20context_len)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E5%88%86%E5%B8%83%E3%81%8B%E3%82%89%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20idx_next%20%3D%20torch.multinomial(probs%2C%20num_samples%3D1)%20%20%23%20(batch_size%2C%201)%0A%0A%20%20%20%20%20%20%20%20%23%20%E3%81%9D%E3%82%8C%E4%BB%A5%E5%A4%96%E3%81%AF%E4%BB%A5%E5%89%8D%E3%81%A8%E5%90%8C%E3%81%98%3A%20%E3%83%AD%E3%82%B8%E3%83%83%E3%83%88%E5%80%A4%E3%81%8C%E6%9C%80%E5%A4%A7%E3%81%AE%E8%AA%9E%E5%BD%99%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E8%B2%AA%E6%AC%B2%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%0A%20%20%20%20%20%20%20%20%20%20%20%20idx_next%20%3D%20torch.argmax(logits%2C%20dim%3D-1%2C%20keepdim%3DTrue)%20%20%23%20(batch_size%2C%201)%0A%0A%20%20%20%20%20%20%20%20if%20idx_next%20%3D%3D%20eos_id%3A%20%20%23%20eos_id%20%E3%81%8C%E6%8C%87%E5%AE%9A%E3%81%95%E3%82%8C%E3%80%81%E7%B3%BB%E5%88%97%E7%B5%82%E7%AB%AF%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%8C%E7%8F%BE%E3%82%8C%E3%81%9F%E3%82%89%E7%94%9F%E6%88%90%E3%82%92%E6%97%A9%E6%9C%9F%E3%81%AB%E6%89%93%E3%81%A1%E5%88%87%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20break%0A%0A%20%20%20%20%20%20%20%20%23%20%E4%BB%A5%E5%89%8D%E3%81%A8%E5%90%8C%E3%81%98%3A%20%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%97%E3%81%9F%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%82%92%E7%B3%BB%E5%88%97%E3%81%AE%E6%9C%AB%E5%B0%BE%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20idx%20%3D%20torch.cat((idx%2C%20idx_next)%2C%20dim%3D1)%20%20%23%20(batch_size%2C%20num_tokens%2B1)%0A%0A%20%20%20%20return%20idx%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%93%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%AF%E3%80%81%E4%BB%A5%E5%89%8D%E3%81%AE%E3%82%82%E3%81%AE%E3%81%A8%E3%81%AF%E7%95%B0%E3%81%AA%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(GPT_CONFIG_124M%2C%20inference_device%2C%20model%2C%20tokenizer)%3A%0A%20%20%20%20torch.manual_seed(123)%0A%0A%20%20%20%20_token_ids%20%3D%20generate(%0A%20%20%20%20%20%20%20%20model%3Dmodel%2C%0A%20%20%20%20%20%20%20%20idx%3Dtext_to_token_ids(%22Every%20effort%20moves%20you%22%2C%20tokenizer).to(inference_device)%2C%0A%20%20%20%20%20%20%20%20max_new_tokens%3D15%2C%0A%20%20%20%20%20%20%20%20context_size%3DGPT_CONFIG_124M%5B%22context_length%22%5D%2C%0A%20%20%20%20%20%20%20%20top_k%3D25%2C%0A%20%20%20%20%20%20%20%20temperature%3D1.4%0A%20%20%20%20)%0A%0A%20%20%20%20print(%22Output%20text%3A%5Cn%22%2C%20token_ids_to_text(_token_ids%2C%20tokenizer))%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%205.4%20PyTorch%20%E3%81%A7%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E9%87%8D%E3%81%BF%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%A8%E4%BF%9D%E5%AD%98%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%E5%AD%A6%E7%BF%92%E6%B8%88%E3%81%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AF%E6%AC%A1%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E4%BF%9D%E5%AD%98%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(model)%3A%0A%20%20%20%20project_root%20%3D%20Path(__file__).parent.parent.parent%0A%20%20%20%20model_dir_path%20%3D%20project_root%20%2F%20%22models%22%20%2F%20%22ch05%22%0A%20%20%20%20train_model_path%20%3D%20model_dir_path%20%2F%20%22model.pth%22%0A%20%20%20%20train_model_path.parent.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%0A%20%20%20%20torch.save(model.state_dict()%2C%20train_model_path)%0A%20%20%20%20return%20model_dir_path%2C%20project_root%2C%20train_model_path%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%82%82%E7%B0%A1%E5%8D%98%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(GPT_CONFIG_124M%2C%20device%2C%20train_model_path)%3A%0A%20%20%20%20loaded_model%20%3D%20GPTModel(GPT_CONFIG_124M)%0A%20%20%20%20print(%22Device%3A%22%2C%20device)%0A%0A%20%20%20%20loaded_model.load_state_dict(torch.load(train_model_path%2C%20map_location%3Ddevice%2C%20weights_only%3DTrue))%0A%20%20%20%20loaded_model.eval()%3B%20%20%20%20%23%20%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%82%A2%E3%82%A6%E3%83%88%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%0A%20%20%20%20return%20(loaded_model%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%82%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%9E%E3%82%A4%E3%82%B6%E3%81%AE%E7%8A%B6%E6%85%8B%E3%82%82%E4%BF%9D%E5%AD%98%E3%81%A7%E3%81%8D%E3%80%81%E5%BE%8C%E3%81%A7%E5%AD%A6%E7%BF%92%E3%82%92%E5%86%8D%E9%96%8B%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(loaded_model%2C%20model_dir_path%2C%20optimizer)%3A%0A%20%20%20%20train_model_optimizer_path%20%3D%20model_dir_path%20%2F%20%22model_and_optimizer.pth%22%0A%20%20%20%20train_model_optimizer_path.parent.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%0A%20%20%20%20torch.save(%7B%0A%20%20%20%20%20%20%20%20%22model_state_dict%22%3A%20loaded_model.state_dict()%2C%0A%20%20%20%20%20%20%20%20%22optimizer_state_dict%22%3A%20optimizer.state_dict()%2C%0A%20%20%20%20%20%20%20%20%7D%2C%20%0A%20%20%20%20%20%20%20%20train_model_optimizer_path%0A%20%20%20%20)%0A%20%20%20%20return%20(train_model_optimizer_path%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%82%AA%E3%83%97%E3%83%86%E3%82%A3%E3%83%9E%E3%82%A4%E3%82%B6%E3%81%AE%E7%8A%B6%E6%85%8B%E3%81%AF%E6%AC%A1%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%81%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(GPT_CONFIG_124M%2C%20train_model_optimizer_path)%3A%0A%20%20%20%20_checkpoint%20%3D%20torch.load(train_model_optimizer_path%2C%20weights_only%3DTrue)%0A%0A%20%20%20%20_model%20%3D%20GPTModel(GPT_CONFIG_124M)%0A%20%20%20%20_model.load_state_dict(_checkpoint%5B%22model_state_dict%22%5D)%0A%0A%20%20%20%20_optimizer%20%3D%20torch.optim.AdamW(_model.parameters()%2C%20lr%3D0.0005%2C%20weight_decay%3D0.1)%0A%20%20%20%20_optimizer.load_state_dict(_checkpoint%5B%22optimizer_state_dict%22%5D)%0A%20%20%20%20_model.train()%3B%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%205.5%20OpenAI%20%E3%81%AE%E4%BA%8B%E5%89%8D%E5%AD%A6%E7%BF%92%E6%B8%88%E3%81%BF%E9%87%8D%E3%81%BF%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%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%20OpenAI%20%E3%81%AE%E5%AD%A6%E7%BF%92%E6%B8%88%E3%81%BF%20GPT-2%20%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E4%BD%BF%E3%81%86%E3%80%82%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%AF%20TensorFlow%20%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A8%E3%81%97%E3%81%A6%E5%AE%9A%E7%BE%A9%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81PyTorch%20%E3%83%A2%E3%83%87%E3%83%AB%E3%81%B8%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8B%E3%80%82%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(%22TensorFlow%20version%3A%22%2C%20version(%22tensorflow%22))%0A%20%20%20%20print(%22tqdm%20version%3A%22%2C%20version(%22tqdm%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%60download_and_load_gpt2%60%20%E9%96%A2%E6%95%B0%E3%81%AF%20%5Bgpt_download.py%5D(.%2Fgpt_download.py)%20%E3%81%A7%E5%AE%9A%E7%BE%A9%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E3%80%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%81%A6%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80%E3%81%A0%E3%81%91%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(project_root)%3A%0A%20%20%20%20models_dir%20%3D%20project_root%20%2F%20%22models%22%20%2F%20%22gpt2%22%0A%20%20%20%20models_dir.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%20%20%20%20settings%2C%20params%20%3D%20download_and_load_gpt2(model_size%3D%22124M%22%2C%20models_dir%3Dmodels_dir)%0A%20%20%20%20return%20params%2C%20settings%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%82%89%E3%81%AF%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(settings)%3A%0A%20%20%20%20print(%22Settings%3A%22%2C%20settings)%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%E3%81%93%E3%82%8C%E3%82%89%E3%81%AF%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AE%E3%82%AD%E3%83%BC%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(params)%3A%0A%20%20%20%20print(%22Parameter%20dictionary%20keys%3A%22%2C%20params.keys())%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%E5%90%84%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AB%E3%81%AF%E6%AC%A1%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(params)%3A%0A%20%20%20%20print(params%5B%22wte%22%5D)%0A%20%20%20%20print(%22Token%20embedding%20weight%20tensor%20dimensions%3A%22%2C%20params%5B%22wte%22%5D.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%20%E3%81%93%E3%82%8C%E3%82%89%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AF%20GPT-2%20%E3%81%AE%E3%81%84%E3%81%8F%E3%81%A4%E3%81%8B%E3%81%AE%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%E6%9C%80%E5%B0%8F%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E4%BD%BF%E3%81%86%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(GPT_CONFIG_124M)%3A%0A%20%20%20%20%23%20%E7%B0%A1%E6%BD%94%E3%81%AB%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E3%83%A2%E3%83%87%E3%83%AB%E8%A8%AD%E5%AE%9A%E3%82%92%E8%BE%9E%E6%9B%B8%E3%81%A7%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%0A%20%20%20%20model_configs%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%22gpt2-small%20(124M)%22%3A%20%7B%22emb_dim%22%3A%20768%2C%20%22n_layers%22%3A%2012%2C%20%22n_heads%22%3A%2012%7D%2C%0A%20%20%20%20%20%20%20%20%22gpt2-medium%20(355M)%22%3A%20%7B%22emb_dim%22%3A%201024%2C%20%22n_layers%22%3A%2024%2C%20%22n_heads%22%3A%2016%7D%2C%0A%20%20%20%20%20%20%20%20%22gpt2-large%20(774M)%22%3A%20%7B%22emb_dim%22%3A%201280%2C%20%22n_layers%22%3A%2036%2C%20%22n_heads%22%3A%2020%7D%2C%0A%20%20%20%20%20%20%20%20%22gpt2-xl%20(1558M)%22%3A%20%7B%22emb_dim%22%3A%201600%2C%20%22n_layers%22%3A%2048%2C%20%22n_heads%22%3A%2025%7D%2C%0A%20%20%20%20%7D%0A%0A%20%20%20%20%23%20%E3%83%99%E3%83%BC%E3%82%B9%E8%A8%AD%E5%AE%9A%E3%82%92%E3%82%B3%E3%83%94%E3%83%BC%E3%81%97%E3%80%81%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E8%A8%AD%E5%AE%9A%E3%81%A7%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B%0A%20%20%20%20model_name%20%3D%20%22gpt2-small%20(124M)%22%20%20%23%20%E3%83%A2%E3%83%87%E3%83%AB%E5%90%8D%E3%81%AE%E4%BE%8B%0A%20%20%20%20NEW_CONFIG%20%3D%20GPT_CONFIG_124M.copy()%0A%20%20%20%20NEW_CONFIG.update(model_configs%5Bmodel_name%5D)%0A%20%20%20%20NEW_CONFIG.update(%7B%22context_length%22%3A%201024%2C%20%22qkv_bias%22%3A%20True%7D)%0A%0A%20%20%20%20gpt%20%3D%20GPTModel(NEW_CONFIG)%0A%20%20%20%20gpt.eval()%3B%0A%20%20%20%20return%20NEW_CONFIG%2C%20gpt%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%AF%E3%80%81%E3%82%B5%E3%83%8B%E3%83%86%E3%82%A3%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E4%BB%98%E3%81%8D%E3%81%A7%E6%95%B0%E5%80%A4%E3%82%92%E3%83%A2%E3%83%87%E3%83%AB%E9%87%8D%E3%81%BF%E3%81%A8%E3%81%97%E3%81%A6%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80%E9%96%A2%E6%95%B0%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20assign(left%2C%20right)%3A%0A%20%20%20%20if%20left.shape%20!%3D%20right.shape%3A%0A%20%20%20%20%20%20%20%20raise%20ValueError(f%22Shape%20mismatch.%20Left%3A%20%7Bleft.shape%7D%2C%20Right%3A%20%7Bright.shape%7D%22)%0A%20%20%20%20return%20torch.nn.Parameter(torch.tensor(right))%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%AF%E4%B8%8A%E8%A8%98%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%20GPT-2%20%E9%87%8D%E3%81%BF%E3%81%AE%E3%83%AD%E3%83%BC%E3%83%80%E3%83%BC%E9%96%A2%E6%95%B0%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20load_weights_into_gpt(gpt%2C%20params)%3A%0A%20%20%20%20%23%20%E4%BD%8D%E7%BD%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%81%A8%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%0A%20%20%20%20gpt.pos_emb.weight%20%3D%20assign(gpt.pos_emb.weight%2C%20params%5B%22wpe%22%5D)%0A%20%20%20%20gpt.tok_emb.weight%20%3D%20assign(gpt.tok_emb.weight%2C%20params%5B%22wte%22%5D)%0A%0A%20%20%20%20%23%20%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B9%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%BC%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%0A%20%20%20%20for%20b%20in%20range(len(params%5B%22blocks%22%5D))%3A%0A%20%20%20%20%20%20%20%20%23%20%E3%83%9E%E3%83%AB%E3%83%81%E3%83%98%E3%83%83%E3%83%89%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%20-%3E%20%E7%B7%9A%E5%BD%A2%E5%B0%84%E5%BD%B1%EF%BC%88%E8%A1%8C%E5%88%97%EF%BC%89%0A%20%20%20%20%20%20%20%20q_w%2C%20k_w%2C%20v_w%20%3D%20np.split(%0A%20%20%20%20%20%20%20%20%20%20%20%20(params%5B%22blocks%22%5D%5Bb%5D%5B%22attn%22%5D%5B%22c_attn%22%5D)%5B%22w%22%5D%2C%203%2C%20axis%3D-1%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.att.W_query.weight%20%3D%20assign(%0A%20%20%20%20%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.att.W_query.weight%2C%20q_w.T%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.att.W_key.weight%20%3D%20assign(%0A%20%20%20%20%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.att.W_key.weight%2C%20k_w.T%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.att.W_value.weight%20%3D%20assign(%0A%20%20%20%20%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.att.W_value.weight%2C%20v_w.T%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20%E3%83%9E%E3%83%AB%E3%83%81%E3%83%98%E3%83%83%E3%83%89%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%20-%3E%20%E7%B7%9A%E5%BD%A2%E5%B0%84%E5%BD%B1%EF%BC%88%E3%83%90%E3%82%A4%E3%82%A2%E3%82%B9%EF%BC%89%0A%20%20%20%20%20%20%20%20q_b%2C%20k_b%2C%20v_b%20%3D%20np.split(%0A%20%20%20%20%20%20%20%20%20%20%20%20(params%5B%22blocks%22%5D%5Bb%5D%5B%22attn%22%5D%5B%22c_attn%22%5D)%5B%22b%22%5D%2C%203%2C%20axis%3D-1%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.att.W_query.bias%20%3D%20assign(%0A%20%20%20%20%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.att.W_query.bias%2C%20q_b%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.att.W_key.bias%20%3D%20assign(gpt.trf_blocks%5Bb%5D.att.W_key.bias%2C%20k_b)%0A%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.att.W_value.bias%20%3D%20assign(%0A%20%20%20%20%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.att.W_value.bias%2C%20v_b%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20%E3%83%9E%E3%83%AB%E3%83%81%E3%83%98%E3%83%83%E3%83%89%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%20-%3E%20%E5%87%BA%E5%8A%9B%E5%B0%84%E5%BD%B1%0A%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.att.out_proj.weight%20%3D%20assign(%0A%20%20%20%20%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.att.out_proj.weight%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20params%5B%22blocks%22%5D%5Bb%5D%5B%22attn%22%5D%5B%22c_proj%22%5D%5B%22w%22%5D.T%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.att.out_proj.bias%20%3D%20assign(%0A%20%20%20%20%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.att.out_proj.bias%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20params%5B%22blocks%22%5D%5Bb%5D%5B%22attn%22%5D%5B%22c_proj%22%5D%5B%22b%22%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E3%83%95%E3%82%A9%E3%83%AF%E3%83%BC%E3%83%89%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%EF%BC%88Linear%20-%3E%20GELU%20-%3E%20Linear%EF%BC%89%0A%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.ff.layers%5B0%5D.weight%20%3D%20assign(%0A%20%20%20%20%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.ff.layers%5B0%5D.weight%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20params%5B%22blocks%22%5D%5Bb%5D%5B%22mlp%22%5D%5B%22c_fc%22%5D%5B%22w%22%5D.T%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.ff.layers%5B0%5D.bias%20%3D%20assign(%0A%20%20%20%20%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.ff.layers%5B0%5D.bias%2C%20params%5B%22blocks%22%5D%5Bb%5D%5B%22mlp%22%5D%5B%22c_fc%22%5D%5B%22b%22%5D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.ff.layers%5B2%5D.weight%20%3D%20assign(%0A%20%20%20%20%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.ff.layers%5B2%5D.weight%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20params%5B%22blocks%22%5D%5Bb%5D%5B%22mlp%22%5D%5B%22c_proj%22%5D%5B%22w%22%5D.T%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.ff.layers%5B2%5D.bias%20%3D%20assign(%0A%20%20%20%20%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.ff.layers%5B2%5D.bias%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20params%5B%22blocks%22%5D%5Bb%5D%5B%22mlp%22%5D%5B%22c_proj%22%5D%5B%22b%22%5D%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E6%AD%A3%E8%A6%8F%E5%8C%96%0A%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.norm1.scale%20%3D%20assign(%0A%20%20%20%20%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.norm1.scale%2C%20params%5B%22blocks%22%5D%5Bb%5D%5B%22ln_1%22%5D%5B%22g%22%5D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.norm1.shift%20%3D%20assign(%0A%20%20%20%20%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.norm1.shift%2C%20params%5B%22blocks%22%5D%5Bb%5D%5B%22ln_1%22%5D%5B%22b%22%5D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.norm2.scale%20%3D%20assign(%0A%20%20%20%20%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.norm2.scale%2C%20params%5B%22blocks%22%5D%5Bb%5D%5B%22ln_2%22%5D%5B%22g%22%5D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.norm2.shift%20%3D%20assign(%0A%20%20%20%20%20%20%20%20%20%20%20%20gpt.trf_blocks%5Bb%5D.norm2.shift%2C%20params%5B%22blocks%22%5D%5Bb%5D%5B%22ln_2%22%5D%5B%22b%22%5D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20gpt.final_norm.scale%20%3D%20assign(gpt.final_norm.scale%2C%20params%5B%22g%22%5D)%0A%20%20%20%20gpt.final_norm.shift%20%3D%20assign(gpt.final_norm.shift%2C%20params%5B%22b%22%5D)%0A%20%20%20%20gpt.out_head.weight%20%3D%20assign(gpt.out_head.weight%2C%20params%5B%22wte%22%5D)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E7%B6%9A%E3%81%84%E3%81%A6%E3%80%81%E3%81%9D%E3%82%8C%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(device%2C%20gpt%2C%20params)%3A%0A%20%20%20%20load_weights_into_gpt(gpt%2C%20params)%0A%20%20%20%20gpt.to(device)%3B%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%E7%AD%8B%E3%81%AE%E9%80%9A%E3%81%A3%E3%81%9F%E6%96%87%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(NEW_CONFIG%2C%20device%2C%20gpt%2C%20tokenizer)%3A%0A%20%20%20%20torch.manual_seed(123)%0A%0A%20%20%20%20_token_ids%20%3D%20generate(%0A%20%20%20%20%20%20%20%20model%3Dgpt%2C%0A%20%20%20%20%20%20%20%20idx%3Dtext_to_token_ids(%22Every%20effort%20moves%20you%22%2C%20tokenizer).to(device)%2C%0A%20%20%20%20%20%20%20%20max_new_tokens%3D25%2C%0A%20%20%20%20%20%20%20%20context_size%3DNEW_CONFIG%5B%22context_length%22%5D%2C%0A%20%20%20%20%20%20%20%20top_k%3D50%2C%0A%20%20%20%20%20%20%20%20temperature%3D1.5%0A%20%20%20%20)%0A%0A%20%20%20%20print(%22Output%20text%3A%5Cn%22%2C%20token_ids_to_text(_token_ids%2C%20tokenizer))%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
1ae6f88373c757350be5aa53cc43e9ae