如何利用Embedding实现购物车互补推荐的顺序不变性?
实现购物车商品表示的顺序不变性
要让不同商品顺序的购物车(如[A,B,C]和[C,B,A])得到完全等价的表示,核心是消除嵌入向量的位置依赖,可以通过以下几种直接方式实现:
1. 对称聚合嵌入向量(最常用方案)
对购物车中所有商品的嵌入向量执行顺序无关的聚合操作,比如求和、平均、最大池化,这些操作的结果不受元素顺序影响,同时能自动处理mask_zero标记的空位置。
代码示例:
from tensorflow.keras.layers import Input, Embedding, GlobalAveragePooling1D, GlobalMaxPooling1D, Lambda import tensorflow as tf MAX_CART_SIZE = 10 NB_ITEMS = 1000 EMBEDDING_SIZE = 64 # 输入层 item_input = Input(shape=(MAX_CART_SIZE,), name="item_id") # 嵌入层,保留mask_zero处理可变长度购物车 item_embedding = Embedding( input_dim=NB_ITEMS+1, input_length=MAX_CART_SIZE, output_dim=EMBEDDING_SIZE, mask_zero=True )(item_input) # 可选聚合方式三选一: # 方式A:全局平均池化(平衡各商品权重) cart_representation = GlobalAveragePooling1D()(item_embedding) # 方式B:求和聚合(保留商品数量带来的总量信息) # cart_representation = Lambda(lambda x: tf.reduce_sum(x, axis=1))(item_embedding) # 方式C:全局最大池化(突出特征最显著的商品) # cart_representation = GlobalMaxPooling1D()(item_embedding)
2. 自定义对称聚合逻辑
如果需要更灵活的聚合规则(比如加权求和,权重由商品自身特征决定),可以自定义Lambda层实现对称逻辑,只要确保计算过程不依赖元素的位置索引即可。
示例:带商品权重的求和
# 假设每个商品有对应的权重向量(可通过另一个嵌入层学习) item_weight_embedding = Embedding(input_dim=NB_ITEMS+1, output_dim=1, mask_zero=True)(item_input) # 加权求和,顺序不影响结果 weighted_cart_representation = Lambda( lambda x: tf.reduce_sum(x[0] * x[1], axis=1) )([item_embedding, item_weight_embedding])
关键原理
这些方案的核心是:聚合操作仅关注嵌入向量的数值本身,不涉及它们在序列中的位置索引,因此无论商品顺序如何,最终生成的购物车表示向量完全一致,满足顺序不变性需求。
内容的提问来源于stack exchange,提问作者Mark Morrisson
相关产品推荐
相关产品推荐

