人工智能之推荐系统实战系列(协同过滤,矩阵分解,FM与DeepFM算法)

一.推荐系统介绍和应用

(1)推荐系统通俗解读

推荐系统就是来了就别想走了。例如在大数据时代中京东越买越想买,抖音越刷越是自己喜欢的东西,微博越刷越过瘾。

(2).推荐系统发展简介

1)推荐系统无处不在,它是根据用户的行为决定推荐的内容。用户每天在互联网中都会留下足迹,这样就会越来越多的用户画像。

2)为什么要推荐系统

卖的好的商品就那几种,其它就不管了吗?答案是否定的。80%的销售来自20%的热门商品,要想提高销售效率,需把不好卖的商品推荐出去。

3)推荐系统发展

<1>亚马逊1998年用简单的协同过滤做了推荐系统,能提高30%的销售额。<2>2015年深度学习崛起(有数据喂过来,机器自动来提特征等操作了,不用人为主观来判断了),推荐也随着改变。<3>今天是百花齐放,各大论文层出不穷。

(3).应用领域与多方位评测指标

1)广告都是钱,如地图导航,地图导航上的附近吃,玩,住的广告,单击进去,要收费。

2)不仅只是推荐产品,还可帮助完成决策,例如图模型做的事情太多了,真是万物互联。例如可能认识的好友推荐

3)知识图谱也是做好产品的必备技能,这样图模型才能做得好。

(4)任务流程与挑战概述

1)推荐系统里的常用词

item:商品;embedding:隐向量,用数值能让计算机识别的向量,例如对用户商品评分矩阵的分解;召回:粗略计算要返回的结果;打分:要排名得有一个统一的标准;重排:最终结果排序。

2)推荐系统经典流程

<1>模式是离线+近线+在线(召回+粗排+精排)。

<2>离线通常跑较大模型与算法,先得到当前数据的大致结果。

<3>粗排通常跟用户走,用户做了什么推荐结果也更新

<4>精排需根据业务规则返回结果,例百度中前几名的结果交的广告钱肯定交得更多。

3)推荐系统的难点与挑战

<1>人的标签与画像不再是难点,但人的兴趣等会变,你的推荐结果也要更新吧,这时特征工程也肯定要变才行,所以构建特征工程现在是难点。

<2>冷启动怎么办?例用户与商品冷启动,例用户新进来抖音,抖音不知道它的特征标签,画像等,那抖音推什么给他呢?抖音肯定不会放过每个用户。

(5)常用技术点分析

1)embedding方向:如何更好地表示数据,让计算机更好地读懂数据,肯定不用one-shot(例如一个商品在100个城市中,其中只用一个1表示某个城市,其它99个都是用0表示来编码,这样做就会出现稀疏庞大的矩阵,因为99个0没太多实际意义)。隐向量embedding的方法在推荐中几乎无处不用,例如常见的点击率估计的FM与DEEPFM算法中。

2)向量就是把内容转成计算机能识别的数字,例如一句话当中把每个字都转成不同维度的能让计算机识别的向量来,那一句话就能让计算机理解读懂了。向量是数值,能参与计算与建模,也是我们做特征提取过程中最需要解决的问题。

3)nlp方向:如何基于文本数据来推荐?感觉有点难。文本处理方法较多,例 如LDA,词向量,矩阵分解等。

4)知识图谱方向:2021年以来最火的技术点,肯定要用到推荐系统中。数据越多越能体现知识图谱的强大,万物互联。

5)cv方向:卷积,图卷积,图像与视频数据也是用户行为的体现。卷积不仅应用图像与视频数据中,矩阵数据都可以尝试卷积。

(6)与深度学习的结合

1)深度学习就是end2end的结构,先设计出一个网络,然后输入数据到网络中,最后等输出结果。把深度学习认为把复杂问题简单化的过程。

2)为什么需要深度学习?

宏观:人工特征工程难度大,深度学习可把特征做得更好。

二.推荐系统中常用的协同过滤与矩阵分解

(1)协同过滤与矩阵分解简介

物以类聚,人以群分

1)协同过滤

<1>基于用户的协同过滤算法

<2>基于商品的协同过滤算法

2)矩阵分解

<1>矩阵分解(如何得到用户对所有商品的评价)

<2>矩阵分解中隐式与显式分解情况

(2)基于用户与商品的协同过滤

1)基于用户的协同过滤(实际运用比较少)

用户的协同过滤关键是相似度计算设计好

<1>首先找到相似用户(相似度计算)

<2>属性特征,行为特征等都可以当作计算输入。

<3>例如user1中意1,2,3,4;而user2中意2,3。如果这二个用户计算后相似度较高,那就可把1与4推荐给user2

2)用户的协同过滤的不足

<1>因为用户的数据量是庞大的,构建的矩阵将很稀疏并且计算复杂度也很高。例如商品多,但用户买的商品却极少。又例如用户与商品都比较大时,计算矩阵相似度就很难了。

<2>人是善变的,用户特征也要随时要变

<3>用户冷启动问题

3)商品的协同过滤(实际运用中这个比较常用)

<1>还是要先得到用户与商品的交互数据

<2>若发现物品1,3经常一起出现,我们认为他两相关性较高,那这时user2买了物品2与3,所以可以把物品1也可推荐给user2了。

(3)相似度计算与推荐实例

用户与电影实例:

例如excel中的横向表示用户,纵向表示电影,现在估计出用户5对电影1的打分。首先算出商品1的协同过滤(即电影1与2,3,等等的相似度值);然后取相似度值为前2的商品出来当作加权系数,分别是0.64与0.52;而用户5对相似度值前2的商品做了打分,分别是2与3分;这时就可加权平均估算出用户5对电影1的打分:(0.64*2+0.52*3)/(0.64+0.52)

(4)矩阵分解的目的与效果

例如1亿用户与1000万商品构成的矩阵计算时间是很久的,那现在就需想一个中介来作为桥梁,把这矩阵分解后计算。

矩阵分解是推荐系统中使用最多的方法了。

例如现有数据横向表示歌曲,列向表示用户,当用户听过某首歌曲就对应行列中打上1,否则空白,这时要预测这空白处的值(将听过就1,否则打上0),这个矩阵看上去就是一个很稀疏的矩阵来的。

矩阵分解原理就是:原矩阵假设为m*n的,就如上面的m表示用户,n表示歌曲,那对它预测时可用上面说的协同过滤方法。当然现在是用矩阵分解来做,原理是 m*n的矩阵=m*k的矩阵一乘以k*n的矩阵二,例如矩阵一中k表示用三维的向量表示每个用户的特征,同理矩阵二中k表示用三维的向量表示每个歌曲的特征,这样两边矩阵的规模是一样的(shape值一致)。即前一矩阵的列等以后一矩阵的行就可用矩阵乘法。

(5)矩阵分解中的隐向量

通过上面的矩阵分解原理可知隐向量其实就是特征的高维表达,只不过很难去理解。而最终目的是预测大矩阵中的空白值,我们做法就是给定目标函数,这时可想到用机器学习中的回归等算法,然后对这二个分解后的小矩阵进行优化,最终把大矩阵(m*n)中空白的值补充完整,相当于更新了剩下的向量值。最后还原回大矩阵。

(5)目标函数简介

1)原始目标函数与回归方程很像,最终目的就是优化后的2个小矩阵还原回去后越接近大矩阵越好。小矩阵优化还是用梯度下降,并加上正则惩罚项,防止某些值异常大。

2)对原始目标函数进行改进,因为用户可能对商品打分很低或商品本身就很好的固有属性,所以在原始目标函数中对每一个用户与商品分别加入一个偏置项作为向量的一部分参与计算。

3)公式为:设用户矩阵为X,商品矩阵为Y,R为评分的大矩阵,a为惩罚项系数。则有

min(sum(R-X转置*Y)的平方)+a*(sum(X的平方+sum(Y的平方)),其中sum表示求累加和。可把前一部分的min(sum(R-X转置*Y)的平方)当作回归,后半部分a*(sum(X的平方)+sum(Y的平方))当作正则化,而正则化一般通用格式就是a*(矩阵的平方)。这里的平方是指向量相乘,不是某个貝体值。

(6)隐式情况分析

1)上面说的用户直接对歌曲打分并构建出向量特征的情形是属于显式情况;而通常收集的数据是用户的行为,没那么直接的,例如观看的时间,点击次数等指标,像这种就是属于隐式情况。

2)这种隐式数据怎么求解呢?

<1>首先定义个置信度,例置信度公式为C=1+k*X,其中X是单击次数,k是置信度系数,1是默认常数表示置信度默认值(即没点击商品,C都是为1)。这公式告式告式我们单击次数越多,置信度越大。置信度值Y越大越要向用户推荐商品。

<2>重新定义评分,规则是有点击(不管点击次数是多少)的就设为1,否则为0,设评分值为P。这里点击次数越多为什么评分越高呢?因为它公式中还有一个置信值来控制。虽然没有评分,但这里自定义出一个评分出来。最后得到隐式情况的最新优化目标的公式为:

G(X,Y)=(sum(C)*((P-X转置*Y)的平方))+a*(sum(X的平方+sum(Y的平方)),其中C表示置信度值,其它与显式中说明的一样。

<3>从上面隐式这个公式可知置信度值C越大,则预测准备点,否则它的损失值就越大了。

<4>隐式公式求解:也是交替使用最小二乘法来求解,固定Y优化X,再固定X优化Y。

六.点击率估计FM与DeepFM算法

(1)CTR(点击通过率:即用户点这个广告的概率)估计与其经典方法概述

人家认为深度学习的逻辑回归或线性神经网络或树模型都可做这种二分类问题,因为输入就是一个广告矩阵数据,但实际上没那么简单,用户是否点击广告与多个因素和环境有关的,所以将用FM与DeepFM算法来搞,FM与DeepFM算法是要解决特征工程中的特征间的组合。

(2)二项式特征的作用与挑战

1)特征情况:特征维度高,主要还涉及很多离散型的特征,通常都是通过one-shot来处理,所以稀疏性高。如果还考虑特征间的组合,这样计算起来是相当吓人的。

2)如何解决高维并且非常稀疏的特征?

<1>我们知道最终是解决特征间组合带来的问题,这是直接用二阶多项式来解决。二阶多项式的公式:Y(X)=W0+sum(Wi*Xi)+sumsum(Wij*Xi*Xj)

其中Wi,Wij都表示权重值,sum是指累加和。其中前部分W0+sum(Wi*Xi)是线性模型(其中W0当作是偏置项),即W0+sum(Wi*Xi)表示的是一阶特征,而后面的sumsum(Wij*Xi*Xj)是二阶部分。我们最终目的是算出权重参数值来,对于这个公式求解,你也许认为和一阶类似直接用梯度下降(偏导)来算,但是这真的会没问题吗?像Xi*Xj这二个稀疏矩阵(好多为0)相乘后大概率会为0,那这样用梯度下梯来算就没意义了。所以用以前这种直接用梯度下降来算是有问题的。而且sumsum是相乘的(累加后再相乘),如果维度很大时,计算也会很恐怖的。

(3)二阶公式推导与化简

(4)FM算法解析

1)上面公式二阶部分的Wij可用两个隐向量内积表示,向量是可由多少个维度表示的。设Wij=<Vi,Vj>,其中Vi与Vj是二个隐向量,它的计算主要是对二阶部分做内积展开,合并同类项与合并成平方项等操作,其实FM是借用隐向量来求解权重值。

2)原公式中的二项式计算的时间复杂度是O(n的平方),现在只需求kn(其中n是指隐向量个数,k是维度,维度值通常不大,例k=4),就好像大矩阵mn=(小矩阵mk)*(小矩阵kn)。那这些隐向量V又怎么表示出来,感觉还要进行预训练,很麻烦一样噢,解决方法就直接用升级版本DeepFM。

3)特征间组合较多时,自然会想到好兄弟:神经网络。因为可把神经网络想像成特征提取器,当特征庞大到无法人为处理时就用神经网络给我们来做吧。

(5)DeepFM整体架构解读

1)FM融合到神经网络中

<1>不管用啥算法,但凡用深度学习做,都更简单了。

<2>整体架构:FM+DNN(即隐藏层,全连接),最后在(FM输出结果+DNN输出结果)上加多一个sigmoid输出概率结果

<3>embedding是FM的重点,它不但是输入进行embedding,权重值也是进行embedding

<4>还是需要进行特征组合的

(6)输入层所需数据样例

输入的一条样本假设有7个特征(用field表示),每个特征由向量组成,向量又可以是大于等于1维的向量。例如由男生/女生;哈尔滨/沈阳/长春;打篮球/不打篮球这7个特征组成,当取男生,哈尔滨,打篮球时对应的索引值是0,2,5。这三个索引对应的数据值假设均为1,其余四个为0,这里是指取这些特征就用1表示。在做embedding时,传入的通常为索引值,而不是实际数据。

(7)embedding层的作用与总结

1)其实是设计多组权重参数

2)其中包括了一阶与二阶的

3)权重参数就是embedding

七.DeepFM算法实战

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

2.11 sqlite3数据库【数据库的相关操作指令、函数】

练习&#xff1a; 将 epoll 服务器 客户端拿来用 客户端&#xff1a;写一个界面&#xff0c;里面有注册登录 服务器&#xff1a;处理注册和登录逻辑&#xff0c;注册的话将注册的账号密码写入数据库&#xff0c;登录的话查询数据库中是否存在账号&#xff0c;并验证密码是否正确…

Python(十九)实现各大跨境船公司物流查询数据处理优化

一、前言 之前已经实现了常用 跨境物流船司 基础信息查询功能&#xff0c;如下所示 实现各大跨境船公司[COSCO/ZIM/MSK/MSC/ONE/PIL]的物流信息查询&#xff1a;https://blog.csdn.net/Makasa/article/details/145484999?spm1001.2014.3001.5501 然后本章在其基础上做了一些…

CentOS开机自启动服务内容设置

CentOS开机自启动服务内容设置 1. 开机后自动配置时钟同步2. 开机自启动服务脚本3. 配置开机自动添加路由 1. 开机后自动配置时钟同步 # cat /etc/rc.local /usr/sbin/ntpdate pool.ntp.org >> /var/log/ntpdate.log需要设置/etc/rc.local的一个权限&#xff1a; # ll …

基于微信小程序的博物馆预约系统的设计与实现

hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生…

深度学习框架TensorFlow怎么用?

大家好呀&#xff0c;以下是使用 TensorFlow 的详细步骤&#xff0c;从安装到构建和训练模型&#xff1a; 一、安装 TensorFlow 安装 Python&#xff1a;TensorFlow 基于 Python&#xff0c;确保已安装 Python&#xff08;推荐 Python 3.8 及以上版本&#xff09;。可通过 Pyt…

机器学习 - 特征学习(表示学习)

为了提高机器学习算法的能力&#xff0c;我们需要抽取有效、稳定的特征。 传统的特征提取是通过人工方式进行的&#xff0c;需要大量的人工和专家知识。一个成功的机器学习系统通常需要尝试大量的特征&#xff0c;称为特征工程(Feature Engineering).但即使这样&#xff0c;人…

【pytest】获取所有用例名称并存于数据库

数据库操作包&#xff0c;引用前面创建的py文件&#xff0c;【sqlite】python操作sqlite3&#xff08;含测试&#xff09; #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2025-02-11 8:45 # Author : duxiaowei # File : get_filename.py # Software: 这个文…

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(四级)

青少年软件编程&#xff08;Python&#xff09;等级考试试卷&#xff08;四级&#xff09; 一、单选题(共25题&#xff0c;共60分) 1.以下有关位置实参和关键字实参的表述中&#xff0c;错误的选项是?(C) A.位置实参和关键字实参可以混用。 B. 形参不占用内存地址。 C.调用函…

c/c++蓝桥杯经典编程题100道(18)括号匹配

括号匹配 ->返回c/c蓝桥杯经典编程题100道-目录 目录 括号匹配 一、题型解释 二、例题问题描述 三、C语言实现 解法1&#xff1a;栈匹配法&#xff08;难度★&#xff09; 解法2&#xff1a;计数器法&#xff08;仅限单一括号类型&#xff0c;难度★☆&#xff09; …

day02冒泡排序

思路&#xff1a; 外层循环控制循环次数(i<len)&#xff0c;设置swapFlagfalse内层循环j1(j<len-i)&#xff0c;两两(j和j-1)比较&#xff0c;逆序则交换内层每次循环结束&#xff0c;没有交换&#xff0c;则break结束 内层循环j从1开始&#xff0c;小于len&#xff0c;…

如何在华为harmonyOS上调试软件

1、设置-》关于手机-》HarmonyOS 版本连按多下&#xff0c;输入锁屏密码。显示开发者模式已打开。 2、设置-》搜索“开发人员选项”-》开启“开发人员选项”选项。 3、在 开发者选项 中找到 “USB 调试” 并开启。 4、开启 “仅充电时允许 ADB 调试”。 5、设置中开启 &quo…

供应SW7208 NVDC升降压电池充电控制器IC

1. 概述 SW7208 是一款支持 NVDC 充电路径管理&#xff0c;SMBus 接口和 USB PD 标准的同步双向 buckboost 充电控制器。 SW7208 支持宽电压输入为 3.5 V ~ 36V&#xff0c;可以为 1 ~ 5 节电池充电&#xff0c;并且支持电池反向放电功能&#xff0c;输出电压可调 3V ~ 24V。…

fpga系列 HDL:Quartus II JTAG 间接配置文件 Indirect Configuration File (.jic) AS模式烧录

先编译生成pof文件 File->Convert Programming Files 转换文件 Tools->Programer 烧录

Python:凯撒密码

题目内容&#xff1a; 凯撒密码是古罗马恺撒大帝用来对军事情报进行加密的算法&#xff0c;它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列该字符后面第三个字符&#xff0c;对应关系如下&#xff1a; 原文&#xff1a;A B C D E F G H I J K L M N O P Q R …

如何保证缓存和数据库一致性

保证缓存和数据库一致性是分布式系统中的一个常见挑战。以下是几种常用的策略和方法,用于解决缓存与数据库之间的数据一致性问题: 1. 基础同步策略 基础同步策略包括以下几种常见的操作顺序: 先更新缓存再更新数据库:这种方法可能导致缓存中的数据成为脏数据,因为如果数…

JavaScript系列(71)--函数式编程进阶详解

JavaScript函数式编程进阶详解 &#x1f3af; 今天&#xff0c;让我们深入探讨JavaScript函数式编程的进阶内容。函数式编程是一种强大的编程范式&#xff0c;它通过使用纯函数和不可变数据来构建可预测和可维护的应用程序。 函数式编程进阶概念 &#x1f31f; &#x1f4a1;…

postman登录cookie设置

1.设置环境变量&#xff0c; 定义变量存放共享的登录信息 如Cookie 2.登录接口编码test脚本获取cookie信息 let jsessionidCookie pm.cookies.get("JSESSIONID");if (jsessionidCookie) {let cookie "JSESSIONID" jsessionidCookie "; Admin-Tok…

c/c++蓝桥杯经典编程题100道(21)背包问题

背包问题 ->返回c/c蓝桥杯经典编程题100道-目录 目录 背包问题 一、题型解释 二、例题问题描述 三、C语言实现 解法1&#xff1a;0-1背包&#xff08;基础动态规划&#xff0c;难度★&#xff09; 解法2&#xff1a;0-1背包&#xff08;空间优化版&#xff0c;难度★…

讲解下MySql的外连接查询在SpringBoot中的使用情况

在Spring Boot中使用MySQL的外连接查询时&#xff0c;通常通过JPA、MyBatis或JDBC等持久层框架来实现。外连接查询主要用于从多个表中获取数据&#xff0c;即使某些表中没有匹配的记录。外连接分为左外连接&#xff08;LEFT JOIN&#xff09;、右外连接&#xff08;RIGHT JOIN&…

【大模型知识点】什么是KV Cache?为什么要使用KV Cache?使用KV Cache会带来什么问题?

1.什么是KV Cache&#xff1f;为什么要使用KV Cache&#xff1f; 理解此问题&#xff0c;首先需理解自注意机制的计算和掩码自注意力机制&#xff0c;在Decoder架构的模型中&#xff0c;每生成一个新的token&#xff0c;便需要重新执行一次自注意力计算&#xff0c;这个过程中…