RankNet

简介: RankNet 是一种用于学习排名的机器学习模型,由 Microsoft Research Asia 在 2005 年提出。

RankNet 是一种用于学习排名的机器学习模型,由 Microsoft Research Asia 在 2005 年提出。它的主要目标是学习一个函数,该函数可以将输入的样本按照其重要性或优先级进行排名。RankNet 可以用于各种应用场景,例如信息检索、推荐系统、图像分类等。
RankNet 的基本思想是利用梯度下降法来优化一个基于损失函数的排名目标。在训练过程中,模型会尽可能地减小预测排名与真实排名之间的损失。为了解决梯度消失问题,RankNet 通常使用 Lambda 函数来平衡正负样本的权重。
要使用 RankNet,需要进行以下步骤:

  1. 数据准备:收集并预处理输入数据,为模型提供训练样本。
  2. 构建模型:搭建 RankNet 模型。RankNet 的基本结构包括两个神经网络:一个用于预测样本的得分,另一个用于根据得分对样本进行排序。
  3. 训练模型:利用收集到的数据对模型进行训练,通过优化损失函数(如 Hinge 损失)来学习模型参数。
  4. 评估模型:使用验证集对模型进行评估,根据评估结果调整模型参数以提高性能。
  5. 应用模型:将训练好的模型应用于实际任务,例如信息检索、推荐系统等。
    总之,RankNet 是一种用于学习排名的机器学习模型,可以应用于各种排名相关的任务。通过数据准备、模型构建、训练和评估等步骤,可以利用 RankNet 解决实际问题。



Ch 12: Concept 01
Ranking by neural network
Import the relevant libraries

import tensorflow as tf
import numpy as np
import random

%matplotlib inline
import matplotlib.pyplot as plt
Let's fabricate some data. We'll call get_data() to generate two datasets: data_a and data_b.

We'll use the convention that points in data_a are ranked lower than those in data_b. So we need to learn a ranking function (i.e. utility function) that scores points in data_a lower.

n_features = 2

def get_data():
    data_a = np.random.rand(10, n_features) + 1
    data_b = np.random.rand(10, n_features)

    plt.scatter(data_a[:, 0], data_a[:, 1], c='r', marker='x')
    plt.scatter(data_b[:, 0], data_b[:, 1], c='g', marker='o')
    plt.show()

    return data_a, data_b

def get_data2():
    data_a = np.asarray([[0.1, 0.9], [0.1, 0.8]])
    data_b = np.asarray([[0.4,0.05], [0.45, 0.1]])

    plt.scatter(data_a[:, 0], data_a[:, 1], c='r', marker='x')
    plt.scatter(data_b[:, 0], data_b[:, 1], c='g', marker='o')
    plt.xlim([0, 0.5])
    plt.ylim([0, 1])
    plt.axes().set_aspect('equal')
    plt.show()


    return data_a, data_b

data_a, data_b = get_data()

Now, let's define our ranking model. It'll take in two items (x1 and x2), and return a score (s1 and s2) for each item.

Our model introduces a hyper-parameter called n_hidden to tweak the number of neurons in the hidden layer of the network.

n_hidden = 10
When defining the model, let's organize it into separate scopes. That way, the TensorBoard visualization will look very clean.

with tf.name_scope("input"):
    x1 = tf.placeholder(tf.float32, [None, n_features], name="x1")
    x2 = tf.placeholder(tf.float32, [None, n_features], name="x2")
    dropout_keep_prob = tf.placeholder(tf.float32, name='dropout_prob')


with tf.name_scope("hidden_layer"):
    with tf.name_scope("weights"):
        w1 = tf.Variable(tf.random_normal([n_features, n_hidden]), name="w1")
        tf.summary.histogram("w1", w1)
        b1 = tf.Variable(tf.random_normal([n_hidden]), name="b1")
        tf.summary.histogram("b1", b1)

    with tf.name_scope("output"):
        h1 = tf.nn.dropout(tf.nn.relu(tf.matmul(x1,w1) + b1), keep_prob=dropout_keep_prob)
        tf.summary.histogram("h1", h1)
        h2 = tf.nn.dropout(tf.nn.relu(tf.matmul(x2, w1) + b1), keep_prob=dropout_keep_prob)
        tf.summary.histogram("h2", h2)


with tf.name_scope("output_layer"):
    with tf.name_scope("weights"):
        w2 = tf.Variable(tf.random_normal([n_hidden, 1]), name="w2")
        tf.summary.histogram("w2", w2)
        b2 = tf.Variable(tf.random_normal([1]), name="b2")
        tf.summary.histogram("b2", b2)

    with tf.name_scope("output"):
        s1 = tf.matmul(h1, w2) + b2
        s2 = tf.matmul(h2, w2) + b2
The loss function will involve comparing s1 and s2.

Since we're trying to acheive the inequality Score(x1) < Score(x2), we need the loss function to insinuate s1 < s2.

In other words, the loss function tries to guarantee that s1 - s2 < 0.

with tf.name_scope("loss"):
    s12 = s1 - s2
    s12_flat = tf.reshape(s12, [-1])

    pred = tf.sigmoid(s12)
    lable_p = tf.sigmoid(-tf.ones_like(s12))

    cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=tf.zeros_like(s12_flat), logits=s12_flat + 1)

    loss = tf.reduce_mean(cross_entropy)
    tf.summary.scalar("loss", loss)

with tf.name_scope("train_op"):
    train_op = tf.train.AdamOptimizer(0.001).minimize(loss)
Start the session and prepare peripheral ops.

sess = tf.InteractiveSession()
summary_op = tf.summary.merge_all()
writer = tf.summary.FileWriter("tb_files", sess.graph)
init = tf.global_variables_initializer()
sess.run(init)
Train the model with the training data.

for epoch in range(0, 10000):
    loss_val, _ = sess.run([loss, train_op], feed_dict={x1:data_a, x2:data_b, dropout_keep_prob:0.5})
    if epoch % 100 == 0 :
        summary_result = sess.run(summary_op, feed_dict={x1:data_a, x2:data_b, dropout_keep_prob:1})
        writer.add_summary(summary_result, epoch)
#         print("Epoch {}: Loss {}".format(epoch, loss_val))
Visualize the results on a grid by accumulating a list of points to test.

grid_size = 10
data_test = []
for y in np.linspace(0., 1., num=grid_size):
    for x in np.linspace(0., 1., num=grid_size):
        data_test.append([x, y])
Run the model on all the test points and visualize the utility scores of each point by a color.

def visualize_results(data_test):
    plt.figure()
    scores_test = sess.run(s1, feed_dict={x1:data_test, dropout_keep_prob:1})
    scores_img = np.reshape(scores_test, [grid_size, grid_size])
    plt.imshow(scores_img, origin='lower')
    plt.colorbar()
visualize_results(data_test)
目录
相关文章
|
3月前
|
弹性计算 人工智能 JSON
一键云部署:资源编排 ROS 轻松部署 LLM 应用开发平台 Dify
Dify是一款开源的LLM应用开发平台,融合BaaS和LLMOps理念,助力开发者快速构建生产级AI应用。阿里云的ROS提供IaC自动化部署服务,通过JSON/YAML/Terraform模板轻松部署Dify环境。以下是简化的部署步骤: 1. 登录ROS控制台的Dify部署页面。 2. 配置ECS实例参数。 3. 创建资源栈,完成部署后从输出获取Dify服务地址。 ROS模板定义了VPC、VSwitch、ECS实例等资源,通过ROS控制台创建资源栈实现自动化部署。这种方式高效、稳定,体现了IaC的最佳实践。
542 1
|
3月前
|
机器学习/深度学习 PyTorch 调度
PyTorch进阶:模型保存与加载,以及断点续训技巧
【4月更文挑战第17天】本文介绍了PyTorch中模型的保存与加载,以及断点续训技巧。使用`torch.save`和`torch.load`可保存和加载模型权重和状态字典。保存模型时,可选择仅保存轻量级的状态字典或整个模型对象。加载时,需确保模型结构与保存时一致。断点续训需保存训练状态,包括epoch、batch index、optimizer和scheduler状态。中断后,加载这些状态以恢复训练,节省时间和资源。
|
机器学习/深度学习 资源调度 算法
推荐系统[四]:精排-详解排序算法LTR (Learning to Rank)_ poitwise, pairwise, listwise相关评价指标,超详细知识指南。
推荐系统[四]:精排-详解排序算法LTR (Learning to Rank)_ poitwise, pairwise, listwise相关评价指标,超详细知识指南。
推荐系统[四]:精排-详解排序算法LTR (Learning to Rank)_ poitwise, pairwise, listwise相关评价指标,超详细知识指南。
|
3月前
|
人工智能 供应链 安全
群擎并举,众芯共魂,龙蜥重磅首发下一代操作系统“1+3”能力模型
龙蜥重磅首发下一代操作系统“1+3”能力模型,打造三位一体拥抱智算的国产操作系统。
|
存储 NoSQL 异构计算
业界总结 | BERT的花式玩法(二)
业界总结 | BERT的花式玩法(二)
432 0
业界总结 | BERT的花式玩法(二)
|
机器学习/深度学习 资源调度 算法
推荐系统[三]:粗排算法常用模型汇总(集合选择和精准预估),技术发展历史(向量內积,Wide&Deep等模型)以及前沿技术
推荐可分为以下四个流程,分别是召回、粗排、精排以及重排: 1. 召回是源头,在某种意义上决定着整个推荐的天花板; 2. 粗排是初筛,一般不会上复杂模型; 3. 精排是整个推荐环节的重中之重,在特征和模型上都会做的比较复杂; 4. 重排,一般是做打散或满足业务运营的特定强插需求,同样不会使用复杂模型;
推荐系统[三]:粗排算法常用模型汇总(集合选择和精准预估),技术发展历史(向量內积,Wide&Deep等模型)以及前沿技术
|
测试技术 API C++
超越所有开源模型,击败 Claude、Bard,专门用于编程任务的大模型来了
超越所有开源模型,击败 Claude、Bard,专门用于编程任务的大模型来了
531 0
|
机器学习/深度学习 算法
连载|GBDT如何进行回归和分类
连载|GBDT如何进行回归和分类
|
机器学习/深度学习 自然语言处理 算法
Word2Vec原理以及实战详解
Word2Vec原理以及实战详解
|
机器学习/深度学习 人工智能 数据可视化
重塑自监督学习: DINO 网络如何颠覆视觉特征表示的常规方法
重塑自监督学习: DINO 网络如何颠覆视觉特征表示的常规方法
1551 0