
阿里妹導讀
大家都可以透過寫 prompt 來和大模型對話,那大模型之前的演算法是怎樣的,演算法世界經過了哪些比較關鍵的發展,最後為什麼是大模型這條路線走向了 AGI,作者用兩篇文章共5.7萬字詳細探索一下。
大部分人都已經清楚什麼是大模型(what),怎麼用大模型(how),本文將嘗試解答為什麼是大模型(why)?大家都可以透過寫 prompt 來和大模型對話,那大模型之前的演算法是怎樣的,演算法世界經過了哪些比較關鍵的發展,最後為什麼是大模型這條路線走向了 AGI,我會用兩篇文章共5.7萬字詳細探索一下。
劇透一下本文的知識圖譜如下:

東西稍稍有點多,為了方便理解,我會把它們分到三個章節並作為正文部分,分別對應上邊的顏色逐漸加深的三簇。
文章結構如下:
文章結構
本文會按照下邊四個章節展開:

圖 0 章節目錄
-
我們會在機器學習章節藉助小程式分模型,介紹機器學習的基礎工作比如特徵工程、模型選擇、訓練、評價等等,這些工作類似第一行程式碼 hello world。
-
第二章我們會將機器學習平滑引入到深度學習的領域, 總結並深入深度學習的一個重要正規化 embedding+MLP,比如因為RAG 的火熱被人人熟知的 embedding,其實在深度學習中無處不在,同理還有MLP。本章會用一個具體的推薦場景介紹具體的模型細節,但是不慌,會搭積木就可以看的懂🐶。
-
第三章深度學習進入到預訓練+微調的正規化,演算法工作變得簡單且可遷移,介紹雙胞胎 bert 和 gpt 的相愛相殺的故事.
-
最後附贈一個彩蛋。起因是農曆新年和老婆看了一個電影,電影結束了老婆還在等彩蛋,用她的話說,“好電影都有彩蛋”。所以我也準備了一個,也可以直接跳到彩蛋,然後回來看前三章。
所以開始我們的邊做邊學之旅了。
所以我們第一個要學是“機器學習”。
機器學習:我的PD也是演算法工程師
場景
一切從一杯咖啡開始。
今年 8 月份和 pd 一起喝了一杯咖啡,聊了下接下來要做的一個業務場景-如何給支付寶小程式打分,滿分 100 分。
簡單來說需要給優質的小程式打上高分,給低質量的打低分。小程式的質量有了客觀評價分數後,運營同學就可以依此做分層,藉助運營手段,促進開發者最佳化小程式質量,進而提升整體小程式的質量。
PD的方案
pd 已經想到了一種解法,選了幾個和小程式質量相關的特徵(為了方便理解我們只選取報錯率和功能最佳體驗兩個特徵,比較符合直覺:功能越齊備且報錯越少的小程式體驗更佳),併為每個特徵設定了幾個檔位如下圖:我們稱之為評分表。
特徵(feature)
|
檔位(bin)
|
分數(score)
|
報錯率
|
檔位 1 (報錯率<=0.01)
|
50
|
檔位 2 (報錯率>0.01)
|
0
|
|
最佳實踐
|
檔位 1 最佳實踐(如提供更多功能)
|
50
|
檔位 2 中檔體驗 (如提供常見功能)
|
30
|
|
檔位 3 較差體驗 (功能不全)
|
0
|
表 1 小程式評分表
透過這個評分表,我們可以根據具體小程式的特徵及其對應的檔位,將每個特徵的得分進行彙總,從而計算出最終的總分。
我們用

代表分數,x 代表特徵(若命中某分桶則為 1,不命中則為 0),w 代表分檔後的分數。簡單公式如下:

,真實的特徵可能是 n 個,公式可能稍微複雜點的求和公式如下:

。
模型自動化
然而實際設計的時候可能會遇到一些問題,比如:檔位怎麼拆分更科學,會很吃專家經驗。 另外隨著特徵的增多,因為本質是一個求和公式,多個特徵之間的檔位得分怎麼平分這 100 分,保證最後的分數更合理。
既然手動設計規則公式出力還不一定合理,那麼這個

我們不去幹預,讓機器(為了好理解,可以認為是執行的一段程式碼)幫我們自己產出一份更科學的演算法公式替換我們的規則公式,或者換句話說,讓模型識別到這個潛在的規則公式( 模式、規則 ),我們稱這種偷懶的方式叫機器學習。
機器學習的概念非常廣泛,我們將最基礎的機器學習方法稱為傳統機器學習。隨著神經網路的發展,深度學習(神經元足夠多層數足夠深的神經網路)作為機器學習的一個重要分支應運而生。而我們現在所熟知的大模型,更是深度學習的一個細分領域,後邊我們會細講。
所以他們的關係是機器學習> 人工神經網路>深度學習> 大模型是一個層級包含的關係。
認識模型
從數學角度來看,pd 的公式是一個線性方程,一般記為 f(x)=wx+b,為了方便理解我們將截距(也叫偏置)b隱藏。線性方程非常直觀,假如f(x)=2x(w=2,b=0), 就是下圖的那條紅線:

圖 2 線性函式
在這公式中有兩個變數 x 和 w,數學中稱x 為 自變數;w 為權重引數也叫引數,對,大模型中常說的 70b 引數就是指的就是有 700 億個這種資料。
這裡發現了第一個問題,即 x 和 w 一定是數字,不然怎麼相乘呢。因為 x 本質上是代表了小程式的特徵(feature),假如這個原始特徵不是一個數字怎麼辦,我們瞭解自己的業務,所以可以提前做點工作將其轉換成數字, 我們將這個轉換成數字的過程可以稱之為特徵工程。
第二個問題接踵而至,機器怎麼才能為每個特徵x找到正確的w權重引數。假如啥也不告訴機器,機器肯定是無從下手的。我們把機器當做我們的助理,需要給它傳輸點經驗,然後它才能自主的處理工作。不過這個機器學習助手要求不高,不太需要我們告訴他 why,只需要告訴它我們之前做過的 N 個具體的case 及我們對 case 的處理結果即可,他會自己總結出我們的做事邏輯(模型訓練),聽起來還不錯對吧,有點 ai 的感覺了。
我們稱這些 case 為樣本,每條樣本包含了case 的細節(我們做事的背景)+一個結果(我們做了什麼,並稱這個為 label)。 大模型場景下我們常聽說的人工打標,打的就是這個 label。
假設上邊兩個問題都解決了,貌似我們就能拿到一個摸得著的具體的公式了比如f(x)=2x,怎麼判斷這個公式是不是準的呢,還需要一個專業測評階段。測完發現 ok,可以上線了。部署上線後,後續使用者的真實資料請求進來,只需要用相同的特徵工程方法(比如訓練用 0-男 1-女,此時也用相同方式)處理得到輸入 x,直接代入公式就能求到結果,這個就是推理過程。
ok 萬事具備開搞,我們已經知道了自己需要做:
1.準備樣本
2.設計模型比如 y=wx
3.特徵工程計算出 x
4.訓練模型學到 w ,得到一個完整的公式
5.並測評一下這個公式準不準
6.上線,提供推理服務
模型視角下(我們假設每個特徵只佔據一個節點),模型及引數的變化過程:

圖 3 引數隨模型訓練變化過程
現在我們 get 到了上邊的流程圖,訓練現在就像一個黑盒,後邊會詳細解開其中的秘密。
演算法思維切換

圖 4 最簡化的演算法模式
上邊的例子其實pd 已經潛移默化做了很多演算法相關的工作,簡單來說,分檔(分檔的本質是將連續特徵轉換離散特徵)=特徵工程,規則公式=演算法模型。如果說機器學習=特徵工程+演算法模型,這麼一看 pd 其實也是演算法工程師了,事實上我們大家都離演算法的世界很近。
藉助上邊的例子我們看一下演算法的做法和常規的工程的做法的區別,藉此切換我們的思維模式到演算法模式。

圖 5 演算法和工程的區別
萬物皆是 IO 系統,純工程的邏輯是,理解需求然後寫一個程式碼在線上 run 起來,針對使用者的不同的請求給出不同的輸出響應。前邊我們總結出來演算法邏輯是需要根據以往使用者的輸入(用我們的例子就是不同小程式的特徵,做一下特徵工程後得到數字化特徵)+輸出(不同小程式的分數)組成的樣本一起給到演算法模型進行訓練,模型會分析出隱藏在資料背後的業務邏輯,代替了pd 設計規則需求+開發分析需求寫程式碼的過程。
可以很容易看的出來,和工程的做法,演算法邏輯稍微有點倒轉了。
現在我們要去把這個演算法模型的工作具體化了,之前我們分析出開發一個演算法模型,需要特徵工程、模型定義、模型訓練、模型測評等步驟,接下來是時候細緻的解開他們四個的面紗了。
開始實質演算法工作
上邊我們分析出的演算法開發步驟對比下工程開發:

圖 6 演算法開發和工程開發的類比
1.選擇模型:根據任務需求選擇適合的模型,從很多模型中選一個適合的,比如我們之前選了一個線性模型。工程同學視角就是技術選型。
2.特徵工程:準備和處理特徵資料,包括特徵選擇、特徵轉換、歸一化等,以適應並提高模型的表現。
3.訓練模型:將處理好的特徵資料輸入模型進行訓練,希望模型學習到資料中的規律和知識。 工程同學視角這兩個步驟可以認為是我們的開發和自測階段
4.評估模型:使用專業的評價標準來評測模型的表現。如果評測結果不令人滿意,需要調整。 工程同學視角這個階段可以認為是測試階段
5.調整與最佳化:根據評估結果調整特徵、模型架構、超引數等,反覆進行訓練和評估,直到達到預期的效能。工程同學視角,質量同學測試出來了 bug,我們修改下程式碼。
6.應用模型:一旦模型的表現ok,就可以發一個演算法服務了。工程同學視角是相同的,終於完成質量驗收了,上線生產。
再貼一下人類學習和機器學習的類比圖,方便理解。

特徵工程
演算法的世界其實一直只有資料和模型兩個主角,特徵工程就是我們為了讓模型怎麼更好的理解資料,中間做的一個橋樑。
我們用支付寶當面付的產品描述介紹下文字怎麼提取特徵,為了讓模型更好的理解,所以我們要提前做下分詞,方便模型學習。另外為了方便理解,分詞我用我們熟知的漢語片語進行。

圖 7 文字特徵的常見方法
其中one-hot (圖中掃碼的表示是[1,0,0,0,0,0,0,0],這種形式在數學上稱之為向量,向量中有一個位置是 1,所以叫 one-hot;如果多個位置是 1 則稱之為 muti-hot,muti-hot一般用在同一主體多標籤的場景,比如小程式可能有多個標籤表達活躍度、是否 KA 等)方式目的是為了讓模型感知到每個索引後的分詞是不同的,不然 出示=1,付款碼=2, 支付=3,模型會以為支付的含義=付款碼+出示,它可最擅長做加法了。
如圖 ont-hot 有一個致命問題就是,詞表如果是 5w,那麼每一個分詞(token) 都會存在 49999個 0,這不僅導致儲存空間的浪費,同時也使得計算效率低下。one-hot 避免了語義混淆, 但是做的太徹底,不同詞之間毫無關係,就失去了表達語義的可能,比如貓和狗是相似的關係。
初識embedding
回到問題的本質,我們擔心不同詞之間的表達在相加或計算時,可能無法準確地反映其語義關係。但是如果可以呢?比如國王 – 男 + 女 ≈女王。

圖 8 embedding 例子
這個例子體現了embedding的基本思想:我們不再只用 0 和 1 來表達資料,換成了更精確的數字,依此引入了豐富的語義表示。並顯著壓縮了向量的維度,比如上邊的例子向量只有三維,對,embedding 本質是一個向量,重新命名是為了區別普通向量並體現出這個壓縮過程。
透過簡單的數學計算,例如矩陣分解的方法,我們就可以拆分和壓縮向量,得到 embedding,這個思路層廣泛應用在協同過濾演算法中,首先構建一個使用者和商品的共現矩陣,透過矩陣分解就可以生成user和item的embedding,有了這個向量我們就可以做相似度計算了。當然 embedding也可以透過一個專門的演算法模型來學習得到,後邊會介紹 Word2Vec 和sentence embedding本質上都學習了大量的文字語料後,模型可以生成embedding表徵(特徵表示)。
embedding 雖好,透過上邊的介紹也要知道其本質是對現實世界的壓縮,凡壓縮就可能有損耗,所以並不一定 100% 準確。
特徵提取後
在這裡,我們只介紹了文字模態資料的特徵提取方式,而對於影像、影片等不同模態的資料,特徵提取的方法會有所不同,多模態的特徵提取會在第二章節詳細介紹。
在提取完特徵後,我們還可以進行重要特徵的選擇,例如,假設我們有 1000 個特徵,可以從中挑選出與當前任務強相關的 100 個特徵。
如果在第一步計算得出的特徵在數值表達上不夠顯著,我們可以進行一些特徵轉換,如標準化、歸一化、對數變換以及多項式變換(例如立方和平方,比如早期 youtube 會將使用者的觀看時間做平方,讓模型更容易關注到這個特徵,另外平方還帶來了非線性)。此外,如果特徵向量的維度過大,可以透過主成分分析(PCA)來提取主要成分,進一步壓縮特徵維度,以最佳化後續的模型訓練和效能。
當然還可以透過對多個特徵相乘等計算方式,無中生有一個新的特徵出來,比如特徵有年齡、收入,可以把年齡乘收入,用來捕捉到年齡和收入之間的複合關係,這種方式稱之為特徵交叉。
在我們的例子中,小程式具有多個特徵。經過特徵工程提取後,我們可以將這些特徵轉換為向量,並將它們簡單拼接成一個更長的向量(比如城市2 維+類別 4 維 =最後就是一個 6 維的向量),作為一個整體表達整個小程式。
有了這個特徵就可以作為輸入給模型了。
演算法模型
任務類別
在我們上一步的特徵資料上加上一列 label ,我們稱之為一條樣本,當然也可以不加。加了 label 讓模型照葫蘆畫瓢的叫監督學習,沒有 label 讓模型自己悟的叫無監督學習,比如聚類,把相似的資料聚整合一個的簇。偷個懶只給少部分打標,大部分不打標的叫半監督學習or 弱監督。
我們的場景監督學習,因為有 label 嘛。一開始,我們並不會自己設計模型,而是從機器學習的監督學習演算法模型庫中挑選出適合自己業務場景的模型進行使用,還好我們提前瞭解了下模型任務分為迴歸和分類兩種,可以根據任務型別進一步縮減一下選擇的範圍。
-
分類很好理解,比如給了一堆圖片,我們去區分哪些是貓,哪些是狗,哪些是卡皮巴拉。如推薦演算法中的點選率預估就是一個比較常見的二分類場景,判斷使用者點選 1 不點選 0。如邏輯迴歸、svm、樹模型都可以做。不同模型分類的方式不同,目標是一致的,想一個辦法把兩種資料隔離開。

圖 9 不同分類演算法的視覺化
-
迴歸概念略抽象,其來自一個統計學的故事。數學家弗朗西斯·高爾頓透過分析 1078 對父親與兒子的身高資料,發現了一個有趣的現象,兒子的身高傾向於“迴歸”到父親身高的平均值,而不是完全繼承父親的極端身高。他將這種現象稱為迴歸效應(Regression to the Mean),並基於此建立了線性關係模型 y=33.73+0.516x,用於預測子女的身高。其中,x表示父親的身高,y表示兒子的身高。迴歸問題很多模型都已做,比如如線性迴歸、svm、樹模型。
這裡可以更通俗理解:可列舉的任務通常是分類,輸出為離散標籤;不可列舉的任務通常是迴歸,輸出為連續數值。
選模型
我們確認了我們的場景是有監督,有監督演算法模型很多,但是可以更細的看下。
-
線性關係:
在某些情況下,多個特徵之間可能符合線性的關係(線性關係指的就是多個特徵之間能否用線性方程描述,比如簡單的一元一次方程),這種情況下可以使用線性模型,如線性迴歸、邏輯迴歸、嶺迴歸等。按照pd 的假設我們可以選擇這類模型。
-
決策樹與整合方法
有時,我們可以透過 n 層 if-else 結構組成的決策樹來實現所需的結果,這種樹狀結構直觀地呈現為梯形。在更復雜的情況下,單棵樹可能無法精準地解決問題,因此我們採用多棵樹的整合方法。根據“三個臭皮匠頂個諸葛亮”的思路,使用多棵樹的組合可以選擇 Bagging(Bootstrap Aggregating)和 Boosting 兩種策略來構建整合模型。前者生成隨機森林,而後者涵蓋了從 GBDT 到 XGBoost,再到 LightGBM 的演進。
-
非線性關係:
當特徵之間的關係不符合線性假設時,線性模型可能無法很好地捕捉資料的複雜模式。在這種情況下,可以使用非線性模型,如支援向量機(SVM)中的核方法、K近鄰(KNN)等。這些模型能夠處理更復雜的決策邊界,適合處理非線性可分的資料。
機器學習模型種類豐富,比如還有利用機率的貝葉斯演算法,許多模型能夠應對不同的場景。例如,樹模型可以用於分類也可以用於迴歸,我們可以透過實驗分析來比較不同模型的效能,以選擇最優解。
我們的場景
粗看我們的場景是一個迴歸場景,透過小程式的不同特徵然後決定最後的得分。但是問題是假如我們把場景設定成迴歸,就需要打標同學提前打標 N份資料,假設是 1000 個小程式+每個小程式的分數。這對打標同學來說是困難的,怎麼憑直覺判斷出每個小程式可能 1分甚至更小的差距在哪裡。
所以我們換了個思路,打標資料變成了質量體感好的小程式和體感差的小程式,然後讓模型去學習小程式成為優質小程式的機率(0,1二分類),從一個迴歸任務轉成了分類任務。
我們選了邏輯迴歸模型作為演算法模型,其公式可以理解:
-
左圖:一開始 pd 的規則模型(演算法化後是線性迴歸模型),但是線性迴歸計算出來資料可能是-n到 m 的,怎麼將資料控制一下限制在[0,1],不要溢位。
-
右圖:我們可以將上一步的結果再做一次資料變化,將最終資料壓縮到 0-1,這個資料轉換的工具叫做 sigmoid, 也叫logistic函式,sigmoid的作用就是把一個鋼鐵直男生生掰彎了,從 LR(Linear Regression)到 LR(Logistic Regression)彷彿什麼都沒變,彷彿什麼都變了🐶。
在後續的深度學習章節,我們將根據神經網路的特性,為sigmoid 這類工具賦予一個更為廣為人知的名稱——啟用函式。


圖 10 從線性迴歸到邏輯迴歸
模型訓練
之前兩步我們1.對打標的樣本資料的輸入部分做了特徵工程,得到了數字化後的資料集。 2.然後選擇一個線性模型,比如 LR 模型。接下來是時候讓模型從這個資料集中總結學習到知識了。
模型訓練的過程是有效學習輸入特徵與目標變數(label)之間的關係,並使模型具備良好的泛化能力。訓練的目標是透過最佳化模型引數,讓它能夠準確預測新資料。通俗一點說,如果我們給定的樣本,標籤是 1,模型會對特徵值進行一通計算(不管做什麼吧,加減乘除想做什麼做什麼),最終得到結果也應該儘量接近 1。
這種無限接近的現象被稱為擬合,但如果模型只是在記憶訓練資料本身,而沒有找到隱藏在資料背後的規律,我們稱之為過擬合。比如學會了 1+1=2,我們問它 1+2 等於多少,它不會了。相對應地,泛化是指模型在未見過的新資料上也能保持良好預測效能的能力。訓練後一個優秀的模型不僅要在訓練資料上擬合得好,還應能夠泛化到新樣本,真正的捕捉到了資料的本質規律。
那麼怎麼評價模型是不是有泛化能力,資料只讓他學一部分,剩下的看看它也能不能預測的準確,這裡就涉及到了樣本資料的拆分。
資料集拆分
與工程測試不同,資料本身就是測試用例。為了評估模型的效能,我們需要將資料初步劃分為訓練集和測試集。訓練集用於模型開發,而測試集用於上線前的最終測試(測試集是一定不能讓模型學習的,不然就是提前洩題了)。進一步地,從訓練集中再劃分出驗證集,用於模型開發過程中的自測和調優。
經過這兩次拆分,最後資料集通常被分為三個部分:訓練集、驗證集和測試集。下圖表達了這個拆分過程。

圖 11 訓練集、驗證集和測試集
引數選擇
選擇好訓練集和驗證集後,我們就可以訓練模型了。訓練之前,我們有些引數我們可以干預下,這些引數可以控制學習的速度和效能,我們稱之為超引數。超引數可以理解為非模型透過學習到的引數(比如我們一開始提到的權重引數w),是人工可以干預的引數集合。
為了簡化理解只舉 4個超引數:
-
學習輪次:學習輪次可以類比為練習某個技能的次數。練習的次數越多,我們可能掌握得越熟練,不過不是越多越好,就像我們幼時背古詩背 100 遍,並沒有理解其中的意境,直接脫口而出,可能是過擬合了。
-
批次大小:學習知識時,每次分章節學習,不會一次學完。機器學習一般都是小批次多 epoch 的訓練方式
-
學習率:學習新技能時,我們的學習速度就是學習率。如果學習速度太快,可能學得不夠紮實,容易犯錯;如果學習速度太慢,可能需要更長的時間才能掌握技能。學習率是和最佳化演算法配合一起的。
-
最佳化演算法:最佳化演算法就像是學習新技能時,我們使用的學習方法。不同的方法可以有不同的效果。例如,有的方法可能會讓我們更快地掌握技能,有的方法則可能讓我們更紮實地掌握技能。有很多的最佳化演算法,最佳化過程更形象化的樣子是,更快的走到谷底,不同的最佳化演算法有不同的路線,最佳化速度也不盡相同。

圖 12 最佳化演算法
損失函式:損失函式一般不認為是超引數,但是為了方便整體理解,我也貼在這裡了。損失函式可以類比為考試或測驗,每次考試的結果都可以反映出我們與正確答案之間的差距。這個差距(loss)越小,說明學習效果越好。不同的場景一般選擇不同的損失函式。比如迴歸場景常用均方誤差(MSE),二分類常用交叉熵損失(Cross-Entropy Loss)。

圖 13 配置超引數訓練模型
學習的過程其實就像教小孩做題:我們把題目(資料)分成一小堆一小堆的(batch)。模型每學完一堆,就會做個“小測驗”(計算 loss),看看自己錯哪兒了。然後,最佳化演算法就像個“老師”,根據錯誤的大小(loss)和學習進度(學習率),告訴模型該怎麼調整自己的“思路”(引數)。學完一堆,再學下一堆,直到把所有題目都學完一遍(1 epoch)。如果覺得學得還不夠,就再來幾輪(n epoch),直到模型學明白。
在機器學習領域,模型透過迭代學習過程不斷最佳化其內部引數,以減少預測誤差。超引數的調整,包括但不限於上邊的幾個引數,是演算法同學的比較重要的工作。調參費時費力,因為多個引數本質上是一個笛卡爾積,有些自動調參技術如網格搜尋和隨機搜尋等也被輔助用於尋找最優的超引數組合。
怎麼叫學的好
具體來說,一個理想的模型應該能夠在訓練集上表現好,也要透過測試集的考驗。不然就有可能偷懶–欠擬合,死記硬背–過擬合。

圖 14 真實資料分佈、欠擬合、擬合、過擬合
k-fold 驗證
既然訓練會有各種問題,比如過擬合和欠擬合,需要在訓練階段要科學的全面測試。沒有好的辦法,多實驗幾遍,當然重複可以以更科學的方式進行—交叉驗證(Cross-Validation),特別是k-fold交叉驗證,是一種統計學方法,類似於我們熟知的滑動視窗。
透過k-折交叉驗證,我們可以觀察模型在不同訓練集上的效能變化。如果這些效能度量相差不大,那麼我們就可以認為模型具有好的泛化能力。

圖 15 k 折訓練,分片後遍歷訓練,最後評價
假設我們已經訓練好了模型,並且觀察到損失函式(loss)在不斷降低,這時可能會產生一個疑問:僅僅依靠損失值來評估模型的好壞是否足夠科學?
loss 表達了模型自己覺得自己好了,我們要用更直觀的方式去看下。例如,在工程角度,質量同學會提前準備比如 100 個測試用例(test case),測試過程中透過 bug 率來判斷本次需求的開發質量。我們之前提到過,在演算法場景下測試用例實際上就是提前準備的一些樣本,因此從具體樣本的角度來看,模型的表現如何,可以透過計算正確預測和錯誤預測的比例來更直觀地反映模型的效能。
這樣,我們可以更全面地假設模型在實際應用中的表現。
測評
沒有人比質量同學更懂測試了,所以我們用質量同學的角度來看演算法的幾個核心指標是怎麼來的。
在做測試分析階段,質量對當前需求的細緻分析後,用思維導圖分析出來 N 個 case。但是這些 case 可以繼續拆分一下,比如根據是不是正向的 case,分成正向用例和負向用例。前者表達了期望成功的的正常用例,後者期望失敗的例如邊界異常用例,系統能攔截並提醒報錯。
用質量同學用例的預期情況(稱為實際)和工程開發的程式碼處理(稱為預測)就有了四種可能(T和 F 代表 true 和 false 是否預測成功,P 和 N 代表Positive和Negative 預測的是正負,比如 TP 代表一個正樣本正確被預測了,FN 代表錯誤的預測成了負樣本,代表一個原本正樣本被錯誤預測了,這塊稍微有點繞,可以自己稍微思考一下),我們按照下邊的圖組織下,直觀表達預測有沒有混淆真實情況,所以稱之為混淆矩陣。

圖 16 混淆矩陣(Confusion matrix)
機器學習指標
|
QA 測試用例類比
|
解釋
|
真陽性 (TP)
|
正向測試用例,程式碼透過(Pass)
|
正向測試用例按預期透過,表示程式碼正確處理了這些正常輸入。
|
真陰性 (TN)
|
負向測試用例,程式碼攔截(Fail)
|
負向測試用例按預期失敗,表示程式碼正確地拒絕或處理了異常或非法輸入。
|
假陽性 (FP)
|
負向測試用例,程式碼未攔截(Pass)
|
負向測試用例意外透過,表示程式碼未能正確處理異常或非法輸入,存在缺陷。
|
假陰性 (FN)
|
正向測試用例,程式碼攔截(Fail)
|
正向測試用例意外失敗,表示程式碼未能正確處理正常邏輯,存在缺陷。
|
單指標
準確率(Accuracy)

準確率是指模型預測正確的樣本數與總樣本數的比例,一般簡稱為 ACC。在測試場景,1-acc 就是質量比較關注的 bug 率,代表了本次提測的質量。
我們也可以藉助 acc 和 loss 來識別下模型是否過擬合。如果在訓練集上表現越來越好,驗證集不怎麼升高或者降低了,那麼就要考慮模型訓練過擬合了,其後邊的 AUC 等指標也是一樣的道理,要多個指標一起看一下。

圖 17 acc 和 loss 一起判斷模型的表現
不足:假設質量同學準備了 100 個 case,其中有 95 個正向的只有 5 個 負向的。負向的即使不符合預期,正向流程都表現的很好,最後這個指標也會很高,但是負向的 case一旦沒攔住,發上線又會影響較大,還是想辦法關注到這個指標,比如可以用特異性。
特異性(Specificity)

有的場景我們很關注負向的 case,希望異常情況都能被提前識別。那麼特異性這個指標,專注於看負向的測試用例中,真正被識別攔截的機率。
既然可以專注負向用例是不是可以專注正向用例,後者就是我們常聽說的召回率。
召回率(Recall)

召回率 (Recall) 是實際為正類別中被正確預測為正類別的比例。
我們的小程式場景就是質量高小程式被識別稱高質量的比例,較高的召回率意味著我們沒有漏掉太多實際高質量的小程式。高召回率在內容推薦場景,可以理解為使用者提供儘可能全面的內容,確保他們不錯過任何可能感興趣的內容,比如抖音內容的推薦。
單看這個公式,如果我們只需要把 FN 降低,同時保持住 TP,就可以帶來召回的提升。努力讓正向的用例透過,同時把沒有透過的正向用例修復掉,改了 bug 不帶來新的 bug,這個指標就提升了。
僅關注召回率可能導致系統變得過於寬鬆,因為沒關注負向用例,可能允許大量負向測試用例透過(FP),即無法正確識別和攔截這些異常或非法輸入。如果考慮一下 FP,攔截負向異常case,先不管失敗的正向 case FN 。這就是精確率。
精確率(Precision)

精確率 (Precision) 是預測為正類別中實際為正類別的比例
解釋:要想提高精確率就要想辦法降低 FP,在我們的小程式分場景高精確率意味著模型會盡量避免將低質量的小程式誤判為高質量。
不足:在某些情況下,追求更高的精確率可能導致召回率下降,因為模型可能會更保守,不願犯錯(不願意將某些不太確定的小程式標記為高質量)。
我們會發現依賴單一指標總會有不足,很容易拆東牆補西牆。所以為了更全面的效能評估,會用一些綜合性的指標來看。
綜合指標
精確和召回的綜合指標(F1)
既然召回率和精確率都挺重要的,那麼和個稀泥。F1 為了調和精準率和召回率, 其思想來源於數學裡的調和平均數。F1分數高即模型在這兩個方面表現都比較均衡。

樣本分佈不均的綜合指標(MCC)
與F1-Score(只考慮了TP、FP、FN,召回率和精確率只用了這三個指標)相比,MCC考慮了所有四個混淆矩陣的方面(TP、FP、TN、FN),提供了一個更全面、更均衡的衡量。因此,在需要綜合考慮所有型別的預測結果和處理不平衡資料集時,MCC可以說是一種比F1-Score更穩健的效能度量方法。

除此之外 auc 可以綜合的來看模型區分正負樣本的能力,另外 auc 對正負樣本的比例不敏感,只關注區分能力。
ROC 曲線下面積(AUC)
上邊的玩法稍稍有點無聊, 有一個質量同學喜歡這麼花樣搞測試:
1.取一對樣本:一個來自正類,一個來自負類。
2.比較模型評分:模型為每個樣本打分(例如,預測為正類的機率)。
3.記錄結果:
a.如果正樣本的分數高於負樣本,計為✅。
b.如果負樣本的分數高於正樣本,計為❌
c.如果兩者相等,可以視為“中立”或按一定規則處理,比如偏向於❌。
4.重複以上步驟,遍歷所有可能的正負樣本對。
5.計算比例:將✅的比例作為 AUC 值。
透過上邊描述,我們會發現,AUC 可以看作是所有可能的正負樣本對中,模型能夠正確區分的比例。
其具象化的表現是ROC曲線下的面積,曲線的橫座標為假正例率(FPR),縱座標為TPR(真正例率,其實就是我們之前說的 recall)。

AUC (Area under Curve):即ROC曲線下的面積,介於0和1之間,作為數值可以直觀的評價分類器的好壞,一般認為值越大越好。

圖 18 auc=0.93 的圖
當模型的表現儘可能接近完美分類(即完美區分正類和負類),其 ROC 曲線下的面積將達到最大值 1,這表明模型的效能達到最佳水平。而no skill輔助線則表示預測接近隨機,此時曲線下的面積為0.5,表示模型未能掌握區分正負樣本的能力。
上邊提到的是比較通用的指標,當然評測指標還有很多,比如大模型常用的困惑度、BLEU、ROUGE,以及推薦演算法中常用的GAUC、NDCG、 MRR 等,選擇適合的評測指標對於不同任務的模型最佳化至關重要。
完整程式碼
按照我們上邊介紹的內容,將每個模組轉化成真實的程式碼。
1 特徵工程後,準備了樣本,並且拆分訓練集和驗證集,比例 8:2。
2 選擇了模型邏輯迴歸LR
3 選擇隨機梯度下降最佳化器,學習率 0.01 訓練輪次 5 批次大小32
4 評估用 acc F1進行評價
import torch
import torch.nn as nn
import torch.optim as optim
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from torch.utils.data import DataLoader, TensorDataset
# 使用GPU 如果無使用 CPU
device = torch.device("cuda"if torch.cuda.is_available() else"cpu")
# 載入小程式資料集
data = pd.read_csv('mini_program_data.csv')
# 提取特徵和標籤
X = data[['completeness', 'error_rate']].values # 特徵列
y = data['label'].values # 標籤列(優質與否)
# 特徵標準化
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 劃分訓練集和驗證集
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
# 轉換為 PyTorch 張量
X_train_tensor = torch.tensor(X_train, dtype=torch.float32).to(device)
y_train_tensor = torch.tensor(y_train, dtype=torch.float32).view(-1, 1).to(device)
X_val_tensor = torch.tensor(X_val, dtype=torch.float32).to(device)
y_val_tensor = torch.tensor(y_val, dtype=torch.float32).view(-1, 1).to(device)
# 建立 TensorDataset 和 DataLoader
batch_size = 32 # 設定批次大小
train_dataset = TensorDataset(X_train_tensor, y_train_tensor)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
# 定義邏輯迴歸模型
class LogisticRegressionModel(nn.Module):
def __init__(self, input_dim):
super(LogisticRegressionModel, self).__init__()
self.linear = nn.Linear(input_dim, 1)
def forward(self, x):
# 使用sigmoid
return torch.sigmoid(self.linear(x))
# 初始化模型、損失函式和最佳化器
input_dim = X_train.shape[1]
model = LogisticRegressionModel(input_dim).to(device)
criterion = nn.BCELoss() # 二元交叉熵損失
optimizer = optim.SGD(model.parameters(), lr=0.01) # 隨機梯度下降最佳化器,學習率 0.01
# 訓練模型
num_epochs = 100
for epoch in range(num_epochs):
model.train() # 設定為訓練模式
for batch_X, batch_y in train_loader: # 使用 DataLoader 進行批次訓練
optimizer.zero_grad() # 清零梯度
# 前向傳播
outputs = model(batch_X)
loss = criterion(outputs, batch_y)
# 反向傳播和最佳化
loss.backward()
optimizer.step()
if (epoch + 1) % 10 == 0: # 每10個epoch輸出一次損失
print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')
model.eval() # 設定為評估模式
with torch.no_grad():
val_outputs = model(X_val_tensor)
predicted = (val_outputs > 0.5).float() # 使用0.5作為閾值進行分類
# 計算準確率和F1分數
accuracy = accuracy_score(y_val_tensor.cpu(), predicted.cpu())
f1 = f1_score(y_val_tensor.cpu(), predicted.cpu())
print(f'Validation Accuracy: {accuracy:.2f}')
print(f'Validation F1 Score: {f1:.2f}')
上線
模型給出的是小程式是一個優質小程式的機率,我們需要繼續做一個尺度對齊,將機率轉換成分數,比如芝麻分場景,會用機率表示違約率,然後利用基礎分數 +違約機率轉換成的分數(可能正可能負)作為最終的分數。為方便理解,我們假設這個機率就是最終的分數,比如模型輸出是 0.98,代表 98% 是一個好的小程式,那麼分數就是 98 分。
透過前幾步的開發,我們的模型通過了測評,主要看了 f1,acc,auc 等指標,表現 ok,現在可以上線了。
上線後會產生一些負反饋的 bad case,還需要繼續把上邊的流程重新走一遍,是一個持續最佳化升級的過程。
總結
-
傳統機器學習、深度學習、大模型等等都屬於機器學習 -
機器學習 = 特徵工程+演算法模型。其中特徵工程是模型的輸入,訓練階段模型會對特徵(除標籤列)進行各種計算期望得到的結果最大可能的接近樣本的標籤列。訓練完成後,固化下來的引數,將用在後續的模型預測階段中。 -
特徵工程是提升模型效能的關鍵環節,透過合理的特徵設計,可以顯著提高演算法的效果上限。 -
擁有好的特徵後,演算法模型能夠更接近其理論效果上限,從而實現更高的預測準確性。 -
使用演算法進行建模和預測是為了更好地理解和解決問題,而標籤正是定義問題的關鍵,體現了演算法同學對當前問題的理解。 -
在測評階段,我們格局放大一點,假設我們準備了一份在特定場景下具有最高質量和最全面的資料集,就可以提供出去,舉行比賽了,讓開發者看到訓練集並隱藏測試集的 label。假如這個資料集行業內影響力十足,就可以依此做一套基準測試。例如,LiveCodeBeach,從LeetCode等平臺收集來 500 多個代表性的題目,用來評測大模型的程式碼能力,比如程式碼生成、程式碼執行。

圖 19 LiveCodeBeach 榜單
美好假設
回到我們說的那個不嚴謹的公式傳統機器學習=演算法模型+特徵工程。如果我們要偷懶改怎麼減少工作量呢
1.急需一個神奇的模型可以模擬各種各樣的公式—萬能公式,代替我們演算法模型選擇的工作。
2.特徵工程比較費人,在使用線性模型時,比如特徵和標籤之間並不符合線性關係,我們需要對特徵進行各種變換,強迫它適應線性關係。有一天我們換了其他模型,可能要重新適配搞一下。特徵工程這麼苦,可不可以少做點,或者乾脆不做了。
我們要結束傳統機器學習這一章了,帶著這兩個問題或者目標,接下來我們會藉助一個真實的例子在深度學習的領域穿梭。
深度學習:會搭積木就可以開發演算法模型
場景

圖 20 服務商場景下的搜推
在 2024上半年,我們希望為支付寶的服務商提供個性化推薦,重點圍繞使用者搜尋和投放推薦兩個場景,期望在提升使用者體驗並推動業務轉化。
搜尋與投放推薦可以視為相似的應用場景,兩者均依賴於服務商(支付寶的商家服務商,user)和內容(item)的標籤資訊。主要區別在於,搜尋場景中增加了對使用者查詢(query)的響應。
在搜尋場景中,模型需要根據服務商的查詢和內容標籤來預測並排序潛在的點選行為,以幫助使用者快速找到感興趣的內容。相比之下,主動投放場景則是在沒有明確使用者查詢的情況下,依據服務商和內容的特徵,主動向服務商推薦可能感興趣的內容。這要求演算法能夠準確捕捉服務商的興趣變化,並進行個性化推薦,挑戰更大點。
比如之前的小程式分的場景我們需要對使用者解釋他分數怎麼來的,讓使用者明確怎麼做可以提高分數。但是推薦場景不需要強解釋性,比如我們給使用者推薦一個廣告,搜尋推薦一個內容,只需要提供給使用者更可能點選的內容就好了,演算法此時的貢獻可能不專注於具體的 case 而是最終業務整體的點選率提升。所以我們想辦法改造一下我們的 LR,讓其放棄可解釋的執念,變得更強。
從機器學習到深度學習
重新認識 LR 模型
在上一個場景我們利用 LR ,那麼我們重新認識下這個模型,稍微抽象下,其特徵節點是輸入,中間求和節點是計算節點,最後的資料轉換是輸出節點。

圖 21 抽象模型
它的問題是什麼
1.僅有線效能力:本質只在做求和後做了一次資料轉換,只能表達特徵間的線性關係,缺少非線性的能力。
2.引數少:我們可以把節點的連線數量作為引數量,引數的具象表達就是這個線(真實情況其實是一個向量)。 引數有點少,比如上圖只有三個引數(w1,w2,w3),引數少會顯著限制模型的表達能力,這個非常符合直覺,比如人類之所以超脫於萬物就是因為大腦神經元多,且得到了相對有效的利用。
一起發明全新模型
有沒有辦法增加一下引數量,並且增加一下非線性。
輸入我們沒法加了因為其用來接受特徵向量=特徵向量的維度,輸出節點代表了我們最終要的預測結果,也是固定的。那麼只能在計算節點來擴充套件了,我們頭腦風暴下,可能的擴充套件結構如下:

圖 22 可能的方案
圖 1 我們利用圖設計了中間的計算層,假設這個節點可以隨便兩兩連線,圖 2 假設節點按照一定層次排序,n-1 層的節點只可以和 n 層的節點連線。其實兩圖引數量差不多,但是明顯圖2更清晰簡潔。所以我們選擇分層方案作為我們的模型架構。
引數量提升了,看起來很完美。
按照之前 LR 模型的經驗,引數會從白色節點傳進來,然後在綠色節點做求和,做後計算出來一個結果作為輸出。
我們簡化這個推導下這個過程(為了好理解,繼續隱藏了偏置 b):

圖 23 簡化的模型

其表達還是一個線性方程,我們得到的還會一個複雜一點的LR。 面對非線性問題,怎麼辦呢,我們想到了 LR 模型最後的輸出 sigmoid 將資料做了非線性變化,把結果壓縮到了(0,1),如果把它前移,用在特徵計算階段,那麼不就可以表達特徵間的非線性關係了。
這麼隨意的嗎,其實演算法領域還真的就是這麼隨意,想到了就去試,別人沒試過就是我們的paper了🐶,所以我們的假設如下圖中上半部分:

圖 24 神經網路可能的樣子
人類大腦的思考過程可以理解是一個多個神經元的放電過程,如果訊號不強烈,會在中間某個神經元,訊號中斷,成為沒有啟用該神經元(上圖中間部分)。轉換成我們的模型,我們希望在某個節點,資料變成 0,不再往下傳播資料。sigmoid 很明顯可以模擬這個效果,因為其模擬了神元啟用的啟用動作,所以稱為啟用函式。但是在訓練的過程中,sigmoid會存在一些問題,資料過小或過大的時候,求導都是數字很小比如 0.001,梯度消失了。
還好有聰明的人發明了 relu(Rectified Linear Unit)(上圖下半部分)。 後來發現 relu 也有問題,就是小於0的情況下,求導都是 0,神經元就死亡了,不往下傳遞了。後來出來一堆修復這個 bug,比如給它小於 0 的部分加個斜率(Leaky ReLU),這個斜率不是寫死可以學習就是(PReLU),relu 系列應用非常廣泛,比如經典的 transformer 中,這個啟用函式可以隨便替換的,比如 bert 換成了GELU,有的大模型換成了swishGLU
啟用函式非常多,有人統計30 年來啟用函式的發展,發現有 400 多種啟用函式。來源論文《Three Decades of Activations: A Comprehensive Survey of 400 Activation Functions for Neural Networks》:https://arxiv.org/pdf/2402.09092

圖25 啟用函式
一般神經網路都會用一種啟用函式,用在隱藏層的每一層後。假如我們將這個啟用函式放在神經元連線的那條線上,並不去根據經驗提前指定,讓模型在訓練過程中,自由的選擇和調整這個啟用函式。這就是 24 年比較火的 KAN,曾經通稿滿天飛,要替換MLP,現在已經沒啥人提了,MLP 簡單且有效很難被替換掉。
除了啟用函式,而 w1 w2 權重引數又像是模擬了訊號的強弱。這裡先潑冷水,人類大腦不長這樣的,神經元首先就不是層次連線的(這麼設計的最主要原因是為了更方便應用反向傳播演算法),然後訊號的啟用涉及到非常複雜的生物現象,不是一個 relu 能表達的。拙劣的模仿也是模仿,所以這種建模的方式被稱為人工神經網路(ANN)。

圖 26 來源女兒的科普書《 dk拆解萬物大百科》
ok 我們摸到了一個全新領域的門檻,我們在機器學習演算法基礎上拓展出來新的模型結構,所以,人工神經網路很自然是其一個重要的分支。
萬能的MLP

圖 27 MLP
回到我們一起發明的分層方案,把特徵輸入作為輸入層,計算層作為隱藏層(我們直覺感受下它在幹嘛,其實就是它在偷偷學習,對特徵進行各種計算, MLP這個家離不開它),輸出層代表我們想要的結果(比如我們要對圖片可能屬於貓或者狗進行分類,那麼就是有兩個節點,分別表達是貓還是狗的機率),這種模型稱之為Multi-Layer Perceptron,簡稱 MLP,因為資料是向輸出節點單方向傳播的,又叫前饋神經網路(FFN,是不是很眼熟,這是大模型的核心元件)。與前饋神經網路對應的是反饋神經網路(如迴圈神經網路 RNN),資訊可以在網路中迴圈傳播。
MLP 是最簡單的神經網路模型,用工程視角來看,其特別像經典的 MVC 架構。在MVC 架構中,M 關注資料類似 MLP 中的特徵輸入;C 負責業務邏輯處理,類似 MLP 中的隱藏層對使用者特徵進行加工處理;V 是面向使用者的檢視,在 MLP 中輸出節層負責輸出預測結果。

圖 28 MLP 和 MVC
不過我們也發現了這樣畫不太表現出每一層之後用了什麼啟用函式(假設隱藏層我們用了 relu,輸出層用了sigmoid 來做二分類)。所以MLP 的圖一般這麼畫,並且旋轉了 90 度,變身一個蛋糕,後續我們圖都會沿用這種新的畫法。

圖 29 MLP 的畫法
就當我們發明的 MLP吧,其初出茅廬我們還不知道它有多強。先說結論它超級強,超級有用,以至於隨處可見。
程式碼
MLP 的程式碼非常簡單,比如下邊這個隱藏層用了 relu,最後一層用了sigmoid,可以用來做二分類任務。
class MLPModel(nn.Module):
def __init__(self, input_dim):
super(MLPModel, self).__init__()
self.fc1 = nn.Linear(input_dim, 64) # 第一層,輸入到隱藏層
self.fc2 = nn.Linear(64, 32) # 隱藏層
self.fc3 = nn.Linear(32, 1) # 隱藏層到輸出層
self.activation = nn.ReLU() # 使用 ReLU 啟用函式
def forward(self, x):
x = self.activation(self.fc1(x)) # 第一層前向傳播
x = self.activation(self.fc2(x)) # 第二層前向傳播
return torch.sigmoid(self.fc3(x)) # 最後一層Sigmoid啟用
萬能函式
還記得我們提到過,如果能夠有一個“萬能公式”就好了,這樣每次都不需要選擇模型。
在深度學習領域,剛好有一個重要的理論——萬能逼近定理。該定理表明,只要具備至少一個隱藏層並配備足夠數量的神經元,多層感知器(MLP)能夠以任意所需的精度模擬任何複雜的連續函式。因此,MLP的有效性在於它將傳統機器學習演算法的單一函式能力提升到了接近“萬能函式”的水平(儘管實際上並不完全“萬能”,但至少是相當有效的)。
MLP 做了什麼:
1. 任何函式,都可以分成很多段的線性函式
2. 啟用函式,讓線性的神經網路具備了“分段”表達的能力。
既然一整個函式不好模擬,那麼分成 N 段,一段一段的模擬呢,分而治之。每當看到這個定理我都想到海底撈的扯麵,雖然不是很相似,但是我也很無奈,就立馬浮現畫面🐶,扯麵在徐崢手裡可以被拉成各種形狀,像極了我們 MLP 的靈活的擬合各種函式。

圖 30 MLP 之父徐崢
既然萬能,那就回歸和分類都可以做嘍。我們藉助服務商的例子(為了方便理解,我們假設每個特徵都可以用一個數字表示,剛好可以放在一個節點上)來了解下 MLP 怎麼做分類和迴歸。
-
迴歸:服務商每月可以提取一定數量的 iot 裝置去鋪設,我們會根據作業能力和一些指標,決定他下個月可以提多少。 -
二分類:判斷服務商當前喜歡哪些內容,並會發生點選的機率 -
多分類:服務商線下作業有很多型別,透過演算法給他匹配最適合做的幾種型別的任務。這裡還是我們之前的思路哈,sigmoid 可以表達 (0,1),多分類不太適合,換一個表達多種機率的啟用函式就好了,這裡可以選 softmax,(大模型最後的詞表匹配也是它,其計算了詞表中所有 token 作為下一個 token 輸出的機率)

圖31 MLP 處理分類、迴歸問題
只靠 MLP 我們就實現了模型的可擴充套件性(可以自由配置不同深度、不同引數量的隱藏層) 和可複用性(只用它,解決了分類和迴歸所有型別的任務),太強了太強了,有了 MLP ,我們要天下無敵,bushi🐶
但是不管怎樣 MLP 如一個好友,我們遇到任何問題都可以想起它。
搞科研
其實MLP 是深度學習領域最簡單的模型,接下來我們會藉助它打開了一個全新的世界。
還記得剛剛我們將 sigmoid 應用在每一層後的資料啟用轉化,本質上我們在嘗試各種可能性,既然開始搞了,我們就貫徹到底,開始假裝搞科研了🐶。
可是我們並不會啊啊啊啊,假裝自己會吧,想到科學家首先想到了雜交水稻之父-袁隆平院士,我們學一下吧,發現基因好的東西就往水稻(MLP)上拼。

圖 32 生物雜交
baseline
科研一般會選一個模型作為基線然後才好看我們後續的最佳化是不是正向最佳化,其作為一個參照物,我們就選 MLP 作為 baseline。輸入的特徵的線不要較真,為了美觀我隨便連了一下線,然後這個特徵會經過一個 embedding 層進行轉換,將特徵壓縮成 embedding,然後經過一個 concat 層將 embedding 從左到右連線在一起。

圖 33 MLP4Rec
交叉模型
Wide&Deep
我有一個鐵牛牛頭面,bushi,我有一個好點子。
還記得我們一開始搞的 LR 模型嗎,其特點是可解釋性強,MLP 的特點是泛化性好,可以模擬各種函式。我們要不取兩者所長,拼在一起,左手 LR,右手 MLP, 機器學習+深度學習兩手一起抓。
其實這就是大名鼎鼎的wide&deep。
Google於2016年提出了Wide&Deep模型,應用在 google play 應用商店的應用推薦。Wide&Deep模型的主要思路正如其名,是由單層的Wide部分和多層的Deep部分組成的混合模型(混合模型更早的是 facebook 2014 年的 GBDT+LR)。其中,Wide部分的主要作用是讓模型具有較強的“記憶能力”(memorization),LR擅長總結淺層規律;Deep部分的主要作用是讓模型具有“泛化能力”(generalization),善於挖掘潛在的深層規律,正是這樣的結構特點,使模型兼具了邏輯迴歸和深度神經網路的優點——能夠快速處理並記憶大量歷史行為特徵,並且具有強大的表達能力。
用我們的服務商內容推薦的場景來展示一下縫合的這個模型長啥樣:

圖 34 wide&deep
wide&deep很強,我們也很強,畢竟這麼牛的模型其實只領先我們 10 年不到,寫到這的時候時間是(2025 年 2月13日 21:30 )
wide&deep很強,但是也有缺點,主要缺陷是 LR 模型不能做特徵的交叉,我們可以理解為他只能表達 wa* a 特徵+wb*b 特徵,無法表達比如 a特徵 和 b 特徵交叉的情況,若要做也行,需要我們自己去手動搞出笛卡爾積那種特徵組合出來。
我們可以將LR 換成能天生自帶特徵交叉能力的 FM 模型,我們可以稱之為 fm&deep🐶。
DeepFM

圖35 deepfm
真實情況:2017年華為將Wide&Deep模型的 wide 部分從 LR 升級成為 FM,核心改進在於利用FM自動學習特徵組合的能力(FM 的核心思想是透過對特徵進行分解,生成低維的 embedding 來表示每個特徵,然後利用這些 embedding 的內積來捕捉特徵之間的互動關係),帶來了 DeepFM模型。其實這個模型影響力真的很大,現在還會被用在各種場景,其是和Wide&Deep一樣的經典模型。
DCN
對於Wide&Deep,作者 google也做了最佳化,不過沒用現成的模型來代替 LR,而是直面問題本質,既然 LR 不能特徵交叉,ok,重新設計一下 wide 部分,Google 稱之為Deep & Cross Network 簡稱 dcn。

圖36 dcn
cross 是一個向量,為了提升表達能力,Google 在 2020 年將其提升為一個矩陣,包含資訊更豐富。帶來了 V2 ,簡稱 dcn v2版本。
DCN-V2

圖 37 dcnv2
基準測試
大模型有很多基準測試,其實推薦演算法也有的,BARS是華為提出來的一個針對推薦演算法基準測試,包含三個資料集。我們上文提到的很多模型都出現在裡面了。其評測指標–對數損失和 auc,在該測試標準下,ONN 表現亮眼,其核心是一個 PNN 模型+FFM( 升級的 FM),說到 PNN,又是一個 MLP+乘積層 ,還是我們說的那種雜交實驗。我們上邊提到的dcn v2也表現優異。

圖38 BARS 測評
雜交成果展示

圖39 一些顯著的交叉推薦模型
有些模型我沒細寫,比如微軟的 deep crossing 會出現在彩蛋裡面。微軟也優化了DeepFM 提出了 xDeepFM,核心是設計了一個新的元件 CIN,拼接在了原來 deepfm 上,這裡我們就不展開講了,有興趣可以去探索下。
反正拼來拼去,我們變成了科學狂人的同時(按照這個思路去搞生物實驗,簡直不敢想,甚至有點害怕,感覺有生之年能見到活的哥斯拉,哈哈哈哈哈),模型搞出來一堆。
但是他們有一個共性就是,將使用者的特徵,內容的特徵一通交叉計算,最後搞出來一個結果,用這個莫名其妙的數字表達了使用者的點選意願程度。
突然不那麼萬能的MLP
MLP 只是理論上可以擬合所有的函式,但是複雜場景,可能需要提前設計超級深的隱藏層為代價。這樣無異加重了計算量,所以一般不這麼直接搞。一般會提前提取一下特徵,讓MLP模型學精華就好了。
表徵學習,我們與embedding 的再次相遇
還記得我們之前提到的是不是可以用一個模型自動化掉特徵工程,然後把這個模型拼接在 MLP 上,是不是就同時解決了特徵工程苦並且可以不用設計很深的 MLP 了。因為我們是用了一個新的模型做特徵的學習,期望它自己學習到特徵的表示,所以我們稱之為表徵學習(Representation Learning), 表徵的直觀形式就是一個 embedding,所以我們再次和老熟人見面了。
此時我們現在不明白怎麼就學到表徵了,只能假設是一個專門的神經網路在做,可能是一個 MLP?我們構想的開發模式從上演變成下邊:

圖40 表徵學習的設想
圖片表徵
假設原始資料是一張圖片,模型怎麼學到圖片裡面的特徵呢,比如有天空正在下著雪,雪下有一個湖,湖心有個亭子,湖中人鳥聲俱絕,而我們正在亭中一邊看雪,一邊拿著毛筆寫文章《湖心亭看雪》。
這其實一直都是 CNN(卷積神經網路) 在解決的問題,其模型很多, LeCun 早在 1998 年就發明了 LeNet-5,它的模型如下:

圖41 cnn 表徵學習
我們不用去理解每一層做了什麼,只明白一個道理,原始圖片到最後的全連線層(MLP) 中間的這幾層是在做特徵的提取,最終學到特徵的正確表達,就是我們說的表徵學習。
那 CNN 怎麼進行的表徵學習呢,核心是卷積層+匯聚層。還記得我們嘗試的分詞提取一句話的特徵嗎,句子本質是一個 N*1的資料,有一個滑動視窗在提取 token,圖片可以理解為擴充套件成了 N*M,我們把這個視窗擴充套件成a*b(一個方塊) ,讓它像一個滾筒在圖片上滾動,不停刷下特徵來,稱之為特徵圖,最終用一個匯聚層從特徵圖中提取顯著特徵。N 個卷積層+1 個匯聚層可以看成一個整體,我們可以把他們左手右手重複很多遍。
比如 alexnet vgg 都是如此,有一個主要思路是怎麼像堆積積木一樣把模型搭起來。

圖42 從 alexnet 到 VGG
最後的特徵資料(embedding)就可以會作為 MLP 的輸入進行學習訓練學習了。上圖可以看到模型在最後的輸出層是 1000 個節點,是因為當時alexnet vgg 兩個模型參加了 ImageNet 大賽,模型需要從 1000 個分類中分辨出照片真實可能的類別。
文字表徵
那文字又如何?
在前文我們劇透了 word2vec 就是將文字中學習到 embedding 表徵。因為詞不會脫離句子存在,我們可以把想要計算的詞作為 loss,去掉這個詞的句子作為輸入。還是老樣子,第一步先做特徵工程,我們把詞(token)進行one-hot 編碼。
接下來藉助一個一個滑動視窗,比如每次選擇 2N+1 個 token,中間詞作為需要預測的詞,視窗內的其他詞作為上下文。視窗不停的滑動,模型學不止。(這是一種方式稱為CBOW,還有一種方式和這個是倒轉關係,透過中心詞來預測上下文,稱之為Skip-gram)這裡有一個細節上下文所有詞的 embedding 做了平均,用來表達要預測的詞。
就這樣用大量的語料去訓練,模型最後透過做這個填空題,明白所有詞具體的意思是什麼,為什麼出現在這個位置。

圖 43 詞表徵
如圖中的例子,表達我每天喝咖啡,經過大量訓練後的模型會透過 softmax準確的匹配到咖啡的機率是 62%。Wv*n 代表了模型學習到所有詞的embedding表示,其中 V 是全量詞表的大小,N 是我們想要最終 embedding 的維度,比如 512 維。
有了這個向量就可以做我們之前說的國王和女王的embedding計算了。 除了加減法還可以做相似度計算,方式有很多,比如餘弦相似度,皮爾遜相關係數,歐幾里得距離。
我們本次只介紹最簡單的餘弦相似度,餘弦相似度的取值範圍是 [-1, 1],其中 1 表示兩個向量方向完全相同(夾角為0°),-1 表示完全相反(夾角為180°),0 表示兩個向量正交,即無關聯(夾角為90°)比如貓和狗是比較相近的詞,餘弦相似度表達不出來兩個向量真正的距離,如果需要就要用歐幾里得距離了。


圖44 相似度計算
圖譜表徵
對於社交屬性比較強的場景,我們可以構建領域的知識圖譜。圖譜的優勢可以表達出不同使用者之間的關係,並且可以依次洞察到潛在的關聯。
我們之前提取一個使用者特徵的方式是分別看他的年齡、性別、出生地等等特徵,如果把這個人放在圖譜裡,透過圖譜表徵,這個表徵就可以表達出他的社交資訊,一個人的表示突然就更立體了,聽起來真不錯。
那怎麼提取呢?有點難,不過我們已經知道了 word2vec 從文字中提取了文字表徵,透過 CNN 提取到圖片表徵。思路開啟分別借鑑一下。前者稱為隨機遊走DeepWalk,後者稱為 GCN。
DeepWalk(論文:DeepWalk: Online Learning of Social Representations)核心思想是將網路中的節點看作是單詞,將節點隨機遊走序列看作是句子,依賴這個圖就可以產生無數的句子後作為樣本,然後用類似於word2vec的技術來學習,最終獲得節點的 embedding表示。

圖45 從圖到 embedding
圖卷積網路(Graph Convolutional Networks 論文: Semi-Supervised Classification with Graph Convolutional Networks )用於從圖結構資料中學習節點表示。這些表示不僅包含了節點的內在特徵,還捕捉了其圖上下文——即節點與其鄰居的關聯。GCN透過集合每個節點和它周圍節點的資訊來提取圖的資料特徵,這個過程有點像卷積神經網路(CNN)提取特徵的方式。在 GCN 中,節點的特徵不僅看自己的資訊,還會受到鄰居節點特徵的影響,像是使用一個滑動視窗來聚合周圍的資訊。透過堆疊多個卷積層,GCN 能夠逐步學習到更深層次的圖結構資訊,最後提取出重要的特徵。

圖46 GCN
GCN 這種利用了神經網路的演算法統稱為Graph Neural Networks,GNN。 GNN 領域演算法很多,比如加了注意力機制的 GNN就是 GAT(Graph Attention Networks),具體可以參考一下阿燈老師的《知識圖譜演算法綜述》,非常全面。綜述論文可以看下《Graph neural networks: A review of methods and applications》
如何處理時序
單獨用 MLP 其實處理不了時序資料。如下圖,我們分詞後輸入模型其實破壞了本身時序行,隱藏層不會先處理卡再處理皮,無法理解卡在皮之前(其實 word2vec 也是如此,沒有考慮詞的順序)。有沒有辦法,讓模型按照時序處理特徵呢。

圖47 MLP 能處理時序嗎?
RNN
那就一個一個 token 餵給模型,比如先給卡再給皮。
嗯,說幹就幹

圖48 我們的假設
不過還要想辦法把兩個圖連線起來,讓模型先學了第一個 token 之後,在學第二個 token 的時候,仍然有上下文記憶。我們可以用一個狀態記住資料,然後每一步學習的時候去更新就好了,我們稱這個狀態為隱狀態h(hidden state)。
假設我們要模型把卡皮巴拉每一個漢字分別翻譯成漢語拼音。h0 初始為 0。RNN 根據輸入 "卡" 和隱藏狀態 h0 計算出當前的隱藏狀態 h1,併產生輸出 "ka" 。

圖49 RNN
我們發現模型只能一個輸入對應一個輸出,常見的翻譯任務其實不太能做,因為不同語言分詞後不是一一對應的,比如我輸入漢字卡皮巴拉翻譯成英文“capybara”
工程同學在架構中有一個很有趣且有用的方式,遇事不決加一箇中間層,讓它緩衝一下問題,比如訊息中介軟體、API 閘道器。這種思路我們可以用一下,具體是我們讓之前的 RNN 只做學習,學完後統一輸出一份 embedding,新增一個模型去專門解碼。
我們的例子,卡皮巴拉讓模型先理解一波,先彆著急輸出,把最終的整體理解作為h0輸入,讓另外一個模型做輸出。這其實就是 encoder-decoder 的思想,比較早的模型 seq2seq 就是在解決這個問題。

圖50 seq2seq
但是 RNN 也有缺陷,比如輸入超級長,比如輸入 10000 個字,最後一個字的上一個隱狀態,可能已經把第一字忘記了,記性不太好。有兩種解決思路,1 選擇性遺忘,把一些不重要的資訊忘記,只記一些關鍵資訊 2 增強記憶,長序列也能夠訪問過去的輸入。前者是 LSTM 和 GRU 後者是自注意力機制。
LSTM

圖51 lstm
LSTM單元包含三個門:遺忘門、輸入門和輸出門,這些門共同控制資訊的流動。
遺忘門決定哪些資訊被丟棄,輸入門控制新輸入資訊的傳入,輸出門控制從當前單元到下一個時間步的輸出。 另外有一個單元狀態(cell state)貫穿在網路中傳遞,能夠在各個時間步之間保持和傳遞資訊。
GRU

圖52 gru
GRU簡化了LSTM的結構,它只有兩個門:更新門和重置門。
更新門用來控制前一時間步的單元狀態傳入當前狀態的程度,像LSTM的遺忘門和輸入門的結合體,重置門用來控制忘記前一時間步的資訊的程度。GRU提供了與LSTM類似的效能,但引數更少,也更好理解。
self-attention
注意力機制則提供了一種更靈活的方式來處理序列資料。它允許模型在每一個時間步都檢視整個輸入序列,並根據當前的任務動態地選擇關注哪些部分。這樣模型可以更直接地捕捉不同詞之間的關聯關係,而不僅僅依賴於序列中詞的順序位置。
我們還是用當面付的描述-“掃碼或出示付款碼支付,資金馬上到賬”,用 bert-chinese-base 模型(bert 基於 transformer-encoder,自帶自注意力機制,是雙向注意力機制)可以看到“資”這個 token 對其他 token 的有不同的注意力權重,所有token 平分了權重 1。

圖53 直觀感受自注意力
透過這張圖我們看到是第 1 個頭的注意力,第1層的注意力。嗯, 自注意力是一個元件,可以並行很多個,由它和 FFN 殘差連結等組成的 block 可以重複 N 層。比如 bert-base 具有 12 個頭,12 層。下圖是第1 層第 5 個頭的注意力表達:

圖54 直觀感受自注意力 2
多個並行的Self-Attention稱之為Multi-Head Attention MHA,每個 head 都獨立地學習不同的注意力權重,類似於多個朋友給我們建議,他們的關注點都不同,最後融合一下他們的不同建議,可以同多個角度理解事情。
Native Sparse Attention

我們用了Self-Attention之後會發現挺好,但是有一個比較明顯的感覺,就是每個 token 要關注其他 token,比如 100 個 token,就會產生一個 100*100 的注意力矩陣,文字一長就會因為引數多影響訓練和推理速度。
圖 54 我們會發現,很多值都在 0 附近,有研究發現,真正需要注意的 token 只有 20% 左右,注意力是sparse的。問題就變成了怎麼減少這個 token 數量了。比如參考一下LSTM 的邏輯呢,某個 token有選擇的關注一下其他重要的 tokens。
deepseek 最新的論文《Native Sparse Attention: Hardware-Aligned and Natively Trainable Sparse Attention》提到了一種分層的稀疏策略,將注意力機制劃分為三個分支:壓縮(把 token 序列切成多個塊,每塊用 MLP 壓縮成一個 token,粒度很粗,可以理解為做了分塊總結)、選擇(挑選最關注的 N 個 token)和滑動視窗(保留最末尾的幾個 tokens,越近保留的資訊量越大),依賴這個設計使得模型能夠同時捕獲全域性上下文和區域性細節,從而提高了模型處理長文字的能力。
發明 transformer
關於ransformer是變壓器還是變形金剛我現在也沒搞明白,曾看過一個人站變形金剛這個觀點,認為encoder-decoder 是汽車人一邊拆一邊重新組裝做變身🐶

自注意力來源於transformer,transformer 又從我們上邊提到的 seq2seq 進化而來,兩者同出自 Google。關於原理相信大家已經麻木了,所以不再貼模型及解釋了。船漲老師的《人工智慧 LLM 革命系列 1 前夜:一文讀懂橫掃自然語言處理的 Transformer 模型》寫的非常透徹。
我們前文已經邊學習邊科研搞出來很多東西了,現在是時候用已有的知識想辦法自己搭一個transformer 出來。
第一步先簡單特徵工程,one-hot,然後把特徵資料輸入到 self-attention中做表徵學習。學完之後輸出到到 MLP 中學習,MLP 的最後一層的節點個數是詞表的大小,其表達未歸一化的分數,這些分數被稱為 logits(logit蒸餾就是讓 student模型學到這個資料分佈),最後藉助 softmax判斷每個詞的機率,最後選擇機率最高的那個 token。

圖55 我們的發明 1
第一版設想,試了下效果不是特表好,還是之前我們發明 MLP 的思路,再增加一點引數,貌似現在只能把子注意+MLP左手右手重複 N 遍了, 最後再用一層神經元把多個注意力學到 embedding 壓縮到詞表大小。然後得到了下邊的模型:

圖 56 我們的發明 2
繼續加引數,我們可以把中間層再作為一個整體左手右手重複 N 次。這也是 transformer 的高可擴充套件性優點了,可以擴充套件成大引數模型的基礎。

圖57 我們的發明最終版
這其實已經表達出了 tranformer-decoder 模組的核心了,我們可以自定義指定MHA 的層數集每個 MHA 中自注意力的頭數。可以把神經網路設計的超級深了,但是深了會有兩個問題,怎麼加快訓練讓模型收斂,模型很容易梯度消失。所以會加兩個元件在 MHA 中 Layer Normalization和殘差連線,這兩個兄弟算是深度學習模型中的基礎元件了,就是我們 transformer 模型圖中見到的 add&norm。另外輸入MHA 之前,會加上位置編碼(Positional Encoding),讓模型真正瞭解我們輸入的每個詞的順序。另外會對 MHA 做一點改造,確保模型在預測下一個詞時,不能看到後續的詞,防止未來資訊洩露,實現單向注意力,稱之為Masked Multi-Head Attention。
最後我們看一眼真正的 transformer 模型圖中的 decoder 模組,對比下我們的發明和本尊。

圖58 真實的 transformer
魔改 transformer
另外需要注意的是 17 年這個模型就來了,截止到目前已經 8 年時間了,不同的人肯定會有不同的理解,世界在進步,模型在進步,不會存在一個絕對牛的東西存在,transformer 代表的大模型是不是 AGI 的唯一路徑,以及大模型本身會不會拋棄 transformer 另尋出路,這個都是未知。
目前已知的 transformer魔改思路如下 下圖左邊Model-level 部分,不同的工作把每個元件換了個遍,比如我們之前提到sparse attention:

圖59 來源於論文《A Survey of Transformers》
學成歸來,重新做推薦
我們之前科研的模型上線後,會產生很多使用者的行為資料,比如某個使用者在週一看了籃球鞋,週二看了籃球,週三又看了籃球鞋,我們可以大致猜到他想換一身打籃球的裝備了。這個行為序列的資料很有用,可以想辦法用起來。
|
|
|
|
|
|
|
|
怎麼給使用者歷史訪問的商品列表做特徵工程呢,比如用 muti-hot,顯然體現不出來使用者訪問的時序,使用者的興趣是稍縱即逝的,所以還是想辦法,專門對歷史資料做一下興趣提取。
時序模型
DIN
使用者的興趣建模,比如我們怎麼知道使用者當前喜歡什麼,下一個喜歡的東西什麼,捕捉使用者的興趣變化,其本質是使用者此刻在注意什麼,這個時候首先想到了萬能的注意力機制。

圖60 din
這就是大名鼎鼎的Deep Interest Network,簡稱DIN,出自阿里巴巴。模型的關鍵創新之處在於其對使用者歷史行為資料的處理。透過引入一種注意力機制(其和 transformer 同期,都發表在 17 年 6 月,所以 DIN注意力機制是另外一套方案),DIN能夠動態地對於不同的候選商品賦予不同歷史行為資料相應的權重,以便突出與當前預測最相關的使用者興趣點。
阿里深耕電商,在興趣建模這個領域影響力十足,有使用者行為序列肯定就會面臨超長序列的問題,另外其注意力機制也在演進。
演進過程有引入 GRU 的DIEN, 將使用者的行為分割成不同的“會話”(session),並引入自注意力機制的 DISN,應對一個人可能有多種興趣的MIND,以及超長序列的的 SIM。
Interest Clock
來自2024年抖音的論文,Time Perception in Real-Time Streaming Recommendation System,提到基於自己場景設計的時鐘興趣推薦模型,抖音認為使用者在一天 24h 的興趣是不同的,所以用不同的時鐘興趣表達使用者。
具體做法是透過構建小時級個性化偏好特徵,利用正態分佈對使用者的時間感知偏好進行平滑處理(之所以平滑是希望音樂風格可以平滑切換),形成興趣時鐘嵌入。然後,這些嵌入被輸入到 DCN v2 深度模型中進行預測。抖音將這個推薦演算法應用在了自家的汽水音樂。

圖61 興趣時鐘
拿來主義
我們知道 gru bert transformer 都是在語言領域(NLP)應用廣泛的模型。如果我們把使用者的行為資料理解成連在一起的tokens,行為變成了一段文字,文字又天然具有時序,所以可以稍加改造就可以用來做時序推薦了。這個思路下有一堆這種推薦模型,GRU4Rec,BERT4Rec,BST(transformer4rec)。

圖62 BST
這些模型屬於格局大開,世界萬物皆可為我所用。
注入更多的知識
我們重新審視一下這些模型,從知識角度來看,模型的發展是為了加入更多的知識,模型因為學的多進而懂得多。我們已經透過注意力機制引入使用者的行為資料,有沒有可能引入使用者的社會關係等知識圖譜資料。
我們之前聊的圖譜表徵學習就可以用上了,我們可以將圖譜中的使用者、內容計算 graph embedding 之後作為特徵輸入到一個 MLP (或者更復雜選一個,dcn deepfm 都行)。
LSTTM
2022年騰訊依賴其豐富的使用者圖譜資訊構造了兩張圖-長期行為圖譜和短期的圖譜,分別利用 GAT 捕捉興趣計算 embedding,最後作為 deepfm 的特徵進行學習,騰訊把該模型引用在了微信的內容推薦。

圖63 LSTTM
停下來稍作總結
經過上邊的學習,我們學了很多東西,可以簡單總結成幾點:
-
深度學習的一個重要正規化,可以總結為 embedding+MLP。前者可以透過模型學習到表徵,針對不同的模態有不同的方法,比如圖片-CNN,文字-word2vec、transformer,圖譜-GNN ,減少了特徵工程的工作。後者 MLP 代表了深度學習模型,我們可以根據自己的訴求去定製化它。 -
有了這個正規化我們就可以分別去做優化了。提升embedding的準確性,並開發一個強大的模型以進行有效學習。直觀地說,就是要將更多的知識以最高質量的形式融入到一個更強大、引數更多的模型中,讓其學到更多,做的更好。 -
有了這個 embedding,其實可以單獨用的,可以放在向量資料庫中,就可以做向量相似度召回,比如有了句子的 embedding 就可以提供一個 RAG 方案了。 -
我們的目標是讓模型預測使用者的點選機率。如果業務同時需要預測點選率和轉化率,那麼模型就需要具備多工學習的能力,能夠綜合考慮這兩個任務的loss。 -
注意力機制出來後,所有的模型都在 transformer 化,後邊我們會藉著多模態,介紹 transformer 接管了 CV。
學完並且簡單消化之後,可以開始做事了,我們還要給服務商推薦內容。
我們的實踐
選模型
第一版本做了基礎的特徵工程後,先選了下模型,進行無數次了實驗,發現 dcnv2 好點,所以我們選了這個模型。

圖64 實驗對比
透過我們之前的瞭解,有幾個思路可以去最佳化。
1.建設領域知識圖譜,將使用者和 item 放在一張圖中,讓其在一個空間,透過 GNN 獲取 graph embedding。
2.對於時序資料用 transformer 的 mha 來提取興趣表達
知識圖譜
對於什麼是知識圖譜,這裡簡單介紹下。一開始我以為是一個某種演算法,其實知識圖譜本質是上一個用了各種演算法構建圖譜的方式,本質上是工程+演算法的聚合體。

圖65 知識圖譜流程
如圖不同的型別的資料會透過比如NLP 演算法提取關鍵資訊後存入到圖資料庫,依賴這個圖資料庫構造出領域圖譜,並在圖譜上做 GNN 等演算法推理。
我們首先依賴螞蟻的知識圖譜平臺-知蛛搭建了支付寶服務商領域的知識圖譜。
時序特徵
透過 transformer 的多頭注意力 MHA學習了時序特徵後新增一路時序特徵輸出給 dcn v2。我們發現加入後,模型的效能是提升明顯的。 mcc 提升0.31,F1 提升 0.25,recall 提升 0.24。
更合適的 loss
在我們場景正負樣本差異較大,正負比例 10:1。所以我們用了一個更適合的 loss–GHMC,減少訓練偏差。
更豐富的標籤
此時大模型已經非常成熟了,所以我們藉助大模型產生文字標籤,具體思路是我們預置了 N 個標籤,讓大模型透過描述文字,選擇合適的多個標籤。然後標籤特徵工程後輸入到模型。
美好假設
我們看一下作為打工人是怎麼做事的。面對一個新的的任務,我們往往不需要從頭開始學習,之前的很多經驗都可以做到複用,繼續偷懶到底。回到演算法模型這裡:
-
每次有了需求都要重新訓練一個模型,是不可以存在一個基礎模型,它具有基本認知能力,等新任務來了,只需要稍加訓練(遷移學習)就可以快速適應新任務,真正的做到重複使用。

-
如果用全人類的知識+目前最強大 transformer 模型,是不是就可以可以訓練出一個史無前例的模型。
後一個想法其實是大模型的思路,下一章我們會藉著大模型的演進,將深度學習帶入預訓練模型+遷移學習的正規化。
運籌帷幄,快捷搭建企業經營資料大屏
隨著數字化建設推進,如何從複雜的業務資料的中洞察趨勢、輔助決策,成為了企業現代化管理的一項關鍵挑戰。阿里雲DataV資料視覺化平臺提供一站式企業經營資料大屏建設方案,提供監控大屏、PC看板、移動端看板等覆蓋全端的經營資料即時監控與分析決策能力。
點選閱讀原文檢視詳情。