搜索引擎(0xFE)--- 用机器学习再谈排序
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
這里沒有標記顏色,可能看起來重點不突出,可以去微信頁面觀看這里
前面說排序的時候已經(jīng)簡單了說了一下排序的方法,包括三部分:相關(guān)性排序,商品本身的屬性排序,個性化排序,無論怎么排,大體上都逃不掉這三項。
最近看到一篇文章有贊搜索引擎實踐(算法篇),中間有一段也說了如何對商品本身的屬性進行排序,感興趣的也可以去看看。
今天,說說如何用機器學習的辦法來進行排序(商品本身的屬性排序)。
說起機器學習,是個很大的話題,我也不是專家,但是至少用機器學習這個工具還是沒什么大問題的,今天我們深入一下機器學習中的邏輯回歸,看看如何用邏輯回歸來進行排序。
我盡量不會用大量公式,盡量用說人話的方式說一下機器學習的邏輯回歸,有些東西我會直接給出結(jié)論,如果感興趣的可以去查資料,好了,開始吧,看我們?nèi)绾螐臄?shù)據(jù)開始,一步一步來做到商品屬性的排序的。
前期準備
-
首先,我們確定一下背景,就是在什么場景下排序,假設我們是一個電商搜索引擎,搜索的數(shù)據(jù)就是各種各樣的商品,并且通過關(guān)鍵字,很多商品的打分是一樣的,無法進行區(qū)分了,所以需要對這些商品進行商品質(zhì)量的排序。
-
然后,我們有哪些數(shù)據(jù)可以用來進行排序呢?為了簡單起見,我們假設我們有最近半年的每個商品的銷量,每個商品的收藏數(shù)量,每個商品的點擊次數(shù)這三種數(shù)據(jù)。
目標
我們有每個商品的銷量,每個商品的收藏數(shù)量,每個商品的點擊次數(shù)這三種數(shù)據(jù),那我們的目標是什么呢?
既然要確定好還是不好,那么必然最后我們會給每個商品打一個分,分越高越好,我們有上面的數(shù)據(jù),那么這個分數(shù)我們這么來定義(沒有使用點擊次數(shù)是為了后面說明比較直觀,把點擊當結(jié)果了)
Score = a1*銷量 + a2*收藏數(shù)量
而我們的目標就是求出a1和a2來(請牢記這一目標),那么以后我們每看到一個商品,用上面這個分數(shù)公式一算,就知道這個商品多少分了。
衡量商品
我們的目標是把好的商品排在前面,怎么樣來衡量一個商品是好還是不好呢?有種直觀的辦法來確定,找一群人,然他們憑直觀感覺搜索結(jié)果中排前面的商品好不好
但這里我們用個簡單的辦法,就是商品被點擊超過10次,我們認為就是好商品,而我們有最近半年的數(shù)據(jù),所以我們知道哪些是好商品,哪些是不好的商品。
開始排序
好了,前期準備工作完成了,目標也確定了,我們開始機器學習的排序了。
我們使用的是邏輯回歸的方法,如果看維基百科的定義的話,不見得你能明白,我們這里就不做名詞解釋了,你把它看成一個方法就行了。
為了簡單起見,我們假設一共只有6個商品,他們的銷量和收藏數(shù)量分別是下表,現(xiàn)在,我們一步一步來完成對目標a1和a2的求解。
| A1 | 50 (1.69) | 20(1.30) |
| A2 | 30(1.47) | 60(1.77) |
| A3 | 500(2.70) | 60(1.77) |
| B1 | 30(1.47) | 5(0.70) |
| B2 | 5(0.70) | 30(1.47) |
| B3 | 1(0) | 10(1.00) |
數(shù)據(jù)歸一化
首先,我們需要做的是將數(shù)據(jù)標準化,也就是歸一化。
為什么要歸一化數(shù)據(jù)呢?比如上表中的A3,他的銷量是500,和其他的所有的商品的銷量差別特別大,所以如果用a1*銷量 + a2*收藏數(shù)量這個公式來計算分數(shù)的話,它就特別占便宜,隨隨便便就排到前面去了,但是有可能這個商品只是搞了一次1折促銷,所以銷量突然變大的,對于這種情況,我們就要通過歸一化把數(shù)據(jù)變得盡量在一個可控的區(qū)間中。
數(shù)據(jù)歸一化的方法比較多,我們這里用個簡單的,直接取log值來歸一化,那么上面的數(shù)據(jù)就被歸一化到一個可控的范圍內(nèi)了,這樣計算分數(shù)的時候一些突變數(shù)據(jù)就很難占便宜了,上面數(shù)據(jù)后面括號里面就是歸一化以后的數(shù),比較靠譜了吧。
sigmoid函數(shù)
到這里,我們目前已經(jīng)擁有了下面的東西
- 上面表的歸一化好的數(shù)據(jù)
- 一個計算分數(shù)的公式:a1*銷量 + a2*收藏數(shù)量
如果商品的好和壞用1和0表示的話,要是我們能將上面的計算分數(shù)的公式和好壞聯(lián)系起來就好了,好了,直接出結(jié)論,真有這樣的函數(shù),這個函數(shù)叫sigmoid函數(shù),他長成這樣:
這個可以將任何東西變成0到1之間的值,我們再取巧一點,在0到1之間如果大于0.5我們就認為是1,小于0.5我們認為是0的話,那么這個算分公式就和好壞聯(lián)系起來了。
根據(jù)已知的條件,我們可以列出下面的東西
A1的好壞值 = sigmoid( a1*A1的銷量 + a2*A1的收藏數(shù)量 ) A2的好壞值 = sigmoid( a1*A2的銷量 + a2*A2的收藏數(shù)量 ) A3的好壞值 = sigmoid( a1*A3的銷量 + a2*A3的收藏數(shù)量 ) B1的好壞值 = sigmoid( a1*B1的銷量 + a2*B1的收藏數(shù)量 ) B2的好壞值 = sigmoid( a1*B2的銷量 + a2*B2的收藏數(shù)量 ) B3的好壞值 = sigmoid( a1*B3的銷量 + a2*B3的收藏數(shù)量 )
好了,到這一步,我們的原始數(shù)據(jù)(銷量,收藏數(shù)量)就和商品的好壞聯(lián)系起來了。
代價函數(shù)
至此,我們已經(jīng)有了以下幾個東西了:
- 上面表的歸一化好的數(shù)據(jù)
- 一個計算分數(shù)的公式:a1*銷量 + a2*收藏數(shù)量
- 一個計算商品好壞的公式:sigmoid( a1*商品銷量 + a2*商品收藏數(shù)量 )
除了上面的,我們還有5個月的真實數(shù)據(jù),也就是我們知道每個商品實際是否真被點擊了,如果我們按照上面衡量商品的方法統(tǒng)計一下,我們就得到了一批真實的好商品和一批真實的壞商品,假設分別是A1,A2,A3和B1,B2,B3,如果我們找到一個a1和a2,用計算商品好壞的公式把所有商品一算,如果和真實的好壞一致,那么a1和a2就是我們要找的目標了。
那么,怎么來描述我們算的結(jié)果和實際結(jié)果的差異呢?這里再引入一個公式(這是最后一個公式),我不做推導了,直接給出來,這個公式長成這樣子,它表示每一個商品預測的好壞和實際的好壞的差異
-log(sigmoid( a1*銷量 + a2*收藏數(shù)量 )) — 實際被點擊的時候 -log(1 - sigmoid( a1*銷量 + a2*收藏數(shù)量 ) ) — 實際沒有被點擊的時候
有了這個公式,那么總體的差異就是每個商品的差異求和除以商品數(shù)了,我們叫代價函數(shù),就是下面這個公式,X1和X2對應的就是銷量和收藏數(shù)量,m表示一共有多少個商品,代價函數(shù)的值越小,那么對應的a1和a2就越接近我們需要的值。
開始求解
至此,我們有了以下內(nèi)容了
- 上面表的歸一化好的數(shù)據(jù)
- 一個計算分數(shù)的公式:a1*銷量 + a2*收藏數(shù)量
- 一個計算商品好壞的公式:sigmoid( a1*商品銷量 + a2*商品收藏數(shù)量 )
- 實際每個商品的好壞A1,A2,A3為好商品,B1,B2,B3為壞商品
- 有一個預測值和實際值比較差異的代價函數(shù),可以用來判斷我們預測得準不準
通過上面這么些步驟,最后,我們通過代價函數(shù)將我們通過銷量和收藏預測出來的點擊和實際的點擊聯(lián)系起來了,終于,我們完成了數(shù)據(jù)到商品實際好壞(是否真的被點擊)的聯(lián)系。
我們通過代價函數(shù)將我們通過銷量和收藏預測出來的點擊和實際的點擊聯(lián)系起來了,終于,我們完成了數(shù)據(jù)到商品實際好壞(是否真的被點擊)的聯(lián)系。
我們通過代價函數(shù)將我們通過銷量和收藏預測出來的點擊和實際的點擊聯(lián)系起來了,終于,我們完成了數(shù)據(jù)到商品實際好壞(是否真的被點擊)的聯(lián)系。
重點說三遍,相當于我們的排序模型已經(jīng)建立起來了
梯度下降
好了,前面鋪墊了這么多,終于要開始求解a1和a2了。
首先,我們有一個函數(shù),這個函數(shù)是上面的最后一個公式,我們再寫一遍
這里的a1和a2是未知數(shù),也就是我們要求的,其他的都是已知的,通過已有的六個月的銷量和收藏的值,以及不斷變化a1和a2,我們可以畫出這個函數(shù)的三維圖像(我直接用mac的畫圖軟件畫的,和數(shù)據(jù)對應不上,但不影響我們的分析),其中X,Y軸分別表示a1和a2,Z軸表示代價函數(shù)的值。
我們要求的a1和a2,實際上就是這個代價函數(shù)的最小值的情況下的a1和a2,也就是圖像中藍色的區(qū)域?qū)腶1和a2值。
通過上面這么多步驟,我們終于把求a1和a2變成了求一個函數(shù)的最小值。
要求解出這個函數(shù)的最小值,接下來就看計算機的了,一個一個去試唄,看看哪兩個參數(shù)下,整體的代價函數(shù)值最小,那么就用這個a1和a2了。呵呵,傻子也看得出來這一個一個試的方法有多傻。
機器學習之所以叫機器學習,那么至少需要體現(xiàn)出來學習的能力吧,怎么體現(xiàn)呢?
一個一個值去試顯然不是機器學習,那叫窮舉,機器學習就是我先試一個值,然后看看和實際結(jié)果有多少差異,然后去調(diào)整這個值,讓新的結(jié)果和實際結(jié)果的差距變小,直到差距變得最小,這樣的過程才叫機器學習。
我們通過一個叫梯度下降的迭代運算,可以得出滿足差異最小化的a1和a2的值,什么叫梯度下降我這里不描述了,感興趣的可以自己去查資料,因為這一部分涉及的數(shù)學內(nèi)容太多,我也描述得不好,大家看著也沒興趣。真正感興趣的可以自己去查查資料。
簡單來說,就是先隨便選一個a1和a2,比如下圖中的紅色部分的白點,計算出一個代價函數(shù)的值,然后通過求代價函數(shù)的偏導數(shù),我們就知道了如何調(diào)整這個a1和a2,那么通過一步一步的迭代循環(huán)(這一步一步的迭代就是機器學習的過程了),沿著白點的路徑,我們就可以走到圖像藍色的部分,從而得到滿足最小值的a1和a2,這樣可以通過有限的幾次迭代運算,而不用求出全部的a1和a2來得到最小值。
現(xiàn)在,通過梯度下降的算法,就求出a1和a2了,我們的目標也就達成了。
使用a1和a2
好了,上面通過一系列步驟,a1和a2已經(jīng)求出來了,使用起來就簡單了,碰到任何一個商品,通過上面的算分公式a1*銷量 + a2*收藏數(shù)量就可以直接算出來這個商品的分數(shù),在排序的時候按這個分數(shù)排序就行了。
評估
有了這個a1和a2,我們?nèi)绾蝸碓u估好還是不好呢?
我們不是有最近半年的數(shù)據(jù)么,那么我們只用其中5個月的數(shù)據(jù)來計算a1和a2,然后用最后一個月的數(shù)據(jù)來測試,把數(shù)據(jù)套入公式中看看預測的點擊和真實的點擊準不準,準確度越高那么就越有效。
當然,最直接的辦法還是上線以后做AB測試,看用戶買單不買單了。
寫在后面的話
這篇文章我盡量沒有特意去寫邏輯回歸的數(shù)學原理,只是用工程化的思想將排序的方式說了一遍,沒有特別涉及數(shù)學原理,如果感興趣我可以再寫一篇來說說邏輯回歸的數(shù)學原理,不過估計看的人少,我也怕我這半桶水寫不好,呵呵。
上面的方法我們使用了銷量和收藏數(shù)據(jù),其實任何一個你認為可能會影響排序的因素都可以用來排序,每一個因素叫一個feature,比如發(fā)貨速度,購物車添加次數(shù),最近7天點擊次數(shù),最近一個月點擊次數(shù),評論數(shù),好評數(shù),圖片數(shù)量,發(fā)貨范圍,甚至包括圖片的好看程度,這樣,求a1和a2就變成了求a1,a2...an了,每個因素對應一個權(quán)重,算法沒有任何區(qū)別。
如果我們有個特別牛逼的專家,他說別算了,也別搞那么多因素,就選銷量和收藏數(shù)量,按我的直覺來,拍一個權(quán)重:a1等于0.9,a2等于0.1,結(jié)果一上線,效果出奇的好,用戶嘩嘩點擊,嘩嘩下單啊。有沒有這種可能呢???當然有!!因為機器學習的方法來計算排序,本質(zhì)上是因為我們有大量的數(shù)據(jù)而人工無法處理,我們覺得這些數(shù)據(jù)有用,于是我們想出來機器學習的辦法來使用這些數(shù)據(jù),最后的可解釋性其實不強,你算出來a1等于0.86,a2等于0.14,為什么呢??看似一步一步都是按照數(shù)學公式來的,但其實不好解釋,就和人的直覺一樣,不見得比專家的直覺強。
好了,本篇結(jié)束,你有什么問題可以留言,但可能我也da不出來,所以不見得會回哦。。
最后,歡迎關(guān)注我:)主要說說搜索,推薦,廣告的架構(gòu)和算法,以及一個搜索引擎的實現(xiàn),有時也會瞎扯一下
轉(zhuǎn)載于:https://my.oschina.net/wuyinghao/blog/674387
總結(jié)
以上是生活随笔為你收集整理的搜索引擎(0xFE)--- 用机器学习再谈排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国内知名互联网公司的开源项目
- 下一篇: 关于解决form表单记录上次保存填写记录