关于人工智能:使用三重损失和孪生神经网络训练大型类目的嵌入表示

38次阅读

共计 5907 个字符,预计需要花费 15 分钟才能阅读完成。

大型网站类目目录的数量很大,个别都无奈进行手动标记,所以了解大型目录的内容对在线业务来说是一个重大挑战,并且这使得对于新产品发现就变得十分艰难,但这个问题能够通过应用自监督神经网络模型来解决。

在过来咱们始终应用人工在零碎中进行产品的标记,这样确实能够解决问题然而却消耗了很多人力的老本。如果可能创立一种机器学习为根底的通用的形式,在语义上主动的关联产品,并深刻理解现有的目录内容,就能够将产品举荐、搜寻、促销流动和经营情报变为自动化的操作。

在这篇文章中,形容了一种通过在网站外部的用户搜寻数据上应用自监督学习技术来训练高质量的可推广嵌入的办法。除此以外本位还列举了一些代替办法,并具体介绍了咱们所选解决方案的模型训练和评估过程和各个办法的优略比照。

大型网站的类目问题

对于大型网站来说,网站目录的内容并不是恒定的,如果咱们增加了新的类目,对于机器学习来说则须要训练新的模型,有没有一种可能在不建设定制模型的状况下解决目录的办法呢?首先,理解类目标内容对于经营业务和面向消费者内容搜寻很重要,因为:

  • 类目能够依据消费者的已知偏好进行新的举荐
  • 当消费者与新商店互动时,将产品品举荐给他们
  • 在搜寻查问时举荐更相干商店和产品
  • 主动举荐相似消费者最近订单历史的促销
  • 理解消费者在搜寻后购买哪些物品

等等。。

在同一潜在空间中查问(绿色)和产品(黄色)示意的示例。咱们想学习一个嵌入示意模式,其中雷同色彩的线具备高余弦相似性(之间的角度很小),而不同色彩的界限则具备很小的余弦相似性(它们之间的大角度)。这意味着咱们须要将查问和我的项目编码到同一空间中,并为它们两个都学习高质量的示意。

在搜寻的背景下,咱们还心愿可能创立一个能够与产品和商铺嵌入进行比拟的可查问嵌入。模型须要将查问和产品置于雷同的潜在空间(上图 1)以使其可比。一旦将查问“mexican”和产品“taco”进行嵌入,嵌入空间就能够通知咱们二者是相干的(余弦类似度)。咱们还须要将商铺和购买者嵌入在同一潜在空间中,这使咱们可能应用嵌入形式包含目录常识来进行商铺的举荐。

通过定义消费者嵌入 (蓝色) 为他们的商品嵌入 (绿色) 的平均值,咱们能够理解消费者的不同偏好。在上图中,常常购买墨西哥菜的消费者比常常购买亚洲菜的消费者更靠近墨西哥菜。同时购买这两种食品的消费者将会在墨西哥食品和亚洲食品集群之间造成一种嵌入。

所以咱们要解决的问题是如何应用无限的标记数据无效地在十分常见的类上训练,这就须要利用自监督的办法来训练嵌入。但在开始之前,咱们先回顾一下传统的技术来训练嵌入,这样能够让咱们了解为什么它们不能解决问题。

构建嵌入的技术的回顾

对于下面的用例来说,传统的办法包含对条目 id 进行 Word2vec 训练或对深度学习分类器进行训练并取最初一层线性层的输入。在自然语言解决 (NLP) 中,对 BERT 这样的大型预训练模型进行微调也变得很常见。然而对于一直倒退的大而稠密的目录问题,咱们将一一介绍这些办法:

计划 1: 在实体 id 上嵌入 Word2vec

能够应用拜访或购买等客户行为对任意一组实体 id 进行 Word2vec 嵌入训练。这些嵌入通过假如在同一会话中与客户交互的实体彼此相干来学习 id 之间的关系,这与 Word2vec 散布假如相似。商店和客户的行为定期训练这类嵌入,以便在举荐和其余个性化应用程序中应用。见下图

Word2vec 嵌入在为大型目录保留语义相似性方面存在一些缺点。当新实体增加到目录中时,它们须要定期进行再训练。如果每天都要增加数百万个产品,每天从新训练这些嵌入在计算上是十分低廉的。应用这种办法训练的嵌入容易呈现稠密性问题,因为很少与客户交互的 id 没有失去很好的训练。

计划 2: 基于监督工作的深度神经网络训练嵌入

深度神经网络在分类工作上的训练误差较低,能够学习到高质量的指标类示意。网络最初一层暗藏层的输入能够被视为原始输出的嵌入。对于多样化和大型高质量的标记数据集,这种办法能够十分无效地学习高质量的嵌入,并能够在分类工作中重用。

这种训练方法并不总是保障底层嵌入具备良好的度量个性。因为咱们的优先级是上游应用程序的易用性,心愿这些嵌入能够轻松地应用简略的指标,如余弦类似度进行比拟。因为这种办法是须要监督的,学习度量的品质在很大水平上取决于训练集标注的品质。咱们须要确保数据集具备良好的负样本,以确保模型可能学会辨别密切相关的标签。对于数据样本无限的罕见类,这个问题就变得尤其重大。所以无监督的解决方案能够通过从未标记的数据主动生成样本并学习标签的示意来躲避这个问题。

计划 3: 微调一个事后训练好的语言模型,比方 BERT

随着最近在大型语料库上训练大型 NLP 模型方面获得的停顿,通过迁徙学习对这些模型进行微调学习针对特定工作的嵌入曾经成为一种风行的办法(下图 5 中的示例架构)。BERT 是一种风行的预训练模型,这种办法能够应用开源库间接实现,并且能够克服数据稠密的问题,并且作为一个十分良好的基线模型。

尽管 BERT 嵌入是在基线上的一个显著改良,但因为模型规模的起因它的训练和推理十分耗时。即便应用蒸馏模型(如 DistilBERT 或 ELECTRA),也可能比小得多的定制模型慢得多。另外就是如果有足够多的畛域特定数据,即便它是未标记的,与事后训练的语言模型相比,自监督办法对于特定工作具备更好的度量属性。

通过自监督学习训练嵌入

在调研了上述办法之后,咱们应用自我监督的办法基于类目名称和搜寻查问来训练嵌入。通过应用子词信息,如字符级信息,这些嵌入也能够推广到训练数据中没有呈现的文本。

为了保障良好的度量性能,应用了带有三重损失的孪生神经网络 (也称为 Siamese Neural Network) 架构。三重损失试图在潜在空间中把类似的样本挤到一起,把不同的样本离开。孪生神经网络能够确保用于查问和产品文本的编码以一种放弃类似示例之间间隔的形式嵌入到雷同的潜在空间中。

构建数据集

为了训练三重损失,咱们须要一个构造为 <anchor, positive, negative> 的数据集。将 anchor 定义为原始查问文本,并将查问的“相干”和“不相干”别离视为 positive 和 negative。

为了结构这个数据集(下图 6 中的示例),须要开发一组启发式办法来制订训练任务。应用以下启发式办法别离确定正训练样本和负训练样本对应的相干和不相干我的项目:

如果用户搜寻了查问 Q,而后在同一个会话中立刻购买了 X,并且 X 是购物车中最贵的商品,那么商品 X 与查问 Q 相干

这种对于正样本的启发式办法确保咱们只取购物车中的次要商品,咱们认为它可能是最相干的

如果 X 是在查问 R 中购买的,Q 和 R 的 Levenshtein 间隔是 > 5,那么商品 X 对于查问 Q 来说是不相干的

这种针对负样本的启发式办法保障了为相似查问购买的商品 (例如“burger”和“burgers”) 不会被视为无关的,生成高质量的负样本对于避免模式解体是至关重要的。在这个例子中,即便是文本中这种简略的启发式和天然的变动对于训练来说也足够了,然而可能还有更好的办法须要咱们去钻研。

咱们还对输出进行了最小的规一化,将所有字符串小写并删除标点符号。这使得经过训练的模型可能适应拼写错误和其余语言的天然变动。

为了确保模型能够推广到词汇表外标记的样本,咱们应用字符三元组序列来解决输出。咱们试验了多种代替标记计划(单词 ngram、字节对编码、WordPiece 和单词 + 字符 ngram),但发现三元组具备类似或更好的预测性能,能够更快地训练。

模型的架构

该模型是一个孪生网络(下图 8),它应用由深神经网络组成的编码器和输入最终嵌入的线性层。所有权重都在编码器之间共享。因为权重是在编码器之间共享的,所以所有头部的编码都进入雷同的潜在空间。编码器的输入用于计算三重损失。

损失计算如下:

L(a, p, n, margin) = max(d(a, p) -d(a, n) + margin, 0)

对于“Mexican”查问(红色),三重损失试图将 positive(黄色)的嵌入凑近,并将 negative(灰色)离开。

神经网络代码样本。在此处抽取编码器的详细信息,以阐明如何计算前向流传和损失。

classSiameseNetwork(torch.nn.Module):
   def__init__(self, learning_rate, transforms, model, **kwargs):
       super().__init__()

       self.learning_rate=learning_rate
       self.transforms=transforms
       self._encoder=model(**kwargs)
       self.loss=torch.nn.TripletMarginLoss(margin=1.0, p=2)

   defconfigure_optimizers(self):
       returntorch.optim.Adam(self.parameters(), lr=self.learning_rate)

   def_loss(self, anchor, pos, neg):
       returnself.loss(anchor, pos, neg)

   defforward(self, anchor, seq1, seq2):
       anchor=self._encoder(anchor)
       emb1=self._encoder(seq1)
       emb2=self._encoder(seq2)
       returnanchor, emb1, emb2

理论的编码器体系结构是双向 LSTM,而后是线性层。LSTM 负责将一系列字符的解决到向量中。

上面是编码器的代码

classLSTMEncoder(torch.nn.Module):
   def__init__(self, output_dim, n_layers=1, vocab_size=None, embedding_dim=None, embeddings=None, bidirectional=False, freeze=True, dropout=0.1):
       super().__init__()
       ifembeddingsisNone:
           self.embedding=torch.nn.Embedding(vocab_size, embedding_dim)
       else:
           _, embedding_dim=embeddings.shape
           self.embedding=torch.nn.Embedding.from_pretrained(embeddings=embeddings, padding_idx=0, freeze=freeze)

       self.lstm=torch.nn.LSTM(embedding_dim, output_dim, num_layers=n_layers, bidirectional=bidirectional, dropout=dropout, batch_first=True)
       self.directions=2ifbidirectionalelse1

       self._projection=torch.nn.Sequential(torch.nn.Dropout(dropout),
           torch.nn.Linear(output_dim*self.directions, output_dim),
           torch.nn.BatchNorm1d(output_dim),
           torch.nn.ReLU(),
           torch.nn.Linear(output_dim, output_dim),
           torch.nn.BatchNorm1d(output_dim),
           torch.nn.ReLU(),
           torch.nn.Linear(output_dim, output_dim, bias=False),
       )

   defforward(self, x):
       embedded=self.embedding(x) # [batch size, sent len, emb dim]
       output, (hidden, cell) =self.lstm(embedded)
       hidden=einops.rearrange(hidden, '(layer dir) b c -> layer b (dir c)', dir=self.directions)
       returnself._projection(hidden[-1])
  

模型评估

依据定性指标 (如对嵌入 UMAP 投影的评估) 和定量指标 (如基线 f1 分) 来评估模型。通过观察嵌入的 UMAP 投影来评估定性后果(下图)。能够看到类似的类被投射到彼此左近,这意味着嵌入能够很好地捕获语义相似性。

思考到定性评估的良好后果,咱们还在一些基线分类工作上对模型进行了更严格的基准测试,这样能够理解嵌入的品质以及在其余外部模型中应用它们的潜在收益。

模型的 f1 评分比基线 (FastText 分类器) 进步了约 23%。这是一个微小的晋升,特地是因为 Siamese 神经网络是在零样本分类工作上评估的,而基线是在标记数据上训练的。

应用这些嵌入作为上游分类工作的特色,能够显著进步样本效率。在训练标记模型时,应用 FastText 分类器训练同样准确的模型须要超过现有标记数据三倍数据量。这表明,学习失去的表征携带了对于文本内容的大量信息。

嵌入应用程序示例

为了改善对客户的内容举荐,咱们通过客户最近购买的店铺类别来举荐类似的其余店铺。如果没有嵌入则须要构建一个专门的模型,该模型思考到 <consumer_id,last_store_id>,并尝试预测每个候选 store_id 上购买率。然而咱们这里应用咱们曾经生成的嵌入,这就须要 2 个步骤:

  • 在曾经生成的嵌入中检索与 last_store_id 最类似的店铺
  • 应用排名器,为每个客户进行筛选后的店铺进行个性化排名。

因为通过余弦类似度计算十分疾速的,并且咱们不须要为排名收集任何其余数据,下图是这一过程的详细信息。通过均匀每个商铺中商品嵌入,还能够简略的生成一个商铺的语义嵌入,并且能够在批处理过程中实现,缩小实时零碎负载。

总结

自监督办法通常特地有助于在快速增长的目录中开发立刻可重用的 ML 产品。尽管其余 ML 办法可能更适宜于特殊任务,但自监督嵌入依然能够为须要高质量文本数据表示的工作增加弱小的基线。与现成的嵌入办法 (如 FastText 或 BERT) 相比,通常特定于畛域的嵌入办法更适宜于外部应用程序(如搜寻和举荐)。

https://avoid.overfit.cn/post/fd8c56dd4c0942b1af4f8c5e58b92671

本文是 doordash 公司的在线实际分享,作者:Abhi Ramachandran

正文完
 0