【轉(zhuǎn)載】神經(jīng)網(wǎng)絡(luò)梯度消失和梯度爆炸及解決辦法

https://blog.csdn.net/program_developer/article/details/80032376


一、神經(jīng)網(wǎng)絡(luò)梯度消失與梯度爆炸

(1)簡介梯度消失與梯度爆炸

層數(shù)比較多的神經(jīng)網(wǎng)絡(luò)模型在訓(xùn)練的時候會出現(xiàn)梯度消失(gradient vanishing problem)和梯度爆炸(gradient exploding problem)問題。梯度消失問題和梯度爆炸問題一般會隨著網(wǎng)絡(luò)層數(shù)的增加變得越來越明顯。

例如,對于圖1所示的含有3個隱藏層的神經(jīng)網(wǎng)絡(luò),梯度消失問題發(fā)生時,靠近輸出層的hidden layer 3的權(quán)值更新相對正常,但是靠近輸入層的hidden layer1的權(quán)值更新會變得很慢,導(dǎo)致靠近輸入層的隱藏層權(quán)值幾乎不變,扔接近于初始化的權(quán)值。這就導(dǎo)致hidden layer 1 相當(dāng)于只是一個映射層,對所有的輸入做了一個函數(shù)映射,這時此深度神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)就等價于只有后幾層的隱藏層網(wǎng)絡(luò)在學(xué)習(xí)。梯度爆炸的情況是:當(dāng)初始的權(quán)值過大,靠近輸入層的hidden layer 1的權(quán)值變化比靠近輸出層的hidden layer 3的權(quán)值變化更快,就會引起梯度爆炸的問題。

(2)梯度不穩(wěn)定問題

在深度神經(jīng)網(wǎng)絡(luò)中的梯度是不穩(wěn)定的,在靠近輸入層的隱藏層中或會消失,或會爆炸。這種不穩(wěn)定性才是深度神經(jīng)網(wǎng)絡(luò)中基于梯度學(xué)習(xí)的根本問題。

梯度不穩(wěn)定的原因:前面層上的梯度是來自后面層上梯度的乘積。當(dāng)存在過多的層時,就會出現(xiàn)梯度不穩(wěn)定場景,比如梯度消失和梯度爆炸。

(3)產(chǎn)生梯度消失的根本原因

我們以圖2的反向傳播為例,假設(shè)每一層只有一個神經(jīng)元且對于每一層都可以用公式1表示,其中σ為sigmoid函數(shù),C表示的是代價函數(shù),前一層的輸出和后一層的輸入關(guān)系如公式1所示。我們可以推導(dǎo)出公式2。

而sigmoid函數(shù)的導(dǎo)數(shù)如圖3所示。

可見,的最大值為,而我們一般會使用標(biāo)準(zhǔn)方法來初始化網(wǎng)絡(luò)權(quán)重,即使用一個均值為0標(biāo)準(zhǔn)差為1的高斯分布。因此,初始化的網(wǎng)絡(luò)權(quán)值通常都小于1,從而有。對于2式的鏈?zhǔn)角髮?dǎo),層數(shù)越多,求導(dǎo)結(jié)果越小,最終導(dǎo)致梯度消失的情況出現(xiàn)。

圖4:梯度變化的鏈?zhǔn)角髮?dǎo)分析

對于圖4,和有共同的求導(dǎo)項。可以看出,前面的網(wǎng)絡(luò)層比后面的網(wǎng)絡(luò)層梯度變化更小,故權(quán)值變化緩慢,從而引起了梯度消失問題。

(4)產(chǎn)生梯度爆炸的根本原因

當(dāng),也就是w比較大的情況。則前面的網(wǎng)絡(luò)層比后面的網(wǎng)絡(luò)層梯度變化更快,引起了梯度爆炸的問題。

(5)當(dāng)激活函數(shù)為sigmoid時,梯度消失和梯度爆炸哪個更容易發(fā)生?

結(jié)論:梯度爆炸問題在使用sigmoid激活函數(shù)時,出現(xiàn)的情況較少,不容易發(fā)生。

量化分析梯度爆炸時x的取值范圍:因?qū)?shù)最大為0.25,故>4,才可能出現(xiàn);按照可計算出x的數(shù)值變化范圍很窄,僅在公式3范圍內(nèi),才會出現(xiàn)梯度爆炸。畫圖如5所示,可見x的數(shù)值變化范圍很小;最大數(shù)值范圍也僅僅0.45,當(dāng)=6.9時出現(xiàn)。因此僅僅在此很窄的范圍內(nèi)會出現(xiàn)梯度爆炸的問題。

圖5:x的數(shù)值變化范圍

(6)如何解決梯度消失和梯度爆炸

梯度消失和梯度爆炸問題都是因為網(wǎng)絡(luò)太深,網(wǎng)絡(luò)權(quán)值更新不穩(wěn)定造成的,本質(zhì)上是因為梯度反向傳播中的連乘效應(yīng)。對于更普遍的梯度消失問題,可以考慮一下三種方案解決:

1.????用ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout等替代sigmoid函數(shù)。

2.????用Batch Normalization。

3.????LSTM的結(jié)構(gòu)設(shè)計也可以改善RNN中的梯度消失問題。

二、幾種激活函數(shù)的比較

由于使用sigmoid激活函數(shù)會造成神經(jīng)網(wǎng)絡(luò)的梯度消失和梯度爆炸問題,所以許多人提出了一些改進(jìn)的激活函數(shù),如:用ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout等替代sigmoid函數(shù)。下面我們具體來分析一下這幾個激活函數(shù)的區(qū)別。

(1)??Sigmoid

Sigmoid是常用的非線性的激活函數(shù),它的數(shù)學(xué)形式如公式4:

圖6:sigmoid函數(shù)圖像?

?圖7:sigmoid導(dǎo)函數(shù)圖像

Sigmoid函數(shù)在歷史上曾經(jīng)非常的常用,輸出值范圍為[0,1]之間的實數(shù)。然而現(xiàn)在它已經(jīng)不太受歡迎,實際中很少使用。原因是sigmoid存在3個問題:

1.sigmoid函數(shù)飽和使梯度消失(Sigmoidsaturate and kill gradients)。

我們從圖7可以看到sigmoid的導(dǎo)數(shù)都是小于0.25的,那么在進(jìn)行反向傳播的時候,梯度相乘結(jié)果會慢慢的趨近于0。這樣,幾乎就沒有梯度信號通過神經(jīng)元傳遞到前面層的梯度更新中,因此這時前面層的權(quán)值幾乎沒有更新,這就叫梯度消失。除此之外,為了防止飽和,必須對于權(quán)重矩陣的初始化特別留意。如果初始化權(quán)重過大,可能很多神經(jīng)元得到一個比較小的梯度,致使神經(jīng)元不能很好的更新權(quán)重提前飽和,神經(jīng)網(wǎng)絡(luò)就幾乎不學(xué)習(xí)。

2.sigmoid函數(shù)輸出不是“零為中心”(zero-centered)。

一個多層的sigmoid神經(jīng)網(wǎng)絡(luò),如果你的輸入x都是正數(shù),那么在反向傳播中w的梯度傳播到網(wǎng)絡(luò)的某一處時,權(quán)值的變化是要么全正要么全負(fù)。

圖8:sigmoid輸出不是關(guān)于原點對稱的影響

解釋下:當(dāng)梯度從上層傳播下來,w的梯度都是用x乘以f的梯度,因此如果神經(jīng)元輸出的梯度是正的,那么所有w的梯度就會是正的,反之亦然。在這個例子中,我們會得到兩種權(quán)值,權(quán)值范圍分別位于圖8中一三象限。當(dāng)輸入一個值時,w的梯度要么都是正的要么都是負(fù)的,當(dāng)我們想要輸入一三象限區(qū)域以外的點時,我們將會得到這種并不理想的曲折路線(zig zag path),圖中紅色曲折路線。假設(shè)最優(yōu)化的一個w矩陣是在圖8中的第四象限,那么要將w優(yōu)化到最優(yōu)狀態(tài),就必須走“之字形”路線,因為你的w要么只能往下走(負(fù)數(shù)),要么只能往右走(正的)。優(yōu)化的時候效率十分低下,模型擬合的過程就會十分緩慢。

如果訓(xùn)練的數(shù)據(jù)并不是“零為中心”,我們將多個或正或負(fù)的梯度結(jié)合起來就會使這種情況有所緩解,但是收斂速度會非常緩慢。該問題相對于神經(jīng)元飽和問題來說還是要好很多。具體可以這樣解決,我們可以按batch去訓(xùn)練數(shù)據(jù),那么每個batch可能得到不同的信號或正或負(fù),這個批量的梯度加起來后可以緩解這個問題。

3.指數(shù)函數(shù)的計算是比較消耗計算資源的。

3.指數(shù)函數(shù)的計算是比較消耗計算資源的。

(2)?tanh

圖9:tanh(x)的函數(shù)圖像

tanh函數(shù)跟sigmoid還是很像的,實際上,tanh是sigmoid的變形如公式5所示。tanh的具體公式如公式6所示。

tanh與sigmoid不同的是,tanh是“零為中心”的。因此,實際應(yīng)用中,tanh會比sigmoid更好一些。但是在飽和神經(jīng)元的情況下,還是沒有解決梯度消失問題。

優(yōu)點:

1.tanh解決了sigmoid的輸出非“零為中心”的問題。

缺點:

1.依然有sigmoid函數(shù)過飽和的問題。

2.依然指數(shù)運(yùn)算。

(3)??ReLU

近年來,ReLU函數(shù)變得越來越受歡迎。全稱是Rectified Linear Unit,中文名字:修正線性單元。ReLU是Krizhevsky、Hinton等人在2012年《ImageNet Classification with Deep Convolutional Neural Networks》論文中提出的一種線性且不飽和的激活函數(shù)。它的數(shù)學(xué)表達(dá)式如7所示:

圖10:ReLU函數(shù)圖像

優(yōu)點:

1.ReLU解決了梯度消失的問題,至少x在正區(qū)間內(nèi),神經(jīng)元不會飽和。

2.由于ReLU線性、非飽和的形式,在SGD中能夠快速收斂。

3.計算速度要快很多。ReLU函數(shù)只有線性關(guān)系,不需要指數(shù)計算,不管在前向傳播還是反向傳播,計算速度都比sigmoid和tanh快。

缺點:

1.ReLU的輸出不是“零為中心”(Notzero-centered output)。

2.隨著訓(xùn)練的進(jìn)行,可能會出現(xiàn)神經(jīng)元死亡,權(quán)重?zé)o法更新的情況。這種神經(jīng)元的死亡是不可逆轉(zhuǎn)的死亡。

解釋:訓(xùn)練神經(jīng)網(wǎng)絡(luò)的時候,一旦學(xué)習(xí)率沒有設(shè)置好,第一次更新權(quán)重的時候,輸入是負(fù)值,那么這個含有ReLU的神經(jīng)節(jié)點就會死亡,再也不會被激活。因為:ReLU的導(dǎo)數(shù)在x>0的時候是1,在x<=0的時候是0。如果x<=0,那么ReLU的輸出是0,那么反向傳播中梯度也是0,權(quán)重就不會被更新,導(dǎo)致神經(jīng)元不再學(xué)習(xí)。

也就是說,這個ReLU激活函數(shù)在訓(xùn)練中將不可逆轉(zhuǎn)的死亡,導(dǎo)致了訓(xùn)練數(shù)據(jù)多樣化的丟失。在實際訓(xùn)練中,如果學(xué)習(xí)率設(shè)置的太高,可能會發(fā)現(xiàn)網(wǎng)絡(luò)中40%的神經(jīng)元都會死掉,且在整個訓(xùn)練集中這些神經(jīng)元都不會被激活。所以,設(shè)置一個合適的較小的學(xué)習(xí)率,會降低這種情況的發(fā)生。為了解決神經(jīng)元節(jié)點死亡的情況,有人提出了Leaky ReLU、P-ReLu、R-ReLU、ELU等激活函數(shù)。

(4)??Leaky ReLU

ReLU是將所有的負(fù)值設(shè)置為0,造成神經(jīng)元節(jié)點死亡情況。相反,Leaky ReLU是給所有負(fù)值賦予一個非零的斜率。Leaky ReLU激活函數(shù)是在聲學(xué)模型(2013)中首次提出來的。它的數(shù)學(xué)表達(dá)式如公式8所示。

圖11:Leaky ReLU函數(shù)圖像

Leaky ReLU很好的解決了“dead ReLU”的問題。因為Leaky ReLU保留了x小于0時的梯度,在x小于0時,不會出現(xiàn)神經(jīng)元死亡的問題。對于Leaky ReLU給出了一個很小的負(fù)數(shù)梯度值α,這個值是很小的常數(shù)。比如:0.01。這樣即修正了數(shù)據(jù)分布,又保留了一些負(fù)軸的值,使得負(fù)軸信息不會全部丟失。但是這個α通常是通過先驗知識人工賦值的。

優(yōu)點:

1.神經(jīng)元不會出現(xiàn)死亡的情況。

2.對于所有的輸入,不管是大于等于0還是小于0,神經(jīng)元不會飽和。

2.由于Leaky ReLU線性、非飽和的形式,在SGD中能夠快速收斂。

3.計算速度要快很多。Leaky ReLU函數(shù)只有線性關(guān)系,不需要指數(shù)計算,不管在前向傳播還是反向傳播,計算速度都比sigmoid和tanh快。

缺點:

1.Leaky ReLU函數(shù)中的α,需要通過先驗知識人工賦值。

擴(kuò)展材料:

1.Andrew L. Maas, Awni Y. Hannum and?Andrew Y. Ng.?Rectified NonlinearitiesImprove Neural Network Acoustic Models?(PDF).?ICML.2013. 該論文提出了Leaky ReLU函數(shù)。

2.He K, Zhang X, Ren S, et al. Delving deepinto rectifiers: Surpassing human-level performance on imagenetclassification[C]//Proceedings of the IEEE international conference on computervision. 2015: 1026-1034. 該論文介紹了用Leaky ReLU函數(shù)的好處。

(5)??PReLU

PReLU的英文全稱為“Parametric ReLU”,我翻譯為“帶參數(shù)的線性修正單元”。我們觀察Leaky ReLU可知,在神經(jīng)網(wǎng)絡(luò)中通過損失函數(shù)對α求導(dǎo)數(shù),我們是可以求得的。那么,我們可不可以將它作為一個參數(shù)進(jìn)行訓(xùn)練呢?在Kaiming He的論文《Delving deepinto rectifiers: Surpassing human-level performance on imagenet classification》中指出,α不僅可以訓(xùn)練,而且效果更好。

圖12:PReLU函數(shù)圖像

公式9非常簡單,,表示還未經(jīng)過激活函數(shù)的神經(jīng)元輸出。論文中指出,使用了Parametric ReLU后,最終效果比不用提高了1.03%。

擴(kuò)展材料:

He K, Zhang X, Ren S, et al. Delving deepinto rectifiers: Surpassing human-level performance on imagenetclassification[C]//Proceedings of the IEEE international conference on computervision. 2015: 1026-1034. 該論文作者對比了PReLU和ReLU在ImageNet model A的訓(xùn)練效果。

(6)??RReLU

RReLU的英文全稱是“Randomized Leaky ReLU”,中文名字叫“隨機(jī)修正線性單元”。RReLU是Leaky ReLU的隨機(jī)版本。它首次是在Kaggle的NDSB比賽中被提出來的。

圖13:Randomized Leaky ReLU函數(shù)圖像

RReLU的核心思想是,在訓(xùn)練過程中,α是從一個高斯分布中隨機(jī)出來的值,然后再在測試過程中進(jìn)行修正。數(shù)學(xué)表達(dá)式如10式所示。

在測試階段,把訓(xùn)練過程中所有的取個平均值。NDSB冠軍的α是從中隨機(jī)出來的。那么在測試階段,激活函數(shù)就是公式11。

特點:

1.RReLU是Leaky ReLU的random版本,在訓(xùn)練過程中,α是從一個高斯分布中隨機(jī)出來的,然后再測試過程中進(jìn)行修正。

2.數(shù)學(xué)形式與PReLU類似,但RReLU是一種非確定性激活函數(shù),其參數(shù)是隨機(jī)的。

(7)ReLU、Leaky ReLU、PReLU和RReLU的比較

圖14:ReLU、Leaky ReLU、PReLU、RReLU函數(shù)圖像

PReLU中的α是根據(jù)數(shù)據(jù)變化的;

Leaky ReLU中的α是固定的;

RReLU中的α是一個在給定范圍內(nèi)隨機(jī)抽取的值,這個值在測試環(huán)節(jié)就會固定下來。

擴(kuò)展材料:

Xu B, Wang N, Chen T, et al. Empiricalevaluation of rectified activations in convolutional network[J]. arXiv preprintarXiv:1505.00853, 2015. 在這篇論文中作者對比了ReLU、LReLU、PReLU、RReLU在CIFAR-10、CIFAR-100、NDSB數(shù)據(jù)集中的效果。

(8)ELU

ELU的英文全稱是“Exponential Linear Units”,中文全稱是“指數(shù)線性單元”。它試圖將激活函數(shù)的輸出平均值接近零,從而加快學(xué)習(xí)速度。同時,它還能通過正值的標(biāo)識來避免梯度消失的問題。根據(jù)一些研究顯示,ELU分類精確度是高于ReLU的。公式如12式所示。

圖15:ELU與其他幾種激活函數(shù)的比較圖

優(yōu)點:

ELU包含了ReLU的所有優(yōu)點。

神經(jīng)元不會出現(xiàn)死亡的情況。

ELU激活函數(shù)的輸出均值是接近于零的。

缺點:

計算的時候是需要計算指數(shù)的,計算效率低的問題。

擴(kuò)展材料:

Clevert D A, Unterthiner T, Hochreiter S. Fastand accurate deep network learning by exponential linear units (elus)[J]. arXivpreprint arXiv:1511.07289, 2015. 這篇論文提出了ELU函數(shù)。

(9)Maxout

Maxout “Neuron” 是由Goodfellow等人在2013年提出的一種很有特點的神經(jīng)元,它的激活函數(shù)、計算的變量、計算方式和普通的神經(jīng)元完全不同,并有兩組權(quán)重。先得到兩個超平面,再進(jìn)行最大值計算。激活函數(shù)是對ReLU和Leaky ReLU的一般化歸納,沒有ReLU函數(shù)的缺點,不會出現(xiàn)激活函數(shù)飽和神經(jīng)元死亡的情況。Maxout出現(xiàn)在ICML2013上,作者Goodfellow將maxout和dropout結(jié)合,稱在MNIST,CIFAR-10,CIFAR-100,SVHN這4個數(shù)據(jù)集上都取得了start-of-art的識別率。Maxout公式如13所示。

其中,假設(shè)w是2維的,那么我們可以得出公式14。

分析公式14可以注意到,ReLU和Leaky ReLU都是它的一個變形。比如的時候,就是ReLU。Maxout的擬合能力非常強(qiáng),它可以擬合任意的凸函數(shù)。Goodfellow在論文中從數(shù)學(xué)的角度上也證明了這個結(jié)論,只需要2個Maxout節(jié)點就可以擬合任意的凸函數(shù),前提是“隱含層”節(jié)點的個數(shù)足夠多。

優(yōu)點:

Maxout具有ReLU的所有優(yōu)點,線性、不飽和性。

同時沒有ReLU的一些缺點。如:神經(jīng)元的死亡。

缺點:

從這個激活函數(shù)的公式14中可以看出,每個neuron將有兩組w,那么參數(shù)就增加了一倍。這就導(dǎo)致了整體參數(shù)的數(shù)量激增。

擴(kuò)展材料:

Goodfellow I J, Warde-Farley D, Mirza M, et al.Maxout networks[J]. arXiv preprint arXiv:1302.4389, 2013. Goodfellow的這篇論文提出了Maxout,感興趣可以了解一下。

總結(jié):怎么選擇激活函數(shù)?

關(guān)于激活函數(shù)的選取,目前還不存在定論,在實踐過程中更多還是需要結(jié)合實際情況,考慮不同激活函數(shù)的優(yōu)缺點綜合使用。我在這里給大家一點在訓(xùn)練模型時候的建議。

1.通常來說,不會把各種激活函數(shù)串起來在一個網(wǎng)絡(luò)中使用。

2.如果使用ReLU,那么一定要小心設(shè)置學(xué)習(xí)率(learning rate),并且要注意不要讓網(wǎng)絡(luò)中出現(xiàn)很多死亡神經(jīng)元。如果死亡神經(jīng)元過多的問題不好解決,可以試試Leaky ReLU、PReLU、或者M(jìn)axout。

3.盡量不要使用sigmoid激活函數(shù),可以試試tanh,不過個人感覺tanh的效果會比不上ReLU和Maxout。

---------------------

作者:Microstrong0305

來源:CSDN

原文:https://blog.csdn.net/program_developer/article/details/80032376

版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,923評論 6 535
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,740評論 3 420
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,856評論 0 380
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,175評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,931評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,321評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,383評論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,533評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,082評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,891評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,067評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,618評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,319評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,732評論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,987評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,794評論 3 394
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,076評論 2 375

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