易數(shù)據(jù)挖掘工程師筆試復(fù)盤:機(jī)器學(xué)習(xí)考點(diǎn)與編程題全解析)
說實(shí)話看到網(wǎng)易2023校招筆試提前批“數(shù)據(jù)挖掘算法工程師”這個崗位的時候我心里其實(shí)是有點(diǎn)打鼓的。一方面提前批意味著競爭更聚焦身邊全是各路神仙另一方面數(shù)據(jù)挖掘這個方向太寬泛了從傳統(tǒng)的統(tǒng)計分析到機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、工程落地全都要懂一點(diǎn)。我投遞之后大概等了一周多收到了筆試通知用的牛客網(wǎng)系統(tǒng)三個小時題目類型有單選、多選、編程題和簡答題。整套卷子做下來最大的感受是不偏不怪但非常考驗基礎(chǔ)功底的扎實(shí)程度尤其是對細(xì)節(jié)的把握。這里把能回憶起來的考點(diǎn)和復(fù)盤心得整理出來給后面打算投遞網(wǎng)易或者類似互聯(lián)網(wǎng)大廠數(shù)據(jù)挖掘崗位的朋友一個參考幫你們少走點(diǎn)彎路。1. 筆試整體情況與題型分布先說一下整場筆試的大概框架。提前批的筆試時間是120分鐘或180分鐘我這場是180分鐘。題目數(shù)量不算多但是分值分布很微妙編程題占比最大其次是多選題單選題和簡答題次之。系統(tǒng)是牛客的經(jīng)典界面左邊題目列表右邊答題區(qū)域編程題要求自備編譯器思路在線OJ判題。由于提前批的筆試通常不只是篩人還承擔(dān)著人才評級的功能所以難度不會太低也不會刻意刁難重點(diǎn)考察的是知識面的廣度和思維的縝密程度。從題型分布來看單選題大概10題左右覆蓋數(shù)據(jù)結(jié)構(gòu)、概率統(tǒng)計、機(jī)器學(xué)習(xí)基礎(chǔ)、算法復(fù)雜度分析。多選題8到10題交叉考察機(jī)器學(xué)習(xí)和深度學(xué)習(xí)概念以及部分工程場景。編程題3題純算法題難度分布約為LeetCode中等偏上到困難。簡答題1到2題偏向業(yè)務(wù)場景建模和策略設(shè)計。這里特別想強(qiáng)調(diào)一下多選題。多選比單選要狠得多因為少選、多選、錯選都不得分。整個答題過程必須對每個選項都非常確定但凡有一絲猶豫這一題大概率就丟了。我復(fù)盤時發(fā)現(xiàn)失分最多的恰恰就在多選題的模棱兩可的部分。建議備考時一定要把概念比較性內(nèi)容整理成表格例如L1和L2正則化的區(qū)別、Bagging和Boosting的區(qū)別、各種聚類算法的適用場景等。另外提一句時間分配。我身邊有同學(xué)因為單選題糾結(jié)太久導(dǎo)致編程題只做了一個半小時最后一道DP動態(tài)規(guī)劃題沒來得及優(yōu)化直接暴力解提交后只過了部分用例。我自己的策略是單選和多選控制在45到50分鐘簡答題控制在15分鐘剩下100分鐘全部放在編程題上。這套卷子的編程題對時間復(fù)雜度的要求很嚴(yán)格暴力解大概率只能通過少量數(shù)據(jù)。2. 數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)考點(diǎn)詳解數(shù)據(jù)挖掘算法工程師這個崗位筆試?yán)餀C(jī)器學(xué)習(xí)的占比自然不低。網(wǎng)易的題目風(fēng)格和很多公司不一樣它不直接問“什么是過擬合”而是給一個具體場景問你在這個場景下用什么方法解決。這就需要你真正理解算法的原理和使用條件而不是背八股。2.1 特征工程與數(shù)據(jù)預(yù)處理有一道多選題涉及特征的標(biāo)準(zhǔn)化和歸一化。選項里出現(xiàn)了StandardScalerZ-score、MinMaxScaler、RobustScaler、MaxAbsScaler然后給出幾個業(yè)務(wù)場景讓你選擇適合的標(biāo)準(zhǔn)化方法。比如稀疏數(shù)據(jù)、存在異常值的數(shù)據(jù)、數(shù)據(jù)分布有界的數(shù)據(jù)等。這題的核心掌握原則是如果特征大致服從正態(tài)分布Z-score是常用選擇如果數(shù)據(jù)分布有界且沒有嚴(yán)重異常值MinMaxScaler更合適如果數(shù)據(jù)含異常值RobustScaler能減少極端值影響因為它基于中位數(shù)和四分位數(shù)。這里有個很多新人容易忽略的細(xì)節(jié)標(biāo)準(zhǔn)化和歸一化在中文語境里經(jīng)常混用但實(shí)際含義并不同。歸一化一般指縮放到[0,1]區(qū)間標(biāo)準(zhǔn)化指調(diào)整到均值為0、方差為1。在梯度下降類模型中特征尺度差異過大會導(dǎo)致收斂變慢或震蕩所以預(yù)處理非常關(guān)鍵。對于樹模型其實(shí)不做標(biāo)準(zhǔn)化影響不大但筆試題目里不會這么直白它會給你一個樹模型的場景問需要不需要預(yù)處理選項里往往藏著“特征之間存在量綱差異較大時樹模型不依賴特征縮放”這種正確表述。另外有一道關(guān)于缺失值處理的簡答題問的是在用戶行為日志數(shù)據(jù)中某個關(guān)鍵特征缺失率達(dá)到60%以上如何決定缺失值處理策略。我的答題思路是先判斷缺失機(jī)制是MCAR、MAR還是MNAR再結(jié)合特征重要性決定是刪除、填充還是單獨(dú)建模。如果是關(guān)鍵特征且與業(yè)務(wù)強(qiáng)相關(guān)可以考慮缺失指示變量加填充值把缺失本身當(dāng)成一種信息如果特征重要性低直接丟棄反而更穩(wěn)定。網(wǎng)易這種大廠比較看重這種根據(jù)數(shù)據(jù)情況靈活選擇的思維而不是讓你無腦填均值。2.2 經(jīng)典機(jī)器學(xué)習(xí)算法與模型評估筆試選擇題里出現(xiàn)了K-Means聚類的初始質(zhì)心選擇問題引入了KMeans的思路。題干的問法很典型傳統(tǒng)的隨機(jī)初始化可能導(dǎo)致聚類結(jié)果收斂到局部最優(yōu)KMeans通過什么方式改善這一情況。選項里有“根據(jù)樣本點(diǎn)密度選擇質(zhì)心”“按照距離已有質(zhì)心的概率選擇新質(zhì)心”“選取樣本中方差最大的特征對應(yīng)的點(diǎn)”等。正確答案應(yīng)該是按照概率選擇離已有質(zhì)心更遠(yuǎn)的點(diǎn)這題考的是對KMeans原理的理解。還有一道概率題問的是某分類器在樣本不均衡數(shù)據(jù)集上的準(zhǔn)確率為95%能否說明模型效果很好這道題考的是評估指標(biāo)的選擇在正負(fù)樣本比例懸殊時準(zhǔn)確率沒有參考價值應(yīng)該看Precision、Recall、F1-score或者AUC。網(wǎng)易的筆試比較喜歡把這類“看似正確的陷阱”藏在選項里如果你對評估指標(biāo)理解得比較淺很容易被帶偏。關(guān)于AUC有一道多選考到了AUC0.7的統(tǒng)計學(xué)含義。選項里出現(xiàn)了“隨機(jī)抽取一個正樣本和一個負(fù)樣本正樣本的預(yù)測值大于負(fù)樣本預(yù)測值的概率為0.7”“模型在正負(fù)樣本上的分類準(zhǔn)確率為70%”“模型在所有閾值下的平均F1為0.7”等。正確答案是第一個。實(shí)際上AUC衡量的是排序能力和概率預(yù)測值本身沒有直接關(guān)系。實(shí)際工作中我發(fā)現(xiàn)有的面試官會接著追問如果線上預(yù)測分?jǐn)?shù)整體偏高但排序不變AUC會怎樣答案是不變。這就是AUC的排序不變性在筆試?yán)锊粫苯訂柕斫饬诉@一層面對類似選擇題能秒殺。2.3 過擬合與正則化從原理到應(yīng)對策略網(wǎng)易有一道題特別經(jīng)典在高維稀疏特征場景下如何控制過擬合選項覆蓋了L1正則化、L2正則化、Dropout、特征選擇、早停法。這類題目看起來簡單但難在判斷“哪個不能起到作用”。比如在邏輯回歸中加入L1正則化可以讓一部分特征的系數(shù)變成0這本質(zhì)上是特征選擇L2正則化只會讓系數(shù)趨近于0不會為0。Dropout主要在神經(jīng)網(wǎng)絡(luò)中使用對邏輯回歸無效所以如果有“使用Dropout來防止邏輯回歸過擬合”這種選項就是錯的。備考時建議把每個正則化手段的適用模型、數(shù)學(xué)表達(dá)、效果差異整理成表格。L1和L2的區(qū)別是高頻考點(diǎn)我見過有人直接問“加上L1正則化后為什么特征系數(shù)會為0而L2不會”這個問題要解釋清楚得從梯度更新的角度理解——L1的梯度是常數(shù)當(dāng)權(quán)值為正時每次減去一個固定量最終會減到0而L2的梯度是線性的越接近0梯度越小衰減會越來越慢理論上不會真正等于0但在浮點(diǎn)精度限制下會趨近于0。筆試雖然不會讓你寫推導(dǎo)過程但理解了這個原理多選題里的“在訓(xùn)練迭代過程中L1正則化可能導(dǎo)致部分特征權(quán)重變?yōu)?”就能大膽勾選。2.4 優(yōu)化算法選型從SGD到Adam網(wǎng)易選擇題里有一道老生常談但容易答錯的題在深度模型訓(xùn)練中Adam和SGD哪個更容易收斂到尖銳極小值哪個更可能陷入局部最優(yōu)正確結(jié)論是SGD更容易收斂到平坦的極小值泛化性往往更好Adam收斂速度快但收斂點(diǎn)可能在尖銳區(qū)域。這題選項里如果出現(xiàn)“Adam的收斂速度通常快于SGD”這是正確的“在相同迭代次數(shù)下Adam的泛化性能一定優(yōu)于SGD”這是錯誤的。關(guān)鍵在于“一定”這種絕對化表述筆試多選題里出現(xiàn)概率極高的絕對化字眼往往就是錯誤的點(diǎn)。有很多資料把Adam吹得特別好但實(shí)際工程中在CV任務(wù)里SGD帶momentum的效果常常比Adam更穩(wěn)尤其是到了訓(xùn)練后期微調(diào)階段。所以筆試考到優(yōu)化算法時不要只背默認(rèn)的“Adam是深度學(xué)習(xí)首選優(yōu)化器”這種結(jié)論要明白每種優(yōu)化器背后的自適應(yīng)學(xué)習(xí)率機(jī)制差異——Adam對每個參數(shù)單獨(dú)調(diào)整學(xué)習(xí)率適合稀疏梯度和不平穩(wěn)目標(biāo)而SGD全局使用同一個學(xué)習(xí)率需要精心調(diào)整學(xué)習(xí)率調(diào)度策略。理解這些碰到問“在什么場景下應(yīng)該優(yōu)先選擇SGD而不是Adam”之類的簡答題時才能答出具體的工程化理由。3. 數(shù)據(jù)結(jié)構(gòu)與算法編程題實(shí)戰(zhàn)復(fù)盤接下來進(jìn)入重頭戲筆試?yán)锓种底罡叩木幊填}。數(shù)據(jù)挖掘崗位的編程題不會太偏門一般圍繞排序、查找、動態(tài)規(guī)劃、貪心、字符串處理展開。網(wǎng)易出的這3道題我印象深刻分別涉及堆、差分?jǐn)?shù)組和狀態(tài)壓縮DP。下面把每道題的思路和核心代碼寫一下代碼用C描述因為筆試時我用的是C不過換Java和Python思路完全一致。3.1 第一題TopK問題的變體考察堆與排序的結(jié)合題目大意給定一個長度為N的整數(shù)數(shù)組找出其中第K大的數(shù)并且要求平均時間復(fù)雜度為O(n)空間復(fù)雜度為O(1)。常規(guī)的做法是直接sort然后取倒數(shù)第K個但這樣的時間復(fù)雜度是O(nlogn)如果N很大例如10的7次方級別會超時。這道題真正考的是快速選擇算法QuickSelect本質(zhì)上是快排的partition過程平均復(fù)雜度可以達(dá)到O(n)。我當(dāng)時在考場上第一反應(yīng)也是堆——維護(hù)一個大小為K的最小堆遍歷數(shù)組遇到比堆頂大的元素就替換最后堆頂就是第K大。這個方法的時間復(fù)雜度是O(nlogK)能通過大部分用例但題目明確要求平均O(n)所以堆的解法可能拿不滿分。由于時間還算充裕我最后改成了快速選擇int quickSelect(vectorint nums, int left, int right, int k) { if (left right) return nums[left]; int pivot nums[left rand() % (right - left 1)]; int i left, j right; while (i j) { while (i j nums[j] pivot) j--; nums[i] nums[j]; while (i j nums[i] pivot) i; nums[j] nums[i]; } nums[i] pivot; if (i k) return nums[i]; else if (i k) return quickSelect(nums, i 1, right, k); else return quickSelect(nums, left, i - 1, k); }這里的k傳入的是目標(biāo)索引比如找第1大就傳0。注意partition時用的是nums[j] pivot和nums[i] pivot也就是把大于pivot的元素往左邊放小于pivot的往右邊放這樣最終pivot的位置i就是它在降序排列中的索引。踩過的坑是隨機(jī)pivot的選擇。如果每次都取第一個元素作為pivot而且數(shù)組近有序快選會退化成O(n^2)導(dǎo)致最后一個大數(shù)據(jù)量的用例直接超時。我一開始取中間位置做pivot效果還行后來干脆用隨機(jī)索引雖然多了一點(diǎn)開銷但穩(wěn)定性好很多。筆試環(huán)境里隨機(jī)數(shù)生成器的性能也要考慮如果循環(huán)里頻繁隨機(jī)可能會有額外耗時所以只隨機(jī)一次或者取左中右三數(shù)取中是更穩(wěn)妥的方案。3.2 第二題區(qū)間操作差分?jǐn)?shù)組讓復(fù)雜度大幅下降題目大意給定一個長度為N的數(shù)組初始全為0進(jìn)行M次區(qū)間加法操作每次操作格式是[l, r, value]表示對[l, r]區(qū)間內(nèi)每個元素加上value經(jīng)過M次操作后輸出數(shù)組每個位置的值。N和M都可以達(dá)到10的5次方甚至10的6次方級別。如果直接模擬每次操作遍歷區(qū)間時間復(fù)雜度是O(NM)必然超時。正確解法是使用差分?jǐn)?shù)組。差分?jǐn)?shù)組diff[i]表示原數(shù)組相鄰元素的差值對區(qū)間[l, r]加value只需diff[l] value、diff[r1] - value最后對diff數(shù)組做前綴和就能還原出最終的數(shù)組。復(fù)雜度降到O(NM)。這里有個容易寫錯的邊界差分?jǐn)?shù)組的長度要開成N2因為更新r1的位置可能在N1如果數(shù)組長度不夠會越界。我當(dāng)時第一次寫成了N1結(jié)果最后一個位置老是不對排查了一會兒才意識到是數(shù)組越界又回來寫內(nèi)存。這個題目本身不難但邊界條件能卡掉很多人尤其是用C/C做題的同學(xué)一定要留意。vectorint diff(n 2, 0); for (int i 0; i m; i) { int l, r, v; cin l r v; diff[l] v; diff[r 1] - v; } vectorint res(n); int cur 0; for (int i 1; i n; i) { cur diff[i]; res[i - 1] cur; }差分?jǐn)?shù)組的思想在很多區(qū)間操作的題目里都會用到比如LeetCode 370題Range Addition以及空調(diào)、航班預(yù)訂統(tǒng)計等變體。數(shù)據(jù)挖掘崗位雖然業(yè)務(wù)上接觸這類純算法題不多但筆試就是會考所以把這些基礎(chǔ)模型吃透是必須的。3.3 第三題狀態(tài)壓縮DP考察位運(yùn)算與遞推能力題目大意給定一個N行M列的網(wǎng)格N和M都很小不超過10但也不低于4每個格子有一個權(quán)值要求選擇若干個格子使得任意兩個被選中的格子不能相鄰上下左右都不相鄰求選中格子和的最大值。這道題其實(shí)是非常經(jīng)典的狀壓DP模型——鋪磚問題或者獨(dú)立集問題。我考場上看到這道題時心里是比較穩(wěn)的因為之前刷過類似的題。思路是枚舉每一行的狀態(tài)maskmask的二進(jìn)制位表示該行哪些列被選中先預(yù)處理出所有合法的行內(nèi)狀態(tài)不能有相鄰位即mask (mask 1) 0再枚舉相鄰兩行的狀態(tài)組合保證上下行沒有同一列被同時選中即(mask1 mask2) 0。最后用DP[i][mask]表示前i行且第i行的選中狀態(tài)為mask時的最大權(quán)值和轉(zhuǎn)移方程是dp[i][mask] valSum(i, mask) max(dp[i-1][prevMask]) // 其中 prevMask 滿足 (mask prevMask) 0 且 prevMask 是合法狀態(tài)由于N和M不超過10每行的狀態(tài)最多有2^M 1024種但去掉相鄰位后可行狀態(tài)會大幅減少。兩層循環(huán)在所有合法狀態(tài)之間轉(zhuǎn)移總復(fù)雜度約為O(N * stateCount^2)這里stateCount在狀態(tài)少的時候可能只有10到20個完全可控。這道題真正的難點(diǎn)不在DP轉(zhuǎn)移本身而在于位運(yùn)算的熟練度。很多人不是不知道狀壓DP而是到了考場上寫位運(yùn)算的時候總是少一個括號或者少一個移位導(dǎo)致結(jié)果完全偏掉。我的教訓(xùn)是在寫mask (mask 1) 0這類表達(dá)式時一定加括號寫成(mask (mask 1)) 0因為C的優(yōu)先級里比要高不加括號的邏輯完全變了。這種低級錯誤能讓人debug到崩潰。3.4 與數(shù)據(jù)處理常客KMP、堆排序、快速冪等熱點(diǎn)的聯(lián)系這次筆試雖然沒有直接考KMP和快速冪但在準(zhǔn)備過程中這類經(jīng)典算法同樣是重點(diǎn)。尤其是KMP數(shù)據(jù)挖掘崗位實(shí)際工作中處理文本特征時匹配模式串的需求并不少見筆試也愛出next數(shù)組求法之類的基礎(chǔ)題。題目里提到過對模式串pabacaba求next數(shù)組這種題型很經(jīng)典思路就是前綴后綴的最長公共長度。KMP的next數(shù)組其實(shí)不難難的是不同教材對next數(shù)組的定義有差異。有的是“當(dāng)前字符匹配失敗后模式串應(yīng)該跳轉(zhuǎn)到的位置”有的是“最長公共前后綴的長度”。網(wǎng)易筆試如果有選擇題考到這種通常會給明確定義但如果你只記住了一種說法做題時就會發(fā)蒙。建議把兩種定義都理解清楚然后統(tǒng)一用一種做推導(dǎo)。我習(xí)慣用next[i]表示當(dāng)?shù)趇個位置匹配失敗時模式串回退到的位置下標(biāo)。在這種定義下pabacaba的next數(shù)組為[-1, 0, 0, 1, 0, 1, 2, 3]注意這里我把next[0]設(shè)為-1作為邊界。如果題目使用的是“最長公共前后綴長度”的定義則數(shù)值上會整體錯開或不同做題時務(wù)必先確認(rèn)約定。快速冪也是筆試常客雖然這次沒有直接出現(xiàn)但網(wǎng)易以往數(shù)據(jù)分析崗出過類似“計算a的n次方對p取模”的題。模運(yùn)算下的快速冪核心思想是把指數(shù)按二進(jìn)制拆解每次將底數(shù)平方乘上二進(jìn)制位為1的部分。遞歸和迭代兩種寫法都要熟練迭代版本更推薦因為遞歸可能爆棧尤其指數(shù)范圍到10的9次方以上時。4. 深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)題目解析數(shù)據(jù)挖掘崗位在網(wǎng)易參與的業(yè)務(wù)往往不只是傳統(tǒng)機(jī)器學(xué)習(xí)模型近些年深度模型在用戶行為預(yù)測、信息流推薦、內(nèi)容理解中大范圍應(yīng)用所以筆試對深度學(xué)習(xí)基礎(chǔ)概念的考察比例明顯上升。幾個高頻考點(diǎn)集中在CNN感受野計算、RNN梯度消失、注意力機(jī)制、激活函數(shù)、損失函數(shù)、Dropout原理等。這里把我遇到的和能回憶的考點(diǎn)拆開講講。4.1 感受野計算與卷積結(jié)構(gòu)理解有一道選擇題問一個輸入為32x32的灰度圖像經(jīng)過一個3x3卷積padding1stride1再經(jīng)過一個2x2最大池化stride2最后再經(jīng)過一個3x3卷積padding1stride1輸出特征圖的尺寸是多少這個題就是純計算公式是卷積輸出尺寸 (輸入尺寸 2 * padding - kernel_size) / stride 1池化輸出尺寸 (輸入尺寸 - kernel_size) / stride 1按公式計算第一層卷積后尺寸為32x32因為padding1保持了尺寸池化后變成16x16第二次卷積后還是16x16。所以最終輸出是16x16。這道題的陷阱在于如果你沒有考慮padding第一層變成30x30后面跟著就全錯了。另外考場上要注意題面給的是“灰度圖”還是“三通道彩色圖”如果是三通道輸入尺寸后面還要帶通道維度但卷積計算只關(guān)注空間尺寸變化。感受野的計算方式也是類似套路從最后一層往前遞推感受野大小 (輸出感受野 - 1) * stride kernel_size。建議把所有層的stride和kernel_size整理成表格從后往前算不容易出錯。4.2 從RNN梯度消失到Transformer的自注意力機(jī)制網(wǎng)易對序列模型的考察主要集中在RNN、LSTM和Transformer的比較。有一道多選題問為什么Transformer能緩解長距離依賴問題選項包括RNN的梯度傳播路徑過長導(dǎo)致梯度消失、LSTM通過門控機(jī)制改善了梯度流動、Transformer通過自注意力機(jī)制可以實(shí)現(xiàn)任意兩個位置之間的直接關(guān)聯(lián)、Transformer通過位置編碼引入順序信息。這些選項都是對的所以題目本質(zhì)上是考你是否理解不同架構(gòu)的優(yōu)劣勢。有一個常見的誤區(qū)是“LSTM完全解決了梯度消失問題”事實(shí)并非如此。LSTM通過門控可以緩解梯度消失但若序列過長梯度仍然會衰減所以長距離依賴能力依然有限。面試官和筆試多選題里都很喜歡用“完全解決”“徹底解決”這類詞作為干擾項。備考時把“緩解”和“解決”區(qū)分開這種題基本不會錯。Transformer的細(xì)節(jié)也是高頻考點(diǎn)。自注意力計算需要Q、K、V三個矩陣注意力打分方式使用縮放點(diǎn)積attention其中縮放因子是sqrt(d_k)。為什么要除以sqrt(d_k)?因為點(diǎn)積結(jié)果隨維度增大而增大在softmax后梯度會變得非常小需要縮放來保持梯度的穩(wěn)定性。如果筆試考到多頭注意力的維度劃分只要記住輸入維度除以頭的數(shù)量每個頭在子空間學(xué)習(xí)不同的關(guān)系即可。4.3 激活函數(shù)與損失函數(shù)的選型分析激活函數(shù)幾乎每次筆試都會涉及。單選題可能考ReLU在x0時梯度為0的特點(diǎn)問這種“死亡ReLU”問題如何避免。選項里有LeakyReLU、PReLU、ELU、GELU等在負(fù)半軸有非零梯度的替代方案。我復(fù)盤時發(fā)現(xiàn)網(wǎng)易特別喜歡把激活函數(shù)和梯度消失聯(lián)系起來考比如問“在深層網(wǎng)絡(luò)中Sigmoid作為隱藏層激活函數(shù)可能帶來的問題有哪些”。你需要從兩個角度回答一是Sigmoid輸出不是零均值導(dǎo)致后一層輸入偏正影響梯度更新效率二是在兩端飽和區(qū)域梯度接近0反向傳播時梯度連乘會迅速衰減。損失函數(shù)方面數(shù)據(jù)挖掘場景最常考的是交叉熵和Focal Loss。有一道場景題是在點(diǎn)擊率預(yù)估中正負(fù)樣本比例嚴(yán)重不平衡使用標(biāo)準(zhǔn)交叉熵訓(xùn)練出來的模型預(yù)測值偏向低分如何改進(jìn)標(biāo)準(zhǔn)做法有負(fù)樣本下采樣、調(diào)整正負(fù)樣本權(quán)重、使用Focal Loss等。筆試多選題里還可能問Focal Loss相比標(biāo)準(zhǔn)交叉熵在哪些方面做了改進(jìn)——它對容易分類的樣本降低損失貢獻(xiàn)對難分類樣本加大權(quán)重。核心公式是FL(p_t) -alpha_t * (1 - p_t)^gamma * log(p_t)其中g(shù)amma調(diào)節(jié)專注難樣本的程度。建議把這個公式背下來因為在簡答題里如果只是說“降低易分樣本權(quán)重”而沒有寫公式會顯得不夠?qū)I(yè)。4.4 Batch Normalization和Dropout的工程細(xì)節(jié)BatchNorm也是筆試常客網(wǎng)易喜歡考?xì)w一化層的維度。如果輸入特征圖是[N, C, H, W]BatchNorm是在每個通道上做歸一化統(tǒng)計的均值和方差是N、H、W方向上的也就是每個通道一個均值和方差而LayerNorm是在每個樣本上做歸一化NLP里效果更好。選擇題如果問圖像分類里用BatchNorm是在哪個維度上計算應(yīng)該選“通道維度”。Dropout的考察點(diǎn)是訓(xùn)練和測試時的行為差異。訓(xùn)練時以概率p隨機(jī)關(guān)閉神經(jīng)元測試時保留全部神經(jīng)元但為了保持期望輸出一致權(quán)重需要乘以(1-p)。現(xiàn)在主流實(shí)現(xiàn)是inverted dropout訓(xùn)練時對保留的神經(jīng)元除以(1-p)測試時什么都不用做。多選題如果出現(xiàn)“測試階段需要將權(quán)重乘以(1-p)”和“測試階段不需要修改權(quán)重因為訓(xùn)練時已經(jīng)做了縮放”后者是正確的。這個細(xì)節(jié)特別容易混淆我當(dāng)年學(xué)的時候也繞了很久。5. 業(yè)務(wù)場景題與項目經(jīng)驗考察簡答題是網(wǎng)易筆試富有區(qū)分度的部分。它不考你背了多少概念而是給你一個具體的業(yè)務(wù)問題看你能不能從數(shù)據(jù)挖掘的角度給出解決方案。這類題其實(shí)是在模擬日常工作場景比純知識點(diǎn)更能反映一個候選人的思維成熟度。這次簡答題遇到的問題是用戶流失預(yù)測相關(guān)的題干描述相對詳細(xì)我完整復(fù)述一下我的答題思路。5.1 流失用戶定義與樣本構(gòu)建題目大概是某內(nèi)容類App要建立用戶流失預(yù)警模型分析用戶在平臺上的活躍行為、付費(fèi)行為等數(shù)據(jù)目標(biāo)是提前識別出未來30天內(nèi)可能流失的用戶請設(shè)計完整的數(shù)據(jù)挖掘方案。這種問題是典型的數(shù)據(jù)挖掘項目設(shè)計題回答結(jié)構(gòu)一般包括問題定義、樣本構(gòu)建、特征工程、模型選擇、評估方法和上線策略。我首先把問題定義為二分類問題當(dāng)前時刻T預(yù)測未來30天內(nèi)用戶是否會流失。流失的定義需要明確這里我采用“未來30天內(nèi)未登錄且無任何內(nèi)容消費(fèi)行為”作為正樣本同時設(shè)置觀察窗口和表現(xiàn)窗口。正負(fù)樣本比例為1:10左右如果直接建模需要特殊處理但題目不要求那么精確最重要的是展示你有樣本構(gòu)建的意識——包括觀察端的特征取值窗口、表現(xiàn)端標(biāo)簽的定義、驗證集的切分方式等。樣本構(gòu)建是數(shù)據(jù)挖掘項目的基礎(chǔ)。我在回答中明確提出了觀察窗口為歷史30天特征是用戶在觀察窗口內(nèi)的行為統(tǒng)計包括每日登錄次數(shù)、平均使用時長、近7天活躍趨勢、歷史付費(fèi)金額、內(nèi)容消費(fèi)類型分布等。同時把訓(xùn)練集按時間切分為前60天作為訓(xùn)練集、中間20天作為驗證集、最后10天作為測試集避免隨機(jī)切分導(dǎo)致的時間穿越問題。5.2 特征工程策略與模型選擇特征工程這塊我梳理了四個方向活躍度特征、消費(fèi)行為特征、內(nèi)容偏好特征、生命周期特征。活躍度特征包括近N天登錄頻次、使用時長均值、活躍間隔天數(shù)等消費(fèi)行為特征關(guān)注付費(fèi)金額、購買頻次、最近一次付費(fèi)距今時間內(nèi)容偏好特征用主題分布、類目占比、曝光到消費(fèi)的轉(zhuǎn)化率生命周期特征包括注冊天數(shù)、歷史活躍度曲線斜率、是否經(jīng)歷過連續(xù)活躍后停止等。這些特征既要考慮時間窗口的衰減還要關(guān)注特征在不同用戶群體間的分布差異。模型選型上我在簡答題里寫的是“以LightGBM為baseline同時嘗試LR用于可解釋性要求較高的場景后續(xù)可以引入深度模型如DIN或者BST來建模行為序列”。理由在于GBDT系列模型對表格型數(shù)據(jù)效果好訓(xùn)練快特征重要性容易解釋LR簡單可部署便于業(yè)務(wù)策略溝通深度模型適合捕捉用戶行為的序列依賴但需要足夠的樣本量。筆試簡答題不需要做到這種顆粒度但展現(xiàn)出“梯度提升樹邏輯回歸兜底深度模型進(jìn)階”的層次感會讓閱卷人對你的工程成長路徑產(chǎn)生好感。5.3 模型評估與線上A/B測試方案流失預(yù)測模型的評估不能只看準(zhǔn)確率。我明確寫了要看召回率、精確率、F1和AUC同時對TopN用戶的命中率專門給出評估指標(biāo)即模型預(yù)測流失概率最高的K個用戶中真實(shí)流失的用戶占比。這個業(yè)務(wù)導(dǎo)向的指標(biāo)在實(shí)戰(zhàn)中比AUC更有參考價值因為線上運(yùn)營資源有限需要集中觸達(dá)最有可能流失的那部分用戶。線上評估方案要提到A/B測試對照組和實(shí)驗組的劃分要保證樣本同分布實(shí)驗周期定為30天觀察兩組用戶的次日留存率、7日留存率和30日流失率差異。同時強(qiáng)調(diào)模型上線后需要監(jiān)控特征分布漂移設(shè)置每日特征監(jiān)控報表當(dāng)分布發(fā)生顯著變化時觸發(fā)告警并考慮重訓(xùn)練頻次。這類運(yùn)營細(xì)節(jié)能反映你是否真的做過端到端項目而不僅僅是調(diào)包訓(xùn)練。5.4 數(shù)據(jù)挖掘崗位與算法崗位的區(qū)別認(rèn)知網(wǎng)易的筆試往往也會從答題思路里判斷你是否理解“數(shù)據(jù)挖掘算法工程師”和“算法工程師”的差異。數(shù)據(jù)挖掘崗位更關(guān)注從數(shù)據(jù)到業(yè)務(wù)價值的閉環(huán)算法模型只是手段落地效果和業(yè)務(wù)可解釋性同樣重要。比如在用戶流失預(yù)警場景里模型輸出只是第一步還要配合運(yùn)營規(guī)則——自動給高流失概率用戶推送優(yōu)惠券、推送個性化內(nèi)容、發(fā)送Push召回等。我在簡答里也加了一句“模型預(yù)測結(jié)果需要轉(zhuǎn)化為可執(zhí)行的運(yùn)營策略并進(jìn)行成本收益評估”這部分在算法工程師的崗位里可能不那么強(qiáng)調(diào)但在數(shù)據(jù)挖掘崗位里是加分項。6. 踩坑記錄與備考建議筆試結(jié)束后我花了不少時間復(fù)盤從自己丟分的地方總結(jié)出幾條比較實(shí)在的經(jīng)驗也結(jié)合身邊人的情況整理成踩坑清單希望對備考的朋友們有幫助。筆試的評分有時比想象中嚴(yán)格細(xì)節(jié)決定能否進(jìn)入下一輪。6.1 選項里的絕對化表達(dá)是主要丟分點(diǎn)整場考試最深刻的教訓(xùn)就是多選題中的絕對化表述一定要小心。比如“深度學(xué)習(xí)一定優(yōu)于機(jī)器學(xué)習(xí)”“LSTM解決了RNN的梯度消失”這類帶“一定”“完全”“所有”的選項大部分時候都是錯的。但也不能一概而論個別題目選項里有“一定不會”也可能是對的關(guān)鍵要看有沒有例外情況。備考時可以把歷年題目里出現(xiàn)過的絕對化表達(dá)整理出來逐個分析對錯原因形成“敏感詞”清單考試時遇到這類字眼至少多停留10秒審視。6.2 編程題卡住的常見原因編程題丟分的原因不外乎幾種一是時間復(fù)雜度估計不足暴力方法只能過部分用例二是邊界條件不完整導(dǎo)致數(shù)組越界三是狀態(tài)轉(zhuǎn)移方程推導(dǎo)錯誤。解法改進(jìn)方向是提前準(zhǔn)備好模板二分查找、TopK、并查集、拓?fù)渑判颉⒒瑒哟翱凇⑶熬Y和、差分?jǐn)?shù)組、單調(diào)棧等刷題時不只是做對題目還要把模板背下來。數(shù)據(jù)挖掘崗位編程題一般不會出特別惡心的計算幾何或字符串高級算法但動態(tài)規(guī)劃、貪心和數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)是必須掌握的。6.3 時間分配策略與草稿紙使用時間分配上我建議先把所有題目快速掃一遍標(biāo)記出哪些送分題、哪些需要重點(diǎn)突破、哪些可能要放棄。單選題一般可以直接按知識點(diǎn)秒答多選題如果糾結(jié)超過2分鐘就先跳過編程題從最簡單的開始做不要卡在最后一題。草稿紙上先把需要推導(dǎo)的公式和思路寫下來不要直接在代碼編輯器里亂敲。我筆試時遇到復(fù)雜的狀態(tài)轉(zhuǎn)移題先在草稿紙上枚舉了一個2x2小樣例推了一遍轉(zhuǎn)移過程才動手寫代碼避免了改來改去的混亂。6.4 不同基礎(chǔ)水平的備考側(cè)重點(diǎn)如果你還在校課程里有機(jī)器學(xué)習(xí)和數(shù)據(jù)結(jié)構(gòu)那備考的核心就是把LeetCode熱門題型和機(jī)器學(xué)習(xí)基礎(chǔ)概念梳理清楚。不要只刷題不做總結(jié)每個知識點(diǎn)至少形成一篇自己的復(fù)盤筆記。如果你已經(jīng)有實(shí)習(xí)經(jīng)歷重點(diǎn)是回顧自己做過的項目把特征工程、模型選型、評估指標(biāo)這些細(xì)節(jié)重新梳理尤其是項目里踩過的坑要能講得出深度。網(wǎng)易筆試的簡答題很貼近真實(shí)業(yè)務(wù)場景有項目經(jīng)驗的人在這一塊會明顯占優(yōu)勢。從我個人投遞網(wǎng)易提前批的經(jīng)驗來看校招筆試本質(zhì)上是知識儲備、思維方式和臨場心態(tài)的綜合測試。數(shù)據(jù)挖掘算法工程師的崗位要求你既要懂算法又要懂業(yè)務(wù)既要能寫代碼又要能講清楚方案背后的邏輯。這篇復(fù)盤雖然無法覆蓋到每一道原題但把核心考點(diǎn)和復(fù)習(xí)方向都羅列出來了希望對志同道合的朋友們有參考價值。校招是持久戰(zhàn)每一場筆試都值得認(rèn)真對待把每次題目都當(dāng)成學(xué)習(xí)機(jī)會成功不會太遠(yuǎn)。