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%20torch%0A%20%20%20%20import%20torch.nn%20as%20nn%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%AC3%E7%AB%A0%3A%20%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E6%A9%9F%E6%A7%8B%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(%22torch%20version%3A%22%2C%20version(%22torch%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%203.3%20%E3%82%BB%E3%83%AB%E3%83%95%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E5%85%A5%E5%8A%9B%E3%81%AE%E7%95%B0%E3%81%AA%E3%82%8B%E9%83%A8%E5%88%86%E3%81%AB%E6%B3%A8%E7%9B%AE%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%23%203.3.1%20%E5%AD%A6%E7%BF%92%E5%8F%AF%E8%83%BD%E3%81%AA%E9%87%8D%E3%81%BF%E3%82%92%E6%8C%81%E3%81%9F%E3%81%AA%E3%81%84%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%82%BB%E3%83%AB%E3%83%95%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E6%A9%9F%E6%A7%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%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E5%B1%A4%E3%81%B8%E3%81%AE%E5%85%A5%E5%8A%9B%E3%81%A8%E3%81%97%E3%81%A6%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%82%92%E7%94%A8%E6%84%8F%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%20inputs%20%3D%20torch.tensor(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B0.43%2C%200.15%2C%200.89%5D%2C%20%20%23%20Your%20%20%20%20%20(x%5E1)%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B0.55%2C%200.87%2C%200.66%5D%2C%20%20%23%20journey%20%20(x%5E2)%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B0.57%2C%200.85%2C%200.64%5D%2C%20%20%23%20starts%20%20%20(x%5E3)%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B0.22%2C%200.58%2C%200.33%5D%2C%20%20%23%20with%20%20%20%20%20(x%5E4)%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B0.77%2C%200.25%2C%200.10%5D%2C%20%20%23%20one%20%20%20%20%20%20(x%5E5)%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B0.05%2C%200.80%2C%200.55%5D%2C%20%20%23%20step%20%20%20%20%20(x%5E6)%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%20%20%20%20return%20(inputs%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%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B9%E3%82%B3%E3%82%A2%20%24%5Comega_%7B2i%7D%24%20%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%5Comega_%7B2i%7D%20%5Cequiv%20%5Cvec%7Bx%7D_2%20%5Ccdot%20%5Cvec%7Bx%7D_i.%0A%20%20%20%20%5C%5D%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(inputs)%3A%0A%20%20%20%20query%20%3D%20inputs%5B1%5D%20%20%23%202%E7%95%AA%E7%9B%AE%E3%81%AE%E5%85%A5%E5%8A%9B%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%A8%E3%81%99%E3%82%8B%0A%0A%20%20%20%20attn_scores_2_trainless%20%3D%20torch.empty(inputs.shape%5B0%5D)%0A%20%20%20%20for%20_i%2C%20_x_i%20in%20enumerate(inputs)%3A%0A%20%20%20%20%20%20%20%20%23%20%E5%86%85%E7%A9%8D%EF%BC%881%E6%AC%A1%E5%85%83%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AA%E3%81%AE%E3%81%A7%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%E8%BB%A2%E7%BD%AE%E3%81%AF%E4%B8%8D%E8%A6%81%EF%BC%89%0A%20%20%20%20%20%20%20%20attn_scores_2_trainless%5B_i%5D%20%3D%20torch.dot(_x_i%2C%20query)%0A%20%20%20%20print(attn_scores_2_trainless)%0A%20%20%20%20return%20attn_scores_2_trainless%2C%20query%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%86%85%E7%A9%8D%E3%81%AF%E5%88%9D%E5%AD%A6%E8%80%85%E5%90%91%E3%81%91%E3%81%AB%E6%AC%A1%E3%81%AE%E5%BC%8F%E3%81%A7%E7%A2%BA%E8%AA%8D%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%5C%5B%0A%20%20%20%20%5Cvec%7Bx%7D_0%5Ccdot%5Cvec%7Bx%7D_1%0A%20%20%20%20%5Cequiv%5Csum_%7Bi%3D0%7D%5E%7B%5Cmathrm%7Bdim%7D(%5Cvec%7Bx%7D_0)-1%7D(x_0)_i(x_1)_i.%0A%20%20%20%20%5C%5D%0A%0A%20%20%20%20%E5%86%85%E7%A9%8D%E3%81%AF2%E3%81%A4%E3%81%AE%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E9%A1%9E%E4%BC%BC%E5%BA%A6%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_(inputs%2C%20query)%3A%0A%20%20%20%20_res%20%3D%200.0%0A%20%20%20%20for%20_idx%2C%20_element%20in%20enumerate(inputs%5B0%5D)%3A%0A%20%20%20%20%20%20%20%20_res%20%2B%3D%20inputs%5B0%5D%5B_idx%5D%20*%20query%5B_idx%5D%0A%0A%20%20%20%20print(_res)%0A%20%20%20%20print(torch.dot(inputs%5B0%5D%2C%20query))%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%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AF%E9%87%8D%E3%81%BF%E3%82%92%E8%A1%A8%E3%81%99%E3%82%88%E3%81%86%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%99%E3%81%B9%E3%81%8D%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_(attn_scores_2_trainless)%3A%0A%20%20%20%20_attn_weights_2_tmp%20%3D%20attn_scores_2_trainless%20%2F%20attn_scores_2_trainless.sum()%0A%0A%20%20%20%20print(%22Attention%20weights%3A%22%2C%20_attn_weights_2_tmp)%0A%20%20%20%20print(%22Sum%3A%22%2C%20_attn_weights_2_tmp.sum())%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%AD%A3%E8%A6%8F%E5%8C%96%E3%81%AB%E3%82%88%E3%82%8A%E9%81%A9%E3%81%97%E3%81%9F%E9%96%A2%E6%95%B0%E3%81%AF%E3%80%81%E5%80%A4%E3%81%8C%E6%AD%A3%E3%81%A7%E5%AD%A6%E7%BF%92%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E9%A0%91%E5%81%A5%E3%81%AA%E5%8B%BE%E9%85%8D%E3%82%92%E6%8C%81%E3%81%A4%20softmax%20%E9%96%A2%E6%95%B0%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%5C%5B%0A%20%20%20%20%5Csigma(x_i%3B%5Cvec%7Bx%7D)%5Cequiv%5Cfrac%7Be%5E%7Bx_i%7D%7D%7B%5Csum_j%20e%5E%7Bx_j%7D%7D.%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_naive(x)%3A%0A%20%20%20%20return%20torch.exp(x)%20%2F%20torch.exp(x).sum(dim%3D0)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20softmax%20%E9%96%A2%E6%95%B0%E3%82%82%E3%80%81%E5%90%88%E8%A8%88%E3%81%8C1%E3%81%AB%E3%81%AA%E3%82%8B%E9%87%8D%E3%81%BF%E3%82%92%E4%B8%8E%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_(attn_scores_2_trainless)%3A%0A%20%20%20%20_attn_weights_2_naive%20%3D%20softmax_naive(attn_scores_2_trainless)%0A%0A%20%20%20%20print(%22Attention%20weights%3A%22%2C%20_attn_weights_2_naive)%0A%20%20%20%20print(%22Sum%3A%22%2C%20_attn_weights_2_naive.sum())%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%20softmax%20%E9%96%A2%E6%95%B0%E3%81%AF%20%5Bmax%20%E3%83%88%E3%83%AA%E3%83%83%E3%82%AF%E3%81%A8%20LogSumExp%20%E3%83%88%E3%83%AA%E3%83%83%E3%82%AF%5D(https%3A%2F%2Fdiscuss.pytorch.org%2Ft%2Fjustification-for-logsoftmax-being-better-than-log-softmax%2F140130%2F3)%E3%82%92%E7%94%A8%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E6%95%B0%E5%80%A4%E8%AA%A4%E5%B7%AE%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E3%82%88%E3%82%8A%E5%AE%89%E5%AE%9A%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_(attn_scores_2_trainless)%3A%0A%20%20%20%20attn_weights_2_trainless%20%3D%20torch.softmax(attn_scores_2_trainless%2C%20dim%3D0)%0A%0A%20%20%20%20print(%22Attention%20weights%3A%22%2C%20attn_weights_2_trainless)%0A%20%20%20%20print(%22Sum%3A%22%2C%20attn_weights_2_trainless.sum())%0A%20%20%20%20return%20(attn_weights_2_trainless%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%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%AF%E3%80%81%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E5%8A%A0%E9%87%8D%E5%B9%B3%E5%9D%87%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E9%87%8D%E3%81%BF%E3%81%A8%E3%81%97%E3%81%A6%E7%94%A8%E3%81%84%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%9D%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%AF%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%20%24%5Cvec%7Bz%7D%5E%7B(i)%7D%24%20%E3%81%A8%E5%91%BC%E3%81%B0%E3%82%8C%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%E5%BD%A2%E5%BC%8F%E7%9A%84%E3%81%AB%E3%81%AF%E3%80%81%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%20%24%5Cvec%7Bz%7D%5E%7B(i)%7D%24%20%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%5Comega_%7Bij%7D%20%26%3D%20%5Cvec%7Bx%7D_i%20%5Ccdot%20%5Cvec%7Bx%7D_j%2C%20%5C%5C%0A%20%20%20%20%5Calpha_%7Bij%7D%20%26%3D%20%5Cfrac%7B%5Cexp(%5Comega_%7Bij%7D)%7D%7B%5Csum_k%5Cexp(%5Comega_%7Bik%7D)%7D%2C%20%5C%5C%0A%20%20%20%20%5Cvec%7Bz%7D%5E%7B(i)%7D%20%26%3D%20%5Csum_j%20%5Calpha_%7Bij%7D%5Cvec%7Bx%7D_j.%0A%20%20%20%20%5Cend%7Baligned%7D%0A%20%20%20%20%5C%5D%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(attn_weights_2_trainless%2C%20inputs%2C%20query)%3A%0A%20%20%20%20context_vec_2_trainless%20%3D%20torch.zeros(query.shape)%0A%20%20%20%20for%20_i%2C%20_x_i%20in%20enumerate(inputs)%3A%0A%20%20%20%20%20%20%20%20context_vec_2_trainless%20%2B%3D%20attn_weights_2_trainless%5B_i%5D%20*%20_x_i%0A%0A%20%20%20%20print(context_vec_2_trainless)%0A%20%20%20%20return%20(context_vec_2_trainless%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%203.3.2%20%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E5%85%A5%E5%8A%9B%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E9%87%8D%E3%81%BF%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%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%AF%E3%82%A8%E3%83%AA%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%82%92%E8%A8%88%E7%AE%97%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_(inputs)%3A%0A%20%20%20%20_attn_scores%20%3D%20torch.empty(6%2C%206)%0A%0A%20%20%20%20for%20_i%2C%20_x_i%20in%20enumerate(inputs)%3A%0A%20%20%20%20%20%20%20%20for%20_j%2C%20_x_j%20in%20enumerate(inputs)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_attn_scores%5B_i%2C%20_j%5D%20%3D%20torch.dot(_x_i%2C%20_x_j)%0A%20%20%20%20print(_attn_scores)%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%20Python%20%E3%81%A7%E3%81%AF%E3%80%81%E3%81%93%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E4%BA%8C%E9%87%8D%E3%81%AE%20for%20%E3%83%AB%E3%83%BC%E3%83%97%E3%81%AF%E9%9D%9E%E5%8A%B9%E7%8E%87%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E8%A8%88%E7%AE%97%E5%8A%B9%E7%8E%87%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AB%E3%81%AF%E3%80%81%E6%AC%A1%E3%81%AE%E8%A1%8C%E5%88%97%E7%A9%8D%E3%82%92%E7%94%A8%E3%81%84%E3%82%8B%E6%96%B9%E3%81%8C%E6%9C%9B%E3%81%BE%E3%81%97%E3%81%84%E3%80%82%E3%81%93%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%AF%E5%89%8D%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%A8%E5%90%8C%E3%81%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_(inputs)%3A%0A%20%20%20%20attn_scores%20%3D%20inputs%20%40%20inputs.T%0A%20%20%20%20print(attn_scores)%0A%20%20%20%20return%20(attn_scores%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%90%84%E8%A1%8C%E3%81%AB%20softmax%20%E9%96%A2%E6%95%B0%E3%82%92%E9%81%A9%E7%94%A8%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_(attn_scores)%3A%0A%20%20%20%20attn_weights%20%3D%20torch.softmax(attn_scores%2C%20dim%3D-1)%0A%20%20%20%20print(attn_weights)%0A%20%20%20%20return%20(attn_weights%2C)%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%E3%81%AF%E3%81%93%E3%82%8C%E3%81%A7%E7%A2%BA%E8%AA%8D%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_(attn_weights)%3A%0A%20%20%20%20row_2_sum%20%3D%20sum(%5B0.1385%2C%200.2379%2C%200.2333%2C%200.1240%2C%200.1082%2C%200.1581%5D)%0A%20%20%20%20print(%22Row%202%20sum%3A%22%2C%20row_2_sum)%0A%0A%20%20%20%20print(%22All%20row%20sums%3A%22%2C%20attn_weights.sum(dim%3D-1))%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%8A%A0%E9%87%8D%E5%B9%B3%E5%9D%87%E3%82%82%E3%80%81%E8%A1%8C%E5%88%97%E3%81%A8%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%AE%E7%A9%8D%E3%82%92%E7%94%A8%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%81%A7%E7%B0%A1%E6%BD%94%E3%81%AB%E8%A1%A8%E3%81%9B%E3%82%8B%E3%80%82%0A%20%20%20%20%E6%9C%80%E7%B5%82%E7%9A%84%E3%81%AB%E3%80%81%E6%AC%A1%E3%81%AE%E5%BC%8F%E3%81%8C%E5%BE%97%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%5C%5B%0A%20%20%20%20Z%5Cequiv%5Cmathrm%7BSoftmax%7D(XX%5ET)X%0A%20%20%20%20%5C%5D%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(attn_weights%2C%20inputs)%3A%0A%20%20%20%20all_context_vecs%20%3D%20attn_weights%20%40%20inputs%0A%20%20%20%20print(all_context_vecs)%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%202%E7%95%AA%E7%9B%AE%E3%81%AE%E3%82%B9%E3%83%A9%E3%82%A4%E3%82%B9%E3%81%AF%E3%80%81%E5%89%8D%E7%AF%80%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%A8%E3%81%BE%E3%81%A3%E3%81%9F%E3%81%8F%E5%90%8C%E3%81%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_(context_vec_2_trainless)%3A%0A%20%20%20%20print(%22Previous%202nd%20context%20vector%3A%22%2C%20context_vec_2_trainless)%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%203.4%20%E5%AD%A6%E7%BF%92%E5%8F%AF%E8%83%BD%E3%81%AA%E9%87%8D%E3%81%BF%E3%82%92%E6%8C%81%E3%81%A4%E3%82%BB%E3%83%AB%E3%83%95%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%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%23%23%23%203.4.1%20%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E9%87%8D%E3%81%BF%E3%82%92%E6%AE%B5%E9%9A%8E%E7%9A%84%E3%81%AB%E8%A8%88%E7%AE%97%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%E5%AD%A6%E7%BF%92%E5%8F%AF%E8%83%BD%E3%81%AA%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E5%B1%A4%E3%81%AE%E5%B0%8E%E5%85%A5%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%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E7%94%A8%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_(inputs)%3A%0A%20%20%20%20x_2%20%3D%20inputs%5B1%5D%20%20%23%202%E7%95%AA%E7%9B%AE%E3%81%AE%E5%85%A5%E5%8A%9B%E8%A6%81%E7%B4%A0%0A%20%20%20%20d_in%20%3D%20inputs.shape%5B1%5D%20%20%23%20%E5%85%A5%E5%8A%9B%E3%81%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E6%AC%A1%E5%85%83%2C%20d%3D3%0A%20%20%20%20d_out%20%3D%202%20%20%23%20%E5%87%BA%E5%8A%9B%E3%81%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E6%AC%A1%E5%85%83%2C%20d%3D2%0A%20%20%20%20return%20d_in%2C%20d_out%2C%20x_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%AF%E5%AD%A6%E7%BF%92%E5%8F%AF%E8%83%BD%E3%81%AA%E9%87%8D%E3%81%BF%E8%A1%8C%E5%88%97%EF%BC%88%E3%81%99%E3%81%AA%E3%82%8F%E3%81%A1%E7%B7%9A%E5%BD%A2%E5%B0%84%E5%BD%B1%EF%BC%89%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_(d_in%2C%20d_out)%3A%0A%20%20%20%20torch.manual_seed(123)%0A%0A%20%20%20%20%23%20requires_grad%3DFalse%20%E3%81%AF%E7%B0%A1%E5%8D%98%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%81%BF%EF%BC%88%E5%AD%A6%E7%BF%92%E3%81%AB%E3%81%AF%20True%20%E3%81%8C%E5%BF%85%E8%A6%81%EF%BC%89%0A%20%20%20%20W_query%20%3D%20torch.nn.Parameter(torch.rand(d_in%2C%20d_out)%2C%20requires_grad%3DFalse)%0A%20%20%20%20W_key%20%3D%20torch.nn.Parameter(torch.rand(d_in%2C%20d_out)%2C%20requires_grad%3DFalse)%0A%20%20%20%20W_value%20%3D%20torch.nn.Parameter(torch.rand(d_in%2C%20d_out)%2C%20requires_grad%3DFalse)%0A%20%20%20%20return%20W_key%2C%20W_query%2C%20W_value%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E7%B7%9A%E5%BD%A2%E5%B0%84%E5%BD%B1%E3%81%AF%E6%AC%A1%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%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%20Q_2%20%26%3D%20%5Cvec%7Bx%7D_2%20W%5EQ%2C%20%5C%5C%0A%20%20%20%20K_2%20%26%3D%20%5Cvec%7Bx%7D_2%20W%5EK%2C%20%5C%5C%0A%20%20%20%20V_2%20%26%3D%20%5Cvec%7Bx%7D_2%20W%5EV.%0A%20%20%20%20%5Cend%7Baligned%7D%0A%20%20%20%20%5C%5D%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(W_key%2C%20W_query%2C%20W_value%2C%20x_2)%3A%0A%20%20%20%20query_2%20%3D%20x_2%20%40%20W_query%20%20%23%202%E7%95%AA%E7%9B%AE%E3%81%AE%E5%85%A5%E5%8A%9B%E8%A6%81%E7%B4%A0%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%20_2%20%E3%81%A8%E4%BB%98%E3%81%91%E3%82%8B%0A%20%20%20%20key_2%20%3D%20x_2%20%40%20W_key%0A%20%20%20%20value_2%20%3D%20x_2%20%40%20W_value%0A%0A%20%20%20%20print(query_2)%0A%20%20%20%20return%20(query_2%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%99%E3%81%B9%E3%81%A6%E3%81%AE%E5%85%A5%E5%8A%9B%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E7%B7%9A%E5%BD%A2%E5%B0%84%E5%BD%B1%E3%81%AF%E6%AC%A1%E3%81%AE%E9%80%9A%E3%82%8A%E3%80%82%0A%0A%20%20%20%20%5C%5B%0A%20%20%20%20K%3DXW%5EK%2C%20V%3DXW%5EV.%0A%20%20%20%20%5C%5D%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(W_key%2C%20W_value%2C%20inputs)%3A%0A%20%20%20%20keys%20%3D%20inputs%20%40%20W_key%0A%20%20%20%20values%20%3D%20inputs%20%40%20W_value%0A%0A%20%20%20%20print(%22keys.shape%3A%22%2C%20keys.shape)%0A%20%20%20%20print(%22values.shape%3A%22%2C%20values.shape)%0A%20%20%20%20return%20keys%2C%20values%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%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B9%E3%82%B3%E3%82%A2%20%24%5Comega_%7B22%7D%5Cequiv%20Q_2%5Ccdot%20K_2%24%20%E3%81%AF%E6%AC%A1%E3%81%AE%E9%80%9A%E3%82%8A%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(keys%2C%20query_2)%3A%0A%20%20%20%20keys_2%20%3D%20keys%5B1%5D%20%20%23%20Python%20%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AF0%E5%A7%8B%E3%81%BE%E3%82%8A%0A%20%20%20%20attn_score_22%20%3D%20query_2.dot(keys_2)%0A%20%20%20%20print(attn_score_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%99%E3%81%B9%E3%81%A6%E3%81%AE%E3%82%AD%E3%83%BC%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%AF%20%24%5Comega_2%5Cequiv%20Q_2%20K%5E%5Cmathsf%7BT%7D%24%20%E3%81%A7%E8%A8%88%E7%AE%97%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_(keys%2C%20query_2)%3A%0A%20%20%20%20attn_scores_2%20%3D%20query_2%20%40%20keys.T%20%20%23%20%E4%B8%8E%E3%81%88%E3%82%89%E3%82%8C%E3%81%9F%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%AB%E5%AF%BE%E3%81%99%E3%82%8B%E5%85%A8%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B9%E3%82%B3%E3%82%A2%0A%20%20%20%20print(attn_scores_2)%0A%20%20%20%20return%20(attn_scores_2%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Scaled%20Dot-Product%20Attention%20%E3%81%AE%E6%96%B9%E5%BC%8F%E3%81%A7%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%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%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%AF%E3%80%81%E6%AC%A1%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E3%82%AD%E3%83%BC%E3%81%AE%E6%AC%A1%E5%85%83%E3%81%AE%E5%B9%B3%E6%96%B9%E6%A0%B9%E3%81%A7%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%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%5Calpha_2%0A%20%20%20%20%5Cequiv%5Coperatorname%7Bsoftmax%7D%5Cleft(%0A%20%20%20%20%5Cfrac%7B%5Comega_2%7D%7B%5Csqrt%7B%5Cmathrm%7Bdim%7D(K_i)%7D%7D%0A%20%20%20%20%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.cell%0Adef%20_(attn_scores_2%2C%20keys)%3A%0A%20%20%20%20d_k%20%3D%20keys.shape%5B1%5D%0A%20%20%20%20attn_weights_2%20%3D%20torch.softmax(attn_scores_2%20%2F%20d_k**0.5%2C%20dim%3D-1)%0A%20%20%20%20print(attn_weights_2)%0A%20%20%20%20return%20(attn_weights_2%2C)%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%E7%B5%82%E7%9A%84%E3%81%AB%E3%80%81%E5%AD%A6%E7%BF%92%E5%8F%AF%E8%83%BD%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%8C%E6%AC%A1%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E5%BE%97%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82%0A%0A%20%20%20%20%5C%5B%0A%20%20%20%20%5Cvec%7Bz%7D%5E%7B(2)%7D%0A%20%20%20%20%5Cequiv%5Coperatorname%7Bsoftmax%7D%5Cleft(%0A%20%20%20%20%5Cfrac%7BQ_2K%5E%5Cmathsf%7BT%7D%7D%7B%5Csqrt%7B%5Cmathrm%7Bdim%7D(K_i)%7D%7D%0A%20%20%20%20%5Cright)V.%0A%20%20%20%20%5C%5D%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(attn_weights_2%2C%20values)%3A%0A%20%20%20%20context_vec_2%20%3D%20attn_weights_2%20%40%20values%0A%20%20%20%20print(context_vec_2)%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%203.4.2%20%E3%82%B3%E3%83%B3%E3%83%91%E3%82%AF%E3%83%88%E3%81%AA%20SelfAttention%20%E3%82%AF%E3%83%A9%E3%82%B9%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.class_definition%0Aclass%20SelfAttention_v1(nn.Module)%3A%0A%20%20%20%20def%20__init__(self%2C%20d_in%2C%20d_out)%3A%0A%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20%23%20%E5%AD%A6%E7%BF%92%E5%8F%AF%E8%83%BD%E3%81%AA%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E3%83%A1%E3%83%B3%E3%83%90%E5%A4%89%E6%95%B0%E3%81%A8%E3%81%97%E3%81%A6%E4%BF%9D%E6%8C%81%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20self.W_query%20%3D%20nn.Parameter(torch.rand(d_in%2C%20d_out))%0A%20%20%20%20%20%20%20%20self.W_key%20%3D%20nn.Parameter(torch.rand(d_in%2C%20d_out))%0A%20%20%20%20%20%20%20%20self.W_value%20%3D%20nn.Parameter(torch.rand(d_in%2C%20d_out))%0A%0A%20%20%20%20def%20forward(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20keys%20%3D%20x%20%40%20self.W_key%0A%20%20%20%20%20%20%20%20queries%20%3D%20x%20%40%20self.W_query%0A%20%20%20%20%20%20%20%20values%20%3D%20x%20%40%20self.W_value%0A%0A%20%20%20%20%20%20%20%20attn_scores%20%3D%20queries%20%40%20keys.T%20%20%23%20omega%0A%20%20%20%20%20%20%20%20attn_weights%20%3D%20torch.softmax(attn_scores%20%2F%20keys.shape%5B-1%5D%20**%200.5%2C%20dim%3D-1)%0A%0A%20%20%20%20%20%20%20%20context_vec%20%3D%20attn_weights%20%40%20values%0A%20%20%20%20%20%20%20%20return%20context_vec%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%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E5%AD%A6%E7%BF%92%E5%8F%AF%E8%83%BD%E3%81%AA%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB%E3%81%8C%E8%A8%88%E7%AE%97%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82%E7%B5%90%E6%9E%9C%E3%81%AE2%E7%95%AA%E7%9B%AE%E3%81%AE%E3%82%B9%E3%83%A9%E3%82%A4%E3%82%B9%E3%81%AF%E5%89%8D%E7%AF%80%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%A8%E5%90%8C%E3%81%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_(d_in%2C%20d_out%2C%20inputs)%3A%0A%20%20%20%20torch.manual_seed(123)%0A%20%20%20%20sa_v1%20%3D%20SelfAttention_v1(d_in%2C%20d_out)%0A%20%20%20%20print(sa_v1(inputs))%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%60nn.Linear%60%20%E3%82%92%E4%BD%BF%E3%81%86%E3%81%A8%E3%80%81%5BKaiming%20%E4%B8%80%E6%A7%98%E5%88%9D%E6%9C%9F%E5%8C%96%5D(https%3A%2F%2Fdocs.pytorch.org%2Fdocs%2Fstable%2Fnn.init.html%23torch.nn.init.kaiming_uniform_)%E3%81%A8%E5%91%BC%E3%81%B0%E3%82%8C%E3%82%8B%E5%84%AA%E3%82%8C%E3%81%9F%E5%88%9D%E6%9C%9F%E5%8C%96%E6%89%8B%E6%B3%95%E3%81%AB%E3%82%88%E3%82%8A%E3%80%81%E3%82%AF%E3%83%A9%E3%82%B9%E5%AE%9A%E7%BE%A9%E3%81%8C%E3%82%88%E3%82%8A%E7%B0%A1%E6%BD%94%E3%81%8B%E3%81%A4%E5%AE%89%E5%AE%9A%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.class_definition%0Aclass%20SelfAttention_v2(nn.Module)%3A%0A%20%20%20%20def%20__init__(self%2C%20d_in%2C%20d_out%2C%20qkv_bias%3DFalse)%3A%0A%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20self.W_query%20%3D%20nn.Linear(d_in%2C%20d_out%2C%20bias%3Dqkv_bias)%0A%20%20%20%20%20%20%20%20self.W_key%20%3D%20nn.Linear(d_in%2C%20d_out%2C%20bias%3Dqkv_bias)%0A%20%20%20%20%20%20%20%20self.W_value%20%3D%20nn.Linear(d_in%2C%20d_out%2C%20bias%3Dqkv_bias)%0A%0A%20%20%20%20def%20forward(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20keys%20%3D%20self.W_key(x)%0A%20%20%20%20%20%20%20%20queries%20%3D%20self.W_query(x)%0A%20%20%20%20%20%20%20%20values%20%3D%20self.W_value(x)%0A%0A%20%20%20%20%20%20%20%20attn_scores%20%3D%20queries%20%40%20keys.T%0A%20%20%20%20%20%20%20%20attn_weights%20%3D%20torch.softmax(attn_scores%20%2F%20keys.shape%5B-1%5D%20**%200.5%2C%20dim%3D-1)%0A%0A%20%20%20%20%20%20%20%20context_vec%20%3D%20attn_weights%20%40%20values%0A%20%20%20%20%20%20%20%20return%20context_vec%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%E5%87%BA%E5%8A%9B%E3%81%AF%E3%80%81%E3%81%9D%E3%81%86%E3%81%97%E3%81%9F%E5%88%9D%E6%9C%9F%E5%8C%96%E6%89%8B%E6%B3%95%E3%81%AE%E3%81%9F%E3%82%81%E3%80%81%E4%BB%A5%E5%89%8D%E3%81%AE%E7%B5%90%E6%9E%9C%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_(d_in%2C%20d_out%2C%20inputs)%3A%0A%20%20%20%20torch.manual_seed(789)%0A%20%20%20%20sa_v2%20%3D%20SelfAttention_v2(d_in%2C%20d_out)%0A%20%20%20%20print(sa_v2(inputs))%0A%20%20%20%20return%20(sa_v2%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%203.5%20%E3%82%B3%E3%83%BC%E3%82%B6%E3%83%AB%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%A7%E6%9C%AA%E6%9D%A5%E3%81%AE%E5%8D%98%E8%AA%9E%E3%82%92%E9%9A%A0%E3%81%99%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%203.5.1%20%E3%82%B3%E3%83%BC%E3%82%B6%E3%83%AB%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%9E%E3%82%B9%E3%82%AF%E3%81%AE%E9%81%A9%E7%94%A8%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%E3%81%93%E3%82%8C%E3%81%BE%E3%81%A7%E3%81%A8%E5%90%8C%E6%A7%98%E3%81%AE%E5%88%9D%E6%9C%9F%E3%81%AE%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E9%87%8D%E3%81%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_(inputs%2C%20sa_v2)%3A%0A%20%20%20%20%23%20%E4%BE%BF%E5%AE%9C%E4%B8%8A%E3%80%81%E5%89%8D%E7%AF%80%E3%81%AE%20SelfAttention_v2%20%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%0A%20%20%20%20%23%20%E3%82%AF%E3%82%A8%E3%83%AA%E3%81%A8%E3%82%AD%E3%83%BC%E3%81%AE%E9%87%8D%E3%81%BF%E8%A1%8C%E5%88%97%E3%82%92%E5%86%8D%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%0A%20%20%20%20_queries%20%3D%20sa_v2.W_query(inputs)%0A%20%20%20%20_keys%20%3D%20sa_v2.W_key(inputs)%0A%20%20%20%20_attn_scores%20%3D%20_queries%20%40%20_keys.T%0A%0A%20%20%20%20attn_weights_sa_v2%20%3D%20torch.softmax(_attn_scores%20%2F%20_keys.shape%5B-1%5D%20**%200.5%2C%20dim%3D-1)%0A%20%20%20%20print(attn_weights_sa_v2)%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%82%B3%E3%83%BC%E3%82%B6%E3%83%AB%E3%81%AA%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E4%BA%88%E6%B8%AC%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E4%BF%9D%E8%A8%BC%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E5%8F%B3%E4%B8%8A%E9%83%A8%E5%88%86%E3%82%92%E3%83%9E%E3%82%B9%E3%82%AF%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20%E3%81%93%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA2%E5%80%A4%E3%83%9E%E3%82%B9%E3%82%AF%E3%81%AF%20%60torch.tril%60%20%E3%81%A7%E7%B0%A1%E5%8D%98%E3%81%AB%E4%BD%9C%E6%88%90%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_(attn_scores)%3A%0A%20%20%20%20_context_length%20%3D%20attn_scores.shape%5B0%5D%0A%20%20%20%20mask_simple%20%3D%20torch.tril(torch.ones(_context_length%2C%20_context_length))%0A%20%20%20%20print(mask_simple)%0A%20%20%20%20return%20(mask_simple%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%9E%E3%82%B9%E3%82%AD%E3%83%B3%E3%82%B0%E3%81%AF%E3%80%81%E3%81%93%E3%82%8C%E3%82%89%E3%81%AE%E5%8D%98%E7%B4%94%E3%81%AA%E7%A9%8D%20%24W_a%5Cmathbb%7B1%7D_%7Bi%5Cgeq%20j%7D%24%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_(attn_weights%2C%20mask_simple)%3A%0A%20%20%20%20masked_simple%20%3D%20attn_weights%20*%20mask_simple%0A%20%20%20%20print(masked_simple)%0A%20%20%20%20return%20(masked_simple%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E9%87%8D%E3%81%BF%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E3%81%86%E3%81%9F%E3%82%81%E3%80%81%E5%90%84%E8%A1%8C%E3%82%92%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%99%E3%82%8B%E3%80%82%E6%9C%AA%E6%9D%A5%E3%81%8B%E3%82%89%E3%81%AE%E6%83%85%E5%A0%B1%E6%BC%8F%E6%B4%A9%E3%82%92%E9%98%B2%E3%81%90%E3%81%9F%E3%82%81%E3%80%81%E6%AD%A3%E8%A6%8F%E5%8C%96%E3%81%AF%E3%83%9E%E3%82%B9%E3%82%AD%E3%83%B3%E3%82%B0%E3%81%AE%E5%BE%8C%E3%81%AB%E8%A1%8C%E3%81%86%E3%81%B9%E3%81%8D%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_(masked_simple)%3A%0A%20%20%20%20row_sums%20%3D%20masked_simple.sum(dim%3D-1%2C%20keepdim%3DTrue)%0A%20%20%20%20masked_simple_norm%20%3D%20masked_simple%20%2F%20row_sums%0A%20%20%20%20print(masked_simple_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%82%88%E3%82%8A%E5%8A%B9%E7%8E%87%E7%9A%84%E3%81%AB%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E3%81%93%E3%81%AE%E3%83%9E%E3%82%B9%E3%82%AD%E3%83%B3%E3%82%B0%E3%81%AF%E3%80%81Softmax%20%E3%82%92%E5%8F%96%E3%82%8B%E5%89%8D%E3%81%AB%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%AE%E5%8F%B3%E4%B8%8A%E9%83%A8%E5%88%86%E3%82%92%20%60-inf%60%20%E3%81%A7%E5%9F%8B%E3%82%81%E3%82%8B%E5%87%A6%E7%90%86%E3%81%AB%E7%BD%AE%E3%81%8D%E6%8F%9B%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_(attn_scores%2C%20context_length)%3A%0A%20%20%20%20mask%20%3D%20torch.triu(torch.ones(context_length%2C%20context_length)%2C%20diagonal%3D1)%0A%20%20%20%20masked%20%3D%20attn_scores.masked_fill(mask.bool()%2C%20-torch.inf)%0A%20%20%20%20print(masked)%0A%20%20%20%20return%20(masked%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%24%5Cexp(-%5Cinfty)%3D0%24%20%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%E3%83%9E%E3%82%B9%E3%82%AD%E3%83%B3%E3%82%B0%E3%81%A8%E5%90%8C%E3%81%98%E7%B5%90%E6%9E%9C%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_(keys%2C%20masked)%3A%0A%20%20%20%20causal_attn_weights%20%3D%20torch.softmax(masked%20%2F%20keys.shape%5B-1%5D%20**%200.5%2C%20dim%3D-1)%0A%20%20%20%20print(causal_attn_weights)%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%203.5.2%20%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%82%A2%E3%82%A6%E3%83%88%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E9%87%8D%E3%81%BF%E3%81%AE%E8%BF%BD%E5%8A%A0%E3%83%9E%E3%82%B9%E3%82%AD%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%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%B8%E3%81%AE%E9%81%8E%E5%AD%A6%E7%BF%92%E3%82%92%E9%98%B2%E3%81%90%E3%81%9F%E3%82%81%E3%80%81%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%82%A2%E3%82%A6%E3%83%88%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B%E3%80%82%E8%A6%81%E7%B4%A0%E3%81%AE50%25%E3%82%92%E8%90%BD%E3%81%A8%E3%81%97%E3%80%81%E5%85%A8%E4%BD%93%E3%81%AE%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%82%92%E4%BF%9D%E3%81%A4%E3%81%9F%E3%82%81%E6%AE%8B%E3%82%8A%E3%81%AE%E5%80%A4%E3%82%922%E5%80%8D%E3%81%AB%E3%81%99%E3%82%8B%E3%80%82%E3%81%93%E3%81%AE%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%82%A2%E3%82%A6%E3%83%88%E5%B1%A4%E3%81%AF%E5%AD%A6%E7%BF%92%E6%99%82%E3%81%AE%E3%81%BF%E9%81%A9%E7%94%A8%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_()%3A%0A%20%20%20%20torch.manual_seed(123)%0A%20%20%20%20dropout%20%3D%20torch.nn.Dropout(0.5)%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%8750%25%0A%20%20%20%20example%20%3D%20torch.ones(6%2C%206)%20%20%23%20%E8%A6%81%E7%B4%A0%E3%81%8C1%E3%81%AE%E8%A1%8C%E5%88%97%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%0A%0A%20%20%20%20print(dropout(example))%0A%20%20%20%20return%20(dropout%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%89%E3%83%AD%E3%83%83%E3%83%97%E3%82%A2%E3%82%A6%E3%83%88%E5%B1%A4%E3%81%AF%E3%80%81%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E9%87%8D%E3%81%BF%E3%82%92%E8%A8%88%E7%AE%97%E3%81%97%E3%81%9F%E5%BE%8C%E3%81%AB%E9%81%A9%E7%94%A8%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_(attn_weights%2C%20dropout)%3A%0A%20%20%20%20torch.manual_seed(123)%0A%20%20%20%20print(dropout(attn_weights))%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%203.5.3%20%E3%82%B3%E3%83%B3%E3%83%91%E3%82%AF%E3%83%88%E3%81%AA%E3%82%B3%E3%83%BC%E3%82%B6%E3%83%AB%E3%82%BB%E3%83%AB%E3%83%95%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%AF%E3%83%A9%E3%82%B9%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%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E5%B1%A4%E3%81%AB%E3%80%81%E3%82%B3%E3%83%BC%E3%82%B6%E3%83%AB%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%BB%E3%83%89%E3%83%AD%E3%83%83%E3%83%97%E3%82%A2%E3%82%A6%E3%83%88%E3%83%BB%E3%83%90%E3%83%83%E3%83%81%E6%8E%A8%E8%AB%96%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B%E3%80%82%E3%83%86%E3%82%B9%E3%83%88%E7%94%A8%E3%81%AE%E3%83%90%E3%83%83%E3%83%81%E5%85%A5%E5%8A%9B%E3%81%AF%E6%AC%A1%E3%81%AE%E9%80%9A%E3%82%8A%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(inputs)%3A%0A%20%20%20%20batch%20%3D%20torch.stack((inputs%2C%20inputs)%2C%20dim%3D0)%0A%20%20%20%20%23%20%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C6%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E6%8C%81%E3%81%A42%E5%85%A5%E5%8A%9B%E3%81%A7%E3%80%81%E5%90%84%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E6%AC%A1%E5%85%83%E3%81%AF3%0A%20%20%20%20print(batch.shape)%20%20%0A%20%20%20%20return%20(batch%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%E3%82%B3%E3%83%BC%E3%82%B6%E3%83%AB%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E5%B1%A4%E3%81%AE%E4%BE%8B%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%5B%60register_buffer%60%5D(https%3A%2F%2Fdocs.pytorch.org%2Fdocs%2Fstable%2Fgenerated%2Ftorch.nn.Module.html%23torch.nn.Module.register_buffer)%20%E3%81%AF%E3%80%81%E5%AE%9A%E6%95%B0%EF%BC%88%E5%AD%A6%E7%BF%92%E3%81%97%E3%81%AA%E3%81%84%EF%BC%89%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%97%E3%80%81%E9%81%A9%E5%88%87%E3%81%AA%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E4%B8%8A%E3%81%AB%E7%A2%BA%E4%BF%9D%E3%81%95%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E4%BF%9D%E8%A8%BC%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%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.class_definition%0Aclass%20CausalAttention(nn.Module)%3A%0A%20%20%20%20def%20__init__(self%2C%20d_in%2C%20d_out%2C%20context_length%2C%20dropout%2C%20qkv_bias%3DFalse)%3A%0A%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20self.d_out%20%3D%20d_out%0A%20%20%20%20%20%20%20%20self.W_query%20%3D%20nn.Linear(d_in%2C%20d_out%2C%20bias%3Dqkv_bias)%0A%20%20%20%20%20%20%20%20self.W_key%20%3D%20nn.Linear(d_in%2C%20d_out%2C%20bias%3Dqkv_bias)%0A%20%20%20%20%20%20%20%20self.W_value%20%3D%20nn.Linear(d_in%2C%20d_out%2C%20bias%3Dqkv_bias)%0A%0A%20%20%20%20%20%20%20%20%23%20%E6%96%B0%E8%A6%8F%0A%20%20%20%20%20%20%20%20self.dropout%20%3D%20nn.Dropout(dropout)%0A%20%20%20%20%20%20%20%20%23%20%E6%96%B0%E8%A6%8F%3A%20%E5%BE%8C%E3%81%A7%E3%82%B9%E3%83%A9%E3%82%A4%E3%82%B9%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E6%9C%80%E5%A4%A7%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AE%E3%83%9E%E3%82%B9%E3%82%AF%E3%82%92%E7%A2%BA%E4%BF%9D%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20self.register_buffer(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22mask%22%2C%20torch.triu(torch.ones(context_length%2C%20context_length)%2C%20diagonal%3D1)%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%20b%2C%20num_tokens%2C%20d_in%20%3D%20x.shape%20%20%23%20%E6%96%B0%E3%81%97%E3%81%84%E3%83%90%E3%83%83%E3%83%81%E6%AC%A1%E5%85%83%20b%0A%0A%20%20%20%20%20%20%20%20%23%20%60num_tokens%60%20%E3%81%8C%20%60context_length%60%20%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E5%85%A5%E5%8A%9B%E3%81%A7%E3%81%AF%E3%80%81%E4%B8%8B%E3%81%AE%E3%83%9E%E3%82%B9%E3%82%AF%E7%94%9F%E6%88%90%E3%81%A7%0A%20%20%20%20%20%20%20%20%23%20%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%20%20%23%20%E5%AE%9F%E9%9A%9B%E3%81%AB%E3%81%AF%E3%80%81LLM%EF%BC%88%E7%AC%AC4%E3%80%9C7%E7%AB%A0%EF%BC%89%E3%81%8C%E3%81%93%E3%81%AE%20forward%20%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AB%E5%88%B0%E9%81%94%E3%81%99%E3%82%8B%E5%89%8D%E3%81%AB%E5%85%A5%E5%8A%9B%E3%81%8C%0A%20%20%20%20%20%20%20%20%23%20%60context_length%60%20%E3%82%92%E8%B6%85%E3%81%88%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E4%BF%9D%E8%A8%BC%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E5%95%8F%E9%A1%8C%E3%81%AB%E3%81%AF%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84%E3%80%82%0A%20%20%20%20%20%20%20%20keys%20%3D%20self.W_key(x)%20%20%20%20%23%20(B%2CN%2Cd_out)%0A%20%20%20%20%20%20%20%20queries%20%3D%20self.W_query(x)%20%20%20%23%20(B%2CN%2Cd_out)%0A%20%20%20%20%20%20%20%20values%20%3D%20self.W_value(x)%20%20%20%20%23%20(B%2CN%2Cd_out)%0A%0A%20%20%20%20%20%20%20%20%23%20%E8%BB%A2%E7%BD%AE%E3%82%92%E5%A4%89%E6%9B%B4%3A%20(B%2CN%2Cd_out)%20-%3E%20(B%2Cd_out%2CN)%0A%20%20%20%20%20%20%20%20attn_scores%20%3D%20queries%20%40%20keys.transpose(1%2C%202)%20%20%20%20%23%20(B%2CN%2CN)%0A%20%20%20%20%20%20%20%20%23%20%E6%96%B0%E8%A6%8F%E3%80%81%E6%9C%AB%E5%B0%BE%E3%81%8C%20_%20%E3%81%AE%E6%BC%94%E7%AE%97%E3%81%AF%E3%82%A4%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%82%B9%0A%20%20%20%20%20%20%20%20%23%20%60%3Anum_tokens%60%20%E3%81%AF%E3%80%81%E3%83%90%E3%83%83%E3%83%81%E5%86%85%E3%81%AE%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E6%95%B0%E3%81%8C%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%20context_size%20%E3%82%88%E3%82%8A%E5%B0%8F%E3%81%95%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%0A%20%20%20%20%20%20%20%20attn_scores.masked_fill_(%20%20%0A%20%20%20%20%20%20%20%20%20%20%20%20self.mask.bool()%5B%3Anum_tokens%2C%20%3Anum_tokens%5D%2C%20-torch.inf%0A%20%20%20%20%20%20%20%20)%20%20%0A%20%20%20%20%20%20%20%20%23%20%E6%AD%A3%E8%A6%8F%E5%8C%96%0A%20%20%20%20%20%20%20%20attn_weights%20%3D%20torch.softmax(attn_scores%20%2F%20keys.shape%5B-1%5D%20**%200.5%2C%20dim%3D-1)%0A%20%20%20%20%20%20%20%20attn_weights%20%3D%20self.dropout(attn_weights)%20%20%23%20%E6%96%B0%E8%A6%8F%0A%0A%20%20%20%20%20%20%20%20context_vec%20%3D%20attn_weights%20%40%20values%20%23%20(B%2CN%2Cd_out)%0A%20%20%20%20%20%20%20%20return%20context_vec%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%E9%A0%86%E4%BC%9D%E6%92%AD%E3%82%92%E4%BD%BF%E3%81%86%E4%BE%8B%E3%81%A7%E3%81%82%E3%82%8B%E3%80%82%E5%85%A5%E5%8A%9B%E3%81%A8%E5%87%BA%E5%8A%9B%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_(batch%2C%20d_in%2C%20d_out)%3A%0A%20%20%20%20torch.manual_seed(123)%0A%0A%20%20%20%20%23%20%60batch%60%20%E3%81%AF%20(B%2CN%2CC)%20%E3%81%AE%E5%BD%A2%E7%8A%B6%E3%82%92%E6%8C%81%E3%81%A4%0A%20%20%20%20_context_length%20%3D%20batch.shape%5B1%5D%0A%20%20%20%20ca%20%3D%20CausalAttention(d_in%2C%20d_out%2C%20_context_length%2C%200.0)%0A%0A%20%20%20%20_context_vecs%20%3D%20ca(batch)%0A%0A%20%20%20%20print(_context_vecs)%0A%0A%20%20%20%20print(f%22%7Bbatch.shape%3D%7D%22)%0A%20%20%20%20print(f%22%7B_context_vecs.shape%3D%7D%22)%0A%20%20%20%20print(f%22%7Bd_in%3D%7D%2C%20%7Bd_out%3D%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%203.6%20%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%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%E3%82%92%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%E3%81%B8%E6%8B%A1%E5%BC%B5%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%23%203.6.1%20%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%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%E5%B1%A4%E3%82%92%E7%A9%8D%E3%81%BF%E9%87%8D%E3%81%AD%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%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E5%B1%A4%E3%82%92%E3%83%9E%E3%83%AB%E3%83%81%E3%83%98%E3%83%83%E3%83%89%E3%81%B8%E6%8B%A1%E5%BC%B5%E3%81%99%E3%82%8B%E3%80%82%E3%81%93%E3%82%8C%E3%81%AF%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%83%98%E3%83%83%E3%83%89%E3%81%8B%E3%82%89%E3%81%AE%E7%B4%A0%E6%9C%B4%E3%81%AA%E6%8B%A1%E5%BC%B5%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%20MultiHeadAttentionWrapper(nn.Module)%3A%0A%20%20%20%20def%20__init__(self%2C%20d_in%2C%20d_out%2C%20context_length%2C%20dropout%2C%20num_heads%2C%20qkv_bias%3DFalse)%3A%0A%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20self.heads%20%3D%20nn.ModuleList(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20CausalAttention(d_in%2C%20d_out%2C%20context_length%2C%20dropout%2C%20qkv_bias)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20_%20in%20range(num_heads)%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%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%20%23%20%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%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%E3%82%92%E9%81%A9%E7%94%A8%E3%81%97%E3%80%81%E3%81%9D%E3%82%8C%E3%82%89%E3%81%AE%E5%87%BA%E5%8A%9B%E3%82%92%E9%80%A3%E7%B5%90%E3%81%99%E3%82%8B%E3%81%A0%E3%81%91%0A%20%20%20%20%20%20%20%20return%20torch.cat(%5Bhead(x)%20for%20head%20in%20self.heads%5D%2C%20dim%3D-1)%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%E5%BD%A2%E7%8A%B6%E3%81%AF%20%24(B%2CN%2Cd_%7Bout%7D%5Ctimes2)%24%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_(batch)%3A%0A%20%20%20%20torch.manual_seed(123)%0A%0A%20%20%20%20_context_length%20%3D%20batch.shape%5B1%5D%20%20%23%20%E3%81%93%E3%82%8C%E3%81%AF%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E6%95%B0%0A%20%20%20%20_d_in%2C%20_d_out%20%3D%203%2C%202%0A%20%20%20%20_mha%20%3D%20MultiHeadAttentionWrapper(_d_in%2C%20_d_out%2C%20_context_length%2C%200.0%2C%20num_heads%3D2)%0A%0A%20%20%20%20_context_vecs%20%3D%20_mha(batch)%0A%20%20%20%20print(_context_vecs)%0A%20%20%20%20print(f%22%7Bbatch.shape%3D%7D%22)%0A%20%20%20%20print(f%22%7B_context_vecs.shape%3D%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%203.6.2%20%E9%87%8D%E3%81%BF%E3%81%AE%E5%88%86%E5%89%B2%E3%81%AB%E3%82%88%E3%82%8B%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%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%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%E5%B1%A4%E3%82%92%E8%87%AA%E5%B7%B1%E5%AE%8C%E7%B5%90%E3%81%97%E3%81%9F%E5%BD%A2%E3%81%A7%E7%B0%A1%E6%BD%94%E3%81%AB%E3%81%97%E3%80%81%E8%A1%8C%E5%88%97%E7%A9%8D%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E9%81%BF%E3%81%91%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%20MultiHeadAttention(nn.Module)%3A%0A%20%20%20%20def%20__init__(self%2C%20d_in%2C%20d_out%2C%20context_length%2C%20dropout%2C%20num_heads%2C%20qkv_bias%3DFalse)%3A%0A%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20assert%20d_out%20%25%20num_heads%20%3D%3D%200%2C%20%22d_out%20must%20be%20divisible%20by%20num_heads%22%0A%0A%20%20%20%20%20%20%20%20self.d_out%20%3D%20d_out%0A%20%20%20%20%20%20%20%20self.num_heads%20%3D%20num_heads%0A%20%20%20%20%20%20%20%20self.head_dim%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20d_out%20%2F%2F%20num_heads%0A%20%20%20%20%20%20%20%20)%20%20%23%20%E7%9B%AE%E7%9A%84%E3%81%AE%E5%87%BA%E5%8A%9B%E6%AC%A1%E5%85%83%E3%81%AB%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%E5%B0%84%E5%BD%B1%E6%AC%A1%E5%85%83%E3%82%92%E6%B8%9B%E3%82%89%E3%81%99%0A%0A%20%20%20%20%20%20%20%20self.W_query%20%3D%20nn.Linear(d_in%2C%20d_out%2C%20bias%3Dqkv_bias)%0A%20%20%20%20%20%20%20%20self.W_key%20%3D%20nn.Linear(d_in%2C%20d_out%2C%20bias%3Dqkv_bias)%0A%20%20%20%20%20%20%20%20self.W_value%20%3D%20nn.Linear(d_in%2C%20d_out%2C%20bias%3Dqkv_bias)%0A%20%20%20%20%20%20%20%20self.out_proj%20%3D%20nn.Linear(d_out%2C%20d_out)%20%20%23%20%E5%90%84%E3%83%98%E3%83%83%E3%83%89%E3%81%AE%E5%87%BA%E5%8A%9B%E3%82%92%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B%E7%B7%9A%E5%BD%A2%E5%B1%A4%0A%20%20%20%20%20%20%20%20self.dropout%20%3D%20nn.Dropout(dropout)%0A%20%20%20%20%20%20%20%20%23%20%E5%AE%9A%E6%95%B0%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%0A%20%20%20%20%20%20%20%20self.register_buffer(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22mask%22%2C%20torch.triu(torch.ones(context_length%2C%20context_length)%2C%20diagonal%3D1)%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%20b%2C%20num_tokens%2C%20d_in%20%3D%20x.shape%0A%20%20%20%20%20%20%20%20%23%20%60CausalAttention%60%20%E3%81%A8%E5%90%8C%E6%A7%98%E3%81%AB%E3%80%81%60num_tokens%60%20%E3%81%8C%20%60context_length%60%20%E3%82%92%E8%B6%85%E3%81%88%E3%82%8B%E5%85%A5%E5%8A%9B%E3%81%A7%E3%81%AF%E3%80%81%0A%20%20%20%20%20%20%20%20%23%20%E4%B8%8B%E3%81%AE%E3%83%9E%E3%82%B9%E3%82%AF%E7%94%9F%E6%88%90%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B%E3%80%82%0A%20%20%20%20%20%20%20%20%23%20%E5%AE%9F%E9%9A%9B%E3%81%AB%E3%81%AF%E3%80%81LLM%EF%BC%88%E7%AC%AC4%E3%80%9C7%E7%AB%A0%EF%BC%89%E3%81%8C%E3%81%93%E3%81%AE%20forward%20%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AB%E5%88%B0%E9%81%94%E3%81%99%E3%82%8B%E5%89%8D%E3%81%AB%E5%85%A5%E5%8A%9B%E3%81%8C%0A%20%20%20%20%20%20%20%20%23%20%60context_length%60%20%E3%82%92%E8%B6%85%E3%81%88%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E4%BF%9D%E8%A8%BC%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E5%95%8F%E9%A1%8C%E3%81%AB%E3%81%AF%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84%E3%80%82%0A%0A%20%20%20%20%20%20%20%20keys%20%3D%20self.W_key(x)%20%20%23%20Shape%3A%20(b%2C%20num_tokens%2C%20d_out)%0A%20%20%20%20%20%20%20%20queries%20%3D%20self.W_query(x)%0A%20%20%20%20%20%20%20%20values%20%3D%20self.W_value(x)%0A%0A%20%20%20%20%20%20%20%20%23%20%60num_heads%60%20%E3%81%AE%E6%AC%A1%E5%85%83%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%A7%E3%80%81%E6%9A%97%E9%BB%99%E7%9A%84%E3%81%AB%E8%A1%8C%E5%88%97%E3%82%92%E5%88%86%E5%89%B2%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20%23%20%E6%9C%80%E5%BE%8C%E3%81%AE%E6%AC%A1%E5%85%83%E3%82%92%E5%B1%95%E9%96%8B%3A%20(b%2C%20num_tokens%2C%20d_out)%20-%3E%20(b%2C%20num_tokens%2C%20num_heads%2C%20head_dim)%0A%20%20%20%20%20%20%20%20%23%20%E3%81%A4%E3%81%BE%E3%82%8A%20d_out%20%3D%20num_heads%20*%20head_dim%EF%BC%88%E3%81%93%E3%81%AE%E3%82%B3%E3%83%B3%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%82%BF%E3%82%92%E5%8F%82%E7%85%A7%EF%BC%89%0A%20%20%20%20%20%20%20%20keys%20%3D%20keys.view(b%2C%20num_tokens%2C%20self.num_heads%2C%20self.head_dim)%0A%20%20%20%20%20%20%20%20values%20%3D%20values.view(b%2C%20num_tokens%2C%20self.num_heads%2C%20self.head_dim)%0A%20%20%20%20%20%20%20%20queries%20%3D%20queries.view(b%2C%20num_tokens%2C%20self.num_heads%2C%20self.head_dim)%0A%0A%20%20%20%20%20%20%20%20%23%20%E8%BB%A2%E7%BD%AE%3A%20(b%2C%20num_tokens%2C%20num_heads%2C%20head_dim)%20-%3E%20(b%2C%20num_heads%2C%20num_tokens%2C%20head_dim)%0A%20%20%20%20%20%20%20%20keys%20%3D%20keys.transpose(1%2C%202)%0A%20%20%20%20%20%20%20%20queries%20%3D%20queries.transpose(1%2C%202)%0A%20%20%20%20%20%20%20%20values%20%3D%20values.transpose(1%2C%202)%0A%0A%20%20%20%20%20%20%20%20%23%20%E3%82%B3%E3%83%BC%E3%82%B6%E3%83%AB%E3%83%9E%E3%82%B9%E3%82%AF%E4%BB%98%E3%81%8D%E3%81%AE%20Scaled%20Dot-Product%20Attention%EF%BC%88%E3%81%99%E3%81%AA%E3%82%8F%E3%81%A1%E3%82%BB%E3%83%AB%E3%83%95%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%89%E3%82%92%E8%A8%88%E7%AE%97%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20%23%20%E5%BD%A2%E7%8A%B6%3A%20(b%2C%20num_heads%2C%20num_tokens%2C%20num_tokens)%0A%20%20%20%20%20%20%20%20attn_scores%20%3D%20queries%20%40%20keys.transpose(2%2C%203)%20%20%23%20%E5%90%84%E3%83%98%E3%83%83%E3%83%89%E3%81%94%E3%81%A8%E3%81%AE%E5%86%85%E7%A9%8D%0A%0A%20%20%20%20%20%20%20%20%23%20%E5%85%83%E3%81%AE%E3%83%9E%E3%82%B9%E3%82%AF%E3%82%92%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E6%95%B0%E3%81%AB%E5%88%87%E3%82%8A%E8%A9%B0%E3%82%81%E3%80%81%E7%9C%9F%E5%81%BD%E5%80%A4%E3%81%B8%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%0A%20%20%20%20%20%20%20%20mask_bool%20%3D%20self.mask.bool()%5B%3Anum_tokens%2C%20%3Anum_tokens%5D%0A%0A%20%20%20%20%20%20%20%20%23%20%E3%83%9E%E3%82%B9%E3%82%AF%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%A2%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B9%E3%82%B3%E3%82%A2%E3%82%92%E5%9F%8B%E3%82%81%E3%82%8B%0A%20%20%20%20%20%20%20%20attn_scores.masked_fill_(mask_bool%2C%20-torch.inf)%0A%0A%20%20%20%20%20%20%20%20attn_weights%20%3D%20torch.softmax(attn_scores%20%2F%20keys.shape%5B-1%5D%20**%200.5%2C%20dim%3D-1)%0A%20%20%20%20%20%20%20%20attn_weights%20%3D%20self.dropout(attn_weights)%0A%0A%20%20%20%20%20%20%20%20%23%20%E5%BD%A2%E7%8A%B6%3A%20(b%2C%20num_tokens%2C%20num_heads%2C%20head_dim)%0A%20%20%20%20%20%20%20%20context_vec%20%3D%20(attn_weights%20%40%20values).transpose(1%2C%202)%0A%0A%20%20%20%20%20%20%20%20%23%20%E5%90%84%E3%83%98%E3%83%83%E3%83%89%E3%82%92%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B%EF%BC%88self.d_out%20%3D%20self.num_heads%20*%20self.head_dim%EF%BC%89%0A%20%20%20%20%20%20%20%20context_vec%20%3D%20context_vec.contiguous().view(b%2C%20num_tokens%2C%20self.d_out)%0A%20%20%20%20%20%20%20%20context_vec%20%3D%20self.out_proj(context_vec)%20%20%23%20%E4%BB%BB%E6%84%8F%E3%81%AE%E5%B0%84%E5%BD%B1%0A%0A%20%20%20%20%20%20%20%20return%20context_vec%0A%0A%0A%40app.cell%0Adef%20_(batch)%3A%0A%20%20%20%20torch.manual_seed(123)%0A%0A%20%20%20%20batch_size%2C%20context_length%2C%20_d_in%20%3D%20batch.shape%0A%20%20%20%20_d_out%20%3D%202%0A%20%20%20%20mha%20%3D%20MultiHeadAttention(_d_in%2C%20_d_out%2C%20context_length%2C%200.0%2C%20num_heads%3D2)%0A%0A%20%20%20%20context_vecs%20%3D%20mha(batch)%0A%0A%20%20%20%20print(context_vecs)%0A%20%20%20%20print(%22context_vecs.shape%3A%22%2C%20context_vecs.shape)%0A%20%20%20%20return%20(context_length%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20%23%20(b%2C%20num_heads%2C%20num_tokens%2C%20head_dim)%20%3D%20(1%2C%202%2C%203%2C%204)%0A%20%20%20%20a%20%3D%20torch.tensor(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B0.2745%2C%200.6584%2C%200.2775%2C%200.8573%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B0.8993%2C%200.0390%2C%200.9268%2C%200.7388%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B0.7179%2C%200.7058%2C%200.9156%2C%200.4340%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B0.0772%2C%200.3565%2C%200.1479%2C%200.5331%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B0.4066%2C%200.2318%2C%200.4545%2C%200.9737%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5B0.4606%2C%200.5159%2C%200.4220%2C%200.5786%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%0A%20%20%20%20print(a%20%40%20a.transpose(2%2C%203))%0A%20%20%20%20return%20(a%2C)%0A%0A%0A%40app.cell%0Adef%20_(a)%3A%0A%20%20%20%20_first_head%20%3D%20a%5B0%2C%200%2C%20%3A%2C%20%3A%5D%0A%20%20%20%20first_res%20%3D%20_first_head%20%40%20_first_head.T%0A%20%20%20%20print(%22First%20head%3A%5Cn%22%2C%20first_res)%0A%0A%20%20%20%20_second_head%20%3D%20a%5B0%2C%201%2C%20%3A%2C%20%3A%5D%0A%20%20%20%20_second_res%20%3D%20_second_head%20%40%20_second_head.T%0A%20%20%20%20print(%22%5CnSecond%20head%3A%5Cn%22%2C%20_second_res)%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
d2ad3181b52841173d63895f31a64588