深度神經網絡是否顯著過擬合?

-翻譯自Are Deep Neural Networks Dramatically Overfitted?

如果你像我一樣,帶著傳統機器學習的經驗進入深度學習領域,你可能經常思考這個問題:由于典型的深度神經網絡有如此多的參數并且訓練誤差很容易被完善,它肯定會遭受嚴重的過度擬合。那么深度學習模型如何在訓練樣本之外的數據上進行泛化?

在努力理解為什么深度神經網絡能夠以某種方式泛化的過程中,我想起了這篇關于系統生物學的有趣論文 - “生物學家可以修理收音機嗎?”(Lazebnik,2002)。 如果一位生物學家想要像她在生物系統上工作一樣修理一臺無線電機器,那么生活可能會很艱難。 由于無法揭示無線電系統的完整工作機制,因此尋找小的局部功能可能會給出一些提示,但卻很難呈現出系統內的所有交互,更不用說整個工作流程了。無論你認為它與DL有關,它都是一個非常有趣的閱讀。

我想討論一些關于深度學習模型的泛化性和復雜性度量的論文。 希望它可以闡明您的思路,以了解為什么DNN可以泛化。

1 壓縮與模型選擇的經典定理

1.1 奧卡姆剃刀(Occam’s Razor)

奧卡姆剃刀是一個非正式的解決問題的原則,由William of Ockham在14世紀提出:

“Simpler solutions are more likely to be correct than complex ones.”
PS:我們一般將這個原理稱為“如無必要,勿增實體”,即“簡單有效原理”。

當我們面對多個潛在的候選理論來解釋世界并且必須選擇一個時,這個原理是非常強大的。 對于一個問題來說,太多不必要的假設似乎是合理的,但更難以推廣到其他復雜的問題上或最終通往宇宙的基本原則。

想到這一點,人們花了數百年的時間才發現白天的天空是藍色的,但日落時的紅色是因為同樣的原因(瑞利散射),盡管兩種現象看起來非常不同。 人們必須分別為他們提出許多其他解釋,但統一和簡單的版本最終獲勝。

1.2 最小描述長度原則(Minimum Description Length principle)

奧卡姆剃刀的原理可以類似地應用于機器學習模型。這種概念的形式化版本稱為最小描述長度(MDL)原則,用于比較給定數據的競爭模式/解釋。

“Comprehension is compression.”
PS:其想法是,在給予假說的集合的情況下,能產生最多資料壓縮效果的那個假說是最好的。

MDL的基本思想是將學習視為數據壓縮。通過壓縮數據,我們需要發現具有高潛力的數據中的規律性或模式,以推廣到看不見的樣本。信息瓶頸理論認為,深度神經網絡訓練時首先通過最小化泛化誤差來表示數據,然后通過修剪噪聲來學習壓縮這種表示。

同時,MDL將模型描述視為壓縮傳遞的一部分,因此模型不能任意大。

MDL原則的兩部分版本表明:設H^{(1)}H^{(2)},...是可以解釋數據集D的模型列表。其中最好的假設應該是最小化總和的假設:

H^{best}=\arg\min \limits_{H}[L(H)+L(D|H)]

  • L(H) 是以比特表示的模型H的長度。
  • L(D|H) 是用H編碼時數據D的描述長度

簡單來說,最好的模型是包含編碼數據和模型本身的最小模型。按照這個標準,我在本節開頭提出的記憶方法聽起來很糟糕,無論它在訓練數據上的準確度如何。

人們可能認為奧卡姆的剃刀是錯誤的,由于現實世界可能是任意復雜的,為什么我們必須找到簡單的模型?關于MDL的一個有趣的觀點是將模型視為“語言”而不是基本的生成定理。我們希望找到良好的壓縮策略來描述一小組樣本中的規律性,并且它們不一定是用于解釋該現象的“真實”生成模型。模型可能是錯誤的但卻仍然有用(即,考慮任何貝葉斯先驗)。

1.3 柯氏復雜性(Kolmogorov Complexity)

柯氏復雜性依賴于通過現代計算機的概念來定義對象的算法(描述性)復雜性:它是描述對象的最短二進制計算機程序的長度。在MDL之后,計算機本質上是最通用的數據解壓縮器形式。

柯氏復雜性的正式定義指出:給定通用計算機U和程序p,讓我們將U(p)表示為計算機處理程序后的輸出,將L(p)表示為程序的描述長度。 然后,通用計算機U對字符串s的柯氏復雜性K_U是:

K_U(s)=\min \limits_{p:U(p)=s}L(p)

請注意,通用計算機可以模仿任何其他計算機的操作。所有現代計算機都是通用的,因為它們都可以簡化為圖靈機。無論我們使用哪臺計算機,這個定義都是通用的,因為另一臺通用計算機總是可以通過編程來克隆U的行為,而編碼這個克隆程序只是一個常量。

柯氏復雜性與香農信息論之間存在很多聯系,因為兩者都與通用編碼有關。令人驚訝的是,隨機變量的預期柯氏復雜度近似等于其香農熵(參見報告的第2.3節)。關于這個主題的更多內容超出了這里的范圍,但在線有許多有趣的讀物。 幫助自己:)

1.4 Solomonoff的歸納推理理論(Solomonoff’s Inference Theory)

奧卡姆剃刀的另一個數學形式化是Solomonoff的通用歸納推理理論(Solomonoff,1964)。 其原則是基于其柯氏復雜性,支持與“最短程序”相對應的模型來生成訓練數據。

2 DL模型的表現力

與傳統的統計模型相比,深度神經網絡具有極其多的參數。如果我們使用MDL來測量深度神經網絡的復雜性并將參數數量視為模型描述長度,那么它看起來會很糟糕。模型描述L(H)很容易失控。

然而,具有大量的參數是神經網絡獲得高表現力的必要條件。由于深度神經網絡具有捕獲任何靈活數據表示的強大能力,因此在許多應用中取得了巨大成功。

2.1 通用逼近定理(Universal Approximation Theorem)

通用近似定理指出前饋網絡具有:1)線性輸出層,2)至少一個包含有限數量神經元的隱藏層和3)一些激活函數可以將R^n的緊致子集上的任何連續函數逼近任意準確性。該定理首先被證明是用于sigmoid激活函數(Cybenko,1989)。后來證明了通用逼近性質并不特定于激活的選擇(Hornik,1991),而是多層前饋結構。

雖然具有單層結構的前饋網絡足以表示任何函數,但是網絡的寬度必須是指數級大的。通用逼近定理不能保證模型是否可以被正確地學習或泛化。通常,添加更多層有助于減少淺層網絡中所需的隱藏神經元的數量。

為了利用通用逼近定理,我們總能找到一個神經網絡來表示在任何所需閾值下具有誤差的目標函數,但這需要付出一些代價 - 網絡可能會變得非常大。

2.2 證明:雙層神經網絡的有限樣本表達性(Proof: Finite Sample Expressivity of Two-layer NN)

我們到目前為止討論的通用逼近定理沒有考慮有限樣本集。Zhang, et al. (2017)提供了關于雙層神經網絡的有限樣本表達性的簡潔證明。

在以下條件下,神經網絡C可以表示為給定樣本大小為n維度為d的任何函數:對于每個有限樣本集S?R^d,其中| S | = n,并且在此樣本集上定義的每個函數:f: SR,我們可以找到C的一組權重配置,使C(x)= f(x), ?x∈S

論文提出了一個定理:

There exists a two-layer neural network with ReLU activations and 2n+d weights that can represent any function on a sample of size n in d dimensions.
PS: 存在具有ReLU激活和2n+d個權重的雙層神經網絡,其可以表示尺寸為n的d維樣本上的任何函數。

證明: 首先,我們構建一個雙層神經網絡C: R^dR。其輸入是d維的向量x∈R^d。 網絡的隱藏層具有h個隱藏單元,其權重矩陣為W∈R^d×h,偏置值為-b∈R^h,并且使用ReLU激活函數。第二層輸出具有權重向量v∈R^h和零偏差的標量值。

網絡C對輸入向量x的輸出可以表示如下:

C(x)=v\max(xW?b,0)^?=∑_{i=1}^h v_i\max(xW_{(:,i)}?b_i,0)

其中W(:, i)d×h矩陣中的第i列。

給定樣本集S = (x_1,...,x_n)和目標值y = (y_1,...,y_n),我們希望找到適當的權重W∈R^d×hb,v∈R^h,使得C(x_i)=y_i,?i= 1,...,N

讓我們將所有采樣點合并為一個輸入矩陣X∈R^n×d。 如果設置h = n,則XW-b將是大小為n×n的方陣。

我們可以簡化W以在所有列中具有相同的列向量:

W_{(:,j)}=w∈R^d,?j=1,…,n

nn-expressivity-proof

a_i = x_iw,我們希望找到合適的wb,使得b_1 <a_1 <b_2 <a_2 <... <b_n <a_n。 這總是可以實現的,因為我們嘗試用n個約束來解決n + d個未知變量,并且x_i是獨立的(即隨機選擇w,排序x_iw然后將b_j設置為其間的值)。然后M_{ReLU}成為下三角矩陣:

M_relu

它是一個非奇異方陣,因為det(M_{ReLU})≠0,所以我們總能找到合適的v來求解vM_{ReLU}=y(換句話說,M_{ReLU}的列空間全部是R^n,我們可以找到列向量的線性組合來獲得任何y)。

2.3 深度神經網絡可以學習隨機噪聲 (Deep NN can Learn Random Noise)

正如我們所知,雙層神經網絡是通用逼近器,因此看到它們能夠完美地學習非結構化的隨機噪聲就不是多么令人驚訝的事情了,如Zhang, et al. (2017)所示。如果圖像分類數據集的標簽被隨機打亂,則深度神經網絡的高表現力仍然可以使他們能夠實現接近零的訓練損失。這些結果不會隨著正則化條件的添加而改變。

fit-random-labels:在隨機標簽或隨機像素的CIFAR 10上進行模型的訓練:(a)學習曲線; (b-c)標簽損壞率是隨機洗牌的百分比

3 深度學習模型是否顯著過擬合?

深度學習模型有著嚴重的過度參數化,這使得模型通常可以在訓練數據上獲得完美的結果。在傳統觀點中,如偏差-方差權衡,這種現象可能是一場災難:沒有任何東西可以泛化到看不見的測試數據。然而,通常情況下,這種“過度擬合”(訓練誤差= 0)的深度學習模型仍然在訓練樣本之外測試數據上表現出不錯的性能。有趣,這是為什么呢?

3.1 深度學習的現代風險曲線 (Modern Risk Curve for Deep Learning)

傳統的機器學習使用U形風險曲線來衡量偏差-方差的權衡并量化模型的泛化程度。 如果我被問到如何判斷模型是否過度擬合,這將是我腦海中浮現的第一件事。

隨著模型變大(添加更多參數),訓練誤差減小到接近零,但是一旦模型復雜度增加以超過“欠擬合”和“過度擬合”之間的閾值,測試誤差(泛化誤差)開始增加。 在某種程度上,這與奧卡姆剃刀完全一致。

U-shaped bias-variance risk curve

不幸的是,這種方法不適用于深度學習模型。Belkin et al. (2018)調和了傳統的偏差-方差權衡,并為深度神經網絡提出了一種新的雙U形風險曲線。 一旦網絡參數的數量足夠高,風險曲線就會進入另一種狀態。

A new double-U-shaped bias-variance risk curve for deep neural networks.

論文聲稱可能有兩個原因:

  • 參數的數量不是歸納偏置的良好量度,其被定義為用于預測未知樣本的學習算法的假設集。 請參閱后面部分中有關DL模型復雜性的更多討論。
  • 配備更大的模型,我們可能能夠發現更大的函數類,并進一步找到具有更小范數的插值函數,因此“更簡單”。

如文中所示,雙U形風險曲線是通過經驗性地觀察到的。然而,我正在努力重現結果。有一些成功的跡象,但為了產生類似于定理的非常平滑的曲線,實驗中的許多細節必須得到考慮。

Training and evaluation errors of a one hidden layer fc network of different numbers of hidden units, trained on 4000 data points sampled from MNIST.

3.2 正則化不是泛化的關鍵 (Regularization is not the Key to Generalization)

正則化是控制過度擬合和提高模型泛化性能的常用方法。有趣的是,一些研究(Zhang,et al.2017)已經表明,顯式正則化(即數據增加,權重衰減和dropout)對于減少泛化誤差既不必要也不充足。

以CIFAR 10訓練的Inception模型為例(見下圖),正則化技術有助于樣本外的泛化性能,但并不多。沒有單一的正規化方法似乎是獨立于其他方法的關鍵。因此,正則化不太可能是泛化的根本原因。

在CIFAR 10上訓練的Inception模型的準確性,使用不同的數據增強和重量衰減組合。

3.3 內在維度 (Intrinsic Dimension)

參數的數量與深度學習領域中的模型過度擬合無關,這表明參數計數不能作為深度神經網絡的真實復雜性的表示。

除參數計數外,研究人員還提出了許多方法來量化這些模型的復雜性,例如模型的自由度數(Gao&Jojic,2016)或前序碼(Blier&Ollivier,2018)

我想討論一個關于這個問題的最新方法,稱為內在維度(Li et al,2018)。內在維度直觀,易于測量,同時仍然揭示了不同大小的模型的許多有趣屬性。

具有大量參數的神經網絡會形成高維的參數空間,學習過程就發生在這個高維的objective landscape上。其中參數空間的流形的形狀是至關重要的。例如,通過提供更多預測梯度并允許更大的學習率形成的更平滑的流形更有利于優化,這被認為是批量標準化成功穩定訓練的原因(Santurkar, et al,2019)

即使參數空間很大,幸運的是我們不必太擔心優化過程會陷入局部最優,因為objective landscape中的局部最優點幾乎總是位于鞍點而不是山谷這個結論已經被證明了。換句話說,總有一個維度子集包含離開局部最優并繼續探索的路徑。

參數優化中各種關鍵點的插圖。

內在維度測量背后的一個直覺是,由于參數空間具有如此高的維度,因此可能沒有必要利用所有維度來有效地學習。如果我們只是通過一片objective landscape并且仍然可以學習一個好的解決方案,那么所得到的模型的復雜性可能低于參數計數所顯示的復雜性。這基本上是內在維度試圖評估的內容。

假設模型具有D維度并且其參數表示為θ(D)。為了學習,隨機采樣較小的d維子空間θ(d),其中d <D。在一次優化更新過程中,不是對整個D維度采用梯度步進,而是僅使用較小的子空間θ(d)并通過重新映射以更新模型參數。

當D = 3時,用于直接優化的參數矢量的圖示。

梯度更新公式如下所示:

θ^{(D)}=θ^{(D)}_0+Pθ^{(d)}

其中θ^{(D)}_0是初始化值,P是在訓練之前隨機采樣的D×d投影矩陣。θ^{(D)}_0P在訓練期間都是不可訓練的和固定的。θ(d)被初始化為全零。

通過搜索d = 1,2,...,D的值,當解出現時相應的d被定義為內在維度。

事實證明,許多問題的內在維度要比參數數量小得多。例如,在CIFAR 10圖像分類任務中,具有650k+參數的全連接的網絡僅具有9k的內在維度,而包含62k參數的卷積網絡甚至具有更低的內部維度,只有2.9k。

所測量的各種型號的模型達到最佳性能的90%時的內在維度d。

內在維度的測量表明,深度學習模型的復雜度比它們看起來要簡單得多。

3.4 異構層魯棒性 (Heterogeneous Layer Robustness)

Zhang et al. (2019)研究了參數在不同層中的作用。 該論文提出的基本問題是:“所有的網絡層都是平等的嗎?”簡短的回答是:不會。模型對某些網絡層的變化更敏感,但對其他網絡層的變化不敏感。

本文提出了兩種類型的操作,可以應用于第l層的參數θ^{(l)}_t以測試它們對模型魯棒性的影響(l = 1,...,Lt表示時間):

  • 重新初始化:將參數重置為初始值θ^{(?)}_t←θ^{(?)}_0。將層l重新初始化的網絡的性能稱為層l的重新初始化魯棒性。
  • 重新隨機化:隨機重新采樣層的參數,θ^{(l)}_t←θ^{~(l)}?P^{(l)}。相應的網絡性能稱為層l的重新隨機化魯棒性。

借助這兩個操作,可以將圖層分為兩類:

  • 魯棒層:重新初始化或重新隨機化層后,網絡沒有或只有微不足道的性能下降。
  • 關鍵層:與魯棒層相反。

在全連接和卷積網絡上觀察到類似的模式。任意層的重新隨機化完全破壞了模型性能,因為預測會立即下降到隨機猜測。更有趣和令人驚訝的是,當應用重新初始化時,只有第一層或前幾層(最接近輸入層的層)是關鍵的,而重新初始化更高層則導致性能的降低可忽略不計。

在MNIST上訓練的fc網絡。 每行對應于網絡中的一個層。 第一列是每層的重新隨機化魯棒性,其余列表示在不同訓練時間的重新初始化魯棒性。 (b)在CIFAR 10上訓練的VGG11模型(轉換網)。與(a)中類似的表示但行和列被轉置。

ResNet能夠在非相鄰層之間使用捷徑的方式在網絡中重新分配敏感層,而不僅僅是在底層。在殘差塊結構的幫助下,網絡可以對重新隨機化具有均勻的魯棒性。只有每個殘差塊的第一層仍然對重新初始化和重新隨機化都敏感。如果我們將每個殘差塊視為本地子網,則魯棒性模式類似于上面的fc和conv網絡。

在CIFAR 10上訓練的ResNet-50模型中的層的重新隨機化(第一行)和重新初始化(重置行)的魯棒性。

基于深度神經網絡中的許多頂層對重新初始化后的模型性能并不重要的事實,本文松散地得出結論:

Over-capacitated deep networks trained with stochastic gradient have low-complexity due to self-restricting the number of critical layers.
PS:由于自我限制關鍵層的數量,用隨機梯度訓練的過度容量的深度網絡具有低復雜性。

我們可以將重新初始化視為減少參數有效數量的一種方法,因此對論文實驗的觀察與內在維度所證明的一致。

4 實驗

在看到上面所有有趣的發現之后,重現它們應該是非常有趣的。有些結果很容易重現, 細節描述如下,我的代碼可以在lilianweng/generalization-experiment上找到。

深度學習的現代風險曲線

這是最難以重現的實驗。作者確實給了我很多好建議,我非常感激。以下是他們實驗中的一些值得注意的設置:

  • 沒有正則化方法,如權重衰減,dropout等。
  • 訓練集包含4k個樣本。對所有的模型來說,它僅進行一次采樣并不再進行變化。評估使用完整的MNIST測試集。
  • 每個網絡都經過長時間的訓練,以達到接近零的訓練風險。對于不同大小的模型,學習率的調整方式也不同。
  • 為了使模型對參數不足區域中的初始化不太敏感,他們的實驗采用了“權重重用”方案:從訓練的較小的神經網絡獲得的參數被用來對較大的網絡進行初始化。

我沒有對每個模型進行足夠長時間的訓練或調整以獲得完美的訓練性能,但是評估誤差確實在插值閾值附近顯示出特殊的扭曲,與訓練誤差不同。例如,對于MNIST,閾值是訓練樣本的數量乘以類別數量(10),即40000。

x軸是模型參數的數量:(28 * 28 + 1)* num。單位+數量, 單位*10,以對數表示。

risk_curve_loss-mse_sample-4000_epoch-500

層間不平等

這個很容易重現。 請參閱我的實現

在第一個實驗中,我使用了三層的fc網絡,每層有256個單元。第0層是輸入層,第3層是輸出。該網絡在MNIST上訓練了100個Epochs。

layer_equality_256x3

在第二個實驗中,我使用了四層的fc網絡,每層有128個單元。其他設置與實驗1相同。

layer_equality_128x4

內在維度測試

為了將d維子空間正確地映射到全參數空間,投影矩陣P應該具有正交列。因為映射生成的Pθ^{(d)}是由d維向量中的相應標量值縮放的P的列的總和,Σ^d_{i=1}θ_i^{(d)}P^?(:, i),所以最好充分利用子空間P中的正交列。

我的實現遵循一種天真的方法,通過從標準正態分布中采樣具有獨立條目的大矩陣。期望這些列在高維空間中是獨立的,因此是正交的。當尺寸不是太大時,這種方法有效。當用大d進行探索時,存在用于創建稀疏投影矩陣的方法,這是內在維度論文所建議的。

以下是兩個網絡上的實驗運行:(左)每層有64個單元的雙層fc網絡和(右)具有128個隱藏單元的單層fc網絡,在10%的MNIST上進行訓練。對于每個d,模型訓練100個epochs。請參閱此處的代碼

intrinsic-dimension-net-64-64-and-128

5 References

[1] Wikipedia page on Occam’s Razor.

[2] Occam’s Razor on Principia Cybernetica Web.

[3] Peter Grunwald. “A Tutorial Introduction to the Minimum Description Length Principle”. 2004.

[4] Ian Goodfellow, et al. Deep Learning. 2016. Sec 6.4.1.

[5] Zhang, Chiyuan, et al. “Understanding deep learning requires rethinking generalization.” ICLR 2017.

[6] Shibani Santurkar, et al. “How does batch normalization help optimization?.” NIPS 2018.

[7] Mikhail Belkin, et al. “Reconciling modern machine learning and the bias-variance trade-off.”arXiv:1812.11118, 2018.

[8] Chiyuan Zhang, et al. “Are All Layers Created Equal?” arXiv:1902.01996, 2019.

[9] Chunyuan Li, et al. “Measuring the intrinsic dimension of objective landscapes.” ICLR 2018.

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

推薦閱讀更多精彩內容