瀑布流排序中的position偏置消除的實驗

前言

瀑布流排序中,用戶首先看到的是前面的商品,排在前面的商品有天然的優勢,用戶的點擊率會偏高,

我們觀察cpc廣告的某個場景的ctr隨位置的統計衰減圖:


這裏寫圖片描述

圖1: 圖中橫座標是排序位置,縱座標爲該位置一天的ctr

大家都有個共識,實際商品表現出來的ctr和商品實際的點擊質量是有偏差的,這裏的偏差有很大的因素是有展現的位置引起的

如何消除位置偏置

不同的場景要求不一樣,實驗分兩個場景進行

bid* ctr 排序場景

對於同一個位置不同的商品消除的偏置幅度是一樣的:

ctr1beforctr1after=ctr2beforctr2after=...=ctrnbeforctrnafter

加權和類似的rank場景

ctr1beforctr1after=ctr2beforctr2after=...=ctrnbeforctrnafter

結論

  1. 利用固定position=n來 predict廣告的ctr方式部分達到消除position偏置的作用,不過不同的模型和場景必須謹慎選擇n值
  2. 利用獨立position建模,可以起到消除上面n的選擇問題
  3. 加權平均類似的rank場景,bid *ctr 排序,這兩個場景在處理position的時候差別很大

下面我們來看下3個實驗的對比

一.普通的線性模型

ctr=σ(w0pi+wxi+b)

其中wo,w 是線性模型的參數,pi,xi 分別是position和其他的特徵的樣本

假設我們在predict的過程中是使用position=1來消除偏置

那麼

ctri=11+ewxi+b+δ

其中 δ=w0p1 ,然後對於所有predict的樣本b+δ 是常量偏置

對於f(x)=σ(x)
Δy=f(x)Δx
f(x)<0.5 時,倒數 是遞增的,x越大,單位x變化帶來的y變化倍數更大
所以這裏的δ 在ctr的絕對值上面是有放大作用的

看下放大的倍數:

f(x)=y(1y) 

當真實ctr在0附近時,導數值最大,y=0.03 是y=0.02 導數的1.5倍

實驗:
採用線上app search一天的數據,實驗選取線上十幾個點擊反饋類型的特徵, train/validation 的auc 大概在 0.653左右

橫軸:ctr區間,縱軸:商品使用不同的position來predict的個數佔比

這裏寫圖片描述
可以很清晰的看到,position越前面,預測的整體ctr越高

我們在兩個實際的場景來分析它增加的絕對值和倍數:

1. 線性加權和

score=ascoreother+ctr

那麼整體score對 ctr波動的絕對值比較敏感:

橫軸:ctr區間,縱軸:不同position做predict後相對position=40 增加的幅度

這裏寫圖片描述
我們可以看到,高ctr 在postion的bais裏面有正向的收益

2. bid*ctr

這裏考慮的是ctr比例波動的倍數

橫軸:ctr區間,縱軸:不同position做predict後相對position=40 增加的倍數

這裏寫圖片描述
注意, 模型效果:
假設我們不對postion的參數進行正則,讓模型自己學習合適的參數,

position= 1:

所有參數的線性和:
w0pi+wxi+b=1.66156
wxi+b=3.55709219

position的權重和:
w0pi=1.8955

其中w0pi 帶來的效果過大,以至於和其他所有特徵相加可以抗衡

如果稍微對 w0pi 加一個正則,可以看到,波動的幅度明顯降低,效果如下圖

這裏寫圖片描述
position 的處理在不同的場景,n的選擇造成的結果完全是相反的

二. xgboost

線上經驗可以知道,position在ctr預估中重要性排第一,但是模型其實不是獨立學習position單獨的特徵,他們是有交叉的作用

下面看下利用不同position做predict的時候商品ctr下面的分佈

大致的情況是:position=1 比 psotion=20,50的商品整體ctr要高

整體圖:橫軸-ctr, 縱軸-商品佔比,不同的曲線代表利用不同的position 出來的佔比圖

這裏寫圖片描述

頭部ctr的商品圖

這裏寫圖片描述

1. 線性加權和

使用position=1來predict 商品的ctr的時候,對ctr絕對值的增加主要是1和其他位置有區別

這裏寫圖片描述

2. bid*ctr

倍數方面,position=1,5 都是在高ctr區間有優勢的

這裏寫圖片描述
xgboost是一致的,就是對ctr高的商品有優勢

三. position bais 獨立建模

position bais 獨立建模也和我們最終需要怎麼使用這個ctr score有關,假設我們是bid*ctr 排序,我們更傾向於:
score=score(position)ctr
score=sigma(f(pi))σ(wxi+b)

假設ctr 還要和其他的分數進行加權和的處理: a*score1 + ctr
我們傾向於
score=score(position)+ctr
score=sigma(f(pi))+σ(wxi+b)

這裏我們以第一個來做實驗

因爲根據上面的ctr隨位置的指數衰減的圖,我們認爲
f(x)=eax+be

這樣
score(position)=σ(f(pi))
是一個固定的函數,和具體的樣本無關,只是和整體的樣本分佈有關

實驗:
採用線上app search一天的數據,實驗選取線上十幾個點擊反饋類型的特徵, train/validation 的auc 大概在 0.653左右, 兩個auc是持平的

下面是score(position) 的分佈:
注意,雖然在迭代十幾輪之後,auc和loss基本沒有變化不大,但是 bais score的參數一直都是在更新的

這裏寫圖片描述
可以看到這裏得到的postion bais score 隨位置的下拉,衰減的不是很快,圖1中很快的指數級別衰減,很各個位置的商品本身質量有關,畢竟排在前面的廣告ctr一般不低

1. 線性加權和

下圖可以看到,這種建模在這種場景下選擇不同的n是有偏置的


這裏寫圖片描述

2. bid*ctr

這個對於選擇n 進行predict來說,是沒有偏置的,隨便選擇哪個都行

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章