習(xí)綜合題型復(fù)盤)
又到刷題時間。這個系列我自己都想吐槽說好每周更新一次結(jié)果硬是拖成了不定期更新。好在前三次的內(nèi)容都是實打?qū)嵉牡谝淮伟裀ython工具鏈和NumPy廣播機制過了一遍第二次集中刷了邏輯回歸、決策樹這些經(jīng)典算法的推導(dǎo)第三次用PyTorch完整搭了一個手寫數(shù)字分類網(wǎng)絡(luò)。如果你是從第一篇跟到現(xiàn)在的基礎(chǔ)部分基本穩(wěn)了如果是中途進來的直接做第四次這套綜合練習(xí)遇到不懂的再回頭翻前面的文章補課效率反而更高。AI入試這個詞我按最寬泛的理解來用人工智能方向的入學(xué)復(fù)試、企業(yè)算法崗筆試、以及各類AI能力認證考試都算。這類考核有個共同點就是特別愛考看起來基礎(chǔ)、實際上容易翻車的問題而且經(jīng)常把數(shù)學(xué)推導(dǎo)、代碼實現(xiàn)和概念判斷揉在同一道題里。第四次練習(xí)我就故意把這種綜合題挑出來做成了帶詳細解析的練習(xí)合集適合正在備考、或者想檢驗自己是否真正掌握AI基礎(chǔ)的人。整套題不追求偏難怪而是追求問到你平時忽略的為什么。1. 第四次練習(xí)的整體定位與選題思路1.1 前三次練習(xí)留下的地基先簡單交代一下系列進度。第一次我?guī)е蠹野裀ython的列表推導(dǎo)式、NumPy的廣播機制、矩陣乘法練到閉著眼能寫第二次重點講邏輯回歸和決策樹的公式推導(dǎo)以及它們在真實數(shù)據(jù)上的表現(xiàn)第三次主要是用PyTorch搭建全連接網(wǎng)絡(luò)把數(shù)據(jù)加載、模型定義、訓(xùn)練循環(huán)完整走了一遍。三輪下來你會發(fā)現(xiàn)一個尷尬的事實單個知識點做題都會一旦混在一起腦子就容易卡殼。于是第四次我換了一種玩法不再按知識點為單位出題而是按題型為單位出題——同一個考點用選擇題、推導(dǎo)題、編程題輪番轟炸看看自己是不是真懂了。這也是我備考AI入試最真實的需求考試不會只問什么是過擬合它一定會讓你判斷這個現(xiàn)象是不是過擬合或者讓你想辦法減輕過擬合。所以這次練習(xí)每一類題我都盡量做成概念推導(dǎo)場景的復(fù)合結(jié)構(gòu)而不是孤立的記憶題。做題時你可以先獨立完成一遍再看后面的解析這樣效果比直接閱讀答案好得多。1.2 為什么這輪選題主打綜合手推認真研究過幾套相關(guān)筆試和復(fù)試題目之后我發(fā)現(xiàn)出題人有一個共同偏好希望篩選出真懂原理而不是背住結(jié)論的人。所以概念題后面往往跟著一個為什么計算題又要求你寫出中間步驟。給我的啟發(fā)是平時刷題不能只盯著答案對錯而是要練推導(dǎo)速度和表達的嚴謹性。第四次的四類題型我是這樣規(guī)劃的題型考察能力本次題量建議用時概念辨析題是否真正理解核心術(shù)語3道每題3分鐘手推計算題能否獨立完成公式推導(dǎo)2道每題8分鐘公式應(yīng)用題能否把數(shù)學(xué)知識落到場景3道每題5分鐘編程實現(xiàn)題能否把算法轉(zhuǎn)成代碼1道12分鐘選擇題檢驗?zāi)阒恢篮喆痤}檢驗?zāi)隳懿荒苤v清楚計算題檢驗?zāi)愀也桓覄邮炙憔幊填}檢驗?zāi)懿荒馨压阶兂煽蓤?zhí)行代碼。四類都過一遍才算真正掌握一個考點。這套思路你在準備任何技術(shù)考核時都可以復(fù)用。2. 機器學(xué)習(xí)基礎(chǔ)概念題與易錯點復(fù)盤2.1 類別不平衡下指標(biāo)選擇是個送命題先上這道選擇題它在我刷過的題目里出現(xiàn)頻率極高。題目在一個二分類任務(wù)中正樣本僅占1%你覺得哪個評估指標(biāo)最不靠譜A. AccuracyB. F1-ScoreC. AUCD. Recall正確答案是A。原因很簡單如果模型把所有樣本都預(yù)測為負類Accuracy能到99%可這個模型一點用都沒有。用生活化的話說就像天氣預(yù)報天天報不下雨一個月里雖然只錯了兩三回但我們想要的從來不是這種平均正確率。在正負樣本嚴重失衡的業(yè)務(wù)場景里準確率會被多數(shù)類主導(dǎo)完全掩蓋少數(shù)類上的表現(xiàn)。F1-Score是精確率和召回率的調(diào)和平均在這種場景下能反映模型對少數(shù)類是否真的捕捉到了AUC看的是正負樣本排序能力受不平衡影響相對較小Recall則直接關(guān)心真正的正樣本我撈回來多少。所以看到類別不平衡五個字第一反應(yīng)應(yīng)該是排除Accuracy優(yōu)先考慮F1、AUC、PRC。這里特別提醒PRC在正樣本極少時比ROC更敏感很多參考答案不提這一點但你答出來會是加分項。再補一道延伸思考如果業(yè)務(wù)場景是識別交易欺詐正樣本就是欺詐交易非常稀少你會更看重Precision還是Recall答案取決于代價。如果一次誤判會把正常用戶凍住損失很大那就往Precision偏如果要盡可能抓住所有欺詐不管誤傷就主攻Recall。所以考試里不要只背指標(biāo)公式還要學(xué)會結(jié)合場景說取舍。2.2 偏差-方差分解簡答題這樣答才能拿全分第二道高頻簡答題請用偏差-方差分解解釋過擬合與欠擬合。我的建議答題框架分四步。第一步直接寫公式泛化誤差 偏差^2 方差 噪聲。第二步說清偏差和高低欠擬合模型太簡單對訓(xùn)練數(shù)據(jù)都擬合不好屬于高偏差、低方差過擬合模型把訓(xùn)練數(shù)據(jù)里的噪聲都學(xué)進去了屬于低偏差、高方差。第三步舉一個具體例子佐證比如用線性模型去擬合二次函數(shù)偏差很大、方差不大用九次多項式擬合少量點偏差小、方差極大。第四步給對策高偏差時增加模型復(fù)雜度、加特征、減少正則化高方差時增加訓(xùn)練數(shù)據(jù)、降低模型復(fù)雜度、加正則化、做交叉驗證。四步說完基本就是個小滿分答案。我在批改自己練習(xí)時發(fā)現(xiàn)一個常見錯誤很多同學(xué)把偏差理解成預(yù)測值和真實值的差這沒錯但在機器學(xué)習(xí)語境下偏差描述的是模型在大量不同訓(xùn)練集上的平均預(yù)測與真實值的差異方差描述的是模型在不同訓(xùn)練集上的變動程度。這兩個概念一定要從多次采樣訓(xùn)練集的角度理解否則一旦被追問為什么增加數(shù)據(jù)能減小方差就會卡住。事實上數(shù)據(jù)增多時模型見過的樣本分布更接近真實分布它對訓(xùn)練集具體樣本的依賴變小方差自然下降。2.3 梯度下降的變體們別只記名字這種題通常以填空或選擇形式出現(xiàn)。比如比較批量梯度下降BGD、隨機梯度下降SGD和小批量梯度下降Mini-batch GD的優(yōu)缺點。批量梯度下降每次用全量數(shù)據(jù)計算梯度方向最準但數(shù)據(jù)量大時速度慢而且容易停在局部極小隨機梯度下降每次用一個樣本更新快但震蕩劇烈?guī)г肼暦炊袡C會跳出局部極小小批量梯度下降折中每次用一小批兼顧穩(wěn)定與速度是實際深度學(xué)習(xí)訓(xùn)練最常用的方式。答題時最好補一句現(xiàn)代框架里的SGD默認指小批量隨機梯度下降而不是嚴格意義上的單樣本更新。這種摳定義的小細節(jié)很容易讓閱卷人覺得你確實動過手。這里再補充一個常被追問的點學(xué)習(xí)率怎么設(shè)。學(xué)習(xí)率太大損失曲線會震蕩甚至發(fā)散太小又收斂慢。常見的做法是用余弦退火或warmup加動態(tài)衰減初始學(xué)習(xí)率一般取0.01到0.001之間再根據(jù)驗證集損失做調(diào)整?;卮疬@類問題時只要把控制更新步長這個本質(zhì)講明白再給出一個具體量級和調(diào)整方向會顯得很有實操感。3. 深度學(xué)習(xí)與神經(jīng)網(wǎng)絡(luò)手推反向傳播3.1 從零手推一個神經(jīng)元不再怕鏈式法則AI入試里手推反向傳播基本是必考項。很多同學(xué)一看公式就頭大其實只用記住一句話梯度是損失對參數(shù)的偏導(dǎo)鏈式法則就是逐層求導(dǎo)再相乘。我們來看經(jīng)典的最小例子。設(shè)輸入 x2目標(biāo) y0.5初始參數(shù) w1.0b0.5激活函數(shù)是Sigmoid損失函數(shù)是均方誤差MSE。前向傳播的計算為z wx b 1.0 × 2 0.5 2.5 a sigmoid(z) 1 / (1 e^(-2.5)) ≈ 0.924 L 0.5 × (a - y)^2 0.5 × (0.924 - 0.5)^2 ≈ 0.0899反向計算 dL/dw 時按照鏈式法則拆成三段dL/da a - y ≈ 0.424 da/dz a(1 - a) ≈ 0.924 × 0.076 ≈ 0.0702 dz/dw x 2相乘得到 dL/dw ≈ 0.424 × 0.0702 × 2 ≈ 0.0595。偏置的梯度是 dL/db ≈ 0.424 × 0.0702 ≈ 0.0298。如果學(xué)習(xí)率設(shè)為0.1參數(shù)更新為 w_new ≈ 1.0 - 0.1 × 0.0595 0.99405b_new ≈ 0.5 - 0.1 × 0.0298 0.49702。手推這種題有幾個坑。第一個是搞混損失對輸出的導(dǎo)數(shù)交叉熵配合Sigmoid時推導(dǎo)會簡潔很多但這里用的是MSE必須老老實實算。第二個是參數(shù)更新的方向梯度下降是減去梯度方向別反。第三個是Sigmoid在z較大時梯度接近0這就是梯度消失的雛形手推題里如果激活輸出接近1或0梯度值會非常小要能意識到并說明。我的習(xí)慣是前向把 z 和 a 分別存成中間變量反向直接取用這樣既快又少出錯。備考時建議把用乘法鏈寫清每一步偏導(dǎo)當(dāng)成固定書寫格式閱卷人看著清晰自己也容易發(fā)現(xiàn)錯誤。3.2 特征圖尺寸與感受野別再被padding和stride繞暈這個知識點幾乎每次筆試都會出現(xiàn)考法通常是給輸入尺寸、卷積核大小、padding和stride讓你算輸出特征圖尺寸或者反過來求某個參數(shù)。通用公式是輸出尺寸 floor((W 2P - F) / S) 1其中W是輸入邊長P是padding單邊填充數(shù)F是卷積核大小S是stride步長。為什么加2P因為padding是在左右兩側(cè)都填充。為什么最后加1因為卷積核要覆蓋到最后一個可行位置類似從0開始的計數(shù)。用floor還是ceil取決于框架PyTorch默認是floor手算結(jié)果和機器結(jié)果一致。比如輸入32x323x3卷積padding1stride2先算32 2×1 - 3 31除以2得到15.5向下取整15再加1得到16輸出是16x16。再堆一層同樣參數(shù)16 2 - 3 15除以2得7.5取整7加1得8輸出8x8。很多同學(xué)在15.5這里直接四舍五入成16然后忘記再加1得出17這是最常見的錯誤。我建議用直覺檢查stride為2時輸出尺寸大致接近輸入的一半。32變成16符合直覺如果算出來是17或33大概率是取整和加1的順序錯了。池化層公式通常是 floor((W - F) / S) 1沒有padding。比如14x14輸入2x2池化stride2輸出是7x7因為(14-2)/217。真題里還喜歡讓你比較最大池化和平均池化在梯度傳播上的差異最大池化梯度只會回傳到前向中選中的那個位置平均池化則把梯度均勻分配到各位置。這些小點都答上說明你不是只會算尺寸。3.3 用感受野解釋為什么CNN喜歡堆小卷積核再補充一道簡答題感受野是什么意思怎么理解為什么很多網(wǎng)絡(luò)堆好幾層3x3卷積而不是直接用一個大卷積核感受野指某層特征圖上每個像素對應(yīng)原圖區(qū)域的尺寸。兩個3x3卷積堆疊特征圖上的一個點其實可以看到原圖5x5的區(qū)域參數(shù)量卻是2×(3×3×C×C)18C^2而一個5x5卷積的參數(shù)是25C^2。所以小卷積核堆疊在相同感受野下更省參數(shù)還引入了更多非線性層表達能力更強。計算參數(shù)量時注意不要漏掉輸入輸出通道單個卷積核的參數(shù)量是F×F×C_in×C_out有偏置還要加C_out。以上就是這類簡答題的完整答法先給定義再給參數(shù)對比最后說非線性帶來的收益。4. 數(shù)學(xué)基礎(chǔ)與編程實戰(zhàn)從推導(dǎo)到實現(xiàn)4.1 特征值特征向量PCA的前置考點矩陣特征值是線性代數(shù)部分的重頭戲考法很直白給你一個2x2矩陣求特征值和對應(yīng)的特征向量。例題A [[2,1],[1,2]]。先寫特征方程 det(A - λI) 0(2-λ)(2-λ) - 1×1 0 化簡得 (2-λ)^2 - 1 0 解得 λ 1 或 λ 3。λ1時代入 A - I [[1,1],[1,1]]解方程 (A-I)v0 得到 x1 x2 0所以取一個特征向量 v [1,-1]單位化就是 [1/√2, -1/√2]。λ3時代入 A - 3I [[-1,1],[1,-1]]解方程得到 x1 - x2 0取 v [1,1]單位化 [1/√2, 1/√2]。這一題在考試里往往只是起點后續(xù)會問用特征值大小說明矩陣性質(zhì)。最大特征值3對應(yīng)方差最大的方向如果把這個矩陣當(dāng)成某個數(shù)據(jù)的協(xié)方差矩陣主成分方向就是 [1,1] 方向它解釋了總方差的 3/(31)75%。這就是PCA的底層邏輯找到協(xié)方差矩陣特征值最大的幾個方向?qū)崿F(xiàn)降維。我備考時總結(jié)的答題模板是寫特征方程、求λ、逐個代回求特征向量、說明幾何含義。千萬不要只求λ就完事特征向量才是后續(xù)問題的關(guān)鍵。另外注意特征向量可以乘任意非零常數(shù)寫一個特征向量為...也可乘以任意非零常數(shù)既嚴謹又能避免和標(biāo)準答案有出入。4.2 信息熵與基尼指數(shù)決策樹計算題怎么拿分決策樹計算題在AI入試中屬于送分題前提是公式記熟并能手算。給一個常見考法給定劃分前后的純度指標(biāo)判斷哪個特征更好。假設(shè)一個二分類數(shù)據(jù)集有15個樣本其中正例9個、負例6個。某個特征把數(shù)據(jù)劃分為兩個子節(jié)點第一個子節(jié)點包含6個樣本正負各3個第二個子節(jié)點包含9個樣本正例6個、負例3個。請計算基尼指數(shù)。先算劃分前的基尼指數(shù)Gini(D) 1 - (9/15)^2 - (6/15)^2 1 - 0.36 - 0.16 0.48劃分后按樣本量加權(quán)Gini(D1) 1 - (3/6)^2 - (3/6)^2 0.5 Gini(D2) 1 - (6/9)^2 - (3/9)^2 1 - 4/9 - 1/9 ≈ 0.444 Gini_after (6/15)×0.5 (9/15)×0.444 ≈ 0.467基尼系數(shù)下降量 0.48 - 0.467 0.013。做特征選擇時應(yīng)該選讓基尼系數(shù)下降量最大的特征。同樣如果題里用信息熵就是用信息增益表示下降量。這兩種指標(biāo)本質(zhì)都衡量劃分前后不確定性減少多少。這類題最容易出錯的地方有兩個一是忘記按樣本數(shù)量加權(quán)直接把兩個子節(jié)點的純度做平均二是把基尼指數(shù)最小和基尼指數(shù)下降量最大搞混。決策樹在CART里建樹時是遍歷特征和閾值選擇下降量最大的切分點所以如果問哪個特征更好比的是下降量不是節(jié)點純度的絕對值。我在實際練習(xí)中會把這類題寫在錯題本上重點標(biāo)記加權(quán)平均四個字。4.3 樸素貝葉斯一個條件概率的應(yīng)用題樸素貝葉斯高頻考點集中在貝葉斯公式和樸素的由來。例題已知 P(A|B)0.8P(B)0.3P(A|非B)0.2求 P(B|A)。根據(jù)貝葉斯公式P(B|A) [P(A|B)P(B)] / [P(A|B)P(B) P(A|非B)P(非B)] (0.8×0.3) / (0.8×0.3 0.2×0.7) 0.24 / 0.38 ≈ 0.6316這道題考的不只是公式還考分母是否寫全。分母里必須包含互補條件下的全概率項也就是 P(A|非B)P(非B)很多同學(xué)會漏掉這一項。另一個??嫉狞c是樸素二字的含義即特征之間條件獨立的假設(shè)P(x1,x2|y)P(x1|y)P(x2|y)?;卮饡r說明這個假設(shè)簡化了聯(lián)合概率計算雖然實際很難完全滿足但很多場景下效果依然不錯所以被稱為樸素。4.4 編程題手寫K折交叉驗證不調(diào)庫最后是一道代碼題。我選了K折交叉驗證因為它在筆試里出現(xiàn)頻率高而且手寫能檢驗?zāi)銓?shù)據(jù)切片、隨機種子、循環(huán)流程是否真正理解。用NumPy手寫一個簡單的切分函數(shù)import numpy as np def kfold_split(n_samples, k, shuffleTrue, seed42): index np.arange(n_samples) if shuffle: rng np.random.default_rng(seed) rng.shuffle(index) # 每折至少 n_samples // k 個樣本余數(shù)從第一折開始分配 fold_sizes np.full(k, n_samples // k, dtypeint) fold_sizes[: n_samples % k] 1 folds [] current 0 for fold_size in fold_sizes: folds.append(index[current:current fold_size]) current fold_size return folds使用邏輯很簡單。n_samples20、k5時每折大小是4n_samples23時前3折大小為5后2折大小為4。訓(xùn)練循環(huán)里把驗證折以外的所有索引拼成訓(xùn)練集folds kfold_split(23, 5) for i in range(5): val_idx folds[i] train_idx np.concatenate([folds[j] for j in range(5) if j ! i]) # 在這里訓(xùn)練模型用 train_idx 訓(xùn)練用 val_idx 驗證注意 np.concatenate 傳入的是一個列表列表里每個元素是一個數(shù)組不要用列表相加否則會變成嵌套而不是扁平化。實踐里最常見的錯誤是忘記shuffle導(dǎo)致有序數(shù)據(jù)直接按類別塊切分驗證集就會全是同一類評估結(jié)果虛高或虛低。另一個細節(jié)是使用 np.random.default_rng(seed) 而不是 np.random.seed np.random.shuffle這樣可以避免污染全局隨機狀態(tài)在多次重復(fù)實驗時尤其重要。如果筆試要求的是嚴格的Stratified KFold還需要按類別比例逐層分配樣本手寫復(fù)雜度會高很多先寫出基礎(chǔ)版并說明若要保證類別比例還需分層抽樣已經(jīng)能拿到大部分分數(shù)。5. 易錯點與應(yīng)試策略踩坑記錄5.1 AI入試筆試最常見的三個丟分位置根據(jù)我自己的練習(xí)記錄和身邊備考者的反饋丟分往往不在難題而在基礎(chǔ)題三個位置。第一個是概念混淆Bagging和Boosting搞反、L1和L2正則化說不清、歸一化和標(biāo)準化用錯場景。解決方法是畫一張對比表把相似概念的區(qū)別寫清楚考前只看這張表。第二個是計算粗心特征圖尺寸公式里漏了padding的2倍、特征值方程展開錯符號、基尼指數(shù)忘記加權(quán)。解決方法是每道計算題都先寫公式再帶入不要跳步。第三個是代碼細節(jié)手寫交叉驗證時忘記shuffle梯度下降里把梯度和參數(shù)更新方向搞反。這些坑在平時刷題時發(fā)現(xiàn)比考試時丟分更值錢。我建議把錯題按概念型/計算型/代碼型分類記錄考前只看錯誤原因欄效率極高。5.2 我的答題順序與時間分配建議AI入試這類綜合性筆試時間通常比較緊。我的習(xí)慣是先用2分鐘掃一遍所有題目標(biāo)記哪些是需要長時間計算的、哪些是概念題。做題順序上先做計算題和編程題因為它們需要大腦在高喚醒狀態(tài)下手算越做到后面越容易疲勞和粗心概念簡答題放中間用來調(diào)劑節(jié)奏最后留10分鐘檢查計算題的符號和公式。單題時間控制上選擇題不超過3分鐘簡答題5分鐘左右計算題可以放到8分鐘編程題最多15分鐘。如果一道題卡了超過預(yù)計時間的一半果斷先跳過后面有時間再補。這套節(jié)奏在多次模擬練習(xí)里讓我保持了較高完成度推薦你也試試。你可以根據(jù)自己強弱項微調(diào)順序但核心原則是不要在低分值的難題上耗盡腦力影響后面更多基礎(chǔ)題的得分。5.3 如何把錯題變成真正屬于自己的東西我不太建議反復(fù)刷同一套題那會產(chǎn)生假性記憶。更有效的做法是把做錯的題改造成變體比如把K折交叉驗證里n_samples從23改成100要求寫出每折樣本數(shù)把特征圖尺寸里的padding改成0重新算一遍。這樣比再做一次原題更能檢驗?zāi)闶欠裾娴恼莆?。我也?xí)慣在題干旁邊寫一句話標(biāo)記這道題在真實項目中對應(yīng)什么場景。比如特征圖尺寸計算對應(yīng)改網(wǎng)絡(luò)結(jié)構(gòu)時確認維度是否匹配反向傳播手推對應(yīng)調(diào)參時理解梯度異常來自哪里。備考不是任務(wù)而是把知識內(nèi)化成工具。帶著這個心態(tài)AI入試的題目會越做越順而且工作里遇到類似問題你也更容易想到用哪個知識點去解。第四次練習(xí)到這里就結(jié)束了。說實話每次整理這些題我自己也能復(fù)習(xí)一遍尤其是手推反向傳播和交叉驗證哪怕寫過很多遍偶爾還是會踩到符號和維度的坑。所以我的個人建議是題不在多把每一道綜合題真正手推、手寫一遍比泛泛刷十道題更有用。下次第五次我打算加入Transformer的Self-Attention手推和常見激活函數(shù)對比如果你已經(jīng)把這次的內(nèi)容消化完我們下一步見。