文章目录

  • RankNet学习思路
    • canci
  • 损失函数感悟
  • 排序学习实践---ranknet方法
    • 1 背景
    • 2 排序学习
      • 2.1 point wise过程
      • 2.2 point wise缺点
      • 2.3 pair wise
    • 3 ranknet
      • 3.1 ranknet原理
        • 1)平方损失函数
        • 2)交叉熵
      • 3.2 基于神经网络的ranknet
      • 3.3 ranknet代码实现
      • 3.4 应用
    • 4 小结
    • 参考俩捏
  • 交叉熵损失函数详解
    • 2.交叉熵损失函数的直观理解
    • 3. 交叉熵损失函数的其它形式
    • 参考链接

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∗tf.log(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

参考链接

  • 添加链接描述

RankNet学习思路+损函感悟+\pi \xu 学xi+交叉熵损函详相关推荐

  1. 交叉熵损失和NLL损失的区别

    交叉熵损失和NLL损失之间的区别 总结: 交叉熵 = NLL + SOFTMAX Layer NLL损失 torch.nn.NLLLoss(weight=None, size_average=None ...

  2. 二分类交叉熵损失函数python_【深度学习基础】第二课:softmax分类器和交叉熵损失函数...

    [深度学习基础]系列博客为学习Coursera上吴恩达深度学习课程所做的课程笔记. 本文为原创文章,未经本人允许,禁止转载.转载请注明出处. 1.线性分类 如果我们使用一个线性分类器去进行图像分类该怎 ...

  3. 神经网络的学习(训练):损失函数(均方误差、交叉熵误差)

    1 神经网络学习(训练)步骤: 初始化权值和偏置参数--1 从总训练集抽取一批数据--2 前向传播计算损失.反向传播由损失计算各参数的梯度--3 利用梯度更新参数--4 重复1.2.3 2 神经网络: ...

  4. 【算法】交叉熵损失和KL散度

    参考资料: https://blog.csdn.net/b1055077005/article/details/100152102 https://zhuanlan.zhihu.com/p/35709 ...

  5. 深度学习-Tensorflow2.2-深度学习基础和tf.keras{1}-逻辑回归与交叉熵概述-05

    线性回归预测的是一个连续值,逻辑回归给出的"是"和"否"的答案一个二元分类的问题. sigmoid函数是一个概率分布函数,给定某个输入,它将输出为一个概率值. ...

  6. 神经网络学习中的SoftMax与交叉熵

    简 介: 对于在深度学习中的两个常见的函数SoftMax,交叉熵进行的探讨.在利用paddle平台中的反向求微分进行验证的过程中,发现结果 与数学定义有差别.具体原因还需要之后进行查找. 关键词: 交 ...

  7. 深度学习 交叉熵损失函数

    交叉熵损失函数 前言 交叉熵损失函数 信息量 信息熵 交叉熵 求导过程 应用 扩展 Binary_Crossentropy 均方差损失函数(MSE) 前言 深度学习中的损失函数的选择,需要注意一点是直 ...

  8. 学习关于Bootstrap的感悟和体会

    前言: 这是这两天他的学习关于Bootstrap的感悟和体会 Bootstrap是一个非常受欢迎的前端开发框架,该框架极大的提高前端团队的开发效率. Bootstrap对常见的CSS布局组件和Java ...

  9. 分享一下嵌入式 HarmonyOS 的学习思路

    在我拿到小熊派鸿蒙开发板后,首先按照教程,搭建了开发环境,体验了一下程序是如何进行编译和下载,以及初步了解了一下资料的架构. 关于小熊派鸿蒙开发板的信息,可以戳这里 开始学习 HarmonyOS 嵌入 ...

最新文章

  1. 《C语言及程序设计》实践参考——分数的累加
  2. java二维码生成与解析代码实现
  3. hdu2716水水哈希
  4. Python 面向对象编程:类的创建与初始化、实例属性与方法、类属性与方法
  5. hadoop 实现数据排序
  6. hive 增加表字段语录_Hive改表结构的两个坑|避坑指南
  7. 无人驾驶入门(雷达、定位和高精地图)
  8. settimeout(fn(),0)
  9. python查找一段字符串中是否包含指定字符串
  10. 简单的时间间隔调度任务
  11. Xamarin University-----Xamarin Mobile Certification Exam考试经历(还没写完)
  12. c语言在线电子词典的实验报告,电子词典系统设计实验报告.doc
  13. MATLAB 结构矩阵和单元矩阵
  14. Chrome浏览器通过chrono下载插件设置下载断点续传
  15. DINO Emerging Properties in Self-Supervised Vision Transformers 论文阅读
  16. CTGU·OJ 快乐
  17. 2018c与语言程序设计形成性考核册,最新版中央广播电视大学C语言程序设计形成性考核册及答案.docx...
  18. 张氏矢量化骨骼化细化算法
  19. RK987A 机械键盘快捷键说明---仅供自己使用
  20. [19保研]清华大学交叉信息研究院优秀大学生夏令营

热门文章

  1. zend guard loader php ts,安装Zend Guard Loader说明
  2. gddr6速率_美光GDDR6内存可上20Gbps,带宽堪比HBM 2显存
  3. 甲午海战北洋水师战败的战术分析
  4. 产品经理和项目经理区别与联系
  5. KSO - Vue2的生命周期的个人理解
  6. 【UFUN开发板评测】小巧而不失精致,简单而不失内涵——uFun开发板开箱爆照
  7. R shiny echart4r 常见问题整理
  8. 小程序textarea显示混乱
  9. 分层网络有哪些最新发表的毕业论文呢?
  10. python pdf书籍领取