來源:AIGC小白入門記
最近參加了智譜大模型算法崗位的面試,收獲頗豐,特地來分享一下這次的面試經(jīng)歷,希望能給正在求職的小伙伴們提供一些參考。
一、面試流程
面試整體分為三個(gè)部分:手撕代碼、項(xiàng)目介紹以及專業(yè)知識(shí)問答(八股)。
(一)手撕代碼
面試官首先讓我手撕一個(gè) tokenizer,tokenizer 是自然語言處理中用于將文本拆分成一個(gè)個(gè)標(biāo)記(token)的工具。我從最簡(jiǎn)單的字符級(jí)別 tokenizer 開始講起,然后逐步擴(kuò)展到基于詞典的分詞方法,最后還提到了一些基于深度學(xué)習(xí)的預(yù)訓(xùn)練分詞模型,如 BERT 的 WordPiece 算法。面試官對(duì)細(xì)節(jié)把握得很嚴(yán),讓我詳細(xì)解釋了如何處理一些特殊字符、未知詞匯等問題;
還讓我用偽代碼簡(jiǎn)單描述了 RAG(Retrieval-Augmented Generation)模型的基本流程。RAG 是一種結(jié)合了檢索和生成的模型,先從一個(gè)大規(guī)模的文檔集合中檢索出與輸入文本相關(guān)的文檔片段,然后再基于這些片段生成目標(biāo)文本。我用偽代碼展示了檢索部分和生成部分的交互過程,面試官對(duì)這個(gè)部分的邏輯和實(shí)現(xiàn)細(xì)節(jié)很感興趣,問了我一些優(yōu)化思路。
(二)項(xiàng)目介紹
項(xiàng)目介紹部分是面試的重點(diǎn)之一,面試官讓我詳細(xì)講解我之前參與的一個(gè)項(xiàng)目。
項(xiàng)目具體解決問題:我介紹的項(xiàng)目是一個(gè)智能問答系統(tǒng),主要解決的是用戶在海量數(shù)據(jù)中快速獲取準(zhǔn)確信息的問題。例如,用戶可以通過自然語言提問,系統(tǒng)能夠理解問題并從數(shù)據(jù)庫中檢索出相關(guān)的答案。
每個(gè)模塊如何實(shí)現(xiàn):這個(gè)項(xiàng)目分為多個(gè)模塊,包括自然語言理解(NLU)、知識(shí)庫管理、問答匹配和答案生成等模塊。在 NLU 模塊,我詳細(xì)講解了如何使用深度學(xué)習(xí)模型(如 LSTM)來提取問題的語義特征;在知識(shí)庫管理模塊,我介紹了如何構(gòu)建和維護(hù)一個(gè)結(jié)構(gòu)化的知識(shí)庫,以支持高效的檢索;在問答匹配模塊,我講述了如何通過計(jì)算問題和知識(shí)庫中條目的相似度來找到最相關(guān)的答案;在答案生成模塊,我提到了使用模板生成和基于生成模型(如 GPT)生成兩種策略。
NL2SQL 在處理多表查詢的時(shí)候采取啥策略:這個(gè)項(xiàng)目中用到了 NL2SQL(自然語言到結(jié)構(gòu)化查詢語言)技術(shù),用于將用戶的自然語言問題轉(zhuǎn)換為 SQL 查詢語句。在處理多表查詢時(shí),我采用了基于語義解析的方法,首先解析出問題中涉及的實(shí)體、關(guān)系和屬性,然后根據(jù)這些信息構(gòu)建出多表連接的 SQL 查詢。例如,對(duì)于一個(gè)涉及兩個(gè)表(如“學(xué)生表”和“課程表”)的查詢問題,我會(huì)先解析出學(xué)生和課程之間的關(guān)系(如“選課”關(guān)系),然后生成相應(yīng)的 JOIN 語句來連接這兩個(gè)表。
k8s 和 docker 在項(xiàng)目中的作用:在項(xiàng)目的部署階段,我們使用了 Docker 來容器化每個(gè)模塊,這樣可以保證每個(gè)模塊的運(yùn)行環(huán)境一致,避免了“在我的機(jī)器上可以運(yùn)行”的問題。而 Kubernetes(k8s)則用于管理這些容器,實(shí)現(xiàn)自動(dòng)擴(kuò)縮容、負(fù)載均衡等功能。例如,當(dāng)問答系統(tǒng)的訪問量突然增加時(shí),k8s 可以自動(dòng)啟動(dòng)更多的容器實(shí)例來應(yīng)對(duì)高流量,保證系統(tǒng)的穩(wěn)定運(yùn)行。
這部分主要考察我對(duì)一些常見算法、模型和框架的理解。
對(duì) PPO、DPO、GRPO 計(jì)算邏輯的理解:PPO(Proximal Policy Optimization)是一種強(qiáng)化學(xué)習(xí)算法,通過截?cái)喔怕时葋硐拗撇呗愿碌姆龋瑥亩WC更新的穩(wěn)定性。DPO(Deep Policy Optimization)是 PPO 的一種改進(jìn)版本,引入了深度學(xué)習(xí)的思想,可以更好地處理復(fù)雜的策略函數(shù)。GRPO(Generalized Reinforcement Policy Optimization)則是一種更通用的框架,可以涵蓋多種強(qiáng)化學(xué)習(xí)算法。我詳細(xì)解釋了它們的計(jì)算邏輯,包括如何計(jì)算目標(biāo)函數(shù)、如何更新策略等。
對(duì) KL 散度的三種估計(jì)的理解:KL 散度(Kullback–Leibler Divergence)是衡量?jī)蓚€(gè)概率分布差異的指標(biāo)。常見的估計(jì)方法有直接計(jì)算法、蒙特卡洛估計(jì)法和變分估計(jì)法。直接計(jì)算法需要知道兩個(gè)分布的解析形式,蒙特卡洛估計(jì)法通過采樣來近似計(jì)算 KL 散度,而變分估計(jì)法則通過引入一個(gè)變分分布來降低計(jì)算復(fù)雜度。我對(duì)比了這三種方法的優(yōu)缺點(diǎn),例如直接計(jì)算法精度高但適用范圍有限,蒙特卡洛估計(jì)法簡(jiǎn)單但可能需要大量樣本,變分估計(jì)法可以用于復(fù)雜的分布但可能存在偏差。
LORA 和 p-tuning v2 的區(qū)別,怎么初始化:LORA(Low-Rank Adaptation)是一種參數(shù)高效的微調(diào)方法,通過在預(yù)訓(xùn)練模型的每一層插入低秩矩陣來實(shí)現(xiàn)微調(diào)。p-tuning v2 是一種基于提示的學(xué)習(xí)方法,通過在輸入中添加提示來引導(dǎo)模型生成期望的輸出。它們的主要區(qū)別在于 LORA 是直接修改模型的參數(shù),而 p-tuning v2 是通過改變輸入的形式來影響模型的輸出。在初始化方面,LORA 的低秩矩陣通常初始化為小的隨機(jī)值,而 p-tuning v2 的提示可以通過一些啟發(fā)式方法來設(shè)計(jì),例如根據(jù)任務(wù)的語義來選擇合適的提示詞。
DeepSeek R1 訓(xùn)練全流程,MLA 具體怎么做的:DeepSeek R1 是一個(gè)大規(guī)模的預(yù)訓(xùn)練模型,其訓(xùn)練全流程包括數(shù)據(jù)預(yù)處理、模型初始化、訓(xùn)練迭代和模型評(píng)估等步驟。在數(shù)據(jù)預(yù)處理階段,需要對(duì)海量的文本數(shù)據(jù)進(jìn)行清洗、分詞和編碼等操作;模型初始化時(shí),會(huì)隨機(jī)初始化模型的參數(shù);在訓(xùn)練迭代過程中,使用大規(guī)模的計(jì)算資源進(jìn)行分布式訓(xùn)練,通過反向傳播更新模型參數(shù);最后通過一些指標(biāo)(如困惑度、準(zhǔn)確率等)來評(píng)估模型的性能。MLA(Multi-Label Attention)是 DeepSeek R1 中用于處理多標(biāo)簽分類任務(wù)的一種機(jī)制,它通過引入多個(gè)注意力頭來分別關(guān)注不同的標(biāo)簽信息,從而提高多標(biāo)簽分類的性能。
梯度爆炸和消失怎么處理的:梯度爆炸和消失是深度學(xué)習(xí)訓(xùn)練過程中常見的問題。對(duì)于梯度爆炸,可以采用梯度裁剪的方法,將梯度限制在一個(gè)合理的范圍內(nèi);對(duì)于梯度消失,可以通過使用合適的激活函數(shù)(如 ReLU 及其變體)、初始化方法(如 Xavier 初始化)和網(wǎng)絡(luò)結(jié)構(gòu)(如殘差網(wǎng)絡(luò))來緩解。我詳細(xì)解釋了這些方法的原理和應(yīng)用場(chǎng)景。
torch 中 register parameter 和 buffer 的區(qū)別:在 PyTorch 中,
register_parameter
用于注冊(cè)模型的參數(shù),這些參數(shù)會(huì)被自動(dòng)加入到模型的參數(shù)列表中,會(huì)在訓(xùn)練過程中被優(yōu)化器更新。而register_buffer
用于注冊(cè)一些不需要更新的張量,例如模型的輸入數(shù)據(jù)、中間變量等,這些張量不會(huì)被優(yōu)化器更新,但會(huì)在模型的前向傳播過程中被使用。我通過一個(gè)簡(jiǎn)單的例子來說明它們的區(qū)別。torch 如何實(shí)現(xiàn)不記錄梯度:在 PyTorch 中,可以通過設(shè)置
torch.no_grad()
上下文管理器來實(shí)現(xiàn)不記錄梯度。在torch.no_grad()
的作用范圍內(nèi),所有的操作都不會(huì)記錄梯度,這在推理階段或者一些不需要計(jì)算梯度的場(chǎng)景中非常有用。例如,在使用預(yù)訓(xùn)練模型進(jìn)行推理時(shí),可以使用torch.no_grad()
來提高計(jì)算效率。torch squeeze 和 unsqueeze 干嘛的:
torch.squeeze
和torch.unsqueeze
是 PyTorch 中用于操作張量維度的函數(shù)。torch.squeeze
用于去除張量中大小為 1 的維度,例如將一個(gè)形狀為[1, 3, 1, 4]
的張量壓縮為[3, 4]
;而torch.unsqueeze
則用于在張量的指定位置插入一個(gè)大小為 1 的維度,例如將一個(gè)形狀為[3, 4]
的張量擴(kuò)展為[1, 3, 4]
。這兩個(gè)函數(shù)在處理張量的維度時(shí)非常方便,尤其是在進(jìn)行張量拼接、廣播等操作時(shí)。python 設(shè)計(jì)刪除流程的時(shí)候,若涉及可變和不可變對(duì)象該如何 debug:在 Python 中,可變對(duì)象(如列表、字典等)和不可變對(duì)象(如整數(shù)、字符串等)在刪除操作時(shí)的行為有所不同。對(duì)于可變對(duì)象,直接修改對(duì)象的內(nèi)容會(huì)影響所有引用該對(duì)象的變量;而對(duì)于不可變對(duì)象,刪除操作只是讓變量不再指向該對(duì)象,不會(huì)影響其他變量。在設(shè)計(jì)刪除流程時(shí),需要注意這些區(qū)別,避免出現(xiàn)意外的錯(cuò)誤。調(diào)試時(shí)可以通過打印變量的引用地址(使用
id()
函數(shù))來檢查變量是否指向同一個(gè)對(duì)象,從而確定刪除操作是否按預(yù)期執(zhí)行。多機(jī)多卡和單機(jī)多卡的實(shí)現(xiàn)上有什么不同:多機(jī)多卡和單機(jī)多卡都是用于加速深度學(xué)習(xí)模型訓(xùn)練的分布式計(jì)算方式。單機(jī)多卡主要通過
春天的美妙時(shí)光
LEARN FROM LEI FENG
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.