力搜索演算法
A. 優化演算法筆記(十七)萬有引力演算法
(以下描述,均不是學術用語,僅供大家快樂的閱讀)
萬有引力演算法(Gravitational Search Algorithm)是受物體之間的萬有引力啟發而提出的演算法。演算法提出於2008(2009)年,時間不長,不過相關的文章和應用已經相對較多,也有不少的優化改進方案。
萬有引力演算法中,每一個物體的位置代表了一個可行解,而物體的質量則反映了該位置的好壞,位置越好的物體的質量越大,反之物體的質量越小(質量由適應度值計算出,不是直接相等)。物體在解空間中的運動方式由其他物體的引力決定,質量越大的物體,在同等引力作用下的加速度較小,所以單位時間內的速度也相對較小,位移距離較短,反之加速度和速度都較大,位移距離較長。故可以簡單的認為, 位置越優的個體的移動速度越慢,位置越差的個體的移動速度越快 。
萬物之間皆有萬有引力,不過在我們談到萬有引力之時,對象大多是天體,否則萬有引力太小可以忽略不計。所有這次我們的主角就是天體了。(總不可能是蘋果吧)。
每一個天體都有個屬性:位置X,質量M,加速度A,以及速度V,還有適應度值F。
在D維空間內有N個天體,其位置為
,加速度
,速度
,其適應度值為
。
第i個天體的質量則是根據其適應度值計算得出:
其中M為天體的質量在群體重質量中的佔比, 分別表示全局最差天體的適應度值和全局最優個體的適應度值。
可以看出,處於最優位置的天體的質量m為1,最差位置的天體的質量m為0。當最優天體和最差天體重合時,所有的天體的質量m都為1。
由萬有引力計算公式和加速度公式可以計算出當前天體收到另一個天體萬有引力而產生的加速度:
其中R表示第i個天體和第j個天體之間的歐式距離,aij為天體i在第d維上受到天體j的萬有引力而產生的加速度,ai為第i個天體受到的其他所有天體萬有引力的合力產生的加速度。G為萬有引力常量,可以根據一下公式計算:
其中G0為初始值,T為最大迭代次數。
計算出了天體的加速度,則可以根據當前速度計算出下一步天體的運行速度以及天體下一步的位置。
這一步比較簡單與粒子群、蝙蝠等有速度的演算法一致。
可以看出萬有引力演算法的流程異常的簡單,與經典的粒子群差不多。萬有引力演算法也可以看做是一個優化改進版的粒子群,不過設計比較巧妙,引入的質量、加速度等概念,但實現仍然很簡單。萬有引力演算法的效果如何,在下一節將會進行實驗測試。
適應度函數 。
實驗一:
從圖像中可以看出,各個天體都在不停的運動,由於沒有貪心演算法(優於當前值才改變位置)的加入,所以個天體有可能運動到比原先位置更差的地方,而且其收斂速度也比較快。
從結果上看,似乎還不錯,受到最差值的影響均值也相對較大,演算法結果的穩定性不是太好。
直覺上感覺演算法有點問題。根據物理得來的直覺告訴我,這些天體會相互靠近,所以,它們不會集中到它們所構成的凸包之外, 凸實心物體的質心不會跑到該物體的外部 。做個試驗驗證一下,將測試函數的最優解設置到一個極端的位置。
實驗二 : 適應度函數
這次最優解位置在(90,90)處,該點有很大概率出現在初始天體所圍成的凸多邊形外。
從圖像中可以看出,在天體們還沒有到達最優位置附近(右下角的紅點)時,它們已經收斂於一個點,之後則很難再次向最優解靠經。看結果可以發現幾乎每一次實驗的結果都不太好,演算法果然有點問題,不過問題不大。
萬有引力出現這種現象可能有兩個原因: 1.演算法收斂的太快 ,還未對全局進行充分搜索之時就收斂到了一點,收斂到一點後無法再運到。 2.演算法沒有跳出局部最優的策略 ,萬有引力作用下的天體慢慢聚集到奇點,形成黑洞,無法從中逃離。
那接下來,對萬有引力演算法的改進方向也比較明確了:1.減緩其收斂速度,2增加跳出局部最優操作,使之逃離黑洞。
看看萬有引力常量G的函數圖像
將萬有引力常量的值修改為隨著迭代次數線性下降,從圖像中可以看出,效果還是比較明顯的,天體在不斷的運動,最後才收斂、聚集於一起。從實驗結果也可以看出,演算法相對穩定。結合圖像可以知道,改進後,演算法的收斂性下降,但全局搜索能力有較大的提升,演算法的結果不會很差但是精度較低。
將萬有引力常量的下降趨勢放緩為原來的1/4,從圖像中可以看出,演算法的收斂速度非常快,也得到了較好的結果,相比線性下降,演算法有著更好的精度,不足之處則是沒有跳出局部最優的操作,收斂過快也容易陷入局部最優。
不知道原文為什麼讓萬有引力常量G的如此快的降到0,明明降的更慢能有更好的全局搜索能力,但精度可能較差。猜測如果精度較差則在測試函數結果和曲線上比不贏對比的其他演算法,論文沒法發了。其使用的測試函數的最優解大多處於解空間的中心位置附近,即很少出現最優解在天體所圍成的凸多面體之外的情況,而實際問題中我們是無法預知最優解在個位置的。
接下來,將試著為萬有引力演算法加入一點跳出局部最優的操作。
實驗四 :改進,新增以下規則及操作
在實驗二的條件下
1 . 處於最優位置的天體保持自己的位置不動.
2 . 如果某一個天體的運動後的位置優於當前全局最優個體的位置則將當前的最優個體初始化到解空間的隨機位置.(將被自己幹掉的大哥流放)。
3 . 如果觸發了規則2,將所有的個體的以迭代次數重置為0,即計算G=G0*e^(-20t/T)中的t置為0,重新計算萬有引力常量,若未觸發條件2則t=t+1。
從圖像上看,演算法的全局搜索能力有大幅的增強,並且已經集中到了最優解的附近,而且由於加入了「流放」這一跳出局部最優的操作,可以看出,不斷的有新的個體出現在距最優位置較遠的位置。不過收斂速度有所下降,因此局部搜索能力有一定減弱。
看結果,好像沒有實驗三那麼好,但與實驗二相比,已經有了很大的提升,而且有了跳出局部最優的操作,結果也相對穩定。
上述的實驗僅僅是對直觀猜想的實現,如果想以此為改進點,還要對其進行大量的調優,相信會有不錯的結果。
萬有引力演算法根據萬有引力提出,結合了牛頓第二定律,可以說其操作步驟與真實的物理規律非常的貼切。不過就像前文說過,受物理現象啟發而來的優化演算法其性能是未知的,因為它們不具備智能,只有著規律,有規律就會存在弱點,就會有搜索盲區。宇宙那麼大,肯定存在沒有任何天體到達過的空間。
不過由於萬有引力演算法流程簡單,理解方便,其優化方案和能改進的地方相對較多。萬有引力演算法的收斂速度過快,導致其全局搜索能力較弱而局部搜索能力很強,容易陷入局部最優。根據其特點,我們可以降低其收斂速度或者增加跳出局部最優操作,來平衡演算法的各個性能。
參考文獻
Rashedi E , Nezamabadi-Pour H , Saryazdi S . GSA: A Gravitational Search Algorithm[J]. Information Sciences, 2009, 179(13):2232-2248. 提取碼:xhpa
以下指標純屬個人yy,僅供參考
目錄
上一篇 優化演算法筆記(十六)混合蛙跳演算法
下一篇 優化演算法筆記(十八)灰狼演算法
優化演算法matlab實現(十七)萬有引力演算法matlab實現
B. 論淘寶搜索推薦演算法排序機制及2021年搜索的方向。
[寫在前面]淘寶搜索引擎至今反復多次,搜索順序也從最初的統計模型升級到機械學習模型,到2010年為止沒有標簽沒有基礎標簽,隨著計算能力的提高,2010年後開始挖掘用戶的基礎標簽,從3年到2013年開始使用大規模的機械學習和實時特徵
但你有沒有想過為什麼2016-2017年的兩年是各種各樣的黑搜索盛行的一年,為什麼今天幾乎消失了?
最根本的原因是從統計演算法模型到機械學習模型的轉型期。
說白了,這時不收割就沒有收割的機會。因為統計模型即將退出歷史舞台。
因此,各路大神各自擴大了統計模型演算法中的影響因素。統計演算法無論在哪裡,點擊率和坑產都很容易搜索。
那兩年成了中小賣家的狂歡盛宴,很多大神的煙火也是旺盛的。
今天推薦演算法的第三代使用後,加上疫情的影響進行了鮮明的比較,真的很感慨。
淘寶真的沒有流量了嗎?電器商務真的做不到嗎?還是大家的思維沒有改變,停留在2016-2017年的黑搜宴會上不想醒來?
2017年、2018年、2019年是淘寶推薦演算法反復最快的3年,每年的演算法升級都不同,整體上到2019年9月為止統計演算法模型的影響因素還很大,從2019年下半年開始第三代推薦演算法後,全面的真正意義進入了以機械學習模型為中心的推薦演算法時代。
各路大神也無法驗證,加上百年疫情的影響,很多大神的隱蔽布也泄露了。
基本上以統計模型為主,訓練基本上沒有聲音,典型的是坑產游戲。
如果現在還能看到的話,基本上可以判斷他不是在訓練,而是在製作印刷用紙,一定會推薦使用資源,資源是多麼安全。
刷子的生產增加真的沒有效果嗎?不是我以前的文章說:不是不行,而是從坑產的角度思考,而是從改變競爭環境的角度思考,用補充書改變競爭環境,改變場地,有新的天地,任何手段都要為商業本質服務。
正文
概述統計演算法模型時代。
統計模型時代搜索引擎的排名是最原始的排名思考,如果你的類別不錯,關鍵詞比較正確,就能得到很大的流量,當時產品需求少,只要上下架的優化就能使產品上升。
到2016年為止沒有坑產游戲嗎?黑色搜索的效果不好嗎?其實,什麼時候坑產是最核心的機密,誰來教大家,什麼時候教的最多的是類別優化,關鍵詞優化,大部分優化都圍繞關鍵詞,電器商的老人想起了你什麼時候得到關鍵詞的人得到了世界。
有人告訴我做坑產,關鍵詞找到生意也來了。什麼時候知道坑產也沒有人給你刷子,大規模的補充書也出現在黑色搜索盛行的時期。
為什麼關鍵詞者得天下?
搜索關鍵詞是用戶目前意圖最直觀的表達,也是用戶表達意圖最直接的方式。
搜索的用戶購物意圖最強,成交意願也最強,現在搜索也是轉化率最高的流量來源。
統計時代關鍵詞背後直接依賴的是類別商品,只要製作類別和關鍵詞分詞即可,哪個時代最出現的黑馬通常是類別機會、關鍵詞機會、黑科學技術機會。
最基本的是商業本質,什麼時候產品需求少,沒有很多現在的類別,自己找類別,現在想想什麼概念。
記得什麼時候類別錯了,搜索也可以來。如果你的商品點擊反饋好的話,錯誤的類別沒有什麼影響,現在試試吧
搜索類是搜索的基礎。
什麼時候能稱霸,背後有商業邏輯,用戶行為數據好就行了。
但無論如何發展檢索都離不開關鍵詞。例如,上述關鍵詞是用戶表達意圖的最直接的方法,是當前消費者的檢索行為和購買行為發生了根本性的變化。
檢索依然根據消費者的行為數據和關鍵詞來判斷需求,這就是機械學習模型時代。
機器學習模式時代-推薦搜索演算法。
現在的商品體積和消費者購物行為的豐富性,統計演算法不能滿足檢索的本質要求。
所以現在搜索引擎開始發展深度學習模式更精細的建模-推薦搜索演算法,搜索排名更智能。
在此重點討論推薦檢索演算法,
2017、2018、2019是推薦檢索演算法真正意義發展的3年,3年3個系統版本每年更換一次,很多電器商人都不知道頭腦。
推薦檢索演算法和統計演算法模型的最大區別在於,Query的處理能力和演算法有召回機制
簡單表示推薦演算法的程序:
1:對檢索關鍵詞進行分詞、重寫的處理進行類別預判
2:根據用戶信息,即用戶以前的行為數據記錄和預測的性別、年齡、購買力、店鋪喜好、品牌喜好、實時行動作等信息存檔
3:根據檢索用戶信息,根據檢索用戶以前的行為數據檢索引擎和預測的性別、年齡、購買力、店鋪喜好、品牌喜好、實時行動作為等信息存檔3:根據檢索用戶信息的檢索用戶信息
也就是說,在第一關召回階段基本上與統計模型時代的最佳化途徑相同,核心是標題分詞和類別,現在最大的區別是根據用戶信息推薦最佳化,這是標簽和正確人群標簽圖像最佳化的基本意義。
為什麼現在一直在談論標簽,談論人標簽圖像?入池實際上是為了匹配真正的消費者用戶信息,通過直通車測試來判斷人群也是為了通過性別、年齡和購買力來優化匹配真正的消費者。
召回機制:
通過構建子單元索引方式加快商品檢索,不必經歷平台上億級的所有商品。該索引是搜索引擎中的倒置索引,利用倒置索引初始篩選商品的過程是召回階段。
在這個階段,不會進行復雜的計算,主要是根據現在的搜索條件進行商品候選集的快速圈定。
之後再進行粗排和精排,計算的復雜程度越來越高,計算的商品集合逐漸減少,最後完成整個排序過程。
主要召迴路徑分為
1:語言召回
2:向量召回
這些都是商業秘密不方便的說明,有興趣的是學習我們的在線會員課程標簽重疊游戲6是基於語言和向量召回的基礎邏輯實戰落地的課程。
下一階段進入粗行列,粗行列受這些因素的影響:
粗行列作為召回後的第一個門檻,希望用戶體驗以時間低的模型快速排序和篩選商品,第一關系將過濾到不適合本次檢索詞要求的商品
為了實現這個目的,首先要明確影響粗排名得分的因素
1:類別匹配得分和文本匹配得分,
2:商品信息質量(商品發布時間、商品等級、商品等級)
3:商品組合得分
點擊得分
交易得分賣方服務商業得分
在粗排列框架下,系統粗排列演算法根據商品類別的預測得分進行得分
點擊得分交易得分
交易得分賣方服務商業得分粗排列框架下,系統粗排列的大排列
最後是精排,檢索順序的主要目標是高相關性、高個性化的正確性。
每個用戶的喜好不同,系統會根據每個用戶的Query結合用戶信息進行召回。然後通過粗排後,商品數量從萬級下降到千級。
千級商品經排後直接向用戶展示,搜索過程中商品集合的思考和具體變化如下圖
前面的召回、粗排主要解決主題相關性,通過主題相關性的限制,首先縮小商品集合和我們的在線會員課程標簽
精排階段系是真正系統推薦演算法發揮真正威力時,應根據用戶行為反饋迅速進行機械學習建模,判斷用戶真實性、准確性和可持續控制性。
為什麼現在的游戲和黑色技術暫時出現,核心是系統演算法模型機械學習模型,系統分析用戶有問題,不正確,不穩定,維持性差,可以迅速調整。
也就是說,即使發現脆弱性,研究快速有效的方法,系統也會根據你精排階段的用戶行為迅速分析學習建模,發現模型有問題,你的玩法就結束了。
猜機器學習建模的速度有多快?
想玩黑色的東西早點死去吧。
現在使用的檢索順序模型主要是
CTR模型和CVR模型,具體模型過於復雜也不需要深入,但影響這兩種模型的最基本因素是用戶行為數據
真的不能假的,假的也不能假的演算法模型越來越智能化,演算法越來越強,只有回歸商業本質才能真正解決演算法模型背後真正想解決的問題,演算法基於商業邏輯。
2021年搜索向哪個方向發生變化:
2020年電器商人和螞蟻是不平凡的一年。2020年也是螞蟻從神壇上拉下來的元年,現在螞蟻有各種各樣的黑色。
基於中小賣家的走勢無疑是阿里必須正面面對的現實。
如何讓中小賣家迴流或留在平台上,搜索該怎麼做?
檢索一定是基於三方的考慮,買方、賣方和平台本身,現在市場上又開始提倡坑產搜索邏輯,坑產妖風又開始,根據推薦搜索演算法邏輯來談這個問題。
為什麼坑產思維是不死的小強,每次危機都會跳出來。
以統計模型為中心的坑產時代是淘寶從2003年到2015年一直使用的搜索演算法模型長達13年。
同時也是淘寶和中國網分紅的野蠻生長期,統計演算法模式讓太多電商賺錢。除了
之外,十年的奴役思維已經習慣了,在電器商圈,坑產游戲一定有人相信,其他人不一定被認可。所以,我們夾著尾巴發展的原因,時間真的可以證明一切,不用多說,做自己。
習慣性思維加上特殊時期的賺錢蝴蝶效應,使許多電器商人活在歷史的長夢中。正確地說,統計演算法模型的真正廢除是在2019年下半年。
同學說坑產永遠有效,我也這么想。
永遠有效的是起爆模型坑產權重驅動和統計演算法模型中的坑產排名不同。
起爆模型的坑產要素永遠有效,這永遠不會改變。
但是,如何有效地加上這個起爆模型的坑產權重,並不像模仿購物的意圖那麼簡單。
坑產游戲在2021年絕對不行。淘寶不會把現在的演算法系統換成15年前的。
基於三方利益:
購買者體驗
賣方利益
平台的發展
搜索肯定會向高精度和高控制性發展。以標簽為中心的用戶標簽圖像仍然是影響流量精度的基本因素。
必須從標簽的角度考慮和優化種子組的圖像。
通過種子組的圖像向相似人擴展到葉類人,業界喜好人最後向相關人擴展也是擴大流量的過程渠道。
基於推薦搜索演算法邏輯:
精密排列階段演算法更強,精度更高,轉化率更高,持續穩定性更強。
基於中小賣方流通的現狀,優化精排階段並非中小賣方能夠簡單接觸。
推薦演算法從搜索排名階段出現在哪個階段?
個人判斷
一是召回階段
二是粗排階段
上述提到召回階段的演算法簡單復蓋商品為萬級,排序規則也比較簡單,中小賣方在召回階段提高精度尤為重要。
在這個萬級商品庫中,如上下架的權重上升,中小賣方有機會上升到主頁,從子單元的索引召回中尋找機會。
或者根據中小賣方的新產品和中小賣方的店鋪水平進行特別優先搜索推薦,使中小賣方的新產品在低銷售狀態下顯示,可以實現錦囊演算法。
中小賣方有機會搜索主頁,不調用用戶信息直接打開主頁的展示權可能是中小賣方最大的支持。
根據召回階段的用戶行為數據,在粗排階段以比例融入用戶信息,即標簽的影響。
在初始召回階段,類別和分詞權重,看業者主圖場景反應背後的人們反饋,用系統引導,給中小賣方真正參考的流量方向和成交方向。
誰瘋狂地印刷用紙直接關閉黑屋,理解印刷用紙優化競爭場景,從優化人群的角度出發,適當放寬處罰。
通過召回階段,得到的用戶信息會影響粗體結果。在這個階段,用戶信息的權重比例不應該太大,流量卡也不應該太死。
在各檢索順序階段用戶信息,即用戶標簽對檢索的影響權重的問題。
這個方向我的個人觀點是可能的。
C. 談談幾種接觸搜索演算法的比較麻煩告訴我
接觸分析計算主要是接觸界面的搜尋方法和法向接觸力的計算問題.
常見的有主從面法、級域法和一體化演算法 是接觸點的搜索演算法,這三種演算法中,最早的是主從面法,主從面法中從節點不允許穿透主動面,但主動面上的接觸點可以穿透從動面。故主從面法只需搜尋與主動面接觸的節點。主從面法的一個缺陷是——不能處理同一個接觸面內發生的情況,比如子接觸問題。與其他兩種方法相比,主從面法只考慮接觸體中一半的接觸點,所以其計算工作量是比較小的。級域法在相互靠近的接觸塊中尋找接觸對;一體化演算法總是在所有的接觸塊中尋找。由於計算方法的不同,這三種方法計算時間依賴於接觸面的大小。另一方面主從法之所以被廣泛採用,是他的演算法很成熟,編程也容易,而級域法需要從高到低逐級進行,編程就很困難,而且其矢量化運算能力也不行。
所以總體來說,一體化演算法是最優越的。
除了這三種演算法,還有一些別的演算法:比如 BCM,邊界搜索,近些年一些智能演算法也被廣泛引入進來!
除了接觸點的搜尋演算法,常用的接觸力演算法為:拉格朗日乘子法和罰函數法。拉格朗日乘子法不允許接觸邊界的互相穿透,能准確描述幾何約束條件,是一種精確的接觸力演算法,但它與顯式演算法不相容,要求特殊的數值處理。但該方法在每個接觸點處要求引入乘子,導致系統自由度的增加,使計算效率降低。而罰函數法允許接觸面之間的互相穿透,並通過罰子將接觸力大小和接觸邊界的穿透量聯系起來,接觸力正比於邊界穿透量。此方法比較簡單單也適合於顯式演算法,能在系統自由度不增加的情況下進行數值求解。但它影響顯式演算法中的臨界時間步長。罰因子的好壞還影響計算結果的可靠性。
D. 有贊搜索引擎實踐(演算法篇)
註:轉自於 有贊
在上篇文章(工程篇)中, 我們介紹了有贊搜索引擎的基本框架. 搜索引擎主要3個部件構成. 第一, hadoop集群, 用於生成大規模搜索和實時索引; 第二, ElasticSearch集群, 提供分布式搜索方案; 第三, 高級搜索集群, 用於提供商業搜索的特殊功能.
商業電商搜索由於搜索的特殊性, 獨立的ElasticSearch集群是無法滿足多樣的演算法需求的, 我們在搜索的各個部件上都有相應的演算法插件, 用於構建商業電商搜索引擎的演算法體系.
創建索引過程從原始數據創建倒排索引的過程. 這個過程中我們對商品(doc)進行分析, 計算商品靜態分, 並對商品進行相似度計算. 商品的靜態分對於提升搜索引擎質量起到至關重要的作用, 相當於網頁搜索的pagerank, 想像一下如果沒有pagerank演算法, 網頁搜索的質量會有多麼差. 在電商搜索中, 最常見的問題是相似商品太多, 必須在建立索引過程中就對商品間的相似度進行預計算, 以便在檢索過程中進行有效去重.
創建索引的過程如下.
step 1. 計算每個doc的靜態分
step 2. 計算兩兩doc的相似度
step 3. 根據相似度和其他信息對數據進行分庫
step 4. 建立ES索引
檢索過程是搜索引擎接收用戶的query進行一系列處理並返回相關結果的過程. 商業搜索引擎在檢索過程中需要考慮2個因素: 1) 相關性 2) 重要性.
相關性是指返回結果和輸入query是否相關, 這是搜索引擎基本問題之一, 目前常用的演算法有BM25和空間向量模型. 這個兩個演算法ElasticSearch都支持, 一般商業搜索引擎都用BM25演算法. BM25演算法會計算每個doc和query的相關性分, 我們使用Dscore表示.
重要性是指商品被信賴的程度, 我們應該吧最被消費之信賴的商品返回給消費者, 而不是讓消費之自己鑒別. 尤其是在商品充分競爭的電商搜索, 我們必須賦予商品合理的重要性分數, 才能保證搜索結果的優質. 重要性分, 又叫做靜態分, 使用Tscore表示.
搜索引擎最終的排序依據是:
Score = Dscore * Tscore
即綜合考慮靜態分和動態分, 給用戶相關且重要的商品.
檢索的過程大致抽象為如下幾個步驟.
step 1. 對原始query進行query分析
step 2. 在as中根據query分析結果進行query重寫
step 3. 在as中使用重寫後的query檢索es
step 4. 在es查詢過程中根據靜態分和動態分綜合排序
step 5. 在as中吧es返回的結果進行重排
step 6. 返回結果
下面幾章闡述幾個重點技術.
在電商搜索引擎裡面商品的靜態分是有網頁搜索裡面的pagerank同等的價值和重要性, 他們都是doc固有的和查詢query無關的價值度量. pagerank通過doc之間的投票關系進行運算, 相對而言商品的靜態分的因素會更多一些. 商品靜態計算過程和pagerank一樣需要解決如下2個問題: 1. 穩定性. pagerank可以保證一個網站不會因為簡單鏈接堆砌可以線性提升網站的排名. 同樣, 商品靜態分的計算不可以讓商品可以通過增加單一指標線性增加分值(比如刷單對搜索引擎的質量的影響).
2. 區分度. 在保證穩定性的基礎上商品靜態分要有足夠的區分度可以保證同樣搜索的條件下, 排在前面的商品的質量比排在後面的商品的質量高.
我們假設商品的靜態分有3個決定性因素, 1.下單數, 2. 好評率 3. 發貨速度
靜態分我們使用Tsocre表示, Tscore可以寫成如下形式:
Tscore = a * f(下單數) + b * g(好評率) + c * h(發貨速度)
a,b,c是權重參數, 用於平衡各個指標的影響程度. f,g,h是代表函數用於把原始的指標轉化成合理的度量.
首先, 我們需要尋找合理的代表函數.
z-score 標准化方法
這種方法非常不穩定, 假設一個奇異點是第二大的值的1000倍, 會讓大部分的值都集中在0~0.01, 同樣失去了歸一化的目的.
(圖三: log-zscore歸一化)
最後, 選擇合適的權重 經過log-zscore歸一化以後, 我們基本上吧f,g,h的表示的代表函數說明清楚. Tscore = a f(下單數) + b g(好評率) + c*h(發貨速度), 下一步就是確定a,b,c的參數. 一般有兩個方法:
a) 專家法. 根據我們的日常經驗動態調整權重參數;
b) 實驗法. 首先在專家的幫助下賦一個初始值, 然後改變單一變數的方法根據abtest的結果來動態調整參數.
商品標題去重在電商搜索中起到重要作用, 根據數據, 用戶通過搜索頁購買商品80%選擇搜索的前4頁. 商品標題的重復會導致重要的頁面沒有含金量, 極大降低了搜索的購買率.
舉個例子:
Title1:美味/香蕉/包郵/廣東/高州/香蕉/banana//無/催熟劑/
Title2:美味/香蕉/廣東/高州/香蕉//非/粉蕉/包郵/
首先, 進行特徵向量化
這里用到 "bag of word" 技術, 將詞彙表作為空間向量的維度, 標題的每個term的詞頻作為這個feature的值. 以這個例子來說. 這個詞彙的維度為: 美味(0), 香蕉(1), 包郵(2), 廣東(3), 高州(4), banana(5),無(6), 催熟劑(7),非(8),粉蕉(9) 位置: 0,1,2,3,4,5,6,7,8,9
Title1: 1,2,1,1,1,1,1,1,0,0
Title2: 1,2,1,1,1,0,0,0,1,1
這個每個title都用一個固定長度的向量表示.
再次, 計算兩兩相似度
相似度一般是通過計算兩個向量的距離實現的, 不失一般性, 在這里我們使用1-cosine(x,y)來表示兩個向量的距離. 這是一個"All Pair Similarity"的問題, 即需要兩兩比較, 復雜度在O(n^2). 在商品量巨大的時候單機很難處理. 我們給出兩種方法用於實現"All Pair Similarity".
方法一: spark的矩陣運算.
方法二: map-rece 線性方法. 這個方法參考論文"Pairwise Document Similarity in Large Collections with MapRece". 可以實現幾乎線性的時間復雜度. 相對於矩陣運算在大規模(10億以上)pair similarity 運算上面有優勢. 這個方法簡單的描述如下: 首先, 按照倒排索引的計算方式計算每個term到doc的映射. 比如3個doc:
轉化為倒排格式, 這個需要一次mapper rece
然後, 對於value只有一個元素的過濾掉, 對於value大於2個doc的兩兩組合:
最後, 對於輸出進行聚合,value為重復次數和兩個doc乘積開根號的比.
對於2個title1, title2, 如果X(title1, title2) > 0.7 則認為title1和title2相似, 對於相似的兩個doc, 靜態分大的定義為主doc, 靜態分小的定義為輔doc. 主doc和輔doc分別建庫.
區別於網頁搜索(網頁搜索直接將輔doc刪除), 我們將主doc和輔doc分別建庫. 每一次搜索按比例分別搜主庫和輔庫, 並將結果融合返回. 這樣可以保證結果的多樣性.
店鋪去重和商品標題去重有點不同. 由於電商特定場景的需要, 不希望搜索結果一家獨大, 這樣會引發強烈的馬太效應. 店鋪去重不能使用如上的方法進行. 因為上面的方法的主要依據是文本相似, 在結果都相關的前提下, 進行適當的取捨. 但是店鋪去重不是這樣的特性.
設想一下, 如果我們根據店鋪是否相同, 把同一店鋪的商品分到主庫和從庫中, 如下圖所示.
A和B代表不同的店鋪.
在搜索香蕉的時候, 的確可以控制A店鋪結果的數量, 但是在搜索"梨"的時候就錯誤的吧B店鋪的梨排在前面了(假設A:梨比B:梨靜態分高).
搜索的過程每個桶平均分攤搜索任務的25%, 並根據靜態分合並成一頁的結果. 這樣同一保證結果的相對順序, 又達到了店鋪去重的目的.
如上圖所示, 搜索"香蕉", 雖然A店鋪有10個滿足需求的結果, 但是每頁搜索醉倒只有5個結果可以展示.
上面介紹了幾個建立索引過程中幾項技術, 檢索過程中的關鍵技術有很多. 其中最著名的是query分析技術. 我們使用的query分析技術主要包括核心詞識別, 同義詞拓展, 品牌詞識別等等. query分析技術大部分都是NLP研究范圍, 本文就不詳細闡述很多理論知識. 我們重點介紹同義詞拓展技術. 這個技術一般都需要根據自己的商品和和用戶日誌特定訓練, 無法像分詞技術和品牌詞識別一樣有標準的庫可以適用.
同義詞拓展一般是通過分析用戶session日誌獲取. 如果一個用戶輸入"蘋果手機"沒有得到想要的結果, 他接著輸入"iphone", 我們在"蘋果手機"和"iphone"之間創建一個轉移關系. 基於統計, 我們可以把用戶query創建一個相互聯系的權重圖.
用戶輸入query "蘋果手機", 根據query分析, "蘋果手機"有 "iphone" 0.8, "iphone 6" 0.5 兩個同義詞. 0.8和0.5分別表示同義的程度. 我們想要"蘋果手機", "iphone", "iphone 6" 3個query同時輸入, 並且按照同義的程度對不同的query賦予不同的權重. ElasticSearch提供的BoostingQuery可以支持這個需求. 參考: https://www.elastic.co/guide/en/elasticsearch/guide/current/ boosting query_clauses.html
原始query:
改寫後的Query
其他比如核心詞識別, 歧義詞糾正等方法差不多, 本文不做詳細闡述.
商業電商搜索演算法另外兩個重要技術, 一個是類目體系建立和應用,另一個是個性化技術. 這個兩項技術我們還處在探索階段. 類目體系我們主要使用機器學習的方法進行訓練, 個性化主要通過用戶畫像進行Query改寫來實現. 等我們上線有效果在與大家分享.
搜索演算法是一個非常值得一個電商產品持續投入的技術. 一方面我們技術人員要有良好的技術背景, 可以借鑒很多成熟的技術, 避免重復造輪子; 另一方面, 每個產品的搜索都有自身的特點, 需要深入研究產品的特性給出合理的解決方案. 本文給出的案例都具有代表性, 靈活的運用搜索的各方面的技術. 另外, 商業搜索非常看重投入產出比, 我們也需要在眾多方案中尋找捷徑. 比如我們在做類目體系時候, 沒有投入大量的人力資源用於標注數據, 而是通過爬蟲爬取其他電商的數據進行參考, 從而節省了80%的人力資源. 由於筆者能力有限, 文中的方案不保證是問題的最優解, 如果有指正, 請聯系筆者( [email protected] ).
