simCSE:論文解讀

image.png
論文地址:https://arxiv.org/pdf/2104.08821.pdf
論文標題:
  • SimCSE: Simple Contrastive Learning of Sentence Embeddings
  • 基于對比學習的簡單句子嵌入
GitHub地址:https://github.com/princeton-nlp/SimCSE

0、Abstract:

本文介紹了一個簡單的對比學習框架SimCSE,它極大地促進了最先進的句子嵌入。首先描述了一種無監督的方法,它接受一個輸入句子,然后在對比目標中預測自己,并只有標準的dropout用作噪聲

這個簡單的方法令人驚訝。發現,dropout充當了最小的數據擴充,移除它會導致數據表示不好。然后,我們提出了一種有監督的方法,它將自然語言推理數據集中的注釋對納入我們的對比學習框架中,使用“蘊涵”對作為正例,使用“矛盾”對作為硬負例。

在標準語義文本相似性(STS)任務中評估SimCSE,以及使用BERT-base的無監督和監督模型分別實現了76.3%和81.6%的斯皮爾曼相關性,與之前的最佳結果相比,分別提高了4.2%和2.2%。我們也展示了兩者從理論和經驗上來看,對比學習目標將預先訓練好的嵌入的各向異性空間規整得更加均勻,并且在有監督信號的情況下更好地對齊正對

1、介紹:

學習通用句子嵌入是自然語言處理中的一個基本問題,在文獻中得到了廣泛的研究。在這項工作中,我們提出了最先進的句子嵌入方法,并證明了對比目標在以下情況下是非常有效的:再加上預先訓練過的語言模型,如BERT或RoBERTa
。我們介紹了SimCSE,一種簡單的對比語言句子嵌入框架,可以從未標記或標記的數據中生成更好的句子嵌入

image.png

○ 1、無監督SimCSE:

  • (1)無監督SimCSE簡單地預測輸入句子本身,只使用dropout作為噪聲(圖1(a))。換句話說,將同一個句子傳遞給預先訓練好的編碼器兩次:通過兩次應用標準的dropout,可以獲得兩個不同的嵌入“正例”。

  • (2)然后在同一小批中選取其他句子作為“負例”,模型預測負例中的一個正例。盡管這種方法看起來非常簡單,但它比預測下一個句子和離散訓練目標要大量的數據增強(例如,單詞刪除和替換),甚至與以前的監督方法相匹配。

  • (3)通過仔細分析,發現dropout充當隱表示的最小“數據擴充”,而移除它會導致表示崩潰。

○ 2、有監督SimCSE:

  • (1)有監督SimCSE建立在最近成功使用自然語言推理(NLI)數據集進行句子嵌入的基礎上,并將帶注釋的句子對納入對比學習(圖1(b))。與之前的工作不同作為一項三向分類任務(蘊涵、中性和矛盾),我們利用了蘊涵對可以自然地用作正例

  • (2)還發現,添加相應的矛盾對作為硬負例進一步提高了性能。與以前使用相同數據集的方法相比,NLI數據集的這種簡單使用實現了實質性的改進。我們還比較了其他標記句子對數據集,發現NLI數據集對于學習句子嵌入特別有效。

○ 衡量SimCSE學習嵌入的質量:
  • (1)alignment:正例對齊性。

  • (2)uniformity:整個表示空間的一致性。

  • ○ 通過實證分析,我們發現我們的無監督SimCSE在本質上提高了一致性uniformity,同時避免了通過衰減噪聲導致的退化對齊,從而提高了表示的表達能力。同樣的分析表明,NLI訓練信號可以進一步改善正例之間的對齊性alignment,并產生更好的句子嵌入。

  • ○ 還發現,即預訓練的單詞嵌入存在各向異性,并證明通過頻譜視角,對比學習目標“均勻”了句子嵌入空間的奇異值分布,從而提高了一致性uniformity。

我們對七項標準語義文本相似性(STS)任務和七項轉移任務中對SimCSE進行了綜合評估。在STS任務中,我們的無監督模型和監督模型分別達到76.3%和81.6%的平均斯皮爾曼相關,與之前的最佳結果相比,分別提高了4.2%和2.2%。在轉移任務上也取得了有競爭力的表現。

最后,我們在文獻和研究中發現了一個不連貫的評估問題整合不同設置的結果,以便將來評估句子嵌入。

2、背景:對比學習

對比學習的目的是通過將語義上相近的鄰居聚在一起,將非鄰居分開來學習有效的表征。它假設了一組成對的例子:
image.png

其中xi 和x+i是語義相關的。我們遵循對比框架,采用一個具有批量負例的叉熵目標:讓 hi 和 hi+ 表示 xi 和 xi + 的表示,即訓練目標。對于(xi,xi+)和小批量的N對是:

where xi and x+i are semantically related. We follow the contrastive framework
in Chen et al. (2020) and take a cross-entropy objective with in-batch negatives (Chen et al., 2017;Henderson et al., 2017): let hi and h + i denote the representations of xi and x + i, the training objective
for (xi, x+i) with a mini-batch of N pairs is:

image.png

其中τ是一個溫度超參數sim(h1,h2)是余弦相似性

image.png

在這項工作中,我們使用預訓練的語言模型,如BERT或RoBERTa:h=fθ(x),然后微調所有參數使用對比學習目標(等式1)。

○ Positive instances:

對比學習中的一個關鍵問題是如何構建 (xi, xi+)對。在視覺表現中,一個有效的解決方案是對同一幅圖像進行兩次隨機變換(例如,裁剪、翻轉、變形和旋轉)如xi 和 xi+。最近,在語言表達中也采用了類似的方法,方法是應用增廣技術,如單詞刪除、重新排序和替換。然而,由于NLP的離散性,NLP中的數據擴充本質上是困難的。我們將在§3中看到。簡單地在中間表示上使用標準Dropout比這些離散操作符表現得更好。

在NLP中,類似的對比學習目標在不同的背景下進行了探索。 在這些情況下, (xi, xi+)收集自有監督的數據集,如問題-段落對。由于xi和xi+的明顯性質,這些方法總是使用雙編碼器框架, 例如,對于xi和xi+使用兩個獨立的編碼器fθ1和fθ2。

對于句子嵌入,Logeswaran和Lee(2018)也使用了對比學習和雙編碼器方法,將當前句子和下一個句子組成為(xi,xi+)。

image.png
○ Alignment 和 uniformity:

最近,Wang和Isola(2020)確定了與對比學習的對齊性alignment和一致性uniformity——并建議使用它們來衡量表達的質量。給出了一個正例對分布ppos,alignment計算成對實例的嵌入之間的預期距離(假設表示已經規范化):

image.png

另一方面,一致性uniformity衡量的是嵌入物均勻分布效果:

image.png

其中pdata表示數據分布。這兩個指標與對比學習的目標非常一致:正例之間應該保持緊密,而隨機實例的嵌入應該分散在超球體上。在接下來的部分中,我們還將使用這兩個指標來證明我們的方法的內部工作原理。

3、 Unsupervised SimCSE:

無監督的SimCSE的想法非常簡單:我們收集一組句子:
image.png

使用 xi+=xi。關鍵的成分是讓這個通過使用獨立取樣的dropout masks 對 xi 和 xi+進行相同的正例對操作。

Transformers標準的訓練:dropout masks 全連接層以及注意力概率(默認p=0.1)。我們表示:
image.png

其中z是dropout的隨機掩碼。我們只是將相同的輸入進行編碼器兩次,并獲得兩個具有不同dropout masksz、z0的嵌入,SimCSE的訓練目標是:

image.png
  • 一小批N個句子。注意z只是Transformers中的標準dropout mask不要添加任何額外的dropout。
○ Dropout noise 作為數據增強:

我們將其視為數據擴充的一種最小形式:正例對的句子完全相同它們的嵌入只在Dropout mask上有所不同。我們將這種方法與STS-B開發集上的其他訓練目標進行比較。

表1將我們的數據增強技術方法與普通方法進行了比較:如crop、word刪除和替換,可以看作是 h = fθ(g(x),z),而g是x上的(隨機)離散算子。注意到,即使刪除一個單詞會影響性能,但沒有任何影響到增強效果優于dropout噪聲。

我們還將self-prediction訓練目標與使用的next-sentence目標進行了比較,選擇其中一個或者兩個獨立的編碼器。如表2所示,發現SimCSE比next-sentence目標的表現要好得多,并且使用一個編碼器而不是兩個編碼器在我們的方法中有顯著差異。

○ Why does it work? 為什么有效?

為了進一步了解dropout noise在無監督SimCSE中的作用,我們在表3中嘗試了不同的 dropout rates,并觀察到所有變體都低于Transformers的默認dropout概率p=0.1。

我們發現兩個極端情況特別有趣:

  • “no dropout” (p = 0)和“固定0.1”(dropout p = 0.1,但樣本對是相同dropout mask)。在這兩種情況下,產生的嵌入結果完全一樣,這導致戲劇性的性能下降。

在測試過程中,我們每10步對這些模型進行一次檢查訓練并可視化對齊alignment和一致性uniformity度量在Figure 2中,還有一個簡單的數據擴充模型“刪除一個單詞”。如圖所示,從預先訓練好的檢查點開始,所有模型都大大提高了一致性uniformity。

然而,這兩種特殊變體的排列也會退化由于使用了dropout噪聲,我們的無監督SimCSE保持了穩定的對齊alignment。它還表明,從預訓練的檢查點開始是至關重要的,因為它提供了良好的初始對齊alignment。最后,“刪除一個單詞”改善了對齊,但在一致性度量上獲得了較小的增益,最終表現不如無監督SimCSE。

image.png

4 、Supervised SimCSE:

我們已經證明,添加dropout 噪聲能夠保持正例對的良好對齊(x,x+)~Ppos。

在本節中,將研究是否可以利用有監督的數據集來提供更好的訓練信號,以改進方法的一致性。

之前的研究表明,有監督的自然語言推理(NLI)數據集通過預測兩個句子之間的關系是包含關系、中性關系還是矛盾關系,有效地學習句子嵌入。在我們的對比學習框架中,直接從監督數據集中提取(xi,xi+)對,并使用它們優化等式1。

○ 標簽數據的選擇:

我們首先探索哪些監督數據集特別適合于構造正例對(xi,xi+)。我們用大量數據集和句子對樣例進行了實驗,包括:

  • (1)QQP4:Quora問題對;

  • (2) Flickr30k:每張圖片都是用5個人類文字注釋,我們考慮任何兩個標題相同的圖像作為正例對;

  • (3)ParaNMT:大規模回譯釋義數據集。

  • (4)NLI數據集:SNLI和MNLI。

  • 用不同的數據集訓練對比學習模型(等式1),并比較表4中的結果。為了進行公平比較,我們還對相同的訓練對進行了實驗。在所有選項中,使用NLI(SNLI+MNLI)數據集中的蘊涵對表現最好

  • 我們認為這是合理的,因為NLI數據集由高質量和眾包數據對組成。此外,人類注釋員還需要編寫基于前提和兩句話的假設往往詞匯重疊較少。

  • 例如,我們發現蘊涵對(SNLI+MNLI)的詞匯重疊(兩袋單詞之間的F1測量)為39%,而QQP和ParaNMT分別為60%和55%。
image.png
○ Contradiction as hard negatives:矛盾對作為負例對

最后,我們進一步利用NLI數據集,將其矛盾對作為負例對。

在NLI數據集中,給定一個前提,注釋者需要手動編寫一個絕對正確(蘊涵)、一個可能正確(中立)和一個絕對錯誤(矛盾)的句子。因此,對于每個前提及其蘊涵假設,都有一個伴隨的矛盾假設(示例見圖1)。

形式上我們擴展(xi,xi+)為(xi,xi+,xi-),其中xi是前提,xi+ 和 xi?是蘊涵假設和矛盾假設。然后,通過(N是最小批量)定義訓練目標Li。

image.png

如表4所示,添加負例對可以進一步提高性能(84.9→ 86.2)這是最終有監督SimCSE。也試過了添加ANLI數據集或將其與無監督SimCSE方法相結合,但沒有發現有意義的改進。我們也在有監督的SimCSE中考慮了雙編碼器框架,它損害了性能(86.2→ 84.2)。

5、與各向異性的聯系:

最近的研究發現了一個各向異性問題語言表達,即學習到的嵌入占據了向量空間中的窄錐限制了他們的表達能力。

證明語言模型經過了捆綁訓練輸入/輸出嵌入導致單詞各向異性嵌入,在預先訓練的上下文表示中進一步觀察到了這一點。證明奇異值語言模型中單詞嵌入矩陣的構造急劇衰減:除了少數占主導地位的奇異值,所有其他值都接近于零。

(1)緩解問題的一個簡單方法是后處理,要么消除主要主成分,要么將嵌入映射到各向同性分布

(2)另一個常見的解決方案是在訓練期間增加正則化。在這項工作中,我們從理論和經驗上證明,對比目標也可以緩解各向異性問題。

各向異性問題自然與均勻性有關,兩者都強調了嵌入應均勻分布在空間中。直觀地說,隨著目標的推進,優化對比學習目標可以提高一致性(或緩解各向異性問題)把負例分開。在這里,我們采用單一光譜的觀點,這是一種常見的做法。在這里,我們從單數光譜的角度來分析單詞嵌入,以及表明對比目標可以“壓平”目標句子嵌入的奇異值分布并使表示更加各向同性

繼Wang和Isola,對比學習目標(等式1)的漸近性可以用以下等式表示:負例的數量接近無窮大(假設 f(x) 被歸一化):

image.png
其中,第一項保持正例相似,第二項將負例分開。當pdata在有限樣本上是一致的
image.png
○ 通過 hi = f(xi),我們可以從詹森不等式的第二個術語得出以下公式:
image.png
因此,對比學習有望緩解表征退化的問題,并有助于提高學習效率提高句子嵌入的一致性uniformity。

與后處理方法相比。其目的僅在于鼓勵各向同性表征,對比學習還優化了通過方程式6中的第一個term,這是SimCSE成功的關鍵。第7節給出了定量分析。

6、實驗:

6.1 評估設置:

我們在7個語義文本上進行了實驗相似性(STS)任務。請注意,所有的STS實驗都是完全無監督的,沒有使用STS訓練集。

即使對于有監督的SimCSE,也只是說,在之前的工作之后,需要額外的標記數據集進行訓練。還評估了7項遷移學習任務,并在附錄E中提供了詳細結果。我們與Reimers和Gurevych(2019)持有類似的觀點,即句子嵌入的主要目標是對語義相似的句子進行聚類,因此將STS作為主要結果。

○ 語義文本相似性任務:

我們評估了7項STS任務:2012-2016年STS,STS基準(Cer等人,2017年)和疾病相關性(Marelli等人,2014年)。當與之前的工作進行比較時,我們在評估設置中確定了已發表論文中的無效比較模式,包括(a)是否使用額外的回歸系數,(b)斯皮爾曼與皮爾遜的相關性,以及(c)如何匯總結果(表B.1)。

○ 訓練細節:
  • 我們從BERT或RoBERTa預訓練的檢查點開始,并將[CLS]表示作為句子嵌入。

  • 我們從英文維基百科中隨機抽取106個句子,對無監督的SimCSE進行訓練,并對有監督的SimCSE進行訓練MNLI和SNLI數據集的組合(314k)。

  • 更多訓練細節見附錄A語義文本相似性任務。我們評估了7項STS任務:STS 2012-2016(Agirre等人,2012、2013、2014、2015、2016)、STS基準(Cer等人,2017)和疾病相關性(Marelli等人,2014)。

image.png
6.2 主要結果:

我們比較了無監督和有監督的SimCSE與以前SOTA的STS任務句子嵌入方法。無監督基線包括平均GloVe嵌入、平均BERT或RoBERTa嵌入,以及后處理方法,如BERT - flow和BERT-whitening。

我們還比較了最近使用對比目標的幾種方法,包括:
(1)IS-BERT),它最大限度地實現了global和local features 之間的一致性;
(2) DeCLUTR,將同一文檔中的不同spans作為正例對;
(3) CT,它將來自兩個不同的編碼器的同一句子進行嵌入對齊。

  • 其他監督方法包括推斷法、通用句子編碼器和SBERT/SRoBERTa采用后處理方法。我們將提供更多細節附錄C中的baselines。

表5顯示了7項STS任務的評估結果。無論是否有額外的NLI監督,SimCSE都能顯著改善所有數據集的結果,大大優于之前最先進的模型。具體而言,我們的無監督SimCSE-BERT-base將之前的SOTA平均Spearman相關性從72.05%提高到76.25%,甚至與有監督baselines相當。

在使用NLI數據集時,SimCSE-BERTbase進一步將SOTA結果提高到81.57%。RoBERTa編碼器的收獲更為明顯,我們的有監督SimCSE通過RoBERT-alarge實現了83.76%

在附錄E中,我們展示了SimCSE與現有工作相比達到PAR或更好的傳輸任務性能,還有一個輔助MLM目標可以進一步提高性能。

image.png
6.3 消融研究:

我們調查了不同的pooling方法和硬負例的影響。本節中所有報告的結果均基于STS-B開發集。我們在附錄D中提供了更多的消融研究(標準化、溫度和MLM目標)。

○ Pooling methods:

Reimers和Gurevych等人表明,采用預訓練模型的平均嵌入(尤其是從第一層和最后一層)比[CLS]具有更好的性能

表6顯示了無監督和有監督SimCSE中不同池化方法之間的比較。對于[CLS]表示,原始的BERT實現需要在其上附加一個MLP層。

在這里,我們考慮[CLS]有三種不同的設置:

(1)保持MLP層;
(2) 無MLP層;
(3) 在訓練期間保留MLP,但在測試時移除。

  • 發現,對于無監督的SimCSE,僅在訓練期間接受MLP的[CLS]代表最有效;
  • 對于有監督的SimCSE,不同的池方法并不重要。
  • 默認情況下,我們將[CLS]與MLP(訓練)一起用于無監督SimCSE,將[CLS]與MLP一起用于有監督SimCSE
○ Hard negatives:

硬負例。直覺上,這可能是有益的區分硬負例(矛盾示例)和其他批量負例。因此,我們擴展等式5中定義的訓練目標,以納入不同負例的權重:

image.png

我們用不同的α值對SimCSE進行訓練,并對訓練后的模型進行評估STS-B的開發集,也考慮中性假設作為硬負例。如表7所示,α=1表現最好,且中性假設不會帶來進一步的收益。

7、分析:

在本節中,我們將進一步分析,以了解SimCSE的內部工作原理。

Uniformity 和 Alignment :

圖3顯示了不同句子嵌入模型的一致性uniformity和對齊性alignment,以及它們的平均STS結果。總的來說,具有更好的對齊和一致性的模型可以獲得更好的性能

也觀察到:
  • (1)雖然預訓練的嵌入具有良好的對齊alignment,但其均勻性uniformity較差(即嵌入高度各向異性);
  • (2)后處理方法,如BERT-flow和BERT-whitening大大提高了均勻性uniformity,但在alignment對齊性也會退化;
  • (3)無監督的SimCSE有效提高了一致性pre-trained的嵌入,同時保持良好的對齊性alignment。
  • (4) 合并有監督數據到SimCSE進一步修正了alignment對齊性。

在附錄F中,進一步證明了SimCSE可以有效地均勻預訓練嵌入的奇異值分布。
在附錄G中,我們展示了SimCSE在不同的句子對之間提供了更可區分的余弦相似性。

○ 定性比較:

我們使用SBERTbase和SimCSE-BERTbase進行了小規模檢索實驗。使用來自Flickr30k數據集,并將任意隨機句子作為檢索類似句子的查詢(基于余弦)相似性)。如表8所示的幾個例子,SimCSE檢索到的句子與SBERT檢索到的質量進行比較具有較高的識別率。

image.png
image.png

8 、相關工作:

句子嵌入早期建立在分布假設的基礎上,通過預測給定句子的周圍句子。表明,簡單地用n-gram嵌入來增強word2vec的概念會產生很好的結果。最近的幾種方法從數據擴充或同一句話的不同版本或文件采用了對比目標。與這些工作相比,

SimCSE通過對同一句話的標準dropout獲取不同的輸出的最簡單的想法,卻在STS任務中表現最佳。
  • 有監督的句子嵌入比無監督的句子嵌入具有更強的性能。Conneau等人提議對NLI數據集上的Siamese模型進行微調,并進一步擴展到其他編碼器或預訓練的模型。

  • 此外,證明,雙語和回譯語料庫為學習語義相似性提供了有用的監督。另一個工作重點是正則化嵌入以緩解表示退化問題,并對預訓練的語言模型的改進產生實質性影響。

9、結論:

  • 在這項工作中,我們提出了一個簡單的對比學習框架SimCSE,它極大地改進了語義-文本相似任務中的SOTA句子嵌入。我們提出了一種無監督的方法和一種有監督的方法,該方法利用NLI數據集可以預測輸入句子本身,其中輸入句子本身帶有dropout噪聲。

  • 我們進一步證明了內部工作原理通過分析對齊,我們的方法是通過分析SimCSE與其他基線模型的對齊性alignment以及一致性uniformity

  • 我們的對比目標,尤其是無監督的目標在NLP中有更廣泛的應用。它為通過文本輸入增強數據提供了一個新的視角可以擴展到其他連續表示并整合到語言模型預訓練中。

致謝:

我們感謝Tao Lei, Jason Lee, Zhengyan Zhang, Jinhyuk Lee, Alexander Wettig, Zexuan Zhong,普林斯頓NLP小組的成員有益的討論和寶貴的反饋。這項研究得到了哈佛大學研究生獎學金的支持普林斯頓大學和蘋果公司的禮物獎。

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

推薦閱讀更多精彩內容