数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- lightgbm
- xgboost
- scikit-learn
- spark
- numpy
- matplotlib
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
二十三、ESM2 [2019]
从互联网上大量可用的
options
中为用户发现有价值的产品或服务已经成为现代在线application
(如电商、社交网络、广告等等)的基本功能fundamental functionality
。推荐系统Recommender System
可以起到这个作用,为用户提供准确accurate
、及时timely
和个性化personalized
的服务。下图显示了电商平台中在线推荐的架构。它包含两个基础部分fundamental component
,即系统推荐system recommendation
和用户反馈user feedback
。- 在分析了用户的长期行为
long-term behavior
和短期行为short-term behavior
之后,推荐系统首先召回了大量相关related
的item
。然后,根据几种排序指标ranking metrics
(例如点击率Click-Through Rate: CTR
、转化率Conversion Rate: CVR
等等)对召回的item
进行排序并向用户展示。 - 接下来,当浏览推荐的
item
时,用户可能会点击并最终购买感兴趣的item
。这就是电商交易中的典型的用户行为序列路径user sequential behavior path
“曝光impression
--> 点击click
--> 购买purchase
”。
推荐系统收集了用户的这些反馈,并将其用于估计更准确的排序指标,这对于下一轮生成高质量的推荐确实非常关键。这里,本文重点关注后点击
post-click
的CVR
估计estimation
任务。但是,
CVR
估计中的两个关键问题使得该任务相当具有挑战性,即样本选择偏差sample Selection Bias: SSB
和数据稀疏性Data Sparsity: DS
。SSB
指的是训练空间和推断空间之间数据分布的系统性差异systematic difference
。即:常规的CVR
模型仅在点击的样本上进行训练,但是在所有曝光样本上进行推断inference
。直觉地,点击样本仅仅是曝光样本的一小部分,并且受到用户
self-selection
(如用户点击)的偏见biased
。因此,当CVR
模型在线serving
时,SSB
问题将降低其性能。此外,由于和曝光样本相比,点击样本相对更少。因此来自行为序列路径 “点击 --> 购买” 的训练样本数量不足以拟合
CVR
任务的大的参数空间,从而导致DS
问题。
如下图所示说明了传统
CVR
预估中样本选择偏差问题,其中训练空间仅由点击样本组成,而推断空间是所有曝光样本的整个空间。另外,从曝光到购买,数据量是逐渐减少。如何处理
SSB
和DS
问题对于开发高效的工业级推荐系统至关重要。已经有一些研究来应对这些挑战。例如,Entire Space Multi-Task Model: ESMM
模型通过多任务学习框架在用户行为序列路径 “曝光--> 点击 --> 购买” 上定义了CVR
任务。- 它使用整个空间上的所有曝光样本进行训练,以完成两个辅助任务
auxiliary task
(即post-view CTR
和post-view CTCVR
)。因此,当在线推断时,从CTR
和CTCVR
导出的CVR
也适用于相同的整个空间,从而有效地解决了SSB
问题。 - 此外,
CVR
网络和具有丰富标记样本的辅助CTR
网络共享相同的特征representation
,这有助于缓解DS
问题。
尽管
ESSM
通过同时处理SSB
和DS
问题从而获得了比传统方法更好的性能,但是由于购买行为的训练样本很少(根据来自淘宝电商平台的大规模真实交易日志,不到0.1%
的曝光行为转化为购买),它仍然难以缓解DS
问题。在对日志进行详细分析之后,论文
《Entire Space Multi-Task Modeling via Post-Click Behavior Decomposition for Conversion Rate Prediction》
发现用户总是在点击之后采取了一些和购买相关的动作purchase-related action
。例如,由于某些原因(如等待折扣),用户可以将青睐的item
添加到购物车(或者wish list
)中,而不是立即购买。此外,这些行为确实比购物行为更加丰富。有鉴于此,该论文提出了后点击行为分解post-click behavior decomposition
的新思想。具体而言,在点击和购买之间并行
parallel
地插入不相交的购买相关purchase-related
的决定性动作Deterministic Action: DAction
、以及购买无关的其它动作Other Action: OAction
,形成一个新颖的 “曝光 --> 点击 -->D(O)Action
--> 购买” 的用户行为序列图user sequential behavior graph
。其中任务关系由条件概率明确地定义。此外,在这个图上定义模型能够利用整个空间上的所有曝光样本以及来自后点击行为post-click behavior
的额外的丰富abundant
的监督信号supervisory signal
,这将有效地共同解决SSB
和DS
问题。在论文
《Entire Space Multi-Task Modeling via Post-Click Behavior Decomposition for Conversion Rate Prediction》
中,作者借助深度神经网络来体现上述思想。具体而言,论文提出了一种新颖的深度神经网络推荐模型,称作Elaborated Entire Space Supervised Multi-task Model: ESM2
。ESM2
包含三个模块:共享embedding
模块shared embedding module: SEM
、分解预估模块decomposed prediction module: DPM
、序列合成模块sequential composition module: SCM
。- 首先,
SEM
通过线性的全连接层将ID
类型的one-hot
特征向量嵌入到dense representation
中。 - 然后,这些
embedding
被馈入到后续的DPM
中。在该DPM
中,各个预测子网通过在整个空间上对所有曝光样本进行多任务学习来并行parallel
预估分解的子目标decomposed sub-target
的概率。 - 最后,
SCM
根据图上定义的条件概率规则conditional probability rule defined
,依次合成compose
最终的CVR
和一些辅助概率。在图的某些子路径sub-path
上定义的multiple losses
用于监督ESM2
的训练。
本文的主要贡献:
据我们所知,我们是第一个引入后点击行为分解
post-click behavior decomposition
的思想来在整个空间内对CVR
建模的。显式分解explicit decomposition
产生了一个新的用户行为序列图 “曝光 --> 点击 -->D(O)Action
--> 购买 ”。我们提出了一种名为
ESM2
的新颖的神经推荐方法,该方法根据用户行为图user behavior graph
上定义的条件概率规则,在多任务学习框架中同时对CVR
预估任务prediction task
和辅助任务auxiliary task
进行建模。通过收集大量带标签的的后点击行为数据
post-click action data
,ESM2
可以有效解决SSB
和DS
问题。我们的模型在现实世界的离线数据集上比典型的
state-of-the-art
方法获得了更好的性能。我们还将其部署在我们的在线推荐系统中,并取得了显著的提升,证明了其在工业应用中的价值。
- 在分析了用户的长期行为
相关工作:我们提出的方法通过在整个空间上采用多任务学习框架来专门解决
CVR
预估问题。因此,我们从以下两个方面简要回顾了最相关的工作:CVR
预估、多任务学习。CVR
预估:CVR
预估是许多在线应用的关键组成部分,例如搜索引擎search engines
、推荐系统recommender systems
、在线广告online advertising
。然而,尽管最近CTR
方法得到了蓬勃发展,很少提出针对CVR
任务的文献。事实上,CVR
建模是非常具有挑战性的,因为转化行为是极为罕见的事件,只有极少量的曝光item
最终被点击和购买。近年来,由于深度神经网络在特征
representation
和端到端建模end-to-end modeling
方面的卓越能力,因此在包括推荐系统在内的许多领域都取得了重大进展。在本文中,我们也采用了深度神经网络对CVR
预估任务prediction task
进行了建模。与上述方法相比,我们基于一种新颖的后点击行为分解post-click behavior decomposition
思想,提出了一个新颖的用户行为序列图 “曝光 --> 点击 -->D(O)Action
--> 购买 ” 。根据图中定义的条件概率规则,我们的网络结构经过专门设计,可以并行预测parallel
几个分解的子目标decomposed sub-target
,并依次合成从而形成最终的CVR
。多任务学习:由于用户的购买行为在时间上具有多阶段性
multi-stage nature
,如曝光、点击、购买,先前的工作试图通过多任务框架来形式化CVR
预估任务。例如:《multi-task learning for recommender systems》
通过同时对ranking
任务和rating prediction
任务建模,提出了一个基于多任务学习的推荐系统。《Modeling task relationships in multi-task learning with multi-gate mixture-of-experts》
提出了一种多任务学习方法,称作multi-gate mixture-of-experts: MMOE
, 以从数据中明确学习任务关系。《Neural Multi-Task Recommendation from Multi-Behavior Data》
提出一种神经多任务推荐模型neural multi-task recommendation model
来学习不同类型行为之间的级联关系cascading relationship
。相反,我们通过关联
associating
用户的序列行为图来同时建模CTR
和CVR
任务,其中任务关系由条件概率明确定义。《Perceive your users in depth: Learning universal user representations from multiple e-commerce tasks》
提出学习跨多个任务的通用用户representation
,以实现更有效的个性化。我们也通过跨不同任务共享
embedded
特征来探索这种思想。最近,
《Entire space multi-task model: An effective approach for estimating post-click conversion rate》
提出了用于CVR
预估的entire space multi-task model: ESMM
模型。它将CTR
任务和CTCVR
任务作为辅助任务添加到主CVR
任务中。我们的方法受到
ESMM
的启发,但有以下显著的不同:我们提出了一个新颖的后点击行为分解post-click behavior decomposition
的思想来重构一个新的用户行为序列图 “曝光 --> 点击 -->D(O)Action
--> 购买”。通过在这个图上定义模型,可以同时形式化最终的CVR
任务以及辅助任务auxiliary tasks
。我们的方法可以利用整个空间的所有曝光样本以及来自用户后点击行为
post-click behaviors
的丰富的监督信号,这些监督信号和购买行为高度相关,因此可以同时解决SSB
和DS
问题。
23.1 模型
在实践中,一个
item
从曝光到购买,这之间可能存在多种类型的序列动作sequential action
。例如,在点击一个感兴趣的item
之后,用户可以毫不犹豫的直接购买它,或者将其添加到购物车中然后最终进行购买。这些行为路径如下图(a)
所示。图(a)
为区分从曝光到购买的、包含后点击行为的多条路径multiple path
,例如 “曝光 --> 点击 --> 添加到购物车 --> 购买” 。我们可以根据几个预定义的、特定的和购买相关
purchase-related
的后点击动作post-click action
来简化和分组这些路径,即添加到购物车Shopping Cart: SCart
、添加到愿望清单Wish list: Wish
,如下图(b)
所示。图(b)
为描述简化的购买过程的有向图,其中边上的数字表示不同路径的稀疏性。根据我们对真实世界在线日志的数据分析,我们发现只有
1%
的点击行为最终会转化为购买行为,这表明购买训练样本很少。然而,SCart
和Wish
这样的一些后点击动作的数据量远大于购买量。如,10%
的点击会转化为加购物车。此外,这些后点击动作与最终购买行为高度相关。例如,12%
的加购物车行为会转化为购买行为、31%
的加愿望清单行为会转化为购买行为。考虑到后点击行为
post-click behaviors
和购买行为高度相关,我们如何以某种方式利用大量的后点击行为从而使得CVR
预估收益?直观地讲,一种解决方案是将购买相关的后点击动作与购买行为一起建模到多任务预测框架multi-task prediction framework
中。关键是如何恰当地形式化它们,因为它们具有明确的序列相关性sequential correlation
。例如,购买行为可能是以SCart
或Wish
行为为条件的。为此,我们定义了一个名为Deterministic Action: DAction
的单个节点node
来合并这些预定义的、特定的与购买相关的后点击动作,例如SCart
和Wish
,如下图(c)
所示。DAction
有两个性质:与购买行为高度相关、具有来自用户反馈的丰富的确定性deterministic
的监督信号。例如,1
表示执行某些特定操作(即在点击之后添加到购物车中、或者点击之后添加到愿望清单中),0
表示未执行这些操作。我们还在点击和购买之间添加了一个名为
Other Action: OAction
的节点,以处理DAction
以外的其它后点击行为。借此方式,传统的行为路径 “曝光 --> 点击 --> 购买” 就变为新颖novel
的、精巧elaborated
的用户行为序列图 “曝光 --> 点击 -->D(O)Action
--> 购买”,如下图(c)
所示。通过在该图上定义模型,可以利用整个空间上的所有曝光样本以及来自
D(O)Action
的额外的丰富的监督信号,这可以有效地避免SSB
和DS
问题。我们称这种新颖的想法为后点击行为分解post-click behavior decomposition
。
23.1.1 条件概率分解
这里我们根据上图
(c)
中定义的有向图来介绍CVR
的条件概率分解conditional probability decomposition
,以及相关的辅助任务auxiliary tasks
。定义
$ p_i^{item
$ i $ 的post view ctr
$ p_i^{} $ 为:用户浏览到 item
$ i $ 的情况下点击它的条件概率。这由有向图中的路径 “曝光 --> 点击” 来描述。从数学上讲,这可以写成:} = p(c_i=1\mid v_i=1) \triangleq y_{1,i} $ 其中:
- $ c_i\in \{0,1\} $ 表示
item
$ i $ 是否被点击。 - $ v_i\in \{0,1\} $ 表示
item
$ i $ 是否浏览。 - $ y_{1,i} $ 是一个简单的替代符号。
- $ c_i\in \{0,1\} $ 表示
定义
$ p_i^{item
$ i $ 的click-through DAction CVR
$ p_i^{} $ 为:用户浏览到 item
$ i $ 的情况下执行DAction
动作的条件概率。这由有向图中的路径 “曝光 --> 点击 -->DAction
” 来描述。从数学上讲,这可以写成:} = p(a_i=1\mid v_i=1) \\ =\sum_{c_i\in \{0,1\}}p(a_i=1\mid v_i=1,c_i)\times p(c_i\mid v_i=1)\\ = p(a_i=1\mid v_i=1,c_i=0)\times p(c_i=0\mid v_i=1)\\ +p(a_i=1\mid v_i=1,c_i=1)\times p(c_i=1\mid v_i=1)\\ =p(a_i=1\mid v_i=1,c_i=1)\times p(c_i=1\mid v_i=1)\\ \triangleq y_{2,i}y_{1,i} $ 其中:
$ a_i\in \{0,1\} $ 表示
item
$ i $ 是否被执行DAction
动作。这里假设:如果用户未点击
$ p(a_i=1\mid v_i=1,c_i=0) = 0 $item
$ i $ ,则不会发生下一步的DAction
动作。即:$ y_{2,i} = p(a_i=1\mid v_i=1,c_i=1) $ 表示路径 “点击 -->
DAction
” 。考虑到点击( $ c_i=1 $ )一定意味着浏览( $ v_i=1 $ ),因此 $ y_{2,i} $ 简化为:
$ y_{2,i} = p(a_i=1\mid c_i=1) $
定义
$ p_i^{item
$ i $ 的CVR
$ p_i^{} $ 为:在用户已点击 item
$ i $ 的条件下购买item
$ i $ 的条件概率。这由有向图中的路径 “点击 -->D(O)Action
--> 购买” 来描述。从数学上讲,这可以写成:}=p(b_i=1\mid c_i=1) \\ = \sum_{a_i\in \{0,1\}}p(b_i=1\mid c_i=1,a_i)\times p(a_i\mid c_i=1)\\ =p(b_i=1\mid c_i=1,a_i=0)\times p(a_i=0\mid c_i=1)\\ +p(b_i=1\mid c_i=1,a_i=1)\times p(a_i=1\mid c_i=1)\\ \triangleq y_{4,i}(1-y_{2,i})+y_{3,i}y_{2,i} $ 其中:
- $ b_i\in \{0,1\} $ 表示
item
$ i $ 是否被购买。 - $ y_{3,i} = p(b_i=1\mid c_i=1,a_i=1) = p(b_i=1\mid a_i=1) $ 表示有向图中的路径 “
DAction
-> 购买” 。这里我们假设DAction
( $ a_i=1 $ )一定意味着点击( $ c_i=1 $ )。 - $ y_{4,i} = p(b_i=1\mid c_i=1,a_i=0)= p(b_i=1\mid a_i=0) $ 表示有向图中的路径 “
OAction
-> 购买” 。这里我们假设OAction
( $ a_i=0 $ )一定意味着点击( $ c_i=1 $ )。
- $ b_i\in \{0,1\} $ 表示
定义
$ p_i^{item
$ i $ 的click-through CVR
为 $ p_i^{} $ 为:用户浏览到 item
$ i $ 的情况下购买它的概率。这由有向图中的路径 “曝光 --> 点击 -->D(O)Action
--> 购买” 来描述。从数学上讲,这可以写成:} = p(b_i=1\mid v_i=1) \\ = \sum_{c_i}p(b_i=1\mid v_i=1,c_i)\times p(c_i\mid v_i=1)\\ =\sum_{c_i}\sum_{a_i}p(b_i=1\mid v_i=1,c_i,a_i)\times p(a_i\mid v_i=1,c_i)\times p(c_i\mid v_i=1) $ 考虑到如果没有点击就没有任何购买,即:
$ \forall a_i\in \{0,1\}:\quad p(b_i=1\mid v_i=1,c_i=0,a_i) = 0 $则上式简化为:
$ p_i^{} = p(b_i=1\mid v_i=1) \\ = \sum_{a_i}p(b_i=1\mid c_i=1,a_i)\times p(a_i\mid c_i=1)\times p(c_i=1\mid v_i=1)\\ = y_{1,i}\times [y_{4,i}(1-y_{2,i})+y_{3,i}y_{2,i}] $ 因此,上式可以通过将有向图 “曝光 --> 点击 -->
D(O)Action
--> 购买” 分解为 “曝光 --> 点击”、以及 “点击 -->D(O)Action
--> 购买”,并根据链式法则chain rule
整合之前所有的公式(即 $ p_i^{} = p_i^{ }\times p_{i}^{ } $ )从而得出。
23.1.2 ESM2 模型
从前面推导可以看到: $ p_i^{
},p_i^{ },p_i^{ } $ 可以从四个隐概率变量 hidden probability variable
$ y_{1,i},y_{2,i},y_{3,i},y_{4,i} $ 中推导而来。每个隐概率变量代表有向图中某个子路径sub-path
上的条件概率,其中:- $ y_{1,i} $ 表示 “曝光 --> 点击“ 的条件概率。
- $ y_{2,i} $ 表示 “点击 -->
DAction
“ 的条件概率。 - $ y_{3,i} $ 表示 “
DAction
-> 购买” 的条件概率。 - $ y_{4,i} $ 表示 “
OAction
-> 购买” 的条件概率。
此外,这四个子目标
sub-target
在整个空间中定义,并且可以使用所有曝光样本进行预测。以 $ y_{2,i} $ 为例,仅使用点击样本直接训练 $ y_{2,i} $ 会遇到SSB
问题。 实际上根据前面的推导, $ y_{2,i} $ 是从 $ p_i^{} $ 和 $ p_i^{ } $ 派生的中间变量 intermediate variable
。由于 $ p_i^{} $ 和 $ p_i^{ } $ 都是使用所有曝光样本在整个空间上建模的,因此派生的 $ y_{2,i} $ 也适用于整个空间,因此在我们的模型中没有 SSB
。另一方面, 给定用户的日志, $ p_i^{
},p_i^{ },p_i^{ } $ 的 ground truth label
是可用的,这些label
可用于监督这些子目标。因此,一种直观的方法是通过多任务学习框架同时对它们进行建模。为此,我们提出了一种新颖的深度神经推荐模型
neural recommendation model
,称作Elaborated Entire Space Supervised Multi-task Mode: ESM2
,用于CVR
预估。ESM2
之所以取这个名字是因为:- 首先, $ p_i^{
},p_i^{ },p_i^{ } $ 是在整个空间上建模,并使用所有曝光样本进行预测。 - 其次,派生的 $ p_i^{
} $ 也受益于整个空间的多任务建模。这将在实验部分得到验证。
ESM2
由三个关键模块组成:一个共享的
embedding
模块Shared Embedding Module: SEM
。SEM
将稀疏特征嵌入到稠密的representation
中。一个分解
decomposed
的预估模块Decomposed Prediction Module: DPM
。DPM
可以预估分解目标的概率。一个顺序
sequential
的合成composition
模块Sequential Composition Module: SCM
。SCM
将预估分解目标的概率按顺序合成在一起,以计算最终的CVR
以及其它相关的辅助任务(即CTR
、CTAVR
、CTCVR
)。
整体模型如下图所示。
共享的
embedding
模块:首先我们设计一个共享的embedding
模块,从而嵌入来自user field
、item field
、user-item cross field
的所有稀疏ID
特征和稠密数值特征。- 用户特征包括
user ID
、年龄、性别、购买力等等。 item
特征包括item ID
、价格、历史日志统计的历史累计CTR
和历史累计CVR
等等。user-item
特征包括用户对item
的历史偏好分historical preference score
等等。- 稠密特征首先基于它们的边界
boundary
来离散化,然后将其表示为one-hot
向量。
令第 $ i $ 个样本第 $ j $ 个特征为 $ f_{i,j} $ ,进行
$ \mathbf{\vec f}_i = \text{concat}\left(\mathbf{\vec f}_{i,1},\cdots,\mathbf{\vec f}_{i,m}\right) $one-hot
之后为 $ \mathbf{\vec f}_{i,j} $ 。第 $ i $ 个样本的one-hot
特征为:其中 $ m $ 为特征数量。
由于
$ \mathbf{\vec g}_{i,j} = \mathbf P_j^\top \mathbf{\vec f}_{i,j} $one-hot
编码的稀疏性,我们使用线性的全连接层将它们嵌入到dense representation
中。令第 $ j $ 个特征的embedding
矩阵为 $ \mathbf P_j $ ,则第 $ i $ 个样本第 $ j $ 个特征的embedding
为:第 $ i $ 个样本的
$ \mathbf{\vec g}_i = \text{concat}\left(\mathbf P_1^\top \mathbf{\vec f}_{i,j1},\cdots,\mathbf P_m^\top \mathbf{\vec f}_{i,m}\right) $embedding
特征为:- 用户特征包括
分解预估模块 :然后一旦获得了所有的特征
embedding
,就将这些embedding
拼接到一起,馈入几个分解的预估模块,并由每个模型共享。DPM
中的每个预估网络分别在 “曝光 --> 点击”、“点击 -->DAction
”、“DAction
--> 购买”、“OAction
--> 购买” 等路径上预估分解的target
的概率。在本文中,我们采用多层感知机
$ y_i^{(k)} = \sigma\left(\varphi^{(k)}_{\theta_k}\left(\mathbf{\vec g}_i\right)\right) $Multi-Layer Perception: MLP
作为预估网络。除了输出层之外,所有非线性激活函数均为ReLU
。对于输出层,我们使用Sigmoid
函数将输出映射为0.0 ~ 1.0
之间的概率值。从数学上讲,这可以写成:其中:
- $ \sigma(\cdot) $ 为
sigmoid
函数。 - $ \varphi^{(k)}_{\theta_k}(\cdot) $ 为第 $ k $ 个
MLP
学到的映射函数, $ \theta_k $ 为网络参数。
例如,上图中的第一个
MLP
输出了估计的概率estimated probability
$ y_1 $ ,这实际上是post-view CTR
。- $ \sigma(\cdot) $ 为
顺序合成模块:最后我们设计了一个顺序合成模块,根据前面描述的公式合成上述预估概率,从而计算转化率 $ p^{
} $ 和一些辅助的目标 auxiliary target
(包括post-view CTR
$ p^{} $ 、 click-through DAction CVR
$ p^{} $ 、 click-through CVR
$ p^{} $ 等等)。 如上图的顶部所示,顺序合成模块是一个无参的前馈神经网络,它表示购买决策有向图
purchasing decision digraph
所定义的条件概率。注意:
- 所有任务共享相同的
embedding
,使这些任务使用所有曝光样本进行训练。即在整个空间上对这些任务进行建模,从而在推断阶段不会出现SSB
问题。 - 轻量级的分解预估模块由共享的
embedding
模块严格正则化,其中共享的embedding
模块包含了大部分的训练参数。 - 我们的模型提出了一种高效的网络设计,其中共享的
embedding
模块可以并行运行,因此在在线部署时可以有较低的latency
。
- 所有任务共享相同的
训练目标:令 $ \mathcal D=\left\{(c_i,a_i,b_i;f_i)\right\}\mid_{i=1}^N $ 表示训练集, $ (c_i,a_i,b_i) $ 表示第 $ i $ 个曝光样本 的
$ p^{ground truth label
(是否点击、是否发生deterministic action
、是否发生购买行为)。然后我们定义所有训练样本的联合post-view pCTR
为:} = \prod_{i\in \mathcal C_+}p_i^{ }\prod_{j\in \mathcal C\_}\left(1-p_j^{ }\right) $ 其中 $ \mathcal C_+,\mathcal C\_ $ 表示点击
label
空间 $ \mathcal C $ 中的正样本和负样本。使用负的对数函数进行变换之后,我们得到 $ p^{
$ \mathcal L_{ctr} = -\sum_{i\in \mathcal C_+} \log p_i^{} $ 的 logloss
:} - \sum_{j\in \mathcal C\_}\log \left(1-p_j^{ }\right) $ 类似地,我们得到 $ p^{
$ \mathcal L_{ctavr} = -\sum_{i\in \mathcal A_+} \log p_i^{} $ 和 $ p^{ } $ 的损失函数为: } - \sum_{j\in \mathcal A\_}\log \left(1-p_j^{ }\right)\\ \mathcal L_{ctcvr} = -\sum_{i\in \mathcal B_+} \log p_i^{ } - \sum_{j\in \mathcal B\_}\log \left(1-p_j^{ }\right) $ 其中: $ \mathcal A_+,\mathcal A\_ $ 表示
DAction label
空间 $ \mathcal A $ 中的正样本和负样本; $ \mathcal B_+,\mathcal B\_ $ 表示购买label
空间 $ \mathcal B $ 中的正样本和负样本。最终的训练目标函数为:
$ \mathcal L(\Theta) = w_{ctr}\times \mathcal L_{ctr} +w_{ctavr}\times \mathcal L_{ctavr} +w_{ctcvr}\times \mathcal L_{ctcvr} $其中:
- $ \Theta $ 为
ESM2
模型中的所有参数。 - $ w_{ctr},w_{ctavr},w_{ctcvr} $ 分别为 $ \mathcal L_{ctr},\mathcal L_{ctavr},\mathcal L_{ctcvr} $ 损失函数的权重。在本文中我们将这些权重都设置为
1.0
。
需要强调的是:
- 添加中间损失
intermediate loss
来监督分解后的子任务,可以有效地利用后点击行为中丰富的标记数据,从而缓解模型受到DS
的影响。 - 所有损失都是从整个空间建模的角度来计算的,这有效解决了
SSB
的问题。
- $ \Theta $ 为
23.2 实验
为了评估
ESM2
模型的有效性,我们针对从现实世界电商场景中收集的离线数据集和在线部署进行了广泛的实验。我们将ESM2
和一些代表性的state-of-the-art
方法进行比较,包括GBDT
、DNN
、使用过采样over-sampling
思想的DNN
、ESMM
等。首先我们介绍评估设置
setting
,包括数据集准备、评估指标、对比的SOTA
方法的简要说明、以及模型实现细节。然后我们给出比较结果并进行分析。接着我们介绍消融研究。最后我们对不同的后点击行为进行效果分析。数据集:我们通过从我们的在线电商平台(世界上最大的第三方零售平台之一)收集用户的行为序列和反馈日志来制作离线数据集。
我们得到超过
3
亿个样本,其中包含用户特征、item
特征、user-item
交叉特征以及序列的反馈标签sequential feedback label
(如,是否点击、是否DAction
、是否购买)。下表给出了离线数据集的统计信息。我们将离线数据集进一步划分为不相交的训练集、验证集、测试集。
评估指标:为了全面评估
ESM2
模型的有效性,并将其和SOTA
方法进行比较,我们使用三种广泛采纳的指标:AUC
、GAUC
、F1 score
。
$ \text{AUC} = \frac{\sum_{x^+\in \mathcal D_+}\sum_{x^-\in \mathcal D\_}I\left(\phi(x^+)\gt \phi(x^-)\right)}{|\mathcal D_+|\times |\mathcal D\_|} $AUC
刻画了模型的排序能力ranking ability
:其中:
- $ \mathcal D_+ $ 为正样本集合, $ \mathcal D\_ $ 为负样本集合, $ |\mathcal D_+| $ 为正样本数量, $ |\mathcal D\_| $ 为负样本数量。
- $ \phi(\cdot) $ 为预估函数, $ I(\cdot) $ 为示性函数。
$ \text{GAUC} = \frac{\sum_{u}w_u\times \text{AUC}_u}{\sum_uw_u} $GAUC
首先根据每个用户ID
从而将数据划分为不同的组,然后在每个组中计算AUC
,最后对每个组的AUC
加权平均。即:其中:
- $ w_u $ 为用户 $ u $ 的权重。在我们离线评估中我们选择为
1
。 - $ \text{AUC}_u $ 为用户 $ u $ 的
AUC
。
- $ w_u $ 为用户 $ u $ 的权重。在我们离线评估中我们选择为
$ F_1 = \frac{2\times P\times R}{P +R} $F1 score
定义为:其中 $ P $ 为
precision
、 $ R $ 为recall
。
baseline
方法:GBDT
:梯度提升决策树gradient boosting decision tree: GBDT
。它遵循gradient boosting machine: GBM
的思想,能够为回归任务和分类任务提供有竞争力的、高度健壮robust
的、可解释性的方法。本文中,我们将其作为non-deep learning-based
方法的典型代表。DNN
:我们还实现了一个深度神经网络baseline
模型,该模型具有和ESM2
中单个分支相同的结构和超参数。和ESM2
不同,它是用 “点击 --> 购买” 或者 “曝光 --> 点击” 路径上的样本进行训练,从而分别预估转化率 $ p^{} $ 或点击率 $ p^{ } $ 。 DNN-OS
:由于 “曝光 --> 购买” 和 “点击 --> 购买” 路径上的数据稀疏性,很难训练具有良好泛化能力的深度神经网络。为了解决该问题,我们训练一个叫做DNN-OS
的深度模型,它在训练期间利用了过采样over-sampling
策略来增加正样本。它具有与上述DNN
模型相同的结构和超参数。ESMM
:为了公平地进行比较,我们为ESMM
使用与上述深度模型相同的主干结构backbone structure
。ESMM
直接在用户序列路径 “曝光 --> 点击 --> 购买” 上对转化率进行建模,而没有考虑和购买相关的后点击行为post-click behavior
。
简而言之:
- 前三种方法分别从 “曝光 --> 点击”、“点击 --> 购买” 路径上的样本来学习预估 $ p^{
} $ 和 $ p^{ } $ ,然后将二者相乘从而得到曝光转化率 $ p^{ } $ 。 - 而对于
ESMM
和我们的ESM2
,则是通过在整个空间上直接建模预估 $ p^{} $ 和 $ p^{ } $ 。
实验配置:
对于
GBDT
模型,以下超参数是根据验证集AUC
来选择的:- 树的数量为
150
。 - 树的深度为
8
。 - 拆分一个顶点的最小样本量为
20
。 - 每次迭代的样本采样率
0.6
。 - 每次迭代的特征采样率为
0.6
。 - 损失函数为
logistic loss
。
- 树的数量为
对基于深度神经网络的模型,它们基于
TensorFlow
实现,并使用Adam
优化器。- 学习率为
0.0005
,mini-batch size = 1000
。 - 在所有模型中,使用
logistic loss
。 MLP
有5
层,每层的尺寸分别为512, 256, 128, 32, 2
。dropout
设置为dropout ratio = 0.5
。
这些配置(基于深度神经网络的模型)如下表所示。
- 学习率为
离线数据集的评估结果如下表所示。可以看到:
DNN
方法相比较GBDT
模型在CVR AUC
、CTCVR AUC
、CTCVR GAUC
上分别获得了0.0242
、0.0102
、0.0117
的增益。这证明了深度神经网络的强大representation
能力。和普通的
DNN
不同,DNN-OS
使用过采样策略来解决DS
问题,从而获得比DNN
更好的性能。对于
ESMM
,它针对 “曝光 --> 点击 --> 购买” 路径来建模,从而试图同时解决SSB
和DS
问题。得益于对整个空间的建模以及丰富的训练样本,它的性能优于DNN-OS
。尽管如此,
ESMM
忽略了后点击行为的影响,仍然受到购买训练样本稀疏的困扰,因此仍然难以解决DS
问题。我们提出的
ESM2
进一步利用了这些后点击行为。在多任务学习框架下并行预测一些分解的子目标之后,ESM2
依次合成这些预测从而形成最终的CVR
。可以看到,我们的
ESM2
超越了所有的其它方法。例如,ESM2
相较于ESMM
模型在CVR AUC
、CTCVR AUC
、CTCVR GAUC
上分别获得了0.0088
、0.0101
、0.0145
的增益。值得一提的是,离线AUC
增加0.01
总是意味着在线推荐系统收入的显著增加。
对于
F1 score
,我们分别通过为CVR
和CTCVR
设置不同的阈值来报告几个结果。- 首先,我们根据预估的
CVR
或CTCVR
分数对所有样本进行降序排序。 - 然后,由于
CVR
任务的稀疏性(大约1%
的预估样本为正样本),我们选择三个阈值:top @ 0.1%
、top @ 0.6%
、top @ 1%
,从而将样本划分为positive group
和negative group
。 - 最后,我们计算在这些不同阈值下,预估结果的
precision, recall, F1 score
。
评估结果在下表中给出。可以观察到和
AUC/GAUC
类似的趋势。同样地,我们的ESM2
方法在不同的配置下也达到了最佳性能。在线性能:在我们的推荐系统中部署深度网络模型并不是一件容易的事情,因为推荐系统每天服务于数亿用户。例如,在流量高峰时每秒超过
1
亿用户。因此,需要一个实用的模型来进行高吞吐量、低延迟的实时CVR
预估。例如,在我们的系统中,应该在不到100
毫秒的时间内为每个访客预测数百个推荐的item
。得益于并行的网络结构,我们的模型计算效率高,可以在20
毫秒内响应每个在线请求。为了使在线评估公平
fair
、置信confident
、可比较comparable
,A/B test
的每种部署的方法都包含相同数量的用户(例如数百万用户)。在线评估结果如下图所示,其中我们使用GBDT
模型作为baseline
。可以看到:DNN, DNN-OS, ESMM
的性能相当,明显优于baseline
模型,并且ESMM
的性能稍好。我们提出的
ESM2
显著优于所有的其它方法,这证明了它的优越性。此外,
ESM2
相比ESMM
在CVR
上提升了3%
,这对于电商平台具有显著的商业价值。
以上结果说明了:
- 深度神经网络比
tree-based
的GBDT
具有更强的representation
能力。 - 在整个样本空间中的多任务学习框架可以作为解决
SSB
和DS
问题的有效工具。 - 基于后点击行为分解
post-click behaviors decomposition
的思想,ESM2
通过在整个空间上对CVR
建模并利用deterministic
行为中大量的监督信号来有效解决SSB
和DS
问题,并获得最佳性能。
消融研究:这里我们介绍详细的消融研究,包括深度神经网络的超参数设置、嵌入稠密数值特征
embedding dense numerical features
的有效性、以及分解的后点击行为的选择。深度神经网络的超参数:这里我们以三个关键的超参数(
dropout rate
、隐层的层数、item
特征的embedding
维度)为例,从而说明了我们的ESM2
模型中的超参数选择过程。dropout rate
指的是通过在训练过程中随机停止deactivating
一些神经单元的正则化技术。通过引入随机性,可以增强神经网络的泛化能力。我们在模型中尝试了不同的
dropout rate
,从0.2
到0.7
。如图(a)
所示,dropout rate = 0.5
时性能最佳。因此,如果没有特别指出,那么实验中我们默认将dropout rate
设为0.5
。增加网络的深度可以提高模型容量,但是也可能导致过拟合。因此,我们根据验证集的
AUC
仔细设置了这个超参数。从图
(b)
可以看到:在开始阶段(即从两层增加到五层),增加隐层的数量会不断提高模型的性能。但是,模型在五层达到饱和,后续增加更多的层甚至会略微降低验证AUC
,这表明模型可能对训练集过拟合。因此,如果没有特别指出,那么实验中我们默认使用五层的隐层。item
特征embedding
的维度是一个关键的超参数。高维特征可以保留更多信息,但是也可能包含噪声并导致模型复杂度更高。我们尝试了不同的超参数设置,并在图
(c)
中给出结果。可以看到:增加维度通常会提高性能,但是在维度为128
时性能达到饱和。而继续增加维度没有更多收益。因此,为了在模型容量和模型复杂度之间的trade-off
,如果没有特别指出,那么实验中我们默认将item
特征embedding
的维度设为128
。
嵌入稠密数值特征的有效性:在我们的任务中有几个数值特征。
一种常见的做法是首先将它们离散为
one-hot
向量,然后将它们与ID
特征拼接在一起,然后再通过线性投影层将它们嵌入到稠密特征。但是,我们认为对数值特征的离散化one-hot
向量表示可能会损失一定的信息。另一种方案将数值特征归一化,然后使用
$ g_{i,j} = \tanh\left(\frac{f_{i,j} - \mu_j}{\sigma_j}\right) $tanh
激活函数来嵌入它们,即:其中: $ \mu_j $ 和 $ \sigma_j $ 为第 $ j $ 个数值特征的均值和标准差。使用 $ \tanh(\cdot) $ 函数是为了将特征调整到
(-1,+1)
之间。然后我们将归一化的数值特征和嵌入的
ID
特征拼接在一起,作为ESM2
模型的输入。和基于离散化的方案相比,归一化的方案获得了
0.004
的AUC
增益。因此,如果没有特别指出,那么实验中我们默认对稠密的数值特征使用基于归一化的方案。
分解的后点击行为的有效性:当分解后点击行为时,我们可以将不同的行为聚合到
DAction
节点中。例如only SCart
、only Wish
、SCart and Wish
。这里我们评估不同选择的有效性,结果如下表所示。可以看到:
SCart and Wish
的组合达到了最佳的AUC
。这是合理的,因为和其它两种情况相比,SCart and Wish
有更多的购买相关的标记数据来解决DS
问题。
用户行为的性能分析:为了了解
ESM2
的性能以及和ESMM
的区别,我们根据用户购买行为的次数将测试集分为四组:[0,10]
、[11,20]
、[21,50]
、[51, +)
。我们报告了每组中两种方法的CVR AUC
和CTCVR AUC
,结果如下图所示。可以看到:- 两种方法的
CVR AUC
(CTCVR AUC
) 都随着购买行为次数的增加而降低。 - 但是我们观察到,每组中
ESM2
相对于ESMM
的相对增益在增加,即0.72%
、0.81%
、1.13%
、1.30%
。
通常,具有更多购买行为的用户总是具有更活跃的后点击行为,例如
SCart
和Wish
。我们的ESM2
模型通过添加DAction
节点来处理此类后点击行为,该节点由来自用户反馈的deterministic
信号来监督学习。因此,它在这些样本上比ESMM
具有更好的表示能力,并在具有高频购买行为的用户上获得了更好的性能。论文没有分析为什么模型在更多购买行为的用户的
AUC
上下降。这表明模型在这些高购买行为的用户上学习不充分,是否可以将他们作为hard
样本?或者把购买次数作为特征从而让模型知道这个信息?- 两种方法的
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论