推荐系统学习笔记(四)--基于向量的召回

news/2024/9/23 7:31:18/

离散特征处理

离散特征:性别,国籍,英文单词,物品id,用户id

处理:

建立字典:eg:china = 1

向量化:eg:one-hot /embedding(低维稠密向量)

one-hot--适合低维度

例如:

性别:男,女

字典:男 = 1,女 = 2

one-hot:

        未知[0 , 0]

        男 [1 , 0]

        女 [0 , 1]

one-hot局限:

例1: nlp中,对单词编码,维度上万

例2:推荐系统中,对物品id编码,上亿笔记

类别数量很大时,不用one-hot

embedding(嵌入)

例子:国籍embeddding

参数数量:向量维度 * 类别数量

embedding : 4 * 200 = 800

embedding层:参数以矩阵形式保存,大小为:向量维度 * 类别数量

输入:序号,eg:美国序号为2

输出:向量,eg:美国对应参数矩阵第二列

神经网络关键在于embedding层,对它的优化是一个关键点

one-hot和embedding关系

embedding = one-hot * 参数矩阵

矩阵补充(目前不常用)

训练:

用户embedding层,矩阵A,每个用户对应一列

物品embedding层,矩阵B,每个物品对应一列

内积就是第u个用户对第i个商品兴趣的预估值

训练的目的:学习矩阵A和B

数据集:(用户id a,物品id b,真实兴趣分数 y)------>三元组

优化问题:min\sum (y-<a,b>)^2

行:用户,列:物品,灰色位置表示未曝光,绿色位置代表分数

为什么叫矩阵补充?

大多数都是灰色的,我们并不知道这些用户对这些物品的兴趣,用绿色的部分训练,得到矩阵AB,将灰色部分补全,补全之后就可以给用户做推荐了

工业界不用

缺点:

1.没有利用物品和用户的属性,仅仅使用了id做embedding

2.负样本选取方式不对:

        正样本:曝光后点击

        负样本:曝光后未点击(这是一个“想当然”的设计,其实不对,工业界不采用,后面会详细讲如何构造负样本)

3.训练的方法不好,内积不如余弦相似度,平方损失(回归)不如交叉熵损失(分类)判断正负样本

线上服务

模型存储

训练得到的矩阵AB可能会很大,A--用户,B---物品

矩阵A:

        存到key-value表,key是用户id,value是A的一列。

矩阵B:

        比较复杂

线上服务

1.利用用户id,查找kv表,得到向量a

2.最近邻查找:查找最有可能的k个物品

        物品的embedding向量bi,计算内积<a,bi>,返回最大的k个物品

缺点:时间复杂度正比于物品数量,暴力枚举导致无法实时运转。

如何加速

近似最近邻查找

定义标准:余弦相似度最大(常用) or 内积最大 or 欧氏距离小。

如果系统不支持计算余弦相似度:

将向量归一化(二范数等于1),此时计算出的内积就等于余弦相似度。

方法:

1.数据预处理:分成多个区域,每个区域用一个长度为1的单位向量表示,建立索引,向量作为key,点列表作为value,给定一个向量,就可以返回区域内所有点。

如何划分:余弦相似度---扇形,欧氏距离---多边形

2.线上快速找回:用户向量a,与所有单位索引向量对比,计算相似度,找到最相似的,通过索引,找到所有点,再计算所有点的相似度


http://www.ppmy.cn/news/1463753.html

相关文章

【数据结构】数据结构中的隐藏玩法——栈与队列

前言&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我…

在某云服务器上搭建公网kali linux2.0

前提&#xff1a; 可用的 CVM 实例 挂载一个系统盘之外的盘&#xff0c;安装完成后可卸载&#xff01; 创建实例&#xff0c;安装centos7系统&#xff01; 然后执行fdisk -l看磁盘的情况 在这里我将把镜像写入vdb这块数据盘 非 root 的情况下记得sudo执行以下命令 注意&…

质量评估门户:您AI内容的质量守护者

在当今这个内容饥渴和内容疯狂的世界里&#xff0c;AI驱动的内容创作既是一种流行趋势&#xff0c;有时也是一个改变游戏规则的存在。但强大的能力伴随着巨大的责任……即确保质量的责任。 想象一下&#xff1a;你拥有一个AI[和创意团队]&#xff0c;他们以闪电般的速度输出博…

离线初始化k8s

导出和导入所有必要的 Kubernetes 镜像&#xff0c;使用阿里云作为源。 在能访问外网的机器上拉取镜像 首先&#xff0c;在有外网访问的机器上运行以下命令来拉取所有 Kubernetes v1.29.5 版本需要的镜像&#xff1a; kubeadm config images pull --image-repository regist…

Lambada表示式

Lambada Lambda表达式是Java中的一个重要特性&#xff0c;用于简化函数式编程。它提供了一种更简洁的方式来编写匿名函数&#xff0c;可以被赋值给一个变量&#xff0c;或者作为参数传递给其他方法。 Lambda表达式的基本语法如下&#xff1a; (parameter1, parameter2, .…

Python考试练习题---day1

1.计算2的n次幂结果的后3位 获得用户输入的一个数字N&#xff0c;计算并输出2的N次幂结果的后3位。 【输出样例】-----因为2的10次方等于1024 输入10输出024 ninput() print(str(2**eval(n))[-3:]) 2.分割四位正整数 例1&#xff1a; 编写程序&#xff0c;提示用户从键盘…

UE5 Cesium2 最新使用地理配准子关卡构造全球场景

参考官方最新教程&#xff1a;Building Global Scenes with Georeferenced Sublevels – Cesium 创建持久关卡&#xff08;主关卡&#xff09; 这里一般包含DynamicPawn、CesiumSunSky 和 Cesium World Terrain 全球场景通用的对象。子关卡的创立&#xff0c;官方教程分为了两…

【Unity实战】Mirror/UNET中SyncVar和SyncList需要注意的点

SyncVar和SyncList在Unity开发中喜闻乐见&#xff0c;常用于脚本中字段的同步。 但也时常会出现修改了但是没同步的问题。 故本人根据过往踩的坑进行了以下总结&#xff1a; 1. 尽量不要用它进行类的同步 在Unity中&#xff0c;[SyncVar] 特性通常用于同步Unity网络游戏中基…