§01學習重點
- 說出金融業在這個時間點擁抱機器學習的三股推力:機器可讀資料的爆炸、算力與儲存的持續成長、fintech 帶來的競爭壓力
- 區分「統計建模」與「機器學習」兩種文化的核心差異:是否假設資料生成過程、推論優先還是預測優先
- 解釋神經網路為何是線性迴歸與 logistic 迴歸的非線性推廣,據此回應「黑盒子」疑慮
- 用偏差–方差取捨解讀訓練誤差與測試誤差的分岔,親手重現過擬合的 U 形曲線
- 建立熵與交叉熵的白話直覺,說出「最小化交叉熵等於最大化概似」這條橋
- 描述監督式學習在演算法交易、高頻交易執行、房貸建模三個場景的用法與各自的陷阱
- 預告強化學習如何把「預測」升級為「決策」,以及它為何是本課程第三部的主角
§02課程內容
一、為什麼是現在:資料、算力與競爭
金融業對「用資料做決策」並不陌生——選擇權定價、風險值、信用評分,全是數學模型的老戰場。真正改變的是三件事。
第一是資料。這波轉變有個關鍵推手:2007–2008 年金融危機讓各國監管者痛定思痛,發現自己過去對銀行體內的風險看得太粗,於是要求金融機構把放款條件、交易部位的契約細節逐筆申報上繳——台灣讀者可以想像聯徵中心那種顆粒度,但範圍擴及整個銀行體系。金融機構的合規回報負擔因此暴增,監管者手上的資料量也第一次達到「大數據」的量級。同一時間,「另類資料」興起——社群媒體情緒、衛星影像、信用卡刷卡紀錄、新聞文字流,這些都不是傳統報價與財報體系裡的東西。這類資料有幾個共同特徵:非結構化、維度極高(變數個數常常超過觀測筆數)、充滿缺漏值。古典計量經濟學的工具箱建立在線性代數與低維假設上,面對這種資料常常直接失效。
第二是算力。便宜的平行運算與雲端儲存,讓「掃過數百萬種模型設定、在高維空間裡搜尋」從奢侈品變成日常操作。機器學習方法的計算成本曾是門檻,現在不是了。
第三是競爭。fintech 把演算法直接推到消費者面前:機器人理財顧問用演算法管理投資組合;詐欺偵測是金融業最早的機器學習應用之一,從 logistic 迴歸與樸素貝葉斯起家,一路演化到深度學習;區塊鏈與加密貨幣則把整張交易圖攤開在公眾面前,催生了以網路結構為對象的新型金融計量。另一頭,量化避險基金與高頻交易商早已把機器學習當成軍備競賽的一環——演算法交易是金融業裡機器學習滲透最深的先行區。
值得一提的是,業界對機器學習同時存在熱情與健康的懷疑:它不是點石成金的魔法,而是一組必須被嚴格驗證的工具。這門課的立場也是如此——先把工具的邏輯講清楚,再談它能做什麼、不能做什麼。
二、機器學習到底在學什麼
把機器學習講到最素:它研究的是「輸入到輸出的映射」。給你一組輸入 \(X=(X_1,\dots,X_P)\)(P 個特徵,例如過去五天的報酬、公司的財務比率),你想預測一個輸出 \(Y\)(例如下週的超額報酬、會不會違約),機器學習的任務就是從資料裡建構一個映射 \(Y = F(X)\)。輸出是連續值時叫迴歸,輸出是類別時叫分類。
依照「資料長什麼樣、回饋長什麼樣」,機器學習分成三種範式:
- 監督式學習:資料是一對一對的 \((x_i, y_i)\)——特徵配標籤,像附了標準答案的練習題。目標是學出 X 與 Y 的關係。本章與課程第一、二部的主角。
- 非監督式學習:只有 \(x_i\),沒有標籤。目標是找出資料的內在結構——分群、降維、找出隱藏形態。像拿到一大箱沒分類的照片,自己把相似的歸成一堆。
- 強化學習:不是「一題一答」,而是「一連串決策」。代理人在環境中行動,環境回饋獎勵,目標是最大化長期累積獎勵。交易執行、投資組合調整、平倉時機,天生都是這種「序列決策」問題。
監督式模型還有一個常用的分法:判別式模型直接學「給定輸入之下,輸出的條件分布」(神經網路、決策樹屬於此類);生成式模型學輸入與輸出的聯合分布,能反過來生成資料,但通常更難建。本書與本課程以判別式模型為主。
三、兩種文化:統計建模 vs 機器學習
統計學家 Leo Breiman 在 2001 年寫過一篇著名的論文,把資料分析分成「兩種文化」。這個分野是理解本課程所有內容的地基。
統計建模文化先假設一個「資料生成過程」(data generating process):資料是由某個已知形式的機率模型產生的,例如「報酬服從線性因子模型加上常態誤差」。有了這個假設,就能做參數估計、算信賴區間、檢定係數是否顯著——R 平方、t 值、p 值這一整套語言都建立在它上面。它的目標是推論:搞懂變數之間的因果與解釋結構。
機器學習文化則把資料生成過程當成未知,不假設資料從哪個模型來,直接用演算法在資料裡找輸入輸出的映射,用樣本外預測表現當唯一的裁判。模型選擇靠數值最佳化與正則化,而不是資訊準則與顯著性檢定。它的目標是預測:在沒見過的資料上準。
比喻: 兩位偵探辦同一件案子。第一位先寫好劇本——「兇手是為財行兇的熟人」——然後檢驗每條證據跟劇本合不合,這是統計建模:先假設資料怎麼來,再驗證。第二位不預設劇本,把上千小時的監視器畫面全部看完,讓可疑模式自己浮現,這是機器學習:不猜資料怎麼生成,直接從資料裡找規律。劇本派的結論可以解釋給法官聽,但劇本猜錯就全盤皆輸;畫面派抓得準卻常說不清「為什麼」。
兩個常見誤解要當場拆掉。第一,「用了迴歸就不算機器學習」——錯。判準不在函數形式,而在方法論:同樣是線性迴歸,若假設誤差服從常態分布並據此做推論,是統計建模;若不對誤差做參數假設、用正則化控制複雜度、以樣本外表現選模型,就是機器學習的用法。第二,「兩者是敵人」——也錯。它們是同一條光譜的兩端:普通最小平方法在最左,ridge、LASSO 這些正則化迴歸站在中間(保留部分解釋力、換取樣本外表現),神經網路在最右。實務上的成熟做法,是讓機器學習模型與計量模型並肩跑,觀察兩者的差異,而不是把舊工具全部丟掉。
還有一組分類值得記住:參數式模型的參數個數有限(線性迴歸、混合模型、神經網路都算),結構先定好;非參數式模型的參數空間可以無限成長(核方法、高斯過程),複雜度隨資料長大。神經網路通常以參數式的方式訓練,但它的參數多到足以逼近極複雜的函數——這正是下一節的主題。
四、神經網路不是黑盒子:它是迴歸的非線性推廣
金融從業者對神經網路最大的疑慮是「黑盒子」:看不懂它在做什麼,怎麼敢把錢交給它?回應這個疑慮最好的辦法,是指出一件常被忽略的事實——神經網路與你早就信任的迴歸模型,是同一個家族。
一個前饋神經網路是 L 層函數的複合:
逐項拆解:\(\hat{Y}(X)\) 是模型對輸出的預測;\(f^{(\ell)}\) 是第 \(\ell\) 層做的變換;小圈圈 \(\circ\) 表示「函數串接」——前一層的輸出當下一層的輸入;\(W^{(\ell)}\) 是第 \(\ell\) 層的權重矩陣(每條連線的強度),\(b^{(\ell)}\) 是偏移項(迴歸裡的截距);\(\sigma^{(\ell)}\) 是激活函數——一個非線性的「彎折」,例如把負數壓成零。整個網路就是「線性變換、彎一下、再線性變換、再彎一下」的疊加。
關鍵來了:如果把激活函數換成「什麼都不做」的恆等函數,彎折消失,兩層網路立刻塌縮回一層:
逐項拆解:把括號乘開,\(W' = W^{(2)}W^{(1)}\) 是兩個權重矩陣的乘積——仍然是一個矩陣;\(b' = W^{(2)}b^{(1)} + b^{(2)}\) 仍然是一個向量。也就是說,沒有非線性激活的神經網路,不管疊幾層,就是一條線性迴歸 \(Y = W'X + b'\)。同理,在輸出端套上 sigmoid 函數 \(\sigma(z) = 1/(1+e^{-z})\),讓輸出落在 0 與 1 之間當機率用,得到的就是 logistic 迴歸 \(\mathbb{P}(G=1 \mid X) = \sigma(WX+b)\)。時間序列這邊也一樣:第八章會看到,線性激活的循環神經網路(RNN)就是自迴歸模型 \(\hat{X}_t = \phi_1 X_{t-1} + \cdots + \phi_p X_{t-p}\) 的特例。
比喻: 線性迴歸是一把直尺,神經網路是一條可以彎的軟尺。軟尺不彎的時候,跟直尺量出來的結果一模一樣——直尺是軟尺的特例。你不會因為軟尺「能彎」就說它神祕;它只是多了貼合曲面的能力,而代價是你得學會控制它彎的程度。
用代碼驗證「軟尺不彎就是直尺」:
import numpy as np
rng = np.random.default_rng(42)
# 模擬 200 個交易日:5 檔股票的日報酬當特徵
X = rng.normal(0.0, 0.02, size=(200, 5))
true_w = np.array([0.8, -0.5, 0.3, 0.0, 0.6])
y = X @ true_w + rng.normal(0.0, 0.005, size=200)
# 一個「兩層、恆等激活」的神經網路
W1 = rng.normal(size=(4, 5)); b1 = rng.normal(size=4)
W2 = rng.normal(size=(1, 4)); b2 = rng.normal(size=1)
def net(x):
h = W1 @ x + b1 # 第一層(激活 = 恆等函數)
return W2 @ h + b2 # 第二層
# 把兩層「摺」成一層:W_eff x + b_eff
W_eff = W2 @ W1
b_eff = W2 @ b1 + b2
pred_net = np.array([net(x)[0] for x in X])
pred_flat = X @ W_eff.ravel() + b_eff[0]
print("兩層網路 vs 摺疊後單層,最大差異:", np.abs(pred_net - pred_flat).max())
# 輸出:兩層網路 vs 摺疊後單層,最大差異: 2.220446049250313e-16
# 最小平方法閉式解,直接還原 true_w
Xb = np.hstack([X, np.ones((200, 1))])
w_ols = np.linalg.lstsq(Xb, y, rcond=None)[0]
print("OLS 估計權重:", np.round(w_ols[:5], 3))
# 輸出:OLS 估計權重: [ 0.808 -0.466 0.292 0.013 0.584](真實權重 0.8 -0.5 0.3 0.0 0.6)最大差異是 \(2.2\times 10^{-16}\)——浮點數的精度極限,兩者在數學上完全相同。理論上還有一個保證:只要有一個隱藏層加上非線性激活,神經網路就能以任意精度逼近任何連續函數(通用逼近定理)。所以正確的心智模型不是「黑盒子 vs 白盒子」,而是一條從線性到非線性的連續光譜——你對它的信任,應該建立在驗證紀律上,而不是函數形式上。至於「能彎」帶來的新風險,就是下一節的主題。
五、過擬合:機器學習的頭號職業病
模型越彎越貼資料,聽起來是好事,直到你發現它連雜訊都貼上去了。這就是過擬合(overfitting)——機器學習實務裡最核心、也最容易在金融裡釀禍的問題。
診斷工具是偏差–方差分解。假設真實關係是 \(Y = f(x) + \varepsilon\),其中 \(\varepsilon\) 是平均為零的雜訊,我們用資料訓練出估計 \(\hat{f}\),那麼在一個新樣本點上的期望平方誤差可以拆成三塊:
逐項拆解:\(\sigma_\varepsilon^2\) 是不可約誤差——雜訊本身的變異,神仙也消不掉;\(\mathrm{Bias}\)(偏差)是「模型太簡單、系統性偏離真實關係」的誤差——用直線硬套曲線,怎麼估都不準;\(\mathrm{Var}\)(方差)是「模型太敏感、換一批訓練資料結果就大變」的誤差——模型把這批資料的雜訊當真理背了下來。模型複雜度低,偏差大、方差小(欠擬合);複雜度高,偏差小、方差大(過擬合)。兩者此消彼長,取捨(tradeoff)由此得名。
裁判是誰?樣本外資料。把資料切成訓練集與測試集,訓練誤差只反映「背得多熟」,測試誤差才反映「學得多好」。跑一個實驗:
import numpy as np
rng = np.random.default_rng(7)
def make_data(n):
"""模擬某訊號 x 與下期報酬 y 的非線性關係(含雜訊)"""
x = rng.uniform(-1.0, 1.0, n)
y = 0.04 * np.sin(2.5 * x) + rng.normal(0.0, 0.01, n)
return x, y
x_tr, y_tr = make_data(30) # 訓練集:只有 30 筆
x_te, y_te = make_data(200) # 測試集:模擬「未來沒見過的日子」
for d in (1, 3, 12):
coef = np.polyfit(x_tr, y_tr, d)
mse_tr = np.mean((np.polyval(coef, x_tr) - y_tr) ** 2)
mse_te = np.mean((np.polyval(coef, x_te) - y_te) ** 2)
print(f"次數 {d:>2d}|訓練 MSE {mse_tr:.6f}|測試 MSE {mse_te:.6f}")
# 輸出:
# 次數 1|訓練 MSE 0.000168|測試 MSE 0.000183
# 次數 3|訓練 MSE 0.000071|測試 MSE 0.000090
# 次數 12|訓練 MSE 0.000054|測試 MSE 0.000157一次多項式(直線)欠擬合:訓練與測試誤差都高。三次多項式剛剛好:測試誤差最低。十二次多項式把 30 筆訓練資料背得爛熟——訓練誤差最低——但測試誤差反而回升到直線的水準附近。訓練誤差隨複雜度單調下降,測試誤差走出 U 形:這條 U 形曲線是整個機器學習實務的中心圖像。
比喻: 過擬合就是那個把十年考古題背到滾瓜爛熟的學生。考古題(訓練集)拿滿分,因為連題目裡的錯字都背下來了;上了考場(測試集)遇到新題,成績反而不如老老實實理解原理的同學。訓練誤差是考古題分數,測試誤差才是大考分數——而市場每天出的都是新題。
金融場景還有一層加碼的殘酷:資料有時間順序。切訓練集與測試集必須沿著時間切——用過去訓練、對未來測試——絕不能讓未來的資訊滲進訓練集(這叫前視偏差)。對治過擬合的正式武器是正則化(在損失函數裡對複雜度收費,LASSO、ridge、dropout 都是這一路)與交叉驗證,第四章會系統性地講;貝葉斯方法則天生內建防過擬合機制,是第二、三章的主題。
六、熵:給「不確定性」一把尺
模型選擇需要一把量尺來衡量「模型抓到了多少資訊」。這把尺來自資訊理論,核心概念是熵(entropy)。
白話版:熵衡量一個隨機事件平均帶來多少「驚訝」。明天太陽從東邊升起——零驚訝、零資訊;一枚公正硬幣的正反——最難猜、資訊量最大。把「市場明天漲的機率」記為 \(p\),這個二元事件的熵是:
逐項拆解:\(\log_2\) 用 2 為底,所以單位是位元(bit)——描述這個結果平均需要幾個 0/1;\(-\log_2 p\) 是「機率 \(p\) 的事件發生時你有多驚訝」(機率越小、驚訝越大);整條式子就是把兩種結果的驚訝程度用各自的機率加權平均。\(p=0.5\) 時熵最大(1 位元),\(p\) 趨近 0 或 1 時熵趨近零——結果早就知道,翻牌不帶來任何資訊。
模型選擇用的是它的延伸:交叉熵(cross-entropy)。真實分布是 \(f\)、你的模型是 \(g\),交叉熵衡量「用模型 \(g\) 去編碼真實世界 \(f\),平均要花幾個位元」:
逐項拆解:對每個可能結果 \(y\),用真實機率 \(f(y)\) 加權、但用模型機率 \(g(y)\) 算驚訝程度;模型猜得越偏,平均編碼成本越高。不等式說的是:交叉熵永遠不小於真實分布自己的熵,且只在 \(g = f\) 時取到等號——模型完美命中真實分布時,多付的位元數歸零(這個差額就是 KL 散度)。
import math
def entropy(p):
"""二元熵:一枚偏硬幣每擲一次平均帶來多少資訊(單位:位元)"""
if p in (0.0, 1.0):
return 0.0
return -p * math.log2(p) - (1 - p) * math.log2(1 - p)
def cross_entropy(p, q):
"""真實分布 p、模型分布 q 的交叉熵"""
return -p * math.log2(q) - (1 - p) * math.log2(1 - q)
for p in (0.5, 0.6, 0.9, 0.99):
print(f"P(漲)={p:.2f} -> H = {entropy(p):.4f} bits")
# 輸出:0.50→1.0000, 0.60→0.9710, 0.90→0.4690, 0.99→0.0808
# 真實上漲機率 p=0.6,模型猜 q:交叉熵在 q=0.6 時觸底
for q in (0.50, 0.55, 0.60, 0.75, 0.90):
print(f"q={q:.2f} -> H(p,q) = {cross_entropy(0.6, q):.4f} bits")
# 輸出:q=0.50→1.0000, 0.55→0.9783, 0.60→0.9710, 0.75→1.0490, 0.90→1.4200實跑數字印證了理論:真實機率 0.6 時,模型猜 0.6 的交叉熵是 0.9710 位元——恰好等於真實分布的熵,一個位元都沒多付;往兩邊偏,成本都上升。這給了訓練分類模型一個自然的目標:最小化交叉熵。而最小化交叉熵在數學上就等於最大化概似(likelihood)——資訊理論與古典統計在這裡握手。這條線索第二章會接著講參數估計,暫時點到為止。
七、監督式學習上戰場:三個縮影
概念講完,看三個真實場景。三者刻意橫跨光譜:資料從每秒千筆到每月一筆,任務從訊號生成到風險管理——機器學習在每個場景的角色與陷阱都不同。
縮影一:演算法交易的訊號分類器。 想自動化「這週要持有自選組合、還是持有大盤指數」的決策。監督式學習的做法:把每個時點的「組合未來一週報酬是否跑贏大盤」編成 0/1 標籤 \(G_t\),用全體成分股過去五天的報酬當特徵向量,訓練一個分類器。這個例子最有教學價值的地方在問題形塑:特徵與標籤怎麼設計,比選哪個演算法重要得多——標籤必須「可交易」(贏過基準才值得動手)、特徵必須只用當下拿得到的歷史資訊。同樣重要的是一盆冷水:預測準確不等於策略賺錢,交易成本、滑價、部位限制都能把帳面優勢吃光。模型評估與策略回測是兩件事,混為一談是新手最貴的一課。
縮影二:高頻交易的執行預測。 現代交易所是一本電子限價簿:買單與賣單在不同價位排隊。造市商同時在買賣兩側掛單賺價差,但當一張大市價單把某一側整層吃掉,價格瞬間跳動,造市商單邊成交、反手回補就是虧損——這叫逆選擇。機器學習在這裡的任務不是「預測明天」,而是「預測下一瞬間」:用限價簿各價位的排隊量當特徵,預測短期價格變動的方向,讓掛單提早閃避。這個場景資料量極大(tick 級)、訊號極短命,工程與建模一樣重——而且監督式模型只能「預測後閃避」,無法把自己的下單對市場的影響納入考量,這個侷限為強化學習留下了伏筆。
縮影三:房貸建模的長期預測。 光譜的另一端:美國住宅房貸,一筆貸款每個月只產生一筆觀測,但存續期三十年,市場規模十兆美元級。建模方式是把貸款狀態編成「正常、逾期 30 天、逾期 60 天、止贖、提前還清……」的狀態集合,用借款人與總體變數當特徵,預測每月的狀態轉移機率——本質上是一個用分類器參數化的馬可夫轉移矩陣。這個場景最深刻的教訓來自 2008 年:危機前訓練的提前還款模型,在房價崩盤後系統性失準,因為驅動借款人行為的「制度」整個換了——過去由貸款年齡主導的規律失效了。交叉驗證在這裡救不了你:你關心的分布來自未來,而未來不在你的資料裡。長期預測沒有捷徑,領域知識與對模型極限的清醒認識,是唯一的護欄。
三個縮影合起來說了一件事:機器學習不是單一工具,而是一組必須配合資料頻率、任務性質與失效模式來部署的方法族。地圖上你的問題落在哪一格,決定了該用哪一章的武器。
八、從預測到決策:強化學習預告
到目前為止,模型都只是「旁觀者」:預測違約機率、預測價格變動,預測本身不改變世界。但金融裡許多任務不是旁觀,而是下場——你的動作會改變環境。大單下去,價格被你自己推走(市場衝擊);當你的模型影響放貸決策,它也在改變未來的違約分布。這時「預測」就不夠了,需要「決策」。
強化學習的框架是馬可夫決策過程:代理人觀察狀態(如庫存部位與限價簿形狀),選擇行動(下單、撤單、調整部位),環境回饋獎勵(風險調整後的損益)並轉移到新狀態;代理人要學的是策略——在每個狀態下怎麼行動,讓長期累積獎勵最大。跟監督式學習對照:監督式有老師逐題給標準答案;強化學習沒有老師,只有分數——你不知道「正確動作」是什麼,只能從獎勵訊號裡摸索出來。它面對的獨特難題包括:回饋延遲(今天的動作影響下個月的損益)、探索與利用的兩難(試新動作還是用已知的好動作)、以及金融環境的部分可觀測性。最適交易執行、動態投資組合配置、選擇權對沖與平倉,都是它的主場。第九章起我們正式進入這個框架;在那之前,先把監督式學習的地基打穩。
§03原書對照
本課以白話重組了原書第一章的骨架,以下內容原書有、但本課未展開,供進階讀者按頁碼深入。其一,人工智慧的起源敘事:從 1955 年達特茅斯暑期研究計畫的提案講起,並討論「機器取代人類判斷」這個敘事的限度與人腦算力的量級對比(pp.3–4)。其二,另類資料的四個特徵——非結構化、高維、稀疏、隱含網路資訊——以及古典計量方法在其上失效的線性代數原因;書中並以交互作用項的組合爆炸為例:特徵數為 p 時乘積交互項可達二的 p 次方減 p 減一個,十個特徵就超過一千項,人工指定模型幾乎必然漏掉結構(pp.5–6)。其三,完整的數學符號體系:以 one-hot 編碼把分類模型的輸出定義為條件機率向量,並推導二元情形下模型輸出即條件期望值、條件變異數為倒拋物線(pp.9–10,式 1.1–1.4)。其四,模型選擇雙例:以四筆二元輸入資料對照「硬規則查表模型」與「機率模型」,說明能以機率 1 重現資料的模型未必可取——大量彼此不同的機率模型都能以約 0.66 的機率產生同一張表,這是通往熵的動機(pp.10–11,例 1.1–1.2)。其五,交叉熵的完整數值推演、KL 散度、以及與最大概似估計的嚴格對應,並附偏硬幣的二元熵曲線圖(pp.12–13)。其六,生成式與判別式模型的正式區分,及受限玻爾茲曼機作為生成式例子(p.9)。其七,RNN 與計量的精確對應:線性單神經元 RNN 即幾何權重的 AR(p) 模型,含平穩性條件與 Ljung–Box 等診斷檢定的討論(pp.19–21)。其八,隨機動態規劃三例:多臂老虎機與累積遺憾(p.24,例 1.3)、600 美元跨三個流動性不同市場、成交機率不確定下的最適配置——以倒推遞迴解出各階段價值函數(pp.25–26,例 1.4)、指數組合的最適投資問題——自融資財富過程下,風險調整報酬的最適配置比例閉式解(pp.26–28,例 1.5)。其九,動量策略分類器的完整問題形塑,含標籤不平衡與離群值預測的討論(pp.29–32,式 1.18–1.19)。其十,S&P 500 e-mini 限價簿快照與 price-flip 機制圖解(pp.32–34,表 1.4、圖 1.7)。其十一,房貸八狀態馬可夫轉移矩陣的顯式寫法、不可通約狀態的處理,以及 2008 年危機前部分建模者把深度逾期貸款的清算誤標為自願提前還款(9 到 P 而非 9 到 D)導致系統性高估提前還款的案例剖析(pp.35–39)。其十二,章末的做市商賽局習題,把模型校準的好壞直接連到對賭損益(pp.41–43)。原書第一章對應印刷頁 pp.3–46。
§04作業和解答
作業一:把神經網路摺回線性迴歸
延續第四節的實驗:(1) 把網路加深到三層(維度自訂),全部用恆等激活,驗證它仍然塌縮成單一線性映射;(2) 把第一層激活換成 ReLU(\(\max(z, 0)\)),再比較「逐層計算」與「摺疊後單層」的預測差異,說明為什麼非線性激活讓摺疊失效。
解答 SOLUTION
import numpy as np
rng = np.random.default_rng(0)
X = rng.normal(size=(50, 5))
# (1) 三層恆等激活網路
W1 = rng.normal(size=(8, 5)); b1 = rng.normal(size=8)
W2 = rng.normal(size=(4, 8)); b2 = rng.normal(size=4)
W3 = rng.normal(size=(1, 4)); b3 = rng.normal(size=1)
def net3(x):
return W3 @ (W2 @ (W1 @ x + b1) + b2) + b3
W_eff = W3 @ W2 @ W1
b_eff = W3 @ (W2 @ b1 + b2) + b3
diff1 = max(abs(net3(x)[0] - (W_eff @ x + b_eff)[0]) for x in X)
print("三層恆等激活 vs 摺疊單層,最大差異:", diff1) # 實跑約 2.7e-15,數值零
# (2) 第一層換 ReLU
def net_relu(x):
h = np.maximum(W1 @ x + b1, 0.0) # ReLU 彎折
return W3 @ (W2 @ h + b2) + b3
diff2 = max(abs(net_relu(x)[0] - (W_eff @ x + b_eff)[0]) for x in X)
print("ReLU 網路 vs 線性摺疊,最大差異:", diff2) # 實跑約 6.34,明顯非零原理:恆等激活時每一層都是仿射變換,仿射變換的複合仍是仿射變換——矩陣連乘收成一個矩陣、偏移項收成一個向量,所以不管幾層都等價於一條線性迴歸。ReLU 把負值壓成零,這個操作依輸入而異(不同樣本被「折」在不同位置),無法寫成單一固定的矩陣乘法,摺疊因此失效——這正是深度網路表達力的來源:每個 ReLU 神經元貢獻一個折點,層層疊出分段線性的複雜曲面。
作業二:用資料量對抗過擬合
第五節的實驗裡,12 次多項式在 30 筆訓練資料上過擬合(測試 MSE 0.000157)。保持 12 次不變,把訓練樣本從 30 筆加到 300 筆,重跑實驗。觀察訓練與測試 MSE 的變化,並用偏差–方差的語言解釋。
解答 SOLUTION
import numpy as np
rng = np.random.default_rng(7)
def make_data(n):
x = rng.uniform(-1.0, 1.0, n)
y = 0.04 * np.sin(2.5 * x) + rng.normal(0.0, 0.01, n)
return x, y
x_tr, y_tr = make_data(30)
x_te, y_te = make_data(200)
x_big, y_big = make_data(300)
for xa, ya, tag in ((x_tr, y_tr, "n=30 "), (x_big, y_big, "n=300")):
coef = np.polyfit(xa, ya, 12)
mse_tr = np.mean((np.polyval(coef, xa) - ya) ** 2)
mse_te = np.mean((np.polyval(coef, x_te) - y_te) ** 2)
print(f"{tag}|訓練 MSE {mse_tr:.6f}|測試 MSE {mse_te:.6f}")
# 輸出:
# n=30 |訓練 MSE 0.000054|測試 MSE 0.000157
# n=300|訓練 MSE 0.000085|測試 MSE 0.000087解讀:訓練樣本加到 300 筆後,測試 MSE 從 0.000157 降到 0.000087,訓練與測試誤差幾乎收攏(0.000085 對 0.000087)——過擬合消失了。偏差–方差語言:12 次多項式的偏差本來就低(夠彎,罩得住真實曲線);問題出在方差——30 筆資料撐不住 13 個係數,係數被雜訊牽著走。樣本變十倍後,雜訊在平均中互相抵銷,係數估計穩定下來,方差大幅縮小。這揭示了取捨的另一個維度:模型能開多複雜,取決於資料餵得起多少。金融的殘酷之處在於,很多場景(如房貸的制度變遷)你想加資料也加不到——受限的不是演算法,是歷史只發生過一次。
作業三:交叉熵、KL 散度與最大概似
真實世界某二元事件的發生機率是 \(p = 0.7\)。(1) 計算真實分布的熵 \(H(0.7)\);(2) 兩個模型分別預測 \(q = 0.6\) 與 \(q = 0.7\),各自的交叉熵是多少?多付的位元數(KL 散度)是多少?(3) 說明「最小化交叉熵」與「最大化概似」為什麼是同一件事。
解答 SOLUTION
(1) \(H(0.7) = -0.7\log_2 0.7 - 0.3\log_2 0.3 \approx 0.8813\) 位元。
(2) 模型 \(q=0.7\):交叉熵 \(H(f,g) = -0.7\log_2 0.7 - 0.3\log_2 0.3 = 0.8813\) 位元,與熵相等,KL 散度為 0——模型完美命中真實分布。模型 \(q=0.6\):交叉熵 \(= -0.7\log_2 0.6 - 0.3\log_2 0.4 \approx 0.7\times 0.7370 + 0.3\times 1.3219 \approx 0.9125\) 位元,KL 散度 \(\approx 0.9125 - 0.8813 = 0.0312\) 位元——這 0.031 位元就是「模型猜偏」的資訊代價。
(3) 對 n 筆獨立觀測,對數概似是 \(\sum_i \log g(y_i)\)。當 n 夠大,各結果出現的頻率趨近真實機率 \(f(y)\),平均對數概似趨近 \(\sum_y f(y)\log g(y)\)——正是交叉熵的負值(差一個對數底的常數倍)。所以「調整參數讓交叉熵最小」與「調整參數讓資料出現的機率最大」是同一個最佳化問題的兩種說法:前者是資訊理論的語言,後者是古典統計的語言。深度學習框架裡的 cross-entropy loss,本質上就是在做最大概似估計。
作業四:交叉驗證救不了的東西
第七節說,2008 年的房貸模型失準「交叉驗證救不了」。請解釋:(1) 交叉驗證防的是哪一類錯誤?(2) 制度變遷(regime change)屬於哪一類問題,為什麼交叉驗證對它無效?(3) 對這類問題,實務上有哪些務實(雖不完美)的緩解手段?至少舉兩個。
解答 SOLUTION
(1) 交叉驗證防的是過擬合:它反覆把手上的資料切成訓練與驗證兩半,估計模型在「同一個分布的新樣本」上的表現,藉此選出泛化最好的模型複雜度。它的隱含前提是:未來的資料與手上的資料來自同一個分布。
(2) 制度變遷是分布移轉問題:訓練資料來自舊制度(房價上漲、寬鬆放貸),要預測的未來來自新制度(房價崩盤、信貸緊縮),兩者根本不是同一個分布。交叉驗證再怎麼切,切出來的每一份都還是舊制度的資料——你無法從不含未來的資料裡驗證對未來的預測。這是認識論層面的限制,不是演算法層面的缺陷,換更強的模型也繞不過去。
(3) 務實的緩解手段包括:一、模型穩定性優先——刻意使用少量、可預測、經濟意義清楚的特徵(如貸款年齡、原始信用分數),犧牲貼合度換取跨制度的穩健;二、壓力測試與情境分析——不問「模型預測什麼」,改問「若房價下跌三成,模型的預測還站得住嗎」,主動在訓練分布之外檢驗;三、新舊模型並肩跑——讓機器學習模型與傳統計量模型同時運作,兩者預測出現系統性分歧時,把分歧本身當成制度可能正在變化的警訊;四、監控輸入分布——持續檢驗上線後的輸入資料是否漂離訓練分布,漂移超標就觸發重新訓練或人工接管。共同精神:承認模型的有效範圍,把「範圍外」的偵測做成制度。
§05參考資料
- Breiman, L. (2001). Statistical Modeling: The Two Cultures. Statistical Science 16(3) — 「兩種文化」概念的出處:資料建模文化與演算法建模文化的原始論戰。
- Gu, S., Kelly, B., & Xiu, D. (2018). Empirical Asset Pricing via Machine Learning. NBER Working Paper 25398 — 機器學習用於資產定價的代表性實證研究,樹模型與神經網路捕捉非線性交互作用的證據。
- Shannon, C. E. (1948). A Mathematical Theory of Communication. Bell System Technical Journal — 熵與資訊理論的奠基論文,本章第六節概念的源頭。
- Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press(免費線上版) — 深度學習標準教科書,前饋網路、正則化與最大概似的嚴格處理。
- scikit-learn:Underfitting vs. Overfitting 官方範例 — 與本章第五節同構的多項式過擬合實驗,可互相對照。
- Sirignano, J., Sadhwani, A., & Giesecke, K. (2016). Deep Learning for Mortgage Risk. arXiv:1607.02470 — 以 1.2 億筆美國房貸資料做深度學習風險建模,本章房貸縮影的學術參照。
- Heaton, J. B., Polson, N. G., & Witte, J. H. (2016). Deep Learning in Finance. arXiv:1602.06561 — 深度學習於金融預測與分類問題的早期綜述。
- Dixon, M. F., Halperin, I., & Bilokon, P. (2020). Machine Learning in Finance: From Theory to Practice. Springer — 本課程對照之原書,第一章 pp.3–46。