import%20marimo%0A%0A__generated_with%20%3D%20%220.24.0%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0Awith%20app.setup%3A%0A%20%20%20%20import%20base64%0A%20%20%20%20import%20io%0A%20%20%20%20import%20math%0A%20%20%20%20import%20time%0A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20import%20pandas%20as%20pd%0A%20%20%20%20import%20torch%0A%20%20%20%20import%20torch.nn%20as%20nn%0A%20%20%20%20import%20torch.nn.functional%20as%20F%0A%20%20%20%20from%20PIL%20import%20Image%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20MNIST%20%E3%81%A7%E6%8B%A1%E6%95%A3%E3%83%A2%E3%83%87%E3%83%AB%0A%0A%20%20%20%20%E6%8B%A1%E6%95%A3%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AF%E3%80%81%E7%94%BB%E5%83%8F%E3%81%B8%E5%B0%91%E3%81%97%E3%81%9A%E3%81%A4%E3%83%8E%E3%82%A4%E3%82%BA%E3%82%92%E5%8A%A0%E3%81%88%E3%82%8B%20**forward%20process**%20%E3%81%A8%E3%80%81%E3%81%9D%E3%81%AE%E9%80%86%E3%82%92%E3%81%9F%E3%81%A9%E3%81%A3%E3%81%A6%0A%20%20%20%20%E3%83%8E%E3%82%A4%E3%82%BA%E3%81%8B%E3%82%89%E7%94%BB%E5%83%8F%E3%82%92%E4%BD%9C%E3%82%8B%20**reverse%20process**%20%E3%81%AE%E7%B5%84%E3%81%A7%E5%AE%9A%E7%BE%A9%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%81%AE%20notebook%20%E3%81%A7%E3%81%AF%0A%20%20%20%20%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E6%8B%A1%E6%95%A3%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%20MNIST%20%E3%81%A7%E5%AD%A6%E7%BF%92%E3%81%97%E3%80%81%E3%83%A9%E3%83%99%E3%83%AB%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E6%95%B0%E5%AD%97%E3%82%92%E7%94%9F%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E5%BC%8F%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%A8%E8%AD%B0%E8%AB%96%E3%81%AE%E9%A0%86%E5%BA%8F%E3%81%AF%E3%80%81Calvin%20Luo%2C%20*Understanding%20Diffusion%20Models%3A%20A%20Unified%0A%20%20%20%20Perspective*%EF%BC%88%5BarXiv%3A2208.11970%5D(https%3A%2F%2Farxiv.org%2Fabs%2F2208.11970)%EF%BC%89%E3%81%AB%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E5%90%8C%E8%AB%96%E6%96%87%E3%81%AF%E6%8B%A1%E6%95%A3%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%20**Variational%20Diffusion%20Model%EF%BC%88VDM%EF%BC%89**%E3%80%81%E3%81%99%E3%81%AA%E3%82%8F%E3%81%A1%E5%90%84%E6%BD%9C%E5%9C%A8%E5%A4%89%E6%95%B0%E3%81%8C%0A%20%20%20%20%E5%85%A5%E5%8A%9B%E3%81%A8%E5%90%8C%E3%81%98%E6%AC%A1%E5%85%83%E3%82%92%E6%8C%81%E3%81%A1%E3%80%81%E9%81%B7%E7%A7%BB%E3%81%8C%E7%B7%9A%E5%BD%A2%E3%82%AC%E3%82%A6%E3%82%B9%E3%81%AB%E5%9B%BA%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F%E9%9A%8E%E5%B1%A4%20VAE%20%E3%81%A8%E3%81%97%E3%81%A6%E5%AE%9A%E5%BC%8F%E5%8C%96%E3%81%97%E3%80%81%0A%20%20%20%20ELBO%20%E3%81%AE%E5%88%86%E8%A7%A3%E3%80%81%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%8C%E4%BA%88%E6%B8%AC%E3%81%97%E3%81%86%E3%82%8B3%E3%81%A4%E3%81%AE%E7%AD%89%E4%BE%A1%E3%81%AA%E5%AF%BE%E8%B1%A1%E3%80%81guidance%20%E3%81%BE%E3%81%A7%E3%82%92%E4%B8%80%E6%9C%AC%E3%81%AE%E7%AD%8B%E3%81%A7%E5%B0%8E%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E4%BB%A5%E4%B8%8B%E3%81%A7%E3%81%AF%E3%81%9D%E3%81%AE%E6%B5%81%E3%82%8C%E3%81%AB%E6%B2%BF%E3%81%A3%E3%81%A6%E3%80%81Variational%20Diffusion%20Model%E3%80%81Three%20Equivalent%0A%20%20%20%20Interpretations%E3%80%81Guidance%20%E3%81%AE%E9%A0%86%E3%81%AB%E5%AE%9F%E8%A3%85%E3%81%A8%E5%AF%BE%E5%BF%9C%E3%81%95%E3%81%9B%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E7%94%9F%E6%88%90%E5%93%81%E8%B3%AA%E3%81%AF%E8%A6%8B%E3%81%9F%E7%9B%AE%E3%81%AE%E5%8D%B0%E8%B1%A1%E3%81%AB%E9%A0%BC%E3%82%89%E3%81%9A%E3%80%81%E5%88%A5%E9%80%94%E5%AD%A6%E7%BF%92%E3%81%97%E3%81%9F%20MNIST%20%E5%88%86%E9%A1%9E%E5%99%A8%E3%81%A7%0A%20%20%20%20%E3%80%8C%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E3%83%A9%E3%83%99%E3%83%AB%E9%80%9A%E3%82%8A%E3%81%AE%E6%95%B0%E5%AD%97%E3%81%8C%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%81%9F%E3%81%8B%E3%80%8D%E3%82%92%E6%B8%AC%E3%81%A3%E3%81%A6%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E5%85%B1%E9%80%9A%E9%83%A8%E5%93%81%E3%81%A8%E5%86%8D%E7%8F%BE%E6%80%A7%0A%0A%20%20%20%20%E5%86%92%E9%A0%AD%E3%81%AE%20%60with%20app.setup%60%20%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%A7%E3%80%81notebook%20%E5%85%A8%E4%BD%93%E3%81%8B%E3%82%89%E4%BD%BF%E3%81%86%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%93%E3%81%A7%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20marimo%E3%80%81Matplotlib%E3%80%81NumPy%E3%80%81pandas%E3%80%81PyTorch%20%E3%81%AB%E5%8A%A0%E3%81%88%E3%80%81%E7%94%9F%E6%88%90%E9%81%8E%E7%A8%8B%E3%82%92%20GIF%20%E3%81%AB%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%0A%20%20%20%20%60base64%60%E3%80%81%60io%60%E3%80%81Pillow%20%E3%81%AE%20%60Image%60%E3%80%81%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%81%AE%E8%A8%88%E7%AE%97%E3%81%AB%E4%BD%BF%E3%81%86%20%60math%60%E3%80%81%0A%20%20%20%20%E5%AD%A6%E7%BF%92%E6%99%82%E9%96%93%E3%81%AE%E8%A8%88%E6%B8%AC%E3%81%AB%E4%BD%BF%E3%81%86%20%60time%60%20%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%93%E3%81%A7%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E3%81%AF%E4%B9%B1%E6%95%B0%20seed%20%E3%82%92%2042%20%E3%81%AB%E5%9B%BA%E5%AE%9A%E3%81%97%E3%80%81CUDA%E3%80%81MPS%E3%80%81CPU%20%E3%81%AE%E9%A0%86%E3%81%AB%E5%88%A9%E7%94%A8%E5%8F%AF%E8%83%BD%E3%81%AA%20device%20%E3%82%92%E9%81%B8%E3%81%B3%E3%81%BE%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_()%3A%0A%20%20%20%20seed%20%3D%2042%0A%20%20%20%20np.random.seed(seed)%0A%20%20%20%20torch.manual_seed(seed)%0A%20%20%20%20if%20torch.cuda.is_available()%3A%0A%20%20%20%20%20%20%20%20torch.cuda.manual_seed_all(seed)%0A%20%20%20%20%20%20%20%20device%20%3D%20torch.device(%22cuda%22)%0A%20%20%20%20elif%20getattr(torch.backends%2C%20%22mps%22%2C%20None)%20is%20not%20None%20and%20torch.backends.mps.is_available()%3A%0A%20%20%20%20%20%20%20%20device%20%3D%20torch.device(%22mps%22)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20device%20%3D%20torch.device(%22cpu%22)%0A%20%20%20%20print(f%22selected%20device%3A%20%7Bdevice%7D%22)%0A%20%20%20%20pd.DataFrame(%7B%22item%22%3A%20%5B%22torch%22%2C%20%22device%22%2C%20%22seed%22%5D%2C%20%22value%22%3A%20%5Btorch.__version__%2C%20str(device)%2C%20seed%5D%7D)%0A%20%20%20%20return%20(device%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%83%87%E3%83%BC%E3%82%BF%0A%0A%20%20%20%20torchvision%20%E3%81%AE%20MNIST%20%E3%82%92%2028%C3%9728%20%E3%81%AE%20tensor%20%E3%81%A8%E3%81%97%E3%81%A6%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%80%81%60x%20*%202%20-%201%60%20%E3%81%A7%E7%94%BB%E7%B4%A0%E5%80%A4%E3%82%92%0A%20%20%20%20%24%5B-1%2C%201%5D%24%20%E3%81%B8%E5%A4%89%E6%8F%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%820%E3%82%92%E4%B8%AD%E5%BF%83%E3%81%AB%E5%AF%BE%E7%A7%B0%E3%81%AA%E5%80%A4%E5%9F%9F%E3%81%B8%E6%8F%83%E3%81%88%E3%82%8B%E5%89%8D%E5%87%A6%E7%90%86%E3%81%A7%E3%80%81%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%AE%E5%85%A5%E5%8A%9B%E3%81%A8%0A%20%20%20%20%E5%87%BA%E5%8A%9B%E3%81%AE%E5%B0%BA%E5%BA%A6%E3%81%8C%E5%81%8F%E3%82%89%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E6%95%B0%E5%AD%97%E3%81%AE%E5%BD%A2%E3%81%A8%E6%9B%B8%E3%81%8D%E7%99%96%E3%82%92%E5%8D%81%E5%88%86%E3%81%AB%E5%AD%A6%E7%BF%92%E3%81%95%E3%81%9B%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E5%AD%A6%E7%BF%92%E7%94%A860%2C000%E4%BB%B6%E3%82%92%E3%81%99%E3%81%B9%E3%81%A6%E4%BD%BF%E3%81%84%E3%80%81batch%20size%20%E3%81%AF256%E3%81%A7%E3%81%99%E3%80%82%0A%20%20%20%20%E5%BE%8C%E5%8D%8A%E3%81%AE%E5%93%81%E8%B3%AA%E8%A9%95%E4%BE%A1%E3%81%A7%E3%81%AF%E3%80%81%E5%AD%A6%E7%BF%92%E3%81%AB%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E8%A9%95%E4%BE%A1%E7%94%A810%2C000%E4%BB%B6%E3%81%A7%E5%88%86%E9%A1%9E%E5%99%A8%E3%81%AE%E6%AD%A3%E8%A7%A3%E7%8E%87%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%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_()%3A%0A%20%20%20%20from%20torch.utils.data%20import%20DataLoader%0A%20%20%20%20from%20torchvision%20import%20datasets%2C%20transforms%0A%0A%20%20%20%20transform%20%3D%20transforms.Compose(%5Btransforms.ToTensor()%2C%20transforms.Lambda(lambda%20x%3A%20x%20*%202.0%20-%201.0)%5D)%0A%20%20%20%20train_dataset%20%3D%20datasets.MNIST(%22.%2Fdata%22%2C%20train%3DTrue%2C%20download%3DTrue%2C%20transform%3Dtransform)%0A%20%20%20%20test_dataset%20%3D%20datasets.MNIST(%22.%2Fdata%22%2C%20train%3DFalse%2C%20download%3DTrue%2C%20transform%3Dtransform)%0A%20%20%20%20train_loader%20%3D%20DataLoader(train_dataset%2C%20batch_size%3D256%2C%20shuffle%3DTrue%2C%20num_workers%3D0)%0A%20%20%20%20test_loader%20%3D%20DataLoader(test_dataset%2C%20batch_size%3D512%2C%20shuffle%3DFalse%2C%20num_workers%3D0)%0A%20%20%20%20print(f%22train%20images%3A%20%7Blen(train_dataset)%7D%2C%20test%20images%3A%20%7Blen(test_dataset)%7D%22)%0A%20%20%20%20return%20test_loader%2C%20train_dataset%2C%20train_loader%0A%0A%0A%40app.cell(hide_code%3DTrue)%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%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%85%88%E9%A0%AD10%E4%BB%B6%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%80%81%E5%80%A4%E5%9F%9F%E3%81%AE%E5%A4%89%E6%8F%9B%E5%BE%8C%E3%82%82%E6%95%B0%E5%AD%97%E3%81%8C%E6%AD%A3%E3%81%97%E3%81%8F%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8C%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E8%A1%A8%E7%A4%BA%E6%99%82%E3%81%AF%20%60(x%20%2B%201)%20%2F%202%60%20%E3%81%A7%20%24%5B0%2C%201%5D%24%20%E3%81%B8%E6%88%BB%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%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_(train_dataset)%3A%0A%20%20%20%20_fig%2C%20_axes%20%3D%20plt.subplots(2%2C%205%2C%20figsize%3D(8%2C%204))%0A%20%20%20%20for%20_idx%2C%20_axis%20in%20enumerate(_axes.ravel())%3A%0A%20%20%20%20%20%20%20%20_image%2C%20_label%20%3D%20train_dataset%5B_idx%5D%0A%20%20%20%20%20%20%20%20_axis.imshow(((_image.squeeze(0)%20%2B%201.0)%20%2F%202.0)%2C%20cmap%3D%22gray%22)%0A%20%20%20%20%20%20%20%20_axis.set_title(f%22label%3D%7B_label%7D%22)%0A%20%20%20%20%20%20%20%20_axis.axis(%22off%22)%0A%20%20%20%20_fig.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Variational%20Diffusion%20Model%0A%0A%20%20%20%20%E8%AB%96%E6%96%87%E3%81%AF%20forward%20process%EF%BC%88encoder%EF%BC%89%E3%82%92%E3%80%81%E7%B7%9A%E5%BD%A2%E3%82%AC%E3%82%A6%E3%82%B9%E9%81%B7%E7%A7%BB%E3%81%A8%E3%81%84%E3%81%86%E5%BD%A2%E3%81%AB%E5%9B%BA%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E4%BF%82%E6%95%B0%0A%20%20%20%20%24%5Calpha_t%24%20%E8%87%AA%E4%BD%93%E3%81%AF%E5%AD%A6%E7%BF%92%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%82%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%E3%81%93%E3%81%AE%20notebook%20%E3%81%A7%E3%81%AF%E5%AE%9A%E6%95%B0%E3%81%AE%E7%B7%9A%E5%BD%A2%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%A8%E3%81%97%E3%81%A6%0A%20%20%20%20%E4%B8%8E%E3%81%88%E3%81%BE%E3%81%99%E3%80%82%24%5Cbeta_t%24%20%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%20%24%5Calpha_t%24%20%E3%82%92%E7%9B%B4%E6%8E%A5%E4%BD%BF%E3%81%86%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20q(x_t%20%5Cmid%20x_%7Bt-1%7D)%20%3D%20%5Cmathcal%7BN%7D%5C!%5Cleft(x_t%3B%5C%20%5Csqrt%7B%5Calpha_t%7D%5C%2Cx_%7Bt-1%7D%2C%5C%20(1-%5Calpha_t)%20I%5Cright)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%82%92%E9%80%90%E6%AC%A1%E9%81%A9%E7%94%A8%E3%81%97%E3%81%AA%E3%81%8F%E3%81%A6%E3%82%82%E3%80%81%E7%B4%AF%E7%A9%8D%E7%A9%8D%20%24%5Cbar%7B%5Calpha%7D_t%20%3D%20%5Cprod_%7Bi%3D1%7D%5E%7Bt%7D%5Calpha_i%24%20%E3%82%92%E4%BD%BF%E3%81%88%E3%81%B0%0A%20%20%20%20%E4%BB%BB%E6%84%8F%E3%81%AE%20%24t%24%20%E3%81%AE%E7%8A%B6%E6%85%8B%E3%81%8C1%E5%9B%9E%E3%81%AE%E8%A8%88%E7%AE%97%E3%81%A7%E5%BE%97%E3%82%89%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E5%AD%A6%E7%BF%92%E6%99%82%E3%81%AF%E3%81%93%E3%81%AE%E5%BC%8F%E3%81%A7%E3%83%8E%E3%82%A4%E3%82%BA%E7%94%BB%E5%83%8F%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20q(x_t%20%5Cmid%20x_0)%20%3D%20%5Cmathcal%7BN%7D%5C!%5Cleft(x_t%3B%5C%20%5Csqrt%7B%5Cbar%7B%5Calpha%7D_t%7D%5C%2Cx_0%2C%5C%20(1-%5Cbar%7B%5Calpha%7D_t)%20I%5Cright)%2C%0A%20%20%20%20%5Cqquad%0A%20%20%20%20x_t%20%3D%20%5Csqrt%7B%5Cbar%7B%5Calpha%7D_t%7D%5C%2Cx_0%20%2B%20%5Csqrt%7B1-%5Cbar%7B%5Calpha%7D_t%7D%5C%2C%5Cvarepsilon_0%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E3%81%93%E3%81%93%E3%81%A7%E9%87%8D%E8%A6%81%E3%81%AA%E3%81%AE%E3%81%AF**%E7%B5%82%E7%AB%AF%20%24%5Cbar%7B%5Calpha%7D_T%24%20%E3%81%8C%E5%8D%81%E5%88%86%E3%81%AB%200%20%E3%81%B8%E8%BF%91%E3%81%84%E3%81%93%E3%81%A8**%E3%81%A7%E3%81%99%E3%80%82%E7%94%9F%E6%88%90%E3%81%AF%E6%A8%99%E6%BA%96%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83%0A%20%20%20%20%24x_T%20%5Csim%20%5Cmathcal%7BN%7D(0%2C%20I)%24%20%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%24%5Cbar%7B%5Calpha%7D_T%24%20%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%84%E3%81%A8%0A%20%20%20%20%E3%80%8C%E5%AD%A6%E7%BF%92%E3%81%97%E3%81%9F%E7%B5%82%E7%AB%AF%E5%88%86%E5%B8%83%E3%80%8D%E3%81%A8%E3%80%8C%E7%94%9F%E6%88%90%E3%81%AE%E9%96%8B%E5%A7%8B%E5%88%86%E5%B8%83%E3%80%8D%E3%81%8C%E3%81%9A%E3%82%8C%E3%80%81%E9%80%86%E9%81%8E%E7%A8%8B%E3%81%8C%E3%83%8E%E3%82%A4%E3%82%BA%E3%81%AE%E3%81%BE%E3%81%BE%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E5%AE%9F%E8%A3%85%E3%81%A7%E3%81%AF%20DDPM%20%E7%B3%BB%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%85%A3%E4%BE%8B%E3%81%AB%E5%BE%93%E3%81%84%E3%80%81%241-%5Calpha_t%24%20%E3%82%92%E5%85%88%E3%81%AB%E7%AD%89%E5%B7%AE%E6%95%B0%E5%88%97%E3%81%A8%E3%81%97%E3%81%A6%E6%B1%BA%E3%82%81%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E8%AB%96%E6%96%87%E3%81%AE%E8%A8%98%E5%8F%B7%E3%81%A8%E3%82%B3%E3%83%BC%E3%83%89%E4%B8%8A%E3%81%AE%E5%A4%89%E6%95%B0%E3%81%AE%E5%AF%BE%E5%BF%9C%E3%81%AF%E6%AC%A1%E3%81%AE%E9%80%9A%E3%82%8A%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%20%7C%20%E8%AB%96%E6%96%87%E3%81%AE%E8%A8%98%E5%8F%B7%20%7C%20%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%A4%89%E6%95%B0%20%7C%20%E5%86%85%E5%AE%B9%20%7C%0A%20%20%20%20%7C%20---%20%7C%20---%20%7C%20---%20%7C%0A%20%20%20%20%7C%20%241-%5Calpha_t%24%20%7C%20%60betas%60%20%7C%20%E5%90%84%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A7%E5%8A%A0%E3%81%88%E3%82%8B%E5%88%86%E6%95%A3%E3%80%82%2410%5E%7B-4%7D%24%20%E3%81%8B%E3%82%89%20%240.02%24%20%E3%81%AE%E7%B7%9A%E5%BD%A2%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%20%7C%0A%20%20%20%20%7C%20%24%5Calpha_t%24%20%7C%20%60alphas%60%20%7C%20%601.0%20-%20betas%60%20%7C%0A%20%20%20%20%7C%20%24%5Cbar%7B%5Calpha%7D_t%24%20%7C%20%60alpha_bars%60%20%7C%20%60alphas%60%20%E3%81%AE%E7%B4%AF%E7%A9%8D%E7%A9%8D%20%7C%0A%20%20%20%20%7C%20%24T%24%20%7C%20%60num_steps%60%20%7C%20400%20%7C%0A%20%20%20%20%7C%20%24%5Cvarepsilon_0%24%20%7C%20%60noise%60%20%7C%20%E5%8A%A0%E3%81%88%E3%81%9F%E6%A8%99%E6%BA%96%E6%AD%A3%E8%A6%8F%E3%83%8E%E3%82%A4%E3%82%BA%20%7C%0A%0A%20%20%20%20**%E6%B7%BB%E5%AD%97%E3%81%AF%E8%AB%96%E6%96%87%E3%81%8C1%E5%A7%8B%E3%81%BE%E3%82%8A%E3%80%81%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C0%E5%A7%8B%E3%81%BE%E3%82%8A%E3%81%A7%E3%81%99%E3%80%82**%20%E9%85%8D%E5%88%97%E3%81%AE%E6%B7%BB%E5%AD%97%20%60i%60%20%E3%81%AF%E8%AB%96%E6%96%87%E3%81%AE%20%24t%20%3D%20i%2B1%24%20%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%80%81%0A%20%20%20%20%60alpha_bars%5Bi%5D%60%20%E3%81%8C%20%24%5Cbar%7B%5Calpha%7D_%7Bi%2B1%7D%24%20%E3%81%A7%E3%81%99%E3%80%82%E3%81%97%E3%81%9F%E3%81%8C%E3%81%A3%E3%81%A6%20%60q_sample%60%20%E3%81%AB%20%60t%60%20%E3%81%A8%E3%81%97%E3%81%A6%200%20%E3%82%92%E6%B8%A1%E3%81%99%E3%81%A8%0A%20%20%20%20%E5%BE%97%E3%82%89%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%AF%20%24x_1%24%20%E3%81%A7%E3%80%81%60i%60%20%E3%81%AE%E6%9C%80%E5%A4%A7%E5%80%A4%20%60num_steps%20-%201%60%20%E3%81%8C%20%24t%3DT%24%20%E3%81%AB%E3%81%82%E3%81%9F%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E5%BE%8C%E5%8D%8A%E3%81%AE%E9%80%86%E9%81%8E%E7%A8%8B%E3%81%AE%0A%20%20%20%20%E3%83%AB%E3%83%BC%E3%83%97%E3%81%A7%E3%82%82%E5%90%8C%E6%A7%98%E3%81%AB%E3%80%81%E6%B7%BB%E5%AD%97%20%60step%60%20%E3%81%AE1%E5%9B%9E%E3%81%AE%E6%9B%B4%E6%96%B0%E3%81%8C%20%24x_%7B%5Ctext%7Bstep%7D%2B1%7D%20%5Cto%20x_%7B%5Ctext%7Bstep%7D%7D%24%20%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E6%AC%A1%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%A7%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B%20%60q_sample%60%20%E3%81%8C%E4%B8%8A%E3%81%AE%20%24x_t%24%20%E3%81%AE%E5%BC%8F%E3%81%9D%E3%81%AE%E3%82%82%E3%81%AE%E3%81%A7%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_()%3A%0A%20%20%20%20num_steps%20%3D%20400%0A%20%20%20%20betas%20%3D%20torch.linspace(1e-4%2C%202e-2%2C%20num_steps)%0A%20%20%20%20alphas%20%3D%201.0%20-%20betas%0A%20%20%20%20alpha_bars%20%3D%20torch.cumprod(alphas%2C%20dim%3D0)%0A%0A%20%20%20%20def%20q_sample(x0%2C%20t%2C%20noise)%3A%0A%20%20%20%20%20%20%20%20alpha_bars_local%20%3D%20alpha_bars.to(x0.device)%0A%20%20%20%20%20%20%20%20t_local%20%3D%20t.to(x0.device)%0A%20%20%20%20%20%20%20%20sqrt_alpha_bar%20%3D%20alpha_bars_local%5Bt_local%5D.view(-1%2C%201%2C%201%2C%201).sqrt()%0A%20%20%20%20%20%20%20%20sqrt_one_minus%20%3D%20(1.0%20-%20alpha_bars_local%5Bt_local%5D).view(-1%2C%201%2C%201%2C%201).sqrt()%0A%20%20%20%20%20%20%20%20return%20sqrt_alpha_bar%20*%20x0%20%2B%20sqrt_one_minus%20*%20noise%0A%0A%20%20%20%20return%20alpha_bars%2C%20alphas%2C%20betas%2C%20num_steps%2C%20q_sample%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%8C%E5%A6%A5%E5%BD%93%E3%81%8B%E3%82%92%E3%80%81%24%5Cbar%7B%5Calpha%7D_t%24%20%E3%81%A8%E3%80%81%E5%85%83%E7%94%BB%E5%83%8F%E3%81%AE%E6%AE%8B%E5%AD%98%E9%87%8F%20%24%5Csqrt%7B%5Cbar%7B%5Calpha%7D_t%7D%24%E3%80%81%0A%20%20%20%20%E3%83%8E%E3%82%A4%E3%82%BA%E9%87%8F%20%24%5Csqrt%7B1-%5Cbar%7B%5Calpha%7D_t%7D%24%20%E3%81%AE3%E3%81%A4%E3%81%A7%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E8%A1%A8%E3%81%AE%E6%9C%80%E7%B5%82%E8%A1%8C%E3%81%A7%0A%20%20%20%20%24%5Csqrt%7B%5Cbar%7B%5Calpha%7D_T%7D%24%20%E3%81%8C%E5%8D%81%E5%88%86%E5%B0%8F%E3%81%95%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8C%E3%81%B0%E3%80%81%E7%94%9F%E6%88%90%E3%82%92%E3%82%AC%E3%82%A6%E3%82%B9%E3%83%8E%E3%82%A4%E3%82%BA%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%81%A6%E3%82%88%E3%81%84%E7%8A%B6%E6%85%8B%E3%81%A7%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_(alpha_bars%2C%20num_steps)%3A%0A%20%20%20%20_checkpoints%20%3D%20%5B0%2C%2099%2C%20199%2C%20299%2C%20num_steps%20-%201%5D%0A%20%20%20%20schedule_frame%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22t%22%3A%20%5B_t%20%2B%201%20for%20_t%20in%20_checkpoints%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22alpha_bar%22%3A%20%5Bround(alpha_bars%5B_t%5D.item()%2C%206)%20for%20_t%20in%20_checkpoints%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22signal_amplitude%22%3A%20%5Bround(alpha_bars%5B_t%5D.sqrt().item()%2C%204)%20for%20_t%20in%20_checkpoints%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22noise_amplitude%22%3A%20%5Bround((1.0%20-%20alpha_bars%5B_t%5D).sqrt().item()%2C%204)%20for%20_t%20in%20_checkpoints%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20schedule_frame%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(alpha_bars%2C%20num_steps)%3A%0A%20%20%20%20_steps%20%3D%20np.arange(1%2C%20num_steps%20%2B%201)%0A%20%20%20%20_fig%2C%20_ax%20%3D%20plt.subplots(figsize%3D(6%2C%204))%0A%20%20%20%20_ax.plot(_steps%2C%20alpha_bars.numpy()%2C%20label%3Dr%22%24%5Cbar%7B%5Calpha%7D_t%24%22)%0A%20%20%20%20_ax.plot(_steps%2C%20alpha_bars.sqrt().numpy()%2C%20label%3Dr%22%24%5Csqrt%7B%5Cbar%7B%5Calpha%7D_t%7D%24%20(signal)%22)%0A%20%20%20%20_ax.plot(_steps%2C%20(1.0%20-%20alpha_bars).sqrt().numpy()%2C%20label%3Dr%22%24%5Csqrt%7B1-%5Cbar%7B%5Calpha%7D_t%7D%24%20(noise)%22)%0A%20%20%20%20_ax.set_xlabel(%22diffusion%20step%20t%22)%0A%20%20%20%20_ax.set_ylabel(%22amplitude%22)%0A%20%20%20%20_ax.set_title(%22Forward%20diffusion%20schedule%22)%0A%20%20%20%20_ax.legend()%0A%20%20%20%20_fig.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E5%AE%9F%E9%9A%9B%E3%81%AB1%E6%9E%9A%E3%81%AE%E7%94%BB%E5%83%8F%E3%81%B8%20%60q_sample%60%20%E3%82%92%E9%81%A9%E7%94%A8%E3%81%97%E3%80%81%24t%24%20%E3%81%8C%E9%80%B2%E3%82%80%E3%81%BB%E3%81%A9%E6%95%B0%E5%AD%97%E3%81%8C%E8%A6%8B%E3%81%88%E3%81%AA%E3%81%8F%E3%81%AA%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E7%A2%BA%E3%81%8B%E3%82%81%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E5%B7%A6%E7%AB%AF%E3%81%8C%E5%85%83%E7%94%BB%E5%83%8F%20%24x_0%24%E3%80%81%E5%8F%B3%E3%81%B8%E9%80%B2%E3%82%80%E3%81%BB%E3%81%A9%E3%83%8E%E3%82%A4%E3%82%BA%E3%81%8C%E5%BC%B7%E3%81%8F%E3%80%81%24t%3D400%24%20%E3%81%A7%E3%81%AF%E3%81%BB%E3%81%BC%E7%B4%94%E7%B2%8B%E3%81%AA%E3%83%8E%E3%82%A4%E3%82%BA%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%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_(num_steps%2C%20q_sample%2C%20train_dataset)%3A%0A%20%20%20%20image%2C%20label%20%3D%20train_dataset%5B0%5D%0A%20%20%20%20noisy_versions%20%3D%20%5B%5D%0A%20%20%20%20for%20_step%20in%20%5B0%2C%2099%2C%20199%2C%20299%2C%20num_steps%20-%201%5D%3A%0A%20%20%20%20%20%20%20%20_noise%20%3D%20torch.randn_like(image).unsqueeze(0)%0A%20%20%20%20%20%20%20%20_noised%20%3D%20q_sample(image.unsqueeze(0)%2C%20torch.tensor(%5B_step%5D)%2C%20_noise)%5B0%5D%0A%20%20%20%20%20%20%20%20noisy_versions.append((_step%20%2B%201%2C%20_noised.squeeze(0)))%0A%20%20%20%20return%20image%2C%20label%2C%20noisy_versions%0A%0A%0A%40app.cell%0Adef%20_(image%2C%20label%2C%20noisy_versions)%3A%0A%20%20%20%20_fig%2C%20_axes%20%3D%20plt.subplots(1%2C%20len(noisy_versions)%20%2B%201%2C%20figsize%3D(12%2C%203))%0A%20%20%20%20_axes%5B0%5D.imshow(((image.squeeze(0)%20%2B%201.0)%20%2F%202.0)%2C%20cmap%3D%22gray%22)%0A%20%20%20%20_axes%5B0%5D.set_title(f%22x0%20label%3D%7Blabel%7D%22)%0A%20%20%20%20_axes%5B0%5D.axis(%22off%22)%0A%20%20%20%20for%20_axis%2C%20(_step%2C%20_noised)%20in%20zip(_axes%5B1%3A%5D%2C%20noisy_versions%2C%20strict%3DFalse)%3A%0A%20%20%20%20%20%20%20%20_axis.imshow(((_noised%20%2B%201.0)%20%2F%202.0)%2C%20cmap%3D%22gray%22)%0A%20%20%20%20%20%20%20%20_axis.set_title(f%22t%3D%7B_step%7D%22)%0A%20%20%20%20%20%20%20%20_axis.axis(%22off%22)%0A%20%20%20%20_fig.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20ELBO%20%E3%81%AE%E5%88%86%E8%A7%A3%E3%81%A8%20denoising%20matching%20term%0A%0A%20%20%20%20%E8%AB%96%E6%96%87%E3%81%AF%E5%AF%BE%E6%95%B0%E5%B0%A4%E5%BA%A6%E3%81%AE%E4%B8%8B%E7%95%8C%EF%BC%88ELBO%EF%BC%89%E3%82%922%E9%80%9A%E3%82%8A%E3%81%AB%E5%88%86%E8%A7%A3%E3%81%97%E3%81%BE%E3%81%99%E3%80%821%E3%81%A4%E7%9B%AE%E3%81%AF%E9%81%B7%E7%A7%BB%20%24q(x_t%20%5Cmid%20x_%7Bt-1%7D)%24%20%E3%82%92%0A%20%20%20%20%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E6%AF%94%E3%81%B9%E3%82%8B%E5%BD%A2%E3%81%A7%E3%80%81**reconstruction%20term**%E3%80%81**prior%20matching%20term**%E3%80%81%0A%20%20%20%20**consistency%20term**%20%E3%81%AE3%E3%81%A4%E3%81%AB%E5%88%86%E3%81%8B%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E3%81%9F%E3%81%A0%E3%81%97%20consistency%20term%20%E3%81%AF%E5%90%84%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%A7%0A%20%20%20%20%24x_%7Bt-1%7D%24%20%E3%81%A8%20%24x_%7Bt%2B1%7D%24%20%E3%81%A8%E3%81%84%E3%81%862%E3%81%A4%E3%81%AE%E7%A2%BA%E7%8E%87%E5%A4%89%E6%95%B0%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E6%9C%9F%E5%BE%85%E5%80%A4%E3%81%AB%E3%81%AA%E3%82%8A%E3%80%81%0A%20%20%20%20Monte%20Carlo%20%E6%8E%A8%E5%AE%9A%E3%81%AE%E5%88%86%E6%95%A3%E3%81%8C%E5%A4%A7%E3%81%8D%E3%81%8F%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E3%81%9D%E3%81%93%E3%81%A7%E8%AB%96%E6%96%87%E3%81%AF%E3%80%81%24x_0%24%20%E3%81%A7%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%91%E3%81%9F%E5%BE%8C%E3%82%8D%E5%90%91%E3%81%8D%E3%81%AE%E9%81%B7%E7%A7%BB%E3%82%92%E4%BD%BF%E3%81%862%E3%81%A4%E7%9B%AE%E3%81%AE%E5%88%86%E8%A7%A3%E3%82%92%E6%8E%A1%E3%82%8A%E3%80%81%0A%20%20%20%20%E3%81%93%E3%81%A1%E3%82%89%E3%82%92%E6%8E%A8%E5%A5%A8%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%E5%90%84%E9%A0%85%E3%81%8C%E9%AB%98%E3%80%851%E3%81%A4%E3%81%AE%E7%A2%BA%E7%8E%87%E5%A4%89%E6%95%B0%E3%81%AE%E6%9C%9F%E5%BE%85%E5%80%A4%E3%81%A7%E6%9B%B8%E3%81%91%E3%82%8B%E3%81%9F%E3%82%81%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Clog%20p(x_0)%20%5Cge%0A%20%20%20%20%5Cmathbb%7BE%7D_%7Bq(x_1%20%5Cmid%20x_0)%7D%5C!%5Cleft%5B%5Clog%20p_%5Ctheta(x_0%20%5Cmid%20x_1)%5Cright%5D%0A%20%20%20%20-D_%7B%5Cmathrm%7BKL%7D%7D%5C!%5Cleft(q(x_T%20%5Cmid%20x_0)%20%5C%2C%5C%7C%5C%2C%20p(x_T)%5Cright)%0A%20%20%20%20-%5Csum_%7Bt%3D2%7D%5E%7BT%7D%20%5Cmathbb%7BE%7D_%7Bq(x_t%20%5Cmid%20x_0)%7D%0A%20%20%20%20%5Cleft%5BD_%7B%5Cmathrm%7BKL%7D%7D%5C!%5Cleft(q(x_%7Bt-1%7D%20%5Cmid%20x_t%2C%20x_0)%20%5C%2C%5C%7C%5C%2C%20p_%5Ctheta(x_%7Bt-1%7D%20%5Cmid%20x_t)%5Cright)%5Cright%5D%0A%20%20%20%20%24%24%0A%0A%20%20%20%203%E9%A0%85%E3%81%AF%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%20**reconstruction%20term**%E3%80%81**prior%20matching%20term**%E3%80%81%0A%20%20%20%20**denoising%20matching%20term**%20%E3%81%A8%E5%91%BC%E3%81%B0%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%81%AE%20notebook%20%E3%81%AE%E3%82%88%E3%81%86%E3%81%AB%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E5%9B%BA%E5%AE%9A%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%80%81%0A%20%20%20%20%E5%AD%A6%E7%BF%92%E5%AF%BE%E8%B1%A1%E3%82%92%E5%90%AB%E3%81%BE%E3%81%AA%E3%81%84%E3%81%AE%E3%81%AF%20prior%20matching%20term%20%E3%81%A0%E3%81%91%E3%81%A7%E3%80%81%E3%81%93%E3%82%8C%E3%81%AF%20%24%5Cbar%7B%5Calpha%7D_T%20%5Cto%200%24%20%E3%81%AA%E3%82%89%0A%20%20%20%200%20%E3%81%AB%E8%BF%91%E3%81%A5%E3%81%8F%E9%87%8F%E3%81%A7%E3%81%99%E3%80%82%E5%89%8D%E7%AF%80%E3%81%A7%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E7%B5%82%E7%AB%AF%E3%82%92%0A%20%20%20%20%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%9F%E3%81%AE%E3%81%AF%E3%81%93%E3%81%AE%E9%A0%85%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%BE%E3%81%99%E3%80%82reconstruction%20term%20%E3%81%AF%20%24p_%5Ctheta(x_0%20%5Cmid%20x_1)%24%20%E3%82%92%E5%90%AB%E3%81%BF%0A%20%20%20%20%E6%9C%80%E9%81%A9%E5%8C%96%E3%81%AE%E5%AF%BE%E8%B1%A1%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%E9%A0%85%E6%95%B0%E3%81%8C1%E3%81%A4%E3%81%A0%E3%81%91%E3%81%A7%E3%80%81%24T-1%24%20%E5%80%8B%E3%81%AE%E5%92%8C%E3%81%A7%E3%81%82%E3%82%8B%20denoising%20matching%20term%20%E3%81%8C%0A%20%20%20%20%E5%AD%A6%E7%BF%92%E3%82%92%E6%94%AF%E9%85%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20**%E3%81%93%E3%81%AE%20notebook%20%E3%81%AF%20reconstruction%20term%20%E3%82%92%E5%88%A5%E6%89%B1%E3%81%84%E3%81%9B%E3%81%9A%E3%80%81%E5%BE%8C%E8%BF%B0%E3%81%99%E3%82%8B%E7%B0%A1%E7%95%A5%E5%8C%96%E3%81%97%E3%81%9F%E3%83%8E%E3%82%A4%E3%82%BA%E4%BA%88%E6%B8%AC%E3%81%AE%E6%90%8D%E5%A4%B1%E3%82%92%0A%20%20%20%20%24t%3D1%24%20%E3%82%92%E5%90%AB%E3%82%80%E5%85%A8%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%B8%E4%B8%80%E6%A7%98%E3%81%AB%E9%81%A9%E7%94%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82**%20%E8%AB%96%E6%96%87%E3%81%AE%20ELBO%20%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E6%9C%80%E5%A4%A7%E5%8C%96%E3%81%99%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%80%81%0A%20%20%20%20%E5%AE%9F%E8%A3%85%E3%81%A7%E5%BA%83%E3%81%8F%E4%BD%BF%E3%82%8F%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E5%BD%A2%E3%82%92%E6%8E%A1%E3%82%8B%E3%80%81%E3%81%A8%E3%81%84%E3%81%86%E9%81%B8%E6%8A%9E%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%20denoising%20matching%20term%20%E3%81%AE%E6%AF%94%E8%BC%83%E5%AF%BE%E8%B1%A1%E3%81%A8%E3%81%AA%E3%82%8B%E7%9C%9F%E3%81%AE%E5%BE%8C%E3%82%8D%E5%90%91%E3%81%8D%E9%81%B7%E7%A7%BB%E3%81%AF%E3%80%81Bayes%20%E3%81%AE%E5%AE%9A%E7%90%86%E3%81%8B%E3%82%89%0A%20%20%20%20%E3%82%AC%E3%82%A6%E3%82%B9%E5%88%86%E5%B8%83%E3%81%A8%E3%81%97%E3%81%A6%E9%96%89%E3%81%98%E3%81%9F%E5%BD%A2%E3%81%A7%E6%B1%82%E3%81%BE%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20q(x_%7Bt-1%7D%20%5Cmid%20x_t%2C%20x_0)%20%3D%20%5Cmathcal%7BN%7D%5C!%5Cleft(x_%7Bt-1%7D%3B%5C%20%5Cmu_q(x_t%2C%20x_0)%2C%5C%20%5Csigma_q%5E2(t)%20I%5Cright)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cmu_q(x_t%2C%20x_0)%20%3D%20%5Cfrac%7B%5Csqrt%7B%5Calpha_t%7D%5Cleft(1-%5Cbar%7B%5Calpha%7D_%7Bt-1%7D%5Cright)%20x_t%0A%20%20%20%20%2B%5Csqrt%7B%5Cbar%7B%5Calpha%7D_%7Bt-1%7D%7D%5Cleft(1-%5Calpha_t%5Cright)%20x_0%7D%7B1-%5Cbar%7B%5Calpha%7D_t%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Csigma_q%5E2(t)%20%3D%20%5Cfrac%7B%5Cleft(1-%5Calpha_t%5Cright)%5Cleft(1-%5Cbar%7B%5Calpha%7D_%7Bt-1%7D%5Cright)%7D%7B1-%5Cbar%7B%5Calpha%7D_t%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E5%88%86%E6%95%A3%20%24%5Csigma_q%5E2(t)%24%20%E3%81%AF%20%24x_t%24%20%E3%81%AB%E3%82%82%20%24x_0%24%20%E3%81%AB%E3%82%82%E4%BE%9D%E3%82%89%E3%81%9A%20%24t%24%20%E3%81%A0%E3%81%91%E3%81%A7%E6%B1%BA%E3%81%BE%E3%82%8B%E6%97%A2%E7%9F%A5%E3%81%AE%E5%AE%9A%E6%95%B0%E3%81%A7%E3%81%99%E3%80%82%0A%20%20%20%20%E3%81%9D%E3%81%93%E3%81%A7%E9%80%86%E9%81%8E%E7%A8%8B%E3%81%AE%E5%88%86%E6%95%A3%E3%82%82%E5%90%8C%E3%81%98%20%24%5Csigma_q%5E2(t)%20I%24%20%E3%81%AB%E5%9B%BA%E5%AE%9A%E3%81%97%E3%80%81%0A%20%20%20%20%24p_%5Ctheta(x_%7Bt-1%7D%20%5Cmid%20x_t)%20%3D%20%5Cmathcal%7BN%7D%5C!%5Cleft(x_%7Bt-1%7D%3B%5C%20%5Cmu_%5Ctheta(x_t%2C%20t)%2C%5C%20%5Csigma_q%5E2(t)%20I%5Cright)%24%0A%20%20%20%20%E3%81%A8%E7%BD%AE%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%E5%88%86%E6%95%A3%E3%81%8C%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%E3%81%AE%E3%81%A72%E3%81%A4%E3%81%AE%E3%82%AC%E3%82%A6%E3%82%B9%E5%88%86%E5%B8%83%E3%81%AE%20KL%20%E3%81%AF%E5%B9%B3%E5%9D%87%E3%81%AE%E5%B7%AE%E3%81%A0%E3%81%91%E3%81%AB%E3%81%AA%E3%82%8A%E3%80%81%E5%AD%A6%E7%BF%92%E3%81%AF%0A%20%20%20%20%24%5Cmu_%5Ctheta(x_t%2C%20t)%24%20%E3%82%92%20%24%5Cmu_q(x_t%2C%20x_0)%24%20%E3%81%AB%E5%90%88%E3%82%8F%E3%81%9B%E3%82%8B%E5%95%8F%E9%A1%8C%E3%81%B8%E7%B0%A1%E7%B4%84%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Carg%5Cmin_%7B%5Ctheta%7D%20%5Cfrac%7B1%7D%7B2%5Csigma_q%5E2(t)%7D%0A%20%20%20%20%5Cleft%5ClVert%20%5Cmu_%5Ctheta(x_t%2C%20t)%20-%20%5Cmu_q(x_t%2C%20x_0)%20%5Cright%5CrVert_2%5E2%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E3%81%93%E3%81%AE%20%24%5Csigma_q%5E2(t)%24%20%E3%81%AF%E3%80%81%E5%BE%8C%E5%8D%8A%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A7%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E5%90%84%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%AE%E5%88%86%E6%95%A3%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Three%20Equivalent%20Interpretations%0A%0A%20%20%20%20%24%5Cmu_%5Ctheta%24%20%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%81%8C%E4%BA%88%E6%B8%AC%E3%81%99%E3%81%B9%E3%81%8D%E5%AF%BE%E8%B1%A1%E3%81%AF1%E3%81%A4%E3%81%AB%E6%B1%BA%E3%81%BE%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%0A%20%20%20%20%E8%AB%96%E6%96%87%E3%81%AF%E6%AC%A1%E3%81%AE3%E3%81%A4%E3%81%8C%E7%AD%89%E4%BE%A1%E3%81%A7%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E7%A4%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E7%9B%AE%E7%9A%84%E9%96%A2%E6%95%B0%E3%81%AF%E3%81%84%E3%81%9A%E3%82%8C%E3%82%82%20denoising%20matching%20term%0A%20%20%20%20%EF%BC%88%24t%20%3D%202%2C%20%5Cldots%2C%20T%24%EF%BC%89%E3%81%8B%E3%82%89%E5%B0%8E%E3%81%8B%E3%82%8C%E3%82%8B%E3%82%82%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%20-%20**%E5%85%83%E7%94%BB%E5%83%8F%20%24%5Chat%7Bx%7D_%5Ctheta(x_t%2C%20t)%24%20%E3%82%92%E4%BA%88%E6%B8%AC%E3%81%99%E3%82%8B**%EF%BC%9A%24%5Cmu_q%24%20%E3%81%A8%E5%90%8C%E3%81%98%E5%BD%A2%E3%81%AB%0A%20%20%20%20%20%20%24%5Chat%7Bx%7D_%5Ctheta%24%20%E3%82%92%E5%B7%AE%E3%81%97%E8%BE%BC%E3%82%80%E3%80%82%E7%9B%AE%E7%9A%84%E9%96%A2%E6%95%B0%E3%81%AF%0A%20%20%20%20%20%20%24%5Ctfrac%7B1%7D%7B2%7D%5Cleft(%5Cmathrm%7BSNR%7D(t-1)-%5Cmathrm%7BSNR%7D(t)%5Cright)%0A%20%20%20%20%20%20%5ClVert%20%5Chat%7Bx%7D_%5Ctheta%20-%20x_0%20%5CrVert_2%5E2%24%20%E3%81%A8%E3%81%AA%E3%82%8A%E3%80%81%0A%20%20%20%20%20%20%24%5Cmathrm%7BSNR%7D(t)%20%3D%20%5Cbar%7B%5Calpha%7D_t%20%2F%20(1-%5Cbar%7B%5Calpha%7D_t)%24%20%E3%81%A7%E3%81%99%E3%80%82%0A%20%20%20%20-%20**%E5%8A%A0%E3%81%88%E3%81%9F%E3%83%8E%E3%82%A4%E3%82%BA%20%24%5Chat%7B%5Cvarepsilon%7D_%5Ctheta(x_t%2C%20t)%24%20%E3%82%92%E4%BA%88%E6%B8%AC%E3%81%99%E3%82%8B**%EF%BC%9A%0A%20%20%20%20%20%20%24x_0%20%3D%20(x_t%20-%20%5Csqrt%7B1-%5Cbar%7B%5Calpha%7D_t%7D%5C%2C%5Cvarepsilon_0)%2F%5Csqrt%7B%5Cbar%7B%5Calpha%7D_t%7D%24%20%E3%82%92%E4%BB%A3%E5%85%A5%E3%81%97%E3%81%A6%E6%95%B4%E7%90%86%E3%81%99%E3%82%8B%E3%80%82%0A%20%20%20%20-%20**%E3%82%B9%E3%82%B3%E3%82%A2%20%24s_%5Ctheta(x_t%2C%20t)%20%5Capprox%20%5Cnabla%20%5Clog%20p(x_t)%24%20%E3%82%92%E4%BA%88%E6%B8%AC%E3%81%99%E3%82%8B**%EF%BC%9A%0A%20%20%20%20%20%20Tweedie%20%E3%81%AE%E5%85%AC%E5%BC%8F%E3%81%8B%E3%82%89%20%24x_0%24%20%E3%82%92%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%A7%E8%A1%A8%E3%81%97%E3%81%A6%E4%BB%A3%E5%85%A5%E3%81%99%E3%82%8B%E3%80%82%0A%0A%20%20%20%203%E3%81%A4%E7%9B%AE%E3%81%AE%E3%82%B9%E3%82%B3%E3%82%A2%E8%A1%A8%E7%8F%BE%E3%81%AF%E3%80%81%E6%AC%A1%E3%81%AE2%E3%81%A4%E3%81%AE%E9%96%A2%E4%BF%82%E3%81%A72%E3%81%A4%E7%9B%AE%E3%81%A8%E7%B5%90%E3%81%B3%E4%BB%98%E3%81%8D%E3%81%BE%E3%81%99%E3%80%821%E3%81%A4%E7%9B%AE%E3%81%AE%E5%BC%8F%E3%81%AF%0A%20%20%20%20%24q(x_t%20%5Cmid%20x_0)%24%20%E3%81%8C%E3%82%AC%E3%82%A6%E3%82%B9%E5%88%86%E5%B8%83%E3%81%A7%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8B%E3%82%89%E7%9B%B4%E6%8E%A5%E5%BE%AE%E5%88%86%E3%81%97%E3%81%A6%E5%BE%97%E3%82%89%E3%82%8C%E3%82%8B%E3%80%81%24x_0%24%20%E3%81%A7%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%91%E3%81%9F%0A%20%20%20%20%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%A7%E3%81%99%E3%80%822%E3%81%A4%E7%9B%AE%E3%81%AE%E5%BC%8F%E3%81%AF%20Tweedie%20%E3%81%AE%E5%85%AC%E5%BC%8F%E3%81%8C%E4%B8%8E%E3%81%88%E3%82%8B%E3%80%81%E3%83%8E%E3%82%A4%E3%82%BA%E4%BB%98%E3%81%8D%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%91%A8%E8%BE%BA%E5%88%86%E5%B8%83%20%24p(x_t)%24%20%E3%81%AE%0A%20%20%20%20%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%A7%E3%80%81%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%81%AE%E5%80%A4%E3%82%92%20%24x_t%24%20%E3%81%AE%E3%82%82%E3%81%A8%E3%81%A7%E6%9C%9F%E5%BE%85%E5%80%A4%E3%82%92%E5%8F%96%E3%81%A3%E3%81%9F%E5%BD%A2%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%81%84%E3%81%9A%E3%82%8C%E3%82%82%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%AF%E3%83%8E%E3%82%A4%E3%82%BA%E3%81%AE%E9%80%86%E5%90%91%E3%81%8D%E3%82%92%E6%8C%87%E3%81%97%E3%80%81%0A%20%20%20%20%E3%80%8C%E3%83%8E%E3%82%A4%E3%82%BA%E3%82%92%E5%BD%93%E3%81%A6%E3%82%8B%E3%80%8D%E3%81%93%E3%81%A8%E3%81%A8%E3%80%8C%E3%82%B9%E3%82%B3%E3%82%A2%E3%82%92%E5%AD%A6%E3%81%B6%E3%80%8D%E3%81%93%E3%81%A8%E3%81%8C%E5%90%8C%E3%81%98%E4%BD%9C%E6%A5%AD%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cnabla%20%5Clog%20q(x_t%20%5Cmid%20x_0)%20%3D%20-%5Cfrac%7B1%7D%7B%5Csqrt%7B1-%5Cbar%7B%5Calpha%7D_t%7D%7D%5C%2C%5Cvarepsilon_0%2C%0A%20%20%20%20%5Cqquad%0A%20%20%20%20%5Cnabla%20%5Clog%20p(x_t)%20%3D%20-%5Cfrac%7B%5Cmathbb%7BE%7D%5C!%5Cleft%5B%5Cvarepsilon_0%20%5Cmid%20x_t%5Cright%5D%7D%7B%5Csqrt%7B1-%5Cbar%7B%5Calpha%7D_t%7D%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20**%E3%81%93%E3%81%AE%20notebook%20%E3%81%AF2%E3%81%A4%E7%9B%AE%E3%80%81%E3%83%8E%E3%82%A4%E3%82%BA%E4%BA%88%E6%B8%AC%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%BE%E3%81%99%E3%80%82**%20%E5%AD%A6%E7%BF%92%E5%AF%BE%E8%B1%A1%E3%81%AF%0A%20%20%20%20%24%5Chat%7B%5Cvarepsilon%7D_%5Ctheta(x_t%2C%20t%2C%20y)%24%20%E3%81%A7%E3%80%81%E5%85%A5%E5%8A%9B%E3%81%AF%E3%83%8E%E3%82%A4%E3%82%BA%E7%94%BB%E5%83%8F%E3%83%BB%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E7%95%AA%E5%8F%B7%E3%83%BB%E3%83%A9%E3%83%99%E3%83%AB%E3%81%AE3%E3%81%A4%E3%80%81%0A%20%20%20%20%E5%87%BA%E5%8A%9B%E3%81%AF%E5%85%A5%E5%8A%9B%E3%81%A8%E5%90%8C%E3%81%98%E5%BD%A2%E3%81%AE%E3%83%8E%E3%82%A4%E3%82%BA%E6%8E%A8%E5%AE%9A%E3%81%A7%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%83%87%E3%83%8E%E3%82%A4%E3%82%B6%E3%81%AE%E5%AE%9F%E8%A3%85%0A%0A%20%20%20%20%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E7%95%AA%E5%8F%B7%E3%81%AF%E6%95%B4%E6%95%B0%E3%81%AE%E3%82%B9%E3%82%AB%E3%83%A9%E3%83%BC%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E5%85%A5%E5%8A%9B%E3%81%99%E3%82%8B%E3%81%A8%E8%A1%A8%E7%8F%BE%E5%8A%9B%E3%81%8C%E8%B6%B3%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%0A%20%20%20%20Transformer%20%E3%81%A8%E5%90%8C%E3%81%98%20**sinusoidal%20embedding**%20%E3%81%A7%E5%91%A8%E6%B3%A2%E6%95%B0%E3%81%AE%E7%95%B0%E3%81%AA%E3%82%8B%E6%AD%A3%E5%BC%A6%E3%83%BB%E4%BD%99%E5%BC%A6%E3%81%B8%E5%B1%95%E9%96%8B%E3%81%97%E3%80%81%0A%20%20%20%20%E7%B4%B0%E3%81%8B%E3%81%84%E5%A4%89%E5%8C%96%E3%81%A8%E5%A4%A7%E3%81%8D%E3%81%AA%E5%A4%89%E5%8C%96%E3%82%92%E5%90%8C%E6%99%82%E3%81%AB%E8%A1%A8%E3%81%9B%E3%82%8B%E5%BD%A2%E3%81%AB%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89%20MLP%20%E3%81%AB%E9%80%9A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20timestep_embedding(t%2C%20dim)%3A%0A%20%20%20%20half%20%3D%20dim%20%2F%2F%202%0A%20%20%20%20freqs%20%3D%20torch.exp(-math.log(10000.0)%20*%20torch.arange(half%2C%20device%3Dt.device)%20%2F%20half)%0A%20%20%20%20args%20%3D%20t.float().unsqueeze(1)%20*%20freqs.unsqueeze(0)%0A%20%20%20%20return%20torch.cat(%5Btorch.cos(args)%2C%20torch.sin(args)%5D%2C%20dim%3D1)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E6%9C%AC%E4%BD%93%E3%81%AF%E7%95%B3%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%AE%20UNet%20%E3%81%A7%E3%81%99%E3%80%82%E5%85%A8%E7%B5%90%E5%90%88%E3%81%AE%20MLP%20%E3%81%AF%E7%94%BB%E7%B4%A0%E3%81%AE%E9%9A%A3%E6%8E%A5%E9%96%A2%E4%BF%82%E3%82%92%E6%A7%8B%E9%80%A0%E3%81%A8%E3%81%97%E3%81%A6%E6%8C%81%E3%81%9F%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%80%81%0A%20%20%20%20%E5%90%8C%E3%81%98%E4%BD%8D%E7%BD%AE%E9%96%A2%E4%BF%82%E3%82%92%E6%AF%8E%E5%9B%9E%E5%AD%A6%E3%81%B3%E7%9B%B4%E3%81%99%E5%BF%85%E8%A6%81%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E7%95%B3%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%AA%E3%82%89%E9%87%8D%E3%81%BF%E3%82%92%E5%85%B1%E6%9C%89%E3%81%97%E3%81%9F%E3%81%BE%E3%81%BE%E5%B1%80%E6%89%80%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%92%0A%20%20%20%20%E6%89%B1%E3%81%88%E3%82%8B%E3%81%AE%E3%81%A7%E3%80%81%E5%90%8C%E3%81%98%E5%AD%A6%E7%BF%92%E9%87%8F%E3%81%A7%E3%82%82%E8%BC%AA%E9%83%AD%E3%82%92%E6%8D%89%E3%81%88%E3%82%84%E3%81%99%E3%81%8F%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%E6%AE%8B%E5%B7%AE%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%A7%E7%89%B9%E5%BE%B4%E3%82%92%E6%8A%BD%E5%87%BA%E3%81%97%E3%81%A4%E3%81%A4%0A%20%20%20%202%E5%9B%9E%E3%83%80%E3%82%A6%E3%83%B3%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%97%EF%BC%8828%E2%86%9214%E2%86%927%EF%BC%89%E3%80%81skip%20connection%20%E3%82%92%E3%81%A4%E3%81%AA%E3%81%84%E3%81%A7%E5%85%83%E3%81%AE%E8%A7%A3%E5%83%8F%E5%BA%A6%E3%81%B8%E6%88%BB%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20-%20%60ResidualBlock%60%EF%BC%9A%E5%85%A5%E5%8A%9B%E3%81%AF%E7%89%B9%E5%BE%B4%E3%83%9E%E3%83%83%E3%83%97%E3%81%A8%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%80%82%E7%95%B3%E3%81%BF%E8%BE%BC%E3%81%BF2%E5%B1%A4%E3%81%A8%20GroupNorm%20%E3%81%A7%0A%20%20%20%20%20%20%E5%A4%89%E6%8F%9B%E3%81%97%E3%80%81%E9%80%94%E4%B8%AD%E3%81%A7%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%83%BB%E3%83%A9%E3%83%99%E3%83%AB%E3%81%AE%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%82%92%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E6%96%B9%E5%90%91%E3%81%AE%E3%83%90%E3%82%A4%E3%82%A2%E3%82%B9%E3%81%A8%E3%81%97%E3%81%A6%E5%8A%A0%E7%AE%97%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%20%20%E5%87%BA%E5%8A%9B%E3%81%AF%E6%8C%87%E5%AE%9A%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%E6%95%B0%E3%81%AE%E7%89%B9%E5%BE%B4%E3%83%9E%E3%83%83%E3%83%97%E3%81%A7%E3%81%99%E3%80%82%0A%20%20%20%20-%20%60Denoiser%60%EF%BC%9A%E5%85%A5%E5%8A%9B%E3%81%AF%E3%83%8E%E3%82%A4%E3%82%BA%E7%94%BB%E5%83%8F%20%60x%60%E3%80%81%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%20%60t%60%E3%80%81%E3%83%A9%E3%83%99%E3%83%AB%20%60labels%60%E3%80%82%0A%20%20%20%20%20%20%E5%87%BA%E5%8A%9B%E3%81%AF%20%60x%60%20%E3%81%A8%E5%90%8C%E3%81%98%E5%BD%A2%E3%81%AE%E3%83%8E%E3%82%A4%E3%82%BA%E6%8E%A8%E5%AE%9A%E3%81%A7%E3%81%99%E3%80%82%E3%83%A9%E3%83%99%E3%83%AB%E5%9F%8B%E3%82%81%E8%BE%BC%E3%81%BF%E3%81%AF11%E7%A8%AE%E9%A1%9E%E3%81%82%E3%82%8A%E3%80%81%0A%20%20%20%20%20%20%E6%9C%AB%E5%B0%BE%E3%81%AE%20%60null_label%60%EF%BC%88%3D10%EF%BC%89%E3%81%8C%E3%80%8C%E6%9D%A1%E4%BB%B6%E3%81%AA%E3%81%97%E3%80%8D%E3%82%92%E8%A1%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%82%8C%E3%81%8C%E5%BE%8C%E8%BF%B0%E3%81%AE%0A%20%20%20%20%20%20classifier-free%20guidance%20%E3%81%A7%E4%BD%BF%E3%81%86%E7%84%A1%E6%9D%A1%E4%BB%B6%E5%81%B4%E3%81%AE%E5%85%A5%E5%8A%9B%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%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_()%3A%0A%20%20%20%20class%20ResidualBlock(nn.Module)%3A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20in_channels%2C%20out_channels%2C%20embed_dim)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20%20%20%20%20self.conv1%20%3D%20nn.Conv2d(in_channels%2C%20out_channels%2C%203%2C%20padding%3D1)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.conv2%20%3D%20nn.Conv2d(out_channels%2C%20out_channels%2C%203%2C%20padding%3D1)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.norm1%20%3D%20nn.GroupNorm(8%2C%20out_channels)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.norm2%20%3D%20nn.GroupNorm(8%2C%20out_channels)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.embed%20%3D%20nn.Linear(embed_dim%2C%20out_channels)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.skip%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.Conv2d(in_channels%2C%20out_channels%2C%201)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20in_channels%20!%3D%20out_channels%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20nn.Identity()%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20def%20forward(self%2C%20x%2C%20embedding)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%20F.silu(self.norm1(self.conv1(x)))%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%20h%20%2B%20self.embed(embedding).unsqueeze(-1).unsqueeze(-1)%0A%20%20%20%20%20%20%20%20%20%20%20%20h%20%3D%20F.silu(self.norm2(self.conv2(h)))%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20h%20%2B%20self.skip(x)%0A%0A%20%20%20%20class%20Denoiser(nn.Module)%3A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20base%3D64%2C%20embed_dim%3D128%2C%20num_labels%3D10)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20%20%20%20%20self.embed_dim%20%3D%20embed_dim%0A%20%20%20%20%20%20%20%20%20%20%20%20self.null_label%20%3D%20num_labels%0A%20%20%20%20%20%20%20%20%20%20%20%20self.time_mlp%20%3D%20nn.Sequential(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.Linear(embed_dim%2C%20embed_dim)%2C%20nn.SiLU()%2C%20nn.Linear(embed_dim%2C%20embed_dim)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.label_embedding%20%3D%20nn.Embedding(num_labels%20%2B%201%2C%20embed_dim)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.stem%20%3D%20nn.Conv2d(1%2C%20base%2C%203%2C%20padding%3D1)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.down1%20%3D%20ResidualBlock(base%2C%20base%2C%20embed_dim)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.down2%20%3D%20ResidualBlock(base%2C%20base%20*%202%2C%20embed_dim)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.middle%20%3D%20ResidualBlock(base%20*%202%2C%20base%20*%202%2C%20embed_dim)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.up2%20%3D%20ResidualBlock(base%20*%204%2C%20base%2C%20embed_dim)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.up1%20%3D%20ResidualBlock(base%20*%202%2C%20base%2C%20embed_dim)%0A%20%20%20%20%20%20%20%20%20%20%20%20self.head%20%3D%20nn.Sequential(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.GroupNorm(8%2C%20base)%2C%20nn.SiLU()%2C%20nn.Conv2d(base%2C%201%2C%203%2C%20padding%3D1)%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20def%20forward(self%2C%20x%2C%20t%2C%20labels)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20embedding%20%3D%20self.time_mlp(timestep_embedding(t%2C%20self.embed_dim))%0A%20%20%20%20%20%20%20%20%20%20%20%20embedding%20%3D%20embedding%20%2B%20self.label_embedding(labels)%0A%20%20%20%20%20%20%20%20%20%20%20%20h0%20%3D%20self.stem(x)%0A%20%20%20%20%20%20%20%20%20%20%20%20h1%20%3D%20self.down1(h0%2C%20embedding)%0A%20%20%20%20%20%20%20%20%20%20%20%20h2%20%3D%20self.down2(F.avg_pool2d(h1%2C%202)%2C%20embedding)%0A%20%20%20%20%20%20%20%20%20%20%20%20h3%20%3D%20self.middle(F.avg_pool2d(h2%2C%202)%2C%20embedding)%0A%20%20%20%20%20%20%20%20%20%20%20%20u2%20%3D%20self.up2(torch.cat(%5BF.interpolate(h3%2C%20scale_factor%3D2)%2C%20h2%5D%2C%20dim%3D1)%2C%20embedding)%0A%20%20%20%20%20%20%20%20%20%20%20%20u1%20%3D%20self.up1(torch.cat(%5BF.interpolate(u2%2C%20scale_factor%3D2)%2C%20h1%5D%2C%20dim%3D1)%2C%20embedding)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20self.head(u1)%0A%0A%20%20%20%20return%20(Denoiser%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E5%AD%A6%E7%BF%92%0A%0A%20%20%20%20%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E7%94%9F%E6%88%90%E3%81%8B%E3%82%89%E5%AD%A6%E7%BF%92%E3%81%BE%E3%81%A7%E3%82%921%E3%81%A4%E3%81%AE%E3%82%BB%E3%83%AB%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%80%81%E5%AD%A6%E7%BF%92%E6%B8%88%E3%81%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%20%60trained_model%60%20%E3%81%A8%E3%81%97%E3%81%A6%0A%20%20%20%20%E8%BF%94%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E4%BD%9C%E3%82%8B%E3%82%BB%E3%83%AB%E3%81%A8%E5%AD%A6%E7%BF%92%E3%81%99%E3%82%8B%E3%82%BB%E3%83%AB%E3%82%92%E5%88%86%E3%81%91%E3%82%8B%E3%81%A8%E3%80%81marimo%20%E3%81%AE%E4%BE%9D%E5%AD%98%E3%82%B0%E3%83%A9%E3%83%95%E4%B8%8A%E3%81%AF%0A%20%20%20%20%E3%80%8C%E5%AD%A6%E7%BF%92%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E3%83%A2%E3%83%87%E3%83%AB%E3%81%8C%E5%A4%89%E5%8C%96%E3%81%97%E3%81%9F%E3%81%93%E3%81%A8%E3%80%8D%E3%81%8C%E8%A1%A8%E7%8F%BE%E3%81%A7%E3%81%8D%E3%81%9A%E3%80%81%E7%94%9F%E6%88%90%E3%82%BB%E3%83%AB%E3%81%8C%E6%9C%AA%E5%AD%A6%E7%BF%92%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%0A%20%20%20%20%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E5%8F%AF%E8%83%BD%E6%80%A7%E3%81%8C%E3%81%82%E3%82%8B%E3%81%9F%E3%82%81%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%201%E5%9B%9E%E3%81%AE%E6%9B%B4%E6%96%B0%E3%81%A7%E3%81%AF%E3%80%81%E3%83%90%E3%83%83%E3%83%81%E3%81%94%E3%81%A8%E3%81%AB%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%20%24t%24%20%E3%82%92%E4%B8%80%E6%A7%98%E4%B9%B1%E6%95%B0%E3%81%A7%E9%81%B8%E3%81%B3%E3%80%81%60q_sample%60%20%E3%81%A7%E3%83%8E%E3%82%A4%E3%82%BA%E7%94%BB%E5%83%8F%20%24x_t%24%20%E3%82%92%0A%20%20%20%20%E4%BD%9C%E3%82%8A%E3%80%81%E5%8A%A0%E3%81%88%E3%81%9F%E3%83%8E%E3%82%A4%E3%82%BA%E3%82%92%E5%BD%93%E3%81%A6%E3%82%8B%E4%BA%8C%E4%B9%97%E8%AA%A4%E5%B7%AE%E3%82%92%E6%9C%80%E5%B0%8F%E5%8C%96%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%83%8E%E3%82%A4%E3%82%BA%E4%BA%88%E6%B8%AC%E3%81%AE%E8%A7%A3%E9%87%88%E3%81%A7%0A%20%20%20%20denoising%20matching%20term%20%E3%82%92%E6%95%B4%E7%90%86%E3%81%99%E3%82%8B%E3%81%A8%E3%80%81%E8%AB%96%E6%96%87%E3%81%AE%E7%9B%AE%E7%9A%84%E9%96%A2%E6%95%B0%E3%81%AF%E6%AC%A1%E3%81%AE%E9%87%8D%E3%81%BF%E4%BB%98%E3%81%8D%E4%BA%8C%E4%B9%97%E8%AA%A4%E5%B7%AE%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Carg%5Cmin_%7B%5Ctheta%7D%20%5Cfrac%7B1%7D%7B2%5Csigma_q%5E2(t)%7D%0A%20%20%20%20%5Cfrac%7B%5Cleft(1-%5Calpha_t%5Cright)%5E2%7D%7B%5Cleft(1-%5Cbar%7B%5Calpha%7D_t%5Cright)%5Calpha_t%7D%0A%20%20%20%20%5Cleft%5ClVert%20%5Cvarepsilon_0%20-%20%5Chat%7B%5Cvarepsilon%7D_%5Ctheta(x_t%2C%20t)%20%5Cright%5CrVert_2%5E2%2C%0A%20%20%20%20%5Cqquad%20t%20%3D%202%2C%20%5Cldots%2C%20T%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E5%AE%9F%E8%A3%85%E3%81%A7%E3%81%AF%E3%80%81DDPM%20%E4%BB%A5%E9%99%8D%E3%81%A7%E5%BA%83%E3%81%8F%E4%BD%BF%E3%82%8F%E3%82%8C%E3%82%8B**%E9%87%8D%E3%81%BF%E3%82%92%E5%A4%96%E3%81%97%E3%81%9F%E7%B0%A1%E7%95%A5%E7%89%88**%E3%82%92%E6%9C%80%E5%B0%8F%E5%8C%96%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%94%E3%81%A8%E3%81%AE%E9%87%8D%E3%81%BF%20%24%5Cfrac%7B1%7D%7B2%5Csigma_q%5E2(t)%7D%5Cfrac%7B(1-%5Calpha_t)%5E2%7D%7B(1-%5Cbar%7B%5Calpha%7D_t)%5Calpha_t%7D%24%0A%20%20%20%20%E3%82%921%E3%81%AB%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%9F%E3%82%82%E3%81%AE%E3%81%A7%E3%80%81ELBO%20%E3%81%9D%E3%81%AE%E3%82%82%E3%81%AE%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81%E5%AD%A6%E7%BF%92%E3%81%8C%E5%AE%89%E5%AE%9A%E3%81%97%E5%AE%9F%E8%A3%85%E3%82%82%E5%8D%98%E7%B4%94%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cmathcal%7BL%7D_%7B%5Ctext%7Bsimple%7D%7D%20%3D%20%5Cmathbb%7BE%7D_%7Bx_0%2C%20t%2C%20%5Cvarepsilon_0%2C%20y%7D%0A%20%20%20%20%5Cleft%5ClVert%20%5Cvarepsilon_0%20-%20%5Chat%7B%5Cvarepsilon%7D_%5Ctheta(x_t%2C%20t%2C%20y)%20%5Cright%5CrVert_2%5E2%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E3%81%93%E3%81%AE%E3%81%A8%E3%81%8D10%25%E3%81%AE%E7%A2%BA%E7%8E%87%E3%81%A7%E3%83%A9%E3%83%99%E3%83%AB%E3%82%92%20%60null_label%60%20%E3%81%AB%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%BE%E3%81%99%E3%80%82%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%81%A8%E6%9D%A1%E4%BB%B6%E3%81%AA%E3%81%97%E3%81%AE%0A%20%20%20%20%E4%B8%A1%E6%96%B9%E3%82%921%E3%81%A4%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AB%E5%AD%A6%E7%BF%92%E3%81%95%E3%81%9B%E3%82%8B%20**classifier-free%20guidance**%20%E3%81%AE%E6%BA%96%E5%82%99%E3%81%A7%E3%80%81%0A%20%20%20%20%E7%94%9F%E6%88%90%E6%99%82%E3%81%AB%E6%9D%A1%E4%BB%B6%E3%81%AE%E5%8A%B9%E3%81%8D%E6%96%B9%E3%82%92%E8%AA%BF%E7%AF%80%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E6%9C%80%E9%81%A9%E5%8C%96%E3%81%AF%20Adam%E3%80%81%E5%AD%A6%E7%BF%92%E7%8E%87%E3%81%AF%20%242%5Ctimes10%5E%7B-4%7D%24%E3%80%81%E3%82%A8%E3%83%9D%E3%83%83%E3%82%AF%E6%95%B0%E3%81%AF15%E3%81%A7%E3%81%99%E3%80%82%0A%20%20%20%20%24%5Cvarepsilon_0%24%20%E3%81%AF%E6%A8%99%E6%BA%96%E6%AD%A3%E8%A6%8F%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%E3%83%8E%E3%82%A4%E3%82%BA%E3%82%92%E5%85%A8%E3%81%8F%E4%BA%88%E6%B8%AC%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E8%AA%A4%E5%B7%AE%E3%81%AF%E3%81%8A%E3%82%88%E3%81%9D%20**1.0**%20%E3%81%A7%E3%81%99%E3%80%82%0A%20%20%20%20%E5%AD%A6%E7%BF%92%E5%BE%8C%E3%81%AE%E5%80%A4%E3%81%8C%E3%81%93%E3%82%8C%E3%82%92%E5%A4%A7%E3%81%8D%E3%81%8F%E4%B8%8B%E5%9B%9E%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%80%81%E3%83%A2%E3%83%87%E3%83%AB%E3%81%8C%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E6%9C%80%E4%BD%8E%E6%9D%A1%E4%BB%B6%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%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_(Denoiser%2C%20device%2C%20num_steps%2C%20q_sample%2C%20train_loader)%3A%0A%20%20%20%20trained_model%20%3D%20Denoiser().to(device)%0A%20%20%20%20optimizer%20%3D%20torch.optim.Adam(trained_model.parameters()%2C%20lr%3D2e-4)%0A%20%20%20%20history_rows%20%3D%20%5B%5D%0A%20%20%20%20training_start%20%3D%20time.time()%0A%20%20%20%20for%20epoch%20in%20range(1%2C%2016)%3A%0A%20%20%20%20%20%20%20%20trained_model.train()%0A%20%20%20%20%20%20%20%20running_loss%20%3D%200.0%0A%20%20%20%20%20%20%20%20running_items%20%3D%200%0A%20%20%20%20%20%20%20%20for%20_batch%2C%20_labels%20in%20train_loader%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_batch%20%3D%20_batch.to(device)%0A%20%20%20%20%20%20%20%20%20%20%20%20_labels%20%3D%20_labels.to(device)%0A%20%20%20%20%20%20%20%20%20%20%20%20timestep%20%3D%20torch.randint(0%2C%20num_steps%2C%20(_batch.shape%5B0%5D%2C)%2C%20device%3Ddevice)%0A%20%20%20%20%20%20%20%20%20%20%20%20noise%20%3D%20torch.randn_like(_batch)%0A%20%20%20%20%20%20%20%20%20%20%20%20noisy_batch%20%3D%20q_sample(_batch%2C%20timestep%2C%20noise)%0A%20%20%20%20%20%20%20%20%20%20%20%20conditioned_labels%20%3D%20_labels.clone()%0A%20%20%20%20%20%20%20%20%20%20%20%20conditioned_labels%5Btorch.rand(_batch.shape%5B0%5D%2C%20device%3Ddevice)%20%3C%200.1%5D%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20trained_model.null_label%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20loss%20%3D%20F.mse_loss(trained_model(noisy_batch%2C%20timestep%2C%20conditioned_labels)%2C%20noise)%0A%20%20%20%20%20%20%20%20%20%20%20%20optimizer.zero_grad()%0A%20%20%20%20%20%20%20%20%20%20%20%20loss.backward()%0A%20%20%20%20%20%20%20%20%20%20%20%20optimizer.step()%0A%20%20%20%20%20%20%20%20%20%20%20%20running_loss%20%2B%3D%20loss.item()%20*%20_batch.shape%5B0%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20running_items%20%2B%3D%20_batch.shape%5B0%5D%0A%20%20%20%20%20%20%20%20history_rows.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22epoch%22%3A%20epoch%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22train_loss%22%3A%20running_loss%20%2F%20running_items%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22elapsed_sec%22%3A%20round(time.time()%20-%20training_start%2C%201)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20history_frame%20%3D%20pd.DataFrame(history_rows)%0A%20%20%20%20return%20history_frame%2C%20trained_model%0A%0A%0A%40app.cell(hide_code%3DTrue)%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%97%E3%81%9F%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E8%A6%8F%E6%A8%A1%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E6%AC%A1%E3%81%AE%E8%A1%A8%E3%81%AF%E5%A5%87%E6%95%B0%E3%82%A8%E3%83%9D%E3%83%83%E3%82%AF%E3%81%AE%E6%90%8D%E5%A4%B1%E3%81%AE%E6%8A%9C%E7%B2%8B%E3%81%A7%E3%80%81%0A%20%20%20%20%E5%85%A8%E3%82%A8%E3%83%9D%E3%83%83%E3%82%AF%E3%81%AE%E6%8E%A8%E7%A7%BB%E3%81%AF%E3%81%9D%E3%81%AE%E4%B8%8B%E3%81%AE%E5%AF%BE%E6%95%B0%E8%BB%B8%E3%81%AE%E3%82%B0%E3%83%A9%E3%83%95%E3%81%8B%E3%82%89%E8%AA%AD%E3%81%BF%E5%8F%96%E3%82%8C%E3%81%BE%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_(trained_model)%3A%0A%20%20%20%20_parameter_count%20%3D%20sum(_p.numel()%20for%20_p%20in%20trained_model.parameters())%0A%20%20%20%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22item%22%3A%20%5B%22parameters%22%2C%20%22optimizer%22%2C%20%22learning%20rate%22%2C%20%22epochs%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22value%22%3A%20%5Bf%22%7B_parameter_count%20%2F%201e6%3A.2f%7DM%22%2C%20%22Adam%22%2C%20%222e-4%22%2C%2015%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(history_frame)%3A%0A%20%20%20%20history_frame%5Bhistory_frame%5B%22epoch%22%5D%20%25%202%20%3D%3D%201%5D.reset_index(drop%3DTrue)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(history_frame)%3A%0A%20%20%20%20_fig%2C%20_ax%20%3D%20plt.subplots(figsize%3D(6%2C%204))%0A%20%20%20%20_ax.plot(history_frame%5B%22epoch%22%5D%2C%20history_frame%5B%22train_loss%22%5D%2C%20marker%3D%22o%22%2C%20label%3D%22train%20loss%22)%0A%20%20%20%20_ax.axhline(1.0%2C%20color%3D%22tab%3Ared%22%2C%20linestyle%3D%22--%22%2C%20label%3D%22uninformed%20baseline%22)%0A%20%20%20%20_ax.set_yscale(%22log%22)%0A%20%20%20%20_ax.set_xlabel(%22epoch%22)%0A%20%20%20%20_ax.set_ylabel(%22MSE%20on%20predicted%20noise%22)%0A%20%20%20%20_ax.set_title(%22Diffusion%20training%20loss%22)%0A%20%20%20%20_ax.legend()%0A%20%20%20%20_fig.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%A8%20Guidance%0A%0A%20%20%20%20%E7%94%9F%E6%88%90%E3%81%AF%20%24x_T%20%5Csim%20%5Cmathcal%7BN%7D(0%2C%20I)%24%20%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%80%81%24t%20%3D%20T%24%20%E3%81%8B%E3%82%89%20%24t%20%3D%201%24%20%E3%81%B8%E9%80%86%E5%90%91%E3%81%8D%E3%81%AB%E9%80%B2%E3%82%81%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E3%83%8E%E3%82%A4%E3%82%BA%E4%BA%88%E6%B8%AC%E3%81%AE%E8%A7%A3%E9%87%88%E3%81%A7%E3%81%AF%E3%80%81%24%5Cmu_q%24%20%E3%81%AE%20%24x_0%24%20%E3%82%92%0A%20%20%20%20%24x_0%20%3D%20(x_t%20-%20%5Csqrt%7B1-%5Cbar%7B%5Calpha%7D_t%7D%5C%2C%5Cvarepsilon_0)%2F%5Csqrt%7B%5Cbar%7B%5Calpha%7D_t%7D%24%20%E3%81%A7%0A%20%20%20%20%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%A6%E6%95%B4%E7%90%86%E3%81%A7%E3%81%8D%E3%80%81%24%5Cmu_%5Ctheta%24%20%E3%81%AF%E6%AC%A1%E3%81%AE%E5%BD%A2%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E5%AE%9F%E8%A3%85%E3%81%AE%20%60mean%60%20%E3%81%AF%E3%81%93%E3%81%AE%E5%BC%8F%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Cmu_%5Ctheta(x_t%2C%20t)%20%3D%20%5Cfrac%7B1%7D%7B%5Csqrt%7B%5Calpha_t%7D%7D%5C%2Cx_t%0A%20%20%20%20-%5Cfrac%7B1-%5Calpha_t%7D%7B%5Csqrt%7B1-%5Cbar%7B%5Calpha%7D_t%7D%5C%2C%5Csqrt%7B%5Calpha_t%7D%7D%5C%2C%5Chat%7B%5Cvarepsilon%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E5%88%86%E6%95%A3%E3%81%AB%E3%81%AF%E3%80%81ELBO%20%E3%81%AE%E5%88%86%E8%A7%A3%E3%81%A7%E7%8F%BE%E3%82%8C%E3%81%9F%E7%9C%9F%E3%81%AE%E5%BE%8C%E3%82%8D%E5%90%91%E3%81%8D%E9%81%B7%E7%A7%BB%E3%81%AE%E5%88%86%E6%95%A3%20%24%5Csigma_q%5E2(t)%24%20%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%241-%5Calpha_t%24%20%E3%82%92%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE%E4%BD%BF%E3%81%86%E3%82%88%E3%82%8A%E7%B5%82%E7%9B%A4%E3%81%A7%E4%B9%97%E3%82%8B%E3%83%8E%E3%82%A4%E3%82%BA%E3%81%8C%E5%B0%8F%E3%81%95%E3%81%8F%E3%81%AA%E3%82%8A%E3%80%81%E8%BC%AA%E9%83%AD%E3%81%8C%E3%81%AF%E3%81%A3%E3%81%8D%E3%82%8A%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%E6%9C%80%E5%BE%8C%E3%81%AE1%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%EF%BC%88%24t%3D1%24%EF%BC%89%E3%81%A7%E3%83%8E%E3%82%A4%E3%82%BA%E3%82%92%E5%8A%A0%E3%81%88%E3%81%AA%E3%81%84%E3%81%AE%E3%81%AF%E3%80%81%E7%A9%BA%E7%A9%8D%E3%81%AE%E7%B4%84%E6%9D%9F%20%24%5Cbar%7B%5Calpha%7D_0%20%3D%201%24%20%E3%82%92%E5%85%A5%E3%82%8C%E3%82%8B%E3%81%A8%0A%20%20%20%20%24%5Csigma_q%5E2(1)%3D0%24%20%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%81%A7%E3%80%81%E5%90%8C%E3%81%98%E5%BC%8F%E3%81%AE%E8%87%AA%E7%84%B6%E3%81%AA%E5%B8%B0%E7%B5%90%E3%81%A7%E3%81%99%E3%80%82%E3%81%AA%E3%81%8A%20ELBO%20%E3%81%AE%E4%B8%8A%E3%81%A7%E3%81%AF%20%24t%3D1%24%20%E3%81%AF%0A%20%20%20%20denoising%20matching%20term%20%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%20reconstruction%20term%20%E3%81%8C%E6%8B%85%E5%BD%93%E3%81%99%E3%82%8B%E7%AF%84%E5%9B%B2%E3%81%AB%E3%81%82%E3%81%9F%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Csigma_q%5E2(t)%20%3D%20%5Cfrac%7B%5Cleft(1-%5Calpha_t%5Cright)%5Cleft(1-%5Cbar%7B%5Calpha%7D_%7Bt-1%7D%5Cright)%7D%7B1-%5Cbar%7B%5Calpha%7D_t%7D%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E6%8E%A8%E5%AE%9A%E3%83%8E%E3%82%A4%E3%82%BA%20%24%5Chat%7B%5Cvarepsilon%7D%24%20%E3%81%AF%20**classifier-free%20guidance**%20%E3%81%A7%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E8%AB%96%E6%96%87%E3%81%AF%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%AE%0A%20%20%20%20Bayes%20%E5%88%86%E8%A7%A3%E3%81%8B%E3%82%89%E3%80%81guidance%20%E3%82%92%E3%81%8B%E3%81%91%E3%81%9F%E3%82%B9%E3%82%B3%E3%82%A2%E3%82%92%E7%84%A1%E6%9D%A1%E4%BB%B6%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%A8%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%AE%E5%A4%96%E6%8C%BF%E3%81%A8%E3%81%97%E3%81%A6%0A%20%20%20%20%E6%9B%B8%E3%81%91%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E7%A4%BA%E3%81%97%E3%80%81%E5%BC%B7%E5%BA%A6%E3%82%92%20%24%5Cgamma%24%20%E3%81%A7%E8%A1%A8%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%24%5Cgamma%3D1%24%20%E3%81%8C%20guidance%20%E3%81%AA%E3%81%97%E3%81%AE%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%83%A2%E3%83%87%E3%83%AB%E3%80%81%0A%20%20%20%20%24%5Cgamma%3D0%24%20%E3%81%8C%E6%9D%A1%E4%BB%B6%E3%82%92%E7%84%A1%E8%A6%96%E3%81%97%E3%81%9F%E7%84%A1%E6%9D%A1%E4%BB%B6%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A7%E3%80%81%24%5Cgamma%3E1%24%20%E3%81%BB%E3%81%A9%E3%83%A9%E3%83%99%E3%83%AB%E3%81%B8%E3%81%AE%E5%BF%A0%E5%AE%9F%E5%BA%A6%E3%81%8C%E4%B8%8A%E3%81%8C%E3%82%8A%0A%20%20%20%20%E5%A4%9A%E6%A7%98%E6%80%A7%E3%81%AF%E4%B8%8B%E3%81%8C%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%81%93%E3%81%A7%E3%81%AF%20%24%5Cgamma%3D2%24%20%E3%82%92%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Ctilde%7Bs%7D_%5Cgamma(x_t%2C%20y)%20%3D%20%5Cnabla%20%5Clog%20p(x_t)%0A%20%20%20%20%2B%5Cgamma%5Cleft(%5Cnabla%20%5Clog%20p(x_t%20%5Cmid%20y)%20-%20%5Cnabla%20%5Clog%20p(x_t)%5Cright)%0A%20%20%20%20%3D%20%5Cgamma%20%5Cnabla%20%5Clog%20p(x_t%20%5Cmid%20y)%20%2B%20(1-%5Cgamma)%5Cnabla%20%5Clog%20p(x_t)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E5%B7%A6%E8%BE%BA%E3%81%AF%20guidance%20%E3%82%92%E3%81%8B%E3%81%91%E3%81%9F%E5%BE%8C%E3%81%AE%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%A7%E3%80%81%24%5Cgamma%20%5Cne%201%24%20%E3%81%A7%E3%81%AF%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%9D%E3%81%AE%E3%82%82%E3%81%AE%E3%81%A8%E3%81%AF%0A%20%20%20%20%E4%B8%80%E8%87%B4%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E3%82%B9%E3%82%B3%E3%82%A2%E3%81%A8%E3%83%8E%E3%82%A4%E3%82%BA%E3%81%AF%E5%89%8D%E7%AF%80%E3%81%AE%E9%96%A2%E4%BF%82%E3%81%A7%E7%B5%90%E3%81%B0%E3%82%8C%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%E5%90%8C%E3%81%98%E5%BC%8F%E3%82%92%E3%83%8E%E3%82%A4%E3%82%BA%E6%8E%A8%E5%AE%9A%E3%81%AB%0A%20%20%20%20%E8%AA%AD%E3%81%BF%E6%9B%BF%E3%81%88%E3%81%9F%E3%82%82%E3%81%AE%E3%81%8C%E5%AE%9F%E8%A3%85%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E7%84%A1%E6%9D%A1%E4%BB%B6%E5%81%B4%E3%81%AE%E5%85%A5%E5%8A%9B%E3%81%AF%0A%20%20%20%20%E3%83%A9%E3%83%99%E3%83%AB%E3%82%92%20%60null_label%60%EF%BC%88%24%5Cvarnothing%24%EF%BC%89%E3%81%AB%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%81%9F%E3%82%82%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%20%24%24%0A%20%20%20%20%5Chat%7B%5Cvarepsilon%7D%20%3D%20%5Chat%7B%5Cvarepsilon%7D_%5Ctheta(x_t%2C%20t%2C%20%5Cvarnothing)%0A%20%20%20%20%2B%5Cgamma%5Cleft(%5Chat%7B%5Cvarepsilon%7D_%5Ctheta(x_t%2C%20t%2C%20y)%20-%20%5Chat%7B%5Cvarepsilon%7D_%5Ctheta(x_t%2C%20t%2C%20%5Cvarnothing)%5Cright)%0A%20%20%20%20%24%24%0A%0A%20%20%20%20%E6%9D%A1%E4%BB%B6%E4%BB%98%E3%81%8D%E3%81%A8%E6%9D%A1%E4%BB%B6%E3%81%AA%E3%81%97%E3%81%AF1%E3%81%A4%E3%81%AE%E3%83%90%E3%83%83%E3%83%81%E3%81%B8%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A61%E5%9B%9E%E3%81%A7%E6%8E%A8%E8%AB%96%E3%81%97%E3%80%81%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E6%95%B0400%E3%81%B6%E3%82%93%E3%81%AE%0A%20%20%20%20%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E5%9B%9E%E6%95%B0%E3%82%92%E5%8D%8A%E5%88%86%E3%81%AB%E6%8A%91%E3%81%88%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82%60sample_images%60%20%E3%81%AE%E5%85%A5%E5%8A%9B%E3%81%AF%E7%94%9F%E6%88%90%E3%81%97%E3%81%9F%E3%81%84%E3%83%A9%E3%83%99%E3%83%AB%E5%88%97%E3%81%A8%0A%20%20%20%20guidance%20%E5%BC%B7%E5%BA%A6%20%24%5Cgamma%24%EF%BC%88%E5%BC%95%E6%95%B0%20%60guidance_scale%60%E3%80%81%E6%97%A2%E5%AE%9A%E5%80%A42.0%EF%BC%89%E3%80%81%E6%88%BB%E3%82%8A%E5%80%A4%E3%81%AF%E6%AC%A1%E3%81%AE3%E3%81%A4%E7%B5%84%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%20-%20%E6%9C%80%E7%B5%82%E7%9A%84%E3%81%AA%E7%94%9F%E6%88%90%E7%94%BB%E5%83%8F%EF%BC%88%E3%83%A9%E3%83%99%E3%83%AB%E6%95%B0%20%C3%97%201%20%C3%97%2028%20%C3%97%2028%EF%BC%89%0A%20%20%20%20-%20%60snapshots%60%EF%BC%9A%E4%BB%A3%E8%A1%A8%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%AE%E6%9B%B4%E6%96%B0%E7%9B%B4%E5%BE%8C%E3%81%AE%E7%8A%B6%E6%85%8B%E3%80%82%E9%9D%99%E6%AD%A2%E7%94%BB%E3%81%AE%E4%B8%80%E8%A6%A7%E8%A1%A8%E7%A4%BA%E3%81%AB%E4%BD%BF%E3%81%84%E3%81%BE%E3%81%99%0A%20%20%20%20-%20%60frames%60%EF%BC%9A8%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%8A%E3%81%8D%E3%81%AE%E4%B8%AD%E9%96%93%E7%B5%90%E6%9E%9C%E3%80%82GIF%20%E3%81%AE%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(alpha_bars%2C%20alphas%2C%20betas%2C%20device%2C%20num_steps%2C%20trained_model)%3A%0A%20%20%20%20%40torch.no_grad()%0A%20%20%20%20def%20sample_images(labels%2C%20guidance_scale%3D2.0)%3A%0A%20%20%20%20%20%20%20%20trained_model.eval()%0A%20%20%20%20%20%20%20%20x%20%3D%20torch.randn(len(labels)%2C%201%2C%2028%2C%2028%2C%20device%3Ddevice)%0A%20%20%20%20%20%20%20%20labels%20%3D%20labels.to(device)%0A%20%20%20%20%20%20%20%20null_labels%20%3D%20torch.full_like(labels%2C%20trained_model.null_label)%0A%20%20%20%20%20%20%20%20snapshot_steps%20%3D%20%7B299%2C%20199%2C%2099%2C%2049%2C%200%7D%0A%20%20%20%20%20%20%20%20snapshots%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20frames%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20for%20step%20in%20reversed(range(num_steps))%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20timestep%20%3D%20torch.full((len(labels)%2C)%2C%20step%2C%20device%3Ddevice%2C%20dtype%3Dtorch.long)%0A%20%20%20%20%20%20%20%20%20%20%20%20paired_noise%20%3D%20trained_model(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20torch.cat(%5Bx%2C%20x%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20torch.cat(%5Btimestep%2C%20timestep%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20torch.cat(%5Blabels%2C%20null_labels%5D)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20cond_noise%2C%20uncond_noise%20%3D%20paired_noise.chunk(2)%0A%20%20%20%20%20%20%20%20%20%20%20%20eps%20%3D%20uncond_noise%20%2B%20guidance_scale%20*%20(cond_noise%20-%20uncond_noise)%0A%20%20%20%20%20%20%20%20%20%20%20%20alpha%20%3D%20alphas%5Bstep%5D.to(device)%0A%20%20%20%20%20%20%20%20%20%20%20%20alpha_bar%20%3D%20alpha_bars%5Bstep%5D.to(device)%0A%20%20%20%20%20%20%20%20%20%20%20%20beta%20%3D%20betas%5Bstep%5D.to(device)%0A%20%20%20%20%20%20%20%20%20%20%20%20mean%20%3D%20(x%20-%20beta%20%2F%20torch.sqrt(1.0%20-%20alpha_bar)%20*%20eps)%20%2F%20torch.sqrt(alpha)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20step%20%3E%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20alpha_bar_prev%20%3D%20alpha_bars%5Bstep%20-%201%5D.to(device)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20posterior_var%20%3D%20beta%20*%20(1.0%20-%20alpha_bar_prev)%20%2F%20(1.0%20-%20alpha_bar)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20x%20%3D%20mean%20%2B%20torch.sqrt(posterior_var)%20*%20torch.randn_like(x)%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%20mean%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20step%20in%20snapshot_steps%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20snapshots.append((step%2C%20x.detach().cpu()))%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20step%20%25%208%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20frames.append(x.detach().cpu())%0A%20%20%20%20%20%20%20%20return%20x.detach().cpu()%2C%20snapshots%2C%20frames%0A%0A%20%20%20%20return%20(sample_images%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E7%94%9F%E6%88%90%0A%0A%20%20%20%200%E3%81%8B%E3%82%899%E3%81%AE%E3%83%A9%E3%83%99%E3%83%AB%E3%82%922%E5%B7%A1%E5%88%86%E3%80%81%E5%90%88%E8%A8%8820%E6%9E%9A%E3%82%92%E7%94%9F%E6%88%90%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E5%90%8C%E3%81%98%E3%83%A9%E3%83%99%E3%83%AB%E3%81%A7%E3%82%82%E5%88%9D%E6%9C%9F%E3%83%8E%E3%82%A4%E3%82%BA%E3%81%8C%E7%95%B0%E3%81%AA%E3%82%8B%E3%81%9F%E3%82%81%E3%80%81%0A%20%20%20%20%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%AE%E9%81%95%E3%81%86%E6%95%B0%E5%AD%97%E3%81%8C%E5%BE%97%E3%82%89%E3%82%8C%E3%81%BE%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_(sample_images)%3A%0A%20%20%20%20labels%20%3D%20torch.tensor(list(range(10))%20%2B%20list(range(10)))%0A%20%20%20%20generated%2C%20snapshots%2C%20denoising_frames%20%3D%20sample_images(labels)%0A%20%20%20%20print(f%22generated%20batch%20shape%3A%20%7Btuple(generated.shape)%7D%2C%20gif%20frames%3A%20%7Blen(denoising_frames)%7D%22)%0A%20%20%20%20return%20denoising_frames%2C%20generated%2C%20labels%2C%20snapshots%0A%0A%0A%40app.cell%0Adef%20_(generated%2C%20labels)%3A%0A%20%20%20%20_fig%2C%20_axes%20%3D%20plt.subplots(2%2C%2010%2C%20figsize%3D(12%2C%203))%0A%20%20%20%20for%20_axis%2C%20_image%2C%20_label%20in%20zip(_axes.ravel()%2C%20generated%2C%20labels%2C%20strict%3DFalse)%3A%0A%20%20%20%20%20%20%20%20_axis.imshow(((_image.squeeze(0)%20%2B%201.0)%20%2F%202.0)%2C%20cmap%3D%22gray%22)%0A%20%20%20%20%20%20%20%20_axis.set_title(str(_label.item()))%0A%20%20%20%20%20%20%20%20_axis.axis(%22off%22)%0A%20%20%20%20_fig.suptitle(%22Generated%20digits%20conditioned%20on%20labels%200-9%22%2C%20y%3D1.04)%0A%20%20%20%20_fig.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E9%80%86%E9%81%8E%E7%A8%8B%E3%81%AE%E9%80%94%E4%B8%AD%E7%B5%8C%E9%81%8E%E3%82%92%E6%AE%B5%E9%9A%8E%E3%81%94%E3%81%A8%E3%81%AB%E4%B8%A6%E3%81%B9%E3%81%BE%E3%81%99%E3%80%82%E5%90%84%E8%A1%8C%E3%81%AE%E3%83%A9%E3%83%99%E3%83%AB%20%24t%24%20%E3%81%AF%E3%80%81%E3%81%9D%E3%81%AE%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%81%AE%E6%9B%B4%E6%96%B0%E3%82%92%E7%B5%82%E3%81%88%E3%81%9F%0A%20%20%20%20%E7%9B%B4%E5%BE%8C%E3%81%AE%E7%8A%B6%E6%85%8B%E3%82%92%E8%A1%A8%E3%81%97%E3%80%81%E6%9C%80%E4%B8%8B%E8%A1%8C%E3%81%AE%20%24t%3D0%24%20%E3%81%8C%E6%9C%80%E7%B5%82%E7%9A%84%E3%81%AA%E7%94%9F%E6%88%90%E7%94%BB%E5%83%8F%E3%81%A7%E3%81%99%E3%80%82%E4%B8%8A%E3%81%AE%E8%A1%8C%E3%81%BB%E3%81%A9%E3%83%8E%E3%82%A4%E3%82%BA%E3%81%8C%E5%BC%B7%E3%81%8F%E3%80%81%0A%20%20%20%20%24t%24%20%E3%81%8C100%E3%82%92%E5%88%87%E3%81%A3%E3%81%9F%E3%81%82%E3%81%9F%E3%82%8A%E3%81%8B%E3%82%89%E6%80%A5%E9%80%9F%E3%81%AB%E8%BC%AA%E9%83%AD%E3%81%8C%E5%AE%9A%E3%81%BE%E3%82%8A%E3%81%BE%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_(snapshots)%3A%0A%20%20%20%20_fig%2C%20_axes%20%3D%20plt.subplots(len(snapshots)%2C%2010%2C%20figsize%3D(12%2C%201.3%20*%20len(snapshots)))%0A%20%20%20%20for%20_row%2C%20(_step%2C%20_batch)%20in%20enumerate(snapshots)%3A%0A%20%20%20%20%20%20%20%20for%20_col%20in%20range(10)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_axes%5B_row%2C%20_col%5D.imshow(((_batch%5B_col%2C%200%5D%20%2B%201.0)%20%2F%202.0)%2C%20cmap%3D%22gray%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20_axes%5B_row%2C%20_col%5D.set_xticks(%5B%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20_axes%5B_row%2C%20_col%5D.set_yticks(%5B%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20_col%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20_axes%5B_row%2C%20_col%5D.set_ylabel(f%22t%3D%7B_step%7D%22%2C%20rotation%3D0%2C%20labelpad%3D24%2C%20va%3D%22center%22)%0A%20%20%20%20_fig.suptitle(%22Denoising%20snapshots%20for%20labels%200-9%22%2C%20y%3D0.99)%0A%20%20%20%20_fig.tight_layout()%0A%20%20%20%20_fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E7%94%9F%E6%88%90%E9%81%8E%E7%A8%8B%E3%81%AE%20GIF%0A%0A%20%20%20%20%60frames%60%20%E3%82%921%E6%9E%9A%E3%81%AE%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E7%94%BB%E5%83%8F%E3%81%B8%E4%B8%A6%E3%81%B9%E3%80%81%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%20GIF%20%E3%81%AB%E3%81%97%E3%81%BE%E3%81%99%E3%80%82marimo%20%E3%81%AE%20HTML%20%E5%87%BA%E5%8A%9B%E3%81%AF%0A%20%20%20%20%E5%A4%96%E9%83%A8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%8F%82%E7%85%A7%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%80%81GIF%20%E3%82%92%20base64%20%E3%81%A7%E5%9F%8B%E3%82%81%E8%BE%BC%E3%82%93%E3%81%A0%20%60img%60%20%E8%A6%81%E7%B4%A0%E3%81%A8%E3%81%97%E3%81%A6%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%201%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%81%82%E3%81%9F%E3%82%8A80%E3%83%9F%E3%83%AA%E7%A7%92%E3%80%81%E6%9C%80%E5%BE%8C%E3%81%AE%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%81%A0%E3%81%911.5%E7%A7%92%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%A6%E3%80%81%E5%AE%8C%E6%88%90%E3%81%97%E3%81%9F%E6%95%B0%E5%AD%97%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%82%84%E3%81%99%E3%81%8F%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%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_(denoising_frames)%3A%0A%20%20%20%20_pil_frames%20%3D%20%5B%5D%0A%20%20%20%20for%20_batch%20in%20denoising_frames%3A%0A%20%20%20%20%20%20%20%20_images%20%3D%20((_batch%5B%3A%2C%200%5D.clamp(-1.0%2C%201.0)%20%2B%201.0)%20%2F%202.0%20*%20255.0).to(torch.uint8).numpy()%0A%20%20%20%20%20%20%20%20_canvas%20%3D%20np.full((2%20*%2028%20%2B%203%20*%202%2C%2010%20*%2028%20%2B%2011%20*%202)%2C%20255%2C%20dtype%3Dnp.uint8)%0A%20%20%20%20%20%20%20%20for%20_index%2C%20_image%20in%20enumerate(_images)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_row%2C%20_column%20%3D%20divmod(_index%2C%2010)%0A%20%20%20%20%20%20%20%20%20%20%20%20_top%20%3D%202%20%2B%20_row%20*%2030%0A%20%20%20%20%20%20%20%20%20%20%20%20_left%20%3D%202%20%2B%20_column%20*%2030%0A%20%20%20%20%20%20%20%20%20%20%20%20_canvas%5B_top%20%3A%20_top%20%2B%2028%2C%20_left%20%3A%20_left%20%2B%2028%5D%20%3D%20_image%0A%20%20%20%20%20%20%20%20_pil_frames.append(Image.fromarray(_canvas%2C%20mode%3D%22L%22))%0A%0A%20%20%20%20_buffer%20%3D%20io.BytesIO()%0A%20%20%20%20_pil_frames%5B0%5D.save(%0A%20%20%20%20%20%20%20%20_buffer%2C%0A%20%20%20%20%20%20%20%20format%3D%22GIF%22%2C%0A%20%20%20%20%20%20%20%20save_all%3DTrue%2C%0A%20%20%20%20%20%20%20%20append_images%3D_pil_frames%5B1%3A%5D%2C%0A%20%20%20%20%20%20%20%20duration%3D%5B80%5D%20*%20(len(_pil_frames)%20-%201)%20%2B%20%5B1500%5D%2C%0A%20%20%20%20%20%20%20%20loop%3D0%2C%0A%20%20%20%20)%0A%20%20%20%20_gif_base64%20%3D%20base64.b64encode(_buffer.getvalue()).decode(%22ascii%22)%0A%20%20%20%20mo.Html(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%20%20%20%20%3Cimg%0A%20%20%20%20%20%20%20%20%20%20src%3D%22data%3Aimage%2Fgif%3Bbase64%2C%7B_gif_base64%7D%22%0A%20%20%20%20%20%20%20%20%20%20alt%3D%22%E3%83%A9%E3%83%99%E3%83%AB%200%20%E3%81%8B%E3%82%89%209%20%E3%81%AE%20MNIST%20%E7%94%BB%E5%83%8F%E3%82%92%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E9%80%86%E6%8B%A1%E6%95%A3%E9%81%8E%E7%A8%8B%22%0A%20%20%20%20%20%20%20%20%20%20style%3D%22width%3A%20100%25%3B%20image-rendering%3A%20pixelated%3B%22%0A%20%20%20%20%20%20%20%20%2F%3E%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(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20%E3%83%A9%E3%83%99%E3%83%AB%E5%BF%A0%E5%AE%9F%E5%BA%A6%E3%81%AE%E8%A9%95%E4%BE%A1%0A%0A%20%20%20%20%E8%A6%8B%E3%81%9F%E7%9B%AE%E3%81%AE%E5%8D%B0%E8%B1%A1%E3%81%A0%E3%81%91%E3%81%A7%E3%81%AF%E5%88%A4%E6%96%AD%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%9F%E3%82%81%E3%80%81MNIST%20%E5%88%86%E9%A1%9E%E5%99%A8%E3%82%92%E5%88%A5%E3%81%AB%E5%AD%A6%E7%BF%92%E3%81%97%E3%80%81%0A%20%20%20%20**%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E3%83%A9%E3%83%99%E3%83%AB%E9%80%9A%E3%82%8A%E3%81%AE%E6%95%B0%E5%AD%97%E3%81%8C%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%81%9F%E3%81%8B**%E3%82%92%E5%AE%9A%E9%87%8F%E7%9A%84%E3%81%AB%E6%B8%AC%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%81%93%E3%81%A7%E6%B8%AC%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%AF%0A%20%20%20%20%E3%83%A9%E3%83%99%E3%83%AB%E3%81%B8%E3%81%AE%E5%BF%A0%E5%AE%9F%E5%BA%A6%E3%81%A0%E3%81%91%E3%81%A7%E3%80%81%E5%A4%9A%E6%A7%98%E6%80%A7%E3%82%84%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E4%B8%B8%E6%9A%97%E8%A8%98%E3%81%AE%E6%9C%89%E7%84%A1%E3%81%AF%E5%88%A5%E9%80%94%E3%81%AE%E6%A4%9C%E8%A8%BC%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%A7%E3%81%99%E3%80%82%0A%0A%20%20%20%20%E5%88%86%E9%A1%9E%E5%99%A8%E3%81%AE%E5%85%A5%E5%8A%9B%E3%81%AF28%C3%9728%E3%81%AE%E7%94%BB%E5%83%8F%E3%80%81%E5%87%BA%E5%8A%9B%E3%81%AF10%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AElogit%E3%81%A7%E3%81%99%E3%80%82%E7%95%B3%E3%81%BF%E8%BE%BC%E3%81%BF2%E5%B1%A4%E3%81%A8%E5%85%A8%E7%B5%90%E5%90%882%E5%B1%A4%E3%81%AE%0A%20%20%20%20%E5%B0%8F%E3%81%95%E3%81%AA%E6%A7%8B%E6%88%90%E3%81%A7%E3%80%81%E5%AD%A6%E7%BF%92%E3%83%87%E3%83%BC%E3%82%BF60%2C000%E4%BB%B6%E3%82%922%E3%82%A8%E3%83%9D%E3%83%83%E3%82%AF%E5%AD%A6%E7%BF%92%E3%81%97%E3%81%BE%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_(device%2C%20train_loader)%3A%0A%20%20%20%20class%20Classifier(nn.Module)%3A%0A%20%20%20%20%20%20%20%20def%20__init__(self)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20super().__init__()%0A%20%20%20%20%20%20%20%20%20%20%20%20self.net%20%3D%20nn.Sequential(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.Conv2d(1%2C%2032%2C%203%2C%20padding%3D1)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.ReLU()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.MaxPool2d(2)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.Conv2d(32%2C%2064%2C%203%2C%20padding%3D1)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.ReLU()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.MaxPool2d(2)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.Flatten()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.Linear(64%20*%207%20*%207%2C%20128)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.ReLU()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20nn.Linear(128%2C%2010)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20def%20forward(self%2C%20x)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20self.net(x)%0A%0A%20%20%20%20classifier%20%3D%20Classifier().to(device)%0A%20%20%20%20_optimizer%20%3D%20torch.optim.Adam(classifier.parameters()%2C%20lr%3D1e-3)%0A%20%20%20%20classifier.train()%0A%20%20%20%20for%20_%20in%20range(2)%3A%0A%20%20%20%20%20%20%20%20for%20_batch%2C%20_labels%20in%20train_loader%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_loss%20%3D%20F.cross_entropy(classifier(_batch.to(device))%2C%20_labels.to(device))%0A%20%20%20%20%20%20%20%20%20%20%20%20_optimizer.zero_grad()%0A%20%20%20%20%20%20%20%20%20%20%20%20_loss.backward()%0A%20%20%20%20%20%20%20%20%20%20%20%20_optimizer.step()%0A%20%20%20%20classifier.eval()%0A%20%20%20%20return%20(classifier%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E3%81%BE%E3%81%9A%E5%88%86%E9%A1%9E%E5%99%A8%E3%81%9D%E3%81%AE%E3%82%82%E3%81%AE%E3%82%92%E3%80%81%E5%AD%A6%E7%BF%92%E3%81%AB%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E8%A9%95%E4%BE%A1%E7%94%A810%2C000%E4%BB%B6%E3%81%A7%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E3%81%93%E3%82%8C%E3%81%AF%E5%AE%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AB%0A%20%20%20%20%E5%AF%BE%E3%81%99%E3%82%8B%E5%81%A5%E5%85%A8%E6%80%A7%E3%81%AE%E7%A2%BA%E8%AA%8D%E3%81%A7%E3%81%82%E3%82%8A%E3%80%81%E7%94%9F%E6%88%90%E7%94%BB%E5%83%8F%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E5%88%86%E5%B8%83%E5%A4%96%E3%81%AE%E5%85%A5%E5%8A%9B%E3%81%A7%E3%81%AE%E4%BF%A1%E9%A0%BC%E6%80%A7%E3%81%BE%E3%81%A7%E4%BF%9D%E8%A8%BC%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE%E3%81%A7%E3%81%AF%0A%20%20%20%20%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E4%BB%A5%E9%99%8D%E3%81%AE%E6%8C%87%E6%A8%99%E3%81%AF%E3%80%8C%E3%81%93%E3%81%AE%E5%88%86%E9%A1%9E%E5%99%A8%E3%81%8C%E3%81%A9%E3%81%86%E5%88%A4%E5%AE%9A%E3%81%97%E3%81%9F%E3%81%8B%E3%80%8D%E3%81%A7%E3%81%82%E3%81%A3%E3%81%A6%E3%80%81%E4%BA%BA%E9%96%93%E3%81%AB%E3%82%88%E3%82%8B%E6%AD%A3%E8%AA%A4%E5%88%A4%E5%AE%9A%E3%81%A7%E3%81%AF%0A%20%20%20%20%E3%81%AA%E3%81%84%E7%82%B9%E3%81%AB%E6%B3%A8%E6%84%8F%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%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_(classifier%2C%20device%2C%20test_loader)%3A%0A%20%20%20%20_correct%20%3D%200%0A%20%20%20%20_total%20%3D%200%0A%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20for%20_batch%2C%20_labels%20in%20test_loader%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20_prediction%20%3D%20classifier(_batch.to(device)).argmax(dim%3D1).cpu()%0A%20%20%20%20%20%20%20%20%20%20%20%20_correct%20%2B%3D%20(_prediction%20%3D%3D%20_labels).sum().item()%0A%20%20%20%20%20%20%20%20%20%20%20%20_total%20%2B%3D%20_labels.numel()%0A%20%20%20%20classifier_accuracy%20%3D%20_correct%20%2F%20_total%0A%20%20%20%20print(f%22classifier%20test%20accuracy%3A%20%7Bclassifier_accuracy%3A.4f%7D%22)%0A%20%20%20%20return%20(classifier_accuracy%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%E6%AC%A1%E3%81%AB%E3%80%81%E3%83%A9%E3%83%99%E3%83%AB0%E3%81%8B%E3%82%899%E3%82%92%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C20%E6%9E%9A%E3%81%9A%E3%81%A4%E3%80%81%E5%90%88%E8%A8%88200%E6%9E%9A%E3%82%92%E7%94%9F%E6%88%90%E3%81%97%E3%80%81%E5%88%86%E9%A1%9E%E5%99%A8%E3%81%AE%E4%BA%88%E6%B8%AC%E3%81%A8%0A%20%20%20%20%E6%8C%87%E5%AE%9A%E3%83%A9%E3%83%99%E3%83%AB%E3%81%8C%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%E5%89%B2%E5%90%88%E3%82%92%E6%B8%AC%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%60label_accuracy%60%20%E3%81%8C1%E3%81%AB%E8%BF%91%E3%81%91%E3%82%8C%E3%81%B0%E3%80%81%0A%20%20%20%20%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E6%95%B0%E5%AD%97%E3%81%A8%E3%81%97%E3%81%A6%E8%AA%8D%E8%AD%98%E3%81%95%E3%82%8C%E3%82%8B%E5%BD%A2%E3%81%A7%E7%94%9F%E6%88%90%E3%81%A7%E3%81%8D%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%0A%20%20%20%20%60mean_target_probability%60%20%E3%81%AF**%E6%8C%87%E5%AE%9A%E3%83%A9%E3%83%99%E3%83%AB%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6**%E5%88%86%E9%A1%9E%E5%99%A8%E3%81%8C%E4%B8%8E%E3%81%88%E3%81%9F%E7%A2%BA%E7%8E%87%E3%81%AE%E5%B9%B3%E5%9D%87%E3%81%A7%E3%81%99%E3%80%82%0A%20%20%20%20%E4%BA%88%E6%B8%AC%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E6%9C%80%E5%A4%A7%E7%A2%BA%E7%8E%87%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8F%E6%8C%87%E5%AE%9A%E3%83%A9%E3%83%99%E3%83%AB%E3%81%AE%E7%A2%BA%E7%8E%87%E3%82%92%E8%A6%8B%E3%82%8B%E3%81%93%E3%81%A8%E3%81%A7%E3%80%81%0A%20%20%20%20%E5%88%A5%E3%81%AE%E6%95%B0%E5%AD%97%E3%82%92%E8%87%AA%E4%BF%A1%E3%81%9F%E3%81%A3%E3%81%B7%E3%82%8A%E3%81%AB%E6%8F%8F%E3%81%84%E3%81%9F%E5%A0%B4%E5%90%88%E3%82%92%E8%A6%8B%E9%80%83%E3%81%95%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%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_(classifier%2C%20classifier_accuracy%2C%20device%2C%20sample_images)%3A%0A%20%20%20%20evaluation_labels%20%3D%20torch.arange(10).repeat(20)%0A%20%20%20%20evaluation_images%2C%20_%2C%20_%20%3D%20sample_images(evaluation_labels)%0A%20%20%20%20with%20torch.no_grad()%3A%0A%20%20%20%20%20%20%20%20_logits%20%3D%20classifier(evaluation_images.to(device))%0A%20%20%20%20evaluation_predictions%20%3D%20_logits.argmax(dim%3D1).cpu()%0A%20%20%20%20label_accuracy%20%3D%20(evaluation_predictions%20%3D%3D%20evaluation_labels).float().mean().item()%0A%20%20%20%20_probabilities%20%3D%20_logits.softmax(dim%3D1).cpu()%0A%20%20%20%20mean_target_probability%20%3D%20_probabilities%5B%0A%20%20%20%20%20%20%20%20torch.arange(len(evaluation_labels))%2C%20evaluation_labels%0A%20%20%20%20%5D.mean().item()%0A%20%20%20%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22metric%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22classifier%20test%20accuracy%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22generated%20label%20accuracy%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22generated%20mean%20target%20probability%22%2C%0A%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%22value%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20round(classifier_accuracy%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20round(label_accuracy%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20round(mean_target_probability%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20return%20evaluation_labels%2C%20evaluation_predictions%0A%0A%0A%40app.cell(hide_code%3DTrue)%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%AB%E3%83%A9%E3%83%99%E3%83%AB%E3%81%94%E3%81%A8%E3%81%AE%E5%86%85%E8%A8%B3%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%E7%89%B9%E5%AE%9A%E3%81%AE%E6%95%B0%E5%AD%97%E3%81%A0%E3%81%91%E7%94%9F%E6%88%90%E3%81%AB%E5%A4%B1%E6%95%97%E3%81%97%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%81%8B%E3%80%81%0A%20%20%20%20%E5%81%8F%E3%82%8A%E3%82%92%E8%A6%8B%E3%81%A4%E3%81%91%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E8%A1%A8%E3%81%A7%E3%81%99%E3%80%82%E5%90%84%E3%83%A9%E3%83%99%E3%83%AB20%E6%9E%9A%E3%81%9A%E3%81%A4%E3%81%AE1%E5%9B%9E%E3%81%AE%E8%A9%A6%E8%A1%8C%E3%81%AA%E3%81%AE%E3%81%A7%E3%80%81%0A%20%20%20%20%E5%80%A4%E3%81%8C20%E3%81%A7%E3%81%82%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AF%E3%80%8C%E3%81%9D%E3%81%AE%E8%A9%A6%E8%A1%8C%E3%81%A7%E5%A4%B1%E6%95%97%E3%81%8C%E7%84%A1%E3%81%8B%E3%81%A3%E3%81%9F%E3%80%8D%E3%81%93%E3%81%A8%E3%82%92%E6%84%8F%E5%91%B3%E3%81%97%E3%81%BE%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_(evaluation_labels%2C%20evaluation_predictions)%3A%0A%20%20%20%20per_label_frame%20%3D%20pd.DataFrame(%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22label%22%3A%20list(range(10))%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22correct_of_20%22%3A%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20int(((evaluation_labels%20%3D%3D%20_digit)%20%26%20(evaluation_predictions%20%3D%3D%20_digit)).sum().item())%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20_digit%20in%20range(10)%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20)%0A%20%20%20%20per_label_frame%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
fa8fda6f2d3555c9c1ac2f83913e6cc5