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

大模型向量数据库推荐算法

前沿重器

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

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

往期回顾

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

懒人目录:

  • 背景和核心共享
  • 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 nn  
  
class 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 embedding  
            n\_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 = wte  
        self.n_tokens = n_tokens  
        self.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 embedding  
        Args:  
            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 pass  
        Args:  
            tokens (torch.long): input tokens before encoding  
        Returns:  
            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 SoftEmbedding  
  
n_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结构是这样的:

picture.image

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

一系列的消融实验

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

  • 首先是历史长度,在语言模型下,大体积的模型似乎能吃下更多历史信息,并最终提升预测效果。
  • 语言模型的选择上,FlanT5得到最好的效果。(注意,此处并没有尝试一些被广泛使用的所谓的大模型)
  • UEM的大小,目前还是能简单看到一些正相关性,层数越多似乎效果会越好。(此处有个小问题,为什么准召求的F1会比准召都要小,论文里的所有值都这样,是因为按照样本加权吗,好像也有些奇怪)

picture.image

个人评价

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

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

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

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

picture.image

0
0
0
0
关于作者
相关资源
IDC 大模型应用落地白皮书
大模型技术已深度融入业务实践,各企业期望其释放更大商业价值。 但大模型落地之路面临许多挑战和顾虑。 如何精准对接业务需求与发展蓝图,制定切实可行的大模型落地策略? IDC发布首个大模型应用策略与行动指南 一为您揭晓一
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论