|
大家好,這里是NewBeeNLP。轉(zhuǎn)眼間2023屆春招實(shí)習(xí)已接近尾聲,由于疫情影響,今年找個(gè)大廠實(shí)習(xí)確實(shí)很難,今天就給大家分享一位23屆同學(xué)找算法崗實(shí)習(xí)的總結(jié),最終拿下抖音APP、快手主站和美團(tuán)優(yōu)選的推薦算法崗offer,希望能幫助到下半年找工作的小伙伴們,以下為原文。 985渣碩,保研本校之后因?yàn)闆]有大規(guī)模開發(fā)的經(jīng)驗(yàn),再加上不太想背八股,所以轉(zhuǎn)算法。研究方向是醫(yī)學(xué)圖像,SCI2區(qū)一篇水刊醫(yī)學(xué)+計(jì)算機(jī)結(jié)合論文。 組內(nèi)有做推薦算法的于是花了一個(gè)月時(shí)間轉(zhuǎn)推薦,慢慢對推薦感興趣。21年底有個(gè)非常好的朋友(阿里P8級別的)把我撈去了小紅書實(shí)習(xí),base北京,接觸到了企業(yè)級別的推薦算法。推薦算法實(shí)習(xí)的意義可能就是接觸線上+業(yè)務(wù),畢竟在學(xué)校里面是不能碰到這種場景的,推薦算法需要大數(shù)據(jù)+場景支撐。 萬事開頭難,原本遲遲沒有下決心的,4月初的時(shí)候一天晚上下班,字節(jié)hr打電話給我(本科大三的時(shí)候曾經(jīng)投遞了字節(jié)的簡歷,后來因?yàn)樯眢w原因沒有面試),問我有沒有意向,剛好hr是抖音app推薦算法團(tuán)隊(duì)的,所以下決心開始準(zhǔn)備春招實(shí)習(xí)??梢哉f投得非常晚,準(zhǔn)備得也很晚。于是回到了學(xué)校開始準(zhǔn)備。因?yàn)槭堑谝淮伍_始海投,沒經(jīng)驗(yàn)所以沒錄音,回憶一下大概,可能漏掉了很多問題跟細(xì)節(jié)。 一面4.8下午18:00當(dāng)時(shí)其實(shí)自己還在小紅薯實(shí)習(xí),所以請了一天假。 自我介紹 答:語速放慢,背; 挑一個(gè)小紅薯的項(xiàng)目仔細(xì)介紹 答:主要在小紅薯做了一些向量召回+點(diǎn)召回工作,語速放慢,慢慢講; 模型的時(shí)效性怎么樣? 答:我是t - 1更新,還會離線把ANN結(jié)果寫入redis,因?yàn)榫€上qps目前暫時(shí)不支持; 聊聊AUC吧。 答:隨機(jī)取兩個(gè)樣本,正樣本排在負(fù)樣本之前的概率; 追問:AUC怎么快速計(jì)算 答:把樣本按照預(yù)測值排序,編號從大到小,看正樣本的編號,巴拉巴拉~。PS:這里主動輸出了一下知識,簡單證明了一下 曲線下面積 = AUC的物理定義; 線上線下AUC不一致怎么辦?(這里有點(diǎn)懵,而且因?yàn)闆]有做過排序,只能按照自己的閱歷盡可能全面去回答。) 答:有可能召回側(cè)拿到的樣本是之前舊版本排序模型的結(jié)果,會導(dǎo)致模型間的gap,采樣的時(shí)候要變換方式;檢測離線訓(xùn)練模型有沒有過擬合;檢查線上線下特征是否一致(可能存在穿越現(xiàn)象);導(dǎo)致線上線下auc不一致最可能出現(xiàn)的情況就是樣本穿越,因?yàn)殡x線訓(xùn)練計(jì)算auc是所有樣本一起計(jì)算的,而線上不可能出現(xiàn)一個(gè)用戶去點(diǎn)擊排序給另一個(gè)用戶的item的情況,所以過濾掉那些點(diǎn)擊為0,或者點(diǎn)擊率過高的用戶) 你們排序是怎么做的,時(shí)效性如何?(可能是看到我對第6個(gè)問題的回答,直接轉(zhuǎn)向了排序) 答:目前基建還不完善,沒有prerank,postrank,rerank階段,排序側(cè)只有一個(gè)排序模型wide&deep,排序模型是實(shí)時(shí)的,每30分鐘線上發(fā)射session label,然后把樣本+特征dump到云上,模型自動訓(xùn)練。 召回的時(shí)候具體怎么做的? 答:每天離線訓(xùn)練完之后,模型會產(chǎn)出當(dāng)天的向量,寫到oss上,下游消費(fèi)向量建立NN索引(HNSW),然后我再刷一遍全量的商品,把nn結(jié)果寫入redis,線上從用戶畫像取用戶lastn,做trigger selection和時(shí)間衰減,最后送到排序模型。 如果現(xiàn)在我上一路DSSM召回,發(fā)現(xiàn)AB實(shí)驗(yàn)效果不好怎么辦? 答:首先看樣本+特征。召回的樣本是不是跟當(dāng)前線上排序模型關(guān)聯(lián),特征穿越之類的;其次看當(dāng)前召回渠道的結(jié)果是不是跟線上已有的重復(fù);追問了一下還有呢?當(dāng)時(shí)有點(diǎn)緊張,只能說那就加大流量,5%不行就到10%,再不行就到20%。到這里面試官笑了,感覺這才是他想要的回答,hh。 兩道Easy算法題。 10.1. 一個(gè)m * n棋盤,只能往右或者往下走,問從左上到右下路徑和的最小值。簡單dp(當(dāng)時(shí)直接用二維dp寫的,寫到一半自己就說了其實(shí)可以用滾動數(shù)組,然后又讓用滾動數(shù)組寫了一遍) 10.2. 斐波那契數(shù)列第n個(gè)數(shù)。當(dāng)時(shí)看到這個(gè)想到肯定是有別的想考的,所以就把記憶化,跟直接用數(shù)組保存比較了一遍。最后又問我時(shí)間復(fù)雜度能不能再低?我說通項(xiàng)公式,有追問還有其他方法嘛?當(dāng)時(shí)緊張給忘了,面試剛結(jié)束就想起來了 ,其實(shí)就是矩陣的n次方,然后就轉(zhuǎn)化成快速冪了,O(logn)。
二面4.12晚上20:00一面面完不到半個(gè)小時(shí)直接約了二面。 自我介紹 答:語速放慢,背; 挑一個(gè)你做的比較熟悉的召回渠道,詳細(xì)講一下(跟一面差不多) 答:dssm召回巴拉巴拉。其中著重提到了樣本的問題,想讓面試官問我。 你剛剛提到了樣本,說說你的樣本具體是怎么做的 答:召回本身最看重的也是樣本,又巴拉巴拉一堆,又著重講到了負(fù)采樣(因?yàn)樨?fù)采樣的邏輯都是我自己做的,所以比較熟)。 說說你負(fù)采樣具體是怎么做的 答:第一版i2i在batch內(nèi)隨機(jī)負(fù)采樣,并加了bias進(jìn)行修正;第二版u2i借鑒w2v,以uv曝光為權(quán)重,全局負(fù)采樣,但是由于全局負(fù)彩成本太大,做了二次哈希,根據(jù)樣本uv進(jìn)行了分桶; 你簡歷上說對FM,DeepFM跟FFM有一定了解,講講。 答:回答了一下各自的特點(diǎn)和改進(jìn)點(diǎn)。
你簡單寫一下FM訓(xùn)練整個(gè)過程的偽代碼吧(懵了,降低時(shí)間復(fù)雜度的證明會,但是直接手撕GG) 答:因?yàn)橐郧笆炙哼^SGD跟LR,所以稀稀拉拉寫了點(diǎn)出來,然后寫了下FM化簡的推導(dǎo),但是FM對w0, w1, Vij的導(dǎo)數(shù)求錯(cuò)了 。線下痛定思痛,直接numpy手撕了一版簡易的FM。
算法題。 數(shù)組第K大的數(shù), 沒看到要求用快排,我用堆排寫了一遍,問了時(shí)空復(fù)雜度+證明。最后又問到了快排怎么做,臨結(jié)束又問了快排怎么做到近線形是件復(fù)雜度的,這里全忘了。其實(shí)就是在partition的時(shí)候引入隨機(jī)性,證明的話網(wǎng)上一堆。
反問環(huán)節(jié)略。二面過去一天,第二天晚上問hr,hr說面試官很忙還沒寫面評價(jià)(其實(shí)就是在橫向),當(dāng)時(shí)就知道自己涼了,果然hr說掛了,問需不需要投其他nlp或者圖像方向,婉拒了。第一次面試直接gg,狠狠的emo了好幾個(gè)小時(shí) 。 筆試4.9下午16:00四道算法題+幾道選擇題(參加過這場的應(yīng)該都知道,全都是easy題,很快全部ac,甚至感覺自己出現(xiàn)了幻覺hh,反而是后面的選擇概念題比較難) 一面4.13晚上20:00自我介紹; 項(xiàng)目介紹; 你說模型里面batch內(nèi)負(fù)采樣用到了bias修正,具體怎么做的? 上線前的準(zhǔn)備,怎么看召回指標(biāo) 答:首先看auc,雖然召回模型的auc基本沒有參考價(jià)值,但是如果auc太低說明根本不行;其次本來應(yīng)該看topn的hr,但是由于業(yè)務(wù)比較緊急,所以當(dāng)時(shí)就直接拉取了頭部的item做了nn,肉眼評測結(jié)果; 負(fù)采樣怎么做的? 跨域i2i怎么做的 答:以swing為例,在UDTF階段生成item -> item_list的領(lǐng)域?qū)?,不同的是,左?cè)的item來源于社區(qū),右側(cè)的item_list來源于商品。
swing跟adamic具體細(xì)節(jié) 答:balabala一堆,然后說到了高活用戶和熱門item的打壓 算法題 也是easy題,判斷是否是一棵合法的二叉搜索樹(我當(dāng)時(shí)用的棧去做非遞歸,pre指針保存中序遍歷前一個(gè)節(jié)點(diǎn),然后跟當(dāng)前節(jié)點(diǎn)判斷值大小,面試官說我這個(gè)做法有問題,應(yīng)該用一個(gè)int保存遍歷過的節(jié)點(diǎn)的最大值,我其實(shí)覺得我做法沒問題,而且還能AC,但是不敢反駁hh,甚至還附和了面試官,哎0offer的孩子就是這么卑微)
二面4.19晚上19:00不得不說,美團(tuán)的流程相比字節(jié)速度真的慢很多很多。二面問的基本全都是業(yè)務(wù)問題,這里就不展開了(貌似現(xiàn)在基本不問八股了,什么SVM,對偶問題,過擬合,BN,dropout,生成模型判別模型,lr為什么用sigmoid,最大似然,L1和L2(拉普拉斯分布和高斯分布)) 美團(tuán)二面感覺還是挺好的,全程都在聊業(yè)務(wù),本來字節(jié)掛了還對美團(tuán)挺抱有希望的,但是直到今天還沒消息,公眾號回復(fù)跟大家的一樣,面試官正在考慮(其實(shí)就是橫向比較)。 算法題:求最短的子數(shù)組長度,子數(shù)組滿足總和 >= target。簡單雙指針。 當(dāng)時(shí)抖音APP推薦涼了之后emo了好幾個(gè)小時(shí),后來在高鐵上的時(shí)候緩過來想找抖音電商,結(jié)果沒想到抖音電商hr主動聯(lián)系上我了,可能就是猿糞吧,又燃起了生活的希望,hh,被撈之后重新充滿斗志。 一面4.18下午18:00自我介紹; 項(xiàng)目介紹; 挑一個(gè)最熟悉的項(xiàng)目; 模型batch內(nèi)負(fù)采樣怎么做的? 加bias有什么用? 答:負(fù)采樣的本質(zhì)是想打壓高曝光item,但是由于高曝光的item本身就頻繁出現(xiàn)在樣本中,隨機(jī)采可能會打壓過頭,因此加一個(gè)bias tower進(jìn)行修正(其實(shí)就是學(xué)一個(gè)值取平衡正負(fù)樣本)。 帶權(quán)負(fù)采樣的邏輯? 答:如果按照uv曝光進(jìn)行帶權(quán)負(fù)采樣,就是先按照uv曝光排序,之后累加,最后生成一個(gè)隨機(jī)數(shù),看著隨機(jī)數(shù)落到哪兩個(gè)item的uv累加和(前綴和)區(qū)間,就采樣哪個(gè)item。 我看你做了swing,分析一下swing的時(shí)間復(fù)雜度? 答:swing是基于用戶行為共現(xiàn)的,首先取一個(gè)時(shí)間周期,獲取這個(gè)時(shí)間周期內(nèi)的用戶點(diǎn)擊行為歷史(最長50個(gè)),得到user->item_list;在UDTF階段,需要根據(jù)用戶的行為歷史得到item->item_neighbors領(lǐng)域集合,假設(shè)用戶數(shù)量為U,人均點(diǎn)擊的item個(gè)數(shù)位I,UDTF階段時(shí)間復(fù)雜度就是O(U*I*I);在UDAF階段要根據(jù)領(lǐng)域去計(jì)算每個(gè)item的最近個(gè)topk個(gè)item,假設(shè)共現(xiàn)當(dāng)中出現(xiàn)的item總數(shù)是N,時(shí)間復(fù)雜就是O(N* I * I),最后還需要根據(jù)大根堆排序,假設(shè)取topK個(gè),則時(shí)間復(fù)雜度位O(N * I * I * logK);可能看我算得很仔細(xì)面試官就沒有繼續(xù)細(xì)問了。 Swing跟Adamic有什么區(qū)別?(略) 概率題。8個(gè)箱子編號1-8,扔進(jìn)箱子的概率是 4 / 5,扔進(jìn)每個(gè)箱子的概率相同;仍不進(jìn)箱子的概率是 1 / 5。扔一次之后,現(xiàn)在打開1號箱子發(fā)現(xiàn)沒有球,問球在8號箱子的概率。(條件概率) 算法題。鏈表排序,要求快排 答:其實(shí)鏈表的快排有2種寫法, 最簡單的是交換值,節(jié)點(diǎn)不變;最難的是直接交換節(jié)點(diǎn),這里面有無數(shù)的邊界case需要處理,當(dāng)時(shí)衡量了一下,直接把遞歸+歸并, 迭代+歸并排序都寫出來了。還給面試官分析了一下,說前面一種時(shí)空都是nlogn,后面一種空間復(fù)雜度為0,然后說說抱歉沒看到是快排hh。面試官說沒事,還是讓我說了一下快排的思路,我就把兩種都說了。
二面4.19下午16:00不得不說字節(jié)的速度是真的很快,大致問題跟之前都差不多,不過這里問了一下基礎(chǔ)。 自我介紹; 項(xiàng)目介紹; 挑一個(gè)最熟悉的項(xiàng)目(語速放慢,到這里基本上前三個(gè)問題,回答的都一模一樣) 了解過nlp嗎(不太了解,只知道最最簡單的,最基礎(chǔ)的) 仍然是一堆業(yè)務(wù)相關(guān)問題; 說一下FM,DeepFM,F(xiàn)FM的區(qū)別聯(lián)系,以及每個(gè)模型的改進(jìn); 你說你們排序是wide&deep,那你對wide&deep有過一定了解嗎? 答:回答了一下自己的見解 你知道wide&deep優(yōu)化的方式嗎? 答:以前看過,主要是兩邊的優(yōu)化器不同,面試的時(shí)候忘了 (wide用的Follow-the-regularization-loss, FTRL, deep用深度學(xué)習(xí)常見的AdamGrad) 為什么優(yōu)化器不同? 答:當(dāng)時(shí)忘了,就亂說一通。到后來想起來然后跟面試官解釋了一下:FTRL主要為了解決L1不能真正得到稀疏解的問題(由于SGD),wide側(cè)很需要稀疏解,第一避免過擬合,第二線上部署的時(shí)候稀疏那部分直接去掉,能提高超高多的性能;deep部分就是傳統(tǒng)的deeplearning了。 了解優(yōu)化器嗎? 答:之前記得很多,包括公式,就簡單說了一下SGD,Adaptive,AdamGrad之類的,其實(shí)主要是為了動態(tài)去調(diào)整學(xué)習(xí)率,然后從局部最小值收斂性簡單瞎BB了幾下。最后又說好多都忘了,面試官很溫柔說不記得也沒事。 概率題。西游記主題盲盒,抽中師徒四人任意一人的概率相同,問要抽中孫悟空的平均次數(shù)。 答:當(dāng)時(shí)面試官表達(dá)得很含糊,我戰(zhàn)戰(zhàn)兢兢回答了4次,他問思路,我說就是伯努利實(shí)驗(yàn),n重伯努利實(shí)驗(yàn)就是二項(xiàng)分布,二項(xiàng)分布的期望是np,np = 1的時(shí)候,n = 4。面試官說,哦你直接套公式啊。。。。。我感覺面試官是想讓我手撕二項(xiàng)分布的期望方差?下去之后自己推導(dǎo)了一下。 算法題。easy題,背包,給定硬幣面值,組成target需要的最小硬幣數(shù)。
反問環(huán)節(jié)的時(shí)候跟面試官探討了一下那道概率題,面試官最后又拓展說抽全4種的平均次數(shù),讓我線下去思考一下。直接的思路就是算n次,抽全的概率,E(x) = sum(np),最后演變成無窮級數(shù)收斂值的問題。后來到處請教查資料,發(fā)現(xiàn)可以構(gòu)造數(shù)列An,表示 還剩下n種沒有集齊的卡片時(shí)候,需要抽的次數(shù)。An = 1 + n / 4 * An-1 + (4 - n) / 4 * An。這個(gè)做法驚呆了。。。。 三面4.20上午11:00
說在前面,第一次體驗(yàn)字節(jié)三面,面完整個(gè)人都不好了。前面的問題直接略過看重點(diǎn)。 你說你做過對比學(xué)習(xí)(實(shí)驗(yàn)室醫(yī)學(xué)圖像項(xiàng)目,面試這么久第一次被問到,當(dāng)時(shí)用的是自監(jiān)督對比),談?wù)勀銓Ρ葘W(xué)習(xí)的理解。 現(xiàn)在如果要把自監(jiān)督用到召回里做i2i該怎么做? 你接觸過圖像,現(xiàn)在要建模商品圖片對于點(diǎn)擊/購買的影響該怎么做? 用一行代碼寫出對比學(xué)習(xí)的loss?(當(dāng)時(shí)直接懵了,對比學(xué)習(xí)最后做對抗loss的時(shí)候,涉及到很多計(jì)算技巧,一行代碼GG) 如果寫不出來的話,寫一下ce的loss也行(貌似是最容易回答的) 你覺得siamese跟simclr有什么異同,你是怎么理解的? 從數(shù)學(xué)推導(dǎo)的角度證明一下,自監(jiān)督能夠提高模型性能?(懵了,難道不都是直接看實(shí)驗(yàn)結(jié)果才能知道嗎?當(dāng)時(shí)就只能bb,數(shù)學(xué)推導(dǎo)gg) 現(xiàn)在如果想要增加圖搜功能,拍照搜索商品,該怎么做? 了解統(tǒng)計(jì)學(xué)派跟貝葉斯學(xué)派嗎?你覺得最大似然更接近哪個(gè)? 概率題,4支球隊(duì),單循環(huán)賽,輸贏平概率相同,分別得分3,0,1.問最后4支隊(duì)伍得分總和服從什么分布? 答:其實(shí)相當(dāng)于做6次伯努利實(shí)驗(yàn),每次實(shí)驗(yàn)得3分的概率是 2 / 3, 平了2分概率是1 / 3,最后分?jǐn)?shù)范圍為12 - 18,概率遞增,相當(dāng)于一個(gè)離散分布列。但是當(dāng)時(shí)讓我回答服從什么分布,GG,好像叫得上名字的分布跟這個(gè)都沒關(guān)系,當(dāng)時(shí)只能支支吾吾的說服從廣義的二項(xiàng)分布,然后面試官讓我寫公式,我寫到一半面試官直接說那面試就到這里。。。
反問:這里不省略,是因?yàn)槲疫@輩子都會記得。當(dāng)時(shí)我整個(gè)人都是萬臉懵逼的狀態(tài),鬼使神差脫口問了句實(shí)習(xí)的話有轉(zhuǎn)正hc嗎?面試官手都已經(jīng)準(zhǔn)備合上電腦蓋了,然后他笑了,沒錯(cuò)他笑了。。 HR面4.26上午11:00其實(shí)三面之后自己都覺得涼透了,甚至還問過hr小姐姐,小姐姐人特別好,說幫我爭取一下。看到爭取一下心里又涼了半截,甚至一度又emo了好幾個(gè)小時(shí),美團(tuán)又遲遲不給回應(yīng),整個(gè)人都裂開。當(dāng)時(shí)hr給我發(fā)微信的時(shí)候突然說技術(shù)面過了,約hr面。想象一下一個(gè)高考落榜的人突然告訴你系統(tǒng)分?jǐn)?shù)算錯(cuò)了。。(其實(shí)還是怪自己菜,三面發(fā)散性思維,回答得太差了,但是不知道為什么居然能過?) 自我介紹+職業(yè)規(guī)劃+遇到問題怎么結(jié)局+入職時(shí)間,實(shí)習(xí)時(shí)常+如果碰到身邊有同事劃水怎么辦= =!.27今天下午已OC。感謝小姐姐!字節(jié)流程是真的速度! 當(dāng)時(shí)覺得字節(jié)涼透了,于是開啟了海投模式。讓實(shí)驗(yàn)室?guī)熜置蛢?nèi)推了。PS:快手的面試官好溫柔,溫文爾雅。這半個(gè)月的面試,快手的面試體驗(yàn)是最好的,其次是美團(tuán),說錯(cuò)了不打斷,但是會善意提醒你。 一面4.25下午17:00
自我介紹; 項(xiàng)目; 寫出對比學(xué)習(xí)的Loss; 對比學(xué)習(xí)本質(zhì)是想?yún)^(qū)分不用的內(nèi)容,拉近相同內(nèi)容,但是相同內(nèi)容純天然就有一定相似性,怎么解決? 你覺得在做對比學(xué)習(xí)的時(shí)候最主要需要注意的地方是什么? Siamisese跟SimCLR有什么不同? 聊聊項(xiàng)目吧,說說你最熟悉的一項(xiàng)工作。 負(fù)采樣怎么做的?為什么要負(fù)采樣? 模型怎么部署的,特征怎么處理的? 排序了解嗎?FM知道嗎?為什么能降低時(shí)間復(fù)雜度?系列FM之間的差別在哪兒? 我看你寫了XGBoost,講講他對于GBDT的優(yōu)化點(diǎn)。(第一次碰到,終于有人問了hh) XGBoost葉子節(jié)點(diǎn)的值怎么得到的(這個(gè)忘了,瞎說說分裂之后的平均值,還會在分裂的時(shí)候正則化,面試官糾正我其實(shí)是根據(jù)優(yōu)化目標(biāo)得來的) 隨機(jī)了一道算法題。二叉樹層序遍歷(啊這)
今天跟我約了明天二面; 我投遞的比較晚,基本上是4.5才開始準(zhǔn)備。結(jié)果剛投騰訊WXG,直接宣布不招人;剛投阿里,又直接鎖HC。。整體的面試還是業(yè)務(wù)的偏多,準(zhǔn)備了好多好多基礎(chǔ),樹,LR,SVM推導(dǎo)(軟硬間隔),KKT,SVM回歸,手撕SGD,手撕DNN,手撕Softmax,手撕LR,XGB損失函數(shù)推導(dǎo),LightGBM優(yōu)化,Boost&Bagging,GBDT,卷積,BN,激活函數(shù),L1,L2,近段梯度下降,牛頓法,最大似然,幾乎都沒用上(只有快手的面試官問過一些)。 算法題也都o(jì)c了(不過都是easy題) 一路走來幾乎每天都過的渾渾噩噩,從最開始被拒絕的失落難受到振作,到嘴里一邊罵一邊leetcode的量子疊加態(tài),最后終于從0到1有了個(gè)offer。也祝愿大家春招收獲滿滿(馬上就要結(jié)束了),秋招備戰(zhàn)!最后借用小紅書那個(gè)跟我關(guān)系很鐵的前輩說的話收個(gè)尾:年輕的時(shí)候我們都夢想大廠,但是最后一定要找到最適合自己的那個(gè)角落!沒有找到的牛友也別泄氣,面試7分靠實(shí)力,3分靠運(yùn)氣,最重要就是別否認(rèn)自己。
|