XGBoost原理理解

XGBoost = Extreme Gradient Boosting蒂培,也就是說(shuō),XGBoost 把 Gradient Boosting 做到了極致瑟捣,具體來(lái)說(shuō)末荐,這種極致體現(xiàn)在訓(xùn)練精度高、所需計(jì)算資源少勃救。正如陳天奇大神在 Quora 的相關(guān)回答中說(shuō):

The name xgboost, though, actually refers to the engineering goal to push the limit of computations resources for boosted tree algorithms. Which is the reason why many people use xgboost.

下圖是基于樹(shù)的算法的發(fā)展路徑圖碍讨,可以看到 XGBoost 是 Gradient Boosting 的(終極)強(qiáng)化版(圖自here)。

接下來(lái)我們按照原論文的組織順序來(lái)大概記錄一下對(duì) XGBoost 的原理理解蒙秒。

1勃黍、Model

首先模型可以表示如下:

\hat{y}_{i}=\phi\left(\mathbf{x}_{i}\right)=\sum_{k=1}^{K} f_{k}\left(\mathbf{x}_{i}\right), \quad f_{k} \in \mathcal{F}

這里各個(gè)f_k表示回歸樹(shù)模型,\mathcal{F}=\left\{f(\mathrm{x})=w_{q(\mathrm{x})}\right\}\left(q: \mathbb{R}^{m} \rightarrow T, w \in \mathbb{R}^{T}\right)表示回歸樹(shù)空間晕讲。q表示一個(gè)樹(shù)結(jié)構(gòu)對(duì)應(yīng)的映射覆获,這個(gè)映射是將一個(gè)樣本映射到所劃分的葉子結(jié)點(diǎn)的編號(hào)。w_{q(x)}則表示樣本所屬結(jié)點(diǎn)的得分或權(quán)重瓢省。T表示樹(shù)的葉子結(jié)點(diǎn)數(shù)弄息。

聽(tīng)起來(lái)很復(fù)雜的樣子,實(shí)際上就是建立K棵回歸樹(shù)勤婚,然后對(duì)一個(gè)輸入X摹量,在K顆樹(shù)中都找到其所屬葉子結(jié)點(diǎn)的得分,然后加起來(lái)就得到最終的預(yù)測(cè)\hat{y}馒胆。原論文中有清晰的圖解:

2缨称、Loss Function & Quality Score

有了模型,下一步就是定義損失函數(shù)

\begin{aligned} & \mathcal{L}(\phi) =\sum_{i} l\left(\hat{y}_{i}, y_{i}\right)+\sum_{k} \Omega\left(f_{k}\right) \\ &\text { where }\ \ \ \Omega(f) =\gamma T+\frac{1}{2} \lambda\|w\|^{2} \\ \end{aligned}

這里l是一個(gè)可導(dǎo)的凸損失函數(shù)祝迂,衡量模型預(yù)測(cè)值和真實(shí)值之間的差異睦尽,\Omega是針對(duì)模型復(fù)雜度的罰項(xiàng),可以視作正則項(xiàng)液兽。這里的\Omega(f)由兩部分組成骂删,第一項(xiàng)是限制葉子結(jié)點(diǎn)數(shù),第二項(xiàng)則是限制各葉子結(jié)點(diǎn)的分?jǐn)?shù)四啰,目的都是防止過(guò)擬合宁玫。刪去正則項(xiàng)則損失函數(shù)退化至普通 Gradient Boosting 的情形。

需要注意的是柑晒,損失函數(shù)\mathcal{L}(\phi)的輸入是一個(gè)函數(shù)欧瘪,因此不能用像SGD這樣的方法去找到各個(gè)f_k,因?yàn)樗麄兪菢?shù)而不是數(shù)值向量匙赞。解決問(wèn)題的方法就是加法訓(xùn)練(Additive Training)佛掖。定義\hat{y_{i}}^{(t)}為第i個(gè)樣本在第t輪迭代得到的模型上做出的預(yù)測(cè)妖碉。則假設(shè)當(dāng)前我們已經(jīng)進(jìn)行了t-1輪迭代,則我們希望得到一個(gè)f_t使得下面的損失函數(shù)最薪姹弧:

\mathcal{L}^{(t)}=\sum_{i=1}^{n} l\left(y_{i}, \hat{y_{i}}^{(t-1)}+f_{t}\left(\mathbf{x}_{i}\right)\right)+\Omega\left(f_{t}\right)

我們用 Taylor 公式對(duì)上式進(jìn)行二次近似欧宜,之所以用二次而不是一次,是為了優(yōu)化時(shí)使得損失更快下降拴魄。這里我們回顧一下泰勒公式:

f(x+\Delta x) \approx f(x) + f^{'}(x)\Delta x + \frac{1}{2}f^{''}(x)\Delta x^2

\mathcal{L}^{(t)}中的\hat{y_{i}}^{(t-1)}當(dāng)作上式中的x冗茸,f_{t}\left(\mathbf{x}_{i}\right)當(dāng)作上式中的\Delta x,則:

\mathcal{L}^{(t)} \simeq \sum_{i=1}^{n}\left[l\left(y_{i}, \hat{y}^{(t-1)}\right)+g_{i} f_{t}\left(\mathbf{x}_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(\mathbf{x}_{i}\right)\right]+\Omega\left(f_{t}\right)

其中g_{i}=\partial_{\hat{y}(t-1)} l\left(y_{i}, \hat{y}^{(t-1)}\right)為一階導(dǎo)匹中,h_{i}=\partial_{\hat{y}(t-1)}^2 l\left(y_{i}, \hat{y}^{(t-1)}\right)為二階導(dǎo)夏漱。值得注意的是,如果這里只做一次近似顶捷,那么當(dāng)f_t(X)沿-g方向下降最快挂绰,因此可以用f_t(X)擬合-g,這實(shí)際上就是 Gradient Boosting服赎。

由于l\left(y_{i}, \hat{y}^{(t-1)}\right)和當(dāng)前要優(yōu)化的函數(shù)f_t無(wú)關(guān)葵蒂,因此可以作為常數(shù)項(xiàng)去掉,從而:

\tilde{\mathcal{L}}^{(t)}=\sum_{i=1}^{n}\left[g_{i} f_{t}\left(\mathbf{x}_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(\mathbf{x}_{i}\right)\right]+\Omega\left(f_{t}\right)

定義I_j = \{i|q(x_i) = j\}為第j個(gè)葉結(jié)點(diǎn)包含的樣本专肪,則上式可以寫(xiě)作:

\begin{aligned} \tilde{\mathcal{L}}^{(t)} &=\sum_{i=1}^{n}\left[g_{i} f_{t}\left(\mathbf{x}_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(\mathbf{x}_{i}\right)\right]+\gamma T+\frac{1}{2} \lambda \sum_{j=1}^{T} w_{j}^{2} \\ &=\sum_{j=1}^{T}\left[\left(\sum_{i \in I_{j}} g_{i}\right) w_{j}+\frac{1}{2}\left(\sum_{i \in I_{j}} h_{i}+\lambda\right) w_{j}^{2}\right]+\gamma T \end{aligned}

對(duì)于固定的樹(shù)結(jié)構(gòu)q(x)刹勃,可以計(jì)算出各葉子結(jié)點(diǎn)的最優(yōu)分?jǐn)?shù):

w_{j}^{*}=-\frac{ \sum_{i \in I_{j}} g_{i}}{\sum_{i \in I_{j}} h_{i}+\lambda}

代回原損失函數(shù)可以得到最優(yōu)損失:

\tilde{\mathcal{L}}^{(t)}(q)=-\frac{1}{2} \sum_{j=1}^{T} \frac{\left(\sum_{i \in I_{j}} g_{i}\right)^{2}}{\sum_{i \in I_{j}} h_{i}+\lambda}+\gamma T

于是上式就可以作為衡量一個(gè)樹(shù)結(jié)構(gòu)q好壞的分?jǐn)?shù),這個(gè)分?jǐn)?shù)類似于決策樹(shù)中的基尼系數(shù)或信息增益嚎尤,可以用于判斷結(jié)點(diǎn)如何分裂荔仁。

假設(shè)當(dāng)前樹(shù)中一個(gè)葉子結(jié)點(diǎn)的樣本集為I,分裂后得到的左孩子和右孩子的樣本為I_LI_R芽死,則結(jié)點(diǎn)分裂后得到的樹(shù)結(jié)構(gòu)的最優(yōu)損失為:

\tilde{\mathcal{L}}^{(t)}(q_{split})=-\frac{1}{2} \sum_{j=1}^{T} \left[\frac{\left(\sum_{i \in I_{L}} g_{i}\right)^{2}}{\sum_{i \in I_{L}} h_{i}+\lambda} + \frac{\left(\sum_{i \in I_{R}} g_{i}\right)^{2}}{\sum_{i \in I_{R}} h_{i}+\lambda} \right]+\gamma (T+1)

上面兩式相減乏梁,損失減少量為:

\mathcal{L}_{s p l i t}=\frac{1}{2}\left[\frac{\left(\sum_{i \in I_{L}} g_{i}\right)^{2}}{\sum_{i \in I_{L}} h_{i}+\lambda}+\frac{\left(\sum_{i \in I_{R}} g_{i}\right)^{2}}{\sum_{i \in I_{R}} h_{i}+\lambda}-\frac{\left(\sum_{i \in I} g_{i}\right)^{2}}{\sum_{i \in I} h_{i}+\lambda}\right]-\gamma

當(dāng)然遍歷所有可能的樹(shù)結(jié)構(gòu)是不可能的,我們只能采用貪心的算法关贵,即從初始的根節(jié)點(diǎn)開(kāi)始遇骑,每一步都采用當(dāng)前的最優(yōu)結(jié)點(diǎn)劃分策略,直至達(dá)到終止條件揖曾。這部分的算例原論文也有給出:

而上面所述的貪心算法的正規(guī)化表達(dá)如下:

3落萎、Additional Techniques

在防止過(guò)擬合的措施方面,除了上面 loss function 中正則項(xiàng)對(duì)樹(shù)模型的限制炭剪,還可以使用 ShrinkageColumn Subsampling 的方法练链。

所謂 Shrinkage,就是在每一輪添加一棵樹(shù)的時(shí)候加入一個(gè)收縮系數(shù)\epsilon奴拦,類似于梯度下降算法中的學(xué)習(xí)率:

\hat{y}_{i}^{(t)}=\hat{y}_{i}^{(t-1)}+\epsilon f_{t}\left(x_{i}\right)

收縮系數(shù)\epsilon通常設(shè)置為大約 0.1媒鼓。這樣做的原因很簡(jiǎn)單,就是減小單個(gè)樹(shù)模型對(duì)結(jié)果的影響,并為未來(lái)的樹(shù)對(duì)模型的改進(jìn)留足空間绿鸣,從而有效緩解過(guò)擬合疚沐。

所謂 Column Subsampling ,其實(shí)就是 Feature Subsampling潮模,特征抽樣亮蛔。這個(gè)防止過(guò)擬合的方法就是 Random Forest 中所采用的,論文中提到再登,Column Subsampling 在防止過(guò)擬合方面的效果通常優(yōu)于 Row Subsampling (Sample Subsampling)尔邓。

4晾剖、Approximate Algorithm

上面提到的貪心算法是確定性的锉矢,因?yàn)槊看谓Y(jié)點(diǎn)劃分前,我們都要遍歷各個(gè)特征以及各特征可能的劃分點(diǎn)齿尽,所以計(jì)算消耗較大沽损,尤其是數(shù)據(jù)分布很集中的情形會(huì)造成很多不必要的計(jì)算,且對(duì)于數(shù)據(jù)量大到無(wú)法全部存在內(nèi)存中的情形循头,計(jì)算效率很低(因?yàn)槊總€(gè)結(jié)點(diǎn)判斷如何劃分的過(guò)程中都要進(jìn)行內(nèi)存的存取操作)绵估。

為了加速計(jì)算,論文中提出了相應(yīng)的近似算法:

概括一下就是卡骂,枚舉所有特征国裳,根據(jù)特征,比如第k個(gè)特征的分位數(shù)來(lái)決定出l個(gè)候選切分點(diǎn)S_k=\{s_{k1},s_{k2},?s_{kl}\} 全跨,然后根據(jù)這些候選切分點(diǎn)把相應(yīng)的樣本映射到對(duì)應(yīng)的桶中缝左,對(duì)每個(gè)桶的G,H進(jìn)行累加。最后在候選切分點(diǎn)集合上貪心查找浓若。

下面是一個(gè)三分位數(shù)的例子渺杉,圖自知乎wepon。

論文中提到了該近似算法的兩種形式挪钓,一種是 global是越,另一種是 local

所謂 global碌上,就是在建樹(shù)之前預(yù)先將數(shù)據(jù)進(jìn)行全局(global)分桶倚评,所謂 local,就是在各個(gè)結(jié)點(diǎn)分裂時(shí)重新局部(local)分桶馏予。

直覺(jué)上講天梧,global 需要設(shè)置更小的分位數(shù)間隔(這里用?表示,3分位的分位數(shù)間隔就是\frac{1}{3})吗蚌,產(chǎn)生更多的桶腿倚。而 local 可以設(shè)置較大的?,產(chǎn)生更少的桶。

論文給出了兩種近似算法效果的比較:

可以看到敷燎,兩種近似算法在設(shè)置合適的分位數(shù)間隔的情況下都可以達(dá)到與確定性算法相當(dāng)?shù)男Ч蒹荩@證明了近似算法的有效性。此外硬贯,論文中還提到焕襟,local 算法更適合樹(shù)較深的場(chǎng)景

5饭豹、Weighted Quantile Sketch

上面我們提到的近似算法中很重要的步驟就是對(duì)各個(gè)特征找到合適的分位數(shù)作為候選劃分點(diǎn)鸵赖,從所舉的3分位數(shù)的例子中我們也可以看到,對(duì)于各個(gè)樣本我們是一視同仁的拄衰,也就是說(shuō)它褪,我們?cè)谟?jì)算分位數(shù)的時(shí)候把各個(gè)樣本的權(quán)重都視為1。論文中提出了一種更加合理的 Weighted Quantile Sketch翘悉,即帶權(quán)的分位方案茫打。

D_k = {(x_{1k}, h_1),(x_{2k}, h_2)· · ·(x_{nk}, h_n)}為各樣本的第k個(gè)特征的值以及其對(duì)應(yīng)的二階梯度構(gòu)成的點(diǎn)對(duì)集合。

在此基礎(chǔ)上妖混,我們可以定義一個(gè)排序函數(shù)r_k:R→[0,1]

r_{k}(z)=\frac{1}{\sum_{(x, h) \in \mathcal{D}_{k}} h} \sum_{(x, h) \in \mathcal{D}_{k}, x<z} h

上式表示的就是該特征的值小于z的樣本權(quán)重和占總樣本權(quán)重和的比例老赤。我們發(fā)現(xiàn),這里我們把二階梯度的值h作為樣本的權(quán)重制市,為什么這樣做接下來(lái)會(huì)提到抬旺。

于是我們就能用下面這個(gè)不等式來(lái)尋找分裂候選點(diǎn)\{s_{k1},s_{k2},s_{k3},?,s_{kl}\}

\left|r_{k}\left(s_{k, j}\right)-r_{k}\left(s_{k, j+1}\right)\right|<\epsilon, \quad s_{k 1}=\min _{i} \mathbf{x}_{i k}, s_{k l}=\max _{i} \mathbf{x}_{i k}

設(shè)定合適的?,并控制相鄰兩個(gè)候選分裂點(diǎn)相差不超過(guò)某個(gè)值?祥楣,則\frac{1}{?}的整數(shù)值就代表幾分位开财,比如?=\frac{1}{3}就是三分位,即有 2 個(gè)候選分裂點(diǎn)荣堰。

下面我們來(lái)看一下為什么用二階導(dǎo)h作為樣本的權(quán)重是合理的床未,回到之前我們定義的 loss function 并做一下變形:

\begin{aligned} O b j^{(t)} & \approx \sum_{i=1}^{n}\left[g_{i} f_{t}\left(x_{i}\right)+\frac{1}{2} h_{i} f_{t}^{2}\left(x_{i}\right)\right]+\Omega\left(f_{t}\right) \\ &=\sum_{i=1}^{N} \frac{1}{2} h_{i}\left(2 \frac{g_{i}}{h_{i}} f_{t}\left(\mathbf{x}_{i}\right)+f_{t}^{2}\left(\mathbf{x}_{i}\right)\right)+\Omega\left(f_{t}\right) \\ &=\sum_{i=1}^{N} \frac{1}{2} h_{i}\left(\frac{g_{i}^{2}}{h_{i}^{2}}+2 \frac{g_{i}}{h_{i}} f_{t}\left(\mathbf{x}_{i}\right)+f_{t}^{2}\left(\mathbf{x}_{i}\right)\right)+\Omega\left(f_{t}\right)-\frac{g_{i}^{2}}{2 h_{i}} \\ &=\sum_{i=1}^{N} \frac{1}{2} h_{i}\left(f_{t}\left(\mathbf{x}_{i}\right)-\left(-\frac{g_{i}}{h_{i}}\right)\right)^{2}+\Omega\left(f_{t}\right)-\frac{g_{i}^{2}}{2 h_{i}} \\ &=\sum_{i=1}^{N} \frac{1}{2} h_{i}\left(f_{t}\left(\mathbf{x}_{i}\right)-\left(-\frac{g_{i}}{h_{i}}\right)\right)^{2}+\Omega\left(f_{t}\right)-\text {constant } \end{aligned}

注意,這里我們說(shuō)\frac{g_i^2}{2h_i^2}是常數(shù)是因?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=g_i" alt="g_i" mathimg="1">和h_i都是由上一輪迭代的結(jié)果得到的振坚,與當(dāng)前的f_t無(wú)關(guān)薇搁。此外,這里原論文中把-\frac{g_i}{h_i}寫(xiě)成了\frac{ g_i}{h_i}渡八,少了一個(gè)負(fù)號(hào)啃洋,這里應(yīng)該是一個(gè)小小的錯(cuò)誤,stackexchange上的相關(guān)回答也指出了這一點(diǎn)屎鳍。

總之宏娄,變形后的 loss function 可以視作標(biāo)簽為-\frac{g_i}{h_i},權(quán)重為h_i的平方損失逮壁。

那么為什么我們?cè)谶x取候選分裂點(diǎn)時(shí)要考慮平方損失的系數(shù)呢孵坚?一種直觀的理解是,越是權(quán)重大的樣本我們?cè)揭?jǐn)慎對(duì)待,因?yàn)橥瑯拥念A(yù)測(cè)偏差卖宠,權(quán)重大的樣本會(huì)帶來(lái)更大的損失巍杈,因此對(duì)權(quán)重大的樣本我們應(yīng)該細(xì)粒度劃分,即盡可能考慮每個(gè)大權(quán)重樣本應(yīng)該劃入左孩子還是右孩子結(jié)點(diǎn)扛伍,而對(duì)小權(quán)重的樣本則不必這么謹(jǐn)慎筷畦,可以采取粗粒度劃分

一個(gè)實(shí)際的例子如下(圖自知乎wepon):

不難看出刺洒,隨著樣本權(quán)重的增加鳖宾,我們劃分的粒度越來(lái)越細(xì)。

6逆航、 Sparsity-aware Split Finding

在實(shí)際問(wèn)題中鼎文,數(shù)據(jù)稀疏性是十分常見(jiàn)的,可能的原因有:1)數(shù)據(jù)缺失纸泡;2)數(shù)據(jù)零值過(guò)多漂问;3)特征工程的結(jié)果,比如One-hot編碼女揭。

在訓(xùn)練集出現(xiàn)大量數(shù)據(jù)稀疏的情況下,XGBoost 在建樹(shù)時(shí)可能由于當(dāng)前樣例數(shù)據(jù)值缺失無(wú)法判斷被分配到哪個(gè)分支栏饮,最直接的想法就是給定一個(gè)默認(rèn)方向吧兔,當(dāng)數(shù)據(jù)值缺失時(shí)直接將樣例分配給默認(rèn)方向的分支。至于默認(rèn)方向是左還是右則需從數(shù)據(jù)集中學(xué)習(xí)得到袍嬉。

論文中給出的算法如下:

上述算法的主要特點(diǎn)在于只需訪問(wèn)數(shù)據(jù)值無(wú)缺失的樣例境蔼,算法的計(jì)算復(fù)雜度與無(wú)缺失數(shù)據(jù)集的大小呈線性關(guān)系,在數(shù)據(jù)稀疏的情況下能大大減少計(jì)算量伺通。

可以看到箍土,我們對(duì)每個(gè)特征k都做兩次遍歷,分別按照無(wú)缺失數(shù)據(jù)集的升序和降序來(lái)遍歷無(wú)缺失的值罐监,從中尋找最優(yōu)的分裂點(diǎn)吴藻。因?yàn)樗惴ㄔ谟?jì)算GH時(shí)既包含了缺失值的樣例,又包括了無(wú)缺失值的樣例弓柱,而遍歷的時(shí)候只包含了無(wú)缺失值的樣例沟堡,所以兩次遍歷的結(jié)果是不一樣的。

我們把當(dāng)前結(jié)點(diǎn)的數(shù)據(jù)集I劃分成在特征k上無(wú)缺失值的I_k和有缺失值的I_{k_{NA}}矢空,則上述算法考慮兩種情形航罗,第一種是將I_k按升序排列,并遍歷候選分裂點(diǎn)屁药,得到I_L(I_{k_{NA}},I_R)兩個(gè)分支粥血,然后計(jì)算這樣分裂結(jié)點(diǎn)的得分,找到其中的最大得分作為默認(rèn)方向?yàn)橛业牡梅郑坏诙N是將I_k按降序排列复亏,并遍歷候選分裂點(diǎn)绢彤,得到(I_{k_{NA}},I_L)I_R兩個(gè)分支,然后計(jì)算這樣分裂結(jié)點(diǎn)的得分蜓耻,找到其中的最大得分作為默認(rèn)方向?yàn)樽蟮牡梅置2啊W詈蟊容^這兩個(gè)得分,選擇得分大的方向作為默認(rèn)方向刹淌。

舉例來(lái)說(shuō)饶氏,當(dāng)前節(jié)點(diǎn)有\{0,1,2\}三個(gè)樣例,其中\{2\}是缺失值樣例有勾,\{0,1\}是無(wú)缺失值的樣例疹启。則默認(rèn)方向?yàn)橛倚枰紤]的兩種情形如下:

默認(rèn)方向?yàn)樽笮枰紤]的兩種情形如下:

看起來(lái)是個(gè)很簡(jiǎn)單的做法對(duì)不對(duì),但算法的性能非常不錯(cuò)蔼卡,論文中給出了具體的量化:比基礎(chǔ)算法快50倍喊崖。是非常大的提升了。

7雇逞、Summary

以上就是根據(jù)原論文前 3 章及文中提到的資料整理的對(duì) XGBoost 的粗淺理解荤懂,第 4 章及之后章節(jié)的關(guān)于系統(tǒng)設(shè)計(jì)的部分不是我關(guān)注的重點(diǎn),所以跳過(guò)了塘砸,希望理解到這個(gè)程度可以應(yīng)付大部分面試节仿,日后若發(fā)現(xiàn)有需要進(jìn)一步理解的地方再來(lái)補(bǔ)充。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掉蔬,一起剝皮案震驚了整個(gè)濱河市廊宪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌女轿,老刑警劉巖箭启,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蛉迹,居然都是意外死亡傅寡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)婿禽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赏僧,“玉大人,你說(shuō)我怎么就攤上這事扭倾〉砹悖” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵膛壹,是天一觀的道長(zhǎng)驾中。 經(jīng)常有香客問(wèn)我唉堪,道長(zhǎng),這世上最難降的妖魔是什么肩民? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任唠亚,我火速辦了婚禮,結(jié)果婚禮上持痰,老公的妹妹穿的比我還像新娘灶搜。我一直安慰自己,他們只是感情好工窍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布割卖。 她就那樣靜靜地躺著,像睡著了一般患雏。 火紅的嫁衣襯著肌膚如雪鹏溯。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天淹仑,我揣著相機(jī)與錄音丙挽,去河邊找鬼。 笑死匀借,一個(gè)胖子當(dāng)著我的面吹牛颜阐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播怀吻,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瞬浓,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蓬坡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤磅叛,失蹤者是張志新(化名)和其女友劉穎屑咳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體弊琴,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兆龙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敲董。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片紫皇。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖腋寨,靈堂內(nèi)的尸體忽然破棺而出聪铺,到底是詐尸還是另有隱情,我是刑警寧澤萄窜,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布铃剔,位于F島的核電站撒桨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏键兜。R本人自食惡果不足惜凤类,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望普气。 院中可真熱鬧谜疤,春花似錦、人聲如沸现诀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赶盔。三九已至企锌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間于未,已是汗流浹背撕攒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烘浦,地道東北人抖坪。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像闷叉,于是被迫代替她去往敵國(guó)和親擦俐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容