RankNet

记号

一个查询,里面有若干文档{U_1\dots U_m},对应的特征向量为{x_1\dots x_m},对应的标签为{y_1\dots y_m}(标签有几种表示法,简单的就是"相关"(1)和"不相关"(0)两种,复杂的包括0,1,2,3,4,从"不相关"(0)到"非常相关"(4)共五种标签。)

U_i\rhd U_j表示U_i应该排在U_j前面(例如,在这个查询里U_i的标签是"非常相关",而U_j的标签是不相关),

原理

对一个给定的查询,选定里面的一对URL,U_iU_j,对应的特征为x_ix_j。将他们的特征传给模型,模型分别计算出这两个URL的分数s_i=f(x_i)s_j=f(x_j)。将这两个分数传给一个sigmoid函数,用来学习U_i应该排在U_j前的概率
p_{ij}=p(U_i\rhd U_j)\equiv\frac{1}{1+e^{-\sigma(s_i-s_j)}}
这里的\sigma用来控制sigmoid函数的形状。

我们使用交叉熵函数作为代价函数,设\overline{p_{ij}}是已知U_i应该排在U_j前面的概率,则代价函数表示为
C=-\overline{p_{ij}}\log p_{ij}-(1-\overline{p_{ij}})\log (1-p_{ij})
给定一个查询,设
S_{ij}=\begin{cases} 1 & U_i\rhd U_j\\ 0 & U_i=U_j \\ -1 & U_j\rhd U_i \end{cases}
\overline{p_{ij}}=\frac{1}{2}(1+S_{ij}),将p_{ij}\overline{p_{ij}}带入C得出
C=\frac{1}{2}(1-S_{ij})\sigma (s_i-s_j)+\log(1+e^{-\sigma(s_i-s_j)})
使用一点微积分知识容易求出C关于s_i的偏微分
\frac {\partial C}{\partial{s_i}}=\sigma\big(\frac{1}{2}(1-S_{ij}) -\frac{1}{1+e^{\sigma (s_i-s_j)}}\big)=-\frac {\partial C}{\partial{s_j}}

现在可以使用该梯度来更新模型的权重\omega_k \in R,
\begin{aligned} \omega_k&=\omega_k-\eta\frac{\partial C}{\partial{\omega_k}}\\ &= \omega_k-\eta(\frac{\partial{C}}{\partial{s_i}} \frac {\partial{s_i}} {\partial{\omega_k}}+\frac{\partial{C}}{\partial{s_j}} \frac {\partial{s_j}} {\partial{\omega_k}}) \end{aligned}
其中\eta是正的学习率,一般使用10^{-5}10^{-3}
因为\delta C=\sum_k \frac {\partial{C}} {\partial{\omega_k}}\delta\omega_k=\sum_k \frac{\partial{C}} {\partial{\omega_k}}(-\eta\frac{\partial{C}}{\partial{\omega_k}})<0所以代价函数是减少的。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容