import%20marimo%0A%0A__generated_with%20%3D%20%220.19.2%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0Awith%20app.setup%3A%0A%20%20%20%20from%20importlib.metadata%20import%20version%0A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20tiktoken%0A%20%20%20%20import%20torch%0A%20%20%20%20import%20torch.nn%20as%20nn%0A%0A%20%20%20%20from%20my_llm.ch03%20import%20MultiHeadAttention%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%AC4%E7%AB%A0%3A%20%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E7%94%9F%E6%88%90%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%20GPT%20%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E5%AE%9F%E8%A3%85%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%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%204.1%20LLM%20%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%AE%E5%AE%9F%E8%A3%85%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(%22matplotlib%20version%3A%22%2C%20version(%22matplotlib%22))%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%E3%81%93%E3%82%8C%E3%81%AF%E4%BB%8A%E5%9B%9E%E3%81%AE%20GPT-2%20%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%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_()%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%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%201024%2C%20%23%20%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E9%95%B7%0A%20%20%20%20%20%20%20%20%22emb_dim%22%3A%20768%2C%20%20%20%20%20%20%20%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%20%20%20%20%20%20%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%20%20%20%20%20%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%20%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%E7%8E%87%0A%20%20%20%20%20%20%20%20%22qkv_bias%22%3A%20False%20%20%20%20%20%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%20%20%20%20return%20(GPT_CONFIG_124M%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%93%E3%82%8C%E3%81%AF%20GPT-2%20%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80%E3%83%BC%E7%94%A8%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80%E3%83%BC%E3%81%AF%E5%BE%8C%E3%81%A7%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%80%8CDummy%E3%80%8D%E3%81%AF%E3%80%81%E9%A0%86%E4%BC%9D%E6%92%AD%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%A0%E3%81%91%E3%81%AB%E3%80%81%E5%8D%98%E7%B4%94%E3%81%AA%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E7%B0%A1%E6%98%93%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E6%84%8F%E5%91%B3%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.class_definition%0Aclass%20DummyGPTModel(nn.Module)%3A%0A%20%20%20%20def%20__init__(self%2C%20cfg)%3A%0A%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20%23%20ID0%E3%80%9Cvocab_size-1%20%E3%82%92%20emb_dim%20%E6%AC%A1%E5%85%83%E3%81%AE%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%B8%E5%86%99%E5%83%8F%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20self.tok_emb%20%3D%20nn.Embedding(cfg%5B%22vocab_size%22%5D%2C%20cfg%5B%22emb_dim%22%5D)%0A%20%20%20%20%20%20%20%20self.pos_emb%20%3D%20nn.Embedding(cfg%5B%22context_length%22%5D%2C%20cfg%5B%22emb_dim%22%5D)%0A%20%20%20%20%20%20%20%20self.drop_emb%20%3D%20nn.Dropout(cfg%5B%22drop_rate%22%5D)%0A%0A%20%20%20%20%20%20%20%20%23%20TransformerBlock%20%E3%81%AB%E3%81%AF%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%86%0A%20%20%20%20%20%20%20%20self.trf_blocks%20%3D%20nn.Sequential(%0A%20%20%20%20%20%20%20%20%20%20%20%20*%5BDummyTransformerBlock(cfg)%20for%20_%20in%20range(cfg%5B%22n_layers%22%5D)%5D)%0A%0A%20%20%20%20%20%20%20%20%23%20LayerNorm%20%E3%81%AB%E3%81%AF%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80%E3%83%BC%E3%82%92%E4%BD%BF%E3%81%86%0A%20%20%20%20%20%20%20%20self.final_norm%20%3D%20DummyLayerNorm(cfg%5B%22emb_dim%22%5D)%0A%20%20%20%20%20%20%20%20self.out_head%20%3D%20nn.Linear(%0A%20%20%20%20%20%20%20%20%20%20%20%20cfg%5B%22emb_dim%22%5D%2C%20cfg%5B%22vocab_size%22%5D%2C%20bias%3DFalse%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20def%20forward(self%2C%20in_idx)%3A%0A%20%20%20%20%20%20%20%20batch_size%2C%20seq_len%20%3D%20in_idx.shape%0A%0A%20%20%20%20%20%20%20%20%23%20%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E5%8C%96%0A%20%20%20%20%20%20%20%20tok_embeds%20%3D%20self.tok_emb(in_idx)%0A%0A%20%20%20%20%20%20%20%20%23%20%E4%BD%8D%E7%BD%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%0A%20%20%20%20%20%20%20%20pos_embeds%20%3D%20self.pos_emb(torch.arange(seq_len%2C%20device%3Din_idx.device))%0A%20%20%20%20%20%20%20%20x%20%3D%20tok_embeds%20%2B%20pos_embeds%0A%0A%20%20%20%20%20%20%20%20x%20%3D%20self.drop_emb(x)%20%20%20%20%23%20(batch_size%2C%20seq_len%2C%20emb_dim)%0A%20%20%20%20%20%20%20%20x%20%3D%20self.trf_blocks(x)%20%20%23%20(batch_size%2C%20seq_len%2C%20emb_dim)%0A%20%20%20%20%20%20%20%20x%20%3D%20self.final_norm(x)%20%20%23%20(batch_size%2C%20seq_len%2C%20emb_dim)%0A%20%20%20%20%20%20%20%20logits%20%3D%20self.out_head(x)%20%20%20%23%20(batch_size%2C%20seq_len%2C%20vocab_size)%0A%20%20%20%20%20%20%20%20return%20logits%0A%0A%0A%40app.class_definition%0Aclass%20DummyTransformerBlock(nn.Module)%3A%0A%20%20%20%20def%20__init__(self%2C%20cfg)%3A%0A%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20%23%20%E5%8D%98%E7%B4%94%E3%81%AA%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80%E3%83%BC%0A%0A%20%20%20%20def%20forward(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20%23%20%E3%81%93%E3%81%AE%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AF%E4%BD%95%E3%82%82%E3%81%9B%E3%81%9A%E3%80%81%E5%85%A5%E5%8A%9B%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E8%BF%94%E3%81%99%E3%81%A0%E3%81%91%0A%20%20%20%20%20%20%20%20return%20x%0A%0A%0A%40app.class_definition%0Aclass%20DummyLayerNorm(nn.Module)%3A%0A%20%20%20%20def%20__init__(self%2C%20normalized_shape%2C%20eps%3D1e-5)%3A%0A%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20%23%20%E3%81%93%E3%81%93%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AF%20LayerNorm%20%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9%E3%82%92%E6%A8%A1%E5%80%A3%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%A0%E3%81%91%E3%81%AE%E3%82%82%E3%81%AE%0A%0A%20%20%20%20def%20forward(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20%23%20%E3%81%93%E3%81%AE%E5%B1%A4%E3%81%AF%E4%BD%95%E3%82%82%E3%81%9B%E3%81%9A%E3%80%81%E5%85%A5%E5%8A%9B%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E8%BF%94%E3%81%99%E3%81%A0%E3%81%91%0A%20%20%20%20%20%20%20%20return%20x%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20GPT-2%20%E3%81%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%82%92%E4%BD%BF%E3%81%84%E3%80%812%E3%81%A4%E3%81%AE%E3%83%95%E3%83%AC%E3%83%BC%E3%82%BA%E3%82%92%E5%90%AB%E3%82%80%E3%83%90%E3%83%83%E3%83%81%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_()%3A%0A%20%20%20%20tokenizer%20%3D%20tiktoken.get_encoding(%22gpt2%22)%0A%0A%20%20%20%20batch%20%3D%20%5B%5D%0A%0A%20%20%20%20txt1%20%3D%20%22Every%20effort%20moves%20you%22%0A%20%20%20%20txt2%20%3D%20%22Every%20day%20holds%20a%22%0A%0A%20%20%20%20batch.append(torch.tensor(tokenizer.encode(txt1)))%0A%20%20%20%20batch.append(torch.tensor(tokenizer.encode(txt2)))%0A%20%20%20%20batch%20%3D%20torch.stack(batch%2C%20dim%3D0)%0A%20%20%20%20print(batch)%0A%20%20%20%20return%20batch%2C%20tokenizer%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20GPT-2%3A1.24b%20%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0%E3%81%AB%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%97%E3%80%81%E6%9C%AA%E5%AD%A6%E7%BF%92%E3%81%AE%E9%87%8D%E3%81%BF%E3%81%A7%E3%83%AD%E3%82%B8%E3%83%83%E3%83%88%E3%82%92%E6%8E%A8%E8%AB%96%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E5%87%BA%E5%8A%9B%E3%81%AF%E3%83%AD%E3%82%B8%E3%83%83%E3%83%88%E3%81%A8%E5%91%BC%E3%81%B0%E3%82%8C%E3%80%81%E5%BD%A2%E7%8A%B6%E3%81%AF%20%60(batch_size%2Cseq_len%2Cvocab_size)%60%20%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%20batch)%3A%0A%20%20%20%20torch.manual_seed(123)%0A%20%20%20%20_model%20%3D%20DummyGPTModel(GPT_CONFIG_124M)%0A%0A%20%20%20%20_logits%20%3D%20_model(batch)%0A%20%20%20%20print(%22Output%20shape%3A%22%2C%20_logits.shape)%0A%20%20%20%20print(_logits)%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%204.2%20%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%AB%E3%82%88%E3%82%8B%E6%B4%BB%E6%80%A7%E3%81%AE%E6%AD%A3%E8%A6%8F%E5%8C%96%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%E3%81%9F%E3%82%81%E3%81%AE%E5%8A%B9%E7%8E%87%E7%9A%84%E3%81%AA%E5%8B%BE%E9%85%8D%E3%82%92%E5%BE%97%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%AE%E5%8A%B9%E6%9E%9C%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E6%AC%A1%E3%81%AE%E9%80%9A%E5%B8%B8%E3%81%AE%20linear%2BReLU%20%E5%B1%A4%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%20torch.manual_seed(123)%0A%0A%20%20%20%20%23%20%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C5%E6%AC%A1%E5%85%83%EF%BC%88%E7%89%B9%E5%BE%B4%E9%87%8F%EF%BC%89%E3%82%92%E6%8C%81%E3%81%A42%E3%81%A4%E3%81%AE%E5%AD%A6%E7%BF%92%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%0A%20%20%20%20batch_example%20%3D%20torch.randn(2%2C%205)%20%0A%0A%20%20%20%20layer%20%3D%20nn.Sequential(nn.Linear(5%2C%206)%2C%20nn.ReLU())%0A%20%20%20%20out%20%3D%20layer(batch_example)%0A%20%20%20%20print(f%22%7Bbatch_example%3D%7D%22)%0A%20%20%20%20print(f%22%7Bout%3D%7D%22)%0A%20%20%20%20return%20batch_example%2C%20out%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E6%AD%A3%E8%A6%8F%E5%8C%96%E5%89%8D%E3%81%AE%E7%B5%B1%E8%A8%88%E9%87%8F%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_(out)%3A%0A%20%20%20%20mean%20%3D%20out.mean(dim%3D-1%2C%20keepdim%3DTrue)%0A%20%20%20%20var%20%3D%20out.var(dim%3D-1%2C%20keepdim%3DTrue)%0A%0A%20%20%20%20print(%22Mean%3A%5Cn%22%2C%20mean)%0A%20%20%20%20print(%22Variance%3A%5Cn%22%2C%20var)%0A%20%20%20%20return%20mean%2C%20var%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%82%8C%E3%81%AB%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%82%92%E9%81%A9%E7%94%A8%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_(mean%2C%20out%2C%20var)%3A%0A%20%20%20%20out_norm%20%3D%20(out%20-%20mean)%20%2F%20torch.sqrt(var)%0A%20%20%20%20print(%22Normalized%20layer%20outputs%3A%5Cn%22%2C%20out_norm)%0A%0A%20%20%20%20mean_norm%20%3D%20out_norm.mean(dim%3D-1%2C%20keepdim%3DTrue)%0A%20%20%20%20var_norm%20%3D%20out_norm.var(dim%3D-1%2C%20keepdim%3DTrue)%0A%20%20%20%20print(%22Mean%3A%5Cn%22%2C%20mean_norm)%0A%20%20%20%20print(%22Variance%3A%5Cn%22%2C%20var_norm)%0A%20%20%20%20return%20mean_norm%2C%20var_norm%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E8%A6%8B%E3%82%84%E3%81%99%E3%81%95%E3%81%AE%E3%81%9F%E3%82%81%E3%80%81PyTorch%20%E3%81%AE%E6%8C%87%E6%95%B0%E8%A1%A8%E8%A8%98%E3%82%92%E7%84%A1%E5%8A%B9%E3%81%AB%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_(mean_norm%2C%20var_norm)%3A%0A%20%20%20%20torch.set_printoptions(sci_mode%3DFalse)%0A%20%20%20%20print(%22Mean%3A%22%2C%20mean_norm)%0A%20%20%20%20print(%22Variance%3A%22%2C%20var_norm)%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%AC%E3%82%A4%E3%83%A4%E3%83%BC%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%AE%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80%E3%83%BC%E3%82%92%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E4%B8%8A%E8%A8%98%E3%81%AE%E8%A6%B3%E5%AF%9F%E3%81%AB%E3%82%82%E3%81%A8%E3%81%A5%E3%81%84%E3%81%A6%20%60LayerNorm%60%20%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%AF%E6%9C%80%E5%BE%8C%E3%81%AE%E6%AC%A1%E5%85%83%20%60emb_dim%60%20%E3%81%AB%E9%81%A9%E7%94%A8%E3%81%95%E3%82%8C%E3%80%81%E8%89%AF%E3%81%84%E5%8B%BE%E9%85%8D%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E9%81%A9%E5%88%87%E3%81%AA%E5%88%86%E5%B8%83%E3%82%92%E5%AD%A6%E7%BF%92%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%80%81%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%A8%E3%82%B7%E3%83%95%E3%83%88%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E5%B0%8E%E5%85%A5%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.class_definition%0Aclass%20LayerNorm(nn.Module)%3A%0A%20%20%20%20def%20__init__(self%2C%20emb_dim)%3A%0A%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20self.eps%20%3D%201e-5%0A%20%20%20%20%20%20%20%20self.scale%20%3D%20nn.Parameter(torch.ones(emb_dim))%0A%20%20%20%20%20%20%20%20self.shift%20%3D%20nn.Parameter(torch.zeros(emb_dim))%0A%0A%20%20%20%20def%20forward(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20mean%20%3D%20x.mean(dim%3D-1%2C%20keepdim%3DTrue)%0A%20%20%20%20%20%20%20%20%23%20n%20%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%84%E3%81%A8%E3%81%8D%20n%20%E3%81%A8%20(n-1)%20%E3%81%AE%E5%B7%AE%E3%81%AF%E7%84%A1%E8%A6%96%E3%81%A7%E3%81%8D%E3%82%8B%20(unbiased%3DFalse)%0A%20%20%20%20%20%20%20%20%23%20%E3%81%93%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%AF%E5%85%83%E3%81%AE%20GPT-2%20%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A8%E4%BA%92%E6%8F%9B%0A%20%20%20%20%20%20%20%20var%20%3D%20x.var(dim%3D-1%2C%20keepdim%3DTrue%2C%20unbiased%3DFalse)%0A%20%20%20%20%20%20%20%20norm_x%20%3D%20(x%20-%20mean)%20%2F%20torch.sqrt(var%20%2B%20self.eps)%0A%20%20%20%20%20%20%20%20return%20self.scale%20*%20norm_x%20%2B%20self.shift%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%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_(batch_example)%3A%0A%20%20%20%20ln%20%3D%20LayerNorm(emb_dim%3D5)%0A%20%20%20%20out_ln%20%3D%20ln(batch_example)%0A%0A%20%20%20%20mean_ln%20%3D%20out_ln.mean(dim%3D-1%2C%20keepdim%3DTrue)%0A%20%20%20%20var_ln%20%3D%20out_ln.var(dim%3D-1%2C%20unbiased%3DFalse%2C%20keepdim%3DTrue)%0A%0A%20%20%20%20print(%22Mean%3A%5Cn%22%2C%20mean_ln)%0A%20%20%20%20print(%22Variance%3A%5Cn%22%2C%20var_ln)%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%204.3%20GELU%20%E6%B4%BB%E6%80%A7%E5%8C%96%E9%96%A2%E6%95%B0%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%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%E3%81%AE%E5%AE%9F%E8%A3%85%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%E6%B4%BB%E6%80%A7%E5%8C%96%E9%96%A2%E6%95%B0%E3%81%A8%E3%81%97%E3%81%A6%20GELU%20(Gaussian%20Error%20Linear%20Unit)%20%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%E6%AC%A1%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%AE%9A%E7%BE%A9%E3%81%95%E3%82%8C%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%20%5Coperatorname%7BGELU%7D(x)%20%26%5Cequiv%20x%5CPhi(x)%2C%20%5C%5C%0A%20%20%20%20%5CPhi(x)%20%26%5Cequiv%20%5Cint_%7B-%5Cinfty%7D%5E%7Bx%7D%5Cmathcal%7BN%7D(t%3B0%2C1)%5C%2Cdt.%0A%20%20%20%20%5Cend%7Baligned%7D%0A%20%20%20%20%5C%5D%0A%0A%20%20%20%20%E5%8A%B9%E7%8E%87%E3%81%AE%E3%81%9F%E3%82%81%E3%80%81%E3%82%AB%E3%83%BC%E3%83%96%E3%83%95%E3%82%A3%E3%83%83%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%81%A7%E5%BE%97%E3%82%89%E3%82%8C%E3%81%9F%E6%AC%A1%E3%81%AE%E8%BF%91%E4%BC%BC%E3%82%92%E4%BD%BF%E3%81%86%E3%80%82%0A%0A%20%20%20%20%5C%5B%0A%20%20%20%20%5Cbegin%7Baligned%7D%0A%20%20%20%20%5Coperatorname%7BGELU%7D(x)%20%26%5Capprox%20%5Cfrac%7Bx%7D%7B2%7D%5Cleft(1%2B%5Ctanh(u)%5Cright)%2C%20%5C%5C%0A%20%20%20%20u%20%26%5Cequiv%20%5Csqrt%7B%5Cfrac%7B2%7D%7B%5Cpi%7D%7D%5Cleft(x%2B0.044715x%5E3%5Cright).%0A%20%20%20%20%5Cend%7Baligned%7D%0A%20%20%20%20%5C%5D%0A%0A%20%20%20%20%E3%81%93%E3%81%AE%20GELU%20%E3%81%AF%E3%80%81ReLU%20%E3%82%88%E3%82%8A%E6%BB%91%E3%82%89%E3%81%8B%E3%81%AA%E5%8B%BE%E9%85%8D%E3%82%92%E6%8C%81%E3%81%A1%E3%80%81%E5%AD%A6%E7%BF%92%E3%81%AB%E9%81%A9%E3%81%97%E3%81%9F%E6%B4%BB%E6%80%A7%E5%8C%96%E9%96%A2%E6%95%B0%E3%81%A8%E3%81%97%E3%81%A6%E7%9F%A5%E3%82%89%E3%82%8C%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.class_definition%0Aclass%20GELU(nn.Module)%3A%0A%20%20%20%20def%20__init__(self)%3A%0A%20%20%20%20%20%20%20%20super().__init__()%0A%0A%20%20%20%20def%20forward(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20return%200.5%20*%20x%20*%20(1%20%2B%20torch.tanh(%0A%20%20%20%20%20%20%20%20%20%20%20%20torch.sqrt(torch.tensor(2.0%20%2F%20torch.pi))%20*%20%0A%20%20%20%20%20%20%20%20%20%20%20%20(x%20%2B%200.044715%20*%20torch.pow(x%2C%203))%0A%20%20%20%20%20%20%20%20))%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20GELU%20%E3%82%92%20ReLU%20%E3%81%A8%E6%AF%94%E8%BC%83%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20GELU%20%E3%81%AF%E7%89%B9%E5%AE%9A%E3%81%AE%E7%82%B9%E3%82%92%E9%99%A4%E3%81%84%E3%81%A6%E5%8B%BE%E9%85%8D%E3%81%8C%E9%9D%9E%E3%82%BC%E3%83%AD%E3%81%A7%E3%81%82%E3%82%8A%E3%80%81%E7%89%B9%E7%95%B0%E3%81%AA%E6%9C%80%E9%81%A9%E5%8C%96%E3%82%92%E9%81%BF%E3%81%91%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20GELU%20%E3%81%AF%E8%B2%A0%E3%81%AE%20%24x%24%20%E3%82%82%E5%8F%97%E3%81%91%E4%BB%98%E3%81%91%E3%80%81%E3%81%9D%E3%81%86%E3%81%97%E3%81%9F%E5%80%A4%E3%82%82%E5%AD%A6%E7%BF%92%E3%81%AB%E5%AF%84%E4%B8%8E%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%20gelu%2C%20relu%20%3D%20GELU()%2C%20nn.ReLU()%0A%0A%20%20%20%20%23%20%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%87%E3%83%BC%E3%82%BF%0A%20%20%20%20x%20%3D%20torch.linspace(-3%2C%203%2C%20100)%0A%20%20%20%20y_gelu%2C%20y_relu%20%3D%20gelu(x)%2C%20relu(x)%0A%0A%20%20%20%20plt.figure(figsize%3D(8%2C%203))%0A%20%20%20%20for%20i%2C%20(y%2C%20label)%20in%20enumerate(zip(%5By_gelu%2C%20y_relu%5D%2C%20%5B%22GELU%22%2C%20%22ReLU%22%5D)%2C%201)%3A%0A%20%20%20%20%20%20%20%20plt.subplot(1%2C%202%2C%20i)%0A%20%20%20%20%20%20%20%20plt.plot(x%2C%20y)%0A%20%20%20%20%20%20%20%20plt.title(f%22%7Blabel%7D%20activation%20function%22)%0A%20%20%20%20%20%20%20%20plt.xlabel(%22x%22)%0A%20%20%20%20%20%20%20%20plt.ylabel(f%22%7Blabel%7D(x)%22)%0A%20%20%20%20%20%20%20%20plt.grid(True)%0A%0A%20%20%20%20plt.tight_layout()%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%E3%81%93%E3%82%8C%E3%81%AF%20GELU%20%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%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%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9%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.class_definition%0Aclass%20FeedForward(nn.Module)%3A%0A%20%20%20%20def%20__init__(self%2C%20cfg)%3A%0A%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20self.layers%20%3D%20nn.Sequential(%0A%20%20%20%20%20%20%20%20%20%20%20%20nn.Linear(cfg%5B%22emb_dim%22%5D%2C%204%20*%20cfg%5B%22emb_dim%22%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20GELU()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20nn.Linear(4%20*%20cfg%5B%22emb_dim%22%5D%2C%20cfg%5B%22emb_dim%22%5D)%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20def%20forward(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20return%20self.layers(x)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20GPT-2%20%E3%81%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E6%AC%A1%E5%85%83%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_(GPT_CONFIG_124M)%3A%0A%20%20%20%20print(GPT_CONFIG_124M%5B%22emb_dim%22%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%82%8C%E3%81%AF%20%60FeedForward%60%20%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E5%87%BA%E5%8A%9B%E5%BD%A2%E7%8A%B6%E3%82%92%E7%A4%BA%E3%81%99%E3%80%82%0A%20%20%20%20%E6%9C%80%E5%88%9D%E3%81%AE%E5%B1%A4%E3%81%A7%E6%AC%A1%E5%85%83%E3%82%924%E5%80%8D%E3%81%AB%E5%A2%97%E3%82%84%E3%81%97%E3%80%81%E6%9C%80%E5%BE%8C%E3%81%AE%E5%B1%A4%E3%81%A7%E5%85%A5%E5%8A%9B%E3%81%A8%E5%90%8C%E3%81%98%E6%AC%A1%E5%85%83%E3%81%B8%E6%88%BB%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E3%81%93%E3%82%8C%E3%81%AB%E3%82%88%E3%82%8A%E3%80%81%E5%85%A5%E5%87%BA%E5%8A%9B%E3%81%AE%E6%AC%A1%E5%85%83%E3%81%AE%E6%95%B4%E5%90%88%E6%80%A7%E3%82%92%E6%B0%97%E3%81%AB%E3%81%9B%E3%81%9A%20GPT-2%20%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E6%B7%B1%E3%81%8F%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_(GPT_CONFIG_124M)%3A%0A%20%20%20%20ffn%20%3D%20FeedForward(GPT_CONFIG_124M)%0A%0A%20%20%20%20%23%20%E5%85%A5%E5%8A%9B%E3%81%AE%E5%BD%A2%E7%8A%B6%3A%20%5Bbatch_size%2C%20num_token%2C%20emb_size%5D%0A%20%20%20%20_x%20%3D%20torch.rand(2%2C%203%2C%20768)%20%0A%20%20%20%20print(ffn(_x).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%23%23%204.4%20%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E6%8E%A5%E7%B6%9A%E3%81%AE%E8%BF%BD%E5%8A%A0%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%20ResNet%20%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E3%82%B9%E3%82%AD%E3%83%83%E3%83%97%E6%8E%A5%E7%B6%9A%E3%81%AE%E4%BE%8B%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%20%20%20%20%E6%B7%B1%E3%81%84%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E5%8B%BE%E9%85%8D%E6%B6%88%E5%A4%B1%E5%95%8F%E9%A1%8C%E3%82%92%E9%81%BF%E3%81%91%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E3%81%93%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AF%E5%90%84%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A7%E6%AE%8B%E5%B7%AE%E3%82%92%E4%BA%88%E6%B8%AC%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.class_definition%0Aclass%20ExampleDeepNeuralNetwork(nn.Module)%3A%0A%20%20%20%20def%20__init__(self%2C%20layer_sizes%2C%20use_shortcut)%3A%0A%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20self.use_shortcut%20%3D%20use_shortcut%0A%20%20%20%20%20%20%20%20self.layers%20%3D%20nn.ModuleList(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20nn.Sequential(nn.Linear(layer_sizes%5B0%5D%2C%20layer_sizes%5B1%5D)%2C%20GELU())%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20nn.Sequential(nn.Linear(layer_sizes%5B1%5D%2C%20layer_sizes%5B2%5D)%2C%20GELU())%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20nn.Sequential(nn.Linear(layer_sizes%5B2%5D%2C%20layer_sizes%5B3%5D)%2C%20GELU())%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20nn.Sequential(nn.Linear(layer_sizes%5B3%5D%2C%20layer_sizes%5B4%5D)%2C%20GELU())%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20nn.Sequential(nn.Linear(layer_sizes%5B4%5D%2C%20layer_sizes%5B5%5D)%2C%20GELU())%0A%20%20%20%20%20%20%20%20%5D)%0A%0A%20%20%20%20def%20forward(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20for%20layer%20in%20self.layers%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E7%8F%BE%E5%9C%A8%E3%81%AE%E5%B1%A4%E3%81%AE%E5%87%BA%E5%8A%9B%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%20layer_output%20%3D%20layer(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%92%E9%81%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20self.use_shortcut%20and%20x.shape%20%3D%3D%20layer_output.shape%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20x%20%2B%20layer_output%0A%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20layer_output%0A%20%20%20%20%20%20%20%20return%20x%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%8B%BE%E9%85%8D%E6%B6%88%E5%A4%B1%E5%95%8F%E9%A1%8C%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E5%8B%BE%E9%85%8D%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E6%AC%A1%E3%81%AE%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%20print_gradients(model%2C%20x)%3A%0A%20%20%20%20%23%20%E9%A0%86%E4%BC%9D%E6%92%AD%0A%20%20%20%20output%20%3D%20model(x)%0A%20%20%20%20target%20%3D%20torch.tensor(%5B%5B0.%5D%5D)%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%A8%E5%87%BA%E5%8A%9B%E3%81%8C%E3%81%A9%E3%82%8C%E3%81%A0%E3%81%91%E8%BF%91%E3%81%84%E3%81%8B%E3%81%AB%E3%82%82%E3%81%A8%E3%81%A5%E3%81%84%E3%81%A6%E6%90%8D%E5%A4%B1%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%0A%20%20%20%20loss%20%3D%20nn.MSELoss()%0A%20%20%20%20%23%20%E5%87%BA%E5%8A%9B%E5%80%A4%E3%81%AE%20MSE%20%E3%82%92%E5%8F%96%E3%82%8B%E3%81%A0%E3%81%91%0A%20%20%20%20loss%20%3D%20loss(output%2C%20target)%0A%0A%20%20%20%20%23%20%E5%8B%BE%E9%85%8D%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E9%80%86%E4%BC%9D%E6%92%AD%0A%20%20%20%20loss.backward()%0A%0A%20%20%20%20for%20name%2C%20param%20in%20model.named_parameters()%3A%0A%20%20%20%20%20%20%20%20if%20'weight'%20in%20name%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20%E9%87%8D%E3%81%BF%E3%81%AE%E5%8B%BE%E9%85%8D%E3%81%AE%E5%B9%B3%E5%9D%87%E7%B5%B6%E5%AF%BE%E5%80%A4%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%7Bname%7D%20has%20gradient%20mean%20of%20%7Bparam.grad.abs().mean().item()%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%E6%9C%80%E5%BE%8C%E3%81%AE%E5%B1%A44%E3%81%8B%E3%82%89%E6%9C%80%E5%88%9D%E3%81%AE%E5%B1%A40%E3%81%AB%E3%81%8B%E3%81%91%E3%81%A6%E5%8B%BE%E9%85%8D%E3%81%8C%E6%B6%88%E5%A4%B1%E3%81%97%E3%81%A6%E3%81%84%E3%81%8F%E6%A7%98%E5%AD%90%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_()%3A%0A%20%20%20%20layer_sizes%20%3D%20%5B3%2C%203%2C%203%2C%203%2C%203%2C%201%5D%20%20%0A%0A%20%20%20%20sample_input%20%3D%20torch.tensor(%5B%5B1.%2C%200.%2C%20-1.%5D%5D)%0A%0A%20%20%20%20torch.manual_seed(123)%0A%20%20%20%20model_without_shortcut%20%3D%20ExampleDeepNeuralNetwork(%0A%20%20%20%20%20%20%20%20layer_sizes%2C%20use_shortcut%3DFalse%0A%20%20%20%20)%0A%20%20%20%20print_gradients(model_without_shortcut%2C%20sample_input)%0A%20%20%20%20return%20layer_sizes%2C%20sample_input%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%B9%E3%82%AD%E3%83%83%E3%83%97%E6%8E%A5%E7%B6%9A%E3%81%AF%E3%80%81%E3%81%93%E3%81%AE%E5%95%8F%E9%A1%8C%E3%82%92%E6%AC%A1%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E7%B7%A9%E5%92%8C%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_(layer_sizes%2C%20sample_input)%3A%0A%20%20%20%20torch.manual_seed(123)%0A%20%20%20%20model_with_shortcut%20%3D%20ExampleDeepNeuralNetwork(%0A%20%20%20%20%20%20%20%20layer_sizes%2C%20use_shortcut%3DTrue%0A%20%20%20%20)%0A%20%20%20%20print_gradients(model_with_shortcut%2C%20sample_input)%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%204.5%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%E3%81%A7%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E5%B1%A4%E3%81%A8%E7%B7%9A%E5%BD%A2%E5%B1%A4%E3%82%92%E3%81%A4%E3%81%AA%E3%81%90%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%E4%B8%8A%E8%A8%98%E3%81%AE%20%60MultiHeadAttention%60%E3%83%BB%60FeedForward%60%E3%83%BB%60LayerNorm%60%20%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9%E3%82%92%E5%8F%96%E3%82%8A%E5%85%A5%E3%82%8C%E3%81%A6%20%60TransformerBlock%60%20%E3%82%92%E5%AE%9F%E8%A3%85%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.class_definition%0Aclass%20TransformerBlock(nn.Module)%3A%0A%20%20%20%20def%20__init__(self%2C%20cfg)%3A%0A%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20self.att%20%3D%20MultiHeadAttention(%0A%20%20%20%20%20%20%20%20%20%20%20%20d_in%3Dcfg%5B%22emb_dim%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20d_out%3Dcfg%5B%22emb_dim%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20context_length%3Dcfg%5B%22context_length%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20num_heads%3Dcfg%5B%22n_heads%22%5D%2C%20%0A%20%20%20%20%20%20%20%20%20%20%20%20dropout%3Dcfg%5B%22drop_rate%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20qkv_bias%3Dcfg%5B%22qkv_bias%22%5D)%0A%20%20%20%20%20%20%20%20self.ff%20%3D%20FeedForward(cfg)%0A%20%20%20%20%20%20%20%20self.norm1%20%3D%20LayerNorm(cfg%5B%22emb_dim%22%5D)%0A%20%20%20%20%20%20%20%20self.norm2%20%3D%20LayerNorm(cfg%5B%22emb_dim%22%5D)%0A%20%20%20%20%20%20%20%20self.drop_shortcut%20%3D%20nn.Dropout(cfg%5B%22drop_rate%22%5D)%0A%0A%20%20%20%20def%20forward(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20%23%20%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E6%8E%A5%E7%B6%9A%0A%20%20%20%20%20%20%20%20shortcut%20%3D%20x%0A%20%20%20%20%20%20%20%20x%20%3D%20self.norm1(x)%0A%20%20%20%20%20%20%20%20x%20%3D%20self.att(x)%20%20%23%20Shape%20%5Bbatch_size%2C%20num_tokens%2C%20emb_size%5D%0A%20%20%20%20%20%20%20%20x%20%3D%20self.drop_shortcut(x)%0A%20%20%20%20%20%20%20%20x%20%3D%20x%20%2B%20shortcut%20%20%23%20%E5%85%83%E3%81%AE%E5%85%A5%E5%8A%9B%E3%82%92%E8%B6%B3%E3%81%97%E6%88%BB%E3%81%99%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%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AE%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E6%8E%A5%E7%B6%9A%0A%20%20%20%20%20%20%20%20shortcut%20%3D%20x%0A%20%20%20%20%20%20%20%20x%20%3D%20self.norm2(x)%0A%20%20%20%20%20%20%20%20x%20%3D%20self.ff(x)%0A%20%20%20%20%20%20%20%20x%20%3D%20self.drop_shortcut(x)%0A%20%20%20%20%20%20%20%20x%20%3D%20x%20%2B%20shortcut%20%20%23%20%E5%85%83%E3%81%AE%E5%85%A5%E5%8A%9B%E3%82%92%E8%B6%B3%E3%81%97%E6%88%BB%E3%81%99%0A%0A%20%20%20%20%20%20%20%20return%20x%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%A5%E5%8A%9B%E3%81%A8%E5%87%BA%E5%8A%9B%E3%81%A7%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E5%BD%A2%E7%8A%B6%E3%81%8C%E4%BF%9D%E3%81%9F%E3%82%8C%E3%82%8B%E3%80%82%E3%81%93%E3%82%8C%E3%81%AF%E6%B7%B1%E3%81%84%E5%B1%A4%E3%82%92%E7%A9%8D%E3%81%BF%E9%87%8D%E3%81%AD%E3%82%8B%E3%81%AE%E3%81%AB%E9%81%A9%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_(GPT_CONFIG_124M)%3A%0A%20%20%20%20torch.manual_seed(123)%0A%0A%20%20%20%20_x%20%3D%20torch.rand(2%2C%204%2C%20768)%20%20%23%20Shape%3A%20%5Bbatch_size%2C%20num_tokens%2C%20emb_dim%5D%0A%20%20%20%20block%20%3D%20TransformerBlock(GPT_CONFIG_124M)%0A%20%20%20%20_output%20%3D%20block(_x)%0A%0A%20%20%20%20print(%22Input%20shape%3A%22%2C%20_x.shape)%0A%20%20%20%20print(%22Output%20shape%3A%22%2C%20_output.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%23%23%204.6%20GPT%20%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E5%AE%9F%E8%A3%85%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%20Dummy%20%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%E3%83%9B%E3%83%AB%E3%83%80%E3%83%BC%E3%82%92%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%A6%20GPT-2%20%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%80%82%60TransformerBlock%60%20%E3%82%92%20%60n_layers%60%20%E5%9B%9E%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%99%E3%80%82%E5%87%BA%E5%8A%9B%E3%83%AD%E3%82%B8%E3%83%83%E3%83%88%E3%81%AF%E3%80%81%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%99%E3%82%8B%E6%9C%AA%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%AE%E7%A2%BA%E7%8E%87%E3%82%92%E8%A1%A8%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.class_definition%0Aclass%20GPTModel(nn.Module)%3A%0A%20%20%20%20def%20__init__(self%2C%20cfg)%3A%0A%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20self.tok_emb%20%3D%20nn.Embedding(cfg%5B%22vocab_size%22%5D%2C%20cfg%5B%22emb_dim%22%5D)%0A%20%20%20%20%20%20%20%20self.pos_emb%20%3D%20nn.Embedding(cfg%5B%22context_length%22%5D%2C%20cfg%5B%22emb_dim%22%5D)%0A%0A%20%20%20%20%20%20%20%20self.drop_emb%20%3D%20nn.Dropout(cfg%5B%22drop_rate%22%5D)%0A%0A%20%20%20%20%20%20%20%20self.trf_blocks%20%3D%20nn.Sequential(%0A%20%20%20%20%20%20%20%20%20%20%20%20*%5BTransformerBlock(cfg)%20for%20_%20in%20range(cfg%5B%22n_layers%22%5D)%5D)%0A%0A%20%20%20%20%20%20%20%20self.final_norm%20%3D%20LayerNorm(cfg%5B%22emb_dim%22%5D)%0A%20%20%20%20%20%20%20%20%23%20%E5%85%A5%E5%8A%9B%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%81%A8%E5%90%8C%E3%81%98%E3%82%B5%E3%82%A4%E3%82%BA%0A%20%20%20%20%20%20%20%20self.out_head%20%3D%20nn.Linear(%0A%20%20%20%20%20%20%20%20%20%20%20%20cfg%5B%22emb_dim%22%5D%2C%20cfg%5B%22vocab_size%22%5D%2C%20bias%3DFalse%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20def%20forward(self%2C%20in_idx)%3A%0A%20%20%20%20%20%20%20%20batch_size%2C%20seq_len%20%3D%20in_idx.shape%0A%0A%20%20%20%20%20%20%20%20%23%20%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E5%8C%96%E3%81%A8%E4%BD%8D%E7%BD%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%0A%20%20%20%20%20%20%20%20tok_embeds%20%3D%20self.tok_emb(in_idx)%0A%20%20%20%20%20%20%20%20pos_embeds%20%3D%20self.pos_emb(torch.arange(seq_len%2C%20device%3Din_idx.device))%0A%20%20%20%20%20%20%20%20x%20%3D%20tok_embeds%20%2B%20pos_embeds%20%20%23%20Shape%20%5Bbatch_size%2C%20num_tokens%2C%20emb_size%5D%0A%0A%20%20%20%20%20%20%20%20x%20%3D%20self.drop_emb(x)%0A%20%20%20%20%20%20%20%20x%20%3D%20self.trf_blocks(x)%0A%20%20%20%20%20%20%20%20x%20%3D%20self.final_norm(x)%0A%20%20%20%20%20%20%20%20logits%20%3D%20self.out_head(x)%0A%20%20%20%20%20%20%20%20return%20logits%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E9%A0%86%E4%BC%9D%E6%92%AD%E3%82%92%E8%A9%A6%E3%81%99%E3%80%82%E5%87%BA%E5%8A%9B%E3%81%AE%E5%BD%A2%E7%8A%B6%E3%81%AF%20(B%2Cnum_tokens%2Cd_out)%20%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%20batch)%3A%0A%20%20%20%20torch.manual_seed(123)%0A%20%20%20%20model%20%3D%20GPTModel(GPT_CONFIG_124M)%0A%0A%20%20%20%20_out%20%3D%20model(batch)%0A%20%20%20%20print(%22Input%20batch%3A%5Cn%22%2C%20batch)%0A%20%20%20%20print(%22%5CnOutput%20shape%3A%22%2C%20_out.shape)%0A%20%20%20%20print(_out)%0A%20%20%20%20return%20(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%60numel()%60%20%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%A7%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AE%E7%B7%8F%E6%95%B0%E3%82%92%E5%8F%96%E5%BE%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.cell%0Adef%20_(model)%3A%0A%20%20%20%20total_params%20%3D%20sum(p.numel()%20for%20p%20in%20model.parameters())%0A%20%20%20%20print(f%22Total%20number%20of%20parameters%3A%20%7Btotal_params%3A%2C%7D%22)%0A%20%20%20%20return%20(total_params%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%BF%85%E8%A6%81%E3%81%A7%E3%81%82%E3%82%8C%E3%81%B0%E3%80%81%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%81%AE%E9%87%8D%E3%81%BF%E3%81%A8%E5%87%BA%E5%8A%9B%E5%B1%A4%E3%81%AE%E9%87%8D%E3%81%BF%E3%82%92%E5%85%B1%E6%9C%89%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82%E3%81%93%E3%82%8C%E3%82%89%E3%81%AF%E5%90%8C%E3%81%98%E5%BD%A2%E7%8A%B6%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_(model)%3A%0A%20%20%20%20print(%22Token%20embedding%20layer%20shape%3A%22%2C%20model.tok_emb.weight.shape)%0A%20%20%20%20print(%22Output%20layer%20shape%3A%22%2C%20model.out_head.weight.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%81%AE%E3%82%88%E3%81%86%E3%81%AA%E9%87%8D%E3%81%BF%E5%85%B1%E6%9C%89%E3%82%92%E8%80%83%E6%85%AE%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E3%81%93%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%AF%201.24b%20%E3%81%BE%E3%81%A7%E6%B8%9B%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%2C%20total_params)%3A%0A%20%20%20%20total_params_gpt2%20%3D%20%20total_params%20-%20sum(p.numel()%20for%20p%20in%20model.out_head.parameters())%0A%20%20%20%20print(f%22Number%20of%20trainable%20parameters%20considering%20weight%20tying%3A%20%7Btotal_params_gpt2%3A%2C%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%93%E3%82%8C%E3%81%AB%E3%82%88%E3%82%8A%E3%80%81%E3%81%93%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80%E3%81%AE%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E8%A6%8B%E7%A9%8D%E3%82%82%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_(total_params)%3A%0A%20%20%20%20%23%20%E5%90%88%E8%A8%88%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E3%83%90%E3%82%A4%E3%83%88%E5%8D%98%E4%BD%8D%E3%81%A7%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%EF%BC%88float32%E3%80%81%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%81%82%E3%81%9F%E3%82%8A4%E3%83%90%E3%82%A4%E3%83%88%E3%82%92%E4%BB%AE%E5%AE%9A%EF%BC%89%0A%20%20%20%20total_size_bytes%20%3D%20total_params%20*%204%0A%0A%20%20%20%20%23%20%E3%83%A1%E3%82%AC%E3%83%90%E3%82%A4%E3%83%88%E3%81%B8%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%0A%20%20%20%20total_size_mb%20%3D%20total_size_bytes%20%2F%20(1024%20*%201024)%0A%0A%20%20%20%20print(f%22Total%20size%20of%20the%20model%3A%20%7Btotal_size_mb%3A.2f%7D%20MB%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%204.7%20%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E7%94%9F%E6%88%90%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%20GPT-2%20%E3%81%AE%E5%87%BA%E5%8A%9B%E3%81%8B%E3%82%89%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E7%94%9F%E6%88%90%EF%BC%88%E3%83%87%E3%82%B3%E3%83%BC%E3%83%89%EF%BC%89%E3%81%99%E3%82%8B%E9%96%A2%E6%95%B0%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82softmax%20%E3%82%92%E9%81%A9%E7%94%A8%E3%81%99%E3%82%8B%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%AF%E5%8D%98%E8%AA%BF%E3%81%AA%E3%81%AE%E3%81%A7%E7%9C%81%E7%95%A5%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E5%80%99%E8%A3%9C%E3%81%AE%E4%B8%AD%E3%81%A7%E7%A2%BA%E7%8E%87%E3%81%8C%E6%9C%80%E5%A4%A7%E3%81%A8%E3%81%AA%E3%82%8B%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E9%81%B8%E3%81%B6%E6%96%B9%E5%BC%8F%E3%81%AF%E3%80%81%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%A8%E5%91%BC%E3%81%B0%E3%82%8C%E3%82%8B%E3%80%82%E6%AC%A1%E3%81%AE%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E9%81%B8%E3%81%B6%E6%88%A6%E7%95%A5%E3%81%AF%E3%80%81%E3%82%BF%E3%82%B9%E3%82%AF%E3%81%AB%E5%BF%9C%E3%81%98%E3%81%A6%E3%81%84%E3%81%8F%E3%81%A4%E3%81%8B%E5%AD%98%E5%9C%A8%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%20generate_text_simple(model%2C%20idx%2C%20max_new_tokens%2C%20context_size)%3A%0A%20%20%20%20%23%20idx%20%E3%81%AF%E7%8F%BE%E5%9C%A8%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E5%86%85%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AE%20(batch%2C%20n_tokens)%20%E9%85%8D%E5%88%97%0A%20%20%20%20for%20_%20in%20range(max_new_tokens)%3A%0A%0A%20%20%20%20%20%20%20%20%23%20%E7%8F%BE%E5%9C%A8%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%8C%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AF%E5%88%87%E3%82%8A%E8%A9%B0%E3%82%81%E3%82%8B%0A%20%20%20%20%20%20%20%20%23%20%E4%BE%8B%3A%20LLM%20%E3%81%8C5%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%97%E3%81%8B%E6%89%B1%E3%81%88%E3%81%9A%E3%80%81%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%8C10%E3%81%AE%E3%81%A8%E3%81%8D%E3%81%AF%E3%80%81%0A%20%20%20%20%20%20%20%20%23%20%E7%9B%B4%E8%BF%91%E3%81%AE5%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%A0%E3%81%91%E3%82%92%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E3%81%86%0A%20%20%20%20%20%20%20%20idx_cond%20%3D%20idx%5B%3A%2C%20-context_size%3A%5D%0A%0A%20%20%20%20%20%20%20%20%23%20%E4%BA%88%E6%B8%AC%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%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%0A%20%20%20%20%20%20%20%20%23%20%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%20%20%20%20%20%23%20(batch%2C%20n_tokens%2C%20vocab_size)%20%E3%81%8C%20(batch%2C%20vocab_size)%20%E3%81%AB%E3%81%AA%E3%82%8B%0A%20%20%20%20%20%20%20%20logits%20%3D%20logits%5B%3A%2C%20-1%2C%20%3A%5D%20%20%0A%0A%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%20probas%20%3D%20torch.softmax(logits%2C%20dim%3D-1)%20%20%23%20(batch%2C%20vocab_size)%0A%0A%20%20%20%20%20%20%20%20%23%20%E7%A2%BA%E7%8E%87%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%20idx_next%20%3D%20torch.argmax(probas%2C%20dim%3D-1%2C%20keepdim%3DTrue)%20%20%23%20(batch%2C%201)%0A%0A%20%20%20%20%20%20%20%20%23%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%2C%20n_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%E5%85%A5%E5%8A%9B%E3%82%92%E7%94%A8%E6%84%8F%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E3%83%88%E3%83%BC%E3%82%AF%E3%83%8A%E3%82%A4%E3%82%B6%E3%83%BC%E3%81%A7%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%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_(tokenizer)%3A%0A%20%20%20%20start_context%20%3D%20%22Hello%2C%20I%20am%22%0A%0A%20%20%20%20encoded%20%3D%20tokenizer.encode(start_context)%0A%20%20%20%20print(%22encoded%3A%22%2C%20encoded)%0A%0A%20%20%20%20encoded_tensor%20%3D%20torch.tensor(encoded).unsqueeze(0)%0A%20%20%20%20print(%22encoded_tensor.shape%3A%22%2C%20encoded_tensor.shape)%0A%20%20%20%20return%20(encoded_tensor%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%82%8C%E3%82%92%E9%96%A2%E6%95%B0%E3%81%AB%E5%85%A5%E5%8A%9B%E3%81%97%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%E3%80%82%E5%87%BA%E5%8A%9B%E3%81%AF%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3ID%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%20encoded_tensor%2C%20model)%3A%0A%20%20%20%20model.eval()%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%0A%20%20%20%20out_gen%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%3Dencoded_tensor%2C%20%0A%20%20%20%20%20%20%20%20max_new_tokens%3D6%2C%20%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%3A%22%2C%20out_gen)%0A%20%20%20%20print(%22Output%20length%3A%22%2C%20len(out_gen%5B0%5D))%0A%20%20%20%20return%20(out_gen%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%87%BA%E5%8A%9B%E3%81%AE%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3ID%E3%82%92%E3%83%88%E3%83%BC%E3%82%AF%E3%83%8A%E3%82%A4%E3%82%B6%E3%83%BC%E3%81%A7%E3%83%87%E3%82%B3%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B%E3%80%82%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_(out_gen%2C%20tokenizer)%3A%0A%20%20%20%20decoded_text%20%3D%20tokenizer.decode(out_gen.squeeze(0).tolist())%0A%20%20%20%20print(decoded_text)%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
bc6b3084cb5ac905549f04cb5146499c