前沿重器[56] | google search: 用emb模型做个性化语言prompt

前沿重器

栏目主要给大家分享各种大厂、顶会的论文和分享,从中抽取关键精华的部分和大家分享,和大家一起把握前沿技术。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。(算起来,专项启动已经是20年的事了!)

2023年文章合集发布了!在这里:又添十万字-CS的陋室2023年文章合集来袭

往期回顾

大模型具备很强的信息推理能力,但在很多实验经验看来,直接把特征通过文本prompt的方式扔进大模型内,大模型的理解并不是很好,一方面是对特征并不能有很好的理解,另一方面现有特征到具体任务目标的映射关系模型也不好理解,因此我们需要探索把特征放入到模型的方式,并训练出针对目标的映射关系。出于这个目标,今天给大家介绍的文章是来自google search的解决方案。

  • User Embedding Model for Personalized Language Prompting

  • https://arxiv.org/abs/2401.04858

  • 中文:https://www.yiyibooks.cn/arxiv/2401.04858v1/index.html

  • 参考:https://mp.weixin.qq.com/s/rxOeO8-mz875py5AoDDT0g

懒人目录:

  • 背景和核心共享

  • UEM

  • soft prompt

  • 消融实验

  • 个人评价

背景和核心贡献

论文把场景定在了推荐系统,这个非常好理解,毕竟推荐系统应该是一个比较好的入手点,物料中有自由文本也有一些比较固定的特征,以文章的电影推荐为例,文本类似电影名、电影介绍,固定特征有时间、打分,演员等,简单的推荐模型可能并不那么好涵盖这些内容,尤其是文中提到的“longer user histories”,只要需要输入的内容足够长,模型就不那么容易吃下,因此,文章提到的一个方式就是embedding输入。

本文的核心共享如下:

  • 构造新的用户表征模块,即user embedding model(UEM)。

  • 通过soft prompt的方式往模型内加入客户信息。

  • 一系列的消融实验。

下面我也是按照这3个方面来将具体文章内部是怎么做的。

UEM

文章内,UEM的流程写在了多个部分,通过拼凑和理解,我的理解是作者使用T5来将文字化的电影进行表征,具体流程如下:

  • 首先将所有特征都转为结构化的文字结构,目前为3个字段:电影/流派、评分、电影描述。

  • 用FlanT5进行转化。(文章中有提到还需要训练)注意此处生成的话是上面一个字段一个embedding,因此会有3个embedding。

  • 输出会进入一系列的transformer network,最终会被简化为1个embedding,这个就用于进行用户历史的表征。

soft prompt

soft prompt不是一个很新的技术了,在轻量化微调的系列里,其中就有一个流派prompt-tuning是通过在文本prompt前增加几个轮空的token,训练的时候只训练这几个token的embedding来对模型进行小幅调整,算是当年lora的有力竞争对手。

本身这一节论文展开讲的并不是很多,同时论文里也没提供代码,所以此处我按照我的理解简单讲一下这块的实现。其实transformers内支持这种自定义tokenizer-embedding的方案。model加载后提供了一个“set_input_embeddings”这个函数。(下面这部分参考了博客https://zhuanlan.zhihu.com/p/532153343)

首先是自己先定一个适合自己场景的soft-embedding模块。

import torch
import torch.nn as nnclass SoftEmbedding(nn.Module):def __init__(self, wte: nn.Embedding,n_tokens: int = 10, random_range: float = 0.5,initialize_from_vocab: bool = True):"""appends learned embedding to Args:wte (nn.Embedding): original transformer word embeddingn_tokens (int, optional): number of tokens for task. Defaults to 10.random_range (float, optional): range to init embedding (if not initialize from vocab). Defaults to 0.5.initialize_from_vocab (bool, optional): initalizes from default vocab. Defaults to True."""super(SoftEmbedding, self).__init__()self.wte = wteself.n_tokens = n_tokensself.learned_embedding = nn.parameter.Parameter(self.initialize_embedding(wte,n_tokens, random_range, initialize_from_vocab))def initialize_embedding(self, wte: nn.Embedding,n_tokens: int = 10, random_range: float = 0.5, initialize_from_vocab: bool = True):"""initializes learned embeddingArgs:same as __init__Returns:torch.float: initialized using original schemes"""if initialize_from_vocab:return self.wte.weight[:n_tokens].clone().detach()return torch.FloatTensor(n_tokens, wte.weight.size(1)).uniform_(-random_range, random_range)def forward(self, tokens):"""run forward passArgs:tokens (torch.long): input tokens before encodingReturns:torch.float: encoding of text concatenated with learned task specifc embedding"""input_embedding = self.wte(tokens[:, self.n_tokens:])learned_embedding = self.learned_embedding.repeat(input_embedding.size(0), 1, 1)return torch.cat([learned_embedding, input_embedding], 1)

核心可以看forward函数,内部是先空出线面N个位置,后面的用原来的embedding,前面的用自己的embedding。

然后就是用set_input_embeddings来切换自己的embedding了。

from transformers import AutoConfig, AdamW, AutoTokenizer, AutoModel
import torch
import torch.nn as nn
from soft_embedding import SoftEmbeddingn_tokens = 20
initialize_from_vocab = True
tokenizer = AutoTokenizer.from_pretrained("nezha-base-wwm")
config = AutoConfig.from_pretrained("nezha-base-wwm", num_labels=num_class)
config.output_hidden_states = True  # 需要设置为true才输出
model = AutoModel.from_pretrained(self.model_path, config=config)
s_wte = SoftEmbedding(model.get_input_embeddings(), n_tokens=n_tokens, initialize_from_vocab=initialize_from_vocab)
model.set_input_embeddings(s_wte)
inputs = tokenizer("May the force be", return_tensors="pt")# need to pad attention_mask and input_ids to be full seq_len + n_learned_tokens
# even though it does not matter what you pad input_ids with, it's just to make HF happy
inputs['input_ids'] = torch.cat([torch.full((1,n_tokens), 50256), inputs['input_ids']], 1)
inputs['attention_mask'] = torch.cat([torch.full((1,n_tokens), 1), inputs['attention_mask']], 1)outputs = model(**inputs)

回到论文,这里实质上就是把预留token位置的embedding用用户表征画像来代替即可。至此可以理解,论文内的embedding结构是这样的:

57d8030bbe5ba89baf2ef15e628821da.png

内部还有没有其他的细节训练,我没有太看出来,不过端到端的训练还是有的,最终要求输出的是用户的偏好。

一系列的消融实验

作者先后在历史长度、语言模型选择、UEM的大小3个方面做了消融实验,说实话都有一定的实用价值,因为推荐系统对场景的灵活性还是敏感的,绝对数估计是很难参考,不过一些类似相关性啥的,应该还是有参考价值的。

  • 首先是历史长度,在语言模型下,大体积的模型似乎能吃下更多历史信息,并最终提升预测效果。

  • 语言模型的选择上,FlanT5得到最好的效果。(注意,此处并没有尝试一些被广泛使用的所谓的大模型)

  • UEM的大小,目前还是能简单看到一些正相关性,层数越多似乎效果会越好。(此处有个小问题,为什么准召求的F1会比准召都要小,论文里的所有值都这样,是因为按照样本加权吗,好像也有些奇怪)

70f4c7b3988ed3c8ae274fc326d99868.png

个人评价

先说优点吧,本文确实给我们提供了不少的思路用于把特征放入NLP类型的模型中,确实给到了不少的启发,尤其是这个通过soft-prompt的方式来做的,收益还是不小,算是给我们拓宽思路了。

论文写的时间线是在24年1月,当时应该已经有比较多的大模型出现,但是作者似乎都没选,多少有些可惜,不知道是什么原因。

从模型层面,我们直接类比prompt-tuning,作为轻量化微调的其中一个代表,其实可以看得出来,对模型最终效果的改动还是会比较小,而且这个embedding在很上游,更大幅度地削弱了这些特征对最终预测的影响大小,可能还有一些能加入到模型更后期的方案,可以进一步优化。

而另一方面,UEM这里,用的是T5把文本化后的信息放入,多少还是会有些局限性,多特征、多种数据类型的特征其实并不好放入,一方面是NLP模型本身特征表征能力,另一方面是模型的信息容量,这块应该还有更多的研究和尝试空间,例如既然是推荐系统,更多推荐系统下的表征都值得尝试,但无论如何,这篇文章都算是给了个思路,让我们能更加深入思考和尝试。

1d6ff28fac2411c100b3ccf36bf91245.png

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

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

相关文章

【adb】iqoo系统精简垃圾内置应用

免责声明 这个得谨慎点,虽然我验证过两部手机和不同版本的系统,但是总会有特殊的存在、 本教程来自于互联网搜集整理, 按照本教程造成的用户设备硬件或数据损失,本人概不承担任何责任,如您不同意此协议,请不…

用最小的代价解决mybatis-plus关于批量保存的性能问题

1.问题说明 问题背景说明,在使用达梦数据库时,mybatis-plus的serviceImpl.saveBatch()方法或者updateBatchById()方法的时候,随着数据量、属性字段的增加,效率越发明显的慢。 serviceImpl.saveBatch(); serviceImpl.updateBatch…

使用 EasyExcel 提升 Excel 处理效率

目录 前言1. EasyExcel 的优点2. EasyExcel 的功能3. 在项目中使用 EasyExcel3.1 引入依赖3.2 实体类的定义与注解3.3 工具类方法的实现3.4 在 Controller 中使用 4. 总结5. 参考地址 前言 在日常开发中,Excel 文件的处理是不可避免的一项任务,特别是在…

Linux上的C语言编程实践

说明: 这是个人对该在Linux平台上的C语言学习网站笨办法学C上的每一个练习章节附加题的解析和回答 ex1: 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后运行它看看发生了什么。 vim ex1.c打开 ex1.c 文件。假如我们删除 return 0…

Elasticsearch vs 向量数据库:寻找最佳混合检索方案

图片来自Shutterstock上的Bakhtiar Zein 多年来,以Elasticsearch为代表的基于全文检索的搜索方案,一直是搜索和推荐引擎等信息检索系统的默认选择。但传统的全文搜索只能提供基于关键字匹配的精确结果,例如找到包含特殊名词“Python3.9”的文…

SpringCloudAlibaba学习路线:全面掌握微服务核心组件

大家好,我是袁庭新。 星友给我留言说:“新哥,我最近准备开始学Spring Cloud Alibaba技术栈,计划冲刺明年的春招,想全面掌握微服务核心组件。但不知从何学起,没有一个有效的学习路线,我需要学习…

Java阶段三06

第3章-第6节 一、知识点 理解MVC三层模型、理解什么是SpringMVC、理解SpringMVC的工作流程、了解springMVC和Struts2的区别、学会使用SpringMVC封装不同请求、接收参数 二、目标 理解MVC三层模型 理解什么是SpringMVC 理解SpringMVC的工作流程 学会使用SpringMVC封装请求…

租赁系统|租赁小程序|租赁小程序成品

租赁系统是现代企业管理中不可缺少的数字化工具,它通过高效的信息整合与流程管理,为企业带来极大的便利和效益。一个完善的租赁系统开发应具备以下必备功能: 一、用户管理 用户管理模块负责系统的访问控制,包括用户注册、登录验证…

product/admin/list?page=0size=10field=jancodevalue=4562249292272

文章目录 1、ProductController2、AdminCommonService3、ProductApiService4、ProductCommonService5、ProductSqlService https://api.crossbiog.com/product/admin/list?page0&size10&fieldjancode&value45622492922721、ProductController GetMapping("ad…

java+ssm+mysql美妆论坛

项目介绍: 使用javassmmysql开发的美妆论坛,系统包含超级管理员,系统管理员、用户角色,功能如下: 用户:主要是前台功能使用,包括注册、登录;查看论坛板块和板块下帖子;…

Java-21 深入浅出 MyBatis - 手写ORM框架2 手写Resources、MappedStatment、XMLBuilder等

点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatis&#xff…

专业135+总分400+华中科技大学824信号与系统考研经验华科电子信息与通信工程,真题,大纲,参考书。

考研成功逆袭985,上岸华科电子信息,初试专业课824信号与系统135,总分400,成绩还是很满意,但是也有很多遗憾,总结一下自己的复习,对于大家复习给些参考借鉴,对自己考研画个句号&#…

ElementUI:el-tabs 切换之前判断是否满足条件

<div class"table-card"><div class"card-steps-class"><el-tabsv-model"activeTabsIndex":before-leave"beforeHandleTabsClick"><el-tab-pane name"1" label"基础设置"><span slot&…

java中的数组(2)

大家好&#xff0c;我们今天继续来看java中数组这方面的知识点&#xff0c;那么话不多说&#xff0c;我们直接开始。 一.数组的使用 1.数组中元素访问 数组在内存中是一段连续的空间,空间的编号都是从0开始的,依次递增,数组可以通过下标访问其任意位置的元素. 也可以进行修改…

#渗透测试#红蓝对抗#SRC漏洞挖掘# Yakit(6)进阶模式-Web Fuzzer(下)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

Python 爬虫 (1)基础 | XHR

一、XHR 1、概念 XHR&#xff0c;全称XMLHttpRequest&#xff0c;是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。它允许网页的JavaScript代码与服务器进行异步通信&#xff0c;即在发送请求后&#xff0c;浏览器不会阻塞用户的后续操作&#xff0…

二进制部署Prometheus+grafana+alertmanager+node_exporter

Prometheus 是一个开源的监控和告警工具包&#xff0c;旨在提供高可靠性和可扩展性。它最初由 SoundCloud 开发&#xff0c;现已成为云原生计算基金会&#xff08;CNCF&#xff09;的一部分。以下是 Prometheus 的一些关键特性和概念&#xff1a; 1. **时间序列数据库**&#…

工业智能网关如何为企业实现智能制造赋能?

在数字化转型的浪潮中&#xff0c;工业智能网关作为连接物理世界与数字世界的桥梁&#xff0c;正逐步成为智能制造领域的核心组件。本文将通过一个实际使用案例&#xff0c;深入剖析工业智能网关如何助力企业实现生产流程的优化、数据的高效采集与分析&#xff0c;以及智能化决…

算法设计6_随机化算法

随机化算法 随机算法的随机性&#xff08;基本特征&#xff09; – 对于同一实例的多次执行, 效果可能完全不同 – 时间复杂性的一个随机变量 – 解的正确性和准确性也是随机的 数值随机化算法 随机数值算法 – 主要用于数值问题求解 – 算法的输出往往是近似解 – 近似…

使用mmdeploy框架C++预测mask并绘制最小外接矩形

目录 解决目标 逻辑思路 代码实现 第1部分 第2部分 解决目标 这段代码实现了&#xff0c;一个基于深度学习的图像检测程序。它使用mmdeploy框架&#xff0c;加载一个预训练的模型【实例分割模型】来检测图像中的物体。 逻辑思路 程序首先加载模型&#xff0c;然后&#…