nndl 读书笔记 第2章 机器学习概述

github开源:https://nndl.github.io/
nndl作者:邱锡鹏
笔记作者:Isaac.(原创)

本书其他章节的笔记目录

机器学习(Machine Learning, ML)就是让计算机从数据中进行自动学习,得到某种知识(或规律)。

机器学习问题在早期的工程领域也经常称为模式识别(Pattern Recognition,PR),但模式识别更偏向于具体应用任务,比如光学字符识别、语音识别,人脸识别等。

总体思路:让计算机“看”大量的样本,并从中学习到一些经验,然后用这些经验来识别新的样本。

目录结构

2.1 基本概念
2.2 机器学习的三个基本要素
2.2.1 模型
2.2.2 学习准则
2.2.3 优化算法
2.3 机器学习的简单示例:线性回归
2.3.1 参数学习
2.4 偏差-方差分解
2.5 机器学习算法的类型
2.6 数据的特征表示
2.6.1 传统的特征学习
2.6.2 深度学习方法
2.7 评价指标
2.8 理论和定理
2.8.1 PAC学习理论
2.8.2 没有免费午餐定理
2.8.3 丑小鸭定理
2.8.4 奥卡姆剃刀
2.8.5 归纳偏置
2.9 总结和深入阅读

2.1 基本概念

首先,我们从市场上随机选取一些芒果,列出每个芒果的特征(Feature),包括颜色,大小,形状,产地,品牌,以及我们需要预测的标签(Label)。标签可以连续值(比如关于芒果的甜度、水分以及成熟度的综合分),也可以是离散值(比如“好”“坏”两类标签)。 一个标记好特征以及标签的芒果可以看作是一个样本(Sample)。 一组样本构成的集合称为数据集(Data Set)。一般将数据集分为三部分:训练集、验证集和测试集。训练集(Training Set)中的样本是用来训练模型的,验证集(Validation Set)是模型训练过程中单独留出的样本集,可以用于调整模型的超参数和用于对模型的能力进行初步评估。而测试集(Test Set)中的样本是用来检验模型好坏的 。

特征也可以称为属性(Attribute)
样本(Sample),也叫示例(Instance)
数据集也经常称为语料库(Corpus)

我们用一个 d 维向量 x = [x1, x2, · · · , xd]T 表示一个芒果的所有特征构成的向量,称为特征向量(Feature Vector),其中每一维表示一个特征。

假设训练集由 N 个样本组成,其中每个样本都是独立同分布(Identically and Independently Distributed, IID),即独立地从相同的数据分布中抽取的, 记为

给定训练集 D,我们希望寻找一个函数 f (x; θ) 来建立每个样本特性向量 x标签 y 之间的映射。对于一个样本 x,我们可以通过函数来预测其标签的值或标签概率

其中 θ 为可学习的参数。

通过一个学习算法(Learning Algorithm) A,在训练集上找到一组参数θ * ,使得函数 f (x , θ* )可以近似真实的映射关系。这个过程称为学习(Learning)训练(Training)过程,函数 f (x; θ)称为模型(Model)

在有些文献中,学习算法也叫做学习器(Learner)

下次从市场上买芒果(测试集D′)时,可以根据芒果的特征,使用学习到的模型 f (x , θ * )来预测芒果的好坏,并计算预测结果的准确率

其中 I(·)为指示函数,|D′|为测试集大小

指示函数(indicator function)是定义在某集合X上的函数,表示其中有哪些元素属于某一子集A。

2.2 机器学习的三个基本要素

三要素:模型、学习准则、优化算法 。

2.2.1 模型

确定其输入空间 X 和输出空间 Y。 对于样本空间中的样本 (x, y) ∈ X × Y,假定存在一个未知的真实映射函数 g : X → Y 使得

或者真实条件概率分布

机器学习的目标是找到一个模型来近似真实映射函数或真实条件概率分布。

模型又分为线性模型和非线性模型。

2.2.2 学习准则

一个好的模型应该在所有可能取值上与真实映射函数一致,即

或与真实条件概率分布一致,即

模型 f(x; θ)的好坏可以通过期望风险(Expected Risk)R(θ)来衡量。

其中 pr(x, y)为真实的数据分布,L(y, f(x; θ))为损失函数,用来量化两个变量之间的差异。

经验风险、期望风险、结构风险 见2.2.2.2 风险最小化原则

2.2.2.1 损失函数

损失函数是一个非负实数函数,用来量化模型预测和真实标签之间的差异。

0-1损失函数 (0-1 Loss Function)

虽然 0-1损失能够客观的评价模型的好坏,但缺点是数学性质不是很好:不连续且导数为 0,难以优化。因此经常用连续可微的损失函数替代

平方损失函数(Quadratic Loss Function) 一般不适用于分类问题。

交叉熵损失函数(Cross-Entropy Loss Function) 也叫负对数似然损失函数(Negative Log-Likelihood Function)。 一般用于分类问题。

我们可以用一个 C 维的 one-hot向量 y来表示样本标签。假设样本的标签为k,那么标签向量 y只有第 k 维的值为1,其余元素的值都为 0。

对于两分类问题,交叉熵的公式如下:

对于三类分类问题,假设一个样本的标签向量为 y = [0, 0, 1]T,模型预测的标签分布为​ = [0.3, 0.3, 0.4]T,则它们的交叉熵为

L(θ)=-(0 × log(0.3) + 0 × log(0.3) + 1 × log(0.4)) = -log(0.4)

简单的交叉熵损失函数,你真的懂了吗?

为什么用交叉熵做损失函数

Pytorch 的损失函数Loss function

Hinge 损失函数 (Hinge Loss Function)

可用于“最大间隔(max-margin)”分类,其最著名的应用是作为SVM的目标函数。

对于两类分类问题,假设 y 的取值为 {-1, +1}, f(x; θ) ∈ R。Hinge损失函数(Hinge Loss Function)为

损失函数(Loss Function):是定义在单个样本上的,是指一个样本的误差。 代价函数(Cost Function):是定义在整个训练集上的,是所有样本误差的平均,也就是所有损失函数值的平均。包括均方误差(MSE)、均方根误差(RMSE)、平均绝对误差(MAE)、交叉熵代价函数 目标函数(Object Function):是指最终需要优化的函数,一般来说是经验风险+结构风险,也就是(代价函数+正则化项)。

2.2.2.2 风险最小化准则

一个好模型应当有一个比较小的期望错误,但由于不知道真实的数据分布和映射函数,实际上无法计算期望风险。给定一个训练集D,我们可以计算的是经验风险(Empirical Risk),即在训练集上的平均损失

因此,一个切实可行的学习准则是找到一组参数 θ 使得经验风险最小

这就是经验风险最小化(Empirical Risk Minimization,ERM)准则。

根据大数定理可知,当训练集大小|D|趋向于无穷大时,经验风险就趋向于期望风险。

然而通常情况下,训练样本往往是真实数据的一个很小的子集或者包含一定的噪声数据,不能很好地反映全部数据的真实分布。经验风险最小化原则很容易导致模型在训练集上错误率很低,但是在未知数据上错误率很高。这就是所谓的过拟合(Overfitting)

过拟合问题往往是由于训练数据少噪声以及模型能力强等原因造成的。

为了解决过拟合问题,一般在经验风险最小化的基础上再引入参数的正则化(Regularization),来限制模型能力,使其不要过度地最小化经验风险。这种准则就是结构风险最小化(Structure Risk Minimization,SRM)准则。

其中 ||θ||是 ℓ2 范数的正则化项,用来减少参数空间,避免过拟合;λ用来控制正则化的强度。

和过拟合相反的一个概念是欠拟合(Underfitting),即模型不能很好地拟合训练数据,在训练集的错误率比较高。欠拟合一般是由于模型能力不足造成的。

机器学习优化问题-经验风险、期望风险、结构风险

经验风险是局部的,基于训练集所有样本点损失函数最小化。经验风险是局部最优,是现实的可求的。

期望风险是全局的,基于所有样本点损失函数最小化。期望风险是全局最优,是理想化的不可求的。

结构风险是对经验风险和期望风险的折中,在经验风险函数后面加一个正则化项(惩罚项)。

2.2.3 优化算法

如何找到最优的模型就成了一个最优化(Optimization)问题。机器学习的训练过程其实就是最优化问题的求解过程。

模型f(x; θ)中的 θ 称为模型的参数,可以通过优化算法进行学习。

还有一类参数是用来定义模型结构或优化策略的,这类参数叫做超参数(Hyper-Parameter)

常见的超参数包括:聚类算法中的类别个数、梯度下降法的步长、正则项的系数、神经网络的层数、支持向量机中的核函数等。

相同的模型也可以有不同的学习算法。比如线性分类模型有感知器、 logistic回归和支持向量机,它们之间的差异在于使用了不同的学习准则和优化算法。

2.2.3.1 梯度下降法

在机器学习中,最简单、常用的优化算法就是梯度下降法

其中 θt 为第 t次迭代时的参数值, α为搜索步长。在机器学习中, α一般称为学习率(Learning Rate)

深入浅出--梯度下降法及其实现 必看

梯度下降法的基本思想可以类比为一个下山的过程。具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的地方走。然后每走一段距离,都需要一段时间来测量所在位置最陡峭的方向,这是比较耗时的。

为了在太阳下山之前到达山底,就要尽可能的减少测量方向的次数。这是一个两难的选择,如果测量的频繁,可以保证下山的方向是绝对正确的,但又非常耗时,如果测量的过少,又有偏离轨道的风险。

首先,我们有一个可微分的函数。这个函数就代表着一座山。我们的目标就是找到这个函数的最小值,也就是山底。最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方向就能让函数值下降的最快

我们可以看到,梯度就是分别对每个变量进行微分,然后用逗号分割开,梯度是用<>包括起来,说明梯度其实一个向量

  • 单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率
  • 多变量函数中,梯度是一个向量,向量有方向梯度的方向就指出了函数在给定点的上升最快的方向,那么梯度的反方向就是函数在给定点下降最快的方向。

2.2.3.2 提前停止

在梯度下降训练的过程中,由于过拟合的原因,在训练样本上收敛的参数,并不一定在测试集上最优。

因此,除了训练集和测试集之外,有时也会使用一个验证集(Validation Set)来进行模型选择,测试模型在验证集上是否最优。在每次迭代时,把新得到的模型 f(x; θ) 在验证集上进行测试,并计算错误率。 如果在验证集上的错误率不再下降,就停止迭代。这种策略叫提前停止(Early Stop)

2.2.3.3 随机梯度下降法

在公式 (2.28)中,目标函数是整个训练集上风险函数,这种方式称为批量梯度下降法(Batch Gradient Descent, BGD)。批量梯度下降法在每次迭代时需要计算每个样本上损失函数的梯度并求和。当训练集中的样本数量N 很大时,空间复杂度比较高,每次迭代的计算开销也很大

批量梯度下降相当于是从真实数据分布中采集 N 个样本,并由它们计算出来的经验风险的梯度来近似期望风险的梯度。为了减少每次迭代的计算复杂度,我们也可以在每次迭代时只采集一个样本,计算这个样本损失函数的梯度并更新参数,即随机梯度下降法(Stochastic Gradient Descent, SGD)。当经过足够次数的迭代时,随机梯度下降。 也可以收敛到局部最优解

随机梯度下降因为实现简单收敛速度也非常快,因此使用非常广泛。随机梯度下降相当于在批量梯度下降的梯度上引入了随机噪声。当目标函数非凸时,反而可以使其逃离局部最优点

随机梯度下降法的一个缺点是无法充分利用计算机的并行计算能力小批量梯度下降法(Mini-Batch Gradient Descent)是批量梯度下降和随机梯度下降的折中。每次迭代时,我们随机选取一小部分训练样本来计算梯度并更新参数,这样既可以兼顾随机梯度下降法的优点,也可以提高训练效率。

通常设置为 2的 n次方。 一般不会很大。

梯度下降法小结 包含了梯度下降法、其他优化算法以及SGD延伸算法。

BGD:迭代次数少;训练速度慢、内存要求大、不支持在线更新

SGD:训练速度快、支持在线更新、有几率跳出局部最优解;容易收敛到局部最优解、迭代次数多

MBGD:BGD和SGD的折中。

Momentum、NAG、Adagrad、RMSprop、Adam、Nadam

2.3 机器学习的简单示例:线性回归

2.3.1 参数学习

具体的举例有兴趣请参考原文,我觉得用处不大,此处略。

最小二乘法估计(Least Square Estimation,LSE) 、最小均方误差(Least Mean Squares, LMS)

共线性(Multicollinearity) 、岭回归(Ridge Regression)

对数似然函数(Log Likelihood) 、最大似然估计(Maximum Likelihood Estimate, MLE)

后验概率分布(Posterior Distribution) 、无信息先验(Non-Informative Prior)

贝叶斯估计(Bayesian Estimation)、贝叶斯线性回归(Bayesian Linear Regression)

2.4 偏差-方差分解

如何在模型能力和复杂度之间取得一个较好的平衡对一个机器学习算法来讲十分重要。偏差-方差分解(Bias-Variance Decomposition)为我们提供一个很好的分析和指导工具。

期望错误可以分解为

关于偏差-方差分解的公式推导,不是重点

偏差方差分解

偏差-方差分解

偏差(Bias)是指一个模型的在不同训练集上的平均性能和最优模型的差异。可以用来衡量模型的拟合能力

方差(Variance)是指一个模型在不同训练集上的差异,可以用来衡量一个模型是否容易过拟合

噪声:表达了当前任务上任何模型所能达到的期望泛化误差的下界,刻画了学习问题本身的难度

偏差和方差分解给机器学习模型提供了一种分析途径,但在实际操作中难以直接衡量

一般来说,当一个模型在训练集上的错误率比较高时,说明模型的拟合能力不够,偏差比较高。这种情况可以增加数据特征提高模型复杂度减少正则化系数等操作来改进模型。

当模型在训练集上的错误率比较低,但验证集上的错误率比较高时,说明模型过拟合,方差比较高。这种情况可以通过降低模型复杂度加大正则化系数引入先验等方法来缓解。此外,还有一种有效的降低方差的方法为集成模型,即通过多个高方差模型的平均来降低方差

2.5 机器学习算法的类型

监督学习(Supervised Learning) :是从有标签的样本中进行学习得到规律。监督学习又可以分为回归(Regression)分类(Classification) 两类 。

回归是指连续,分类是指离散。

无监督学习(Unsupervised Learning, UL) 是指从无标签的训练样本中自动学习到一些有价值的信息。典型的无监督学习问题有聚类、密度估计、特征学习、降维等。

强化学习(Reinforcement Learning, RL)是一类通过交互来学习的机器学习算法。在强化学习中,智能体根据环境的状态做出一个动作,并得到即时或延时的奖励。智能体在和环境的交互中不断学习并调整策略,以取得最大化的期望总回报。

三种机器学习类型的比较

弱监督学习(Weak Supervised Learning)半监督学习(Semi-Supervised Learning)的方法,希望从大规模的无标注数据中充分挖掘有用的信息,降低对标注样本数量的要求。

强化学习和监督学习的不同在于强化学习不需要显式地以“输入/输出对”的方式给出训练样本,是一种在线的学习机制。

2.6 数据的特征表示

在机器学习之前我们需要将这些不同类型的数据(图像、文本)转换为向量表示

图像特征:大小 m × n的向量,还有一维对应像素的灰度值。

文本特征:从文本形式转化为向量形式有很多种,比如最简单的词袋模型(Bag-of-Words, BoW)。

如何让机器自动地学习出有效的特征也成为机器学习中的一项重要研究内容,称为特征学习(Feature Learning),也叫表示学习(Representation Learning)。 特征学习在一定程度上也可以减少预测模型复杂性、缩短训练时间、提高模型泛化能力、避免过拟合等。

2.6.1 传统的特征学习

通过人为地设计一些准则,然后根据这些准则来选取有效的特征,具体又可以分为两种:特征选择特征抽取

2.6.1.1 特征选择

特征选择(Feature Selection)是选取原始特征集合的一个有效子集,使得基于这个特征子集训练出来的模型准确率最高。简单地说,特征选择就是保留有用特征,移除冗余或无关的特征。

一种直接的特征选择方法为子集搜索(Subset Search)。 假设原始特征数为 d,则共有 2d 个候选子集。特征选择的目标是选择一个最优的候选子集。常用的方法是采用贪心的策略:由空集合开始,每一轮添加该轮最优的特征,称为前向搜索(Forward Search);或者从原始特征集合开始,每次删除最无用的特征,称为反向搜索(Backward Search)

子集搜索方法又可以分为过滤式(用信息增益评估)和包裹式(用后续机器学习模型评估)。

2.6.1.2 特征抽取

特征抽取(Feature Extraction)是构造一个新的特征空间,并将原始特征投影在新的空间中。

特征抽取又可以分为监督和无监督的方法。监督的特征学习的目标是抽取对一个特定的预测任务最有用的特征,比如线性判别分析(Linear DiscriminantAnalysis, LDA)。而无监督的特征学习和具体任务无关,其目标通常是减少冗余信息和噪声,比如主成分分析(Principal Components Analysis,PCA)

特征选择和特征抽取的优点是可以用较少的特征来表示原始特征中的大部分相关信息,去掉噪声信息,并进而提高计算效率和减小维度灾难(Curse OfDimensionality)。对于很多没有正则化的模型,特征选择和特征抽取非常必要。经过特征选择或特征抽取后,特征的数量一般会减少,因此特征选择和特征抽取也经常称为维数约减或降维(Dimension Reduction)

2.6.2 深度学习方法

如果我们将特征的表示学习和机器学习的预测学习有机地统一到一个模型中,建立一个端到端的学习算法,可以有效地避免它们之间准则的不一致性。这种表示学习方法就称为深度学习(Deep Learning, DL)。

2.7 评价指标

对于分类问题,常见的评价标准有正确率、准确率、召回率和 F值等。

最常用的的评价指标为准确率(Accuracy)

和准确率相对应的就是错误率(Error Rate)

准确率是所有类别整体性能的平均,如果希望对每个类都进行性能估计,就需要计算查准率(Precision)查全率(Recall)

对于类别 c来说,模型在测试集上的结果可以分为以下四种情况:

  • 真正例(True Positive, TP):一个样本的真实类别为 c并且模型正确地预测为类别 c。这类样本数量记为
  • 假负例(False Negative, FN):一个样本的真实类别为 c,模型错误地预测为其它类。这类样本数量记为
  • 假正例(False Positive, FP)一个样本的真实类别为其它类,模型错误地预测为类 c。这类样本数量记为
  • 真负例(True Negative, TN):一个样本的真实类别为其它类,模型正确预测为其它类。对于类别 c来说,这种情况一般不需要关注。
类别 c的预测结果的混淆矩阵

查准率(Precision),也叫精确度或精度,类别 c的查准率为是所有预测类别 c的样本中,预测正确的比例

查全率(Recall),也叫召回率,类别 c 的查全率为是所有真实标签为类别 c的样本中,预测正确的比例

F值(F Measure)是一个综合指标,为查准率和查全率的调和平均。

其中 β 用于平衡查全率和查准率的重要性,一般取值为 1。 β = 1 时的 F 值称为F1值,是查准率和查全率的调和平均

在实际应用中,我们也可以通过调整分类模型的阈值来进行更全面的评价,比如 AUC(Area Under Curve)ROC(Receiver Operating Characteristic)曲线、PR(Precision-Recall)曲线等。此外,很多任务还有自己专门的评价方式,比如 TopN准确率。

回顾及总结--评价指标(分类指标)

  • 回归的有:RMSE(平方根误差)、MAE(平均绝对误差)、MSE(平均平方误差)、Coefficient of determination (决定系数)。

  • 分类的有:精度、召回率、精确率、F值、ROC-AUC 、混淆矩阵、PRC。

  • 聚类的有:兰德指数、互信息、轮廓系数。

机器学习分类模型评价指标详述

2.8 理论和定理

2.8.1 PAC学习理论

可能近似正确(Probably Approximately Correct,PAC)学习理论:模型越复杂,即假设空间 F 越大,模型的泛化能力越差。要达到相同的泛化能力越复杂的模型需要的样本数量越多

泛化错误(Generalization Error):期望错误和经验错误之间的差异,可以衡量一个机器学习模型 f 是否可 以很好地泛化到未知数据。

2.8.2 没有免费午餐定理

没有免费午餐定理(No Free Lunch Theorem, NFL):对于基于迭代的最优化算法,不存在某种算法对所有问题(有限的搜索空间内)都有效。必须要“具体问题具体分析”

没有免费午餐定理对于机器学习算法也同样适用。不存在一种机器学习算法适合于任何领域或任务。

2.8.3 丑小鸭定理

丑小鸭定理(Ugly Duckling Theorem):“丑小鸭与白天鹅之间的区别和两只白天鹅之间的区别一样大”。

世界上不存在相似性的客观标准,一切相似性的标准都是主观的。如果以体型大小的角度来看,丑小鸭和白天鹅的区别大于两只白天鹅的区别;但是如果以基因的角度来看,丑小鸭与它父母的差别要小于他父母和其他白天鹅之间的差别。

2.8.4 奥卡姆剃刀

奥卡姆剃刀(Occam’s Razor):“如无必要,勿增实体”。

奥卡姆剃刀的思想和机器学习上正则化思想十分类似:简单的模型泛化能力更好。如果有两个性能相近的模型,我们应该选择更简单的模型。

2.8.5 归纳偏置

在机器学习中,很多学习算法经常会对学习的问题做一些假设,这些假设就称为归纳偏置(Inductive Bias)

2.9 总结和深入阅读

略。

本书其他章节的笔记目录

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