
每年到了校招季總有很多同學在牛客網、知乎上翻舊題而網易2018校園招聘機器學習算法工程師這套筆試卷算是當年流傳度極高、討論量也很大的一套題。我自己當年也刷過后來參與過校招筆試出題和面試再看這套卷子發現它的出題思路和考察點其實非常典型不堆砌偏題怪題而是把機器學習基礎、算法功底和工程直覺分層考察層層遞進。對于準備算法崗、機器學習崗的同學來說這份試卷至今仍有很強的參考價值——它代表了一線互聯網公司對校招算法工程師的基本能力預期。這篇博文我就以過來人的視角把這份卷子的考點、難點和備考方法完整拆一遍幫你把“刷題”變成“查漏補缺”。1. 2018網易機器學習算法工程師筆試卷的整體拆解1.1 試卷結構與考點分布先聊試卷結構。網易這套筆試卷整體分為客觀題和主觀題兩大部分客觀題又以單選題和多選題為主主觀題則是典型的算法編程題和簡答題組合。從時間設置來看筆試時長一般在90分鐘到120分鐘之間題量不算是特別大的那種但覆蓋面相當廣。我當時做完這套題的第一感受是它不考死記硬背而是考“你有沒有真正用過這些模型”。比如試卷中大量出現關于特征工程、過擬合處理、模型評價指標的選擇、損失函數性質等問題這些如果只是看過理論而沒有實際調過參、跑過實驗很容易在兩個相似選項中猶豫。從考點權重來看大致可以分為四塊考點模塊典型題型大致占比機器學習基礎理論監督學習、模型評估、損失函數、正則化30%算法與數據結構編程題、復雜度分析、經典算法變體30%概率統計與數學基礎貝葉斯、期望、分布、矩陣求導20%工程與業務場景特征工程、推薦系統、文本處理20%這里要注意一個趨勢2018年前后各家公司算法崗筆試都在增加“場景題”的比例網易也不例外。單純背公式已經拿不到高分你必須能把一個業務問題轉化為一個機器學習問題再從數據、特征、模型、評估四個維度給出完整方案。1.2 客觀題的高頻命題角度客觀題部分網易特別喜歡從以下幾個角度出題。第一個角度是模型原理的“邊界條件”。比如問你在樸素貝葉斯中如果某個特征在訓練集中沒有出現但測試集中出現了應該如何處理這本質上考察拉普拉斯平滑。再比如問SVM中核函數的選擇依據以及高斯核的帶寬參數對模型復雜度的影響。這類題目的特點是只要你在實際項目中真正用過這些模型幾乎不需要死記就能答對因為你在調參時一定遇到過類似問題。第二個角度是損失函數與優化的組合拳。網易喜歡把交叉熵損失、均方誤差、Hinge Loss放在一起讓你判斷“哪個損失函數對異常值更敏感”“哪個損失函數更適合 probabilistic 輸出”。坦白說這種題目對只會調用 sklearn 的同學來說是致命的因為你如果不理解損失函數背后的概率解釋很難答得準。第三個角度是模型評估指標的選擇陷阱。典型的例子是在正負樣本極度不平衡的場景下準確率Accuracy是否適合作為評估指標如果不適合應該選擇精確率、召回率、F1還是AUC網易會進一步問你AUC對正負樣本比例變化是否敏感這一點如果沒動手算過很容易被繞進去。對于這類題目我建議備考時把二分類問題的混淆矩陣、PR曲線、ROC曲線的推導自己手推一遍并且用代碼做幾個小實驗觀察正負樣本比例變化對曲線形態的影響。2. 主觀題中的機器學習核心考點2.1 手推公式與模型推導題主觀題里公式推導幾乎是大廠筆試的標配。網易這套卷子也不例外。我印象比較深的是要求推導邏輯回歸的梯度更新公式以及用極大似然估計推導線性回歸的損失函數。這類題目本身不難難的是很多同學只會背最終的損失函數形式卻不知道它是怎么從概率假設推出來的。拿邏輯回歸來舉例完整的推導鏈條應該是假設樣本的標簽服從伯努利分布給定特征 x 和參數 w正類概率為 p(y1|x;w) sigmoid(w^T x)。寫出單個樣本的似然函數 p(y|x;w) p^y * (1-p)^(1-y)。對整個訓練集寫出似然函數 L(w) ∏ p(y_i|x_i;w)。對似然函數取對數得到對數似然 l(w) ∑ [y_i * log(p_i) (1-y_i) * log(1-p_i)]。將對數似然取負作為損失函數即交叉熵損失。對 w 求梯度得到梯度更新公式 w : w α * ∑ (y_i - p_i) * x_i。推導本身不復雜但能把每一步的數學動機講清楚才是面試官想看到的。如果你只是背下最終的更新公式遇到“為什么用交叉熵而不是均方誤差”這類追問就很容易卡殼。我的建議是把線性回歸、邏輯回歸、樸素貝葉斯、SVM的原問題與對偶問題、PCA的最大方差解釋這五個經典推導反復手寫三遍以上做到不假思索。2.2 模型評價與調參思路題網易的筆試卷里有一類題非常有意思給你一個具體的業務場景和模型表現讓你分析可能的原因并給出改進方案。比如給你一個二分類模型訓練集準確率99%測試集準確率85%問你可能存在什么問題如何解決。這題考察的是過擬合的識別與應對。答案可以從數據層面增加訓練數據、數據增強、模型層面降低模型復雜度、增加正則化、早停法、特征層面特征選擇、降維三個維度展開。很多同學能答出“過擬合”三個字卻無法給出有層次的解決方案這是拿不到高分的主要原因。另一個常見場景是模型在離線評估中AUC達到0.92上線后業務指標卻沒有提升分析可能原因。這種題沒有標準答案考察的是你對“離線與在線不一致”問題的理解深度。我當時總結了一個答題框架后來也用在了實際工作中離線評估與在線環境的樣本分布是否一致采樣偏差。離線指標與業務目標是否對齊AUC提升是否代表用戶行為改善。特征與標簽的時間穿越問題訓練集中使用了未來信息。模型上線時的工程實現是否有bug特征拼接錯位、缺失值處理不一致。網易這類大廠非??粗睾蜻x人能否用系統化思維分析問題而不是只給零散的點。哪怕你經驗不足只要按照“數據-特征-模型-評估-工程”的框架去組織答案至少能向面試官傳遞出“我有結構化思考能力”的信號。2.3 特征工程與業務理解題特征工程在網易筆試中的權重比許多人想象的高得多。有一道題讓我至今記憶猶新給定用戶的歷史購買記錄預測用戶在未來7天內是否會產生購買行為請你設計特征。這道題其實是推薦系統和用戶增長領域的經典問題考察點非常綜合。我當時從四個維度構建特征體系用戶維度用戶歷史購買頻次、購買金額均值/方差、最近一次購買距離今天的天數R維度recency。商品維度商品的歷史銷量、價格帶位置、類目熱度。用戶-商品交叉維度用戶對該商品所在類目的偏好度、用戶對該商品的點擊/收藏/加購行為序列。時間維度用戶的購買間隔規律、節假日臨近程度、用戶活躍時段特征。這套特征體系的思路本質上就是經典RFM模型的擴展。對于沒有實際經驗的同學我建議多去看看推薦系統、用戶增長相關的經典文章和開源方案了解工業界常用的特征工程套路。不要只會做標準化、獨熱編碼這種基礎操作那是工具層面的東西業務建模能力才是筆試拉開差距的地方。3. 算法題考察重點與刷題策略3.1 高頻算法題型的底層邏輯網易這套試卷的算法編程題部分并不算特別變態至少沒有到Hard難度壓軸的程度。但它的特點是“常規題考變形”和“邊界條件挖坑”。比如字符串相關的題目有同學反映說感覺像KMP但又不是直接給你一個模板。熱詞里也出現了“在KMP算法中對于模式串 pabacaba其next數組”這個具體問題。這種考察方式的本質是看你是否真的理解next數組的含義以及能否手動推導。很多同學會用KMP做匹配卻無法手動計算next數組這是典型的“會用不會講”在校招筆試中很吃虧。我建議備考KMP時不要只刷板子題而是動手推導幾個模式串的next數組理解前綴函數prefix function的本質——即對每個位置 i子串 p[0..i] 的最長相等真前后綴長度。理解了這一點你再看字符串匹配、字符串循環節、字符串哈希等問題底層邏輯都是相通的。另外網易的算法題非常喜歡考“排序的變體”。比如在一個近乎有序的數組中查找目標值、尋找第K大的元素、歸并排序的應用逆序對數量計算。熱詞里反復出現“數據結構排序算法”“冒泡排序算法c”“堆排序算法”說明排序類算法在校招中的基礎地位從來沒有動搖過。3.2 貪心與動態規劃的實戰辨析貪心算法和動態規劃是每年校招算法題的兩大常青樹。網易的題目里貪心常以“區間調度”“任務排隊”的形式出現動態規劃則更多以“背包類問題”“路徑計數類問題”出現。先說貪心。貪心算法的核心不是“每次選最大的”而是“通過局部最優推導全局最優”并且你得能證明為什么貪心策略成立。以區間調度問題為例按結束時間排序選擇是最優策略這個結論可以通過交換論證法來證明。很多同學貪心題能做對但面試官一追問“為什么貪心是對的”就懵了。備考時我建議把《算法導論》第16章中貪心算法的幾個經典案例活動選擇、霍夫曼編碼、分數背包全部手推一遍證明過程。再說動態規劃。動態規劃的核心是狀態定義和狀態轉移方程。參加過校招的人都知道動態規劃題最怕的不是寫代碼而是“狀態定義錯了后面全錯”。我在筆試時有個習慣先寫出狀態定義和轉移方程再用小規模數據手動走一遍確認邏輯正確后再寫代碼。這個過程會花一點時間但能避免因為狀態設計錯誤而浪費更多時間。網易這類大廠的筆試通常會提供本地編譯環境小數據自測是非常值得做的。3.3 概率與統計在算法題中的交叉應用網易算法崗筆試還有一個隱蔽特點概率題和算法題會交叉出現。比如給定一個不均勻硬幣如何設計一個算法生成均勻分布的隨機數再比如大數據場景下如何用固定內存從流式數據中均勻采樣。后者實際上是經典的蓄水池采樣Reservoir Sampling問題。核心思路是對于第 i 個到達的元素以 1/i 的概率替換當前選中的元素。這個算法實現只有幾行代碼但背后的概率推導不簡單。我當時為了徹底搞懂它自己用蒙特卡洛模擬跑了幾萬次實驗驗證每個位置被選中的概率確實都是 1/n這才算真正放心。對校招筆試來說概率題往往容易成為區分點所以建議把常見的概率模型生日問題、幾何分布、貝葉斯更新、蓄水池采樣好好過一遍。4. 工程能力與機器學習工具鏈考察4.1 數據處理與特征編碼的實操陷阱這套筆試卷里還有一部分容易被忽視的題目就是關于數據處理和特征編碼的工程細節。比如問類別特征取值超過10000個直接做One-Hot編碼會有什么問題應該如何解決這個問題在工業界非?,F實。當類別特征的高基數問題出現時直接One-Hot會導致維度爆炸、內存暴漲、模型訓練極慢且容易過擬合。常用的解決方案包括頻數編碼Target Encoding、哈希編碼Hashing Trick、嵌入編碼Embedding Encoding以及在樹模型中可以直接將類別特征作為原生特征處理如LightGBM的categorical_feature參數。另一個高頻考察點是缺失值處理。網易的題目會問你對于線性模型和樹模型缺失值處理的策略有何不同答案的核心在于線性模型通常需要對缺失值進行填充或增加缺失指示列而樹模型特別是XGBoost、LightGBM本身在訓練過程中就能學習缺失值的默認分裂方向。如果只會用pandas的fillna(0)應對所有情況遇到這類題目就很難答出深度。4.2 常用機器學習庫與分布式框架的理解深度2018年的時候scikit-learn、XGBoost、TensorFlow是筆試出現頻率最高的三個框架。網易會考察你對這些框架底層原理的理解程度而不僅僅是API的使用。比如問XGBoost和GBDT的區別是什么這題的滿分答案需要答出以下幾點XGBoost在目標函數中加入了正則項控制模型復雜度。XGBoost對損失函數做了二階泰勒展開而傳統GBDT只用了一階梯度信息。XGBoost支持列抽樣既能減少過擬合又能加速計算。XGBoost對缺失值有自動學習分裂方向的處理機制。XGBoost在工程實現上做了預排序和緩存優化訓練效率更高。再比如問訓練一個模型需要100GB內存的數據而你的單機只有16GB內存怎么辦這種題沒有標準答案但可以給出多個層次的方案采樣訓練數據量太大但模型收益有限時、特征篩選降維、使用外存學習算法如Vowpal Wabbit、分布式訓練框架如Parameter Server架構等。這類題目考察的是你對工程瓶頸的敏感度哪怕沒有實際用過分布式框架只要思路清晰也能拿到大部分分數。4.3 深度學習基礎知識的覆蓋范圍2018年的筆試深度學習占的比例還不像今天這么高但已經納入考察范圍。網易偏愛的題型包括CNN中感受野的計算、Batch Normalization的作用、RNN中的梯度消失與梯度爆炸、激活函數的選擇ReLU vs sigmoid vs tanh。感受野的計算這類題目公式很簡單但是推導過程容易記混。我當時總結了一個笨但有效的方法從最后一層往前推不做任何簡化一層一層算。感受野的遞推公式為RF_l RF_{l-1} (kernel_size - 1) * stride_l其中 RF_l 是當前層的感受野RF_{l-1} 是前一層的感受野stride_l 是當前層相對于前一層輸入移動的步長累乘值。逐層手算雖然慢但保證不出錯。對于Batch Normalization網易喜歡考察它的訓練階段和推理階段的區別。訓練時用當前batch的均值和方差來歸一化推理時使用訓練期間累積的全局均值和方差。很多人知道“訓練用batch統計量推理用全局統計量”這個結論但說不清為什么推理階段不能直接用batch統計量——因為推理時batch size可能很小甚至為1統計量不穩定會嚴重影響模型輸出。5. 備考路線與刷題計劃的實戰建議5.1 書籍、課程與刷題平臺的資源清單針對網易這套筆試卷也針對大廠算法崗校招通用備考我整理一份親測有效的資源清單機器學習理論《機器學習》周志華的西瓜書作為入門重點看前8章《統計學習方法》李航作為進階重點看感知機、KNN、樸素貝葉斯、決策樹、邏輯回歸、SVM、EM算法、隱馬爾可夫模型的前幾章《深度學習》花書作為深度學習部分的補充。算法與數據結構《算法導論》前15章足夠應付絕大多數校招筆試《劍指Offer》作為面試經典題刷LeetCode按“高頻面試題”分類刷重點放在數組、字符串、鏈表、樹、動態規劃、貪心這幾類。概率與統計《概率論與數理統計》課本經典教材即可配合考研真題練手更佳。刷題平臺??途W有歷年校招真題這是最接近真實考題的資源LeetCode保持每周刷題頻率考前一個月集中刷Medium難度高頻題。5.2 分階段備考節奏安排我把校招準備周期分為三個階段適用于多數有3到6個月準備時間的同學。第一階段是基礎鞏固期約4到8周。這一階段以看書和手推公式為主目標是把機器學習核心模型的推導過程、損失函數、優化方法都過一遍同時每天固定刷3到5道LeetCode簡單或中等題。建議每看完一章西瓜書就把相關模型的數學推導獨立手寫一遍然后對照教材訂正。第二階段是真題實戰期約3到4周。這一階段集中刷??途W的大廠筆試卷尤其是網易歷年真題。做題時嚴格計時模擬真實筆試環境用Excel或在線表格記錄每道題的正確率和耗時。做完以后一定要復盤錯題找出錯誤原因是知識點盲區、計算失誤還是時間分配不合理。我當時用這個表格半個月后就能明顯看出自己的薄弱環節集中在哪幾類題型。第三階段是查漏補缺期考前1到2周。這一階段不再大量刷新題而是回到錯題本把之前做錯的題和不懂的知識點重新過一遍。同時保持每天至少一道算法題的手感但以Medium為主避免死磕Hard。重點背誦和手推機器學習高頻公式包括邏輯回歸梯度、SVM對偶、EM算法兩步推導、反向傳播的鏈式法則。5.3 時間緊張的快速上車方案如果離筆試只有兩周甚至一周那么這套筆試卷的價值就更大了??焖俚膫淇疾呗允莾炏裙タ恕巴度氘a出比”最高的模塊——機器學習基礎理論和算法題這兩塊占了約60%的分數。具體來說前面3天集中啃邏輯回歸、決策樹、SVM、樸素貝葉斯這四大經典模型的原理與公式推導。中間5天刷LeetCode的數組、字符串、動態規劃、貪心四類高頻題每天至少8題不求多而求精。最后3天全真模擬網易這套筆試做完了認真復盤把錯題涉及的知識點重新過一遍。概率統計的題目如果時間不夠優先掌握貝葉斯公式、常見分布期望與方差、正態分布的3σ原則這些足以應付大部分客觀題。提示校招筆試備考最忌諱“求全”。網上有刷不完的題和讀不完的書但你的時間是有限的。用真題摸底用錯題定位知識盲區再有針對性地補效率遠高于盲目刷題。6. 常見問題與實戰排障經驗6.1 筆試現場失分的隱形殺手結合我自己當年筆試和后來模擬面試的經驗我總結出幾個筆試中常見的“隱形殺手”希望后來的同學們避坑。第一個是客觀題陷得太深。很多同學遇到一道選擇題非要完全確認答案才繼續往下走結果耽誤了后邊的算法大題。大廠筆試的客觀題部分通常不是按題給分而是按正確率加權或直接計原始分與其在一道1.5分的選擇題上糾結十分鐘不如先確保算法大題完整做出來。我的建議是客觀題每題控制在2分鐘以內拿不準的先標記跳過最后再回來糾結。第二個是算法題不寫注釋和中間思路。筆試的算法題很多時候不是全自動判分而是人工閱卷和自動判題結合。即使你的代碼AC不了但思路清晰、注釋完整閱卷人可能會給部分過程分。反過來代碼寫得亂七八糟即使碰巧通過了測試用例印象分也會大打折扣。第三個是Python和C混用導致的環境依賴問題。網易的筆試系統通常支持多種語言但每種語言的環境配置略有不同。有些同學平時用Python寫習慣了到了筆試系統發現部分庫不可用或者普通python環境沒有安裝numpy遇到這種問題會很影響心態。我建議考前先確認筆試平臺支持的Python版本、有無numPy/pandas等常用庫再決定自己的主寫語言。如果沒有額外庫支持就老老實實用純Python寫算法題。6.2 復盤時如何把一套真題吃透刷一套真題容易吃透一套真題難。我見過很多同學刷題的方式是做完對答案看懂了就劃掉然后繼續刷下一套。這種方式看似高效實際上收獲有限。我復盤真題的習慣分三步走第一步每題都不只看正確選項還要看錯誤選項為什么錯。隨便找一道選擇題網易不會把三個錯誤選項設計成明顯離譜的答案而是會有一定迷惑性。理解每個錯誤選項背后的認知偏差能幫你發現自己對某個概念理解的盲區。第二步把客觀題涉及的知識點關鍵詞全部整理出來寫成一個知識圖譜。比如一道SVM的題目我會把核函數、軟間隔、對偶問題、KKT條件、SMO算法這一整條鏈路都過一遍并且問自己如果面試官在這個鏈條上隨機挑一個點深挖我能回答到什么深度第三步算法題要一題多解。很多算法題并不只有一種解法筆試時能AC就夠了但復盤時應該考慮還有沒有更優的時間復雜度或空間復雜度解法兩種解法背后的算法思想是否相通把一道題吃透勝過稀里糊涂地做十道題。6.3 面試官視角的評分邏輯參與過校招面試后我發現筆試評分邏輯很多時候和候選人想象的不一樣。網易這類大廠的算法崗筆試核心目標不是篩選出“滿分選手”而是篩選出“潛力選手”。面試官看一個候選人的筆試卷通常關注三個維度基礎是否扎實客觀題的正確率是否有6成以上這是底線。代碼是否規范算法題代碼的可讀性、邊界條件處理、復雜度分析是否到位。思考是否有深度簡答題和開放題的答案是否有層次感能否給出框架性的分析而非零散的點。所以如果你在筆試中遇到完全不會的開放題不要留白盡量用已有的知識框架去組織一個有條理的回答。即使不完全正確也比空著強得多。面試官能從你的回答中看到你“如何構建思路”的過程這本身就是評估因素之一。7. 這套筆試卷的后續擴展與長期價值如果你認真復盤了這套網易機器學習算法工程師筆試卷你會發現它的考察范圍與當前工業界機器學習工程師的日常工作是高度吻合的處理數據、設計特征、構建模型、評估效果、上線監控、持續迭代。整張試卷考察的不是某個孤立知識點而是“能否完整地解決一個機器學習問題”的系統能力。復盤完這套真題后你可以沿著兩個方向繼續深入。第一個方向是算法競賽或開源項目實戰通過Kaggle比賽或GitHub開源項目把筆試中涉及的模型、特征工程、評估方法在真實數據上跑一遍這會讓你對“分數背后的原理”有更深的理解。第二個方向是整理自己的面試知識庫把筆試中暴露的薄弱點、復盤筆記、公式推導過程整理成一個文檔持續迭代一直到秋招結束。最后說一個我自己的體會刷這套題最大的價值不在于“押中多少原題”而在于幫你看清楚自己的認知邊界在哪里。知道自己不知道什么比知道自己知道什么更重要。每一道不會做的題、每一個糾結的選項都在幫你把學習的方向修正到更貼近工業界實際的位置。這種自我認知能力的提升會陪伴你走過整個職業生涯。