一、NIS [2020]

《Neural Input Search for Large Scale Recommendation Models》

  1. 大多数现代神经网络模型可以被认为是由两个组件组成的:

    • 一个是将原始(可能是 categorical 的)输入数据转换为浮点值的输入组件。

    • 另一个是将输入组件的输出结合起来并计算出模型的最终输出的 representation learning 组件。

    自 《Neural Architecture Search with Reinforcement Learning》 发表以来,以自动化的、数据驱动的方式设计神经网络架构(AutoML )最近吸引了很多研究兴趣。然而,该领域以前的研究主要集中在 representation learning 组件的自动化设计上,而对输入组件的关注很少。这是因为大多数研究都是在图像理解问题上进行的,其中 representation learning 组件对模型性能非常重要,而输入组件是微不足道的,因为图像像素已经是浮点形式。

    对于工业界经常遇到的大规模推荐问题,情况则完全不同。虽然 representation learning 组件很重要,但输入组件在模型中起着更关键的作用。这是因为许多推荐问题涉及到具有大 cardinality 的 categorical 特征,而输入组件为这些离散特征的每一项分配 embedding 向量。这就导致了输入组件中有大量的 embedding 参数,这些参数在模型大小和模型归纳偏置(inductive bias)上都占主导地位。

    例如,YouTube 视频推荐模型使用了一个规模为 1M 的 video ID vocabulary ,每个 video ID 有 256 维的 embedding 向量。这意味着仅 video ID 特征就使用了 256M 个参数,而且随着更多离散特征的加入,这个数字还会迅速增长。 相比之下, representation learning 组件只包括三个全连接层。因此,模型参数的数量主要集中在输入组件,这自然对模型性能有很高的影响。在实践中,尽管 categorical 特征的 vocabulary size 和 embedding size 很重要,但它们往往是通过尝试一些具有不同手工制作的配置的模型从而以启发式的方式选择的。由于这些模型通常体积大,训练成本高,这种方法计算量大,可能会导致次优的结果。

    在论文 《Neural Input Search for Large Scale Recommendation Models》 中,作者提出了 Neural Input Search: NIS ,这是一种新颖的方法,为模型输入组件的每个离散特征自动寻找 embedding size 和 vocabulary size 。NIS 创建了一个由 Embedding Blocks 集合组成的搜索空间,其中 blocks 的每个组合代表不同的 vocabulary and embedding 配置。最佳配置是通过像 ENAS 这样的强化学习算法在单个 training run 中搜索而来。

    此外,作者提出一种新的 embedding 类型,称之为 Multi-size Embedding: ME 。 ME 允许将较大尺寸(即,维度)的 embedding 向量分配给更常见的、或更 predictive 的 feature item ,而将较小尺寸的 embedding 向量分配给不常见的、或没有predictive 的 feature item 。这与通常采用的方法相反,即在词表的所有 item 中使用同样维度的 embedding ,这称之为 Single-size Embedding: SE 。作者认为,SE 是对模型容量和训练数据的低效利用。这是因为:

    • 对于频繁出现的、或高 predictive 的 item ,我们需要一个大的 embedding 维度来编码它们与其他 item 的细微关系(nuanced relation)。

    • 但对于长尾item ,由于它们在训练集中的稀有性(rarity),训练相同维度的 good embedding 可能需要太多的 epoch。并且当训练数据有限时,对于 rare item 采用大维度的 embedding 可能会过拟合。

    有了 ME ,在相同的模型容量下,我们可以覆盖词表中更多的 item ,同时减少所需的训练数据规模和计算成本从而为长尾item 训练良好的 embedding 。

    下图概览了基于 Embedding Blocks 的搜索空间、以及强化学习控制器如何对候选 SE 和 ME 进行采样。

    图 (a):Single-size Embedding,其中仅保留 top 2M 个 item,embedding 维度 192 。

    图 (b):Multi-size Embedding,其中 top 2M 个 item 的 embedding 维度为 192 、剩余 7M 个 item 的 embedding 维度为 64 。

    注意:这要求词表中的 id 是根据频次来降序排列。这对于频次分布的波动较大的 field 而言,需要经常重新编码 id 和重新训练。

    embedding table 包含两个超参数:emebdding size 、以及词表大小(即,保留高频的多少个 item)。这篇论文保留了所有的 item,并针对性地优化 embedding size 。

    作者通过在两个广泛研究的推荐问题的公共数据集上的实验,证明了 NIS 在为 SE 和 ME 寻找良好的 vocabulary size 和 embedding size 配置方面的有效性。给定 baseline 推荐模型,NIS 能够显著提高它们的性能,同时在所有实验中显著减少 embedding 参数的数量(从而减少模型的规模)。此外,作者将 NIS 应用于 Google App store 中的一个真实世界的大规模 App ranking 模型,并进行了离线实验和在线 A/B test ,结果是 +1.02% 的 App Install ,而模型大小减少了 30% 。这个新的 NIS App ranking 模型已经部署在生产中。

  2. 相关工作:几乎所有以前的 NAS 研究工作都集中在为图像/视频理解问题寻找最佳的 representation learning 组件。对于大规模的推荐问题,通过利用先进的representation learning 组件(如 CNN, RNN 等)也取得了很大的成果。然而,尽管输入组件由于 embedding 从而包含了很大一部分模型参数,但它在整个工业界中经常被启发式地设计,如 YouTube, Google Play, Netflix 等。据我们所知,我们的工作首次将自动化的神经网络设计引入输入组件从而用于大规模推荐问题。

1.1 模型

  1. 假设模型的输入由一组 categorical 特征 F 组成。对于每个特征 F∈F,我们有一个其可能取值的列表,这个列表中的元素按照在数据集中出现的频率递减的顺序排序。这个列表将每个特征取值隐式地映射为一个整数,我们把这个列表称为词表(vocabulary)。

  2. 一个 embedding 变量 E∈Rv×d 是一个可训练的矩阵,其中 v 为 vocabulary size ,d 为 embedding 维度。对于任何 0≤i<v 的情况,e→i∈Rd 表示 E 的第 i 行,即词表内第 i 个 item 的 embedding 向量。

  3. 令 B 为我们的 "memory budget",它指的是模型的 embedding 矩阵使用的浮点数的总数。对于一个 Rv×d 的 embedding 矩阵,它的浮点数总数为 v×d 。

1.1.1 Neural Input Search Problems

  1. Single-size Embedding: SE:single-size embedding 是一个形状为 v×d 的规则的 embedding 矩阵,其中词表中的每一个 item (共计 v 个 item)都表示为一个 d 维的 embedding 向量。以前的工作大多使用 SE 来表示离散的特征,每个特征的 v 和 d 的值是以启发式方式选择的,这可能是次优的。

    下面我们提出一个 Neural Input Search 问题从而自动寻找每个特征的最佳 SE ,即 NIS-SE。解决这个问题的方法将在后面介绍。

  2. Problem NIS-SE:为每个 F∈F 找到 vocabulary size vF 和 embedding dimension dF 从而最大化结果模型的目标函数值,使得:

    ∑F∈FvF×dF≤B

    该问题涉及两个 trade-off:

    • 特征之间的 memory budget:更有用的特征应该得到更多的预算。

    • 每个特征内部的 vocabulary size 和 embedding dimension 之间的 memory budget。

      • 大的 vocabulary size 给了我们更高的覆盖率,让我们包括尾部 item 作为输入信号。

      • 大的 embedding dimension 可以提高我们对头部 item 的预测,因为头部 item 有更多的训练数据。此外,大的embedding dimension 可以编码更细微的信息。

    在 memory budget 内,SE 使得我们很难同时获得高覆盖率和高质量 embedding 。为了克服这一困难,我们引入了一种新的 embedding 类型,即 Multi-size Embedding 。

  3. Multi-size Embedding: ME:Multi-size Embedding 允许词表中的不同 item 有不同维度的 embedding 。它让我们对头部 item 使用大维度的 embedding 、对尾部 item 使用小维度的 embedding 。对尾部 item 使用较少的参数是有意义的,因为它们的训练数据较少。

    现在,一个 embedding 变量(对应于一个特征)的 vocabulary size 和 embedding size 是由 Multisize Embedding Spec: MES 给出的。MES 是 pair 的列表:[(v1,d1),(v2,d2),⋯,(vM,dM)] ,其中:

    • vm 是第 m 个 pair 的 vocabulary size,满足 1≤vm≤v,其中 v=∑m=1Mvm 为这个 categorical feature 的总的 vocabulary size 。

      这相当于将单个词表划分为 M 块。

    • dm 是第 m 个 pair 的 embedding size,满足 d1>d2>⋯>dM≥1 。

    这可以解释为:最开始的 v1 个最高频的 item 有 embedding 维度 d1,接下来的 v2 个频繁的 item 有 embedding 维度 d2 ,等等。当 M=1 时,ME 就等价于 SE 。

    我们对于每个 1≤m≤M ,创建了一个形状为 vm×dm 的 embedding 矩阵 Em,而不是像 SE中那样只有一个 embedding 矩阵 E 。此外,还为每个 1≤m≤M 创建了一个可训练的投影矩阵 Pm,它将一个 dm 维的 embedding 投影到 d1 维的空间。这有利于下游的 reduction 操作在同一个 d1 维空间进行。定义 V0=0 ,以及 Vm=∑i=1mvi 为前 m 个 embedding 矩阵的累计 vocabulary size ,则词表中第 k 个 item 的 ME 定义为:

    e→k=Pmke→k−Vmk−1mk

    其中:mk∈{1,⋯,M} ,并且 k∈[Vmk−1,Vmk] ;e→k−Vmk−1mk 为矩阵 Em 的第 k−Vmk−1 行。

    k−Vmk−1 是第 k 个 item 在第 mk 个 block 内的相对编号。

    通过对每个特征的适当的 MES ,ME 能够同时实现对尾部 item 的高覆盖率、以及头部 item 的高质量 representation 。然而,为所有特征手动寻找最佳 MSE 是非常困难的,因此需要一个自动方法来搜索合适的 MES 。下面我们介绍 Multi-size Embedding 的Neural Input Search 问题,即 NIS-ME 。解决这个问题的方法将在后面介绍。

  4. NIS-ME:为每个 F∈F 找到一个 MES [(v1,d1),(v2,d2),⋯,(vM,dM)] 从而最大化结果模型的目标函数值,使得:

    ∑F∈F∑i=1MFvFi×dFi≤B
  5. 在任何使用 embedding 的模型中,ME 都可以用来直接替代 SE 。通常,给定一组 vocabulary ID K ,K 中的每个元素被映射到其相应的 SE ,然后对这些 SE 进行一个或多个 reduce 操作。例如,一个常用的 reduce 操作是 bag-of-words: BOW ,即对 embedding 进行求和或求平均。为了了解在这种情况下 ME 是如何直接替代 SE 的,即 BOW 的 ME 版本(我们称之为 MBOW ),由以下公式给出:

    ∑k∈Ke→k=∑k∈KPmke→k−Vmk−1mk

    其中 ME 是相加的。这在下图中得到了说明。请注意,对于那些 mk 相等的 k ,在应用投影矩阵之前,对 embedding 进行求和是更高效的。

1.1.2 Neural Input Search Approach

  1. 我们在模型的输入组件开发了一个新的搜索空间,它包含了我们想要搜索的 SE 或 ME 。我们使用一个独立的 controller ,从而在每一个 step 中为每个离散特征挑选一个 SE 或 ME 。这些选中的 SE 或 ME 与主模型的其他部分(不包括控制器)一起被训练。此外,我们使用主模型的前向传播来计算控制器的选择的奖励(是准确率和内存成本的组合),并使用 A3C 策略梯度方法将奖励用于训练控制器变量。

    正如论文在实验部分所述,NIS 方法对具有大 vocabulary size 的 categorical 特征的影响更大。至于像性别、学历这种词典规模较小的 categorical 特征,则 NIS 方法的价值不大。

  2. 搜索空间:

    • Embedding Blocks:对于 vocabulary size 为 v 的给定特征 F∈F ,我们创建一组 S×T 个矩阵,其中 S>1,T>1 。第 (s,t) 个矩阵 Es,t 的尺寸为 v¯s×d¯t ,其中 v=∑s=1Sv¯s,d=∑t=1Td¯t ,d 为 vocabulary 中的 item 允许的最大 embedding size 。 我们称这些矩阵为 Embedding Blocks 。这可以看作是将一个大小为 v×d 的 embedding 矩阵离散化为 S×T 个子矩阵。

      例如,假设 v=10M (M 代表一百万),d=256 ,我们可以把行离散成五块:[1M, 2M, 2M, 2M, 3M] ;可以把列离散成四块:[64, 64, 64, 64] 。这样就有 20 个 Embedding Blocks ,如 Figure 1 所示。

      此外,对于每个 1≤t≤T ,我们创建一个尺寸为 d¯t×d 的投影矩阵 P¯t ,以便将每个 d¯t 维的 embedding 映射到一个共同的 d 维空间,从而方便下游的 reduction 操作。 显然,对于所有的 s ,我们应该有 v¯s≫d,所以与 embedding 中的参数数量相比,投影矩阵中的参数数量是可以忽略的。

      Embedding Blocks 是搜索空间的构建块,允许控制器在每个 training step 中采样不同的 SE 或 ME 。

    • Controller Choices:controller 是一个神经网络,从 softmax 概率中采样不同的 SE 或 ME 。它的确切行为取决于我们是对 SE 还是 ME 进行优化。下面我们将描述控制器在一个特征 F∈F 上的行为,为方便描述,删除 F 下标。

      • SE:为了对 SE 进行优化,在每个 training step 中,控制器集合 {(s,t)∣1≤s≤S,1≤t≤T}∪{(0,0)} 中采样一个 pair (s¯,t¯) 。对于选中的 (s¯,t¯) ,只有 Embedding Blocks {Es,t∣1≤s≤s¯,1≤t≤t¯} 参与到该特定的 training step 。因此,控制器有效地挑选了一个 SE ,如 Figure 1(a) 中的红色矩形内的 SE ,它代表了一个大小为 5M×192 的SE 。在这一步中,词表中第 k 个 item 中的 embedding 为:

        e→k=∑t=1t¯P¯te→k−V¯sk−1sk,t

        其中:

        • V0=0,V¯s=∑i=1sv¯i 为累计的 vocabulary size 。sk∈{1,s,⋯,S} ,且使得 V¯sk−1≤k<V¯sk 。

        • e→k−V¯sk−1sk,t 为 Esk,t 的第 k−V¯sk−1 行。

        定义 D¯t=∑i=1tdt 为累计的 embedding size ,显然,e→k 相当于用一个 D¯t 维的 embedding 表示第 k 个 item ,然后将其投影到一个 d 维空间。这个投影矩阵 P 是 {P¯1,⋯,P¯t} 沿列的拼接。任何一个 vocabulary ID 为 k≥V¯s¯ 的 item 都被认为是 out-of-vocabulary ,要特别处理,通常采用的方法是使用零向量作为它们的 embedding 。因此,这种 SE 的选择带来的内存成本(参数数量)为:C=V¯s¯×D¯t¯ ,其中投影矩阵的成本被忽略,因为 v¯s≫d 。

        如果在 training step 中选择了(0, 0) ,就相当于从模型中去除该特征。因此,在这个 training step 中, zero embedding 被用于这个特征的所有 item ,相应的存储成本为 0 。随着控制器探索不同的 SE ,它根据每个 choice 引起的奖励进行训练,并最终收敛到最佳选择。如果它收敛到(0, 0) ,意味着这个特征应该被删除。显然,对于一个给定的特征,搜索空间的大小是(S×T+1)。

      • ME:当对 ME 进行优化时,控制器不是做出单个选择,而是做出一连串的 T 个选择,每个 1≤t≤T 都有一个选择。每个选择为 s¯t∈{1,⋯,S}∪{0} 。

        • 如果 s¯t>0,则只有 Embedding Blocks {Es,t∣1≤s≤s¯t} 参与到该特定的 training step 。

        • 如果 s¯t=0,则对于词表内的所有item,整个 d¯t 维的 embedding 都将被移除。

        因此,控制器选择了一个自定义的 Embedding Blocks 子集(而不仅仅是一个网格),它组成了一个 MES 。如 Figure 1(b) 所示:

        • 第一个 64-D embedding 被开头的 3M 个 item 所使用。

        • 第二个 64-D embedding 被所有 10M 个 item 所利用。

        • 第三个 64-D embedding 不被任何 item 所使用。

        • 最后一个 64-D embedding 被开头的 3M 个 item 所使用。

        因此,词表中开头的 3M 个 item 被分配了 192 维的embedding ,而最后 7M 个 item 只被分配了 64 维的 embedding 。换句话说,在这个 training step 中实现了 MES [(3M, 192), (7M, 64)] 。

        数学上,令 Ts={t∣Es,t is selected} ,那么词表中第 k 个 item 在当前 training step 的 embedding 为:

        e→k=∑t∈TskP¯te→k−V¯sk−1sk,t,k<v and Tsk≠empty

        如果 Tsk 为空,那么 e→k=0→ 。

        SE 的 emebdding 公式为:e→k=∑t=1t¯P¯te→k−V¯sk−1sk,t 。可以看到,与 SE 相比,ME 公式中的 sum 不是从 1 到 t¯ ,而是被选中的那些维度。

        ME 的内存成本为:C=∑t=1Td¯t×V¯s¯t 。对于一个给定的特征,搜索空间大小为 (S+1)T。

  3. 奖励:由于主模型是通过控制器对 SE 或 ME 的选择来训练的,控制器是通过主模型对验证集样本的前向传播计算出来的奖励来训练的。我们将奖励定义为:

    R=RQ−λ×CM

    其中:RQ 代表我们想要最大化的(潜在的不可微的)质量奖励,CM 为内存成本用于惩罚控制器选择了超过预算的embedding配置,λ 为一个系数用于平衡质量奖励和内存成本。

    • 质量奖励:一类常见的推荐问题是检索问题,其目的是给定模型的输入从而在一个可能非常大的 vocabulary v 中找到 M 个最相关的item 。这类问题的 objective 通常是实现 high recall ,因此我们可以直接让 Recall@N (N≤M)指标作为质量奖励。当 v 太大时,计算 Recall@N 变得太昂贵,我们可以通过采样一个小的 negative set(即,负采样),使用 Sampled Recall@N 作为代理。

      另一类常见的问题是排序(ranking)问题。ranking 模型的质量通常由 ROC-AUC 来衡量,他可以作为质量奖励。

      同样,对于回归问题,质量奖励可以设置为 prediction 和 label 之间的 L2-loss 的负值。

    • 内存成本:我们定义内存成本为:

      CM=max(∑F∈FCFB−1,0)

      注意:CF 是基于控制器选择的内存用量,B 为预先定义的内存预算。

    • λ:显然,λ 代表值得付出 B 的额外超预算的 embedding 参数的代价所对应的质量奖励的增量。例如,如果质量奖励是 ROC-AUC,λ=0.1 ,这意味着我们愿意承担额外的 B 超预算的 embedding 参数,如果它能使 ROC-AUC 增加 0.1 。这是因为额外的 B 超预算参数会使奖励减少 λ ,所以只有当它能使质量奖励至少增加 λ 时才值得。

1.1.3 Training the Neural Input Search Model

  1. Warm up 阶段:如前所述,训练 NIS 模型涉及到主模型和控制器之间 consecutive steps 的交替训练。如果我们从第 0 步开始训练控制器,我们会得到一个恶性循环:没有被控制器选中的 Embedding Blocks 没有得到充分的训练,因此给出了不好的奖励,导致它们在未来被选中的机会更少。

    为了防止这种情况,前几个 training steps 包括一个 warm up 阶段,我们训练所有的 Embedding Blocks ,并固定控制器参数。 warm up 阶段确保所有 Embedding Blocks 得到一些训练。在warm up 阶段之后,我们转向使用 A3C 交替训练主模型和控制器。

    在预热阶段,控制器被固定为选择所有的 Embedding Blocks 。

  2. Baseline Network:作为 A3C 算法的一部分,我们使用一个 baseline 网络来预测每个控制器(使用已经做出的选择)的期望奖励。baseline 网络的结构与控制器网络相同,但有自己的变量,这些变量与控制器变量一起使用验证集进行训练。然后,我们从每个 step 的奖励中减去 baseline ,计算出 advantage 从而用于训练控制器。

    baseline 网络是主模型的拷贝,但是采用了不同的变量。每次更新主模型之后,就将主模型的参数拷贝给 baseline 。

    总体训练流程为:

    • warm up:通过训练集来更新主模型,此时选择所有的 Embedding Blocks 。

    • 迭代:

      • 在验证集上评估主模型的奖励,并通过奖励最大化来更新控制器参数。

      • 通过新的控制器参数,在训练集上更新主模型。

1.2 实验

1.2.1 公共数据集

  1. 数据集:

    • MovieLens-1M:包含了由 6 千多个用户创建的 1M 条电影评分记录。我们通过遵循一个广泛采用的实验设置来制定一个电影推荐问题。用户的评分被视为隐性反馈,也就是说,只要用户给电影打了分,就被认为是对该电影感兴趣。此外,对于每个用户,从电影词表中均匀地采样 4 部随机电影作为用户的负样本(负采样策略,而不是在训练之前提前准备并固定了负样本)。意外的命中会被删除,即:负样本集合中包含了正样本,则把正样本从负样本集合中剔除。

      由于每条评分记录都有一个时间戳,我们把每个用户的最近一个评分记录拿出来进行测试。在测试阶段,对于每个正样本,我们随机采样 99 部电影作为负样本来计算评价指标。测试期间的采样策略与训练期间相同。

    • KKBox:来自 WSDM KKBox 音乐推荐挑战赛,任务是预测用户在一个时间窗口内第一次可观察到的听歌事件后是否会重复听歌。数据集同时包含了正样本和负样本:正样本表示用户重复听了这首歌,负样本表示用户没有再听这首歌。因此,与 MovieLens-1M 数据集不同的是,我们没有通过随机采样来手动构造负样本,而是使用数据集提供的负样本。

      由于该数据集没有与每条记录相关的时间戳,我们随机采样 80% 的记录用于训练、20% 的记录用于测试。

    对于这两个数据集,我们进一步从训练集中随机采样 10% 的样本用于训练控制器的验证集。

    下表给出了我们应用 NIS 的特征的 vocabulary size(即,feature 的 unique item 数量)。注意,原始的 KKBox 数据集有更多的特征,这些特征要么是浮点特征(如 "歌曲长度")、要么是小 vocabulary size 的 categorical 特征(如 "流派")。由于 NIS 对具有大 vocabulary size 的 categorical 特征的影响更大,在我们的实验中,为了简单起见,我们只使用下表中列出的特征。

  2. vocabulary 构建细节:以 MovieLens-1M 为例,遍历每个 user-movie 评分记录,并计算每个用户在整个数据集中出现的记录数量,根据计数结果给每个用户分配 vocabulary ID:最高频的用户分配 ID 0、最低频的用户分配最大的 ID 。其它特征、其它数据集也以类似的方式构建 vocabulary 。

    在生产环境中,特征的频次分布有变化,如何处理?如何处理新出现的 ID ,如新广告的 ID ?这些论文都没有提到。读者猜测,NIS 仅适用于 ID 分布变化不大的场景。对于新闻、广告等等 ID 不断生成、消亡的领域,NIS 可能需要进行适配。

  3. 实验配置:NIS 方法实际上是模型结构无关的,可以应用于各种类型的模型。这里我们采用 Neural Collaborative Filtering: NCF 模型。NCF 模型包括两个组件:Matrix Factorization: MF 组件、多层感知器 MLP 组件,如下图所示。

    • MF 组件中的 user embedding 和 item embedding 是 d 维的,其逐元素相乘产生了 d 维的 MF embedding 。

    • MLP 组件中的 user embedding 和 item embedding 是 4d 维的,它们被拼接起来并馈入 3 个 MLP layer (ReLU 激活函数),其大小分别为4d,2d,d 。top MLP layer 的输出被称作 MLP embedding 。

      我们没有使用任何规范化技术,如 BatchNorm 、LayerNorm 等。

      这意味着 MLP 组件和 MF 组件并没有共享 embedding,因此每个 id 都有两套 embedding。

    d 维的 MF embedding 和 d 维的 MLP embedding 拼接起来,然后被用于计算 logit (通过一个 2d 的可学习的权重向量进行点乘)。模型使用交叉熵损失。

    所有权重(包括隐层权重和 embedding 矩阵)使用高斯分布随机初始化,高斯分布的均值为零、标准差为 1/n,其中 n 为隐层或 embedding 的维度。任何权重都没有使用正则化或 dropout 。当一个特征有多个取值时(如,一首歌有多个作曲家),这些特征的取值的embedding 是均值池化。当某些训练样本中存在缺失的特征值时,使用全零的 embedding 。

    对于 MovieLens-1M 数据集, item embedding 是简单的 movie embedding 。于 KKBox 数据集,由于每个 item (即歌曲)有多个特征,即 song ID 、艺术家姓名、作曲家、作词人, item embedding 的计算方法如下:

    • 对于 MF 组件,四个特征中的每一个都表示为一个 d 维的 embedding ,然后将它们拼接起来并通过一个 4d×d 的投影矩阵从而投影到一个 d 维向量。投影后的 d 维向量表示 MF 组件中的 item embedding 。

    • 对于 MLP 组件,四个特征中的每一个都表示为一个 4d 维的 embedding ,然后将它们拼接起来并通过一个 16d×4d 的投影矩阵从而投影到一个 4d 维向量。投影后的 4d 维向量表示 MLP 组件中的 item embedding 。

    给出一个预先选择的 d ,从而形成一个具有 md 个 embedding 参数的模型,我们首先将其作为 baseline,不应用 NIS 。然后,我们将每个特征的 embedding size 增加一倍,从而产生 2md 个 embedding 参数,并应用 NIS 的内存预算 B=md (即与 baseline 模型相同)。我们预期 NIS 通过更好地分配 md 个参数而表现得比 baseline 更好。我们进一步用 B=0.5md 推动 NIS 的极限,看看它是否还能比 baseline 模型表现更好。

    我们为 baseline 模型实验了 d=8 和 d=16 ,因此相应的 NIS 模型将有 d=16 和 d=32 。

  4. 控制器:控制器用于在所有候选的 choice 上产生一个概率分布。我们在所有的实验中使用了一个简单的控制器:

    • 对于 SE settting,控制器为每个特征分配一个 (S×T+1) 维的向量,向量中的每个元素代表了多项式分布的 logit 。该向量被初始化为零向量。

      控制器从这个多样式分布中采样不同的 SE 。注意:每个特征的搜索空间大小为 (S×T+1) 。对一个具有 |F| 个特征的模型,控制器只是由 |F| 个独立的向量组成,因此不同特征的 SE 是独立采样的。

      我们没有使用更复杂的控制器结构,如 RNN ,因为不清楚对一个特征做出的决策是否会影响其他特征,以及应该按照何种顺序做出决策。

      对于 SE setting,控制器为每个特征从 R(S×T+1) 向量中选择一个元素。

    • 对于 ME setting ,控制器为每个特征分配 T 个独立的 (S+1) 维的向量,因为需要做出 T 个独立的选择。对一个具有 |F| 个特征的模型,控制器是由 T×|F| 个独立的向量组成。

      对于 ME setting,控制器为每个特征从 T 个 R(S+1) 个向量中,分别在每个向量中选择一个元素。

    每个特征构建了 20 个 Embedding Blocks ,其中:d¯t 为 [0.25d,0.25d,0.25d,0.25d] ,v¯s 为 [0.2v,0.2v,0.2v,0.2v,0.2v] ,其中 v 为该特征的 total vocabulary size 。在实践中,我们发现这种配置在细粒度和搜索空间大小之间取得了良好的平衡。

    如前所述,控制器使用验证集进行训练。对于 MovieLens-1M 数据集,我们使用 Recall@1 (也称作 HitRate@1)作为质量奖励 RQ ,然后我们报告测试集上的多个指标:Recall, MRR, NDCG 。对于 KKBox 数据集,我们使用 ROC-AUC 作为质量奖励 ,并报告测试集上的 ROC-AUC 。在所有的实验中,我们设定 λ=0.01 。

  5. 训练细节:

    • 主模型:batch size = 256,应用梯度裁剪(梯度范数阈值为 1.0 ),学习率为 0.1,使用 Adagrad 优化器。在开始 A3C 算法之前,进行了 100K 步的预热阶段。

    • 控制器:使用 Adagrad 优化器,学习率为 0.1 ,不使用梯度裁剪(因为一个低概率但高回报的行动应该得到一个非常高的梯度,以显著提高其概率)。每个控制器的决策都由验证集的 64 个样本所共享,从中计算出一个奖励值。

    在预热阶段结束后,控制器和主模型每隔一个 mini-batch step 进行交替训练。在所有的实验中,我们在主模型和控制器都收敛后停止训练(而不是仅有一个收敛)。

    我们使用了分布式训练,其中 5 个 worker 独立地进行并行训练。

  6. Table 2 和 Table 3 分别报告了 MovieLens-1M 数据集和 KKBox 数据集的实验结果。注意,B 代表 NIS 模型的内存预算。可以看到:

    • NIS 能够持续取得比 baseline 模型更好的性能,很多时候参数明显减少,证明了我们方法的有效性。

    • 在相同的条件下,NIS-ME 模型总是优于 NIS-SE ,而且通常参数比 NIS-SE 更少。

    • 即使 B 是 baseline 模型大小的一半,NIS 模型也几乎总是优于 baseline 。这不仅证明了我们方法的有效性,而且还表明在重度约束条件下有可能实现卓越的性能。

    • 一些 NIS 模型通过超出内存预算获得了卓越的性能。这种模型质量和模型规模之间的 tradeoff 反映在奖励函数的设计中。当内存预算只是一个指导方针而不严格时,这一点特别有用。

1.2.2 真实世界大型数据集

  1. 这里我们描述如何将 NIS 应用到 Google Play App store 的 ranking model 。该模型的目标是:根据 App 被安装的可能性对一组 App 进行排序。数据集由 (Context, App, Label) 组成,其中 Label=0 表示 App 未被安装、Label=1 表示 App 被安装。总共有 20 个离散特征被用来表示 Context 和 App ,如 App ID 、 Developer ID 、App Title 等。离散特征的 vocabulary size 从数百到数百万不等。每个特征的 embedding 维度和 vocabulary size 经过几年的手工优化。

  2. 实验配置:对于 Embedding Blocks,我们设置 v¯s=[0.1v,0.2v,0.2v,0.2v,0.3v] ,其中 v 为特征的 vocabulary size 。需要注意的是,对于每个特征,我们没有平均分割 vocabulary ,而是给 top-10% 的 item 分配了一个 Embedding Block ,因为数据集中的高频特征都是最重要的,也就是说,top-10% 的 item 通常出现在大多数训练样本中。这进一步证明了 Multi-size Embedding 在实践中的必要性。

    此外,我们设置 d¯t=[0.25D,0.25D,0.25D,0.25D] ,其中 D=3d ,d 为 production model 的 embedding size (在不同特征上取值为 8 ~ 32 )。在将 embedding size 增加到三倍从而允许更高的模型容量的同时,我们设置内存预算 B=0.5Bp ,其中 Bp 为 production model 的 embedding 参数的总数。显然,这里的目标是提高模型的预测能力,同时减少模型的大小。

    我们使用 ROC-AUC 作为质量奖励,并设置 λ=0.001 (即,为了 0.001 的 ROC-AUC 增长从而允许 0.5Bp 的参数增加)。

  3. 离线实验:离线 ROC-AUC 指标如下表所示。可以看到:

    • 在 SE setting 和 ME setting 中,NIS 能够以较少的参数数量改善 production model 的 ROC-AUC 性能。

    • NIS-ME 模型在参数数量更少的情况下也能取得比NIS-SE 更好的性能,因为 Multi-size Embedding 可以通过给 head items 更多的参数、给 tail items 更少的参数来更好地利用内存预算。与 production model 相比,NIS-ME 在 ROC-AUC 上得到了0.4% 的改进,而模型大小减少了 30% 。

  4. 在线 A/B test:我们进一步用实时流量进行了 A/B test 的在线实验。由于 NIS-ME 模型优于 NIS-SE 模型,A/B test 只在 NIS-ME 模型上进行。我们监测了 App Install 指标,并得出结论:NIS-ME 模型能够将 App Install 增加 1.02% 。

    NIS-ME 模型目前部署在 100% 的流量上,取代了本实验中使用的 production baseline model 。

  5. 稳定性:当部署在生产中时,NIS-ME 模型需要每天进行重新训练和刷新。了解模型的性能可以维持多久是很重要的。这是因为每个特征的数据分布可能会随着时间的推移而发生重大变化,所以 MES 可能不再是最优的,在这种情况下,我们需要重新运行 NIS ,找到更适合新数据分布的 MES 。

    因为 NIS 的词表构建依赖于 ID 频次分布,而在生产环境中,ID 频次分布可能随时间发生变化。

    我们进行了为期 2 个月的研究,监测原始 production model 和 NIS-ME 模型的 ROC-AUC ,如下图所示。显然,NIS-ME 模型相对于 production model 的优势在 2 个月的时间里非常稳定,说明没有必要经常重新运行 NIS 。在实践中,我们只在模型结构发生变化或要增加新特征时才运行 NIS 。