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