Airbnb:将业务目标融入序列 ========================== Airbnb作为全球最大的短租平台,面临着与传统电商不同的挑战。房源不是标准化商品,用户的预订行为远比点击浏览稀疏,而且地理位置成为了一个关键因素。更重要的是,Airbnb需要的不仅仅是相似性,而是能够真正促进最终预订转化的推荐。 面向业务的序列构建 ------------------ Airbnb重新定义了“序列”的概念 :cite:`grbovic2018real`\ ,采用基于会话的序列构建策略。具体而言: **会话切分机制**\ :系统不再简单地将用户交互过的所有房源串联,而是基于用户的点击会话(Click Sessions)构建序列。当用户连续点击间隔超过30分钟时,系统会自动开始一个新的会话。这种时间窗口的设计能够更准确地捕捉用户在特定搜索场景下的连贯意图。 **行为权重差异化**\ :Airbnb引入了重要的业务洞察——用户行为的信号强度存在显著差异。最终的预订行为相比于简单的点击浏览,包含了更强烈的用户偏好信号,因此在模型训练中应当给予更高的权重。 全局上下文机制 -------------- 为了强化模型对最终转化行为的学习,Airbnb设计了全局上下文机制。在传统的Skip-Gram模型中,只有在滑动窗口内的物品才被视为上下文,但这种局部窗口无法充分利用最终预订这一强烈的正向信号。因此,Airbnb让用户最终预订的房源(booked listing)与序列中的每一个浏览房源都形成正样本对进行训练,无论它们在序列中的距离有多远。 .. _airbnb_global_context: .. figure:: ../../img/airbnb_global_context.png :width: 500px Airbnb预订房源全局上下文 针对有预订行为的会话(booked sessions),Airbnb修改了优化目标函数,增加了全局上下文项: .. math:: \underset{\theta}{\text{argmax}} \sum_{(l,c) \in \mathcal{D}_p} \log \frac{1}{1 + e^{-v_c^T v_l}} + \sum_{(l,c) \in \mathcal{D}_n} \log \frac{1}{1 + e^{v_c^T v_l}} + \log \frac{1}{1 + e^{-v_{l_b}^T v_l}} 在这个公式中,前两项是标准的Skip-Gram目标函数:第一项最大化正样本对\ :math:`(l,c)`\ 的相似度,其中\ :math:`l`\ 是目标房源,\ :math:`c`\ 是滑动窗口内的上下文房源;第二项最小化负样本对的相似度。关键的创新在于第三项\ :math:`\log \frac{1}{1 + e^{-v_{l_b}^T v_l}}`\ ,这里\ :math:`l_b`\ 表示用户在该会话中最终预订的房源。 通过这种全局上下文机制,预订房源为序列中的每个房源都提供了额外的学习信号,使得模型能够更有效地捕捉“什么样的房源组合最终会导致预订”这一关键转化模式。 市场感知的负采样 ---------------- Airbnb的另一个创新是改进了负采样策略。传统方法从整个物品库中随机选择负样本,但Airbnb观察到用户通常只会在同一个市场(城市或地区)内进行预订。如果负样本来自不同的地理位置,模型就容易学到地理位置这种“简单特征”,而忽略了房源本身的特点。 因此,Airbnb增加了“同市场负采样”策略,一部分负样本从与正样本相同的地理市场中选择: .. math:: \sum_{(l, l_m^-) \in \mathcal{D_m}} \log \frac{1}{1 + e^{v_{l_m^-}^T v_l}} 其中\ :math:`l_m^-`\ 表示来自相同市场的负样本。这迫使模型学习同一地区内房源的细微差别,提升了推荐的精细度。