• [技术干货] ​操作系统主要功能 笔记分享
    (1)内存管理主要功能: 内存分配,内存保护,地址映射和内存扩充等.主要任务:   内存分配的主要任务是为每道程序分配内存空间,提高存储器利用率,以减少不可用的内存空间,允许正在运行的程序申请附加的内存空间,以适应程序和数据动态增长的需要. 内存保护的主要任务是确保每道用户程序都在自己的内存空间中运行,互不干扰. 地址映射的主要任务是将地址空间中的逻辑地址转换为内存空间中与之对应的物理地址. 内存扩充的主要任务是借助虚拟存储技术,从逻辑上去扩充内存容量. (2)处理机管理主要功能: 进程控制,进程同步,进程通信和调度. 主要任务: 进程控制:为作业创建进程,撤销已结束的进程,以及控制进程在运行过程中的状态转换. 进程同步:对诸进程的运行进行调节. 进程通信:实现在相互合作进程之间的信息交换. 调度分为作业调度和进程调度.  作业调度基本任务:从后备队列中按照一定的算法,选择出若干个作业,为它们分配必要的资源;   进程调度的任务:从进程的就绪队列中,按照一定的算法选出一新进程,把处理机分配给它,并为它设置运行现场,是进程投入运行. (3)设备管理主要功能:缓冲管理,设备分配和设备处理,以及虚拟设备等.主要任务:完成用户提出的I/O请求,为用户分配I/O设备;提高CPU和I/O设备的利用率;提高I/O速度;以及方便用户使用I/O设备. 缓冲管理:提高CPU的利用率进而提高系统的吞吐量   设备分配:根据用户进程的I/O请求、系统的现有资源以及按照某种设备的分配策略,为之      分配其所需的设备 设备处理:用于实现CPU和设备控制器之间的通信(4)文件管理主要功能:对文件存储空间的管理,目录管理,文件的读,写管理以及文件的共享和保护.主要任务:对用户文件和系统文件进行管理,以方便用户使用,并保证文件的安全性.
  • [技术干货] NLP领域任务如何选择合适预训练模型以及选择合适的方案【规范建议】
    1.常见NLP任务信息抽取:从给定文本中抽取重要的信息,比如时间、地点、人物、事件、原因、结果、数字、日期、货币、专有名词等等。通俗说来,就是要了解谁在什么时候、什么原因、对谁、做了什么事、有什么结果。文本生成:机器像人一样使用自然语言进行表达和写作。依据输入的不同,文本生成技术主要包括数据到文本生成和文本到文本生成。数据到文本生成是指将包含键值对的数据转化为自然语言文本;文本到文本生成对输入文本进行转化和处理从而产生新的文本问答系统:对一个自然语言表达的问题,由问答系统给出一个精准的答案。需要对自然语言查询语句进行某种程度的语义分析,包括实体链接、关系识别,形成逻辑表达式,然后到知识库中查找可能的候选答案并通过一个排序机制找出最佳的答案。对话系统:系统通过一系列的对话,跟用户进行聊天、回答、完成某一项任务。涉及到用户意图理解、通用聊天引擎、问答引擎、对话管理等技术。此外,为了体现上下文相关,要具备多轮对话能力。语音识别和生成:语音识别是将输入计算机的语音符号识别转换成书面语表示。语音生成又称文语转换、语音合成,它是指将书面文本自动转换成对应的语音表征。信息过滤:通过计算机系统自动识别和过滤符合特定条件的文档信息。通常指网络有害信息的自动识别和过滤,主要用于信息安全和防护,网络内容管理等。舆情分析:是指收集和处理海量信息,自动化地对网络舆情进行分析,以实现及时应对网络舆情的目的。信息检索:对大规模的文档进行索引。可简单对文档中的词汇,赋之以不同的权重来建立索引,也可建立更加深层的索引。在查询的时候,对输入的查询表达式比如一个检索词或者一个句子进行分析,然后在索引里面查找匹配的候选文档,再根据一个排序机制把候选文档排序,最后输出排序得分最高的文档。机器翻译:把输入的源语言文本通过自动翻译获得另外一种语言的文本。机器翻译从最早的基于规则的方法到二十年前的基于统计的方法,再到今天的基于神经网络(编码-解码)的方法,逐渐形成了一套比较严谨的方法体系。文本挖掘:包括文本聚类、分类、情感分析以及对挖掘的信息和知识的可视化、交互式的表达界面。目前主流的技术都是基于统计机器学习的。2.如何将业务问题抽象为已得到很好解决的典型问题2.1 明确业务的输入与输出令输入文本用X表示,输出标签用Y表示,则有以下粗略的分类:2.1.1 如果Y表示某一类的概率,或者是一个定长向量,向量中的每个维度是其属于各个类的概率,且概率之和为1,则可抽象为文本多分类问题。a.一般X只有一段文本。如下所示 i.如情感分析等任务。房间 太 小 。 其他 的 都 一般 0b.如果X是2段文本(X1,X2),则是可以抽象为句对分类问题。如下所示 i:如NLI等任务。大家觉得她好看吗 大家觉得跑男好看吗? 0c.如果的每个类别的概率相互独立,即各类概率之和不为1,可抽象为文本多标签分类问题。如下所示 i:如用户评论分类、黄反识别等任务。互联网创业就如选秀 需求与服务就是价值 0 1d. 如果X有多段非文本特征输入,如整型、浮点型类型特征。则可抽象为混合特征的分类问题。如下所示 i:如CTR预估等任务。 CTR预估*CTR预估是推荐中最核心的算法之一。 相关概念: CTR预估:对每次广告的点击情况做出预测,预测用户是点击还是不点击。 CTR预估的影响因素:比如历史点击率、广告位置、时间、用户等 CTR预估相关介绍 推荐算法之4——CTR预估模型2.1.2 如果X是2段文本(X1,X2),Y表示二者的相似度,可抽象为文本匹配问题。如下所示喜欢 打篮球 的 男生 喜欢 什么样 的 女生 爱 打篮球 的 男生 喜欢 什么样 的 女生 1a.如语义相似度、相似问题匹配等任务。b.文本聚类的问题可以通过文本相似度问题进行处理。2.1.3 如果X有一段文本,Y是一个与X等长的序列,可抽象为序列标注问题。如下所示海 钓 比 赛 地 点 在 厦 门 与 金 门 之 间 的 海 域 。 O O O O O O O B-LOC I-LOC O B-LOC I-LOC O O O O O Oa.如分词、POS、NER、词槽挖掘等任务。2.1.4 如果X有一段文本,Y是一个不定长的文本,可抽象为文本生成问题。如下所示Rachel Pike : The science behind a climate headline Khoa học đằng sau một tiêu đề về khí hậua.如机器翻译、文本摘要、标题生成等任务。2.1.5.如果X为一段文本,Y表示文本X作为正常语句出现的概率或者混淆度,则属于语言模型任务。如下所示<s> but some analysts remain sour on the company but some analysts remain sour on the company <e>a.语言模型任务的子问题是基于上(下)文X预测下(上)一个词出现的概率Y,可以理解为一种特殊的文本分类。2.1.6如果X是2段文本(X1,X2),分别表示正文篇章和问题,Y是篇章中的一小段文本,表示对应问题的答案,则可抽象为阅读理解问题。{ "data": [{ "title": "", "paragraphs": [{ "context": "爬行垫根据中间材料的不同可以分为:XPE爬行垫、EPE爬行垫、EVA爬行垫、PVC爬行垫;其中XPE爬行垫、EPE爬行垫都属于PE材料加保鲜膜复合而成,都是无异味的环保材料,但是XPE爬行垫是品质较好的爬行垫,韩国进口爬行垫都是这种爬行垫,而EPE爬行垫是国内厂家为了减低成本,使用EPE(珍珠棉)作为原料生产的一款爬行垫,该材料弹性差,易碎,开孔发泡防水性弱。EVA爬行垫、PVC爬行垫是用EVA或PVC作为原材料与保鲜膜复合的而成的爬行垫,或者把图案转印在原材料上,这两款爬行垫通常有异味,如果是图案转印的爬行垫,油墨外露容易脱落。当时我儿子爬的时候,我们也买了垫子,但是始终有味。最后就没用了,铺的就的薄毯子让他爬。您好,爬行垫一般色彩鲜艳,能吸引宝宝的注意力,当宝宝刚会爬的时候,趴在上面玩,相对比较安全,不存在从床上摔下来的危险。对宝宝的爬行还是很有好处的。还有就是妈妈选择爬行垫时可以选择无害的PE棉,既防潮又隔冷隔热。外有要有一层塑料膜,能隔绝液体进入垫子内部,而且方便清洗。宝宝每次爬行,一定要记得把宝宝的手擦干净。", "qas": [{ "answers": [{ "text": "XPE", "answer_start": 17 }], "id": "DR-single-pre_and_next_paras-181574", "question": "爬行垫什么材质的好" }] }, ..., ] }] }2.1.7 如果Y是以上多种任务的组合,则可以抽象为多标签学习、多任务学习任务。a.如实体关系抽取任务,实体抽取本属于序列标注、关系抽取本属于文本多分类。2.2抽象与拆分任务取舍经验2.2.1优先考虑简单的任务,由易到难循序渐进:a.文本分类、文本匹配、序列标注、文本生成、阅读理解、多任务学习、强化学习、对抗学习等。2.2.2 复杂任务可拆分、化简成简单的子任务a.如实体关系抽取任务,可以拆分为实体识别+关系抽取的pipline进行实现。b.如文本纠错任务,可以拆分出语言模型、统计机器翻译等多种不同子任务构造复杂的pipline进行实现。c.如排序任务,输入X为多段文本,输出Y为每段文本的排序位置,可化简成文本分类问题、文本匹配问题进行处理。2.2.3 有监督学习任务优先于无监督学习任务a.因为有监督学习更可控,更易于应用最前沿的研究成果。文心目前只覆盖有监督、自监督任务。b.比如文本关键词抽取,可以有TFIDF之类的无监督解法,但效果控制较困难,不如转换为文本分类问题。2.2.4 能应用深度学习的任务优于不利用深度学习的任务a.因为深度学习算法效果一般更好,而且可以应用到最前沿的预训练模型。文心目前只采用深度学习算法。b.如果文本聚类,可以有LDA之类的解法,但效果一般不如基于深度学习的语义相似度的文本聚类。3. 明确业务目标与限制条件3.1典型业务目标与限制条件1.预测部署性能a.典型指标:qps 性能指标:QPS、TPS、系统吞吐量理解2.模型效果a.以文本分类为例,典型指标:精确率、准确率、召回率、F1值b.该评估指标应该在训练开始之前基本确定,否则很容易优化偏。3.硬件采购成本a.典型指标:钱b.GPU远贵于CPU,V100贵于P40。4.训练时间成本(GPU,卡,调参,GPU利用率)a.典型指标:每一轮训练所需要的时间。5.数据大小限制a.由于标注成本较高,很多时候是数据量很少又希望有很好的效果。6.开发迭代成本a.搭建环境成本b.迭代效率:往往是最消耗时间的部分。3.2 可供选择的方案选择平台版还是工具版选择GPU还是CPU训练,哪一款硬件,单机还是多机,单卡还是多卡,本地还是集群选择怎样的预制网络是否需要预训练模型选择哪一版本的预训练模型训练数据要多少batch_size、train_log_step、eval_step、save_model_step选多少4.根据业务目标与限制条件选择合适的方案4.1预测部署性能如果要求qps>1000a.不适合直接部署ERNIE预训练模型。b.但可尝试蒸馏策略,模型效果会存在一定损失。如果要求qps>100a.如果预算允许使用GPU,可尝试直接部署ERNIE相关预训练模型,推荐尝试ERNIE-tiny系列模型。b.如果预算只允许使用CPU,可尝试CPU集群部署ERNIE相关预训练模型。3.如果对部署性能要求不高,可随意尝试各种预训练模型。4.性能细节请参考:模型预测与部署——预测性能4.2 模型效果1.一般来说,复杂的网络优于简单的网络,多样的特征优于单一的特征,有预训练模型的效果优于无预训练模型。a.从模型复杂度来看,LSTM、GRU、CNN、BOW的复杂度与效果依次递减,速度依次提升。2.一般来说,在预训练模型中,large优于base优于tiny,新版本的模型优于旧版本的模型,针对具体任务的预训练模型优于通用版预训练模型。3.一般来说,在不欠拟合的情况下,训练数据越多模型效果越好,标注数据的质量越好效果越好。标注数据的质量优于数据的数量。4.不同任务适合的网络结构并不相同,具体任务具体分析。4.3硬件采购成本1.GPU远贵于CPU,常用训练用GPU型号为V100、P40、K40,价格依次递减。2.具体成本可参考百度云服务器-BCC-价格计算器3.如果缺少训练资源,可通过文心平台版的免费共享队列进行训练,资源紧张,且用且珍惜。4.4训练时间成本1.GPU还是CPUa.对于非ERNIE等复杂网络的模型,CPU的训练速度一般也能接受。 如果训练语料过多,数千万条以上,则建议采用CPU集群进行训练。 b.对于ERNIE模型,尽量采用GPU训练,CPU太慢,训练不起来。2.怎么用好GPU a.GPU并行训练能提升训练速度,建议优先把一个节点(trainer)的卡数用完,再考虑多机训练。因为单机多卡的GPU利用率更高,更快。而多机训练数据通信时间成本较高,时间更慢。 b.大原则:GPU利用率越高训练越快。 c.还有一点需要注意,多卡训练时是将不同的数据文件送给不同的卡,所以数据文件的个数要大于卡的个数。数据文件建议拆分细一些,这可以提升数据读取的速度。 d.熟练的同学可以尝试GPU多进程单机多卡训练、混合精度训练等方法,提升训练速度。3.train_log_step、eval_step、save_model_stepa.分别表示每多少步打印训练日志、每多少步评估一次验证集、每多少步保存一次模型。 b.设置不当也会拖慢训练时间 c.一般建议三者依次放大十倍,如:10、100、10004.batch_sizea.设置过小容易收敛慢,设置过大容易超过显存极限直接挂掉 b.如果使用ERNIE,batch_size建议小一些,使用large版本建议更小一些,如果输入语句并不是很长可以适当增加batch_size。 c.如果不使用ERNIE,可以大一些。 d.建议使用默认配置,如果想优化可以采用二分查找4.5 数据大小限制1.一般建议标注语料越多越好。2.非ERNIE模型一般需要几万至几百万条数据能收敛到较好的效果。3.ERNIE模型一般需要几千至几万条数据即可收敛到较好效果。a.一般不用ERNIE训练数百万条以上的数据,因为这会极大延长训练时间,增大资源消耗,而对效果的提升并不明显。自己有足够GPU资源的用户除外。 b.对于基线模型,建议在几万条数据上验证策略有效后再尝试增加数据量。4.如果用ERNIE模型,最少需要多少样本才能取得效果a.对于文本分类与序列标注,一般来说每个标签覆盖的样本数至少要超过200条才能有一定的效果。也就是说如果要进行50类多分类,就总共至少需要1万条样本。一般分类的类别越多任务越复杂。4.6开发迭代成本1.搭建环境成本a.如果只想训练基线模型验证效果,可以考虑使用文心平台版,免去搭建环境的成本。 b.如果需要不断调试、迭代优化模型,而由于平台版集群资源紧张造成迭代周期过长,可以尝试使用工具版。 i:这会付出搭建环境的成本,但长痛不如短痛。2.迭代效率a.使用工具版本地调试成功后再上集群训练能极大提升迭代效率。 b.使用预训练模型能提升迭代效率。 c.基线模型,建议在几万条数据上验证策略,提升迭代效率。验证有效后再尝试增加数据量5. 如何高效训练NLP任务汇总诸多NLP算法同学的建议,我们把高效训练NLP任务的基本流程总结如下:1.分析业务背景、明确任务输入与输出,将其抽象为已得到很好解决的NLP典型任务。 a.对于复杂任务,需要将其拆分成比较简单的子任务 b.文心已覆盖绝大部分NLP典型任务,可参考文心ERNIE工具版-支持任务。2.准备好几千条格式规范的训练数据,快速实现一个NLP模型基线。 a.最快速的方法是通过文心ERNIE平台版或者工具版,采用预制网络和模型无代码训练一个模型基线。 b.本步骤只需要您知道最基本的机器学习概念,划分好训练集、验证集、测试集进行训练即可。 c.评估训练出模型的效果,看是否满足你的业务需求,如果不满足,可考虑进一步优化模型效果。3.优化模型效果: a.各优化手段按照投入产出比排序如下 i:进一步分析你的业务背景和需求,分析基线模型的不足,进行更细致的技术选型。 ii:采用工具版进行本地小数据调试,极大地提升迭代效率。 iii:基于预制网络进行调参。 iv:自定义组网并进行调参。 v:基于核心接口进行高度自定义开发。 vi:直接修改文心核心源码进行开发。 b.每一种优化手段都都可以申请vip服务进行支持。如何自我判断采用哪种文心开发方式 典型的训练方式:无代码训练(不调参),无代码训练(自主调参),自定义组网训练,高阶自定义训练。以上4类训练方式的开发自由度、上手难度、建模的风险、模型效果的上限依次递增,性价比依次递减。本地工具包的调试、迭代效率最高。6总结:需掌握知识6.1 无代码调参建议具备的相关知识1.明确以下概念:有监督学习、标签、特征、训练集、验证集、测试集、逻辑回归、过拟合、欠拟合、激活函数、损失函数、神经网络、学习率、正则化、epoch、batch_size、分词、统计词表。2.知道回归与分类的区别。3.知道如何通过收敛曲线判断过拟合与欠拟合。4.知道准确率、召回率、精确度、F1值、宏平均、微平均的概念与区别。5.知道为什么训练集、验证集、测试集要保证独立同分布。6.知道什么是神经网络.7.知道什么是迁移学习、什么是预训练模型、什么是finetune、迁移学习的优点是什么。6.2 自定义组网建议具备的相关知识1.前提是已经掌握无代码调参建议具备的相关知识2.明确以下概念:Sigmoid函数公式、softmax函数公式、交叉熵公式、前向传播、反向传播、SGD、Adam、词向量、embedding、dropout、BOW、CNN、RNN、GRU、LSTM、迁移学习、3.知道神经网络为什么具有非线性切分能力。4.知道NLP中一维CNN中的卷积核大小、卷积核的个数各指代什么,时序最大池化层如何操作。5.知道NLP中CNN与LSTM的区别,各擅长处理哪类文本问题。6.知道为什么BOW模型无法识别词语顺序关系。7.知道为什么会梯度爆炸,以及如何解决。参考书籍: a.ML特征工程和优化方法 b.周志华《机器学习》前3章 c.迁移学习常见问题 a.CNN常见问题 b.深度学习优化方法 c.花书《深度学习》6-10章 d.《基于深度学习的自然语言处理》整本项目参考链接:cid:link_2
  • [知识分享] 用GaussDB(for Redis)存画像,推荐业务轻松降本60%
    【摘要】 用户画像存储是推荐业务核心,但开源Redis无法胜任。华为云高斯Redis是最佳存储选型,轻松降本60%,同时获得企业级高稳定性。本文分享自华为云社区《华为云GaussDB(for Redis)揭秘第23期:用GaussDB(for Redis)存画像,推荐业务轻松降本60%》,作者: 高斯Redis官方博客 。一、什么是推荐系统       不知道大家有没有过这样的经历,当你前脚刚在某电商网站买了一个手机,过两天之后你再打开该电商网站,显示在首页的上必定有耳机、手机壳和蓝牙音箱等手机配件。如果你买的不是手机,而是一件衣服的话,下次打开显示的必定是和该衣服非常搭配的裤子和鞋子等。聪明的你不禁要问,为何电商网站如此强大,竟然能提前预知你的偏好,并且给你推荐你可能喜欢的商品?其实在这背后,都离不开那强大的推荐系统。       什么是推荐系统呢?首先我们来看看维基百科对推荐系统的定义:推荐系统是一种信息过滤系统,可以根据用户历史行为用于预测用户对物品的“评分”或“偏好”。简单来说,如果你是一个电子发烧友,那么系统肯定会给你推荐各种新鲜出炉的3C产品,如果你是一个coder,那么你的页面肯定充斥各种编程大全的书籍。推荐系统近年来非常流行,应用于各行各业,它推荐的对象包括:电影、音乐、新闻、书籍、学术论文、搜索查询、分众分类、电商购物和游戏业务等。二、推荐系统的架构       了解了什么是推荐系统之后,接下来我们继续介绍下推荐系统的架构,以游戏行业为例,一个典型的游戏业务中的推荐系统架构设计如下:         推荐系统主要由3部分组成,分别是:行为日志收集、特征生产和特征消费。(1)行为日志收集         大数据业务收集用户的行为日志,分析获得用户画像,并且将这些用户画像保存在分布式文件系统HDFS中。(2)特征生产         工程业务负责为大数据业务提供一套接口调用,主要是“灌库”,即定时或按一定逻辑把HDFS中的用户画像加工成特征,灌入工程业务负责的“KV存储”。(3)特征消费         工程业务团队还负责将算法团队的推荐模型进行工程落地,他们开发线上推理组件,从KV存储中提取特征数据,分析计算,最终得出推荐结论,展示给用户。三、推荐系统的存储痛点       上一节中我们介绍了游戏行业中推荐系统的架构,这也是推荐系统的一个典型架构。从架构图可以看出,KV存储在整套链路中,承载着重要的承上启下作用。然而,推荐系统中的KV存储却存在着两个大的痛点,第一个是成本高,第二个是扩容慢。(1)成本高         首先第一个是成本高的问题。通常我们搭建KV存储的话首选都是选择自建一个开源Redis集群作为KV存储系统。一方面,开源Redis的数据全部放在内存中,众所周知内存的存储成本是非常昂贵的,内存只适合用于存储少量数据,如果数据量大的话,数据的存储成本将成为企业的负担;另一方面由于开源Redis在进行AOF文件重写的过程中,存在fork机制,导致开源Redis在AOF文件重写时,其内存利用率只有50%,这就进一步使增加了开源Redis的内存使用成本。(2)扩容慢       除了成本比较高,开源Redis还存在扩容慢的问题。在自建的开源Redis集群中,随着业务增长,KV存储的容量不得不进行扩容。但是由于原生Redis本身的架构特点,在扩容过程中难免要发生key的跨slot迁移,如下图所示:       如果发生slot迁移,需要耗时很久并且业务受影响时间长。四、为什么推荐高斯Redis       上一节中我们介绍了推荐系统的存储痛点,如何解决呢?要解决这两个痛点,无非是需要进行降本增效,而高斯Redis似乎就是为了解决这些问题而生。(1)降本       就降本而言,高斯Redis从两个方面降低KV数据的存储成本:       第一个方面,高斯Redis的所有数据全部落在磁盘,相比开源Redis存在内存中而言,其成本降低了75%~90%,拥有极大的价格优势。举个例子来说,一个512GB的开源Redis集群,其成本几乎要5w/月,而相同规格的实例,如果替换成高斯Redis,其成本节约40%以上,几乎节省了一个人力成本在里面。下面这张表格是不同层级的存储器之间的成本对比图。       另一方面,在推荐系统中,KV数据库主要存储的是用户画像的信息,而这些信息基本上都是经过Protobuf序列化后的信息,而高斯Redis自带的数据压缩功能,对序列化后的信息可以进行高压缩比的压缩,相对于开源Redis而言,存储空间仅仅为开源Redis的70%到85%,这又进一步降低了KV数据的存储成本。(2)增效       除了降本,另一方面就是增效了。众所周知,开源Redis的架构中,如下图所示,其存储和计算是不分离的,这就导致节点进行扩容的时候,会发生分片的迁移,从而导致业务会受到影响。        高斯Redis为了解决这个问题,采用了存算分离的架构,如下图所示:       在采用存算分离的架构下,底层数据可以被任意上层计算节点访问,扩容过程不发生数据拷贝搬迁,速度极快。节点扩容时,分钟级完成,业务只有秒级感知。容量扩容时,业务0感知。无论是扩节点还是扩磁盘容量,对业务造成的影响几乎为0。五、总结       本文简单介绍了推荐系统是什么,并且以游戏行业中的推荐系统为例,介绍了推荐系统的架构和其存在的存储痛点,并且介绍了高斯Redis如何解决该存储痛点。在这个大数据时代,推荐系统的应用会越来越多,作为推荐系统的数据存储,高斯Redis解决了开源Redis所存在的缺点,为推荐系统提供了有力的技术支撑。六、附录本文作者:华为云数据库GaussDB(for Redis)团队杭州/西安/深圳简历投递:yuwenlong4@huawei.com更多产品信息,欢迎访问官方博客:bbs.huaweicloud.com/blogs/248875
  • [技术干货] 用GaussDB(for Redis)存画像,推荐业务轻松降本60%
    一、什么是推荐系统不知道大家有没有过这样的经历,当你前脚刚在某电商网站买了一个手机,过两天再打开该电商网站,首页推荐显示的必定有耳机、手机壳、蓝牙音箱等手机配件。如果你买的不是手机,而是一件衣服,那么下次打开电商网站显示的,必定是和衣服搭配的裤子和鞋子等。聪明的你不禁要问,为何电商网站如此强大,竟能提前预知你的偏好,并且给你推荐你可能喜欢的商品?其实在这背后,都离不开那强大的推荐系统。什么是推荐系统?首先我们来看看维基百科上的定义:推荐系统是一种信息过滤系统,可以根据用户历史行为预测用户对物品的“评分”或“偏好”。简单来说,如果你是一个电子发烧友,那么系统肯定会给你推荐各种新鲜出炉的3C产品,如果你是一个coder,那么你的页面肯定充满各种编程大全的书籍。推荐系统近年来非常流行,应用于各行各业,推荐的对象包括:电影、音乐、新闻、书籍、学术论文、搜索查询、分众分类、电商购物和游戏业务等。二、推荐系统的架构了解了什么是推荐系统之后,接下来我们继续介绍下推荐系统的架构,以游戏行业为例,一个典型的游戏业务的推荐系统架构设计如下: 推荐系统主要由3部分组成,分别是:行为日志收集、特征生产和特征消费。 01.行为日志大数据业务通过收集用户的行为日志,分析获得用户画像,并且将这些用户画像保存在分布式文件系统HDFS中。02.特征生产工程业务负责为大数据业务提供一套接口调用,主要是“灌库”,即定时或按一定逻辑把HDFS中的用户画像加工成特征,灌入工程业务负责的“KV存储”。 03.特征消费工程业务团队还负责将算法团队的推荐模型进行工程落地,他们开发线上推理组件,从KV存储中提取特征数据、分析计算,最终得出推荐结论,展示给用户。 三、推荐系统的存储痛点上一节中我们介绍了游戏行业中推荐系统的架构,这也是推荐系统的一个典型架构。从架构图可以看出,KV存储在整套链路中,承载着重要的承上启下作用。然而,推荐系统中的KV存储却存在着两个大的痛点,第一个是成本高,第二个是扩容慢。 01.成本高首先第一个是成本高的问题。通常我们搭建KV存储的首选是选择自建一个开源Redis集群作为KV存储系统。一方面,开源Redis的数据全部放在内存中,众所周知内存的存储成本非常昂贵,只适用于存储少量数据,如果数据量大,存储成本将成为企业的负担;另一方面,开源Redis在进行AOF文件重写的过程中存在fork机制,导致开源Redis在AOF文件重写时,其内存利用率只有50%,这就进一步使增加了开源Redis的内存使用成本。02.扩容慢除了成本比较高,开源Redis还存在扩容慢的问题,在自建的开源Redis集群中,随着业务增长,KV存储的容量不得不进行扩容。但由于原生Redis本身的架构特点,在扩容过程中难免要发生key的跨slot迁移,如下图所示,跨slot迁移需要耗时很久并且业务受影响时间长。 四、为什么推荐GaussDB(for Redis)知道了推荐系统的痛点所在,该如何解决呢?究其根本是降本增效,而GaussDB(for Redis)可以说是为解决这些问题而生。01.降本GaussDB(for Redis)从两个方面降低KV数据的存储成本: 第一个方面,GaussDB(for Redis)的所有数据全部落在存储,相比开源Redis数据存放在内存中,其成本降低了75%~90%,形成极大的价格优势。举个例子,一个512GB的开源Redis集群,其成本几乎要5w/月,而相同规格的实例,如果替换成GaussDB(for Redis),其成本节约40%以上,几乎节省了一个人力成本在里面。下面这张表格是不同层级存储器之间的成本对比图。 另一方面,在推荐系统中,KV数据主要存储的是用户画像的信息,这些信息基本上都是经过Protobuf序列化后的信息,而GaussDB(for Redis)自带的数据压缩功能,可以对序列化后的信息进行高压缩比的压缩,实际占用空间仅为开源Redis的50%左右,这又进一步降低了KV数据的存储成本。 02.增效除了降本,另一方面就是增效了。众所周知,开源Redis的架构中,如下图所示,其存储和计算是不分离的,这就导致节点进行扩容的时候,会发生分片的迁移,从而导致业务会受到影响。GaussDB(for Redis)为了解决这个问题,采用了存算分离的架构,如下图所示:在存算分离的架构下,底层数据可以被任意上层计算节点访问,扩容过程不发生数据拷贝搬迁,速度极快;同时还做到分钟级节点扩容,业务秒级感知;存储扩容业务0感知。无论是扩节点还是扩存储容量,对业务的影响几乎为0。五、总结本文简单介绍了推荐系统是什么,并以游戏业务为例,阐明了推荐系统的架构和存在的存储痛点,同时GaussDB(for Redis)是如何解决这些存储痛点的。在大数据时代,推荐系统的应用场景将会越来越多,作为推荐系统的数据存储,GaussDB(for Redis)完美弥补了开源Redis的短板,能够为推荐系统提供强有力的技术支撑。
  • [技术干货] MindSpore分类指标之精准率、召回率和F值详解
    一、精准率和召回率在上次的分享中,我们提到了评测分类模型的意义和准确率、AUC/ROC两种评测方法。朋友们可能就会思考分类的任务多种多样,评测模型的性能只有这两种方法吗?当然还有。这次我们就一起来认识一下精准率(Precision)、召回率(Recall),以及这两个结合组成的F值。我们还是通过混淆矩阵来表示:结合混淆矩阵和表达式来理解,首先从分母开始(TP+FP),在分类任务中的意义是预测为正类的样本数量,分子的意义是样本类别实际为正并被预测为正的数量,它们两个的比值我们称为精准率,精准率是针对预测后其中一个类别的评测表达式。这里我们重点区分一下和精准率(Precision)准确率(Accuracy),因为这两个名词的概念很容易混乱。通过对比我们能够发现,准确率的分母更大,作用域更广,精准率的分母小一些,作用域也小一些。所以作用更精准。在表达式中的分母(TP+FN),结合混淆矩阵可以知道代表的是真实类别为某一个类别的样本数量,分子则是真实类别与预测类别相同的样本数量。二、精准率和召回率场景分析在检索领域中,精准率和召回率又被称为查准率和查全率。我们结合一下现实场景来了解一下查准率和查全率的现实意义。举例说明假设今天放假了,好开心啊!买一包瓜子庆祝一下。假期里好无聊啊,将这一包瓜子拆开数一数有多少颗瓜子,一共1000颗瓜子。展示分类能力的时候到了,通过瓜子的各种特征,将全部的瓜子分成了800颗‘好’瓜子和200颗‘坏’瓜子两个类别。终于到了验证自己分类能力的时候了。将这两个类别的瓜子一个一个嗑开吃掉发现,在这一堆800个‘好’的瓜子中,有750个是真正好的,200颗‘坏’瓜子中有100个真正坏的瓜子。那么我们可以知道了1000个瓜子中有750+(200-100)=850个好瓜子。使用精准率就是(750/800),现实意义可以理解为:在我们分类好的一类样本中,有多少是真实属于这一类别,因此精准率也可以称为查准率。使用召回率可以表示为(750/(750+100)),现实意义就可以理解为:在某一类的样本中在分类后,依旧被分为这一类别,所以也表示一类样本有多少被召回到原类别中,因此也可以称为召回率。推荐系统中的使用因为这两种指标的性质,也会经常应用到推荐系统项目中,比如一个简单的音乐推荐系统,在积累够一定量的用户数据后,我们就可以根据用户的历史记录做画像。(如果数据不够,这就是冷启动问题了,冷启动的解决方法有很多种,这里就不过多拓展了,继续直奔我们的主题)用户画像完成后,就该进行召回过程了,(这里的召回是根据用户画像在海量的音乐数据中将用户可能喜欢的音乐找出来,放入召回池中。这一过程称为召回)那么这里就可以用到精准率和召回率了。在这种场景下,精准率表示:在召回池的这批音乐中有多少是我喜欢的。召回率表示:在所有我喜欢的音乐中,有多少被召回了。当然在这种情况下,如果这两个指标的值越大,说明这个推荐系统越优秀。三、F值上面我们已经大致了解了精准率(Precision)和召回率(Recall)。那么我们可以再思考一下,精准率高的时候召回率就高吗?召回率高的时候精准率就高吗?结果我们会发现,这两个并没有太大的关系,所以无论单一的使用其中的哪一个指标,都是不全面的。那么我们就开始合体了。所以在精准率和召回率出现矛盾情况的时候,我们就需要综合考虑它们,最常见的方法就是F-Measure。当参数α=1时,就是最常见的F1,公式表示为:F1分数是精准率和召回率的谐波平均值,而谐波平均值会给予较低的值更高的权重。因此,当召回率和精准度都很高时,分类器才能得到较高的F1分数。四、总结通过对上面三种分类指标的分析,我们会发现每个表达式都各有优劣,重要的是需要结合使用场景来选择使用。比如我们要对一批疑似患传染病的人群进行体检,那么这种情况我们就要将召回率放在第一位了。如果在一些视频、音乐推荐中,就会将精准率作为标准。所以在大家了解完它们的特性后,明白怎样去选择使用就是本篇文章的主要目的。————————————————原文链接:https://blog.csdn.net/xi_xiyu/article/details/122680688
  • [知识分享] 要想推荐系统做的好,图技术少不了
    本文分享自华为云社区《[推荐--用图分析!](https://bbs.huaweicloud.com/blogs/320761?utm_source=zhihu&utm_medium=bbs-ex&utm_campaign=ei&utm_content=content)》,作者: 你好_TT。 # 导读 推荐系统被认为是一种用于提供给用户感兴趣的商品、内容或者服务的技术。图技术作为刻画事物之间深度链路关系的技术,常常被用来进行推荐系统的建模。本文首先介绍推荐系统以及推荐系统和图技术之间的关系,而后通过举例说明图技术如何赋能推荐系统。 # 什么是推荐系统 当用户需要连接到互联网以满足其需求时,他经常会遇到大量的相关信息。推荐系统是一种用于过滤信息并提供给用户尽量使他们满意和感兴趣的商品、内容或者服务的技术。 随着电子商务和社交媒体平台的快速发展,为了防止用户在数据海中迷失自我,推荐系统应运而生。推荐系统作为AI最成功和最重要的应用之一,帮助消费者更容易地找到相关的或感兴趣的内容、商品或者服务。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649993059924878221.png) # 推荐系统的重要性 当今互联网承载着多种信息资源,数据量呈指数级增长。推荐系统在缓解信息过载这一问题上发挥着重要作用。在电商平台,一个好的推荐系统能帮助用户发现好商品,也能使高质量的商品触达精准受众。 从用户角度来看,推荐系统可以缓解信息过载带来的时间成本,从企业角度来看,可以帮助企业实现精准营销,个性化用户的体验,提升客户忠诚度,最大化企业的收益。因此推荐系统的好坏对用户和企业来说都非常重要。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649993073199788303.png) # 图分析与推荐系统的关系 推荐系统里的数据本质上是一些图数据,包括用户、商品、属性在内的数据通过各种各样的关系联系在一起。而图分析技术在处理复杂关系上具有天然的优势,像随机游走、图神经网络等图技术已经被用来处理各种图并且取得了很好的效果,所以利用图分析来处理推荐问题会是一个自然且明智的选择。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649993087173488865.png) 而且,图分析有利于建立可解释的推荐系统。深度学习主导下的推荐系统的黑盒机制使得人们越来越关注推荐系统的可解释性,受益于图分析的因果推理的能力,基于图分析的推荐系统能很好地支撑推荐结果的可解释性。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649993094852353976.png) # 推荐系统中的图结构 推荐系统中会包含很多不同类型的实体,例如用户、商品、属性等等,而他们之间又会通过各种关系联系在一起,例如用户之间的社交关系,用户和商品之间的交互关系等。这些不同的实体和关系构成推荐系统底层的数据集。推荐系统底层的数据可分为以下几种结构。 ## 层级结构 一般地,所有的商品会根据特定属性(例如:产品的类别),被组织成层级结构。例如,华为商城的所有产品被分成许多类(包括手机、配件、智慧屏幕等),每类产品又会被分成小类(手机被分成Mate系列、P系列等),每个小类可能包含各种具体的产品。这种层级结构本身就揭示了产品之间丰富的关系。来自不同但相近的类别的产品可能存在互补的关系(例如手机和保护套),这有利于提升推荐的质量,另外,这也有利于避免重复推荐类似产品,从而提升推荐产品的多样性。 ## 单部图 在推荐系统中,至少有两个单部图需要考虑,即用户社交关系网络和产品的共现关系网络或会话图。在社交关系图中,用户的偏好和购买行为会互相影响,产品的共现关系不仅体现了产品的互补或者竞争的关系,也显示了用户的消费模式,这些都是在做推荐的时候需要考虑的因素。 ## 二部图 用户和商品之间的关系(点击、购买等)是推荐系统的核心,这可以建模成二部图。此时推荐可以看作一个链接预测问题。 ## 异构图 为了有效解决上述用户-商品二部图稀疏性的问题,也为了建立更加鲁棒和可靠的推荐系统,有许多相关的信息可以被考虑进来,包括用户的个人信息、用户的社交关系、商品特性、商品共现关系等等。一般来说,我们对用户的偏好和购买行为以及产品的特性了解得越多,推荐的效果就会越好。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649993124250700770.png) # 推荐系统的图分析方法 ## 随机游走 随机游走的原理是从某一个点出发,以特定的概率游走到这个顶点的邻居节点,每次游走后得到一个概率分布,该概率分布刻画了图中每个节点被访问到的概率。经过一定步骤后,根据每个节点被访问到的概率对节点进行排序作为推荐结果。受益于随机游走特殊的工作机制,其在复杂、高阶的数据图上获得了很好的推荐效果。 ## 图表示学习 图表示学习方法一般将图中每个点编码成低维度的表示,这些表示蕴含着图的结构信息,这些表示将用于后续的推荐任务。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649993152992593564.png) ## 图神经网络 例如:图卷积神经网络通过利用图的结构和点的特征信息去学习怎样不断地聚合局部结构地特征。一般来说,通过卷积和池化操作,图卷积网络有能力从节点的邻域学习到有价值的特征信息。 ## 知识图谱 基于知识图谱的推荐系统一般利用外部的知识建立知识图谱,以探索用户或者商品之间隐藏的关系,这样有利于更好的推荐。更重要的是,由于利用了外部的知识,基于知识图谱的推荐系统对用户的行为和产品的特性提供了更好的理解,从而提升了推荐结果的可解释性。 # 基于华为云图引擎GES进行推荐的例子 ## 好友推荐 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649993172264985971.png) 在这个例子中,我们向李雷推荐好友,思路是向他推荐其好友的好友,但是推荐的好友中不应包含李雷本身的好友,比如图中小梅同时是李雷的好友,也是李雷好友的好友,我们不应该向李雷推荐小梅,因为她已经是李雷的好友了。我们可以通过下面的gremlin语句来实现上述推荐: `g.V("李雷").repeat(out("friend").simplePath().where(without('1hop')).store('1hop')).times(2).path().by("name").limit(100)` ## 电影推荐 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649993193403813577.png) 这是一个异构图的例子,实体包含user,movie,genre,actor,director等,我们想 向Frank推荐电影,我们利用GES内置的实时推荐算法来实现。实时推荐算法是一种基于随机游走模型的算法,主要的输入参数是sources和label,sources表示请求节点的id,label表示期望得到的推荐的节点类型,具体的参数说明可以参考链接实时推荐算法,返回参数中,score展示了各节点的推荐值,反应了其推荐程度。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/15/1649993203112291199.png) { "score": 1494, "id": "The Sixth Sense" }, { "score": 1233.0000000000002, "id": "Artificial Intelligence" }, { "score": 519, "id": "Lincoln" }, { "score": 441, "id": "Ready Player One" } # 基于GES的推荐系统的优势 酷狗、华为商城基于GES构建自己的推荐系统,取得了非常好的效果, 相关链接(基于人货场的电商知识图谱的构建https://bbs.huaweicloud.com/forum/thread-67525-1-1.html)总的来说,基于GES的推荐系统有以下几个方面的优势: ## 实时推荐 在线应用程序必须做出即时的推荐,GES的高性能能帮助建立实时推荐系统。 提供高质量、可解释性的推荐结果 提供的推荐结果对用户来说是真正有价值的,而且可以回答为什么的问题。 ## 方法的多样性 GES提供多种方法帮助构建推荐系统,结果更准确。 ## 实现商业目标 帮助企业实现高收入、低成本的目标,提升用户满意度,节约时间成本。 # 参考文献: 1. Graph Learning Approaches to Recommender Systems: A Review(2020) 2. DKN: Deep Knowledge-Aware Network for News Recommendation(2018) 3. Dressing as a Whole: Outfit Compatibility Learning Based on Node-wise Graph Neural Networks(2019)
  • [技术干货] MindSpore分类指标之精准率、召回率和F值详解
    一、精准率和召回率在上次的分享中,我们提到了评测分类模型的意义和准确率、AUC/ROC两种评测方法。朋友们可能就会思考分类的任务多种多样,评测模型的性能只有这两种方法吗?当然还有。这次我们就一起来认识一下精准率(Precision)、召回率(Recall),以及这两个结合组成的F值。我们还是通过混淆矩阵来表示: 精准率我们从表达式开始:结合混淆矩阵和表达式来理解,首先从分母开始(TP+FP),在分类任务中的意义是预测为正类的样本数量,分子的意义是样本类别实际为正并被预测为正的数量,它们两个的比值我们称为精准率,精准率是针对预测后其中一个类别的评测表达式。这里我们重点区分一下和精准率(Precision)准确率(Accuracy),因为这两个名词的概念很容易混乱。通过对比我们能够发现,准确率的分母更大,作用域更广,精准率的分母小一些,作用域也小一些。所以作用更精准。 召回率下面我们看召回率的表达式:在表达式中的分母(TP+FN),结合混淆矩阵可以知道代表的是真实类别为某一个类别的样本数量,分子则是真实类别与预测类别相同的样本数量。二、精准率和召回率场景分析在检索领域中,精准率和召回率又被称为查准率和查全率。我们结合一下现实场景来了解一下查准率和查全率的现实意义。举例说明假设今天放假了,好开心啊!买一包瓜子庆祝一下。假期里好无聊啊,将这一包瓜子拆开数一数有多少颗瓜子,一共1000颗瓜子。展示分类能力的时候到了,通过瓜子的各种特征,将全部的瓜子分成了800颗‘好’瓜子和200颗‘坏’瓜子两个类别。终于到了验证自己分类能力的时候了。将这两个类别的瓜子一个一个嗑开吃掉发现,在这一堆800个‘好’的瓜子中,有750个是真正好的,200颗‘坏’瓜子中有100个真正坏的瓜子。那么我们可以知道了1000个瓜子中有750+(200-100)=850个好瓜子。使用精准率就是(750/800),现实意义可以理解为:在我们分类好的一类样本中,有多少是真实属于这一类别,因此精准率也可以称为查准率。使用召回率可以表示为(750/(750+100)),现实意义就可以理解为:在某一类的样本中在分类后,依旧被分为这一类别,所以也表示一类样本有多少被召回到原类别中,因此也可以称为召回率。推荐系统中的使用因为这两种指标的性质,也会经常应用到推荐系统项目中,比如一个简单的音乐推荐系统,在积累够一定量的用户数据后,我们就可以根据用户的历史记录做画像。(如果数据不够,这就是冷启动问题了,冷启动的解决方法有很多种,这里就不过多拓展了,继续直奔我们的主题)用户画像完成后,就该进行召回过程了,(这里的召回是根据用户画像在海量的音乐数据中将用户可能喜欢的音乐找出来,放入召回池中。这一过程称为召回)那么这里就可以用到精准率和召回率了。在这种场景下,精准率表示:在召回池的这批音乐中有多少是我喜欢的。召回率表示:在所有我喜欢的音乐中,有多少被召回了。当然在这种情况下,如果这两个指标的值越大,说明这个推荐系统越优秀。三、F值上面我们已经大致了解了精准率(Precision)和召回率(Recall)。那么我们可以再思考一下,精准率高的时候召回率就高吗?召回率高的时候精准率就高吗?结果我们会发现,这两个并没有太大的关系,所以无论单一的使用其中的哪一个指标,都是不全面的。那么我们就开始合体了。所以在精准率和召回率出现矛盾情况的时候,我们就需要综合考虑它们,最常见的方法就是F-Measure。当参数α=1时,就是最常见的F1,公式表示为:F1分数是精准率和召回率的谐波平均值,而谐波平均值会给予较低的值更高的权重。因此,当召回率和精准度都很高时,分类器才能得到较高的F1分数。四、总结通过对上面三种分类指标的分析,我们会发现每个表达式都各有优劣,重要的是需要结合使用场景来选择使用。比如我们要对一批疑似患传染病的人群进行体检,那么这种情况我们就要将召回率放在第一位了。如果在一些视频、音乐推荐中,就会将精准率作为标准。所以在大家了解完它们的特性后,明白怎样去选择使用就是本篇文章的主要目的。————————————————原文链接:https://blog.csdn.net/xi_xiyu/article/details/122680688
  • [其他] 推荐系统应用中的上下文老虎机中的上下文不确定性
    递归神经网络已被证明可以有效地建模推荐系统的连续用户反馈。然而,它们通常只关注项目的相关性,而不能有效地为用户探索不同的项目,因此从长远来看会损害系统性能。为了解决这一问题,我们提出了一种新的递归神经网络,称为递归探索网络(re - exploration networks, REN),该网络可以联合执行表征学习和潜在空间的有效探索。REN试图平衡相关性和探索,同时考虑到表现中的不确定性。我们的理论分析表明,即使在学习的表征中存在不确定性,REN仍能保持最优率的次线性遗憾。我们的实证研究表明,REN可以在合成和真实的推荐数据集上获得令人满意的长期回报,优于最先进的模型。https://www.zhuanzhi.ai/paper/4b73b324ed99c6efe645d865c83fa1c1
  • [技术干货] 推荐--用图分析!
    从用户角度来看,推荐系统可以缓解信息过载带来的时间成本,从企业角度来看,可以帮助企业实现精准营销,个性化用户的体验,提升客户忠诚度,最大化企业的收益。因此推荐系统的好坏对用户和企业来说都非常重要。而推荐系统里的数据本质上是一些图数据,包括用户、商品、属性在内的数据通过各种各样的关系联系在一起。如果你想了解怎样用图分析来处理推荐问题以及图分析给推荐系统带来的价值,可参考博文:推荐--用图分析!
  • [其他] 基于条件注意力网络蒸馏精炼的知识图谱推荐系统
    题目: 基于条件注意力网络蒸馏精炼的知识图谱推荐系统会议: CIKM 2021本文将解读由蚂蚁集团和清华大学合作的论文:Conditional Graph Attention Networks for Distilling and Refining Knowledge Graphs in Recommendation,文章已被CIKM2021接收。1. 背景推荐系统根据用户商品的历史交互记录来为用户找到最符合他们个性化兴趣的商品。然而推荐系统这种基于用户商品交互网络的任务的共同问题是数据稀疏性。用户行为和用户商品交互记录相对于商品的规模来说都是非常有限的。此外,对新到来的用户很难给他们推荐商品。为了克服这些困难,现在很多研究提出将外部信息引入推荐系统,比如属性,文本,图像等。通过外部信息建立原始推荐系统中实体之间的联系,衡量它们之间的潜在相似度,缓解网络稀疏性带来的问题。作者提出用知识图谱来帮助提升推荐系统的效果。知识图谱中不仅包含节点的特征,还包含节点的连接关系。和传统网络不同,知识图谱由一系列三元组组成,也就是<起始实体,关系,终止实体>。它不但可以描述节点属性 ,也可以描述节点之间的关系。如今,有非常多的超大规模的知识图谱被发布,比如Wordnet,Freebase,DBpedia。这些图谱描述了事实和常识,它们通常可以和大多数网络应用中的部分节点对齐并作为网络应用的外部知识。它们通过引入实体之间的联系,增强实体的信息以及产生可解释性来帮助推荐系统。然而,由于知识图谱的一般性和巨大的规模,大多数知识实际上对于目标用户商品的预测是没有帮助的。如何有效地对知识图谱进行蒸馏以便维持目标相关的知识关系是将知识图谱引入推荐系统的关键问题。图1. 一个简单的知识依赖的推荐系统例子。现有的知识图谱相关的推荐算法可以分为两类,基于表征和基于路径的方法:基于表征的方法首先通过知识图谱表征学习算法得到实体和关系的表征,然后将这些隐层表征引入推荐系统。然而,知识图谱表征学习算法更多地关注于复杂的语义关联,它更适用于网络内任务比如链接预测,而不是推荐。因此,基于表征的方法不能完全地捕捉用户商品连接的复杂语义,也不能区分知识关系是否与目标任务相关联。基于路径的算法从知识图谱中探索很多条路径来构建两个实体之间的联系。它们通常将知识图谱看作是一个异构信息网络,然后预先定义很多元路径来提取目标节点对之间的相似度。不同路径之间的不同权重反映了知识图谱中用户的偏好。但是由于路径长度的限制,它们丢失了全局关系。此外,这些方法通常非常依赖于元路径的设计,所以不能直接应用于新的数据中。为了克服这些限制,作者认为一个好的知识依赖的网络表征学习方法应该满足下面的性质: (1) 全局相似度保持。知识图谱的巨大规模使得衡量实体之间的全局相似度变得非常困难。此外,图卷积神经网络递归地聚合邻居的特征来更新节点表征。在若干次迭代之后,模型可以将局部信息传播到全局。作者提出引入图卷积神经网络到知识图谱中。(2)局部知识蒸馏。学习目标用户的偏好通常都是局部而且多样的。因此本文利用基于目标用户商品的子图而不是多条独立的路径。子图可以包含更丰富的拓扑结构信息以及上下文信息。它可以在一个局部子图而不是全量庞大知识图谱中挖掘更精确的目标偏好。此外,不同的目标用户商品对可能对知识图谱中的关系有不同的偏好。基于注意力的图算法可能对图中的边学到不同的权重,但是边的注意力只依赖于它连接的两个节点而不依赖于目标节点。比如,在图1中, 相对于  更偏好“starred”关系,但是“starred”边在基于注意力的模型中对于这两个节点的注意力是一样的。
  • [其他] 基于强化学习的推荐研究综述
    摘要: 推荐系统致力于从海量数据中为用户寻找并自动推荐有价值的信息和服务,可有效解决信息过载问题,成为大数据时代一种重要的信息技术。但推荐系统的数据稀疏性、冷启动和可解释性等问题,仍是制约推荐系统广泛应用的关键技术难点。强化学习是一种交互学习技术,该方法通过与用户交互并获得反馈来实时捕捉其兴趣漂移,从而动态地建模用户偏好,可以较好地解决传统推荐系统面临的经典关键问题。强化学习已成为近年来推荐系统领域的研究热点。文中从综述的角度,首先在简要回顾推荐系统和强化学习的基础上,分析了强化学习对推荐系统的提升思路,对近年来基于强化学习的推荐研究进行了梳理与总结,并分别对传统强化学习推荐和深度强化学习推荐的研究情况进行总结;在此基础上,重点总结了近年来强化学习推荐研究的若干前沿,以及其应用研究情况。最后,对强化学习在推荐系统中应用的未来发展趋势进行分析与展望。http://www.jsjkx.com/CN/10.11896/jsjkx.210200085
  • [基础知识] 【MindSpore易点通】机器学习系列:推荐系统
    一周未见,甚是想念,今天小Mi带大家学习推荐系统(Recommender Systems)!推荐系统是机器学习中一个很重要的应用,比如某易推荐的歌曲呀,某宝推荐的购物清单呀等等,既然应该这么广泛,那就废话不多说,我们开始吧~1 定义推荐系统是个很有意思的问题,机器学习的学术会议上通常不太会关注推荐系统问题,但是在我们生活中却随处可见。同时对机器学习来说,特征是很重要的,选择的特征将对学习算法的性能有很大影响。因此,在机器学习中有一种大思想,针对一些问题,可以通过算法自动学习一套比较好的特征,从而代替手动设计,其中推荐系统就是类型设置的一个例子。那么什么是推荐系统问题呢?我们从一个例子开始定义推荐系统的问题。假使一个电影供应商有5部电影和4个用户,我们要求用户为电影打分。前三部电影是爱情片,后两部则是动作片,图中可以发现Alice和Bob似乎更倾向与爱情片,而Carol和Dave似乎更倾向与动作片,同时每个用户都并未给全部的电影都打过分。这时可以构建一个算法,预测每个人可能会给各自没看过的电影打多少分,并以此作为推荐的依据。下面引入一些相关参数::用户数量;:电影数量;:如果用户给电影评过分,则;:用户给电影的评分;:用户评过分的电影总数。2 特征与算法在一个基于内容的推荐系统算法中,对于用户希望推荐的电影有一些数据,而这些数据更准确地说就是相关的特征。假设每部电影都有两个特征,如代表电影的浪漫程度,代表电影的动作程度。那么每部电影都有一个特征向量,如是第一部电影的特征向量:[0.9 0]。基于这些特征来构建一个推荐系统算法,采用线性回归模型,我们可以针对每一个用户都训练一个线性回归模型,如是第一个用户的模型参数。于是就有::用户的参数向量;:电影的特征向量;对于用户和电影,我们预测评分为:;代价函数针对用户,该线性回归模型的代价为预测误差的平方和,加上正则化项:其中表示只计算那些用户评过分的电影。在一般的线性回归模型中,误差项和正则项应该都是乘以,在这里的话我们选择将去掉,同时也不会对方差项进行正则化处理。上面的代价函数只是针对一个用户的,为了学习所有用户,将所有用户的代价函数求和:如果要用梯度下降法来求解最优解,计算代价函数的偏导数后得到梯度下降的更新公式为:3 协同过滤在基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数。举一反三,如果我们拥有用户的参数,那么其实也可以学习得出电影的特征,有没有?!但是如果既没有用户的参数,也没有电影的特征,那么应该如何解决呢?不用担心,协同过滤算法闪亮登场~优化目标将同时针对和进行,对代价函数求偏导数的结果如下:注:在协同过滤算法中,通常不使用方差项,如果需要的话,算法会自动学得。 协同过滤算法使用步骤如下:1.初始为一些随机小值2.使用梯度下降算法最小化代价函数3.在训练完算法后,预测为用户给电影的评分通过这个学习过程获得的特征矩阵包含了有关电影的重要数据,可以用这些数据作为给用户推荐电影的依据。例如,如果一位用户正在观看电影,寻找另一部电影,依据两部电影的特征向量之间的距离大小,距离越小,那么就越符合该用户的品味。4 协同过滤算法协同过滤优化目标:给定,估计::给定,估计,同时最小化和:5 算法的向量化实现根据五部电影的数据集,将这些用户的电影评分,进行分组并存到一个矩阵中。由于数据集有五部电影和四位用户,那么这个矩阵Y就是一个5行4列的矩阵,同时包含了这些电影的用户评分数据:推出评分:找到相关影片:前期小Mi已经带大家对特征参数向量进行了学习,那么其实如何度量两部电影之间的相似性就很好解决啦。例如说:电影有一个特征向量,而另一部不同的电影,只要保证两部电影的特征向量之间的距离和很小,那就能很有力地表明电影和电影在某种程度上有相似,至少在某种意义上,某些人喜欢电影,或许更有可能也对电影感兴趣。也就是说,当用户在看某部电影的时候,如果需要找出5部与电影非常相似的电影,为了能给用户推荐5部新电影,我们需要做的是找出电影,在这些不同的电影中与我们要找的电影的距离最小,这样你就能给你的用户推荐几部不同的电影了。通过这个方法,相信大家可以知道,应该如何进行一个向量化的计算来对所有的用户和所有的电影进行评分计算,同时也能掌握通过学习特征参数,来找到相关电影和产品的方法。6 均值归一化用户评分数据:如果新增一个用户Sky,并且Sky没有为任何电影评分,那么我们以什么为依据为Sky推荐电影呢?首先需要对矩阵Y进行均值归一化处理,将每一个用户对某一部电影的评分减去所有用户对该电影评分的平均值:然后利用这个新的矩阵来训练算法,如果我们要用新训练出的算法来预测评分,则需要将平均值重新加回去,预测,而对于用户Sky,新模型会认为她给每部电影的评分都是该电影的平均分。好啦,对于推荐系统的学习就先到这咯~下周小Mi给大家安排大规模机器学习!我们,下周再见呦(挥手十分钟!) 
  • [其他] 基于强化学习的推荐研究综述
    摘要: 推荐系统致力于从海量数据中为用户寻找并自动推荐有价值的信息和服务,可有效解决信息过载问题,成为大数据时代一种重要的信息技术。但推荐系统的数据稀疏性、冷启动和可解释性等问题,仍是制约推荐系统广泛应用的关键技术难点。强化学习是一种交互学习技术,该方法通过与用户交互并获得反馈来实时捕捉其兴趣漂移,从而动态地建模用户偏好,可以较好地解决传统推荐系统面临的经典关键问题。强化学习已成为近年来推荐系统领域的研究热点。文中从综述的角度,首先在简要回顾推荐系统和强化学习的基础上,分析了强化学习对推荐系统的提升思路,对近年来基于强化学习的推荐研究进行了梳理与总结,并分别对传统强化学习推荐和深度强化学习推荐的研究情况进行总结;在此基础上,重点总结了近年来强化学习推荐研究的若干前沿,以及其应用研究情况。最后,对强化学习在推荐系统中应用的未来发展趋势进行分析与展望。http://www.jsjkx.com/CN/10.11896/jsjkx.210200085
  • [技术干货] 基于MindSpore详解
    相信大家都在淘宝购买过相关的商品。比如某一天用户购买了一台台式主机后,淘宝会立刻给该用户推送与电脑相关的商品,例如电脑显示屏,键盘和鼠标等等。这些推荐的物品完全是淘宝根据大量的点击数据去学习到的。比如,在100个人中,有99个人在买了电脑之后,还会去购买鼠标,键盘,无线网卡等等。 也就是说,用户最近是否买了电脑是一个非常强的信号,暗示着如果用户最近买了电脑,那么用户再次购买电脑显示屏,键盘等物品时的概率非常高,那么这个时候推荐系统及时的去推荐这些物品给用户,用户可能很可能会购买这些物品,这些商铺也能提高自身的销量。 因此,可以通过特征工程生成很多个这样强关联的信号,提升推荐系统的性能。除了电商领域,推荐系统还广泛的应用在电影推荐,兴趣推荐等等。 相信最近大家都看过大火的<隐秘的角落>,可以堪称是今年最好看的国产剧。 在豆瓣上的评分如下:看完这部剧之后,还觉得不过瘾怎么办?往下翻,你就会惊喜的发现一系列的推荐:是不是感觉推荐的电影都很符合自己的口味?<隐秘的角落>属于悬疑类的连续剧,而下面推荐的相关剧集也大多属于这个风格。这个例子也同样引出了推荐系统中一个重要的分支——协同过滤它主要可以分为基于用户的,基于物品的和基于模型的协同过滤算法。 基于用户的协同过滤算法的核心思想是: 给当前用户推荐相似的用户看过的物品。例如,用户A看过了<白夜追凶>和<无证之罪>,而资深悬疑剧爱好者不仅看过这两部剧,还看过了<非自然死亡>和<我们与恶的距离>。 那么根据一定的相似度算法,在所有的用户中找到和用户A最相似的用户,比如我们找到了用户B,将用户B看过的另外两部剧推荐给了用户A,这样一次推荐过程就完成了。推荐系统的另一个典型场景是广告点击率预估。 在我们浏览手机的应用商店时,经常可以看到商店会给我们推荐某些应用,某些推荐的应用往往是广告主通过付费来进行推广。为了提高广告投放的准确度,广告点击率预估模型需要评价用户点击某些应用的概率,将用户最可能点击的应用进行推送,达到准确的投放广告的目的。 一旦我们点击了其中的一个应用,商店就可以成功的向广告投放商进行收费,而广告主们也达到了应用推广的目的。除了上述领域,推荐系统还广泛的应用在生活中的方方面面,可以说是机器学习在工业界中最成功的落地场景之一了。美国著名的电影和电视节目提供商Netflix曾经发起了奖金为百万美元的推荐系统比赛,旨在提升推荐系统的准确度。在广告点击率预估的场景,性能提高了1%的模型往往可以为公司带来巨大的收入。算法原理介绍传统的推荐系统以协同过滤为代表,而随着深度学习的快速发展,越来越多的研究者尝试应用深度学习技术到推荐系统中。在此我们主要介绍其中的Wide&Deep网络。总体流程在此我们以APP商店中的推荐系统为例,其整体流程可以如下图所示给定一个查询,这个查询可能是用户相关的特征,推荐系统首先会从数据库中检索到查询相关的APP,由于APP的数量非常巨大,因此我们可以取最相关的100个检索结果作为候选APP,这一过程通常叫作 粗排 。然后将候选的100个APP送入排序模型中,此处的排序模型就是我们下面将要介绍的 Wide&Deep模型 ,这一过程也被叫作 精排 。排序完成后,我们可以将点击概率最高的APP放置于用户最容易注意到的地方。 无论用户是否点击了我们的推荐结果,我们都可以构造一个新的日志文件。 在累积了一定数量的日志文件后,就可以继续微调排序模型,提高模型的准确程度Wide&Deep模型Wide&Deep模型自从被提出后就引起来非常大的关注。正如其名,此模型主要可以分成两个部分,Wide部分和Deep部分。Wide模型Wide部分就是一个线性网络,和我们在初中学的多元线性方程是一样的,只不过其中的参数求解采用梯度下降的方式。 例如下式y=wx它的设计目的是 为了记住数据中特定的特征组合方式 。 例如前面介绍购买电脑的场景,购买了电脑主机的用户,再次购买显示器,键盘等物件的概率特别高。 因此可以将用户最近是否购买了电脑作为输入模型的输入,也就是特征。假设 当前wide网络只有一个特征 ,当该特征取1时,y=wx可以得到y=0.9(假设w的值是0.9),当该特征取0时,y=0。 y输出值越大,会增大模型对应用户点击概率的估计。回到我们APP应用推荐的场景中,可以看到图右侧的Cross Product Transformation,就是我们的wide部分的输入。 Cross Product Transformation是指特征交叉,即将User Installed App和Impression APP进行组合。例如用户手机已经安装了微信,且当前的待估计的APP为QQ,那么这个组合特征就是(User Installed App=’微信’,  Impression APP=’QQ’)。Deep模型介绍完Wide部分,我们重新回来再看下Deep部分。 Deep部分的设计是为了模型具有较好的泛化能力 ,在输入的数据没有在训练集中出现时,它依然能够保持相关性较好的输出 。Deep模型输入都是一些含义不是非常明显的特征 ,例如设备类型,用户统计数据等类别特征(Categorical Features)。 类别特征一般属于高维特征。例如手机的种类可能存在成千上万个,因此我们通常把这些类别特征通过 嵌入(Embedding) 的方式, 映射成低维空间的参数向量 。 这个向量可以被认为表示了原先这个类别特征的信息。 对于连续特征,其数值本身就具备一定的含义,因此可以直接将和其他嵌入向量进行拼接。在拼接完成后,可以得到大致为1200维度的向量 。 将其作为三层全连接层网络的输入,并且选择Relu作为激活函数,其中每层的输出维度分别为[1024, 512, 256]。输出层在广告点击率预估的场景中, 模型的输出是一个0~1之间的值 , 表示当前候选APP被点击的概率 。 因此可以采用逻辑回归函数,将Wide&Deep部分的输出压缩到0~1在之间。首先, Deep部分的输出是一个256维度的向量 ,可以通过一个线性变换将其映射为维度为1的值,然后 和Wide部分的输出进行求和,将求和后的结果输入到逻辑回归函数中。代码实践在介绍完模型之后,现在开始动手实践了,由于谷歌公司并没有将其在论文中使用的APP商店数据集进行公开,因此我们现在采用Criteo公司发布在Kaggle的广告点击率预估数据集Criteo。对应的Mindpsore代码可以在此处找到:https://gitee.com/mindspore/mindspore/tree/master/model_zoo/wide_and_deep其中包含了模型的定义、训练以及数据的预处理过程。数据处理在模型定义前,我们需要对数据进行预处理。数据处理的目的是将数据集中的特征取值映射为数值id,并且去除一些出现次数过少的特征值,避免特征值出现次数过少,导致当特征值对应的参数向量的更新次数过少,影响模型的精度。Criteo数据集由13类连续特征和26列类别特征,已经通过哈希方式映射为了32位数值。对应的标签(label)的取值为0和1。数据处理的核心思路如下图所示,针对类别特征,建立一个词表,里面记录着每次出现的特征取值的编号。 然后再遍历每一列的特征取值,将原始的特征值根据词表映射为对应的id。还记得之前提到过的低维嵌入过程吗?映射操作是为了模型中的嵌入向量查找而准备的。例如,输入数据中的A,B,C被映射为了0,1,2。而0,1,2分别表示在嵌入矩阵中(Embedding Table)的第0行,第1行和第2行。将Criteo数据集下载后解压 ,可以看到train.txt和test.txt文件。 查看train.txt中的文件, 可以看到其中某些行存在缺失 。我们可以调用model_zoo/wide_and_deep/src/preprocess_data.py进行数据的下载和处理, 对于缺失值,可以将其标记为OOV(Out Of Vocabulary)对应的id模型定义介绍完数据处理后,我们在此开始 定义模型 。 模型的核心代码在mindspore仓库下model_zoo/wide_and_deep/src/wide_and_deep.py在MindSpore中,网络的定义方式和Pytorch比较接近,先定义定义的操作,然后再construct函数中对调用对应的操作对输入进行处理。首先我们再回忆下 Wide&Deep网络 ,它由一个Wide部分和Deep部分。 其中 Wide部分是一个线性网络 。在实现上,我们将线性网络中的权重视为维度为1,通过嵌入矩阵查找的方式即可获得输入x对应的权重,然后将其和输入的mask相乘,将结果求和。值得注意的是, 我们将连续特征和类别特征进行等同处理,因此这里的mask是为了将连续特征和类别特征进行区而设计的 。 连续特征mask中的值即为连续特征值,类别特征mask中的值为1 。 Wide部分的核心代码如下所示,我们定义个名为self.wide_w的权重,它的形状为[词表大小,1]。class WideDeepModel(nn.Cell):    def __init__(self, config):        super(WideDeepModel, self).__init__()        …        init_acts = [('Wide_w', [self.vocab_size, 1], self.emb_init),                     ('V_l2', [self.vocab_size, self.emb_dim], self.emb_init),                     ('Wide_b', [1], self.emb_init)]        var_map = init_var_dict(self.init_args, init_acts)        self.wide_w = var_map["Wide_w"]        self.wide_b = var_map["Wide_b"]        self.embeddinglookup = nn.EmbeddingLookup()        self.mul = P.Mul()        self.reduce_sum = P.ReduceSum(keep_dims=False)        self.reshape = P.Reshape()        self.square = P.Square()    def construct(self, id_hldr, wt_hldr):        mask = self.reshape(wt_hldr, (self.batch_size, self.field_size, 1))        # Wide layer        wide_id_weight = self.embeddinglookup(self.wide_w, id_hldr, 0)        wx = self.mul(wide_id_weight, mask)        wide_out = self.reshape(self.reduce_sum(wx, 1) + self.wide_b, (-1, 1))        out = wide_out现在我们开始定义Deep部分。Deep部分同样有一个嵌入矩阵查找,以及5层的全连接层构成。<mpchecktext contenteditable=“false”class WideDeepModel(nn.Cell):    def __init__(self, config):        super(WideDeepModel, self).__init__()        …        init_acts = [('Wide_w', [self.vocab_size, 1], self.emb_init),                     ('V_l2', [self.vocab_size, self.emb_dim], self.emb_init),                     ('Wide_b', [1], self.emb_init)]        var_map = init_var_dict(self.init_args, init_acts)        self.wide_w = var_map["Wide_w"]        self.wide_b = var_map["Wide_b"]        self.embedding_table = var_map["V_l2"]        self.dense_layer_1 = DenseLayer(self.all_dim_list[0],                                        self.all_dim_list[1],                                        self.weight_bias_init,                                        self.deep_layer_act,                                        convert_dtype=True, drop_out=config.dropout_flag)        self.dense_layer_2 = DenseLayer(self.all_dim_list[1],                                        self.all_dim_list[2],                                        self.weight_bias_init,                                        self.deep_layer_act,                                        convert_dtype=True, drop_out=config.dropout_flag)        self.dense_layer_3 = DenseLayer(self.all_dim_list[2],                                        self.all_dim_list[3],                                        self.weight_bias_init,                                        self.deep_layer_act,                                        convert_dtype=True, drop_out=config.dropout_flag)        self.dense_layer_4 = DenseLayer(self.all_dim_list[3],                                        self.all_dim_list[4],                                        self.weight_bias_init,                                        self.deep_layer_act,                                        convert_dtype=True, drop_out=config.dropout_flag)        self.dense_layer_5 = DenseLayer(self.all_dim_list[4],                                        self.all_dim_list[5],                                        self.weight_bias_init,                                        self.deep_layer_act,                                        use_activation=False, convert_dtype=True, drop_out=config.dropout_flag)        self.embeddinglookup = nn.EmbeddingLookup()        self.mul = P.Mul()        self.reduce_sum = P.ReduceSum(keep_dims=False)        self.reshape = P.Reshape()        self.square = P.Square()        self.shape = P.Shape()        self.tile = P.Tile()        self.concat = P.Concat(axis=1)        self.cast = P.Cast()    def construct(self, id_hldr, wt_hldr):        """        Args:            id_hldr: batch ids;            wt_hldr: batch weights;        """        mask = self.reshape(wt_hldr, (self.batch_size, self.field_size, 1))        # Wide layer        wide_id_weight = self.embeddinglookup(self.wide_w, id_hldr, 0)        wx = self.mul(wide_id_weight, mask)        wide_out = self.reshape(self.reduce_sum(wx, 1) + self.wide_b, (-1, 1))        # Deep layer        deep_id_embs = self.embeddinglookup(self.embedding_table, id_hldr, 0)        vx = self.mul(deep_id_embs, mask)        deep_in = self.reshape(vx, (-1, self.field_size * self.emb_dim))        deep_in = self.dense_layer_1(deep_in)        deep_in = self.dense_layer_2(deep_in)        deep_in = self.dense_layer_3(deep_in)        deep_in = self.dense_layer_4(deep_in)        deep_out = self.dense_layer_5(deep_in)        out = wide_out + deep_out        return out, self.embedding_table我们采用交叉熵作为损失函数,Wide部分采用FTRL作为优化器。FTRL可以产生较好的稀疏权重,可以帮助筛选有价值的特征,并且可以压缩模型权重。Deep采用Adam优化器。<mpchecktext contenteditable=“false”模型训练在train_and_eval.py中的定义了数据,模型的初始化以及训练过程,在定义完模型中,可以将初始化的网络送入Model类中,这个类和Tensorflow中Estimator比较接近,可以通过简单的接口实现网络的训练(model.train)和评估(model.eval)。model_zoo/wide_and_deep/train_and_eval.py另外,此函数中定义了一些回调函数https://www.mindspore.cn/tutorial/-zhCN/master/advanced_use/customized_debugging_information.html可以打印损失值等相关信息。def test_train_eval(config):    """    test_train_eval    """    data_path = config.data_path    batch_size = config.batch_size    epochs = config.epochs    ds_train = create_dataset(data_path, train_mode=True, epochs=epochs, batch_size=batch_size)    ds_eval = create_dataset(data_path, train_mode=False, epochs=epochs + 1, batch_size=batch_size)    print("ds_train.size: {}".format(ds_train.get_dataset_size()))    print("ds_eval.size: {}".format(ds_eval.get_dataset_size()))    net_builder = ModelBuilder()    train_net, eval_net = net_builder.get_net(config)    train_net.set_train()    auc_metric = AUCMetric()    model = Model(train_net, eval_network=eval_net, metrics={"auc": auc_metric})    eval_callback = EvalCallBack(model, ds_eval, auc_metric, config)    callback = LossCallBack(config=config)    ckptconfig = CheckpointConfig(save_checkpoint_steps=ds_train.get_dataset_size(), keep_checkpoint_max=5)    ckpoint_cb = ModelCheckpoint(prefix='widedeep_train', directory=config.ckpt_path, config=ckptconfig)    out = model.eval(ds_eval)    print("=====" * 5 + "model.eval() initialized: {}".format(out))    model.train(epochs, ds_train,                callbacks=[TimeMonitor(ds_train.get_dataset_size()), eval_callback, callback, ckpoint_cb])模型评估一旦训练完成后,就可以装载模型参数进行评估。评估网络和训练网络类似,只不过输出经过了一个Sigmoid层。<mpchecktext contenteditable=“false”class PredictWithSigmoid(nn.Cell):    def __init__(self, network):        super(PredictWithSigmoid, self).__init__()        self.network = network        self.sigmoid = P.Sigmoid()    def construct(self, batch_ids, batch_wts, labels):        logits, _, _, = self.network(batch_ids, batch_wts)        pred_probs = self.sigmoid(logits)        return logits, pred_probs, labels采用AUC作为评价指标。AUC广泛的应用在分类模型的评估中,可以较好的反映模型学习的好坏,其值在0~1之间,值越高,模型的性能越好。总结本文内容介绍了推荐系统的原理和实践代码。首先讲述了推荐系统在我们生活中的应用场景,并且介绍了推荐系统的核心原理。然后详细介绍了Wide&Deep网络以及相关的代码实践,期望可以帮助大家入门<参考文献[1] Cheng H T, Koc L, Harmsen J, et al. Wide & deep learning for recommender systems[C]//Proceedings of the 1st workshop on deep learning for recommender systems. 2016: 7-10.[2]https://www.mindspore.cn/tutorial/-zhCN/master/advanced_use/customized_debugging_information.html————————————————原文链接:https://blog.csdn.net/weixin_45212921/article/details/107539816
  • [其他] 在基于会话的图神经推荐系统中加入停留时间
    视频:https://www.bilibili.com/video/BV1QK4y1J7SQ/源代码及论文:https://github.com/Peterhd1/-(P.s. 以下出现的“我们”其实都只有“我”,我加个“们”字会显得不那么孤独,也笃定一点。)介绍推荐系统可以帮助用户在庞大数量的信息洪流中找到自己需要的信息。作为推荐系统的一个重要分支,基于会话的推荐系统(SBRS)主要利用用户的匿名数据(比如用户的点击流信息)推荐产品给用户。相比传统的基于内容的推荐系统(CBRS)和基于协同过滤的推荐系统(CF),SBRS更加关注用户眼下的需求。比如说,传统推荐系统会因为你很久之前搜索了笔记本而在你打开商店时继续推荐笔记本,而SBRS则会根据你目前搜索的商品而推荐同类型商品。SBRS的好处在于,用户并不需要注册就能得到精准的推荐商品。在信息法律越来越健全,用户对个人隐私越来越关注的今天,获取用户实名数据会变得更加昂贵,这种不需要用户信息就能进行精准推荐的系统会在未来更加流行。目前比较成熟的SBRS主要是RNN推荐系统,该算法在2016年左右开始逐渐成为了SBRS的主流。然而,以RNN为基础的SBRS也存在一些缺陷,比如它会忽略一些远距离的物品转换(比如你搜索了烤箱,通常系统会给你推送更多烤箱,而不是推荐隔热手套和烤盘)。图神经(GNN)推荐系统用它独特的图神经构造弥补了这一缺陷,这也是我为什么对GNN推荐系统产生兴趣。在进一步的研究中我发现,在RNN-SBRS的发展过程中,停留时间的加入提高了RNN-SBRS的精准度。于是我开始思考,在GNN-SBRS中也加入停留时间是否也可以提高GNN-SBRS的精准度。抱着这一猜想,我开始探寻在GNN中加入停留时间的可能性。由于目前对GNN推荐系统的认识还处于比较初级的阶段,本篇论文主要探讨了以下三点:1.如何在会话图(session graph)中加入停留时间?2.停留时间是否为图神经推荐系统提供了更多的推荐信息?3.在GNN-SBRS中加入停留时间是否可以提高推荐准确度?