《Learning to Rank using Gradient Descent》

簡述:

ranknet就是基於pairwise思想,將NN(神經網路模型)應用於rank排序,用梯度下降的方式優化目標函數交叉熵。

pairwise:

由於rank更注重的每個point前後順序,至於每個point具體得多少分到不是太關注。f(doc1)f(doc2)具體得多少分不太關心,只要f(doc1)>f(doc2),即f(doc1)-f(doc2)>0就好了。doc是以特徵向量方式表示的,所以f(doc1)-f(doc2) = f(doc1-doc2),這樣doc1-doc2就是一個pair。我們的目標就是使f(doc1)盡量大,f(doc2)盡量小,其實不就是 f(doc1-doc2)盡量大么,這就是pairwise的基本思想。

我們只要構造正序pair就好了,因為從信息量的角度看,負向pair表徵的和正向pair一樣,只是方式不同。

sigmoid處理和交叉熵:

用sigmoid函數進行處理,使其取值在(0,1)之間,來表徵doci好於docj的概率。

Pij = exp(f(doc_i)-f(doc_j)) / (1+ exp(f(doc_i)-f(doc_j)))

由於f(doc_i)-f(doc_j)=f(Dij)

Pij = exp{f(Dij)} / (1+ exp{ f(Dij)})

為了使Pij有一個參照標準,我們引入P』ij來表示根據真實已知的概率:i好於j時;P』ij=1,i差於j時,P』ij=0;i和j相等時,P』ij=0.5。

這裡使用交叉熵作為目標函數:

Cij = -Pij*log(Pij)-(1-Pij)log(1-Pij)

由於Pij = exp(f(Dij))/(1+exp(f(Dij)))

Cij = -Pij*f(Dij)+log(1+exp(f(Dij)))

我們的目的就是使損失函數ΣCij最小,我們採用梯度下降的方法。根據梯度下降更新參數的形式更新參數:w[i] = w[i]-gamma * ?C/ ?w[i],gmma為更新步長。

demo:

計算文檔score的函數f,為了簡單不妨先設其為一個線性函數,即

f(x)=w[1]*x[1]+ w[2]*x[2]+...+ w[n]*x[n]+b

code

import sysnimport mathnx = [(2,0,0),(2,1,1),(2,2,2),(0,1,1),(0,2,2),(0,1,1)]nalpha = 0.001 # 步長nm = len(x) # 訓練數據條數nw = [0.1,0.1,0.1] #初始隨機設置權值nloop_max = 10 # 最大迭代次數ncount = 1nwhile count<=loop_max:n print (%d輪:%count)n count += 1n # 遍歷訓練數據集,不斷更新w值n for i in range(m):n sum = w[0]*x[i][0]+w[1]*x[i][1]+w[2]*x[i][2]n w[0] = w[0]+alpha*x[i][0]*(1+2*math.exp(sum))/(1+math.exp(sum))n w[1] = w[1]+alpha*x[i][1]*(1+2*math.exp(sum))/(1+math.exp(sum))n w[2] = w[2]+alpha*x[i][2]*(1+2*math.exp(sum))/(1+math.exp(sum))n print wn

推薦閱讀:

機器學習-異常檢測演算法(三):Principal Component Analysis
logistic regression
通俗講解維特比演算法
機器學習------令人頭疼的正則化項
27個機器學習圖表,幫你作弊一般飛速成長!

TAG:机器学习 | 搜索引擎 |