论文推荐:SIGIR'21 | 用于推荐的自监督图学习SGL

今天给大家介绍的是2021年在会议SIGIR上发表的论文“Self-supervised Graph Learning for Recommendation”。鉴于图卷积网络(GCNs)能够有效在user-item二分图中捕获高阶邻居,其在推荐领域的表示学习中得到了广泛的应用。尽管如此,作者认为这类方法仍存在两个局限性: 1)high-degree的节点对表征学习的影响更大,会恶化low-degree (long-tail) 项的推荐; (2)表征容易受到噪声交互的影响,因为邻域聚集方案进一步扩大了已观察edges的影响。本文作者探讨了基于user-item图的自监督学习SGL,从而提高GCNs推荐的准确性和鲁棒性。其思想是在经典的推荐监督任务的基础上增加一个辅助的自我监督任务,通过自我判别来加强节点表示学习。在三个标准数据集的实证研究证明了SGL能够有效地提高推荐精度,特别是对长尾项的推荐精度,并对交互噪声具有鲁棒性。


1 研究背景

协同推荐的主题是从交互数据中学习高质量的用户和项目表征。早期工作如矩阵分解(MF)将每个用户(或项目)的单个ID投射到一个嵌入向量中。为了学习更好的表征,后续研究进一步利用交互历史以丰富单一ID。近年来,考虑到图卷积网络(GCNs)能够有效在user-item二分图中捕获高阶邻居,其在推荐领域的表示学习中得到了广泛的应用,并实现了最先进的推荐性能。尽管如此,当前基于GCN的推荐模型仍存在一些局限性:

1、稀疏监督信号。大多数模型在有监督的学习范下处理推荐任务,其中监督信号来自观察到的用户-项目交互。但是,与整个交互空间相比,观察到的交互非常稀疏,这使得学习质量表示不足。

2、倾斜的数据分配。观察到的相互作用通常表现出幂律分布,其中长尾由缺乏监督信号的low-degree项组成。相反high-degree项频繁出现在邻域聚集和监督损失中,从而对表示学习产生更大的影响。因此,GCN很容易偏向high-degree项目,从而牺牲了低级(长尾)项目的性能。

3、交互中的噪音。用户提供的大多数反馈是隐式的(如点击次数、观看次数),而不是显式的(如评分、喜欢/不喜欢)。因此,观察到的交互通常包含噪音,例如用户被误导以点击项目,并在消费了该项目后发现它不再有趣。 GCN中的邻域聚集方案扩大了交互对表示学习的影响,使学习更容易受到交互噪声的影响。

为解决上述局限,本文作者将重点探索推荐系统中的自我监督学习(SSL)。尽管SSL在计算机视觉(CV)和自然语言处理(NLP)中被普遍使用,但其在推荐中仍很少被探索。作者认为若要在推荐中利用SSL,大致想法应是要设置一个从输入数据本身中提取额外信号的辅助任务,特别是通过利用未标记的数据空间。例如,BERT随机掩码句子中的一些标记,将掩码标记的预测作为捕获标记间依赖关系的辅助任务;RotNet随机旋转标记图像,对旋转后的图像进行模型训练,得到改进的表示,用于物体识别或图像分类的掩模任务。与监督学习相比,SSL允许我们通过对输入数据进行更改来利用未标记的数据空间,从而显着改善了下游任务。

为此,作者希望将SSL的优势引入推荐表示学习中,这与CV / NLP任务不同,因为数据是离散且相互连接的。为了解决基于GCN的推荐模型的上述局限性,作者将辅助任务构造为区分节点本身的表示形式。具体来说,它由两个关键组件组成:1)数据增强,为每个节点生成多个视图;2)对比学习,使同一节点的不同视图之间的一致性最大化。对于用户-项目图上的GCNs,图结构作为输入数据,在表示学习中起着至关重要的作用。从这个角度来看,通过改变图的邻接矩阵来构造“无标记”数据空间是很自然的,为此作者开发了三个算子:node dropout、edge dropout和 random walk,其中每个算子都有不同的合理性。然后,作者在改变后的结构上进行基于GCNs的对比学习。最终,SGL通过探索节点之间的内部关系来增强节点表示学习。

从概念上讲,本文SGL在以下方面对现有的基于GCN推荐模型进行了补充:1)节点自我判别提供辅助监督信号,这是对仅观察到的交互的经典监督的补充;2)增强算子,尤其是edge dropout,通过有意地减少了high-degree节点的影响,有助于减轻degree偏差;3)节点的多视图(不同的局部结构和邻域)增强了模型对交互噪声的鲁棒性。最后,作者对对比学习范式进行了理论分析,发现它在挖掘hard negative samples方面具有副作用,这不仅提高了性能,而且加快了训练过程。

值得一提的是,本文SGL与模型无关,可以应用于包含用户和/或项目嵌入的任何基于图的模型。在这里,作者在简单但有效的模型LightGCN上实现它。在三个基准数据集上的实验研究表明,该方法显著提高了推荐精度,特别是对长尾项目的推荐精度,增强了对交互噪声的鲁棒性。

最后,本文贡献总结如下:

1、设计了一种新的学习范式SGL,它将节点自我辨别作为自我监督任务,为表征学习提供辅助信号。

2、除了减轻degree偏差和增强对交互噪声的鲁棒性外,作者在理论上证明了SGL天生支持从hard negative samples中学习,这主要通过动态控制softmax损失函数中的超参数实现。

3、在三个基准数据集上进行了广泛的实验,以证明SGL的优越性。

2 基本定义

基于GCN协同过滤模型的通用范式

GCN:核心是应用领域聚合方案,即通过聚合邻居节点表示来更新自我节点表示:

H表示邻域聚集函数,从向量层上更容易理解:

其中,第l层的表示对图中的l阶邻居进行编码。在获得L层表示法后,可能会有一个读出函数来生成最终的表示用于预测:

常见操作有concatenation,weighted sum等。

监督学习损失:预测层建立在最终表示的基础上,以预测u采用i的可能性。一个经典的解决方案是内积,它支持快速检索:

为了优化模型参数,现有的工作通常将该任务作为监督学习之一,监督信号来自观察到的交互作用(也就是图G中的边)。例如,支持预测值y~接近真实值y,并从缺失数据中选择反例。除了上述point-wise学习之外,另一个常见的选择是pair-wise贝叶斯个性化排序(BPR)损失,这使得观察到的交互预测得分高于未观察到的交互。

在这项工作中,作者选择它作为主要的监督任务。

3 模型方法

本文提出了自监督图学习范式(SGL),该范式将主要下游监督任务与自监督学习结合起来,其中自我监督任务(也称为pretext or auxiliary任务)是从输入数据内部的相关性中构造监督信号。下图说明了SGL的工作流程:

上层描述了主要监督学习任务的工作流程,底层描述了SSL任务的工作流程,并在图结构上进行了扩充。

图结构上的数据扩充

由于以下特定特征,直接在基于图的推荐中采用CV和NLP任务中的数据增强是不可行的。

(1)用户和物品的特征是离散的,如one-hot ID等分类变量。因此,图像上的增强操作,如随机裁剪、旋转或模糊,是不适用的。

(2)更重要的是,与将每个数据实例视为独立的CV和NLP任务不同,交互图中的用户和项目本质上是相互连接和依赖的。因此,我们需要为基于图的推荐定制新的增强运算符

二部图建立在观察到的用户-物品交互上,因此包含协同过滤信号。具体来说,第一跳邻近节点直接描述了自我用户和项目节点,即用户的历史项目(或项目的交互用户)可以被视为用户(或项目)的预先存在特征。用户(或项目)的第二跳邻近节点表示类似用户(或类似项目)。此外,从用户到商品的higher-order路径反映了用户对商品的潜在兴趣。毫无疑问,挖掘图结构中的固有模式有助于表示学习。因此,作者在图结构上设计了三个算子:node dropout, edge dropout 和 random walk,以创建不同的节点视图。运算符可以一致表示为:

其中,在图G中独立进行随机选择s1和s2,从而构建两个相关视图Z1(l)和Z2(l)。三个增广算子详细阐述如下:

Node Dropout (ND)以概率ρ从图中丢弃每个节点及其连接边。

式中,M`, M``∈{0,1} | V |是两个掩码向量,应用于节点集V生成两个子图。因此,这种增强可以从不同的增强视图中识别出有影响的节点,使表示学习对结构变化不那么敏感。

Edge Dropout (ED)以概率ρ从图中丢弃边。

其中M1, M2∈{0,1} | E |是边集E上的两个掩码向量。只有邻域内的部分连接对节点表示有贡献。因此,耦合这两个子图的目的是捕获节点局部结构的有用模式,并进一步赋予表示对噪声交互的更强的鲁棒性。

Random Walk (RW)上面的两个算子生成一个跨所有图卷积层共享的子图。为了探索更高的性能,作者考虑为不同的层分配不同的子图。这可以看作是使用随机游走为每个节点构造单独的子图。假设在每一层(有不同的比例或随机种子)选择edge dropout,则可以通过利用边掩蔽向量对层敏感来制定RW(如下图所示):

为了简单起见,作者在图结构的每个epoch上应用这些增强,也就是说,在一个新的训练epoch开始时,对每个节点生成两个不同的视图(对于RW,每层生成两个不同的视图)。请注意,对于两个独立进程(即s1和s2), dropout和masking比率是相同的。我们将不同比例的调整留到以后的工作中。值得一提的是,只涉及到dropout和masking操作,并且没有添加任何模型参数。

对比学习

将来自同一节点的增强视图视为正例,来自不同节点间的增强视图视为负例。正例辅助监督促进了同一节点的不同视图之间的预测一致性,而负例监督则强化了不同节点之间的分歧。形式上,遵循SimCLR,并采用对比损失InfoNCE来最大化正例的一致性,最小化负例的一致性:

项目上的损失如上类似构建。最终的自监督任务损失如下:

多任务学习

为了改进SSL任务的推荐,作者利用多任务训练策略联合优化经典推荐任务和自我监督学习任务:

SGL理论分析

此外作者还对SGL进行了深入的理论分析,旨在回答问题:推荐模型如何从SSL任务中获益?为此,作者探究了式Lssluser中的自监督损失,发现原因之一:它具有执行hard negative samples的内在能力,为优化贡献了较大且有意义的梯度,并指导节点表示学习。

复杂度分析

以ED为策略,以LightGCN为推荐模型分析了SGL的复杂性;其他选择也可以用类似的方法进行分析。由于SGL不引入可训练参数,空间复杂度与LightGCN相同。模型推理的时间复杂度也是一样的,因为模型结构没有变化。具体分析结果如下表1(Yelp为例,ρ设置为0.8):

3 实验

实验设置 

数据集概述:

作者对三个基准数据集进行了实验: Yelp2018, Amazon-Book和Alibaba-iFashion。所有三个数据集的统计数据汇总在表2中。以7:1:2的比例将交互分为训练、验证和测试集。

对比方法

NGCF (2019, SIGIR, CCF A):一种基于图的CF方法,在很大程度上遵循了标准GCN。在消息传递过程中,它还将二阶特征交互编码为消息。(在建议的范围内调整正则化系数λ和GCN层数)

LightGCN  (2020, SIGIR, CCF A):该方法设计了一种轻量级图卷积以提高训练效率和生成能力。(调整λ和GCN层数)

Mult-VAE (2018, WWW, CCF A):一种基于变分自动编码器(VAE)的基于项目的CF方法。使用了辅助重建目标对其进行了优化,可以将其视为SSL的特例。(调整dropout和β)

DNN+SSL (2020, CoRR abs/2007.12865):一种基于SSL的最新推荐方法。使用DNN作为物品的编码器,它在物品的现有特征上采用了两个增强运算符,即特征屏蔽(FM)和特征缺失(FD)。在没有项目功能可用的情况下,会将增强应用于项目的ID嵌入。(调整DNN架构(即层数和每层神经元数))

在LightGCN上,作者实现了三个版本的SGL- ND、SGL- ED和SGL-RW,分别配置了Node Dropout、Edge Dropout和Random Walk。

性能对比

三种SGL与LightGCN的对比结果。根据表3所示的结果,有如下几点结论:

(1)在大多数情况下,三种SGL实现的性能都大大优于LightGCN,这表明了用自我监督学习补充推荐任务的优越性。

(2)在SGL家族中,SGL- ED在10 / 18例中表现最佳,而SGL- RW在所有三个数据集中表现也优于SGL- ND。作者把这归因于ED算子能够捕获图结构中的固有模式。此外,在较密集的数据集(Yelp2018和Amazon-Book)中,SGL-ED的性能优于SGL-RW,而在较稀疏的数据集(Alibaba-iFashion)中稍差。一个可能的原因是,在稀疏的数据集中,ED更容易阻塞low-degree节点(不活跃的用户和不受欢迎的项目)的连接,而RW可以在不同层次上恢复它们的连接,如图2中u1和i1所示。

(3)SGL-ND比SGL-ED和SGL-RW更不稳定。例如,在Yelp2018和Amazon-Book上,SGL-ED和SGL-RW的性能随着层次的加深而增加,而SGL-ND表现出不同的模式。Node Dropout可以看作是Edge Dropout的一种特殊情况,即丢弃几个节点周围的边缘。因此,去掉high-degree节点会极大地改变图的结构,从而影响信息聚合,使训练不稳定

(4)Amazon-Book和Alibaba-iFashion的改进比Yelp2018更显著。这可能是由数据集的特性引起的。具体来说,在Amazon-Book和Alibaba-iFashion中,来自用户-物品交互的监督信号过于稀疏,无法指导LightGCN中的表示学习。在自我监督任务的帮助下,SGL获得辅助监督来辅助表征学习。

(5)将模型深度从1级增加到3级,可以提高SGL的性能。这说明利用SSL可以增强基于GCN的推荐模型的泛化能力,即不同节点之间的对比学习有望解决节点表示的过平滑问题,进一步避免过拟合问题。

表3 与LightGCN在不同层的性能比较。LightGCN在Yelp2018和AmazonBook上的表现是抄袭其原始论文。括号中的百分比表示相对于LightGCN的性能改进。粗体表示最佳结果。

与先进技术的比较。表4总结了与各种基准的性能比较,有如下几点结论:

(1)SGL-ED的表现始终优于所有基线。这再次验证了引入自我监督学习的合理性和有效性。

(2)LightGCN的性能优于NGCF和Mult-VAE,这与LightGCN论文的要求一致。在Alibaba-iFashion数据中,MultVAE的表现与NGCF和LightGCN不相上下,而在Amazon-Book中超过了NGCF。

(3)DNN+SSL是Amazon-Book上最强的基线,显示了SSL在推荐方面的巨大潜力。令人惊讶的是,在其他数据集上,DNN+SSL的性能比SGL-ED差得多。这表明,在ID嵌入上直接应用SSL可能不如在图表示上应用SSL。

(4)显著性检验,其中p -value<0.05表明SGL-ED优于最强基线的改善均具有统计学意义。

SGL的益处

长尾推荐。正如引言中提到的,基于GNN的推荐模型很容易遭受长尾问题。为了验证SGL是否有解决问题的能力,作者根据受欢迎程度将项目分成10组,同时保持每组的互动总数相同。GroupID越大,item的度越大。然后将整个数据集的Recall@20度量分解为单个组的贡献,如下:

结果图1所示,有如下几点结论:

(1)LightGCN倾向于推荐high-degree物品,而长尾物品则较少暴露。 具体来说,尽管第10组仅包含0.83%、0.83%和0.22%的项目空间,但在三个数据集中分别占总Recall得分的39.72%,39.92%和51.92%。 这说明由于交互信号稀疏,LightGCN几乎不学习长尾物品的高质量表示。而SGL具有缓解此问题的潜力:10个组的贡献在三个数据集中分别降至36.27%,29.15%和35.07%。

(2)联合分析表3和图1,发现SGL的性能改进主要来自准确推荐交互稀疏的项目。这再次验证了表示学习在自我监督中的巨大收益,从而可以建立比LightGCN更好的这些项目的表示。

图1  SGL-ED和LightGCN在不同项目组上的性能比较。图例中的后缀表示GCN层的数量。

训练效率。研究自监督学习对训练效率的影响。图2为SGL-ED和LightGCN在Yelp2018和Amazon-Book上的训练曲线。随着epoch的增加,上面的子图显示了训练损失的变化,而下面的子图记录了测试集的性能变化。有以下观察结果:

(1)显然,在Yelp2018和Amazon-Book上,SGL的收敛速度比LightGCN快得多。特别是,SGL在第18个和第16个epoch达到了最佳性能,而LightGCN在这两个数据集中分别达到了720个和700个epoch。这表明SGL可以大大减少训练时间,同时也取得了显着的改进。作者将这种加速归因于两个因素:a. SGL采用InfoNCE损失作为SSL目标,这使模型能够从多个负样本中学习表示,而LightGCN中的BPR损失仅使用一个负样本限制了模型的感知范围; b. 如方法所述,在具有适当的t的情况下,SGL受益于动态hard negative mining,其中hard negative samples提供有意义且更大的梯度以指导优化。

(2)BPR损失的快速下降期的初始稍晚于Recall的快速上升期。这表明BPR损失和排名任务之间存在差距。在以后的工作中,作者将对此现象进行深入研究。

图2  SGL-ED和LightGCN在三个数据集上的训练曲线。图例中的后缀表示层号。

对噪声交互的鲁棒性。检验该算法对噪声交互的鲁棒性。在保持测试集不变的同时,通过添加一定比例的对抗例子(例如,5%,10%,15%,20%消极用户-物品交互)来污染训练集。图3显示了Yelp2018和AmazonBook数据集上的结果,有如下几点结论:

(1)显然,添加噪声数据会降低SGL和LightGCN的性能。但SGL的性能退化程度低于LightGCN。此外,随着噪声比的增大,两条退化曲线之间的差距越来越明显。这表明,通过比较不同的节点扩展视图,SGL能够找出有用的模式,特别是节点的信息图结构,并减少对某些边的依赖。总之,SGL为推荐中去噪假正交互提供了一个不同的角度。

(2)专注于Amazon-Book,附加20%噪声交互的SGL性能仍然优于无噪声数据集的LightGCN。这进一步证明了SGL相对于LightGCN的优越性和鲁棒性。

(3)SGL在Yelp2018上更健壮。可能的原因是Amazon-Book比Yelp2018稀疏得多,添加噪声数据对Amazon-Book的图结构的影响要大于Yelp2018。

图3  噪声对模型性能的影响。条形图表示召回率,而线表示性能下降的百分比。

SGL性能研究

Temperature τ的影响τ在hard negative samples中起关键作用。结果如图4所示,结论如下:

(1)增大τ值(例如1.0)会导致表现较差,需要更多的训练时数来收敛,这使得区分hard negatives和easy negatives的能力不足。

(2)相比之下,将τ固定在一个过小的值(如0.1)会损害模型性能,因为少数负样本的梯度主导了优化,从而失去了在SSL目标中添加多个负面样本的优势。简而言之,我们建议在0.1~1.0的范围内谨慎地τ。

图4  不同τ下的模型性能曲线。

预训练的影响。上述实验证明了主监督任务和自我监督任务的联合优化是有效的,在这里主要验证预训练模型是否可以进一步提升推荐性能。为此,作者首先对自我监督任务进行预训练,获取模型参数,用这些参数初始化LightGCN,然后通过优化主要任务对模型进行微调。将此变体称为SGL-pre,结果如表5所示,有以下结论:

(1)尽管SGL-pre在两个数据集上的表现都不如SGL-ED,但SGL-pre的结果仍然好于LightGCN (参见表3)。说明自监督任务能够为LightGCN提供更好的初始化,这与之前研究的观察一致。然而,联合训练的较好表现也说明了主任务和辅助任务的表征是相互增强的

负样本的影响研究了负样本选择对自监督任务的影响。作者考虑了两种变体: (1)SGL-ED-batch,区分节点类型,将小批处理中的用户和项目分别视为用户和项目的负面视图; (2)SGL-ED-merge,将小批处理中的节点视为负面视图,不区分节点类型。结果如表5所示,有以下结论:

(1)SGL-ED-batch性能优于SGL-ED-merge,说明需要区分异构节点类型。此外,SGL-ED-batch和SGL-ED一样,都将用户和项目的整个空间视为负面。这表明在小批处理中训练SSL任务是一种有效的替代方法。

4 总结

本文认识到在一般监督学习范式下基于图推荐的局限性,并探索了SSL解决这些局限性的潜力。特别地,作者提出了一个模型无关的框架SGL来补充监督推荐任务与自监督学习的用户-项目图。从图结构的角度,设计了三种不同方面的数据扩充来构建辅助对比任务。最后在三个基准数据集上进行了广泛的实验,证明了SGL在长尾推荐、训练收敛和抗噪声交互鲁棒性方面的优势。

这项工作代表了利用自我监督学习进行推荐的初步尝试,并开辟了新的研究可能性。在未来的工作中,作者希望通过推荐任务使SSL更加牢固。除了图形结构上的随机选择,作者计划探索新的视角,如反事实学习来识别有影响的数据点,以创建更强大的数据扩充。此外,将重点关注推荐中的预训练和微调,即对一个能够捕获跨多个领域或数据集的通用和可转移用户模式的模型进行预训练,并在即将到来的领域或数据集上对其进行微调。另一个有希望的方向是实现SSL解决长尾问题的潜力。作者希望SGL的发展有助于提高推荐模型的泛化和可移植性。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容