Improving Techniques for Training GANs

介绍

生成对抗网络(GAN)是一类基于博弈论的生成模型学习方法。 GAN的目标是训练生成器网络G(z;θ^{(G)}),该生成器网络通过将噪声z的向量转换为x = G(z;θ^{(G)}),从数据分布p_{data}(x)生成样本。G的训练信号由一个鉴别器网络D(x)提供,该鉴别器网络D(x)被训练以区分样本和真实数据中的生成器分布p_{model}(x)。 继而训练生成器网络G,以欺骗鉴别器接受其输出为真实的。
GAN的最新应用表明,它们可以产生出色的样品。 但是,训练GAN需要找到具有连续高维参数的非凸博弈的Nash平衡。 GAN通常使用梯度下降技术进行训练,梯度下降技术旨在发现成本函数的低值,而不是寻找游戏的纳什均衡。当用于寻求纳什均衡时,这些算法可能无法收敛。在这项工作中,我们介绍了几种旨在鼓励GAN游戏融合的技术。这些技术是由对非收敛问题的启发式理解所激发的。 它们可以改善半监督学习性能并改善样本生成。 我们希望其中一些可以构成未来工作的基础,为融合提供正式保证。

相关工作

最近的几篇论文集中在提高训练的稳定性和GAN样本的感知质量。 在这项工作中,我们将基于其中一些技术。 例如,我们使用了Radford等人提出的一些“ DCGAN”架构创新。如下所述。
第一部分中讨论了我们提出的技术之一:特征匹配。 3.1类似于使用最大平均差异训练生成器网络的方法。我们提出的另一种技术:minibatch特性,部分基于用于批次归一化的思想,而我们提出的虚拟批次归一化是批次归一化的直接扩展。
这项工作的主要目标之一是提高针对半监督学习的生成对抗网络的有效性(通过学习其他未标记的示例来提高监督任务的性能,在这种情况下为分类)。 像许多深度生成模型一样,GAN以前已应用于半监督学习,我们的工作可以看作是这项工作的延续和完善。

走向融合GAN训练

训练GAN的目的在于找到两人非合作游戏的纳什均衡。每个参与者都希望最小化自己的成本函数,鉴别器的J^{(D)}(θ^{(D)},θ^{(G)})和生成器的J^{(G)}(θ^{(D)},θ^{(G)})。 Nash平衡点是一个点θ^{((D)},θ^{(G)}),使得J^{(D)}相对于θ^{(D)}最小,而J^{(G)}相对于θ^{(G)}最小 。 不幸的是,找到纳什均衡是一个非常困难的问题。 存在针对特殊情况的算法,但是我们不知道适用于GAN游戏的任何可行算法,其中成本函数是非凸的,参数是连续的,并且参数空间的维数很高。
当每个玩家的成本都最低时就会出现纳什均衡的想法似乎在直观上激发了使用传统的基于梯度的最小化技术同时最小化每个玩家的成本的想法。 不幸的是,减小J^{(D)}θ^{(D)}的修改可以增加J^{(G)},减小J^{(G)}θ^{(G)}的修改可以增加J^{(D)}。 因此,梯度下降无法在许多游戏中收敛。 例如,当一个参与者相对于x最小化xy,而另一个参与者相对于y最小化-xy时,梯度下降进入一个稳定的轨道,而不是收敛到期望的平衡点x = y = 0 。 因此,尽管缺乏保证该程序会收敛的方法,但以前的GAN训练方法却同时在每个玩家的费用上应用了梯度下降。 我们介绍以下启发式鼓励融合的技术:

特征匹配

特征匹配通过为生成器指定一个新的目标来防止GAN不稳定,以防止其在当前鉴别器上过度训练。 新目标不是直接使鉴别器的输出最大化,而是要求生成器生成与实际数据的统计信息匹配的数据,在这里,我们仅使用鉴别器来指定我们认为值得匹配的统计信息。 具体来说,我们训练生成器以使其与鉴别器中间层上的要素的期望值匹配。 这是生成器要匹配的统计信息的自然选择,因为通过训练鉴别器,我们要求鉴别器找到对真实数据与当前模型生成的数据最能区分的那些特征。
令f(x)表示鉴别器中间层上的激活,生成器的新目标定义为:|| E_{x〜p_{data}} f(x)-E_{z〜p_{z}(z)}f(G(z))||_2^2。 鉴别器以及f(x)以常规方式训练。 与常规GAN训练一样,该目标有一个固定点,其中G与训练数据的分布完全匹配。 在实践中,我们无法保证达到此固定点,但是我们的经验结果表明,在常规GAN变得不稳定的情况下,特征匹配确实有效。

最小批量判别

GAN的主要故障模式之一是在始终与输出相同点的参数设置使得生成器崩溃。 当即将崩溃为单一模式时,对于许多相似点,鉴别器的梯度可能指向相似方向。 由于鉴别器独立地处理每个示例,因此其梯度之间没有协调,因此也没有机制可以告诉生成器的输出彼此之间变得越来越不相似。 取而代之的是,所有输出都朝着鉴别器当前认为高度现实的单个点竞争。
发生崩溃后,鉴别器得知该点来自生成器,但是梯度下降无法分离相同的输出。 然后,鉴别器的梯度将生成器产生的单个点永远推向空间周围,并且该算法无法收敛到具有正确熵量的分布。 避免此类失败的一种明显策略是,允许鉴别器组合查看多个数据示例,并执行我们所谓的小批量鉴别。
最小批量判别的概念非常笼统:任何将多个示例组合而不是孤立地查看多个示例的辨别器模型都可能有助于避免生成器崩溃。 实际上,Radford等人成功地将批归一化应用到了鉴别器中。 但是,到目前为止,我们已经将实验限制在明确旨在识别特别靠近的发生器样本的模型上。 一个成功的用于对小批量中的示例之间的紧密度进行建模的规范如下:令f(x_i)∈\mathbb{R}^A表示由判别器中的某个中间层生成的输入x_i的特征向量。 然后我们将向量f(x_i)乘以张量T∈\mathbb{R}^{A×B×C},得出矩阵M_i∈\mathbb{R}^{ B×C}。 然后,我们计算样本i∈\{1、2,...n\}之间的结果矩阵M_i的行之间的L1距离并应用负指数(图1):c_b(x_i,x_j)= exp(-|| M_{i,b}-M_{j,b} ||_{L1})∈\mathbb{R}。然后将样本x_i的此小批量生产层的输出o(x_i)定义为c_b(x_i,x_j)与所有其他样本的和:
\omicron(\mathcal{x}_i)_b=\underset{j=1}{\overset{n}\sum}c_b(x_i,x_j)\in\mathbb{R} \\ \omicron(x_i)=[\omicron(x_i)_1,\omicron(x_i)_2,...,\omicron(x_i)_B]\in\mathbb{R}^B \\ \omicron(X)\in\mathbb{R}^{n*B}

Figure

图描绘了小批量鉴别的工作原理。 来自样本x_i的特征f(x_i)通过张量T相乘,并计算交叉样本距离。

接下来,我们将小批量生产层的输出o(x_i)与作为其输入的中间特征f(x_i)连接起来,并将结果馈送到鉴别器的下一层。 我们分别针对生成器和训练数据中的样本计算这些小批量功能。 像以前一样,仍然需要鉴别器为每个示例输出一个数字,以指示该数据来自训练数据的可能性:鉴别器的任务因此仍然有效地将单个示例分类为真实数据或生成的数据,但是 现在可以将minibatch中的其他示例用作辅助信息。 最小批量判别使我们能够非常快速地生成视觉上吸引人的样本,在这方面,它优于特征匹配。 但是,有趣的是,如果目标是使用第5节中描述的半监督学习方法来获得强大的分类器,那么特征匹配会更好地工作。

历史平均

在应用此技术时,我们修改每个玩家的损失使其包括项||θ− \dfrac{1}{t} \sum_{i=1}^{t}θ[i] ||^2,其中θ[i]是过去时间i的参数值。 可以以在线方式更新参数的历史平均值,因此该学习规则可以很好地扩展到长时间序列。 这种方法受到虚拟玩法算法的宽松启发,该算法可以在其他类型的游戏中找到平衡点。我们发现,我们的方法能够找到低维连续非凸游戏的平衡点,例如一个拥有一个控制x的玩家,另一个控制y以及值函数(f(x)− 1)( y − 1),其中对于x <0,f(x)= x,否则f(x)=x^2。 对于这些相同的玩具游戏,梯度下降由于进入不接近平衡点的扩展轨道而失败。

单面标签平滑

标签平滑,一种来自1980年代的技术,最近由Szegedy等人独立发现。用平滑值(如.9或.1)替换了分类器的0和1目标,并且最近被证明可以降低神经网络对对抗性示例的脆弱性。
用α替换正分类目标,用β替换负分类目标,最佳鉴别符变为D(x)=\dfrac{αp_{data}(x)+βp_{model}(x)}{p_{data}(x)+ p_{model}(x)}。 分子中p_{model}的存在是有问题的,因为在p_{data}近似为零且p_{model}大的区域中,来自p_{model}的错误样本没有动力靠近数据。 因此,我们仅将正标签平滑为α,将负标签设置为0。

虚拟批处理标准化

批处理标准化极大地改善了神经网络的优化,并被证明对DCGAN非常有效。 但是,它会使输入示例x的神经网络输出高度依赖于同一小批处理中的其他几个输入x'。 为避免此问题,我们引入了虚拟批次归一化(VBN),其中,每个示例x都是基于对参考批次的样本进行统计而标准化的,这些参考批次被选择一次并在训练开始时固定不变,并且基于x本身。 参考批次仅使用其自己的统计数据进行标准化。 VBN在计算上很昂贵,因为它需要在两个小批量数据上进行正向传播,因此我们仅在生成器网络中使用它。

图像质量评估

生成的对抗网络缺乏目标功能,这使得比较不同模型的性能变得困难。 通过让人类判别者判断样本的视觉质量,可以获得一种直观的性能指标。 我们使用图2中的Web界面(使用http://infinite-chamber-35121.herokuapp.com/ cifar-minibatch /)通过Web界面使用Amazon Mechanical Turk(MTurk)自动化该过程,我们使用它来询问判别者能否区分生成的数据和真实的数据。 我们对模型进行的质量评估将在第6节中进行描述。使用人工判别者的缺点是,度量标准会根据任务的设置和注释器的动机而变化。 我们还发现,当我们向判别者提供有关他们的错误的反馈时,结果会发生巨大的变化:通过从此类反馈中学习,判别者可以更好地指出生成图像中的缺陷,从而给出更加悲观的质量评估。 图2的左列显示了注释过程的屏幕,而右列显示了我们如何告知注释者错误。

Figure2

Web界面提供给注释者。 要求注释者将计算机生成的图像与真实的图像区分开。

作为人类判别者的替代方法,我们提出了一种自动评估样本的方法,我们发现该方法与人类评估具有很好的相关性:我们将Inception model应用于每个生成的图像,以获得条件标签分布p(\mathcal{y} | x) 。 包含有意义对象的图像应具有低熵的条件标签分布p(\mathcal{y} | x)。 此外,我们希望模型能够生成变化的图像,因此边际\int p(\mathcal{y} | x = G(\mathcal{z}))d\mathcal{z}应该具有较高的熵。结合这两个要求,我们建议的度量标准是:exp(\mathbb{E}_xKL(p(\mathcal{y} | x)|| p(\mathcal{y}))),在这里我们对结果求幂,以便更容易比较这些值。 我们的Inception分数与用于训练CatGAN中的生成模型的目标紧密相关:尽管使用这种目标进行训练的成功率较低,但我们发现这是一种很好的评估指标,与人类的判断力非常相关。 我们发现,在足够多的样本(即50k)上评估指标很重要,这是该指标衡量多样性的一部分。

半监督学习

考虑一个标准分类器,用于将数据点x分类为K个可能的分类之一。 这样的模型将x作为输入,并输出logits \{l_1,…,l_K\}的K维向量 ,则可以通过应用softmax将其转换为类概率:p_{model}(y = j | x)= \dfrac{ exp(l_j)}{\sum_K^{K = 1} exp(l_k)}。 在监督学习中,通过最小化观察到的标签与模型预测分布p_{model}(y | x)之间的交叉熵来训练这种模型。
我们可以通过将来自GAN生成器G的样本添加到我们的数据集中,使用新的“生成的”类别y = K + 1对其进行标记,然后相应地增加分类器输出的维度,从而对任何标准分类器进行半监督学习。 K到K + 1。然后,我们可以使用p_{model}(y = K + 1 | x)来提供x为假的概率,对应于原始GAN框架中的1- D(x)。 现在我们还可以从未标记的数据中学习,只要我们知道通过最大化log \ p_{model}(y∈{1,...,K} | x)它对应于K类真实数据之一即可。
假设我们的数据集的一半包含真实数据,并且生成了一半(这是任意的),那么我们训练分类器的损失函数就变为:
L=-\mathbb{E}_{x,y\sim p_{data}}[log\ p_{model}(y|x)]-\mathbb{E}_{x\sim G}[log\ p_{model}(y=K+1|x)] \\ =L_{supervised}+L_{unsupervised},\ where \\ L_{supervised} = -\mathbb{E}_{x,y\sim p_{data}} log\ p_{model}(y|x,y<K+1) \\ L_{unsupervised}=-\{\mathbb{E}_{x\sim p_{data}}log[1-p_{model}(y=K+1|x)]+\mathbb{E}_{x\sim G}log[p_{model}(y=K+1|x]\},
我们将总交叉熵损失分解为标准监督损失函数L_{supervised}(来自真实数据的标签的对数概率)和无监督损失L_{unsupervised},实际上是标准GAN博弈值。当我们将D(x)= 1 − p_{model}(y = K + 1 | x)代入表达式时,很明显:
L_{unsupervised} = -\{\mathbb{E}_{x\sim p_{data}(x)}log\ D(x)+\mathbb{E}_{z\sim noise}log (1-D(G(z)))\}
最小化L_{supervised}L_{unsupervised}的最佳解决方案是对于某些不确定的缩放函数c(x)让exp [l_j(x)] = c(x)p(y = j,x)∀j<K + 1exp [l_{K + 1}(x)] = c (x)p_G(x)。 因此,在Sutskever等人的意义上,无监督损失与有监督损失是一致的。我们可以希望通过共同最小化这两个损失函数,从数据中更好地估计该最优解。 在实践中,L_{unsupervised}仅在最小化分类器时会有所帮助,因此我们需要训练G来近似数据分布。 一种方法是使用我们的鉴别器定义的鉴别符D来训练G以最小化GAN游戏值。 这种方法引入了G和我们尚未完全理解的分类器之间的交互作用,但是根据经验,我们发现使用特征匹配GAN优化G可以很好地用于半监督学习,而使用GAN结合小批量判别来训练G则无法实现。 在这里,我们使用这种方法展示了我们的经验结果。 使用这种方法对D和G之间的相互作用进行完整的理论理解还留待以后的工作。
最后,请注意,我们的K + 1个输出的分类器是超参数:从每个输出logit减去通用函数f(x),即设置l_j(x)←\ l_j(x)− f(x)∀j不会更改softmax的输出。 这意味着我们可以等价于l_{K + 1}(x)=0∀x,在这种情况下,L_{supervised}成为我们原始分类器具有K个分类的标准监督损失函数,而鉴别器D由D(x)= \dfrac{Z(x )}{Z(x)+1},其中Z(x)= \sum_{k=1}^K exp [l_k(x)]

标签对图像质量的重要性

除了在半监督学习中获得最新技术成果外,上述方法还具有令人惊讶的效果,可以改善人工判断者判断的生成图像的质量。 原因似乎是人的视觉系统非常适合图像统计数据,可以帮助推断图像代表的对象类别,而对局部统计数据的敏感性较低,而局部统计数据对于解释图像的重要性不那么重要。 我们发现人类判断者报告的质量与我们在第4节中开发的初始得分之间的高度相关性支持了这一点,该得分明确地构造为测量生成图像的“客观性”。 通过使鉴别符D对图像中显示的对象进行分类,我们使它偏向于开发一种内部表示,该内部表示将重点放在人类强调的相同功能上。 可以将这种效果理解为一种转移学习的方法,并且有可能被更广泛地应用。 我们将进一步探讨这种可能性,以备将来之用。

实验

我们在MNIST,CIFAR-10和SVHN上进行了半监督实验,并在MNIST,CIFAR-10,SVHN和ImageNet上进行了样本生成实验。

MNIST

MNIST数据集包含60,000个带数字标签的数字图像。 考虑到包含20、50、100和200个标记示例的设置,我们使用其中的一小部分随机抽取的值执行半监督训练。 结果是对标记数据的10个随机子集取平均,每个子集被选择为每个类具有均衡数量的示例。 提供的其余训练图像没有标签。 我们的网络每个都有5个隐藏层。 我们使用权重归一化,并将高斯噪声添加到鉴别器每一层的输出。 表1总结了我们的结果。


Table1

排列不变MNIST上半监督设置的分类错误的测试示例数。 结果平均超过10个种子。

在使用特性匹配的半监督学习过程中,生成器生成的样本看起来没有视觉吸引力(图3)。 通过使用小批量判别,我们可以改善它们的视觉质量。 在MTurk上,判别者能够区分52.4%的案例(总计2000票)中的样本,其中50%将通过随机猜测获得。 同样,我们机构的研究人员无法找到任何可以区分样本的人工制品。 但是,具有小批量判别的半监督学习不能产生与特征匹配一样好的分类器。


Figure3

模型在半监督训练期间生成的(左)样本。 可以将样本与来自MNIST数据集的图像区分开来。(右)以小批量鉴别产生的样品。 样本与数据集图像完全无法区分。

CIFAR-10

CIFAR-10是一个小型的,适用于学习的32×32自然图像的数据集。 我们使用此数据集来研究半监督学习,以及检查可以实现的样本的视觉质量。对于我们GAN中的鉴别器,我们使用具有dropout和权重归一化的9层深度卷积网络。 生成器是具有批归一化功能的4层深CNN。表2总结了我们在半监督学习任务中的结果。


Table2

Figure4

在CIFAR-10的半监督训练期间生成的样本,具有特征匹配(第3.1节,左)和小批量鉴别(第3.2节,右)。

当展示由我们最好的CIFAR-10模型生成的50%真实数据和50%假数据时,MTurk用户正确地对78.7%的图像进行了正确分类。 但是,MTurk用户可能对CIFAR-10图像不够熟悉或缺乏动力。 我们自己能够以> 95%的准确度对图像进行分类。 我们通过观察当根据Inception分数仅使用样本的前1%来过滤数据时,MTurk准确性下降至71.4%,从而验证了上述Inception分数。 我们进行了一系列消融实验,以证明我们提出的技术可以改善表3所示的Inception得分。我们还提供了这些消融实验的图像-我们认为,Inception得分与我们对图像质量的主观判断密切相关。 来自数据集的样本达到最高值。 所有甚至部分崩溃的模型得分都相对较低。 我们提醒您,应将Inception分数用作评估通过某些独立准则训练的模型的粗略指南; 直接优化Inception分数将导致生成对抗性示例。


Figure5

(左)SVHN的错误率。 (右)来自发生器的SVHN样本。

Table3

各种模型针对50,000张图像生成的样本的初始得分表。分数与人类的判断高度相关,自然图像可获得最佳分数。生成折叠样本的模型得分较低。 此度量标准使我们避免依赖人工评估。 “我们的方法”包括本文中介绍的所有技术,但特征匹配和历史平均除外。 其余实验是消融实验,表明我们的技术有效。 如DCGAN中一样,“-VBN + BN”将生成器中的VBN替换为BN。 这会导致CIFAR样品质量略有下降。 VBN对于ImageNet更为重要。 “ -L + HA”从训练过程中删除标签,并添加历史平均值以进行补偿。 HA使仍然可以生成一些可识别的对象。 没有HA,样品质量会大大降低(请参阅“ -L”)。 相对于“我们的方法”,“-LS”消除了标签平滑并导致性能显着下降。 “ -MBF”删除了小批量功能并导致性能大大下降,甚至比除去标签导致的性能下降更大。 添加HA无法防止此问题。

ImageNet

我们在ILSVRC2012数据集测试了我们的技术:该数据集中有128个类别的128×128张图像。 据我们所知,以前没有将生成模型应用于具有如此大的分辨率和如此众多的对象类的数据集。 由于GAN倾向于低估分布中的熵,因此大量的对象类别对GAN尤其具有挑战性。 我们使用TensorFlow广泛修改了DCGANs的公共可用实现,以使用多GPU实现实现高性能。 未经修改的DCGAN会学习一些基本的图像统计信息,并生成具有某种自然色彩和纹理的连续形状,但不会学习任何对象。利用本文中描述的技术,GAN学会了生成类似于动物但解剖结构不正确的对象。 结果如图6所示。

Figure6

从ImageNet数据集生成的样本。 (左)由DCGAN生成的样本。(右)使用本工作中提出的技术生成的样本。 新技术使GAN能够学习动物的可识别特征,例如毛皮,眼睛和鼻子,但是这些特征没有正确组合以形成具有逼真的解剖结构的动物。

结论

生成对抗网络是一种很有前途的生成模型,迄今为止,由于不稳定的训练和缺乏适当的评估指标,生成模型一直受到阻碍。 这项工作提出了这两个问题的部分解决方案。 我们提出了几种稳定训练的技术,这些技术使我们能够训练以前无法训练的模型。 此外,我们提出的评估指标(初始得分)为我们比较这些模型的质量提供了基础。 我们将我们的技术应用于半监督学习的问题,从而在计算机视觉中的许多不同数据集上获得了最新的结果。 这项工作的贡献是实用的; 我们希望在以后的工作中发展出更严格的理论理解。

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