03 進階

手刻去噪 U-Net · 訓練模型生成數字

整條軌道的核心課。前向加噪不用學,要學的是反向去噪:訓練一個 U-Net 看著加噪圖預測「當初加進去的噪聲」。學會預測噪聲,餵純雪花反覆去噪,就生出全新的數字。

手刻去噪 U-Net · 訓練模型生成數字 範例輸出

這堂課的完整程式碼在 Jupyter notebook 裡。點下面按鈕在 Colab 開啟,就能直接執行、修改、實驗——你的修改不會動到原檔。

整條軌道的核心課。前向加噪不用學;要學的是反向去噪。做法出奇地簡單:

核心:預測噪聲

訓練一個神經網路,看著加噪圖 x_t 和時間步 t,把當初加進去的噪聲 ε 預測出來。損失就是「預測的噪聲」和「真正的噪聲」的 MSE。

學會預測噪聲,等於學會了「這張圖該往哪個方向去噪」。我們用一個迷你 U-Net 來當這個去噪器。

這堂課你會學到

  • 親手搭一個 U-Net:下採樣抓全局、上採樣回細節、skip 連接保留細節
  • 怎麼把時間步 t 用正弦編碼餵進去,讓模型知道在去噪的哪個階段
  • 完整的訓練迴圈:隨機抽 t → 加噪 → 預測噪聲 → MSE → 更新
  • 生成:餵純雪花、跑完整反向過程,看數字「長」出來

為什麼 U-Net?

去噪要同時看「全局結構」(這是個 8 還是 3)與「局部細節」(筆畫邊緣)。U-Net 的下採樣抓全局、上採樣回細節,中間的 skip 連接把細節資訊接回去——天生適合這種「輸入輸出同尺寸、又要兼顧大小尺度」的任務。從 Stable Diffusion 到醫療影像分割,U-Net 無所不在。

功能爛沒關係,重在跑通

你生出的數字也許歪歪扭扭、糊糊的——完全沒關係。這條軌道的目標(同 llm 軌道)是讓你親手跑通 Stable Diffusion 的核心機制:加噪、預測噪聲、反向生成。懂了這個迴圈,幾十億參數的 SD 對你就不再是黑魔法,只是同樣的機制放大而已。

⚠️ loss 卡著不動,但圖在變好——這不是 bug

第一次訓練很多人會嚇到:loss 掉到某個值(約 0.7 上下)之後就幾乎不動了,看起來像訓練停擺。

這是正常的。我們的損失是「預測噪聲」對「真噪聲」的 MSE,而噪聲本質上有一大塊是無法預測的隨機——loss 永遠到不了 0,卡在某個下限才是對的。判斷模型有沒有在學,不要只盯 loss 數字,要看生成的圖有沒有越來越像數字。同理,訓練到一半去取樣,結果偏糊、偏雪花也不奇怪:擴散模型本來就要訓練夠久才會清晰,中途糊是過程,不是壞掉。

💡 模型只有約 46 萬參數,MNIST 上 5 個 epoch、T4 幾分鐘就能生出可辨認的數字。下一課,我們讓生成快十倍(DDIM),並把去噪的逐步軌跡畫出來看。

#diffusion #unet #training #mnist

留言 0

留言載入中…