MIND多兴趣召回实战(一)

这周又是居家办公,难得有时间可以好好儿梳理下之前的工作。今天想和大家聊聊我们在MIND多兴趣召回上面的一些实战经验。

背景

目前,深度学习U2I推荐召回模型已经在业内得到了广泛的应用与研究。大多数U2I召回模型都基于双塔结构,典型的就是DSSM。DSSM主要将user信息和item信息分别通过MLP生成user向量和item向量。然后线上通过user向量去检索topk 的item向量来做召回。然而,在很多场景,用户的兴趣往往是多样的,单一的用户向量无法充分描述用户。多兴趣召回通过用多个兴趣向量来表示用户,从而实现用户的多兴趣建模。

近些年,在用户多兴趣建模这里也有不少的研究。如阿里巴巴团队提出的MIND,首次引入胶囊网络来生成多个用户兴趣向量;ComiRec,提出self-attentive机制来提取用户多兴趣;Octopus,提出自适应学习用户多兴趣数量,并提出一种分配用户多兴趣重要度的方法。本文主要想和大家介绍一下MIND的原理以及我们在实战中的一些改进思路与调优经验。

MIND原理

MIND关注的是召回阶段的用户多兴趣建模,提出采用胶囊网络的动态路由算法来获取用户的多兴趣表示,将用户的行为聚合成多个兴趣向量表示,每个兴趣向量代表不同的用户兴趣,再分别用各个向量去候选池里检索top k的item。

(1) MIND模型的整体结构

在这里插入图片描述

MIND的输入是用户行为和用户画像特征,输出是用户的多兴趣向量。用户行为是N个与用户有交互(包括点击、购买等)的itemid序列,每个itemid有类目id(cateid)、店铺id(shopid)、品牌id(brandid)等特征,这些特征经过动态路由的方法得到多个兴趣向量,然后再与用户画像特征拼接经多层ReLU生成最后的用户多兴趣向量。Item侧的特征是商品的多个标签特征(类目id,店铺id,品牌id等),这些特征经过多层MLP生成item embedding。训练阶段MIND使用一个Label-aware Attention层辅助训练。线上召回的时候,使用用户的多个兴趣向量分别去离线计算好的ElasticFaiss库里检索top k的item。

(2) Embedding&&Pooling层

Embedding层的输入主要包括用户属性、用户行为、目标item标签。特征都是由一个或多个id构成,需要Embedding成低维稠密的向量。

a. 用户属性特征将其embedding进行拼接

b. 目标item标签,将所有特征的embedding进行Average Pooling,得到item 的embedding

c. 用户行为特征,则是一个item id 的list

后续内容详见:
MIND多兴趣召回实战(一)

本文主要给大家详细介绍了MIND的基本原理和我们的相关实战经验。另外还有一些对于MIND模型的改进优化会在下一篇文章中继续为大家介绍,希望大家能持续关注。

欢迎大家关注微信公众号:计算广告那些事儿,除了原创文章之外,也会不定期和大家分享业内大牛的文章哈!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mastermind是一种经典游戏,用于猜测由几个位置和有限个数字组成的编码序列。Java是一种面向对象的编程语言,可以很容易地实现Mastermind的代码。下面是一个实现Mastermind的Java代码: import java.util.*; public class Mastermind { private static final int CODE_LENGTH = 4; private static final int MAX_GUESSES = 12; private static final int NUM_COLORS = 6; private static final String[] COLORS = {"R", "G", "B", "Y", "O", "P"}; private String secretCode; private int numGuesses; public Mastermind() { secretCode = generateSecretCode(); numGuesses = 0; } public void play() { Scanner input = new Scanner(System.in); System.out.println("Welcome to Mastermind!"); while (numGuesses < MAX_GUESSES) { System.out.print("Enter your guess (e.g. RBGY): "); String guess = input.nextLine(); if (guess.length() != CODE_LENGTH) { System.out.println("Invalid guess length! Must be " + CODE_LENGTH + " characters."); continue; } if (!isValid(guess)) { System.out.println("Invalid guess! Must consist of the characters R, G, B, Y, O, P."); continue; } String result = checkGuess(guess); if (result.equals("BBBB")) { System.out.println("You win!"); return; } else { System.out.println("Result: " + result); numGuesses++; } } System.out.println("You lose! The secret code was " + secretCode + "."); } private String generateSecretCode() { Random random = new Random(); StringBuilder code = new StringBuilder(); for (int i = 0; i < CODE_LENGTH; i++) { int index = random.nextInt(NUM_COLORS); code.append(COLORS[index]); } return code.toString(); } private boolean isValid(String guess) { for (char ch : guess.toCharArray()) { if (ch < 'A' || ch > 'Z' || ch == 'F' || ch == 'I' || ch == 'J' || ch == 'K' || ch == 'N' || ch == 'Q' || ch == 'U' || ch == 'V' || ch == 'W' || ch == 'X' || ch == 'Z') { return false; } } return true; } private String checkGuess(String guess) { StringBuilder result = new StringBuilder(); for (int i = 0; i < CODE_LENGTH; i++) { char ch = guess.charAt(i); if (secretCode.charAt(i) == ch) { result.append('B'); } else if (secretCode.contains(Character.toString(ch))) { result.append('W'); } else { result.append('.'); } } return result.toString(); } public static void main(String[] args) { Mastermind game = new Mastermind(); game.play(); } } 这个代码使用了很多常量和数组来表示游戏规则和颜色选项。generateSecretCode方法随机生成一个大小为CODE_LENGTH的编码序列。isValid方法检查猜测是否有效。checkGuess方法返回一个字符串,用B表示正确位置的正确数字,用W表示包含正确数字但位置不正确的数字,用.表示没有正确的数字。主方法创建一个Mastermind对象并开始游戏。如果用户成功猜到编码序列,游戏结束并输出“你赢了!”。如果用户达到MAX_GUESSES次猜测但未猜对,游戏结束并输出“你输了!”。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值