第五章 机器学习基础

》拟合训练数据和寻找能够泛化到新数据的参数有哪些不同。

》如何使用额外的数据设置超参数。

》机器学习本质上属于应用统计学,更多关注于如何用计算机统计地估计复杂函数,不太关注这些函数的置信区间;因此我们会探讨两种统计学的主要方法:频率估计和贝叶斯推断

》大部分深度学习算法都基于随机梯度下降求解。我们将介绍如何组合不同的算法部分,例如优化算法、代价函数、模型和数据集,来建立一个机器学习算法。

》一些限制传统机器学习泛化能力的因素


1 学习算法

    机器学习算法是一种可以从数据中学习的算法。定义(Mitchell,1997):对于某类任务T和性能度量P,一个计算机程序被认为可以从经验E中学习是指,通过经验E改进后,它在任务T上由性能度量P衡量的性能有所提升。

任务,T

机器学习可以解决很多类型的任务。一些非常常见的机器学习任务列举如下:

图1 常见的机器学习任务

性能度量,P

    不同任务的性能度量不同。性能度量的选择或许看上去简单且客观,但是选择一个与系统理想表现对应的性能度量通常是很难的。有些时候,很难决定应该度量什么,实际中要根据不同的应用设计需要的性能度量;还有一些情况,我们知道应该度量哪些数值,但是度量它们不太现实。这时可以设计一个替代标准,或者设计一个理想标准的良好近似。

经验,E

    很多学习算法在数据集上获取经验。根据学习过程中的不同经验,机器学习算法可以大致分类为无监督(unsupervised)和监督(supervised)。无监督学习算法(unsupervised learning algorithm)用于训练的数据集只包含样本的特征,然后学习出这个数据集上有用的结构性质。监督学习算法(supervised learning algorithm)用于训练的数据包含样本的特征和标签(label)。

2 容量,过拟合和欠拟合

    当我们在训练数据集上训练一个模型时,通过减小训练误差来优化模型,此时只是一个优化问题;机器学习和优化问题不同的是,目的不是将训练集上的误差最小化,而是在未观测过的样本上也具有良好的表现,在先前未观测到的输入上表现良好的能力被称为泛化(generalization)

训练误差(training error):在训练集上的误差。

测试误差(test error)/泛化误差(generalization error):泛化误差定义为新输入的误差期望,通过测试集上的误差来度量。

     我们只用训练集进行模型的训练,凭什么期望模型在测试集上也有良好的表现呢?换句话说,训练集数据和测试集数据有什么关系呢,当我们只能观测到训练集时,我们如何才能影响测试集的性能呢。

      统计学习理论(statistical learning theory)告诉我们,如果训练集和测试集满足独立同分布假设(i.i.d.assumption):每个数据集中的样本都是彼此相互独立的(independent),并且训练集和测试集是同分布的(identically distributed),即其上数据采样自相同的分布。我们将这个共享的潜在分布称为数据生成分布(data generating distribution)。那么,在数学上,随机选择的模型训练误差的期望和测试误差的期望是相同的。因为假设已知概率分布P(X,y),不论是训练集还是测试集,都是由该数据生成分布重复采样而得的数据集,只不过名字不同,如果概率分布的参数已经固定,两个采样数据集在随机模型上的误差的期望应该相同。当然,当我们使用机器学习算法时,我们不会提前固定参数,然后从数据集中采样。我们会在训练集上采样,然后挑选参数去降低训练集误差,然后再在测试集上采样。在这个过程中,测试误差期望会大于或等于训练误差期望。以下是决定机器学习算法效果是否好的因素:1.降低训练误差;2.缩小训练误差和测试误差的差距。这两个因素对应机器学习的两个主要挑战:

欠拟合(underfitting):模型不能在训练集上获得足够低的误差。

过拟合(overfitting):训练误差很小但测试误差大,训练误差和和测试误差之间的差距太大。

      这两个可以通过模型的容量(capacity)来调整。模型的容量是指其拟合各种函数的能力。容量低的模型可能很难拟合训练集。容量高的模型可能会过拟合,因为记住了不适用于测试集的训练集性质。控制训练算法容量的一种方法是选择假设空间(hypothesis space),即能够选为解决方案的学习算法函数集(个人理解就是模型的选择)。例如,广义线性回归的假设空间是多项式函数,如下图2。控制模型容量的另一中方法是正则化。

图2 容量,过拟合和欠拟合

    统计学习理论提供了量化模型容量的不同方法。统计学习理论中最重要的结论阐述了训练误差和泛化误差之间差异的上界随着模型容量增长而增长,但随着训练样本增多而下降。这些边界为机器学习算法可以有效解决问题提供了理论验证,但是它们很少应用于实际中的深度学习算法。

泛化误差是一个关于模型容量的U形曲线函数,如下所示。

图3 误差和模型容量关系

(1)没有免费的午餐定理 (no free lunch theorem)

      在某种意义上,没有一个机器学习算法总是比其他的要好。这意味着机器学习研究的目标不是找一个通用学习算法或是绝对最好的学习算法。我们的目标是找到在我们关注的数据生成分布上效果最好的算法。

(2)正则化

      正则化是指我们对学习算法所做的降低泛化误差而非训练误差的修改。没有免费午餐定理已经清楚阐述了没有最优的学习算法,这暗示我们必须在特定任务上设计性能良好的机器学习算法。我们建立一组学习算法的偏好来达到这个要求。当这些偏好和我们希望算法解决的学习问题相吻合时,性能会更好。正则化表示了模型的偏好,表示对函数的偏好是比增减假设空间的成员函数更一般的去控制模型容量的方法。我们可以将去掉假设空间中的某个函数看作是对不赞成这个函数的无限偏好。

3 超参数和验证集

通常将数据集分为训练集,验证机,测试集。

训练集:用来训练模型参数。

验证机:用来训练超参数。

测试集:用来计算泛化误差,评估模型。

     不在训练集上训练超参数,是因为如果在训练集上学习超参数,总是趋向于最大可能的模型容量,会导致过拟合。测试集不能用于训练超参数是因为测试样本不能以任何形式参与到模型的选择,否则最终的评估结果不准确。

4 估计,偏差和方差

(1)点估计

点估计试图为一些感兴趣的量提供单个‘‘最优’’预测。一般地,感兴趣的量可以是参数,也有可能是整个函数。点估计(point esti-mator)或统计量(statistics)可以是独立同分布的数据的任意函数。

点估计也可以指输入和目标变量之间关系的估计。我们将这类点估计称为函数估计

(2)偏差

估计的偏差定义为:

估计量无偏(unbiased):bias(θˆm) = 0,即E(θˆm) =θ。

估计量渐近无偏(asymptotically unbiased):lim(m→∞)bias(θˆm) = 0,即lim(m→∞)E(θˆm) =θ。

无偏估计并不总是‘‘最好’’的估计。有时经常会使用具有重要性质的有偏估计。

(3)方差和标准误差

(4)权衡偏值和方差以最小化均方误差

      偏差和方差度量着估计量的两个不同误差来源。偏差度量着离真实函数或参数的误差期望。而方差度量着数据上任意特定采样可能导致的估计期望的偏差。

均方误差(mean squared error):

MSE度量着估计和真实参数θ之间平方误差的总体期望偏差。MSE估计包含了偏差和方差。偏差和方差的关系和机器学习容量,欠拟合和过拟合的概念紧密相联。用MSE度量泛化误差(偏差和方差对于泛化误差都是有意义的)时,增加容量会增加方差,降低偏差。如图所示,我们再次在关于容量的函数中,看到泛化误差的U形曲线。

图4 泛化误差,偏差,方差和模型容量的关系

(5)一致性

    我们希望。当数据集中数据点的数量m增加时,点估计会收敛到对应参数的真实值。即当m趋近于正无穷时,参数的点估计会依概率收敛到真实值,这称为一致性。

    一致性保证了估计量的偏差会随数据样本数目的增多而减少。然而,反过来是不正确的——渐近无偏并不意味着一致性。

5 最大似然估计

现有包含m个样本的数据集X,假设真实的数据生成分布为p_data(x),我们利用已有的数据集得到模型p_model(x ; θ)来模拟p_data(x),即根据数据集估计参数θ的取值,就可以进行预测了。关于θ的最大似然估计为

为了防止下溢,转化为对数似然

性质:

- 最大似然估计最吸引人的地方在于,它被证明是当样本数目m→ ∞时,就收敛率而言最好的渐近估计。

- 在一定条件下,训练样本数目趋向于无限大时,参数的最大似然估计收敛到参数的真实值。

- 均方误差是一种衡量和真实参数相差多少的方法,有参均方误差估计随着m的增加而减少,当m较大时,Cramér-Rao下界表明不存在均方误差低于最大似然学习的一致估计。

6 贝叶斯统计

贝叶斯用概率反映知识状态的确定性程度。贝叶斯估计认为,数据集能够直接观测到,因此不是随机的。另一方面,真实参数θ是未知或不确定的,因此可以表示成随机变量。在观察到数据前,我们将θ的已知知识表示成先验概率分布p(θ),然后观测一个包含m个样本的数据集X。则综合数据集和先验可以得到对参数θ的概率分布进行估计

相对于最大似然估计,贝叶斯估计有两个重要区别。第一,不像最大似然方法预测时使用θ的点估计,贝叶斯方法预测θ的全分布。例如,在观测到m个样本后,下一个数据样本,x(m+1),的预测分布如下:

贝叶斯方法和最大似然方法的第二个最大区别是由贝叶斯先验分布造成的。先验能够影响概率质量密度朝参数空间中偏好先验的区域偏移。实践中,先验通常表现为偏好更简单或更光滑的模型。对贝叶斯方法的批判认为先验是人为主观判断影响预测的来源。当训练数据很有限时,贝叶斯方法通常泛化得更好,但是当训练样本数目很大时,通常会有很高的计算代价。

6.1 最大后验(MAP)估计

贝叶斯有时求解非常困难,可用最大后验求得近似解。

MAP估计选择后验概率最大的点(或在θ是连续值的更常见情况下,概率密度最大的点):

我们可以认出上式右边的logp(x|θ)对应着标准的对数似然项,logp(θ)对应着先验分布。

MLE,贝叶斯,MAP   -----------   三种方法都是参数估计的方法。

应用场景:预先知道/假设样本的分布形式,只是一些参数未知。给定数据集,进行参数估计。

区别:

MLE:最简单的形式,最大似然把待估的参数看做是确定性的量,只是其取值未知。最佳估计就是使得产生以观测到的样本的概率最大的那个值,即找到使得样本对数似然分布最大的参数即可。可以理解为,求解使已经观测到的数据集出现概率最大的参数。

MAP:和最大似然很相似,也是假定参数未知,但是为确定数值。只是优化函数为后验概率形式,多了一个先验概率项。

贝叶斯:假定参数是随机变量,不是确定值。在样本分布D上,计算参数所有可能的情况,并通过基于参数期望,计算类条件概率密度。贝叶斯估计和MLE不同地方在于,把待估计的参数看成是符合某种先验概率分布的随机变量。对样本进行观测的过程,就是把先验概率密度转化为后验概率密度,这样就利用样本的信息修正了对参数的初始估计值。在贝叶斯估计中,一个典型的效果就是,每得到新的观测样本,都使得后验概率密度函数变得更加尖锐,使其在待估参数的真实值附近形成最大的尖峰。

联系:

参数估计问题是统计学中的经典问题。最常用的和有效的方法就是:最大似然和贝叶斯估计。   

当参数分布为尖峰,且该参数对应样本分布比较平坦时,极大似然近似于贝叶斯。

总体上,极大似然计算简单,而贝叶斯在某些特殊情况下,效果好于极大似然。

参考:

http://blog.sina.com.cn/s/blog_6ae1839101012xur.html

http://bealin.github.io/2017/02/27/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%97%E2%80%944-%E5%8F%82%E6%95%B0%E4%BC%B0%E8%AE%A1%E6%96%B9%E6%B3%95-%E6%9C%80%E5%A4%A7%E4%BC%BC%E7%84%B6%E4%BC%B0%E8%AE%A1%E5%92%8C%E8%B4%9D%E5%8F%B6%E6%96%AF%E5%8F%82%E6%95%B0%E4%BC%B0%E8%AE%A1/

http://crescentmoon.info/2013/06/29/Gibbs%20Sampling%20for%20the%20UniniTiated-1/

http://www.jianshu.com/p/4cee5817a61f

7 监督学习算法

策略:很多监督学习算法都是基于估计概率分布p(y|x)。

    首先,确定正确的输入和输出变量上的有参条件概率分布族p(y|x;θ);然后找到对于有参分布族p(y|x;θ)最好的参数向量,寻找参数时简单的问题如线性回归可通过求解正规方程得到最佳参数,更一般的问题,最佳权重没有闭解,使用最大似然估计求解,通过梯度下降最小化负对数似然求得最佳权重参数。

例如,线性回归;逻辑回归;支持向量机;k近邻回归 - 非参数学习算法;决策树,及其变种 - 一类将输入空间分成不同区域,每个区域有独立的参数的算法。若允许学习任意大小的决策树,那么可以被视作非参数算法。然而实践中通常有大小限制作为正则化项将其转变成有参模型。决策树学习结果是一个分块常数函数,每一个叶结点一个区域,每个叶需要至少一个训练样本来定义,所以决策树不可能用来学习一个拥有比训练样本数量还多的局部极大值的函数。

8 无监督学习算法

从不需要认为标注样本的分布中抽取信息:从分布中采样,从分布中去噪,得到数据分布的流形,将数据中相关的样本聚类等。

一个经典的无监督学习任务是找到数据的“最佳”表示。即该表示比本身更简单,且尽可能保存更多本身的信息。更简单包括:低维表示,稀疏表示,独立表示。

主成分分析:学习了一种元素之间彼此没有线性相关的表示,可以消除数据中未知变动因素。- 独立表示。

k-均值聚类:- 稀疏表示

9 随机梯度下降(SGD)

核心思想:梯度是期望,期望可使用小规模的样本近似估计。优化算法可能不能保证在合理的时间内达到一个局部最小值,但它通常能够很快地找到损失函数的一个可以用的非常低的值。

训练集样本量m,minibatch大小m',实践中当m增加时通常会使用一个更大的模型(不是必须的),达到收敛所需的更新次数通常会随着训练集规模m的增大而增加。然而,当m趋向于无限大时,该模型最终会在一定迭代后收敛到可能的最优测试误差。继续增加m不会延长达到模型可能的最优测试误差的时间。所以,可以认为SGD训练模型的渐近代价是关于训练集样本量m的函数的O(1)级别。

10 构建机器学习算法

通用的深度学习算法配方:特定数据集,损失函数,优化过程和模型。

最常见的损失函数是负对数似然,最小化损失函数即最大似然估计。损失函数可能有附加项,如正则化项。

11 推动深度学习的挑战

深度学习发展动机的一部分原因是传统学习算法在诸如语音识别,对象识别的人工智能问题上的泛化能力不行。

为何处理高维数据时在新样本上泛化特别困难?

为何传统机器学习中实现泛化的机制不适合学习高维空间中的复杂函数?

11.1 维数灾难

当数据的维数很高时,很多机器学习问题变得相当困难,这种现象被称为维数灾难。需要注意的是,一组变量不同的可能配置数量会随着变量数目的增加而指数级增长。


由维数灾难带来的一个挑战是统计挑战。统计挑战产生于样本的可能配置数目远大于训练样本的数目。许多传统的及机器学习方法只是简单地假设在一个新点的输出应大致和最接近的训练点的输出相同。然而在高维空间中,这个假设是不够的。(因为在高维空间中,一个样本周围可能没有样本,参数配置数目远大于样本数目,大部分配置没有相关的样本。)

11.2 局部不变性和平滑正则化

为了更好地泛化,机器学习算法需要由先验信念引导应该学习什么样的函数。

其中最广泛使用的隐式“先验”是平滑先验/局部不变性先验。这个先验表明我们学习的函数不应在小区域内发生很大的变化。

许多简单算法完全依赖于此先验达到良好的泛化,其结果是不能推广去解决人工智能级别任务中的统计挑战。而深度学习引入额外的(显示的和隐式的)先验去降低复杂任务中的泛化误差,具体内容后面章节介绍。

为什么平滑先验不足以应对这这类人工智能任务?

因为具有光滑或局部不变的先验的函数都旨在鼓励学习过程能够学习出函数使得对某个样本及其邻域具有相同或相似的输出。也就是说,如果在输入x处效果良好,那么在其邻域上效果也良好。如果在有些邻域中有好几个答案,我们可以组合他们(通过某种形式的平均或插值法)以产生一个尽可能和大多数输入一致的答案。然而,这类平滑先验的局限性就是无法表示比样本数还多的复杂函数。例如,k近邻方法,一个极端的例子就是k=1时,不同区域的数目不可能比训练样本还多;局部核可以看作是执行模版匹配的相似函数,也是在和训练样本附近相关的训练集输出上插值;决策树也有平缓学习的局限性,因为它将输入空间分成叶结点一样多的区间,并在每个区间使用单独的参数,如果目标函数需要至少n个叶结点去精确表示,那么需要至少n个训练样本去拟合,需要几倍于n的样本去达到预测输出上的某种统计置信度。

总的来说,区分输入空间中O(k)个区间,平滑先验类的算法需要O(k)个样本。通常会有O(k)个参数。

有没有什么方法能表示区间数目比样本数目还多的复杂函数?显然,只是假设函数的平滑性不能做到这点。例如,想象目标函数是一种棋盘。棋盘包含许多变化,但只有一个简单的结构。想象一下,如果训练样本数目远小于棋盘上的黑白方块数目,那么会发生什么。基于局部泛化和平滑性或局部不变性先验,如果新点和某个训练样本位于相同的棋盘方块中,那么我们能够保证正确预测新点的颜色。但如果新点位于棋盘中不包含训练样本的方块中,无法保证预测能够正确。单单是这个先验,一个样本只能告诉我们它所在的方块的颜色。获得整个棋盘颜色的唯一方法是其上的每个方块至少要有一个样本。当我们利用一组样本去学习函数时,若要学习的函数足够平滑并且只在少数几维变动,一般算法的效果非常好;然而在高维空间中,即使是非常平滑的函数也会在不同维度上有不同的平滑变动程度。如果函数在不同的区间中表现不一样,那么就非常难用一组训练样本去刻画。那么这样复杂的函数(能区分多于训练样本数目的大量区间),有希望很好地泛化么?答案是有。关键是,只要我们在区间相关性上引入额外的数据生成分布的假设,那么O(k)个样本是足以描述多如O(2^k)的大量区间。这样,我们真的能做到非局部的泛化。许多不同的深度学习算法提出隐式或显式的适用于大范围人工智能问题的合理假设,使其可以利用这些优势。

一些机器学习方法往往会提出更强的,针对特定问题的假设。例如,假设目标函数是周期性的,我们很容易解决棋盘问题。通常,神经网络不会包含这些很强的,针对特定任务的假设,因此神经网络可以泛化到更广泛的各种结构中。人工智能任务的结构非常复杂,很难限制到简单的,人工手动指定的性质,如周期性,因此我们希望学习算法具有更通用的假设。深度学习的核心思想是假设数据由因素或特征组合,潜在地由层次结构中多个层级产生。许多其他类似的通用假设进一步提高了深度学习算法。这些很温和的假设在样本数目和可区分区间数目之间具有指数增益。这类指数增益将在第6.4.1节,第15.4节和第15.5节中被更详尽地介绍。深度分布式表示带来的指数增益有效解决了维数灾难带来的挑战。

11.3 流形学习

流形是一个机器学习中很多想法内在的重要概念。

流形(manifold)指连接在一起的区域。数学上,它是指一组点,且每个点都有其邻域。但是在机器学习中,倾向于更松散地定义一组点,且允许流形的维数从一个点到另一个点有所变化。例如,“8”形状的流形在大多数位置只有一维,但在中心的相交处有两维。

如果令机器学习算法学习特征空间上的所有感兴趣的函数,那么很多机器学习问题看上去都是不可解的。流形学习算法通过一个假设来克服这个障碍,该假设认为特征空间中大部分区域都是无效的输入,感兴趣的输入只分布在包含少量点的子集构成的一组流形中,而学习函数中感兴趣输出的变动只位于流形中的方向,或者感兴趣的变动只发生在我们从一个流形移动到另一个流形的时候。

上面说的流形学习的假设并不总是对的或者有用的,但在一些处理图像,文本等人工智能任务时,流形假设至少是近似对的,支持该假设的证据包含两类观察结果:一,第一个支持流形假设的观察是现实生活中的图像,文本,声音的概率分布都是高度集中的。均匀的噪扰从来没有和这类领域的结构化输入相似过。说明生活中的图像,文本,声音等只占了其所在总空间里非常小的一部分。当然,集中的概率分布不足以说明数据位于一个相当小的流形中。我们还必须确定,我们遇到的样本和其他样本相互连接,每个样本被其他高度相似的样本包围,可以通过变换来遍历流形。二,支持流形假设的第二个论点是,我们至少能够非正式地想象这些邻域和变换。在图像中,我们会认为有很多可能的变换允许我们描绘出图片空间的流形,如调整亮度,移动旋转,改变颜色等等。在大多数应用中很可能会涉及多个流形。例如,人脸图像的流形不太可能连接到猫脸图像的流形。

当数据位于低维流形时,使用流形中的坐标,而非特征空间的坐标表示机器学习数据更为自然。日常生活中,我们可以认为道路是嵌入在三维空间的一维流形。我们用一维道路中的地址号码确定地址,而非三维空间中的坐标。提取这些流形中的坐标是非常具有挑战性的,但是很有希望改进许多机器学习算法。

本章(第一部分:应用数学+机器学习基础)介绍了机器学习中的基本概念,这将用于本书的其他章节中。至此,我们已经完成了开始学习深度学习的准备。

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

推荐阅读更多精彩内容