阿里天貓一面
今天早上突然接到了阿里的面試電話,真的是十分驚悚。。本來想約20分鐘以后(回宿舍準(zhǔn)備好開卷設(shè)備),但是小哥說過一會他要開會,所以就這樣硬著頭皮開始了阿里一面。
先是一個簡單的自我介紹;
1.然后介紹了項目的框架和主要創(chuàng)新點;
2.說一下隨機森林和Adaboost,以及區(qū)別
3.說一下GBDT和Adaboost,以及區(qū)別
4.你用到了LDA說一下LDA的原理
5.對于PCA,會有第一主成分、第二主成分,怎么為什么第一主成分是第一,原因是什么?
6.PCA的主成分是怎么得到的
小哥說他們推薦主要會基于圖片之類的、所以可能深度學(xué)習(xí)用的多
我問小哥那是不是一定要求會深度學(xué)習(xí)才行啊
小哥說,你不會可以學(xué)么。。。這樣我這邊先給你過,看下一面吧,這還有一段時間你先學(xué)學(xué),關(guān)于深度學(xué)習(xí)、圖像、推薦相關(guān)的內(nèi)容。
然后我又確定了一下地點是否在杭州,就結(jié)束了我與阿里的第一次接觸,可以說是很刺激了。
GIO機器學(xué)習(xí)工程師(實習(xí))一面
這次小哥先加了我的微信,然后通過微信語音進(jìn)行了面試。小哥先進(jìn)行了一下自我介紹(話說這還是第一次有面試官作自我介紹給我),并且介紹了一下公司的情況,目前所做的東西是什么。
然后讓我也進(jìn)行了一個簡短的自我介紹,其中簡單涉及了一些學(xué)業(yè)情況,學(xué)術(shù)研究和本科的實習(xí)。
1.還是先問了簡歷里面寫的科研項目,問了其中我所做的幾個創(chuàng)新點,以及哪一部分出了論文,
然后就是我balabala的講了半天的我做的東西,(小哥好像覺得還可以)
2.其中小哥還給我提了一個意見,在我短期興趣的計算中,是否可以使用時間隊列來做,他曾經(jīng)看過的一篇YouTube發(fā)表的論文中,就有使用時間隊列來做短期興趣的方法,這個我覺得可以學(xué)習(xí)一下。
~~~~~~~~~~~~分割一下~~~~~~~~~~
這里有個背景要說,
我在投了這個公司以后,收了一份takehome test面試題,是給了一些關(guān)于電商購買記錄的數(shù)據(jù),要給出一個模型,可以識別出電商詐騙的購買記錄。
這個東西只給了48小時的時間來完成,所以做的很匆忙,因為這兩天有搜狐和好未來的面試,以及華為和美團(tuán)的筆試23333333。所以完成的其實不是很好,本來以為不會有下文了,沒想到周五開學(xué)術(shù)討論會的時候接到了HR的電話。
~~~~~~~~~~~~我分割完了~~~~~~~~~~
3.然后小哥開始問了我是如何完成這個任務(wù)的。
首先講了如何進(jìn)行特征處理,和特征離散化,以及為什么要這么做,
之后說了都使用了什么樣的機器學(xué)習(xí)模型去跑,結(jié)果如何,性能如何(使用了邏輯回歸,SVM-Liblinear,樸素貝葉斯,kNN,決策樹,隨機森林,GDBT和xgboost。其中GDBT和xgboost的效果相當(dāng),達(dá)到了恐怖的99.3%的準(zhǔn)確率)。
4.當(dāng)我們要求準(zhǔn)確率很高,但是不在意召回率的時候,可以怎樣處理。
我當(dāng)時有點蒙啊,就說了可以提高對負(fù)樣本的懲罰。。。小哥提示我,比如xgboost你可以提高閾值啊(哇,這方法好,我好笨。。。這竟然沒想到)。
5.繼續(xù),那么閾值如何確定呢
可以。。。一點點試試啊
小哥告訴我,這道也是個辦法,但是你沒辦法得到一個特別合適的值啊,告訴我可以用Auc然后找個合適的值(看來這個AUC的用途還要在挖掘一下,這個東西原來還有其他的用途)
6.xgboost,說一下原理,步長如何設(shè)定
從GDBT原理講起,xgboost是其加強版,說了xgboost相比于GDBT的改進(jìn)與不同,包括基學(xué)習(xí)器的選擇,二階泰勒展開以及原因,行列抽樣,關(guān)于樹復(fù)雜度的正則項,并行實現(xiàn)方法。
步長的話 Python的xgboost 庫里面有一個參數(shù)可以調(diào)整,常用范圍為0.01~0.2(還好我下午剛看過這地方。。)
接下來就到了,每次都有的“你還有什么問題么”的環(huán)節(jié)了。。我問了下公司的規(guī)模與環(huán)境,推薦相關(guān)的部分是具體做什么的,公司產(chǎn)品的具體嵌入方法。
然后小哥還問了我的實習(xí)時間,畢業(yè)時間,是否已經(jīng)有offer。
總結(jié)一下就是,用過的東西一定要搞清楚,從原理到使用到優(yōu)缺點到類似方法的對比到調(diào)參等細(xì)節(jié)。
GIO機器學(xué)習(xí)工程師(實習(xí))二面
這次的二面問的問題都很open,都是一些如何讓我的推薦系統(tǒng)可以更好的應(yīng)用于大數(shù)據(jù)的實際場景當(dāng)中去的問題。這次的面試官是該公司的機器學(xué)習(xí)總監(jiān),曾經(jīng)是多個互聯(lián)網(wǎng)公司推薦系統(tǒng)的負(fù)責(zé)人(了解到的有當(dāng)當(dāng)、58等)。第一次面對這種大牛還是很緊張的。
首先是一個1分鐘的簡短的自我介紹。
還是聊項目,說了一下我推薦系統(tǒng)中的創(chuàng)新點,以及系統(tǒng)架構(gòu)和實現(xiàn)。
然后開始針對我們系統(tǒng)提出一系列的問題:
1.你的用戶的興趣特征有哪些,如何獲得和使用這些特征進(jìn)行推薦?
命名實體、關(guān)鍵字VSM傳統(tǒng)向量空間、主題分布。 使用經(jīng)典的Rocchio方法,對用戶興趣進(jìn)行建模,分為正向樣本和負(fù)向樣本,對于正向樣本(也就是看過的新聞)以一定權(quán)重加入到用戶興趣模型中去(這個權(quán)重是可以通過我的算法算出一個具體值的);對于負(fù)向樣本,以一定權(quán)重減到用戶興趣模型中去。
在推薦時,對于基于內(nèi)容的部分,使用用戶的興趣向量與新聞的特征向量,在三個不同層面(主題,實體,關(guān)鍵字)上做余弦相似度,然后以一定的權(quán)值加權(quán)求和得到用戶對于該新聞的興趣值。
對于協(xié)同過濾的部分,使用用戶喜好的相似性(計算用戶興趣的余弦相似度,方法同上)和瀏覽記錄的相似性的和來判斷用戶間的相似程度。使用這二者結(jié)合的模式,可以一定程度上降低協(xié)同過濾的冷啟動現(xiàn)象。
2.你的新聞備選集是什么,這樣做是否是要遍歷所有新聞來進(jìn)行匹配呢?
在我的場景下,由于新聞量不是很多,所以備選集就是當(dāng)天的所有新聞(大概200~300條)。所以目前是逐個進(jìn)行匹配的。但是這種方法在大數(shù)據(jù)的場景下是不合理的。所以我對此也有一些方案和想法。首先可以將新聞進(jìn)行聚類(根據(jù)時效性如果推薦的是近兩天的新聞,那就每兩天的新聞進(jìn)行一次聚類),這種聚類時分層次的。
1.首先使用主題分布進(jìn)行聚類,將新聞劃分為多個大的簇,這樣每個簇都是主題分布比較接近的新聞,稱這個大簇為主題簇。
2.然后對于每個簇中,可以使用命名實體和關(guān)鍵詞,進(jìn)行第二次聚類,這樣每個主題簇中的小簇就代表了內(nèi)容相近的新聞。
這樣我們在推薦時,可以先匹配主題偏好前k個的主題簇,然后按照偏好比例從主題簇中挑選新聞。
在每個主題簇中,若我們要選擇n個新聞,那么我們就可以選擇相似度前n的小簇,在每個小簇中選擇相似度最高的新聞(或者隨機游走也不是不行)。這樣就可以減少很大的計算量。
3.那要使用哪種聚類算法呢?
快的話就k-means吧
4.k-means中的k如何確定呢?
一般根據(jù)經(jīng)驗來確定一個范圍,然后在范圍中一個一個試吧。根據(jù)每個簇中的聚集程度來判斷當(dāng)前的k值是否合理。
這個回答的不是很好。。。。其實應(yīng)該這樣:
關(guān)于k-means的k的確定方法
1.計算所有點到對應(yīng)的類中心的距離均值,k值越大距離均值就越小,但是隨著k的增大,距離均值的變化幅度也會越來越小,就如下圖,可以在變化幅度小于某一閾值時,確定該k值為最優(yōu)解。

5.除了k-means,還可以用什么聚類方法,或者你還熟悉什么聚類方法。如何應(yīng)用在你的場景中呢?
比較熟悉的還有層次聚類,層次聚類相較于k-means的優(yōu)點就是不用指定k的個數(shù),但是會比k-means慢一些。
(區(qū)別還應(yīng)該拓展一些)
層次聚類的聚類結(jié)果是一個樹型結(jié)構(gòu)(如下),那么根據(jù)層次聚類的結(jié)果就可以直接得到大小簇的關(guān)系了,就不需要多次聚類了。

6.那么使用了層次聚類的話,你又如何判斷聚成多少類合適呢?
還是根據(jù)類內(nèi)的緊密程度?
Ps:屁,這樣一點都不好,是我層次聚類學(xué)習(xí)的太少了,事實上如上圖,層次聚類是一個從下到上合并的過程,每次合并都會有一個合并的距離閾值,我們可以設(shè)定一個合理的距離閾值來決定聚為多少類。那么問題又來了,這個閾值如何確定呢?
其實這里的思想倒是又和確定k-means中的k差不多了,如下圖,剛開始合并的時候,每次距離的變化都是比較小的,但當(dāng)我們一次次合并的時候,一般會有一個突變或者變化比較明顯的地方,那么我們可以繪制下圖根據(jù)圖中的變化來確定這個閾值為多少比較合理,也就是確定了聚為多少類比較合理。

7.好,那么我還想繼續(xù)提高推薦的效率,可以怎么做?
可以降維。。
8.不,我要求在不損失準(zhǔn)確性的前提下,不可以加機器,單純的從算法上面解決這個問題。
啊??梢栽谟嬎阌脩襞d趣向量與新聞相似度的時候,只保留用戶的興趣部分中與這篇新聞有關(guān)的內(nèi)容,也就是做個交集,然后在計算,可以提高計算效率。
9.還有呢
啊。。在協(xié)同過濾的時候需要找到用戶的鄰居節(jié)點,這時候可以離線對用戶進(jìn)行聚類,隔一段時間更新一次,這樣在尋找鄰居節(jié)點的時候只需要,尋找同一個簇內(nèi)的用戶,這樣可以節(jié)省時間。
10.還有呢
啊。。。(我想我想,想到翻白眼啊)可以在簇內(nèi)對新聞進(jìn)行排序。。然后二分搜索這樣
11.高維特征你怎么排序呢?
把相似的放一起
12.那也不是排序啊
啊。。。是(翻白眼思考2分鐘),抱歉現(xiàn)在沒有別的好的想法了。
Ps:其實這時候可以跟前面的層次聚類結(jié)合起來,層次聚類的結(jié)果的那棵樹,就可以當(dāng)成一顆搜索樹,用來搜索最合適的小簇。這是我第二天早上醒來的時候想到的。。。。
13.接下來談?wù)勚白龅膖ake home test,你這個類、這個類都是干什么的,說一下職能。
實體類結(jié)構(gòu)、數(shù)據(jù)管理和處理工具、訓(xùn)練和結(jié)果
14.我們來分析一下你這個類,其中的構(gòu)造函數(shù)中存在一些問題,有些變量不應(yīng)該在這里面,因為這些不是使用初始化的入?yún)順?gòu)造的。而是你在這里聲明并賦值為0的,這樣會造成邏輯混亂,可讀性差。。balbala。所以是不是應(yīng)該放在其他位置來維護(hù)和初始化比較合理呢。哎呀這個問題好像有些超綱。。沒事這個你可以注意一下。
好。。啊 對 。。。啊 我知道了,確實這樣不太好。(確實沒有注意這方面的問題,平時編代碼還是太隨便了)
15.你是怎么處理和使用這些所給的特征的。
像不能直接使用的變量處理為對該情景有意義的表現(xiàn)形式。然后離散化。
16.我看到你瀏覽器類型這個變量,使用if else來判斷時那種然后添加0或1的,那么當(dāng)我的瀏覽器的種類不確定的情況下,你要怎么處理。
單獨維護(hù)一個瀏覽器類型的數(shù)組,當(dāng)有新的就添加一個。所有的實例都參照這個數(shù)組來構(gòu)建瀏覽器類型的特征值。