1. 排序问题的定义
当商家需要向用户提供多个商品供选择时,往往会遇到这个问题:如何将商品按照一定的顺序呈现给用户,以便使用户能够尽可能地完成购买流程?这就涉及到对商品的排序,用到的模型称排序模型。通常情况下,我们希望排在前面的商品是用户更大概率会点击的商品。
根据不同类型的训练数据,可以将排序模型可以分为三大类:
- 单点标注(point-wise)
- 两两标注(pair wise)
- 列表标注(list wise)
2. 排序模型的几大类别
2.1. point-wise排序模型
输入特征向量集合表示为 { x ( 1 ) , x ( 2 ) , ⋯ , x ( m ) } \{x^{(1)},x^{(2)},\cdots,x^{(m)}\} {x(1),x(2),⋯,x(m)},其中 x ( i ) x^{(i)} x(i)是一个n维向量,各个维度的含义可以是商品的特征例如评分、小量、价格以及用户的特征例如性别、年龄、偏好等,以及用户和商品的关联特征例如是否点击过该商品、是否购买过该商品、对该商品的评价等,以及场景特征如时间、地点等;标签集合为 y ( 1 ) , y ( 2 ) , ⋯ , y ( m ) y^{(1)},y^{(2)},\cdots,y^{(m)} y(1),y(2),⋯,y(m),其中 y ( i ) y^{(i)} y(i)的取值集合是一个实数,例如用户没有点击过的商品为1,用户点击过但是没购买的商品为3,用户点击并购买过的商品为10.
在上述定义的基础上,我, 可以将point-wise排序模型转换为一个分类问题或者回归问题。如果将排序问题转换为分类问题,会导致输出只有预先定义的那几类(例如1,3,10),进而导致很多商品的label一样,无法进一步区分次序。因此,实际中往往将point-wise排序模型转换为回归问题。
point-wise模型的缺点是,没有考虑训练样本之间的相对顺序。例如,在某次点击事件中,用户点击了样本 x ( i ) x^{(i)} x(i),在另一次点击事件中用于点击了样本 x ( j ) x^{(j)} x(j)(且此次事件中存在样本 x ( i ) x^{(i)} x(i)但是用户没有点击)。根据point-wise模型, x ( i ) x^{(i)} x(i)和 x ( j ) x^{(j)} x(j)的标签一样,但这显然是不合理的( x ( j ) x^{(j)} x(j)应该比 x ( i ) x^{(i)} x(i)更靠前才合理)。
2.2. pair-wise排序模型
在pair-wise模型汇总,我们不再从单文档的分类或者回归的角度去看待问题,而是从一个文档对 < d 1 , d 2 > <d_1,d_2> <d1,d2>来看待问题。如果用户点击了 d 1 d_1 d1而没有点击 d 2 d_2 d2,那么说明 d 1 d_1 d1比 d 2 d_2 d2更靠前,可以把 d 1 − d 2 d_1-d_2 d1−d2的label设置为+1, d 2 − d 1 d_2-d_1 d2−d1的label设置为-1,对所有的文档pair进行这样标注,就得到了一系列用于二分类的训练样本。预测时,对测试集里面的所有pair进行分类,便可以得到测试集的一个偏序关系,从而实现排序。SVM Rank、RankNet、FRank、RankBoost等方法都是pair-wise模型。
2.2.1. RankNet
https://www.cnblogs.com/genyuan/p/9788294.html
RankNet提出的时候是为了解决如下搜索排序问题:给定query集合,每个query都对应着一个文档集合,如何对每个query返回排序后的文档集合。
RankNet将输入query的特征向量
x
∈
R
n
x\in R^n
x∈Rn映射为一个实数
f
(
x
)
∈
R
f(x)\in R
f(x)∈R.
给定query下两个文档
U
i
,
U
j
U_i,U_j
Ui,Uj,对应的特征向量分别为
x
i
,
x
j
x_i,x_j
xi,xj,经过RankNet前向计算得到的分数分别为
s
i
=
f
(
x
i
)
,
s
j
=
f
(
x
j
)
s_i=f(x_i),s_j=f(x_j)
si=f(xi),sj=f(xj).记
U
i
⊳
U
j
U_i\rhd U_j
Ui⊳Uj为
U
i
U_i
Ui比
U
j
U_j
Uj更靠前,在RankNet里面用如下公式表示其概率:
P
i
j
≡
P
(
U
i
⊳
U
j
)
=
1
1
+
e
−
σ
(
s
i
−
s
j
)
(2-1)
P_{ij}\equiv P(U_i\rhd U_j)=\frac{1}{1+e^{-\sigma(s_i-s_j)}}\tag{2-1}
Pij≡P(Ui⊳Uj)=1+e−σ(si−sj)1(2-1)
上式其实就是用logistic回归模型来将分数之差映射到0~1之间,来近似拟合概率。
σ
\sigma
σ是可学习的参数
对于特定的query,记文档
U
i
,
U
j
U_i,U_j
Ui,Uj(后文简记为文档i,j)被标记的标签之间的关联:
S
i
j
=
{
1
i
比
j
更
相
关
0
i
和
j
相
关
性
一
致
−
1
j
比
i
更
相
关
(2-2)
S_{ij}=\left\{ \begin{aligned} &1 \ \ i比j更相关\\ &0 \ \ i和j相关性一致\\ -&1 \ \ j比i更相关\\ \end{aligned} \right. \tag{2-2}
Sij=⎩⎪⎨⎪⎧−1 i比j更相关0 i和j相关性一致1 j比i更相关(2-2)
记
P
ˉ
i
j
=
1
2
(
1
+
S
i
j
)
\bar P_{ij}=\frac{1}{2}(1+S_{ij})
Pˉij=21(1+Sij)为真实情况下i比j更相关的概率。
那么可以用交叉熵来作为损失函数:
C
=
−
P
ˉ
i
j
l
o
g
P
i
j
−
(
1
−
P
ˉ
i
j
)
l
o
g
(
1
−
p
i
j
)
=
1
2
(
1
+
S
i
j
)
(
1
−
S
i
j
)
σ
(
s
i
−
s
j
)
+
l
o
g
(
1
+
e
−
σ
(
s
i
−
s
j
)
)
(2-3)
\begin{aligned} C&=-\bar P_{ij}logP_{ij}-(1-\bar P_{ij})log(1-p_{ij})\\ &=\frac{1}{2}(1+S_{ij})(1-S_{ij})\sigma(s_i-s_j)+log(1+e^{-\sigma(s_i-s_j)}) \end{aligned} \tag{2-3}
C=−PˉijlogPij−(1−Pˉij)log(1−pij)=21(1+Sij)(1−Sij)σ(si−sj)+log(1+e−σ(si−sj))(2-3)
不难验证,上述损失函数是具有对称性的,也即
∀
i
,
j
,
i
f
S
i
j
=
1
\forall i,j,if\ S_{ij}=1
∀i,j,if Sij=1也即i比j更相关,有(交换i和j的位置,下式形式对应的将i和j调换就行)
C
=
l
o
g
(
1
+
e
−
σ
(
s
i
−
s
j
)
)
(2-4)
C=log(1+e^{-\sigma(s_i-s_j)})\tag{2-4}
C=log(1+e−σ(si−sj))(2-4)
这个结论对于训练加速会有帮助