从零开始强化学习(六)——模仿学习

模仿学习(imitation learning,IL)又叫做示范学习(learning from demonstration)学徒学习(apprenticeship learning)观察学习(learning by watching)。在模仿学习里,根据一些专家的示范使机器可以跟环境互动,但无法从环境里面得到任何的奖励,只能看着专家的示范来学习什么是好,什么是不好。其实多数的情况,任务的确无法从环境里面得到非常明确的奖励。虽然没有办法给出奖励,但是收集专家的示范是可以做到的。举例来说:

  • 在自动驾驶汽车里面,虽然没有办法给出自动驾驶汽车的奖励,但可以收集很多人类开车的纪录
  • 在聊天机器人里面,可能没有办法定义什么叫做好的对话,什么叫做不好的对话。但是收集很多人的对话当作范例,这一件事情也是可行的

所以模仿学习的使用性非常高,假设不知道奖励,可以通过收集专家的示范,或者通过收集到一些强智能体(比如人)跟环境实际上的互动,即可使用模仿学习这个技术,模仿学习主要包含两个方法:

  • 行为克隆(behavior cloning,BC)
  • 逆强化学习(inverse reinforcement learning,IRL)或者叫做逆最优控制(inverse optimal control)

一. 行为克隆

不同于监督学习,强化学习往往被用来处理复杂的决策任务;但由于决策空间巨大,强化学习需要不断地试错,因此样本复杂度(Sample Complexity)往往很高,从而限制了强化学习在一些场景中的应用。而模仿学习则是直接从专家样本中进行学习;由于有比较高质量的决策行为数据,模仿学习被认为是可以降低样本复杂度的一个手段。除此之外,模仿学习的一个重要应用是:有些应用(比如自动驾驶)决策行为的奖励函数很难定义,但是有一些高质量的决策示例(比如人类开车的视频)可以被用来模仿和生成类似的决策行为。

1.1 原理

考虑一个马尔科夫决策过程框架:M=(S,A,P,R,\gamma,\rho)

  • SA分别是(有限的)状态和动作空间
  • P: \mathcal{S} \times \mathcal{A} \rightarrow \Delta(\mathcal{S})指定了环境转移概率
  • R: \mathcal{S} \times \mathcal{A} \rightarrow [0, 1]指定了奖励
  • \gamma\in (0,1]是折扣因子
  • \rho指定了初始状态分布

决策者的目标是寻找一个稳态策略\pi: \mathcal{S} \rightarrow \Delta(\mathcal{A})来最大化累计奖励:
V(\pi) = \mathbb{E}\left[\sum_{t=0}^{\infty}\gamma^{t} R(s_t, a_t) \bigg| s_0 \sim \rho, a_t \sim \pi(\cdot|s_t), \forall t \geq 0 \right] \tag{1}
除此之外,在模仿学习里,我们假设有一个由专家策略\pi_E收集到数据集\mathcal{D} = \{(s_i, a_i) \}_{i=1}^{m},其中每一个状态动作对是由和环\pi_E境交互产生的。因为如果假设专家策略的质量很高,所以目标变成了寻找一个策略\pi来减小与专家策略的值函数差异
\min_{\pi} \left[ V(\pi_E) - V(\pi) \right] \tag{2}
即期望\pi能从专家示例中很好的恢复出专家的决策行为来使得决策者的值函数比较大

1.2 算法

行为克隆是一个比较基础的模仿学习方法。这个算法直接优化两个策略间的动作概率分布差异:
\begin{equation} \min_{\pi} \mathbb{E}_{s \sim d_{\pi_E}} \left[ D_{KL} (\pi_E(\cdot|s), \pi(\cdot|s)) \right] := \mathbb{E} _{(s, a) \sim \rho_{\pi_E}} \left[ \log \left(\frac{\pi_E(a|s)}{\pi(a|s)} \right) \right] \\ \end{equation}\tag{3}
这里d_{\pi_E}\rho_{\pi_E}分别是由策略产生\pi_E的(折扣的)状态分布和状态动作分布。一般情况下的定义如下:
\begin{align} d_{\pi}(s) &= \mathbb{E} \left[ \sum_{t=0}^{\infty} \gamma^{t} \Pr(s_t=s) \bigg| s_0 \sim \rho, a_t \sim \pi(\cdot|s_t), \forall t \geq 0 \right] \\ \rho_{\pi}(s, a) &= \mathbb{E} \left[ \sum_{t=0}^{\infty} \gamma^{t} \Pr(s_t=s, a_t = a) \bigg| s_0 \sim \rho, a_t \sim \pi(\cdot|s_t), \forall t \geq 0 \right] \end{align}\tag{4}
可以简单地将d_{\pi_E}\rho_{\pi_E}理解为,一个策略访问某个状态或者状态动作对的"频率"。回到目标函数/损失函数,即一个简单的监督学习问题:数据分布由专家策略产生,我们期望使用最大似然估计,学习到一个最优的分类器(或者回归器)。这里说最大似然估计,是因为最小化KL散度等价于最大似然估计。如果损失函数的值很小,可以推断出学习者能够较好地模仿专家策略,从而在决策的时候有一个不错的值函数。下面详细地刻画这件事

1.3 分析

假设可以寻找到一个策略\pi,其与最优策略的损失函数值小于给定的精度\epsilon,那么可以证明,这个策略与专家策略的决策质量上有如下的保证:
V(\pi_E) - V(\pi) \leq \frac{2 \sqrt{2}}{(1-\gamma)^2} \sqrt{\epsilon} \tag{5}
可以看到,损失函数值越小,两者的值函数差异越小。但与此同时,这个差异是以1/(1-\gamma)^2的速度在放大。这个现象在模仿学习中被称作为复合误差(compounding errors):对于一个有效决策长度(以1-\gamma来衡量,\gamma越接近1,有效决策长度越长)的模仿学习任务,值函数值差异随目标函数值差异以二次方的速度增长。也就说:对于有效决策长度比较长的任务来讲,即使把目标函数优化地很小,值函数的差异依然可能很大

二. 逆强化学习

IRL的提出动机主要有以下两点:

  • 多任务学习:蜜蜂是如何权衡飞行距离、时间、捕食动物威胁等多个任务下找到一个最优的飞行路径的?IRL针对的也是序列决策问题,并非是单步决策问题
  • 回报函数:难以量化回报函数的领域


很多时候拿不到最优策略,但是获取最优策略的采样数据却是非常容易的。因此逆强化学习的流程如下所示:

  1. 智能体随机产生一个策略
  2. 智能体的策略采样得到的数据与专家数据采样得到的数据对比,学习奖励函数
  3. 利用所学的奖励函数进行强化学习,提高自身策略水平
  4. 策略差距较小则停止迭代,否者回到第二步
2.1 有限状态下的求解

假定最优策略为\pi^{*},其它策略为\pi,有:
V_{π^∗} ( s ) ⩾ V_π ( s )\\ q_{π^∗} ( s , a ) ⩾ q_π ( s , a )\tag{6}
依据Bellman Equation有:
V^{\pi}=R+\gamma P_{s^{\prime}|(s,\pi^{*}(s))}V^{\pi}\tag{7}
因此有:
V^{\pi}=(I-\gamma P_{s^{\prime}|(s,\pi^{*}(s))})^{-1}R\tag{8}

这里我们想要求出奖励R的函数方程,因此期望消去V^{\pi}由:
P_{s^{\prime}|(s,\pi^{*}(s))}V^{\pi} \geq P_{s^{\prime}|(s,\pi(s))}V^{\pi}\tag{9}

可以消去V^{\pi}得到:
(P_{s^{\prime}|(s,\pi^{*}(s))}-P_{s^{\prime}|(s,\pi(s))})(I-\gamma P_{s^{\prime}|(s,\pi^{*}(s))})^{-1}R \geq 0
如果假定专家数据为最优策略下的采样数据,则求取的奖励函数期望能够使得上述公式越大越好,上述推导则变成了一个线性规划问题:
max⁡(P_{s,π^∗(s)}−P_{s,a})(I−γP_{π^∗})R\\ s.t.(P_{s,π^∗(s)}−P_{s,a})(I−γP_{π^∗})R⩾0\tag{10}

上述线性规划问题的约束比较弱,回报函数可以成比例地扩大或者缩小同样能够满足约束,并且回报函数取0时也能满足约束,但这种情况实际上是没有意义的。因此考虑增加约束:

  1. 限制回报的范围|R|\leq R_{max} 。并且Ng认为在其它所有情况都相同的时候,回报函数的取值越小越简单也就越可取,可以选择在优化的目标函数上加上一个惩罚项-\lambda||R||_{1},类似L1、L2正则化,都是为了防止参数过大(这里引入了另一个问题,\lambda参数的取值问题)
  2. 只考虑最优策略和次优策略的差异:之前考虑的是最优策略优于其它所有策略,也就是以相同的权重考虑最优策略和其它策略之间的差距,但是最优策略和次优策略之间的差距会显得更加重要

引入这两个约束之后,原问题的规划变为:
max⁡_R[min_a\{(P_{s,π^∗(s)}−P_{s,a})(I−γP_{π^∗})^{-1}R\}-γ |R|]\\ s.t.\ \ \ -(P_{s,π^∗(s)}−P_{s,a})(I−γP_{π^∗})R\leq0\\ |R|\leq R_{max} \tag{11}

之后去求解上述规划问题即可

2.2 无限状态下的求解

在无限状态空间下,奖励函数可以看作是一个从状态到回报的映射函数:
\text{Reward}(s)=w^{T}\phi(s)\tag{12}
其中\phi(s)是将状态映射到低维空间。于是问题就变成了求解参数w来确定回报函数,这里设定奖励函数为线性函数也是为了之后方便计算。如果状态被映射到一个d维的向量上,那么求解回报就相当于进行如下计算:
R(s)=w_{1} \phi_{1}(s)+w_{2} \phi_{2}(s)+\cdots+w_{d} \phi_{d}(s)\tag{13}
值函数的计算方式可表示为:
\begin{aligned} V^{\pi}(s) &=\sum_{t=0}^{\infty} \gamma^{t} \sum_{i=1}^{d} w_{i} \phi_{i}(s) \\ &=\sum_{i=1}^{d} \sum_{t=0}^{\infty} \gamma^{t} w_{i} \phi_{i}(s) \\ &=\sum_{i=1}^{d} w_{i} \sum_{t=0}^{\infty} \gamma^{t} \phi_{i}(s) \\ &=\sum_{i=1}^{d} w_{i} V_{i}^{n}(s) \end{aligned}\tag{14}
其中V_{i}^{\pi}(s)表示某一维映射特征的累计值。最终目标同样是希望找到最佳的回报函数,使最优策略的价值最大化:
\begin{aligned} &E_{\boldsymbol{s}^{\prime} \sim P_{s, \pi^{*}(s)}}\left[V^{\pi}\left(s^{\prime}\right)\right] \geqslant E_{s^{\prime} \sim P_{s, a}}\left[V^{\pi}\left(s^{\prime}\right)\right] \\ &\sum_{i=1}^{d} w_{i}(E_{s^{\prime} \sim P_{s, \pi^{*}(s)}}[V_{i}^{\pi}(\operatorname{s}^{\prime})]-E_{\boldsymbol{s}^{\prime} \sim P_{s, a}}[V_{i}^{\pi}(s^{\prime})]) \geqslant 0 \end{aligned}\tag{15}
最终的求解目标为:
\tag{16}\begin{aligned} &\operatorname{maximize} \sum_{\boldsymbol{s} \in \boldsymbol{S}_{0}} \min _{\boldsymbol{a} \in\left\{\boldsymbol{a}_{2}, \ldots a_{k}\right\}}\left\{p\left(\sum_{i=1}^{d} w_{i}\left(E_{\boldsymbol{s}^{\prime} \sim P_{\boldsymbol{s}, \pi^{*}(\boldsymbol{s})}}\left[V_{i}^{\pi}\left(\boldsymbol{s}^{\prime}\right)\right]-E_{\boldsymbol{s}^{\prime} \sim P_{\boldsymbol{s} a}}\left[V_{i}^{\pi}\left(\boldsymbol{s}^{\prime}\right)\right]\right)\right)\right\}\\ &\text { s.t. }\left|w_{i}\right| \leqslant 1, i=1, \ldots, d \end{aligned}
与之前有限状态下的求解有些许不同的地方在于:

  • 这里无法考虑所有的状态,只考虑有限个状态
  • 这里不是对回报函数做约束,而是对回报函数的参数大小进行约束,类似L1范数
  • 由于函数式模型可变量有限,所以并不能保证完美拟合真实的回报函数,模型就有可能违背约束条件的情形,因此需要将约束项转变成惩罚项
2.3 最大熵逆强化学习

最大熵逆强化学习(Max Entropy Inverse Reinforcement Learning),能够从多个满足限定条件的策略中寻找一个更合理的策略,论文:Maximum entropy inverse reinforcement learning
期望利用专家的行动轨迹\zeta=\left\{s_{i}, a_{i}\right\}_{N}学习一个回报函数r\left(f_{s_{j}} ; \theta\right),其中f_{s_{j}}是状态的特征抽取,\theta是回报函数的参数,如果回报函数与特征之间是线性关系,则可表示为如下形式:
r\left(\boldsymbol{f}_{\boldsymbol{s}_{j}}\right)=\theta^{\mathrm{T}} \boldsymbol{f}_{\boldsymbol{s}_{j}}=\sum_{i} \theta_{i} \boldsymbol{f}_{i}\tag{17}
此时某条轨迹ζ \zetaζ的累计回报可以写作:
r\left(f_{\zeta}\right)=\sum_{s_{j} \in \zeta} \theta^{\mathrm{T}} f_{s_{j}}=\theta^{\mathrm{T}} \sum_{s_{j} \in \zeta} f_{s_{j}}=\theta^{\mathrm{T}} f_{\zeta}\tag{18}
假设所有的轨迹起始于同一个状态,将每一条轨迹\tilde{\boldsymbol{\zeta}}聚合起来,就可以用这些轨迹得到价值期望的估计:
v(\boldsymbol{f})=E_{\tilde{\boldsymbol{\zeta}}_{\boldsymbol{i}}}\left[r\left(f_{\tilde{\boldsymbol{\xi}}_{\boldsymbol{i}}}\right)\right] \simeq \frac{1}{m} \sum_{\boldsymbol{i}} \theta^{\mathrm{T}} \boldsymbol{f}_{\boldsymbol{\xi}_{\boldsymbol{i}}}=\theta^{\mathrm{T}} \frac{1}{m} \sum_{\boldsymbol{i}} f_{\tilde{\boldsymbol{\zeta}}_{\boldsymbol{i}}}=\theta^{\mathrm{T}} \tilde{\boldsymbol{f}}\tag{19}
假定策略模型为P_{\pi}\left(\zeta_{i}\right),希望策略模型交互得到的轨迹的累计回报等于专家轨迹的累计回报:
E_{\zeta_{i} \sim \pi}\left[r\left(f_{\zeta}\right)\right]=\theta^{\mathrm{T}} \sum_{i} P_{\pi}\left(\zeta_{i}\right) f_{\zeta_{i}}=\theta^{\mathrm{T}} \tilde{f}\tag{20}
由于等式两边\theta相同,可以得到:
\sum_{i} P_{\pi}\left(\zeta_{i}\right) f_{\zeta_{i}}=\frac{1}{m} \sum_{i} f_{\tilde{\zeta}_{i}}\tag{21}
上述这个约束条件并不是很强的一个约束,满足这个约束的策略模型P_{\pi}\left(\zeta_{i}\right)可能有很多,而这些策略在完整的问题空间中可能各有优劣,因此在完整的问题空间中仍然可能得到一个较差模型

最大熵约束:
这里就引入另外一个约束,最大熵约束。如果轨迹获得的累计回报\theta^{\mathrm{T}} f_{\zeta}比较高,那么策略应该以较高的概率出现这条轨迹,再依据最大熵模型可以将轨迹的概率可表示为:
P\left(\zeta_{i} \mid \theta\right)=\frac{1}{Z(\theta)} \mathrm{e}^{\theta^{\mathrm{T}} f_{\zeta_{i}}}=\frac{1}{Z(\theta)} \mathrm{e}^{\theta^{\mathrm{T}} \sum_{s_{j} \in \zeta_{i}} f_{s_{j}}}\tag{22}
其中Z(\theta)=\sum_{i} \mathrm{e}^{\theta^{\mathrm{T}} f_{\zeta}}。令动作序列为o,则P_{T}(\zeta|o)表示当行动序列确定时,状态最终转换成序列\zeta的概率为:
P(\zeta \mid \theta, T)=\sum_{o \in O} P_{T}(\zeta \mid o) \frac{\mathrm{e}^{\theta^{\mathrm{T}} f_{\zeta}}}{Z(\theta, o)} I_{\zeta \in \mathrm{o}}\tag{23}
其中I_{\zeta \in \mathrm{o}}表示轨迹是否可以通过某一条行动序列生成,当这个值等于1时,表示轨迹可以通过行动序列生成,反之无法生成。将其近似为一个可解的形式:

P(\zeta \mid \theta, T) \simeq \frac{\mathrm{e}^{\theta^{\mathrm{T}} f_{\zeta}}}{Z(\theta, \mathbf{o})} \prod_{s_{t+1}, a_{t}, s_{t} \in \zeta} P_{T}\left(s_{t+1} \mid a_{t}, s_{t}\right)\tag{24}
最大似然法求解:
由此得到了模型对轨迹的概率,采用最大似然法进行优化,假定问题是确定的MDP,对应的目标函数为:
\theta^{*}=\operatorname{argmax}_{\theta} L(\theta)=\operatorname{argmax} \sum_{\zeta} \log p(\boldsymbol{\zeta} \mid \theta, T)\tag{25}

与最大熵模型求解类似,先构建拉格朗日函数,然后求导,得到参数梯度的计算公式:
\nabla L(\theta)=\tilde{f}-\sum_{\zeta} p(\zeta \mid \theta, T) f_{\zeta}\tag{26}
其中p(\zeta \mid \theta, T)f_{\zeta}这两项都显得有些复杂。考虑确定MDP的问题,即行动可以直接决定下一时刻的状态。这样当初始状态、策略和回报函数确定时,未来的轨迹也就确定下来。所以将每一条轨迹的状态分别列出来,再将其中重复状态合并,将这些状态的概率与状态对应的特征相乘,得到的结果也是一样的:
\nabla L(\theta)=\tilde{f}-\sum_{s_{i}} D_{s_{i}} f_{s_{i}}
其中D_{si}称为状态访问频率期望(Expected State Visitation Frequency),根据策略和确定的状态转移概率推演,可以得到任意一个时刻状态出现的概率,之后将每一个时刻状态出现的概率加起来,即可得到D_{s_{i}}

前向后向计算方法:
先通过反向计算求出策略模型,再进行前向计算得到状态访问频率期望:

设定在最后一刻T所有状态的出现值为1,就可以计算T-1时刻某个状态下执行某个动作的概率P_{T-1}(a_{i,j}|s_{i})可以得到:
\begin{aligned} P_{T-1}\left(\boldsymbol{a}_{i, j} \mid \boldsymbol{s}_{i}\right) &=\frac{P\left(\boldsymbol{s}_{i}, \boldsymbol{a}_{i, j}\right)}{P\left(\boldsymbol{s}_{i}\right)} \\ &=\frac{\sum_{k} P\left(\boldsymbol{s}_{i}, \boldsymbol{a}_{i, j}, \boldsymbol{s}_{k}\right)}{\sum_{a_{i, j}} \sum_{k} P\left(s_{i}, \boldsymbol{a}_{i, j}, s_{k}\right)} \\ &=\frac{\sum_{k} P\left(\boldsymbol{a}_{i, j} \mid \boldsymbol{s}_{i}\right) p\left(s_{k} \mid \boldsymbol{s}_{i}, \boldsymbol{a}_{i, j}\right)}{\sum_{a_{i, j}} \sum_{k} P\left(\boldsymbol{a}_{i, j} \mid \boldsymbol{s}_{i}\right) p\left(s_{k} \mid \boldsymbol{s}_{i}, \boldsymbol{a}_{i, j}\right)} \end{aligned} \tag{27}
之前提到轨迹出现的概率和回报成正相关,于是可以使用回报替代概率值,得到:
\frac{\sum_{k} \mathrm{e}^{\mathrm{reward}\left(\boldsymbol{s}_{i} \mid \theta\right)} p\left(\boldsymbol{s}_{k} \mid \boldsymbol{s}_{i}, \boldsymbol{a}_{i, j}\right)}{\sum_{a_{i, j}} \sum_{k} \mathrm{e}^{\mathrm{reward}\left(\boldsymbol{s}_{i}\right) \mid \theta} p\left(\boldsymbol{s}_{k} \mid \boldsymbol{s}_{i}, \boldsymbol{a}_{i, j}\right)}\tag{28}
Z_{\boldsymbol{a}_{i, j}}=\sum_{k} \mathrm{e}^{\mathrm{reward}\left(\boldsymbol{s}_{i} \mid \theta\right)} p\left(s_{k} \mid \boldsymbol{s}_{i}, \boldsymbol{a}_{i, j}\right),公式就可以变为:
=\frac{Z_{a_{i, j}}}{\sum_{a_{i, j}} Z_{a_{i, j}}}\tag{29}
当时刻转到T-2时,可以得到类似的结果:
P_{T-2}\left(\boldsymbol{a}_{i, j} \mid \boldsymbol{s}_{i}\right)=\frac{\sum_{k} \mathrm{e}^{\mathrm{reward}\left(\boldsymbol{s}_{i} \mid \theta\right)} p\left(\boldsymbol{s}_{k} \mid \boldsymbol{s}_{i}, \boldsymbol{a}_{i, j}\right) Z_{\boldsymbol{s}_{k}}}{\sum_{\boldsymbol{a}_{i, j}} \sum_{k} \mathrm{e}^{\mathrm{reward}\left(\boldsymbol{s}_{i}\right) \mid \theta} p\left(\boldsymbol{s}_{k} \mid \boldsymbol{s}_{i}, \boldsymbol{a}_{i, j}\right) Z_{\boldsymbol{s}_{k}}}\tag{30}
这样就得到了一个迭代公式,随着迭代轮数不断增加,策略估计值会变得越来越稳定,越来越接近真实的策略,这样就可以完成策略的计算。拿到策略之后可以进行前向计算,得到每个时刻的访问频率

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容