訊飛算法工程師面試題
- SVM核函數能否映射到無窮維
????可以的,多項式核函數將低維數據映射到高維(維度是有限的),而高斯核函數可以映射到無窮維。由
- 描述下xgb原理,損失函數
????首先需要說一說GBDT,它是一種基于boosting增強策略的加法模型,訓練的時候采用前向分布算法進行貪婪的學習,每次迭代都學習一棵CART樹來擬合之前t-1棵樹的預測結果與訓練樣本真實值的殘差。XGBoost對GBDT進行了一系列優化,比如損失函數進行了二階泰勒展開、目標函數加入正則項、支持并行和默認缺失值處理等,在可擴展性和訓練速度上有了巨大的提升,但其核心思想沒有大的變化。或
- 描述下卷積神經網絡
????卷積神經網絡,通常包含5層,輸入層,卷積層,激活層,池化層,全連接F℃層,其中核心部分是卷積層和池化層。優點:共享卷積核,對高維數據處理無壓力;無需手動選取特征。缺點:需要調參;需要大量樣本。
- Tensorflow和Pytorch的區別
????pytorch中是動態圖機制,也就是在運行的時候構建,而tensorflow1.x是靜態圖,需要先構建,再運行。靈活性pytorch:動態計算圖,數據參數在CPU與GPU之間遷移十分靈活,調試簡便;tensorflow1.X:靜態計算圖,數據參數在CPU與GPU之間遷移麻煩,調試麻煩。設備管理pytorch:需要明確啟用的設備tensorflow:不需要手動調整,簡單
- 為什么Tensorflow方便部署
????從一開始,TensorFlow就是一個面向部署的首選框架,因為有一系列可以提高端到端深度學習效率的工具,如TensorFlow Serving和TensorFlow Lite。
- 靜態圖和動態圖
????目前神經網絡框架分為靜態圖框架和動態圖框架,PyTorch和TensorFlow、Caffe等框架最大的區別就是他們擁有不同的計算圖表現形式。TensorFlow使用靜態圖,這意味著先定義計算圖,然后不斷使用它,而在PyTorch中,每次都會重新構建一個新的計算圖。動態圖比較方便dbug,同時非常直觀,而靜態圖是通過先定義后運行的方式,之后再次運行的時候就不再需要重新構建計算圖,所以速度會比動態圖更快。
- 簡單描述下知識蒸餾、量化、剪枝
????知識蒸餾一般將復雜、學習能力強的網絡學到的特征表示“知識”蒸餾出來,傳遞給參數量小、學習能力弱的網絡。量化就是用較低位寬表示典型的32位浮點網絡參數。剪枝的主要思想就是將權重矩陣中相對“不重要”的權值剔除。
AI算法崗面試
- 描述transformer的原理,encoder和decoder是怎樣的?
????Transformer網絡是一個Encoder-Decoder(編碼,解碼)的結構,整體是由輸入部分,Encoder部分和Decoder部分組成。Encoder端和Decoder端均有6個Block,Encoder端的Block包括兩個模塊,多頭self-attention模塊以及一個前饋神經網絡模塊;Decoder端的Block包括三個模塊,Masked多頭self-attention模塊,多頭Encoder-Decoder attention交互模塊,以及一個前饋神經網絡模塊;需要注意:Encoder端和Decoder端中的每個模塊都有殘差層和Layer Normalization層。
- CNN家族算法和Transformer家族的算法區別在哪里?
????Transformer模型的核心是self-attention機制,而CNN模型的核心是卷積和池化;(2)Transformer模型可以學習到數據中每個詞之間的相關性,而CNN關注于二維局部數據之間的相互關聯,隨著層的加深,關注區域會更廣。
- 給定一個遞增數組,找出總和為k的最長子數組
class Solution: def maxSubArrayLen(self,nums:List[int],k:int)->int:n=len(nums)preSum={}#第一次出現和為key的子數組的index(O~index)count=0ans=0preSum[0]=0for i in range(n):count=count+nums[i]if count not in preSum:preSum[count]=i+1if count-k in preSum:ans=max(ans,i-preSum[count-k]+1)return ans
- Precision和Recall在評價模型指標有什么區別?
????Precision和Recall通常是一對矛盾的性能度量指標。一般來說,Precision高時,Recall值往往偏低;而Precision值低時,Recall值往往偏高。比如商品推薦系統場景,希望推薦內容的確是用戶感興趣的,側重Precision;而貸款違約用戶識別場景,希望盡可能不放過壞用戶,更側重Recall。
- PR AUC和ROC AUC有什么區別?
????ROC AUC:指ROC曲線下的面積。通過在[0,1]范圍內選取閾值(threshold)來計算對應的TPR和FPR,最終將所有點連起來構成ROC曲線。PR AUC:指PR曲線下的面積。通過在[0,1]范圍內選取閾值(threshold)來計算對應的Precision和Recall,最終將所有點連起來構成ROC曲線。ROC-AUC衡量的是模型排序的能力;當樣本不平衡的時候,更適用ROC-AUC,因為其對于正負樣本的比例不敏感;當我們關心Positive Samples和Negative Samples時,可以使用ROC-AUC。PR AUC適用于更關心Positive Samples,以及權衡precision和recall的時候。
- 并行訓練的時候有哪些方法加快訓練速度?
????數據并行:將一大塊數據切成小份,分發給幾個完全相同模型,分別訓練,之后聚合梯度。模型并行:模型太大,一張卡放不下,要放到多張卡上去。
風控算法工程師
- 了解的社區發現算法有哪些?
????GN算法 Louvain算法 LPA標簽傳播 SLPA算法 K-L算法
- Louvain算法的算法流程
- 通過局部的更改節點社區分類來優化Modularity:先將每個節點指定到唯一的一個社區,然后按順序將節點在這些社區間進行移動。以節點i為例,它有三個鄰居節點j1,j2,j3,我們分別嘗試將節點i移動到j1,j2,j3所在的社區,并計算相應的modularity變化值,哪個變化值最大就將節點i移動到相應的社區中去,如果最大的變化值也為負,則不移動。
- 按照這個方法反復迭代,直到網絡中任何節點的移動都不能再改善總的modularity值為止。
- 1,2兩個步驟看做第一階段。把第一階段得到的社區視為一個新的節點。重新構造子圖,兩個節點之間邊的權值為相應兩個社區之間各邊的權值的總和。
- 重復1,2,3步驟的操作,直到Modularity不再增加為止。
- LPA算法的算法流程
- 為所有節點指定一個唯一的標簽
- 逐輪刷新所有節點的標簽,直到達到收斂要求為止。
- 對于每一輪刷新,節點標簽刷新的規側如下:
- 對于某一個節點,考察其所有鄰居節點的標簽,并進行統計,將出現個數最多的那個標簽賦給當前節點。
- 當個數最多的標簽不唯一時,隨機選一個。
- 線程和進程的區別是什么
????進程是操作系統進行資源分配和調度的基本單位,多個進程之間相互獨立:線程是CPU進行資源分配和調度的基本單位,線程是進程的一部分。進程適合計算密集型任務,進程數取決于CPU核數:線程適用于1O操作密集型的任務。
- LC124一一二叉樹中的最大路徑和
class Solution:def_init_(self):self.maxSum float("-inf")def maxPathSum(self,root:TreeNode)->int:def maxGain(node):if not node:return 0leftGain max(maxGain(node.left),0)rightGain max(maxGain(node.right),0)priceNewPath node.val leftGain rightGainself.maxSum max(self.maxSum,priceNewPath)return node.val max(leftGain,rightGain)maxGain(root)return self.maxSum
6、LC440一—字典序的第K小數字,字典樹思想
class Solution:def getSteps(self,cur:int,n:int)->int:steps,first,last =0,cur,curwhile first<∈n:steps +=min(last,n)-first 1first *=10last last 10 +9return stepsdef findKthNumber(self,n:int,k:int)->int:cur 1k-=1while k:steps self.getSteps(cur,n)if steps <k:k-=stepscur +1else:cur *10k-=1return cur