文章目录
RankNet学习思路
- 1、ranknet是从概率角度,用pairwise解决排序问题;
- 2、最终学的是一个为搜索结果打分的函
- 函数中有未知参数,RankNet会帮你把参数训练出来
- 这个Scoring Function在这里并不是RankNet中特定的,
- 只要提供的Scoring Function是smooth的,也就是可导的,那么就可以灌入RankNet中求解,
- Scoring Function的设计,并不是RankNet的责任,
- 甚至可以直接选择一个线性函数f(x)=wx;
- 但由于RankNet是用神经网络训练的,而神经网络说到底又是用梯度下降来训练的;
- 3、把样本两两组成一个pair,
- 对一个pair,有两个概率需要定义,
- 预测概率:
- s_i=f(x_i)
- sigmod函数,
- 就是第i个样本排在第j个样本前面的概率,
靠,我的s_i越比s_j大,那么P_{ij}就越靠近1,这个牛逼了,以后学着点。
- 还有一个概率是真实概率
- S_i_j取{0,1,-1},
- 如果i比j相关,则取1,
- 相同取0,
- 不相关取-1;
还真实概率,这不就是标签吗!!
canci
损失函数感悟
-
损失函数必然是样本的函数
- 和模型参数的函数
-
比如softmax里面
-
y_表示标签矩阵哦
- 假设是(None,10)
-
y表示根据样本输入算出的矩阵
- 肯定也是(None,10)
-
那么损失函数就是
y ∗ t f . l o g ( y ) y_*tf.log(y) y∗tf.log(y)
- 但是这个结果是个啥啊?
- (None,10) × \times ×(None,10)
- 这是社么贵啊
排序学习实践—ranknet方法
1 背景
- 通常情况用户看前几页,找不到满意的商品则退出,流单
- 对商品排序使用户能尽快完成购买流程?
- 找几个特征比如评分、销量
- 找个打分函数
- 线性:F=w1评分+w2销量+…,
- 手工调整权重值w并结合abtest来达到排序
- 1)每增一个特征都得调整所有特征权重,并在线上abtest,费时力
- 2)特征较多时(当引入个性化特征时),这种手工调整权重的方式已经不可能完成,很难找到一个较优解
- 3)随着数据不断变化,每隔一段时间都要人工重调节权重。总体来讲人工调参费时费力、效果也差!
- 为避免人工调参,工业界主要排序学习
2 排序学习
- 通过一些自动化的方法完成模型参数训练
- 根据不同类型的训练数据可将排序学习方法分为三类:
- 单点标注(point wise)
- 两两标注
- 列表标注
2.1 point wise过程
- 排序学习最重要的工作:构造训练样本,
- 得一组(V1,V2,V3,…, Y)
- 得到样本后带入相应的机器学习模型即可完成训练
- 特征分以下(业务不同可自行添加特征)
- a)商品(文档)特征如:评分、销量、价格
- b)用户特征:性别、年龄、用户的商品类型偏好
- c)用户-商品关联特征如:
- 是否看过此商品、是否买过此商品、对此商品的历史评价
- d)场景特征如:时间(早中晚)、与商品距离、是否节假日
- 要将这些特征进行归一化,原因参见:
- 找到特征后需定义label。
- 给用户展示过的商品label为1,
- 点击过的商品label为3,
- 购买过的商品label为7。
- 通过对历史日志数据清洗得到成千上万样本
- 得到样本后可将此排序问题转为多分类(样本特征-类别标记)或回归问题(样本特征-连续值)
- 如果转多分类,模型最后输出只能1、3或7,导致在同一类中的文档(比如两个文档输入模型的得到的结果都是7)不好继续排序
- 实际用中往往转为回归问
- 常用LR、GBDT等来解决
2.2 point wise缺点
- point wise直观,易将问题转换为我们所熟知的问题,
- 缺点是完全从单文档的分类角度计算,没有考虑文档之间相对顺序
- 左图红框为某一次用户点击,这时得一条样本i (V1i,V2i,V3i,…,Xni, 3)
- 右图红框为某一次用户点击的事件,获一条样本j (V1j,V2j,V3j,…,Vnj, 3)。
- 按pointwise,认为这两条样本的label都3
- 但第二张图包含更重要的信息,“用户只点了红框酒店,而没点绿框酒店(绿框内的酒店和左图点击酒店一致)”,
- 说明j的label应该比i的label大(样本j排名比样本i更靠前
- 而pointwise没利用这信息
- 如何将文档之间相对顺序信息利用进去?
2.3 pair wise
- pairwise不再从从单文档的分类角度来看待问题,
- 而从一个文档对如<d1,d2>来看待问题
- 用户点击了红框的商品(d1)而没有点击绿框中的商品(d2),那这个时候认为d1的相关性大于d2,可把 d1-d2的label设为+1,d2-d1的label设为 -1
- 按照这种方式,就得到了二元分类器训练所需的样本
- 预测时,只需要对所有pair分类,便可以得到文档集的一个偏序关系,从而实现排序
- Pairwise有很多的实现
- SVM Rank、RankNet、FRank、RankBoost
- 介绍下ranknet的原理以及应用。
3 ranknet
3.1 ranknet原理
- 文档i的特征向量Xi(1i, v2i, v3i, …, vni),
- 文档j的特征向量Xj(v1i, v2j, v3j, …, vnj),
- 找一个打分函数F,
- 设F是线性函数,
- F(Xi)=WXi=w1v1i + w1v2i + … + wnvni,
- w表示权重系数,
- 希望找出这样一个函数F(训练得到这些权重w),
- 当文档X1比X2排名高时,我们希望F(Xi) > F(Xj)。
- 下面需定义损失函数了。
- 定义概率Pij表示Xi比Xj排名高的概率,
- 可设Pij=F(Xi)-F(Xj),这样F(Xi)-F(Xj)越大表示Xi比Xj排名高的概率越大,
- 概率值是在[0,1]区间范围内的,因此需要归一化。
- 参考逻辑斯蒂回归的归一化函数:
- Oi=F(i),Oij=F(i)-F(j),
- 当Oij=0时,Pij=0.5,
- Oij>0时,Pij>0.5,且Oij趋向于无穷大时,Pij=1,
- Oij<0时,Pij<0.5,当Oij趋向于无穷小时,Pij=0。
- 这时候们就可以定义损失函数了。损失函数常用有两种类型:
这特么连标签都没有,搞什么损失函数啊??
1)平方损失函数
- 最常用的损失函数,
- 但现在由于已经做了归一化逻辑映射,使得平方损失函数不再是一个凸函数,这给我们最优化求解造成了比较大的挑战,
- 实际常常使用另一种损失函数—交叉熵。
2)交叉熵
- 非凸函数,要求最小值,常用的梯度下降法或牛顿迭代法往往限于局部最优解
- 交叉熵损失函数是否能满足需求。
- 得到凸损失函数后,就可以使用梯度下降方法求解最优化参数。
- 这么训练最终得到的是线性模型,不能学习特征之间的非线性关系,
- 非线性关系有几种方法:
- 1)一种是对特征进行高维映射,例如svm的核方法;
- 2)树模型;
- 3)带有隐藏层的神经网络。
3.2 基于神经网络的ranknet
- 实际中,ranknet用神经网络方法学习,
- 一般采用的是带有隐层的神经网络。
- 用误差反向传播来训练。
- 输入层的神经元代表了样本的每一个特征,虚线的神经元代表隐藏层,最终输出只有一个神经元。
- 训练思路:
- 1)取一个样本对(Xi, Xj),
- 对Xi带入神经网络进行前向反馈,
- 其次将Xj带入神经网络进行前向反馈,
- 计算差分结果并误差反向传播,
- 接着取下一个样本对。。。
这种方法很直观,缺点收敛速度慢。
3.3 ranknet代码实现
- 开源ranknet实现:
- http://people.cs.umass.edu/~vdang/ranklib.html
3.4 应用
- 样本如下:
- 字段为:
- qid: : : … :
- target就是label,购买=7,点击=3,展示=1;
- qid代表一次排序的标识,feature就是特征,#后面是注释信息。
7 qid:1 1:1 2:1 3:0 4:0.2 5:0 # 1A
3 qid:1 1:0 2:0 3:1 4:0.1 5:1 # 1B
1 qid:1 1:0 2:1 3:0 4:0.4 5:0 # 1C
1 qid:1 1:0 2:0 3:1 4:0.3 5:0 # 1D
1 qid:2 1:0 2:0 3:1 4:0.2 5:0 # 2A
3 qid:2 1:1 2:0 3:1 4:0.4 5:0 # 2B
1 qid:2 1:0 2:0 3:1 4:0.1 5:0 # 2C
1 qid:2 1:0 2:0 3:1 4:0.2 5:0 # 2D
1 qid:3 1:0 2:0 3:1 4:0.1 5:1 # 3A
3 qid:3 1:1 2:1 3:0 4:0.3 5:0 # 3B
7 qid:3 1:1 2:0 3:0 4:0.4 5:1 # 3C
1 qid:3 1:0 2:1 3:1 4:0.5 5:0 # 3D
- 将样本输入到ranknet训练,
- 最终得到如下结果,
- 特征为46个,即输入层中神经元个数为46个,隐藏层只设置了1层,
- 隐藏层神经元个数设置为10个。
- 得到模型结果后,将此模型保存到缓存中。
- 一个线上请求,
- 先提取出各个文档的特征向量(V1, V2, V3, …, Vn),
- 带入此神经网络模型得到各个文档的评分,并按照评分排序。
4 小结
- 本文对排序学习做了一介绍,
- 着重介绍了ranknet的原理以及应用,
- 后面会对其他pair wise方法、list wise方法做探讨
参考俩捏
交叉熵损失函数详解
- 二分类:如逻辑回归、神经网络,标签 [0,1],负和正类
- 模型最后会经一个 Sigmoid ,输出一概率值
- 预测为正的可能性
- s 是模型上一层输出
- Sigmoid 特点:s = 0 ,g(s) = 0.5;s >> 0 , g ≈ 1,s << 0 时,g ≈ 0。
- g(s) 将前一级的线性输出映射到 [0,1] 概率上。
- g(s) 就是交叉熵公式中的模型预测输出 。
- Sigmoid的输出表征了当前样本标签为 1 的概率:
- 当前样本标签为 0 的概率就可以表达成:
- 如果从极大似然性的角度出发,把上面两种情况整合到一起:
- 重点看整合后的概率表达式
- 希望P(y|x)越大越好
- 首先,对P(y|x)引入log,
- 因为log不影响函数本身的单调性
- 希望logP(y|X)越大越好,只要-logP(y|x)越小就行。
- 引入损失函数
- 已推导出单个样本的损失函数,
- 如果是计算N个样本的总的损失函数,只要将N个Loss加起来就可
- 已完整地实现了交叉熵损失函数的推导
2.交叉熵损失函数的直观理解
- 从图形的角度,分析交叉熵函数
- 首先,还是写出单个样本的交叉熵损失函数:
- y=1时
- 横坐标是预测输出,纵坐标是交叉熵损失函数。
- 预测输出越接近真实样本标签1,L越小;
- 预测输出越接近0,L越大。
- y=0时
- 无论真实样本标签y是0还是1,L都表征了预测输出与y的差距。
- 预测输出与y差得越多,L越大,也就是说对当前模型的“惩罚
越大,而且是非线性增大,是一种类似指数增长的级別。 - 这是由Iog本身的特性所決定的。
- 这样的好处是模型会倾向于让预测输出更接近真实样本标签y
3. 交叉熵损失函数的其它形式
- 交叉熵损失函数还有其它形式?
- 没错!
- 我刚才介绍的是一个典型的形式。
- 接下来我将从另一个角度推导新的交叉熵损失函数。
- 标签为 +1 和 -1,
- Sigmoid 如下性质:
- 之前说 y = +1 时,下列成立:
- 如果 y = -1 ,下列成立:
- 整合到一起:
- 同样引入 log 函数,得到:
- 就可以定义相应的损失函数为
- L 就是我要推导的交叉熵损失函数。
- 如果是 N 个样本,其交叉熵损失函数为:
not yet