Embedding方法:从Word2Vec到ltem2Vec

引言

在推荐系统领域,如何有效表征物品特征始终是核心挑战。传统协同过滤方法受限于稀疏性问题,直到2016年微软研究院提出的Item2Vec方法,将自然语言处理中的Word2Vec技术创造性应用于物品表征学习,开启了嵌入学习的新纪元。

Item2vec 脱胎于自然语言处理领域中的 word2vec 技术。word2vec 的核心目标是将文本中的单词转化为低维向量,使得语义相近的单词在向量空间中距离相近。item2vec 则将这一思想拓展到了更广泛的领域,它可以将任何类型的 “item”,如商品、电影、音乐、文章等,映射为低维向量,从而捕捉 item 之间的相似性和关联性。这种向量表示为后续的数据分析、推荐系统、聚类等任务提供了坚实的基础。

Word2vec核心思想

Word2Vec借鉴自然语言处理中的分布式假设:

“出现在相似上下文中的词语具有相似语义”

将这一思想迁移到推荐场景:

  • 用户行为序列视作"句子"
  • 单个物品视为"词语"
  • 共同出现的物品构成"上下文"

通过神经网络学习物品的稠密向量表示,使得相似物品在向量空间中距离相近。

数学原理

1. Skip-Gram模型

给定长度为T的物品序列 w 1 , w 2 , . . . , w T w_1,w_2,...,w_T w1,w2,...,wT,最大化对数似然:

1 T ∑ t = 1 T ∑ − k ≤ j ≤ k , j ≠ 0 log ⁡ p ( w t + j ∣ w t ) \frac{1}{T} \sum_{t=1}^T \sum_{-k \leq j \leq k,j\neq0} \log p(w_{t+j}|w_t) T1t=1Tkjk,j=0logp(wt+jwt)

其中k为上下文窗口大小,条件概率通过softmax计算:

p ( w j ∣ w i ) = exp ⁡ ( u j T v j ) ∑ w = 1 W exp ⁡ ( u i T v k ) p(w_j|w_i) = \frac{\exp(\mathbf{u_j}^T \mathbf{v_j})}{\sum_{w=1}^W \exp(\mathbf{u_i}^T \mathbf{v_k})} p(wjwi)=w=1Wexp(uiTvk)exp(ujTvj)

2. 负采样优化

为了解决计算量过大的问题,负采样技术应运而生。负采样通过将公式中的 Softmax 函数替换为

p ( w j ∣ w i ) = σ ( u j T v i ) ∏ k = 1 N σ ( − u i k T v i ) p(w_j | w_i) = \sigma(u_j^T v_i)\prod_{k = 1}^{N}\sigma(-u_{i_k}^T v_i) p(wjwi)=σ(ujTvi)k=1Nσ(uikTvi)

其中:

其中, σ ( x ) = 1 1 + exp ⁡ ( − x ) \sigma(x) = \frac{1}{1 + \exp(-x)} σ(x)=1+exp(x)1 N N N是每个正样本对应的负样本数量。负样本是从 unigram distribution 中按 3/4 次方采样的。
P n ( w ) = f ( w ) 3 4 ∑ w ′ f ( w ′ ) 3 4 P_n(w) = \frac{f(w)^{\frac{3}{4}}}{\sum_{w'} f(w')^{\frac{3}{4}}} Pn(w)=wf(w)43f(w)43

其中: f ( w ) f(w) f(w)是词 $w $ 在语料库中的频率。

  • f ( w ′ ) f(w') f(w) 是语料库中每个词 w ′ w' w的频率。

实验证明,这种分布显著优于普通的一元分布。负采样大大减少了计算量,因为它只需要考虑少数几个负样本,而不是整个词汇表,使得模型能够在大规模数据上高效训练。

3.处理单词频率不平衡:子采样过程

在实际数据中,单词的频率往往存在很大差异,高频词出现的次数远远多于低频词。这种不平衡会影响模型的学习效果,因为模型可能会过度关注高频词,而忽略低频词的信息。为了解决这个问题,引入了子采样过程。

给定输入单词序列,每个单词w以概率p(discard|w)被丢弃
p ( d i s c a r d ∣ w ) = 1 − p f ( w ) p(discard|w) = 1 -\sqrt{ \frac{p}{f(w)}} p(discardw)=1f(w)p
其中 f ( w ) f(w) fw是单词w的频率,p是预定阈值。

这样的结果是:

1.频率较低的词会被保留,频率较高的词则可能会被丢弃
2.加速了学习过程因为他降低了高频词的数量,降低了计算量,还显著改善了低频词的表示。通过子采样,模型能够更加平衡地学习高频词和低频词的特征,提高了模型的泛化能力。

Item2Vec 原理

在商品推荐中的应用 在传统的基于协同过滤(Collaborative Filtering, CF)的推荐系统中,商品之间的相似性通常是基于用户的行为数据来计算的。Item2Vec 通过将商品的购买历史转换为一个序列,类似于处理自然语言中的单词序列,来学习商品的嵌入表示。通过学习商品间的相似度,推荐系统可以根据用户的购买历史推荐相似的商品。

序列 vs. 集合

与传统的自然语言处理任务不同,Item2Vec 处理的是商品的集合(如用户购买的商品列表),而不是一个有序的商品序列。因此,在训练过程中,Item2Vec 会忽略商品顺序的信息,认为同一集合中的商品是相似的,不考虑其出现的顺序或时间。

训练过程

Item2Vec 的训练过程与 Skip-gram with Negative Sampling 类似,模型的输入是用户的商品购买集合,目标是最大化目标商品与其上下文商品之间的相似度。 对于一个包含 K K K 个商品的集合,Item2Vec 的目标函数可以表示为:
Objective = ∑ i = 1 K ∑ j ≠ i log ⁡ p ( w j ∣ w i ) \text{Objective} = \sum_{i=1}^{K} \sum_{j \neq i} \log p(w_j | w_i) Objective=i=1Kj=ilogp(wjwi)
其中, w i w_i wi w j w_j wj 是同一集合中的商品,模型的目标是学习每一对商品之间的相似度。

负采样和子采样代码实现

负采样

def get_negative_samples(word_prob, k = 5):"""从采样分布中随机抽取负样本:param word_prob: 采样分布, 字典形式, key为单词索引, value为概率:param words: 单词索引列表:param num_samples: 每个单词的负样本数量:return: 负样本列表"""# 从采样分布中随机抽取负样本word = list(word_prob.keys())prob = list(word_prob.values())negative_samples =  np.random.choice(word, size=k, p=prob)return negative_samples

子采样

def get_unigram_distribution(words,power):"""子采样函数:param words: 单词索引列表:param power: 次方:return: 采样分布"""# 使用 collections.Counter 统计每个单词的频率word_counts = collections.Counter(words)total_words = len(words)# 计算每个单词的频率word_freq_power = {word: np.power(count / total_words, power) for word, count in word_counts.items()}word_sum = sum(word_freq_power.values())# 计算每个单词的概率word_prob = {word: freq_power / word_sum for word, freq_power in word_freq_power.items()}return word_prob

结论

Item2Vec 利用 SGNS(Skip-gram with Negative sampling) 方法通过学习商品的嵌入向量来捕捉商品间的相似性,从而提升推荐系统的性能。它将商品看作是无序集合的元素,忽略了顺序信息,但仍然能够有效地通过计算商品间的相似度来进行推荐。在实际应用中,Item2Vec 为商品推荐系统提供了一种高效、准确的解决方案。

Reference

  1. Barkan, O., & Koenigstein, N. (2016). Item2Vec: Neural item embedding for collaborative filtering. Proceedings of the 10th ACM Conference on Recommender Systems (RecSys '16) , 143-150. DOI: 10.1145/2959100.2959167
  2. 王喆《深度学习推荐系统》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/71616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Udp发送和接收数据(python和QT)

服务端代码 (python) import socketdef udp_server(host0.0.0.0, port12345):# 创建一个UDP套接字sock socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 绑定服务器的IP地址和端口号sock.bind((host, port))print(f"UDP服务器已启动,监听端口 {port}...&…

VBA脚本将DeepSeek嵌入Word中教程

一、获取API-Key 目前我们可以直接只用官网的API来实现,申请这一步是关键 也可以直接访问官网的API平台:https://platform.deepseek.com/ ,没注册的注册完登录一下,我们点击到左侧菜单的“APIKeys”按钮,然后点击右侧…

DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署

DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署 **DeepSeek** 是一款专注于深度学习和人工智能的工具或平台,通常与人工智能、机器学习、自动化分析等领域有关。它的主要功能可能包括:深度学习模型搜索&…

网站搭建基本流程

需求分析: 实现网站搭建的过程:首先进行网站的需求性分析 网站可分为前台系统和后台系统,由不同的功能拆分为不同的模块 如下是一个电商网站可以拆分出的模块: 在编写代码前,我们要先对网站进行架构,通过…

解决elementUi el-select 响应式不生效的问题

情况一,字段类型不匹配 考虑option的value值的字段类型是否和api返回的字段类型一致&#xff0c;如果一个为字符串一个为数字类型是无法匹配上的 <template> <div><el-select v-model"value" size"large"style"width: 240px"&…

QT实战-基于QWidget实现的异形tip窗口

本文主要介绍了qt中,基于QWidget实现异形tip窗口的几种实现方式,话不多说,先上图, 1.使用QPainter和QPainterPath实现 代码:tipwnd1.h #ifndef TIPWND1_H #define TIPWND1_H#include <QWidget>class TipWnd1 : public QWidget {Q_OBJECTQ_PROPERTY(QColor my_border…

【C++篇】树影摇曳,旋转无声:探寻AVL树的平衡之道

文章目录 从结构到操作&#xff1a;手撕AVL树的实现一、AVL树介绍1.1 什么是AVL树1.2 平衡因子的定义1.3 平衡的意义1.4 AVL树的操作 二、AVL树的节点结构2.1 节点结构的定义&#xff1a; 三、插入操作3.1 插入操作概述3.2 步骤1&#xff1a;按二叉查找树规则插入节点3.3 步骤2…

么是静态住宅IP,跨境电商为什么需要静态住宅IP

静态住宅IP是指直接分配给一台属于私人住宅网络的设备的固定IP地址&#xff0c;这种地址不会频繁更改。它们作为代理IP&#xff0c;使使用者能够通过这些代理服务器进行网络访问&#xff0c;而对外显示的则是该住宅的IP地址。由于这些IP地址属于真实的住宅或个人&#xff0c;并…

清华大学deepseek教程第四版 DeepSeek+DeepResearch 让科研像聊天一样简单(附下载)

deepseek使用教程系列 DeepSeekDeepResearch 让科研像聊天一样简单(附下载) https://pan.baidu.com/s/1VMgRmCSEzNvhLZQc8mu6iQ?pwd1234 提取码: 1234 或 https://pan.quark.cn/s/f3d4511b790a

leetcode刷题记录(一百零七)——279. 完全平方数

&#xff08;一&#xff09;问题描述 279. 完全平方数 - 力扣&#xff08;LeetCode&#xff09;279. 完全平方数 - 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#x…

软考高级信息系统项目管理师笔记-第2章信息技术发展

第2章 信息技术发展 2.1 信息技术及其发展 1、按表现形态的不同,信息技术可分为硬技术(物化技术)与软技术(非物化技术)。前者指各种信息设备及其功 能,如传感器、服务器、智能手机、通信卫星、笔记本电脑。后者指有关信息获取与处理的各种知识、方法 与技能,如语言文字…

搭建RAG知识库的完整源码实现

搭建RAG知识库的完整源码实现&#xff08;基于Python 3.8&#xff09;&#xff1a; # -*- coding: utf-8 -*- # 文件名&#xff1a;rag_knowledge_base.py # RAG知识库搭建完整源码&#xff08;含中文注释&#xff09;import os import re import shutil import chromadb from…

利用AFE+MCU构建电池管理系统(BMS)

前言 实际BMS项目中&#xff0c;可能会综合考虑成本、可拓展、通信交互等&#xff0c;用AFE&#xff08;模拟前端&#xff09;MCU&#xff08;微控制器&#xff09;实现BMS&#xff08;电池管理系统&#xff09;。 希望看到这篇博客的朋友能指出错误或提供改进建议。 有纰漏…

基于SpringBoot的智慧家政服务平台系统设计与实现的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

什么是 Cloud Studio DeepSeek ; 怎么实现Open WebUI快速体验

什么是 Cloud Studio DeepSeek ;怎么实现Open WebUI快速体验 一、概述 欢迎使用 Cloud Studio DeepSeek 工作空间!我们已为您预装并启动了以下服务,等待加载十几秒即可查看效果: Ollama 服务:支持通过 API 调用 DeepSeek 模型。 AnythingLLM 前端服务:提供交互式聊天界…

【Python 语法】常用 Python 内置函数

reversed() 反转reversed() 的语法反转字符串、列表、元组 sorted() 自定义排序sorted() 语法使用示例1. 基本排序&#xff1a;默认升序排列2. 基本排序&#xff1a;降序排列3. 自定义排序&#xff1a;使用 key 参数4. 自定义排序&#xff1a;按某种规则进行排序5. 排序字典&am…

[网络] 如何开机自动配置静态IP,并自动启动程序

背景&#xff1a; 需要固定ip地址&#xff0c;并且能够自动启动可执行文件。 流程&#xff1a; 1.在/etc/network/interfaces 中添加 auto eth0 iface eth0 inet staticaddress 192.168.1.100netmask 255.255.255.0gateway 192.168.1.1 2.将下面这行代码添加自动启动脚本 …

打造智能聊天体验:前端集成 DeepSeek AI 助你快速上手

DeepSeek AI 聊天助手集成指南 先看完整效果&#xff1a; PixPin_2025-02-19_09-15-59 效果图&#xff1a; 目录 项目概述功能特点环境准备项目结构组件详解 ChatContainerChatInputMessageBubbleTypeWriter 核心代码示例使用指南常见问题 项目概述 基于 Vue 3 TypeScrip…

【C# 数据结构】队列 FIFO

目录 队列的概念FIFO (First-In, First-Out)Queue<T> 的工作原理&#xff1a;示例&#xff1a;解释&#xff1a; 小结&#xff1a; 环形队列1. **FIFO&#xff1f;**2. **环形缓冲队列如何实现FIFO&#xff1f;**关键概念&#xff1a; 3. **环形缓冲队列的工作过程**假设…

Mac 清理缓存,提高内存空间

步骤 1.打开【访达】 2.菜单栏第五个功能【前往】&#xff0c;点击【个人】 3.【command shift J】显示所有文件&#xff0c;打开【资源库】 4.删除【Containers】和【Caches】文件 Containers 文件夹&#xff1a;用于存储每个应用程序的沙盒数据&#xff0c;确保应用程序…