条件随机场|机器学习推导系列(二十一)

一、背景

  1. 概述

\left.\begin{matrix} SVM\ \ PLA\\ LDA \end{matrix}\right\}\overset{硬}{\leftarrow }分类\overset{软}{\rightarrow}\begin{Bmatrix} \underset{(概率判别模型,对P(y|x)建模)}{Logistic\; Regression}\Rightarrow Max\; Entropy\; Model\\ \underset{(概率生成模型,对P(x,y)建模)}{Naive\; Bayes}\Rightarrow Hidden\; Markov\; Model \end{Bmatrix}\rightarrow MEMM\rightarrow CRF

如上所示,分类问题分为硬分类和软分类两种。硬分类问题指的是分类结果非此即彼的模型,包括SVM、PLA、LDA等。软分类问题将概率作为分类的依据,分为概率判别模型和概率生成模型两种。其中概率判别模型对概率P(y|x)进行建模,代表算法有逻辑回归(Logistic Regression,LR)。LR的损失函数为交叉熵损失函数,这类模型也叫做对数线性模型,一般地,又叫做最大熵模型(Max Entropy Model),这类模型和指数族分布的概率假设是一致的。朴素贝叶斯算法(Naive Bayes)为概率生成模型的一种,如果将其单元素的条件独立性推广到一系列隐变量,由此得到的模型就是动态模型,如隐马尔可夫模型(Hidden Markov Model,HMM),从概率意义上,HMM也可以看做高斯混合模型(Gaussian Mixture Model,GMM)在时序上的推广。

  1. HMM vs. MEMM

如果将最大熵模型和HMM相结合,就得到了最大熵马尔可夫模型(Max Entropy Markov Model)。MEMM的概率图如下:

MEMM

这个概率图就是将HMM的概率图观测变量和隐变量的边反向,这样的话HMM中的观测独立假设就不成立了,也因此XY的影响包括局部和全局两种。HMM的观测独立假设是一个很强的假设,如果我们有一个文本样本,那么观测独立假设就意味着样本之中的每个词之间没有任何关系,这显然是不合理的,因此打破这个假设是更加合理的。

HMM的概率图如下:

HMM

HMM是一个概率生成模型,其建模对象是P(X,Y|\lambda ),可以将HMM的看做是由图中画虚线的部分所组成的,结合其两个假设,可以写出其概率公式为:

P(X,Y|\lambda )=\prod_{i=1}^{T}P(x_{t},y_{t}|y_{t-1},\lambda )=\prod_{i=1}^{T}P(y_{t}|y_{t-1},\lambda )P(x_{t}|y_{t},\lambda )

在MEMM的概率图中,x_tx_{t+1}y_{t+1}之间是head-to-head的结构,它们是不独立的,因此打破了观测独立假设,X的作用分为global和local两种。MEMM是概率判别模型,其建模对象是P(Y|X,\lambda ),其概率图可以认为是由图中画虚线的部分组成,因此其概率公式为:

P(Y|X,\lambda )=\prod_{i=1}^{T}P(y_{t}|y_{t-1},x_{1:T},\lambda )

MEMM的缺陷是其必须满足局部的概率归一化(也就是Label Bias Problem),对于这个问题,我们将y之间的箭头转为直线从而得到无向图(线性链条件随机场),这样就只要满足全局归一化了(破坏了齐次马尔可夫假设)。

  1. 标注偏置问题

标注偏置问题(Label Bias Problem)是MEMM存在的一个局限性,这也是决定它不流行的主要原因,条件随机场(Conditional Random Field,CRF)通过使用无向图解决了这个问题。

  • 根因
MEMM

对于MEMM,上面的概率图由于存在齐次马尔可夫假设可以认为是由一个个方框中的部分组成的,因此有概率公式如下:

P(Y|X,\lambda )=\prod_{i=1}^{T}P(y_{t}|y_{t-1},x_{1:T},\lambda )

对于每一个方框中的组件,我们可以看做一个函数,叫做mass score,这个函数对外是有一定能量的,但这个mass score同时必须是一个概率P(y_{t}|y_{t-1},x_{1:T},\lambda ),因此被归一化了,叫做局部归一化,这就是导致标注偏置问题的根本原因所在。

而CRF采用无向图的结构,其天然地满足全局归一化,也就打破了齐次马尔可夫假设,从而解决了标注偏置问题。

  • 现象

局部归一化造成了标注偏置问题,这一问题造成的现象可以通过以下例子来解释。

现象

对于上图中训练得到的MEMM模型,节点表示时刻的状态y_t,边表示观测x_t。可以看出,上述状态从1到2,2到3,4到5,5到3全部都只有一个状态转移的选择,这也就导致无论观测x_t是多少,y_t都不关心而只会向确定的一个状态进行转移。上述状况显然表明训练得到的模型是不合理的,举个更具体的例子,如果对“小明 爱 中国”进行词性标注,模型会根据“小明”和“爱”的词性直接标注“中国”的词性,根本不关心观测“中国”本身。

上述MEMM模型是根据训练数据训练得到的,比如在训练数据中一共有3个rob,1个rib,这样的训练数据得到的模型概率如下图所示:

现象

可以看出由于局部归一化从1到2,2到3,4到5,5到3的状态转移概率全部都是1,这样会造成求解Decoding问题时的标注偏置问题,也就是在观测为rib的条件下,求解最可能的标准序列\hat{Y}时会得到以下结果:

\hat{Y}=\underset{y_{1},y_{2},y_{3}}{argmax}\; P(y_{1},y_{2},y_{3}|rib)=0\rightarrow 4\rightarrow 5\rightarrow 3

也就是说解得的结果反而是0\rightarrow 4\rightarrow 5\rightarrow 3,这是因为概率0.75\times 1\times 1>0.25\times 1\times 1所致。

二、条件随机场

  1. 条件随机场的概率密度函数

CRF中条件代表这是一个判别式模型,随机场表示其是一个无向图模型。CRF的概率图如下:

CRF

对于无向图的因子分解,可以参考以前的文章中的讲解:概率图模型-表示|机器学习推导系列(十)

简单来说,无向图的概率分布可以分解为图中所有最大团的势函数的乘积。给定概率无向图模型,C_i,i=1,2,\cdots ,K为无向图模型上的最大团,则x的联合概率分布P(x)可以写为:

P(x)=\frac{1}{Z}\prod_{i=1}^{K}\psi (x_{C_{i}})\\ C_{i}:最大团\\ x_{C_{i}}:最大团随机变量集合\\ \psi (x_{C_{i}}):势函数,必须为正\\ Z=\sum _{x}\prod_{i=1}^{K}\psi (x_{C_{i}})=\sum _{x_{1}}\sum _{x_{2}}\cdots \sum _{x_{p}}\prod_{i=1}^{K}\psi (x_{C_{i}})

Z是归一化因子,通常使用势函数\psi (x_{C_{i}})=exp\left \{-E(x_{C_{i}})\right \}(这里的E(x_{C_{i}})叫做能量函数),也就是说:

P(x)=\frac{1}{Z}\prod_{i=1}^{K}\psi (x_{C_{i}})\\ =\frac{1}{Z}\prod_{i=1}^{K}exp\left \{-E_{i}(x_{C_{i}})\right \}\\ =\frac{1}{Z}exp\left \{\sum_{i=1}^{K}-E_{i}(x_{C_{i}})\right \}\\ =\frac{1}{Z}exp\left \{\sum_{i=1}^{K}F_{i}(x_{C_{i}})\right \}\\ =\frac{1}{Z}exp\left \{\sum_{i=1}^{K}F(x_{C_{i}})\right \}

为方便起见,这里把-E_{i}(x_{C_{i}})写作F_{i}(x_{C_{i}})只是为了简化形式,并且不同最大团之间使用的是同一个F函数。在CRF中对于P(Y|X)也就有:

P(Y|X)=\frac{1}{Z}exp\left \{\sum_{i=1}^{K}F(y_{C_{i}})\right \}\\ =\frac{1}{Z}exp\left \{{\color{Red}{\sum_{t=1}^{T}}}F(y_{t-1},y_{t},x_{1:T})\right \}

这里为了方便起见,在y_1前添加y_0节点,因此对于CRF这个线性链,其中一共有T个最大团。

对于函数F(y_{t-1},y_{t},x_{1:T}),我们可以把它写作三部分:

F(y_{t-1},y_{t},x_{1:T})=\Delta _{y_{t-1},x_{1:T}}+\Delta _{y_{t},x_{1:T}}+\Delta _{y_{t-1},y_{t},x_{1:T}}

其中\Delta _{y_{t-1},x_{1:T}}\Delta _{y_{t},x_{1:T}}称为状态函数,\Delta _{y_{t-1},y_{t},x_{1:T}}称为转移函数。由于在\sum_{t=1}^{T}F(y_{t-1},y_{t},x_{1:T})中每个\Delta _{y_{t},x_{1:T}}都出现了两次,并且我们还需要做归一化,因此在每个F中省略\Delta _{y_{t-1},x_{1:T}}这一项即可,也就是说我们采用的F为:

F(y_{t-1},y_{t},x_{1:T})=\Delta _{y_{t},x_{1:T}}+\Delta _{y_{t-1},y_{t},x_{1:T}}

我们定义\Delta _{y_{t},x_{1:T}}\Delta _{y_{t-1},y_{t},x_{1:T}}如下:

\Delta _{y_{t-1},y_{t},x_{1:T}}=\sum_{k=1}^{K}\lambda _{k}f_{k}(y_{t-1},y_{t},x_{1:T})\\ \Delta _{y_{t},x_{1:T}}=\sum_{l=1}^{L}\eta _{l}g_{l}(y_{t},x_{1:T})

上式中f_{k}g_{l}是给定的特征函数(或者指数函数),\lambda _{k}\eta _{l}是参数。特征函数的取值是人为给定的,取值只能是01f_{k}称为转移特征,g_{l}称为状态特征,只有在满足特征条件时特征函数取值才为1,否则为0,比如我们可以规定:

f_{1}(y_{t-1},y_{t},x_{1:T})=\left\{\begin{matrix} 1,\; \; y_{i-1}=1,y_{i}=1,x_{1:T}(i=2,3)\\ 0,\; \; otherwise \end{matrix}\right.

总而言之,P(Y|X)的概率密度函数可以表示为:

P(Y|X)=\frac{1}{Z}exp\left \{\sum_{t=1}^{T}[\sum_{k=1}^{K}\lambda _{k}f_{k}(y_{t-1},y_{t},x_{1:T})+\sum_{l=1}^{L}\eta _{l}g_{l}(y_{t},x_{1:T})]\right \}

  1. 概率密度函数的向量形式

为了更方便地使用概率密度函数进行后续求导等一系列操作,我们需要对上述概率密度函数进行整理和简化,从而取得其向量的表示形式。

对于归一化因子Z,其只和x,\lambda ,\eta有关,而与y无关,这是因为y被积分积掉了,因此可以写成以下形式:

Z=Z(x,\lambda ,\eta )

接着我们定义以下向量:

y=\begin{pmatrix} y_{1}\\ y_{2}\\ \vdots \\ y_{T} \end{pmatrix},x=\begin{pmatrix} x_{1}\\ x_{2}\\ \vdots \\ x_{T} \end{pmatrix},\lambda =\begin{pmatrix} \lambda _{1}\\ \lambda _{2}\\ \vdots \\ \lambda _{K} \end{pmatrix},\eta =\begin{pmatrix} \eta _{1}\\ \eta _{2}\\ \vdots \\ \eta _{L} \end{pmatrix}\\ f=f(y_{t-1},y_{t},x)=\begin{pmatrix} f_{1}\\ f_{2}\\ \vdots \\ f_{K} \end{pmatrix},g=g(y_{t},x)=\begin{pmatrix} g_{1}\\ g_{2}\\ \vdots \\ g_{L} \end{pmatrix}

则此时我们将概率密度函数写作以下向量相乘的形式:

P(Y=y|X=x)=\frac{1}{Z(x,\lambda ,\eta )}exp\left \{\sum_{t=1}^{T}[\lambda ^{T}\cdot f(y_{t-1},y_{t},x)+\eta ^{T}\cdot g(y_{t},x)]\right \}

此时式子中还剩下一个关于t的连加号,而与t有关的只有fg,于是我们考虑可以将这个连加号放到括号里面:

P(Y=y|X=x)=\frac{1}{Z(x,\lambda ,\eta )}exp\left \{\lambda ^{T}\cdot \sum_{t=1}^{T}f(y_{t-1},y_{t},x)+\eta ^{T}\cdot \sum_{t=1}^{T}g(y_{t},x)\right \}

接着继续定义如下两个向量:

\theta =\begin{pmatrix} \lambda\\ \eta \end{pmatrix}_{K+L}, H=\begin{pmatrix} \sum_{t=1}^{T}f(y_{t-1},y_{t},x) \\ \sum_{t=1}^{T}g(y_{t},x) \end{pmatrix}_{K+L}

于是最终可以将概率密度函数写成如下形式:

P(Y=y|X=x)=\frac{1}{Z(x,\theta )}exp\left \{\theta ^{T}\cdot H\right \}

三、参数估计和推断

  1. 条件随机场要解决的问题

Learning:也就是参数估计问题,对于给定的训练数据\left \{(x^{(i)},y^{(i)})\right \}_{i=1}^{N}x,y均是T维向量,需要估计参数\hat{\theta }=argmax\prod_{i=1}^{N}P(y^{(i)}|x^{(i)})

Inference:
①边缘概率:求P(y_{t}|x)
②条件概率:一般在生成模型中较为关注,条件随机场不关注;
③MAP推断:也就是Decoding问题,即\hat{y}=argmax\; P(y|x)

  1. 求解边缘概率

求解边缘概率的问题就是给定概率分布P(Y=y|X=x),求解P(y_t=i|x)。对于P(y|x),其概率分布为:

P(y|x)=\frac{1}{Z}\prod _{t=1}^{T}\phi _{t^{'}}(y_{t^{'}-1},y_{t^{'}},x)

因此我们要求解的概率分布为:

P(y_{t}=i|x)=\sum _{y_{1:t-1},y_{t+1:T}}P(y|x)=\sum _{y_{1:t-1}}\sum _{y_{t+1:T}}\frac{1}{Z}\prod _{t=1}^{T}\phi _{t^{'}}(y_{t^{'}-1},y_{t^{'}},x)

假设y_t的取值集合为S。上式直接计算的复杂度非常地高,这是由于求和的复杂度是O(|S|^T),求积的复杂度是O(T),整体复杂度也就是O(T|S|^T)。因此我们的解决方案是调整求和符号的位置,从而降低复杂度,事实上也就是前面讲过的变量消除法。

我们将t时刻左右两边的势函数连同积分号拆成两部分\Delta _{左}\Delta _{右}

P(y_{t}=i|x)=\frac{1}{Z}\Delta _{左}\Delta _{右}\\ \Delta _{左}=\sum _{y_{1:t-1}}\phi _{1}(y_{0},y_{1},x)\phi _{2}(y_{1},y_{2},x)\cdots \phi _{t-1}(y_{t-2},y_{t-1},x)\phi _{t}(y_{t-1},y_{t}=i,x)\\ \Delta _{右}=\sum _{y_{t+1:T}}\phi _{t+1}(y_{t}=i,y_{t+1},x)\phi _{t+2}(y_{t+1},y_{t+2},x)\cdots \phi _{T}(y_{T-1},y_{T},x)

对于\Delta _{左},我们按照变量消除法的思路来调整加和符号的位置:

\Delta _{左}=\sum _{y_{t-1}}\phi _{t}(y_{t-1},y_{t}=i,x)\sum _{y_{t-2}}\phi _{t-1}(y_{t-2},y_{t-1},x)\cdots \sum _{y_{1}}\phi _{2}(y_{1},y_{2},x)\sum _{y_{0}}\phi _{1}(y_{0},y_{1},x)

按照从右往左积分的方式可以降低计算的复杂度,也就是一个一个地进行积分,并且上式为了看起来方便省略了括号。这里的y_0是为了表达方便才加上去的一个随机变量,可以认为它的值只能取start这一个值。

接下来我们将上式写成递推式的形式,我们定义:

\alpha _{t}(i)=\Delta _{左}

则递推式为:

\alpha _{t}(i)=\sum _{j\in S}\phi _{t}(y_{t-1}=j,y_{t}=i,x)\alpha _{t-1}(j)

类似地,对\Delta _{右}的积分方式为:

\Delta _{右}=\sum _{y_{t+1}}\phi _{t+1}(y_{t}=i,y_{t+1},x)\sum _{y_{t+2}}\phi _{t+2}(y_{t+1},y_{t+2},x)\cdots \sum _{y_{T-1}}\phi _{T}(y_{T-2},y_{T-1},x)\sum _{y_{T}}\phi _{T}(y_{T-1},y_{T},x)

同样地这里也省略一系列括号,顺序也是从右往左进行积分。我们定义:

\beta _{t}(i)=\Delta _{右}

递推式为:

\beta _{t}(i)=\sum _{j\in S}\phi _{t+1}(y_{t}=i,y_{t+1}=j,x)\beta _{t+1}(j)

因此,最终的结论也就是:

P(y_{t}=i|x)=\frac{1}{Z}\alpha _{t}(i)\beta _{t}(i)

这个方法类似于HMM中的前向后向算法,其实也就是概率图模型中精确推断的变量消除法(信念传播),相关参考链接为:概率图模型-推断|机器学习推导系列(十一)

  1. 参数估计

对于概率密度函数的以下形式:

P(Y=y|X=x)=\frac{1}{Z(x,\theta )}exp\left \{\theta ^{T}\cdot H\right \}

这里可以看出这个概率密度函数就是一个指数族分布,其中参数向量就是上面的\theta,充分统计量也就是H。有关指数族分布的讲解可以参考这个链接:指数族分布|机器学习推导系列(九)

CRF的参数估计问题就是在似然上做梯度上升来求得最优解,而我们用来求导的概率密度函数使用以下形式:

P(Y=y|X=x)=\frac{1}{Z(x,\lambda ,\eta )}exp\left \{\sum_{t=1}^{T}[\lambda ^{T}\cdot f(y_{t-1},y_{t},x)+\eta ^{T}\cdot g(y_{t},x)]\right \}

按照极大似然估计的思路,写出公式如下:

\hat{\theta }=\underset{\theta }{argmax}\prod_{i=1}^{N}P(y^{(i)}|x^{(i)})\\ =\underset{\theta }{argmax}\sum_{i=1}^{N}log\; P(y^{(i)}|x^{(i)})\\ =\underset{\theta }{argmax}\underset{记作L(\lambda ,\eta )}{\underbrace{\sum_{i=1}^{N}[-log\; Z(x^{(i)},\lambda ,\eta )+\sum_{t=1}^{T}[\lambda ^{T}\cdot f(y_{t-1}^{(i)},y_{t}^{(i)},x^{(i)})+\eta ^{T}\cdot g(y_{t}^{(i)},x^{(i)})]]}}\\ =\underset{\theta }{argmax}\; L(\lambda ,\eta )

然后需要对\lambda\eta求导,以\lambda为例。等号右边的部分对\lambda求导较为简单。

从指数族分布的角度来看,Z(x^{(i)},\lambda ,\eta )就是配分函数,log\; Z(x^{(i)},\lambda ,\eta )也就是log配分函数。套用指数族分布|机器学习推导系列(九)中第三部分的结论,我们可以知道:

\nabla_{\theta }(log\; Z(x^{(i)},\theta ))=E_{P(y|x^{(i)})}[H]\\ =E_{P(y|x^{(i)})}[\begin{pmatrix} \sum_{t=1}^{T}f(y_{t-1},y_{t},x^{(i)}) \\ \sum_{t=1}^{T}g(y_{t},x^{(i)}) \end{pmatrix}]

类似的对于\theta的一部分\lambda进行求导我们可以知道:

\nabla_{\lambda }(log\; Z(x^{(i)},\lambda ,\eta ))=E_{P(y|x^{(i)})}[\sum_{t=1}^{T}f(y_{t-1},y_{t},x^{(i)})]\\ =\sum _{y}[P(y|x^{(i)})\sum_{t=1}^{T}f(y_{t-1},y_{t},x^{(i)})]

这个结论和指数族分布|机器学习推导系列(九)中第三部分的推导过程类似,这里我们就不再重复。

对于上述式子,我们可以调整加和符号的位置:

\sum_{t=1}^{T}[\sum _{y}P(y|x^{(i)})f(y_{t-1},y_{t},x^{(i)})]=\sum_{t=1}^{T}[{\color{Red}{\sum _{y_{1:t-2}}}}\sum _{y_{t-1}}\sum _{y_{t}}{\color{Red}{\sum _{y_{t+1:T}}}}{\color{Red}{P(y|x^{(i)})}}f(y_{t-1},y_{t},x^{(i)})]\\ =\sum_{t=1}^{T}[\sum _{y_{t-1}}\sum _{y_{t}}{\color{Red}{P(y_{t-1},y_{t}|x^{(i)})}}f(y_{t-1},y_{t},x^{(i)})]

对于概率P(y_{t-1},y_{t}|x^{(i)}),这显然是一个边缘概率,是可以利用上一节的这种前向后向算法来求解这个边缘概率,然后就能得到这个导数。对于边缘概率P(y_{t}|x^{(i)}),上一节的方法是将1t的势函数记作\Delta _{左},将t+1T的势函数记作\Delta _{右}。类似的,在求解P(y_{t-1},y_{t}|x^{(i)})时就可以将1t-1部分的势函数记作\Delta _{左},将t+1T的势函数记作\Delta _{右}。总而言之,求解的过程是类似的。

因此,最终我们得到的log似然对\lambda的导数为:

\nabla_{\lambda }L(\lambda ,\eta )=\sum_{i=1}^{N}\sum_{t=1}^{T}[f(y_{t-1}^{(i)},y_{t}^{(i)},x^{(i)})-\sum _{y_{t-1}}\sum _{y_{t}}P(y_{t-1},y_{t}|x^{(i)})f(y_{t-1},y_{t},x^{(i)})]

然后按照梯度上升的方式来更新参数即可,\eta的处理也类似:

\left\{\begin{matrix} \lambda ^{(m+1)}=\lambda ^{(m)}+step\cdot \nabla_{\lambda ^{(m)}}L(\lambda ^{(m)},\eta ^{(m)})\\ \eta ^{(m+1)}=\eta ^{(m)}+step\cdot \nabla_{\eta ^{(m)}}L(\lambda ^{(m)},\eta ^{(m)}) \end{matrix}\right.

  1. Decoding问题

Decoding问题和HMM中的Viterbi算法类似,同样采样动态规划的思想⼀层⼀层求解最大值,求解方法很类似,这里就不再重复,参考链接:隐马尔可夫模型|机器学习推导系列(十七),更具体的可以参考李航老师的《统计学习方法》中关于CRF的讲解。

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

推荐阅读更多精彩内容