我们可以用一个具体的例子来说明 EmbeddingBagCollection 的核心作用和它如何处理用户特征。假设我们的用户特征包括 “item_id” 和 “cate_id” 两个字段,每个字段都有各自的离散取值,也就是一些整数 ID。为了让模型能处理这些离散数据,我们需要将它们转化为连续向量表示,这时就要用到嵌入(Embedding)。
例如,假设我们给 “item_id” 构建了一个嵌入表,维度设为 64,即每个商品 ID 对应一个 64 维的向量;同样 “cate_id” 有一个嵌入表,向量维度也是 64。EmbeddingBagCollection 模块内部可能会将每个字段利用 torch.nn.EmbeddingBag 来生成嵌入向量。
下面给出一个详细的例子:
【例子背景】
想象有这样一条记录,表示某个用户的行为序列:
- item_id 列表:[12, 45, 78](用户近期浏览过3个商品,对应的商品编号)
- cate_id 列表:[3, 8, 3](这3个商品分别属于类别 3、8、3)
【如何使用 EmbeddingBagCollection】
当我们调用 self.ebc(features) 时,features 是一个字典,例如:
features = {
“item_id”: (tensor([12, 45, 78]), tensor([…]) # 第二个张量有时表示索引编号、偏移信息或权重(具体实现可能不同)
“cate_id”: (tensor([3, 8, 3]), tensor([…]))
}EmbeddingBagCollection 会为每个特征(例如 “item_id”)找到对应的 torch.nn.EmbeddingBag 模块,然后利用传入的索引张量取出嵌入表中第12、45、78号向量。
对于 “item_id” 特征,其嵌入过程可能如下:
- 嵌入表大小设定为(num_item, 64),num_item 表示商品的总数。
- torch.nn.EmbeddingBag 接收到 [12, 45, 78] 这三个索引后,会检索出对应的 3 个 64 维向量。
- 如果采用“均值”聚合策略(mean pooling),那么这三个向量会取平均,得到一个 64 维的向量;若采用“求和”聚合,则直接对三个向量求和。
同样对于 “cate_id” 特征,也会获得一个 64 维的向量表示。在这个例子中,由于类别列表为 [3, 8, 3],聚合后可能会保留类别 3 出现两次的信息,从而在聚合后体现出重要性。
最终,EmbeddingBagCollection 会返回一个字典,键为特征名称,值为对应的嵌入向量。例如:
emb_dict = {
“item_id”: tensor([[…64维向量…]]), # 形状可能是 (batch_size, embedding_dim),这里 batch_size 为 1
“cate_id”: tensor([[…64维向量…]])
}
【核心作用说明】
核心作用就是完成以下任务:
- 将离散的数字 ID(如 12, 45, 78 等),经由查找嵌入表,使得每个 ID 转换成一个连续向量。
- 利用 EmbeddingBag 的聚合策略(比如加和或均值),把一个序列中的多个离散特征向量整合成一个固定维度的表示。
- 使得后续网络(例如通过 Linear 投影、时序模型 backbone 等)能以连续向量的形式方便地利用这些用户特征。这种表示不仅包含了各个单独 ID 的信息,还能反映出行为序列中频繁出现的特征(例如商品多次浏览可能在聚合时权重较高)。
总的来说,EmbeddingBagCollection 在这里的角色就是作为一个“离散到连续”的编码器,它将原始的用户特征数据转换成适合神经网络处理的向量表示,进而为后续的用户行为建模提供输入。