一言以蔽之:Diffusion 其實就是「學會除噪」而已。
好,各位同學大家好啊,我們來上今天的課。這是這個系列的最後一講了。
上一講我們講完了文字接龍,你已經知道語言模型是怎麼一個字一個字把文章生出來的。那一講的最後,我留了一個問題給你:
文字可以一個字一個字接。那圖片呢?
今天就是來回答這個問題的。而且我要跟你分享一個我覺得整個生成式 AI 裡面最漂亮的想法——漂亮到你聽完會覺得「欸,怎麼會有人想得到這個」。
今天結束之後,你會在這個網頁裡面訓練出一個 diffusion model,然後看著它從一團完全沒有意義的雜訊裡面,把一個形狀雕出來。不是預先錄好的動畫,是你按下按鈕它現場算的。
這堂課分成五段:
需要的先備知識:第 1 講的三步驟、第 2 講的 backprop、第 3 講的 Adam。中間會有一點高斯分佈的數學,但我保證每一條式子都會用白話文講一遍。看不懂式子直接 skip,不影響你理解主線。
這一版是互動的,而且所有的計算都是你的瀏覽器現場跑的——沒有 PyTorch,沒有後端,就是這頁裡面那幾百行 JavaScript。頁面一打開,它就在背景幫你訓練一個 model 了。
好,我們先想想看,文字接龍為什麼會成功。
因為文字有天然的順序。「我今天早上吃了」後面接什麼?這件事情有意義。句子本來就是從左讀到右的,你照著這個順序生,完全符合這個東西本來的樣子。
那圖片呢?你想想看,一張圖片的 pixel(像素)有先後順序嗎?
沒有啊。左上角那個 pixel 憑什麼比右下角那個先出現?它們是同時存在的。你看一張照片的時候,你也不是從左上角開始一格一格看的。
但是——「沒有天然順序」不代表「不能硬給它一個順序」。
最直覺的作法是這樣:我們規定,就從左上角開始,一列一列往右往下掃,一個 pixel 一個 pixel 生。生第 個 pixel 的時候,就看前面 個 pixel 是什麼。這樣就變成文字接龍了嘛,只是接的東西從「字」變成「pixel」。
這不是我瞎編的,早期真的有人這樣做,而且做得還不錯,這類方法叫做 autoregressive(自迴歸)的影像生成。那結果怎麼樣呢?兩個問題。
第一個問題:慢。而且是慢到很誇張。你今天要生一張 1024×1024 的圖,那是一百多萬個 pixel,彩色的話還要乘以三。一個一個生,代表你要跑一百多萬次 model,而且沒辦法平行化——因為第 個要等第 個生完才知道要看什麼。語言模型生一篇文章大概幾百個 token,你等個幾秒;現在要你等一百萬個 token,你自己算算看。
第二個問題:這個順序是硬掰的,而且會出事。假設 model 在左上角不小心生了一塊天空,好,那接下來整張圖都要跟這塊天空自圓其說。生到右下角的時候它發現「欸不對,這樣構圖很怪」——但來不及了,前面不能改了。
你想想看你自己畫畫是怎麼畫的。你會從左上角開始,把每一格顏色一次填到最滿嗎?不會嘛。你會先打個草稿,抓一下整體的構圖,然後整張圖一起慢慢加細節。
所以問題就來了。我們想要一個方法,可以整張圖一起生,而且是由粗到細的。怎麼辦呢?
好,那神奇的地方來了。今天整堂課的 punchline 就是這一句:
「生成」很難,但「破壞」超簡單。
你想想看。要你憑空畫一張貓的照片,很難對不對?那要你把一張貓的照片毀掉呢?太簡單了。加雜訊就好了啊,一行程式:壞掉的圖 = 原本的圖 + 雜訊。這件事情不用學、不用 train、不用 model,閉著眼睛都會做。
那……如果我們能學會把加上去的雜訊拿掉呢?
停一下,想想看這件事情的意義。「加雜訊」我不用學就會做,所以我可以無限量產生訓練資料——拿一張圖,隨便加點雜訊,我就同時有了「題目」(加噪的圖)跟「答案」(我加了什麼雜訊)。我知道答案,因為雜訊是我自己加的啊!
有題目有答案,那就是第 1 講的老套路了:定 model、定 loss、硬 train 一發。
然後如果 model 學會了「拿掉一點雜訊」,那我就一次拿掉一點點,做很多很多次。從一團純雜訊開始,一層一層刮,是不是就會慢慢變回一張圖?
這就是 diffusion。其實就是「學會除噪」而已。
我覺得這件事情最好的比喻,是雕刻。
1501 年,佛羅倫斯有一塊卡拉拉大理石。這塊石頭很大,五公尺多高,但它在教堂的工地裡躺了快四十年沒人動。為什麼?因為前面已經有兩個雕刻家接手過,兩個都做不下去,石頭被鑿壞了一塊,大家都覺得這塊石頭廢了。當時的人就叫它「那個巨人」。
後來這塊石頭交給了一個二十六歲的年輕人。他叫米開朗基羅。他花了大概兩年多,從這塊廢石頭裡面,雕出了大衛像。
傳說他講過一句話(真的是不是他講的其實有爭議,但這句話太漂亮了):雕像本來就在石頭裡面了,我只是把不是雕像的部分去掉而已。
你注意這件事情的關鍵:他從頭到尾沒有「加」任何東西上去。他手上只有鑿子,他做的每一個動作都是減法。而且他不是從頭頂開始一路往下雕到腳,他是先把大塊的形抓出來,然後整座像一起慢慢細化——先有個人形,再有肌肉,再有血管,再有表情。
Diffusion 就是在做這件事:
所以我們剛剛那兩個問題,一次解決了。整張圖一起生,而且由粗到細。這就是為什麼我說這個想法很漂亮——它把一個「無中生有」的問題,翻譯成了一個「把多餘的東西去掉」的問題。而後者是可以硬 train 一發的。
好,這裡要停下來問一個很重要的問題。你可能會想說:「等一下。既然 model 會除噪,那我直接丟一團純雜訊給它,叫它一步就還原成一張清晰的圖,不就好了?幹嘛做一千次?」
這個問題問得非常好,而且它的答案就是整個 diffusion 的設計哲學。因為那一步太大了,大到 model 學不會。
你想想看「從純雜訊直接跳到一張清晰的圖」這個函式長什麼樣子。輸入是一團隨機數字,輸出要是一隻貓;那另一團隨機數字呢?要是一隻狗。這兩團隨機數字看起來一模一樣(都是雜訊嘛),但輸出要完全不同。這個函式極度複雜,你要 model 一步學會它,它學不起來的。它最後會學到一個安全牌:輸出所有圖片的平均。那是一團灰色的糊糊的東西。
那如果拆成一千步呢?每一步的任務就變成:「這張圖現在有 87% 的雜訊,請你把它變成 86.9% 的雜訊。」你看這個任務多簡單。它只要做一點點微調就好,它不用知道最後會變成貓還是狗,它只要把畫面往「稍微像圖一點」的方向推一小格。
這就是核心設計哲學:把一個學不會的大問題,拆成一千個很簡單的小問題。
這個想法其實不只在 diffusion 裡出現。你回想第 1 講的 gradient descent——我們也沒有一步找到最佳參數啊,我們是一小步一小步走下山的。同一個精神。
而且等一下「動手玩 ⑤」你會親眼看到這件事的代價跟極限:步數少到什麼程度,形狀才會真的垮掉。答案可能會讓你有點意外。
好,觀念講完了。接下來我們動手做。
我們先做簡單的那一半:破壞。在那之前,先講一下今天的資料。
我們今天不用真的圖片,我們用 2D 的點雲——就是平面上一堆點,每個點只有 兩個數字。為什麼?兩個原因,都很實際:
但我先講清楚,這不是簡化版的 diffusion。數學是一模一樣的。待會你看到的每一條式子,跟真的在生圖的那些 model 用的式子完全相同。差別只在資料的維度是 2 還是 300000,以及 model 是 MLP 還是 U-Net。
我們的目標形狀是雙螺旋——兩條互相纏繞的螺旋線。選這個是因為它夠有特色:像不像,你一眼就知道,賴不掉。
現在我們要定義「破壞」這件事。我們要做的是:從乾淨的資料 開始,加 次雜訊,每一次加一點點,加到最後變成完全的高斯雜訊。第 步長這樣:
白話文:把原本的東西縮小一點點,然後摻進一點點雜訊。其中 是「這一步摻多少雜訊」, 是「留下多少原本的東西」。
然後這裡有個很好用的性質。你要看第 500 步長什麼樣子,難道要老老實實跑 500 次迴圈嗎?不用。
從 直接跳到任意的 ,一行就算完。為什麼可以這樣?因為高斯分佈有個很好的性質:兩個獨立的高斯加起來還是高斯,而且變異數直接相加。所以你連加一千次雜訊,總效果還是「一個高斯」,只是變異數是累積的那個值。(唸做 alpha bar)就是把每一步留下的比例通通乘起來。
這件事為什麼重要?因為訓練的時候我們要隨機抽 t。如果每抽一個 t 都要跑 t 次迴圈,那訓練會慢到不能看。有了這條式子,抽到 t=873 也是一行算完。這條公式是 diffusion 能夠被訓練起來的關鍵。沒有它,這個方法就只是一個好看但跑不動的想法而已。
下面這個滑桿就是前向過程。從 0 拉到 999,看著螺旋在你手上溶掉。右邊那條曲線是「訊號還剩多少」,紅點是你現在的位置。
你會發現,拉到最右邊那張圖完全看不出原本是什麼了。而且很重要的是,不管你原本畫的是螺旋、是貓、還是你的自拍照,加噪加到最後都會變成同一種東西:標準高斯分佈。
這件事很關鍵。因為它代表採樣的起點是免費的——我要生成的時候,隨便生一團雜訊就好,那團雜訊跟「一張真圖被毀掉一千次」的結果是無法區分的。
上面那顆「驗證一步到位公式」的按鈕,就是在幫你對帳:它會真的跑一千次迴圈,再用公式算一次,然後把兩邊的平均跟標準差印出來給你比。
這一整串 要怎麼設,有個名字叫 noise schedule(雜訊排程)。說穿了就是「破壞的時間表」——規定第幾步的時候,東西要被毀到什麼程度。
我這邊用一個很直觀的排法:直接規定第 t 步的「雜訊/訊號」比例,讓它從 0.02(幾乎沒雜訊)等比成長到 15(訊號幾乎沒了)。已知這個比例,就可以反推出 :
那為什麼不用原始 DDPM 論文的排法呢?因為我試過,它在 2D 資料上是壞的。
這件事我覺得比任何一條式子都值得講,所以我不打算用嘴巴講——下面這個元件會現場再訓練一個 model 給你看。同樣的 model、同樣的訓練步數,只換掉那張破壞的時間表,然後我們一起看結果。
結論寫在上面那個框裡,我這邊只點出為什麼會這樣。
關鍵在於:訓練的時候我們是均勻抽 t 的。所以這張時間表決定的不只是「怎麼破壞」,更是你的訓練預算怎麼分配。直線排法把訊號毀得太快也太不平均——有將近四分之一的 t,訊號已經掉到 5% 以下,那些 t 上面 幾乎就是純雜訊,model 只要把輸入原封不動吐出來就快對了。這些是送分題,學不到東西。
而代價是另一頭被餓死:真正在決定形狀細節的、訊號還很多的那一段,分到的抽樣次數少太多了。
然後這裡有一個我很喜歡的、也是最反直覺的觀察——你按完按鈕會看到:直線排法那個 model 的 training loss 反而比較低。低了快一半。但它生出來的東西是一團爛泥。
為什麼?因為 loss 低是被那些送分題灌出來的。這是今天最實用的一個教訓:diffusion 的 loss 數字本身沒什麼參考價值。它裡面混了一大堆「送分題」跟一大堆「無解題」。要知道 model 好不好,只能用生的——生出來畫給你自己看。這跟第 1 講講的一模一樣:不要只看數字,一定要把結果畫出來。
好,我們現在走完破壞了。接下來是主菜:怎麼倒著走回去。
這是今天最重要的一個問題,我們慢慢講。
你直覺可能會說:「model 應該吃一張髒的圖,吐出一張乾淨的圖。」這樣講也對,但實作上大家不是這樣做的。實作上是這樣:
給 model 一個加了噪的資料 ,還有現在是第幾步 ,叫它預測「加進去的雜訊 是什麼」。
為什麼要預測雜訊,不直接預測乾淨的圖?因為雜訊永遠是標準高斯,大小固定、範圍固定,對 model 來說是個好預測的目標。而且你只要知道雜訊是什麼,乾淨的圖就直接反推出來了嘛——把式子移項一下就好,這兩件事其實是等價的。
這裡是我最喜歡的部分。
就是「我加的雜訊」跟「model 猜的雜訊」之間的 MSE。
然後就結束了。
對,訓練目標就這樣。沒有對抗、沒有兩個網路互打、沒有什麼玄的東西。就是一個 MSE,第 1 講你就會算了。整個訓練流程是這樣,四行:
你看,這完全就是第 1 講的三步驟:定 model(一個 MLP)、定 loss(MSE)、optimization(Adam)。一模一樣。Diffusion 聽起來很唬人,其實就是一個 MSE 迴歸問題而已。
等一下,還有一個問題沒解決。model 為什麼需要知道現在是第幾步?
你想想看這個情況。我給 model 一個點,它在 (0.5, 1.2),請你把雜訊拿掉。model 會問:「拿掉多少?」
對嘛。如果現在是 t=900,那這個點幾乎整個都是雜訊,要大刀闊斧地改;如果現在是 t=10,那這個點已經幾乎是乾淨的了,你只能輕輕修一下,改太多反而把好東西刮掉了。同一個輸入,在不同的時間點,正確答案完全不同。所以 t 不是可有可無的附加資訊,它是必要的輸入。
回到雕刻的比喻:這就是粗鑿子跟細鑿子的差別。一開始你敲大塊的,最後你用最細的刀修表情。t 就是在告訴 model:「你現在該用哪一號鑿子。」
那怎麼餵?t 是一個整數,你可以直接除以 1000 當成一個 feature 丟進去。這樣可以,但效果普通——因為一個數字能提供的區分度太低了。大家實務上的作法是:把 t 展開成一串 sin/cos 的值,變成一個向量,這個東西叫做 time embedding。
欸,這招你其實看過。第 4 講的 positional encoding,一模一樣的東西。那時候我們用它告訴 model「這個 token 在第幾個位置」,現在我們用它告訴 model「這個雜訊在第幾步」。同一個工具,換個地方用而已。
我們的 model 要做的事情很單純:輸入是 (2 個數字)+ time embedding(16 個數字),輸出是預測的雜訊(2 個數字)。中間就是第 2 講那種普通的 MLP。整個 model 只有 … 個參數。
對照一下:Stable Diffusion 那種等級的大概是 10 億個。我們小了四十萬倍,而且它跑在你的瀏覽器分頁裡。
optimizer 用 Adam,第 3 講手刻過的那個,加上 learning rate 的 cosine 衰減。下面就是訓練現場——它在你打開頁面的時候就自動開始跑了,你也可以按重來再看一次。
左邊那張圖:loss 確實有在掉。很好,但就像剛剛說的,這個數字本身沒什麼參考價值。
右邊那張圖才有意思。它把 loss 依照 t 拆開來看,你會發現差超級多,而且形狀很奇怪——它有兩個難的地方:
然後 t 過了 600 之後,loss 一路掉到幾乎是 0。因為那時候 幾乎就是純雜訊,model 只要把輸入原封不動吐出來,答案就快對了。這題根本是送分題。
你把這張圖跟剛剛 schedule 那件事放在一起看,就全部串起來了:schedule 排得爛,就是讓你的訓練預算大量落在右邊那片送分區。loss 好看,但什麼都沒學到。
好,重頭戲來了。model 訓練好了,我們來讓它生東西。流程是這樣:
前面那一大坨看起來很嚇人,但白話文就是:「把 model 猜的雜訊按比例扣掉,然後把大小調回來。」就這樣。
等一下,最後那個 是什麼?你可能會想說:欸不對啊,不是說要把雜訊拿掉嗎?怎麼式子最後面又加了一點新的雜訊回去?這不是在做白工嗎?
這個問題非常好,而且這是很多人第一次看 diffusion 一定會卡住的地方。答案是:如果不加回去,你每次都會生出同一個東西。
你想想看。如果整條路徑完全沒有隨機性,那從雜訊 A 出發就一定走到結果 A,而且 model 每一步都選「最安全的方向」,最後所有的點都會被吸到分佈的中心去,擠成一團。你會得到一張所有貓的平均,而不是一隻貓。加回去的那一點點雜訊,是在維持多樣性。
這其實就是雕刻的比喻走到盡頭的地方:真正的雕刻是純減法沒錯,但 diffusion 是「刮掉一大塊,再撒一點點碎屑回去」。撒回去的碎屑比刮掉的少很多,所以整體還是越來越乾淨。淨效果是減法。
好,下面這個是今天最重要的一個元件。按播放,或者自己拉滑桿。左邊是現在這一步的樣子,右邊是真實的訓練資料,你自己對照。
好,這就是今天最重要的一張圖。你從最左邊看到最右邊。一開始那團東西,什麼都不是——它是隨機數生出來的,裡面沒有任何資訊,你我都同意那不是螺旋。然後一步一步,那個形狀長出來了。
t=800、t=600 的時候還看不太出來,只是一團霧。t=400 開始,中間出現一個洞,邊緣開始收攏。t=200 的時候,兩條手臂已經看得出來了。t=0,螺旋就在那裡。
我想請你注意一件事:我們從頭到尾沒有告訴 model 什麼是螺旋。我們沒有給它螺旋的方程式,沒有告訴它有兩條手臂,沒有講半徑怎麼變。我們只做了一件事——給它看加了噪的資料,叫它猜雜訊是什麼。就這一件事,做了一萬六千輪,每輪 32 筆,總共五十幾萬個例子。
然後它就會生螺旋了。
這整套機制,講完了。真的就結束了,沒有更玄的東西。加噪、學除噪、從雜訊開始一步步除。三句話。
我們剛剛花了很大的力氣說服你「一步學不會,所以要拆成一千步」。那反過來問:一千步是必要的嗎?少走一點會不會死?
這題我不給你答案,你自己拉。下面這個滑桿控制的是採樣要走幾步——從 1 步(一步到位)到 1000 步。每一格都是真的重跑一次採樣,不是預先錄好的。
結果有沒有讓你意外?它比你想的耐操很多。
真正垮掉是在 3 步以下:1 步的時候你會得到一團糊——注意看,那就是我們前面說的「所有貓的平均」,model 一步跳不過去,只好交出一個安全的平均值。2 步還是一團,3 步開始看得到一個環,但兩條手臂還分不開。到 5 步手臂就出來了,10 步已經是一個像樣的螺旋。
那 1000 步是在幹嘛的?它買到的是最後那一點點細緻度——線條更細、更貼、密度更均勻。你把滑桿在 10 跟 1000 之間來回切,看右邊那條曲線就知道:從 1 掉到 10 是斷崖,從 10 到 1000 是幾乎躺平的一小段。
這件事情有很實際的意義。你現在用的那些生圖工具,之所以可以幾秒鐘出圖,做的就是這件事。它們不走完一千步,它們用更聰明的走法(DDIM 那一類方法)在幾十步裡走完。加速採樣是 diffusion 最熱門的研究方向之一——而它能成立的前提,就是你剛剛親手拉出來的這條曲線。
誠實補一句:這是一個 2D 的玩具問題,它比真的圖片容易太多了。真實的圖片生成,步數砍到 10 步以下畫質是會有感掉的,這也是為什麼那個領域還在拼。但「步數跟品質不是線性關係、前面幾步買到絕大部分的東西」這個結構,兩邊是一樣的。
好,這是我最常聽到的質疑,而且聽起來很有道理:
「你 model 有兩千多個參數,訓練資料才 3000 個點。它會不會只是把那 3000 個點背下來,生成的時候隨機挑一個吐出來?那這樣它根本沒有『學會』什麼,它只是個複製貼上機器。」
這個問題非常重要,因為它牽涉到生成式 AI 現在最大的爭議之一。而且它是可以驗證的,我們不要用嘴巴吵,我們用算的。
驗證方法:對每一個生成的點,去找它離最近的訓練資料點有多遠。如果 model 是在複製貼上,這個距離應該非常接近 0。
那多遠才算「正常」呢?我們需要一把尺。所以我另外從同一個螺旋新抽一批真實資料(model 完全沒看過的),量它們離訓練集有多遠。這就是「真貨」該有的距離。如果生成的點跟這批新的真貨,距離分佈長得差不多,那就代表 model 生的東西跟真貨一樣「新」,它沒有在抄。
兩個分佈幾乎疊在一起,而且綠色的並沒有堆在 0 那邊。也就是說:model 生出來的點,跟「從真實分佈重新抽一批」的點,在「離訓練資料多遠」這件事情上行為是一樣的。
更有意思的是最下面那一行:「幾乎等於複製貼上」(距離小於 0.001)的比例,生成的點甚至比真貨還低一點。
它學到的是分佈,不是樣本。它沒有背下那 3000 個點,它學到的是「螺旋長什麼樣子」這件事本身。所以它可以生出無限多個沒人看過、但確實在螺旋上的新點。
但是我要誠實補一句。這個實驗只能排除最直接的「複製貼上」,它不能證明真實世界的大型模型在重複資料下絕不記憶。當某張圖在訓練資料裡重複出現幾百次的時候,模型是有可能把它記起來的,這件事在研究上已經被驗證過了,而且是目前很受關注的問題。所以正確的說法不是「diffusion 絕對不會複製」,而是:它的機制本身學的是分佈,但如果資料嚴重重複,記憶是會發生的。
好,我們來誠實對一下帳。你今天玩的東西,跟你在網路上用的那些生圖工具,到底差多少?差三件事。
1. model 換成 U-Net(或 Transformer)。我們用 MLP,因為資料只有 2 維。圖片是幾十萬維,而且有空間結構——隔壁的 pixel 有關係,遠的 pixel 關係比較小。所以要換成 U-Net:一種先把圖片縮小(抓大方向)再放大回去(補細節)的架構,中間還有捷徑把細節接回來。名字裡的 U 就是在講這個先下後上的形狀。
但你注意——它的輸入輸出規格跟我們今天的一模一樣:吃加噪的東西 + t,吐出預測的雜訊。第二步第三步完全沒動。
2. 資料從 3000 個點變成幾億張圖。我們的訓練,就是你剛剛在這頁上等的那幾秒;真實的模型是幾百張顯卡跑好幾個星期。這是唯一一個「沒有捷徑」的差別——規模就是規模。
3. 加上文字條件(text conditioning)。這是你最有感的那個差別:為什麼我打字它就會照著生?
其實原理沒有你想的複雜。我們今天的 model 吃的是 ,現在多吃一個東西:。文字先用一個語言模型(就是第 5 講那種)轉成一串向量,然後餵給 U-Net。於是 model 學到的就不是「雜訊是什麼」,而是「在這句話的前提下,雜訊是什麼」。訓練資料就是幾億組「圖片 + 這張圖的文字描述」的配對。
就這樣而已。你打的那句 prompt,其實就是在除噪的每一步跟 model 咬耳朵,一千步咬一千次:「欸,記得,是一隻貓喔。」
最後補一個現在正在發生的事情(點到為止,這已經是研究前沿了):還記得我們開場說 pixel 一個一個接龍太慢、被淘汰了嗎?有趣的是,這幾年 autoregressive 那條路線又回來了——因為大家發現,如果不要在 pixel 上接龍,而是先把圖片壓縮成一串比較短的「圖片 token」,再用第 5 講那套文字接龍的方法去接,其實也做得起來,而且跟語言模型可以無縫合體。
所以現在是兩條路線在交會:diffusion 這邊在想辦法變快、變少步驟,autoregressive 那邊在想辦法變好。誰會贏?我自己是覺得還不知道,很值得看下去。
三題,選了馬上告訴你對不對。
這是最後一講了,這幾題你一定要自己跑跑看。前兩題在這頁上就能做,第三題要打開 notebook。
還有兩個教訓,是這一頁上你親手驗證過的:noise schedule 排錯,loss 會變好看但東西會變爛;model 學到的是分佈,不是樣本。
如果今天只能記一句,就記這句:
它不是「畫」出來的,是「雕」出來的。
從一團雜訊裡,把「不是圖」的部分一層一層刮掉。
好,這是最後一講了,我想帶你把整個系列串一遍。因為單獨看每一講都只是一個技術,但連起來看,你會發現它其實是同一件事。
你把這張表從上往下看,會發現一件很有意思的事情:
第 1 講講的那三個步驟,六講下來從來沒有變過。
定 model、定 loss、找參數。ChatGPT 是這三步,Stable Diffusion 是這三步,你在第 1 講預測 YouTube 觀看數的那個 也是這三步。變的只有兩件事:model 長什麼形狀,跟你怎麼定義「答對」。
這個領域看起來每個月都在冒新東西,名字一個比一個嚇人。但你只要看到新的方法,就問自己這三個問題:
十次有九次,你會發現第三個問題的答案是「Adam」,然後就沒什麼好問的了。真正的創新幾乎都發生在前兩個問題上。
這就是我這六講最想給你的東西。不是任何一個特定的技術——那些會過時——而是這個拆解問題的框架。這個不會過時。
六講結束了,那接下來呢?我給你幾個很實際的建議,你不用全做,挑有感覺的做。
我在第 1 講說過,機器學習就是找一個函式。走了六講,這句話依然成立。難的從來不是找函式——難的是想清楚你到底要找什麼函式。
這六講一路走下來,從一條直線 ,走到可以從雜訊裡雕出形狀。中間沒有任何一步是魔法,每一行程式都攤開來給你看過了。
我希望你帶走的不是「我學會了 diffusion」,而是「原來這些聽起來很嚇人的東西,拆開來都是我看得懂的零件」。
因為下一個熱門技術一定還會來。到時候你打開那篇論文,你會發現它還是在講:model 吃什麼、loss 是什麼、怎麼找參數。
以上就是我今天想跟大家分享的內容。這六講到這邊結束,謝謝大家。