阿里天猫一面
今天早上突然接到了阿里的面试电话,真的是十分惊悚。。本来想约20分钟以后(回宿舍准备好开卷设备),但是小哥说过一会他要开会,所以就这样硬着头皮开始了阿里一面。
先是一个简单的自我介绍;
1.然后介绍了项目的框架和主要创新点;
2.说一下随机森林和Adaboost,以及区别
3.说一下GBDT和Adaboost,以及区别
4.你用到了LDA说一下LDA的原理
5.对于PCA,会有第一主成分、第二主成分,怎么为什么第一主成分是第一,原因是什么?
6.PCA的主成分是怎么得到的
小哥说他们推荐主要会基于图片之类的、所以可能深度学习用的多
我问小哥那是不是一定要求会深度学习才行啊
小哥说,你不会可以学么。。。这样我这边先给你过,看下一面吧,这还有一段时间你先学学,关于深度学习、图像、推荐相关的内容。
然后我又确定了一下地点是否在杭州,就结束了我与阿里的第一次接触,可以说是很刺激了。
GIO机器学习工程师(实习)一面
这次小哥先加了我的微信,然后通过微信语音进行了面试。小哥先进行了一下自我介绍(话说这还是第一次有面试官作自我介绍给我),并且介绍了一下公司的情况,目前所做的东西是什么。
然后让我也进行了一个简短的自我介绍,其中简单涉及了一些学业情况,学术研究和本科的实习。
1.还是先问了简历里面写的科研项目,问了其中我所做的几个创新点,以及哪一部分出了论文,
然后就是我balabala的讲了半天的我做的东西,(小哥好像觉得还可以)
2.其中小哥还给我提了一个意见,在我短期兴趣的计算中,是否可以使用时间队列来做,他曾经看过的一篇YouTube发表的论文中,就有使用时间队列来做短期兴趣的方法,这个我觉得可以学习一下。
~~~~~~~~~~~~分割一下~~~~~~~~~~
这里有个背景要说,
我在投了这个公司以后,收了一份takehome test面试题,是给了一些关于电商购买记录的数据,要给出一个模型,可以识别出电商诈骗的购买记录。
这个东西只给了48小时的时间来完成,所以做的很匆忙,因为这两天有搜狐和好未来的面试,以及华为和美团的笔试23333333。所以完成的其实不是很好,本来以为不会有下文了,没想到周五开学术讨论会的时候接到了HR的电话。
~~~~~~~~~~~~我分割完了~~~~~~~~~~
3.然后小哥开始问了我是如何完成这个任务的。
首先讲了如何进行特征处理,和特征离散化,以及为什么要这么做,
之后说了都使用了什么样的机器学习模型去跑,结果如何,性能如何(使用了逻辑回归,SVM-Liblinear,朴素贝叶斯,kNN,决策树,随机森林,GDBT和xgboost。其中GDBT和xgboost的效果相当,达到了恐怖的99.3%的准确率)。
4.当我们要求准确率很高,但是不在意召回率的时候,可以怎样处理。
我当时有点蒙啊,就说了可以提高对负样本的惩罚。。。小哥提示我,比如xgboost你可以提高阈值啊(哇,这方法好,我好笨。。。这竟然没想到)。
5.继续,那么阈值如何确定呢
可以。。。一点点试试啊
小哥告诉我,这道也是个办法,但是你没办法得到一个特别合适的值啊,告诉我可以用Auc然后找个合适的值(看来这个AUC的用途还要在挖掘一下,这个东西原来还有其他的用途)
6.xgboost,说一下原理,步长如何设定
从GDBT原理讲起,xgboost是其加强版,说了xgboost相比于GDBT的改进与不同,包括基学习器的选择,二阶泰勒展开以及原因,行列抽样,关于树复杂度的正则项,并行实现方法。
步长的话 Python的xgboost 库里面有一个参数可以调整,常用范围为0.01~0.2(还好我下午刚看过这地方。。)
接下来就到了,每次都有的“你还有什么问题么”的环节了。。我问了下公司的规模与环境,推荐相关的部分是具体做什么的,公司产品的具体嵌入方法。
然后小哥还问了我的实习时间,毕业时间,是否已经有offer。
总结一下就是,用过的东西一定要搞清楚,从原理到使用到优缺点到类似方法的对比到调参等细节。
GIO机器学习工程师(实习)二面
这次的二面问的问题都很open,都是一些如何让我的推荐系统可以更好的应用于大数据的实际场景当中去的问题。这次的面试官是该公司的机器学习总监,曾经是多个互联网公司推荐系统的负责人(了解到的有当当、58等)。第一次面对这种大牛还是很紧张的。
首先是一个1分钟的简短的自我介绍。
还是聊项目,说了一下我推荐系统中的创新点,以及系统架构和实现。
然后开始针对我们系统提出一系列的问题:
1.你的用户的兴趣特征有哪些,如何获得和使用这些特征进行推荐?
命名实体、关键字VSM传统向量空间、主题分布。 使用经典的Rocchio方法,对用户兴趣进行建模,分为正向样本和负向样本,对于正向样本(也就是看过的新闻)以一定权重加入到用户兴趣模型中去(这个权重是可以通过我的算法算出一个具体值的);对于负向样本,以一定权重减到用户兴趣模型中去。
在推荐时,对于基于内容的部分,使用用户的兴趣向量与新闻的特征向量,在三个不同层面(主题,实体,关键字)上做余弦相似度,然后以一定的权值加权求和得到用户对于该新闻的兴趣值。
对于协同过滤的部分,使用用户喜好的相似性(计算用户兴趣的余弦相似度,方法同上)和浏览记录的相似性的和来判断用户间的相似程度。使用这二者结合的模式,可以一定程度上降低协同过滤的冷启动现象。
2.你的新闻备选集是什么,这样做是否是要遍历所有新闻来进行匹配呢?
在我的场景下,由于新闻量不是很多,所以备选集就是当天的所有新闻(大概200~300条)。所以目前是逐个进行匹配的。但是这种方法在大数据的场景下是不合理的。所以我对此也有一些方案和想法。首先可以将新闻进行聚类(根据时效性如果推荐的是近两天的新闻,那就每两天的新闻进行一次聚类),这种聚类时分层次的。
1.首先使用主题分布进行聚类,将新闻划分为多个大的簇,这样每个簇都是主题分布比较接近的新闻,称这个大簇为主题簇。
2.然后对于每个簇中,可以使用命名实体和关键词,进行第二次聚类,这样每个主题簇中的小簇就代表了内容相近的新闻。
这样我们在推荐时,可以先匹配主题偏好前k个的主题簇,然后按照偏好比例从主题簇中挑选新闻。
在每个主题簇中,若我们要选择n个新闻,那么我们就可以选择相似度前n的小簇,在每个小簇中选择相似度最高的新闻(或者随机游走也不是不行)。这样就可以减少很大的计算量。
3.那要使用哪种聚类算法呢?
快的话就k-means吧
4.k-means中的k如何确定呢?
一般根据经验来确定一个范围,然后在范围中一个一个试吧。根据每个簇中的聚集程度来判断当前的k值是否合理。
这个回答的不是很好。。。。其实应该这样:
关于k-means的k的确定方法
1.计算所有点到对应的类中心的距离均值,k值越大距离均值就越小,但是随着k的增大,距离均值的变化幅度也会越来越小,就如下图,可以在变化幅度小于某一阈值时,确定该k值为最优解。
5.除了k-means,还可以用什么聚类方法,或者你还熟悉什么聚类方法。如何应用在你的场景中呢?
比较熟悉的还有层次聚类,层次聚类相较于k-means的优点就是不用指定k的个数,但是会比k-means慢一些。
(区别还应该拓展一些)
层次聚类的聚类结果是一个树型结构(如下),那么根据层次聚类的结果就可以直接得到大小簇的关系了,就不需要多次聚类了。
6.那么使用了层次聚类的话,你又如何判断聚成多少类合适呢?
还是根据类内的紧密程度?
Ps:屁,这样一点都不好,是我层次聚类学习的太少了,事实上如上图,层次聚类是一个从下到上合并的过程,每次合并都会有一个合并的距离阈值,我们可以设定一个合理的距离阈值来决定聚为多少类。那么问题又来了,这个阈值如何确定呢?
其实这里的思想倒是又和确定k-means中的k差不多了,如下图,刚开始合并的时候,每次距离的变化都是比较小的,但当我们一次次合并的时候,一般会有一个突变或者变化比较明显的地方,那么我们可以绘制下图根据图中的变化来确定这个阈值为多少比较合理,也就是确定了聚为多少类比较合理。
7.好,那么我还想继续提高推荐的效率,可以怎么做?
可以降维。。
8.不,我要求在不损失准确性的前提下,不可以加机器,单纯的从算法上面解决这个问题。
啊。可以在计算用户兴趣向量与新闻相似度的时候,只保留用户的兴趣部分中与这篇新闻有关的内容,也就是做个交集,然后在计算,可以提高计算效率。
9.还有呢
啊。。在协同过滤的时候需要找到用户的邻居节点,这时候可以离线对用户进行聚类,隔一段时间更新一次,这样在寻找邻居节点的时候只需要,寻找同一个簇内的用户,这样可以节省时间。
10.还有呢
啊。。。(我想我想,想到翻白眼啊)可以在簇内对新闻进行排序。。然后二分搜索这样
11.高维特征你怎么排序呢?
把相似的放一起
12.那也不是排序啊
啊。。。是(翻白眼思考2分钟),抱歉现在没有别的好的想法了。
Ps:其实这时候可以跟前面的层次聚类结合起来,层次聚类的结果的那棵树,就可以当成一颗搜索树,用来搜索最合适的小簇。这是我第二天早上醒来的时候想到的。。。。
13.接下来谈谈之前做的take home test,你这个类、这个类都是干什么的,说一下职能。
实体类结构、数据管理和处理工具、训练和结果
14.我们来分析一下你这个类,其中的构造函数中存在一些问题,有些变量不应该在这里面,因为这些不是使用初始化的入参来构造的。而是你在这里声明并赋值为0的,这样会造成逻辑混乱,可读性差。。balbala。所以是不是应该放在其他位置来维护和初始化比较合理呢。哎呀这个问题好像有些超纲。。没事这个你可以注意一下。
好。。啊 对 。。。啊 我知道了,确实这样不太好。(确实没有注意这方面的问题,平时编代码还是太随便了)
15.你是怎么处理和使用这些所给的特征的。
像不能直接使用的变量处理为对该情景有意义的表现形式。然后离散化。
16.我看到你浏览器类型这个变量,使用if else来判断时那种然后添加0或1的,那么当我的浏览器的种类不确定的情况下,你要怎么处理。
单独维护一个浏览器类型的数组,当有新的就添加一个。所有的实例都参照这个数组来构建浏览器类型的特征值。