import%20marimo%0A%0A__generated_with%20%3D%20%220.11.25%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20requests%0A%20%20%20%20import%20torch%0A%20%20%20%20import%20torch.nn.functional%20as%20F%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%20%23%20for%20making%20figures%0A%20%20%20%20return%20F%2C%20mo%2C%20plt%2C%20requests%2C%20torch%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22We%20follow%20the%20%5Blecture%202%5D(https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DTCH_1BHY58I%26list%3DPLAqhIrjkxbuWI23v9cThsA9GvCAUhRvKZ%26index%3D3%26ab_channel%3DAndrejKarpathy)%20of%20Andrej%20Karpathy's%20course%20and%20add%20some%20comments.%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(requests)%3A%0A%20%20%20%20%23%20Read%20dataset%0A%20%20%20%20url%20%3D%20'https%3A%2F%2Fraw.githubusercontent.com%2Fkarpathy%2Fmakemore%2Fmaster%2Fnames.txt'%0A%20%20%20%20content_in_bytes%20%3D%20requests.get(url).content%0A%20%20%20%20words%20%3D%20content_in_bytes.decode('utf-8').split()%0A%20%20%20%20return%20content_in_bytes%2C%20url%2C%20words%0A%0A%0A%40app.cell%0Adef%20_(words)%3A%0A%20%20%20%20%23%20Now%20we%20create%20index-mappings%20from%20chars%20to%20ints%20and%20back%0A%20%20%20%20chars%20%3D%20set()%0A%20%20%20%20for%20n%20in%20words%3A%0A%20%20%20%20%20%20%20%20chars_from_name%20%3D%20%5Bi%20for%20i%20in%20n%5D%0A%20%20%20%20%20%20%20%20%5Bchars.add(i)%20for%20i%20in%20chars_from_name%5D%0A%20%20%20%20chars%20%3D%20sorted(list(chars))%0A%20%20%20%20%23%20char%20to%20index%0A%20%20%20%20stoi%20%3D%20%7Bs%3Ai%2B1%20for%20i%2Cs%20in%20enumerate(chars)%7D%0A%20%20%20%20stoi%5B'.'%5D%20%3D%200%0A%20%20%20%20%23%20%7B%22.%22%3A%200%2C%20%22a%22%3A%201%2C%20etc%7D%0A%20%20%20%20%23%20index%20to%20str%0A%20%20%20%20itos%20%3D%20%7Bs%3Ai%20for%20i%2Cs%20in%20stoi.items()%7D%0A%20%20%20%20%23%20%7B0%3A%20%22.%22%2C%201%3A%20%22a%22%2C%20etc%7D%0A%20%20%20%20return%20chars%2C%20chars_from_name%2C%20itos%2C%20n%2C%20stoi%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20%23%20Now%20we%20build%20the%20dataset.%20%20Below%20the%20architecture%20we%20are%20targeting%20(%5Blink%5D(https%3A%2F%2Fwww.jmlr.org%2Fpapers%2Fvolume3%2Fbengio03a%2Fbengio03a.pdf))%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(stoi%2C%20torch)%3A%0A%20%20%20%20context_length%20%3D%203%0A%0A%20%20%20%20def%20build_dataset(words%3A%20list%5Bstr%5D%2C%20context_length%3A%20int%20%3D%203)%3A%0A%0A%20%20%20%20%20%20%20%20X%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20Y%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20for%20w%20in%20words%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20context%20%3D%20%5B0%5D*context_length%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20we%20want%20context%20to%20grow%20with%20every%20char%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20char%20in%20w%20%2B%20'.'%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20prev_chars%20%3D%20context%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20target%20%3D%20char%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20X.append(prev_chars)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Y.append(stoi%5Btarget%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20idx_char%20%3D%20stoi%5Bchar%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20context%20%3D%20context%5B1%3A%5D%20%2B%20%5Bidx_char%5D%0A%0A%20%20%20%20%20%20%20%20X%20%3D%20torch.tensor(X)%0A%20%20%20%20%20%20%20%20Y%20%3D%20torch.tensor(Y)%0A%20%20%20%20%20%20%20%20return%20X%2CY%0A%20%20%20%20return%20build_dataset%2C%20context_length%0A%0A%0A%40app.cell%0Adef%20_(build_dataset%2C%20words)%3A%0A%20%20%20%20%23X%2CY%20%3D%20build_dataset()%0A%0A%20%20%20%20%23%20splitting%20train-test%20datasets%20-%20%20we%20could%20have%20used%20sklearn%0A%20%20%20%20n1%20%3D%20int(len(words)*0.8)%0A%20%20%20%20n2%20%3D%20int(len(words)*0.9)%0A%20%20%20%20Xtr%2C%20Ytr%20%3D%20build_dataset(words%5B%3An1%5D)%0A%20%20%20%20Xdev%2C%20Ydev%20%3D%20build_dataset(words%5Bn1%3An2%5D)%0A%20%20%20%20Xte%2C%20Yte%20%3D%20build_dataset(words%5Bn2%3A%5D)%0A%20%20%20%20return%20Xdev%2C%20Xte%2C%20Xtr%2C%20Ydev%2C%20Yte%2C%20Ytr%2C%20n1%2C%20n2%0A%0A%0A%40app.cell%0Adef%20_(Xdev%2C%20Xte%2C%20Xtr)%3A%0A%20%20%20%20len(Xtr)%2Clen(Xdev)%2Clen(Xte)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%7CFrom%20the%20above%2C%20we%20can%20see%20that%20we%20are%20building%20a%20context%20window%20of%20integers%20(that%20correspond%20to%20chars)%20that%20will%20be%20used%20to%20predict%20the%20target%20(again%20given%20in%20int%2C%20but%20also%20associated%20with%20a%20char.)%20For%20example%2C%0A%0A%20%20%20%20%20%20%20%20%5B0%2C0%2C0%5D%20-%3E%20e%20(first%20letter%20of%20emma)%0A%20%20%20%20%20%20%20%20%5Be%2Cm%2Cm%5D%20-%3E%20a%20(final%20letter%20of%20emma)%0A%20%20%20%20%20%20%20%20%5Bm%2Cm%2Ca%5D%20-%3E%20.%20(after%20emma%20ends)%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22!%5Bimage.png%5D(https%3A%2F%2Fi.postimg.cc%2FZ5XhDGjn%2Fimage.png)%5D(https%3A%2F%2Fpostimg.cc%2F21dJ1XsN)%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20Now%20we%20proceed%20to%20build%20the%20Neural%20net%2C%20as%20illustrated%20above.%0A%20%20%20%20%20%20%20%20Basic%20idea%20is%20to%20have%20one%20matrix%20C%20per%20character%20used%20in%20the%20context%20length%2C%20and%20fully%20connext%20those%20to%20neurons%20in%20the%20tanh%20layer%2C%20which%20finally%20go%20to%20a%20softmax%20and%20then%20are%20used%20to%20predict%20the%20target%20char.%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(torch)%3A%0A%20%20%20%20%23%20g%20%3D%20torch.Generator().manual_seed(2147483647)%20%23%20for%20reproducibility%0A%20%20%20%20%23%20C%20%3D%20torch.randn((27%2C%2010)%2C%20generator%3Dg)%0A%20%20%20%20%23%20W1%20%3D%20torch.randn((30%2C%20200)%2C%20generator%3Dg)%0A%20%20%20%20%23%20b1%20%3D%20torch.randn(200%2C%20generator%3Dg)%0A%20%20%20%20%23%20W2%20%3D%20torch.randn((200%2C%2027)%2C%20generator%3Dg)%0A%20%20%20%20%23%20b2%20%3D%20torch.randn(27%2C%20generator%3Dg)%0A%20%20%20%20%23%20parameters%20%3D%20%5BC%2C%20W1%2C%20b1%2C%20W2%2C%20b2%5D%0A%0A%20%20%20%20g%20%3D%20torch.Generator().manual_seed(2147483647)%20%23%20for%20reproducibility%0A%20%20%20%20C%20%3D%20torch.randn((27%2C%2010)%2C%20generator%3Dg)%0A%20%20%20%20W1%20%3D%20torch.randn((30%2C%20200)%2C%20generator%3Dg)%0A%20%20%20%20b1%20%3D%20torch.randn(200%2C%20generator%3Dg)%0A%20%20%20%20W2%20%3D%20torch.randn((200%2C%2027)%2C%20generator%3Dg)%0A%20%20%20%20b2%20%3D%20torch.randn(27%2C%20generator%3Dg)%0A%20%20%20%20parameters%20%3D%20%5BC%2C%20W1%2C%20b1%2C%20W2%2C%20b2%5D%0A%0A%20%20%20%20for%20param3%20in%20parameters%3A%0A%20%20%20%20%20%20%20%20param3.requires_grad%20%3D%20True%0A%20%20%20%20return%20C%2C%20W1%2C%20W2%2C%20b1%2C%20b2%2C%20g%2C%20param3%2C%20parameters%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22In%20essence%2C%20C%20acts%20as%20a%20table%20where%20you%20can%20%22look%20up%22%20the%2010-dimensional%20feature%20vector%20(the%20embedding)%20associated%20with%20each%20of%20the%2027%20possible%20characters%20in%20your%20vocabulary.%20When%20an%20integer%20representing%20a%20character%20is%20fed%20into%20the%20model%2C%20this%20matrix%20is%20used%20to%20retrieve%20its%20corresponding%2010-dimensional%20embedding%20vector%2C%20which%20then%20serves%20as%20input%20to%20the%20subsequent%20layers%20of%20the%20neural%20network%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(parameters)%3A%0A%20%20%20%20sum(p.nelement()%20for%20p%20in%20parameters)%20%23%20number%20of%20parameters%20in%20total%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(parameters)%3A%0A%20%20%20%20for%20p%20in%20parameters%3A%0A%20%20%20%20%20%20p.requires_grad%20%3D%20True%0A%20%20%20%20return%20(p%2C)%0A%0A%0A%40app.cell%0Adef%20_(C%2C%20F%2C%20W1%2C%20W2%2C%20Xtr%2C%20Ytr%2C%20b1%2C%20b2%2C%20parameters%2C%20torch)%3A%0A%20%20%20%20print1%20%3D%20False%0A%20%20%20%20stepi%20%3D%20%5B%5D%0A%20%20%20%20lossi%20%3D%20%5B%5D%0A%20%20%20%20for%20i%20in%20range(5000)%3A%0A%0A%20%20%20%20%20%20%20%20%23%20mini%20batch%0A%20%20%20%20%20%20%20%20ix%20%3D%20torch.randint(0%2C%20Xtr.shape%5B0%5D%2C%20(32%2C))%0A%20%20%20%20%20%20%20%20%23ix%20%3D%20%5Bi%5D%0A%0A%20%20%20%20%20%20%20%20%23%20forward%20pass%0A%20%20%20%20%20%20%20%20emb%20%3D%20C%5BXtr%5Bix%5D%5D%0A%20%20%20%20%20%20%20%20mult%20%3D%20emb.view(-1%2C30)%20%40%20W1%20%2B%20b1%0A%20%20%20%20%20%20%20%20h%20%3D%20torch.tanh(mult)%0A%20%20%20%20%20%20%20%20logits%20%3D%20h%40W2%20%2B%20b2%0A%20%20%20%20%20%20%20%20loss%20%3D%20F.cross_entropy(logits%2C%20Ytr%5Bix%5D)%0A%0A%20%20%20%20%20%20%20%20for%20param%20in%20parameters%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20param.grad%20%3D%20None%0A%0A%20%20%20%20%20%20%20%20loss.backward()%0A%0A%20%20%20%20%20%20%20%20%23%20update%20grads%0A%20%20%20%20%20%20%20%20lr%20%3D%200.1%0A%20%20%20%20%20%20%20%20for%20param2%20in%20parameters%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20param2.data%20%2B%3D%20-lr%20*%20param2.grad%0A%0A%20%20%20%20%20%20%20%20stepi.append(i)%0A%20%20%20%20%20%20%20%20lossi.append(loss.log10().item())%0A%0A%20%20%20%20%20%20%20%20if%20print1%20and%20i%20%25%2010%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print('Xtr'%2C%20Xtr%5Bix%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20print('emb'%2C%20emb.shape)%0A%20%20%20%20%20%20%20%20%20%20%20%20print('mult'%2C%20mult.shape)%0A%20%20%20%20%20%20%20%20%20%20%20%20print('h'%2C%20h.shape)%0A%20%20%20%20%20%20%20%20%20%20%20%20print('logits'%2C%20logits.shape)%0A%20%20%20%20%20%20%20%20%20%20%20%20print('Ytr'%2C%20Ytr.shape)%0A%20%20%20%20%20%20%20%20%20%20%20%20print('loss'%2C%20loss)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20emb%2C%0A%20%20%20%20%20%20%20%20h%2C%0A%20%20%20%20%20%20%20%20i%2C%0A%20%20%20%20%20%20%20%20ix%2C%0A%20%20%20%20%20%20%20%20logits%2C%0A%20%20%20%20%20%20%20%20loss%2C%0A%20%20%20%20%20%20%20%20lossi%2C%0A%20%20%20%20%20%20%20%20lr%2C%0A%20%20%20%20%20%20%20%20mult%2C%0A%20%20%20%20%20%20%20%20param%2C%0A%20%20%20%20%20%20%20%20param2%2C%0A%20%20%20%20%20%20%20%20print1%2C%0A%20%20%20%20%20%20%20%20stepi%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(lossi%2C%20plt)%3A%0A%20%20%20%20%23plt.yscale(%22log%22)%0A%20%20%20%20plt.plot(lossi)%0A%20%20%20%20%23print('a')%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(lossi)%3A%0A%20%20%20%20lossi%5B-1%5D%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(C%2C%20F%2C%20W1%2C%20W2%2C%20b1%2C%20b2%2C%20torch)%3A%0A%20%20%20%20%23%20training%20loss%20-%3E%20calculate%20forward%20pass%0A%20%20%20%20%23%20forward%20pass%0A%20%20%20%20def%20calculate_loss(X%2C%20Y)%3A%0A%20%20%20%20%20%20%20%20emb1%20%3D%20C%5BX%5D%0A%20%20%20%20%20%20%20%20mult1%20%3D%20emb1.view(-1%2C30)%20%40%20W1%20%2B%20b1%0A%20%20%20%20%20%20%20%20h1%20%3D%20torch.tanh(mult1)%0A%20%20%20%20%20%20%20%20logits1%20%3D%20h1%40W2%20%2B%20b2%0A%20%20%20%20%20%20%20%20loss1%20%3D%20F.cross_entropy(logits1%2C%20Y)%0A%20%20%20%20%20%20%20%20%23print(loss1)%0A%20%20%20%20%20%20%20%20return%20loss1.item()%0A%20%20%20%20return%20(calculate_loss%2C)%0A%0A%0A%40app.cell%0Adef%20_(Xdev%2C%20Xte%2C%20Xtr%2C%20Ydev%2C%20Yte%2C%20Ytr%2C%20calculate_loss)%3A%0A%20%20%20%20print('loss%20train'%2C%20calculate_loss(Xtr%2C%20Ytr))%0A%20%20%20%20print('loss%20val'%2C%20calculate_loss(Xdev%2C%20Ydev))%0A%20%20%20%20print('loss%20test'%2C%20calculate_loss(Xte%2C%20Yte))%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(C%2C%20itos%2C%20plt)%3A%0A%20%20%20%20%23%20visualize%20embeddings%0A%20%20%20%20plt.figure(figsize%3D(8%2C8))%0A%20%20%20%20plt.scatter(C%5B%3A%2C0%5D.data%2C%20C%5B%3A%2C1%5D.data%2C%20s%3D200)%0A%20%20%20%20for%20ii%20in%20range(C.shape%5B0%5D)%3A%0A%20%20%20%20%20%20%20%20plt.text(C%5Bii%2C0%5D.item()%2C%20C%5Bii%2C1%5D.item()%2C%20itos%5Bii%5D%2C%20ha%3D%22center%22%2C%20va%3D%22center%22%2C%20color%3D'white')%0A%20%20%20%20plt.grid('minor')%0A%20%20%20%20plt.show()%0A%20%20%20%20return%20(ii%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%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
b1d1012a4151e77bc1f2c669bd8212e34333a76a946a3a2e39ef81c97f34d848