一般學(xué)機(jī)器學(xué)習(xí)的都知道有個(gè)定理,就是說(shuō)整體誤差Mean Square Error(MSE)包括了Bias(偏差)和Variance(方差)兩個(gè)部分,如果參數(shù)越來(lái)越多,那么Bias會(huì)越小,而Variance會(huì)越大。道理也很簡(jiǎn)單,因?yàn)閰?shù)越多,越容易擬合真實(shí)的向量,但每個(gè)參數(shù)的估計(jì)都帶來(lái)一點(diǎn)隨機(jī)性,整體方差當(dāng)然就大了。
一般的最小二乘是無(wú)偏估計(jì),為了降低方差,提高泛化能力,一般會(huì)犧牲精度,比如各種正則化方法都可以降低方差,但都會(huì)引入Bias。
但所有以上這些,都是在低維統(tǒng)計(jì)眾的結(jié)論,也就是默認(rèn)參數(shù)的個(gè)數(shù)p小于樣本的數(shù)量n。
但到了高維統(tǒng)計(jì),也就是p>n甚至p>>n的時(shí)候,也就是p遠(yuǎn)大于n的時(shí)候,以上結(jié)論有時(shí)候并不成立。
就好像牛頓力學(xué),只在低速宏觀物體運(yùn)動(dòng)中成立,但在高速微觀運(yùn)動(dòng)中并不成立。機(jī)器學(xué)習(xí)、統(tǒng)計(jì)學(xué)其實(shí)跟統(tǒng)計(jì)物理有類似的地方。
比如現(xiàn)在的機(jī)器學(xué)習(xí)中有個(gè)詞叫做double descent,也就是所謂“雙重下降”,指的測(cè)試誤差隨著參數(shù)個(gè)數(shù)的增加,一開(kāi)始先下降,然后上升,這是傳統(tǒng)機(jī)器學(xué)習(xí)的情況;但到了高維機(jī)器學(xué)習(xí),某些情況下,隨著參數(shù)的增加,它還會(huì)繼續(xù)下降。
比如這是一幅比較經(jīng)典的double descent的圖:
double descent
還有一些簡(jiǎn)化實(shí)驗(yàn)的圖
都可以看到,隨著features(特征)的數(shù)目逐漸增加,測(cè)試誤差先下降,然后增加,最后繼續(xù)下降。
這個(gè)就具有很強(qiáng)大的現(xiàn)實(shí)意義,意味著人們不用擔(dān)心訓(xùn)練集過(guò)度優(yōu)化,不用擔(dān)心大力出奇跡,不用擔(dān)心過(guò)度擬合,只要成本可以支持,比如超級(jí)計(jì)算機(jī)夠強(qiáng)大,內(nèi)存足夠大,完全可以擬合超級(jí)復(fù)雜的模型,參數(shù)越多越好,反正最后測(cè)試集誤差也是會(huì)下降的。
主要的原因在于,比如p>>n,這里n=200,如果p=400,也就是特征數(shù)目是400,遠(yuǎn)大于樣本數(shù)量。進(jìn)一步假設(shè),其中只有200個(gè)特征是有意義的,其它都是噪音;那么噪聲變量越多,有意義的那部分特征只是一個(gè)更小的子空間,預(yù)測(cè)將越來(lái)越不準(zhǔn)確,bias會(huì)越大,因?yàn)轭A(yù)測(cè)會(huì)越來(lái)越不準(zhǔn)確;但同時(shí),由于噪聲多了,如果加入一定的正則化條件,那么分配給每個(gè)特征的系數(shù)絕對(duì)值會(huì)更小,也就是variance會(huì)更小,反而不容易過(guò)度擬合。
比如我找一篇雄文來(lái)說(shuō)明一下,美國(guó)統(tǒng)計(jì)學(xué)總統(tǒng)獎(jiǎng)得主、斯坦福統(tǒng)計(jì)系的大佬、統(tǒng)計(jì)學(xué)習(xí)圣經(jīng)Elements of Statistical Learning的作者Tibshirani,他兒子小Tibshirani在一篇論文是這么寫(xiě)的:
看來(lái)美國(guó)也是階層固化啊,統(tǒng)計(jì)學(xué)大佬的兒子繼續(xù)搞統(tǒng)計(jì),說(shuō)不定未來(lái)也拿總統(tǒng)獎(jiǎng)。學(xué)術(shù)壟斷,世風(fēng)日下。
回到正題,反正也說(shuō)明我說(shuō)的沒(méi)錯(cuò),還真有這事。因此,繼續(xù)可以得到一些反直覺(jué)的結(jié)論:
  1. 數(shù)據(jù)不要太多。比如有200個(gè)特征,如果用1000個(gè)數(shù)據(jù),那么是p>n,普通的低維統(tǒng)計(jì);但如果用100個(gè)數(shù)據(jù),就是p>n,變成高維統(tǒng)計(jì)了,高維統(tǒng)計(jì)就不怕過(guò)度擬合了。
  2. 可以盡情使用更多的參數(shù)和更復(fù)雜的模型。因?yàn)槊菜拼罄姓f(shuō)最后測(cè)試誤差還是會(huì)下降的,那么只要參數(shù)越來(lái)越多,大力出奇跡就可以的。
  3. double descent不是深度學(xué)習(xí)特有。
上面例子可以看出,普通的線性回歸也會(huì)有這樣的特性,所以也不要太迷信深度學(xué)習(xí)。結(jié)構(gòu)太復(fù)雜,反而掩蓋了事情的本質(zhì)。
最后簡(jiǎn)單用R語(yǔ)言做一個(gè)實(shí)驗(yàn)來(lái)驗(yàn)證一下:
random_features <- function(n=100, d=100, num_informative_features=20) {
  y <- rnorm(n)
  X <- matrix(rnorm(n*min(d, num_informative_features)), nrow=n) + y
  if (d>num_informative_features) 
    X <- cbind(X, matrix(rnorm(n*(d-num_informative_features)), nrow=n))
  return (list(X=X,y=y))
library(lmeVarComp)
set.seed(200)
n <- 200
ds <- seq(from=20, to=2*n, by=20)[-10]
num_informative_features <- 1000
nreps <- 10
mses <- matrix(0, nrow=length(ds), nreps)
train_errors <- matrix(0, nrow=length(ds), nreps)
for (rep in 1:nreps) {
  mse <- c()
  train_error <- c()
  for (d in ds) {
    aa <- random_features(n,d,num_informative_features)
    Xtrain <- aa$X
    ytrain <- aa$y
    w <- mnls(Xtrain, ytrain)
    bb <- random_features(round(n/10),d,num_informative_features)
    Xtest <- bb$X
    ytest <- bb$y
    mse <- c(mse, sum((ytest-Xtest%*%w)^2))
    train_error <- sum((ytrain-Xtrain%*%w)^2)
  }
  mses[,rep] <- mse
  train_errors[,rep] <- train_error
}
mean_mse <- apply(mses, 1, mean)
plot(ds,mean_mse, type="l")
最后上圖:
很明顯看到了double descent,測(cè)試誤差先下降后上升,在p=n會(huì)爆炸,這里圖刪除了那個(gè)點(diǎn),否則會(huì)壓縮的太厲害;然后p>n之后又繼續(xù)下降了。
另外還可以看到訓(xùn)練集的誤差是零,高維統(tǒng)計(jì)一般可以在訓(xùn)練集做到完美擬合:
mean_te <- apply(train_errors, 1, mean)
plot(mean_te, type="l")

值得注意的是,這里求解使用了minimum norm least squres(mnls),這個(gè)不同于lasso,ridge和least squares,需要用到專門(mén)的包求解。由于p&gt;n,普通的最小二乘無(wú)法求解,如果是lasso、ridge,似乎沒(méi)有類似的效果。不清楚python有沒(méi)有類似的包,Julia會(huì)更方便,直接就行。
對(duì)于量化交易的啟示也類似,如果不怕過(guò)度擬合,那么建模是很容易的事情。當(dāng)然,交易有風(fēng)險(xiǎn),入行需謹(jǐn)慎,我也只是拋磚引玉。