阿里春招之旅(一)

这是我今年的第一次面试,阿里前辈很谦和,交流过程中我从开始的紧张慢慢地舒缓,也在尽力地表现自己对问题的看法与理解。不过还是有好多知识点很不清晰,希望通过总结能够查缺补漏。

算法题:

输入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,交流过程中也逐渐地放开了。事后想想,换个心态更好,把面试时遇到的每个不懂的问题都当做对自己的查缺补漏,对每一次面试当做考试一样,考前要有准备,考试的结果就是自己当前的真实水平,考后及时总结来查缺补漏,整个过程当做一种学习的过程,相信这样会更加脚踏实地一点,技术上的提升自然会非常明显,结果也就会越来越好。

如果觉得不错,请素质三连哈~~

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