阿里春招之旅(一)

這是我今年的第一次面試,阿里前輩很謙和,交流過程中我從開始的緊張慢慢地舒緩,也在盡力地表現自己對問題的看法與理解。不過還是有好多知識點很不清晰,希望通過總結能夠查缺補漏。

算法題:

輸入M、N及M*N的01舉證,1表示島嶼,0表示海洋,如果兩個1相鄰,則爲同一個島嶼,考慮上下左右爲相鄰。請問總共有多少個島嶼?

這其實是一道考深度或者廣度搜索的題。下面是我整理後的代碼,時間複雜度和空間複雜度都爲O(M*N),後者是由遞歸程序產生的。補充:這是leetcode-200. 島嶼數量

class Solution:
    def countIslands(self, arr, m, n):
        def search(row,col):
            if 0<=row<m and 0<=col<n and arr[row][col]==1:
                arr[row][col]=-1
            else:
                return
            search(row-1,col) #上
            search(row+1,col) #下
            search(row,col-1) #左
            search(row,col+1) #右
        amount = 0
        for i in range(m):
            for j in range(n):
                if arr[i][j]==1:
                    amount+=1
                    search(i,j)
        return amount


if __name__ == '__main__':
    arr = [[0,1,0,0,1,0],[0,1,0,1,1,0]]
    m = 2
    n = 6
    solution = Solution()
    result = solution.countIslands(arr,m,n)
    print(result)

簡歷上的問題:

  1. 介紹論文用到的度量學習技術:
    我當時的回答是先介紹度量學習的目標,然後介紹度量學習實現的一般原理,現在進行梳理一遍。
    目標:引用南瓜書的原話就是“在機器學習中,對高維數據進行降維的主要目的是希望找到一個合適的低維空間,在此空間中進行學習能比原始空間性能更好。事實上,每個空間對應了在樣本屬性上定義的一個距離度量,而尋找合適的空間,實質上就是在尋找一個合適的距離度量.那麼,爲何不直接嘗試“學習”出一個合適的距離度量呢?這就是度量學習(metric learning)的基本動機.”不過,我的理解更直白些,度量學習是想學習一個度量矩陣,通常用於距離的計算,如KNN/SVM中會涉及距離計算,距離很多時候被用於衡量樣本之間的相似性,這個度量矩陣要能體現不同特徵的重要性以及彼此之間的關係,所以這個度量矩陣的形狀通常是d*d,d代表特徵的數目。
    實現原理:我論文中用到的是有監督的全局度量學習方法,所以可以介紹邢波老師在2001年發表的MMC算法。具體做法是建立一個勿連集合約束C和必連集合約束M,希望屬於M的樣本對之間距離儘可能近,屬於C的樣本對之間儘可能遠,如(xi,xj)M(x_i,x_j) \in \mathcal{M}(xi,xk)C(x_i,x_k) \in \mathcal{C}這樣就得到了目標函數以及它的約束
    minM(xi,xj)MxixjM2 s.t. (xi,xk)CxixkM21M0 \begin{aligned} &\min _{\mathbf{M}} \sum_{\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{j}\right) \in \mathcal{M}}\left\|\boldsymbol{x}_{i}-\boldsymbol{x}_{j}\right\|_{\mathbf{M}}^{2}\\ &\text { s.t. } \sum_{\left(\boldsymbol{x}_{i}, \boldsymbol{x}_{k}\right) \in \mathcal{C}}\left\|\boldsymbol{x}_{i}-\boldsymbol{x}_{k}\right\|_{\mathbf{M}}^{2} \geqslant 1\\ &\mathbf{M} \succeq 0 \end{aligned}
    這是個凸優化問題,可以利用優化理論求解得到馬氏矩陣。
    另外,值得一提的是像PCA這類降維算法其實是屬於無監督的全局度量學習方法。
  2. CTR預測比賽用到的GBDT/FM/XGBoost技術【我個人覺得這裏是重中之重】:
    GBDT:GBDT是怎麼的算法流程?GBDT如何選取特徵,也就是樹是如何生成的?GBDT如何組合新特徵,這是跟GBDT+LR/FM的用法有關?GBDT如何用於分類?gbdt 通過什麼方式減少誤差 ?gbdt的效果相比於傳統的LR,SVM效果爲什麼好一些 ?gbdt 如何加速訓練?gbdt的參數有哪些,如何調參 ?gbdt 實戰當中遇到的一些問題 ?gbdt的優缺點 ?
    參考資料:
    機器學習算法GBDT的面試要點總結-上篇
    對梯度提升的理解
    李航——《統計學習方法》
    FM:factorization machine,是爲了解決稀疏數據下的特徵組合問題。我覺得要能回答三個問題:一,FM要解決的問題,要直觀一點的解釋;二,FM是怎麼來解決的,也是直觀上的解釋;三,具體用到的技術手段,這個需要明白數學原理與算法流程。最後還可以學習下FFM與FM的區別。
    參考資料:分解機
    XGBoost:XGBoost相比於GBDT的優點有哪些?1.boost策略不同,GBDT是一階梯度,在損失函數爲平方差時,就是殘差;而XGBoost則是二階梯度。2.XGBoost加入了L1/L2正則項,可用於防止過擬合,當然也是用於控制模型的複雜度。正則項裏包含了樹的葉子節點個數、每個葉子節點上輸出的score的L2範數的平方和。3.有個學習率η\eta,梯度下降算法都會有個這個學習率,是用來控制收斂的步伐的,XGBoost一般會把η\eta設置得較小,並把迭代次數設置得大一點,至於用法就是作用在葉子結點上,這也就參與到損失函數的計算上了。4.列抽樣,這個據說是借鑑的RF,可用於防止過擬合和減少計算開銷。5.號稱並行速度快,這個並行並不是樹生成上的並行,因爲它是boost方法,下次迭代的樹得看上一次的結果,這裏並行指的是生成樹過程中找特徵以及最優切分點上的並行,可以這樣並行的原因是XGBoost讀入所有訓練樣本後就會提前會對每個特徵做好排序。6.XGBoost中加入正則化項,也起到剪枝的效果。它把正則化項前的係數用在了XGBoost自己的增益策略中當做閾值,一旦增益小於閾值,也就是模型複雜度增加的代價高於準確度提升的代價,那就沒必要分裂了。
    參考資料:Adaboost, GBDT 與 XGBoost 的區別
  3. 開放題:通常這個應該與前輩們正在解決的工程問題有關,這裏不便展開,只是這裏提一點,這類題也無法提前準備,大家結合自己的基礎有自己獨特的思考即可。

結語:
這算是我最正式的第一次面試,而且還是阿里這樣的大廠名廠,一開始還是很緊張的,不過由於阿里前輩十分的nice,交流過程中也逐漸地放開了。事後想想,換個心態更好,把面試時遇到的每個不懂的問題都當做對自己的查缺補漏,對每一次面試當做考試一樣,考前要有準備,考試的結果就是自己當前的真實水平,考後及時總結來查缺補漏,整個過程當做一種學習的過程,相信這樣會更加腳踏實地一點,技術上的提升自然會非常明顯,結果也就會越來越好。

如果覺得不錯,請素質三連哈~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章