RoBERTa - 论文解读

image.png
论文地址:https://arxiv.org/pdf/1907.11692.pdf
论文标题:
  • RoBERTa: A Robustly Optimized BERT Pretraining A pproach
  • 一个强力优化的BERT预训练方法。
GitHub地址:
BERT论文解读://www.greatytc.com/p/18ebd5ab4e45

0、摘要:

语言模式预训练已经带来了显著的性能提升,但仔细比较不同方法是一个挑战。训练的计算成本很高,通常是在不同大小的私有数据集上进行的,我们将展示,超参数选择对最终结果有重大影响。我们对BERT 预训练进行了一项复制研究,仔细测量了许多关键超参数和训练数据大小的影响。

我们发现,BERT的训练明显不足,可以与发布后的每个模型的性能相匹配或超过。作者从模型设计选择(design choice)、训练策略、语料等方面入手,重新对BERT进行了预训练,得到RoBERTa。实验结果表明RoBERTa在GLUE、RACE和SQuAD都达到了SOTA。这些结果突出了以前被忽略的设计选择的重要性。

1、介绍:

自训练方法,如ELMo、GPT、XLM和XLNet带来了显著的性能提升,但是很难说清,这么方法中,哪一部分起到最关键的作用。训练在计算上是昂贵的,限制了可以进行的调整的数量,并且通常使用大小不同的私人训练数据进行训练,限制了我们测量建模效果的能力有所提高。

我们提出了一项BERT预训练的复制研究,其中包括对超参数调节和训练集大小的影响的仔细评估。我们发现BERT的训练明显不足,并提出了一种改进的训练BERT模型的方法,我们称之为RoBERTa,它可以匹配或超过所有post-BERT方法的性能。

○ RoBERTa改进很简单,包括:

  • (1)用更多的数据、更大的batch_size、更长的时间来训练模型;
  • (2)移除BERT中的NSP任务;
  • (3)长序列训练;
  • (4)根据训练数据动态调整mask方案;
  • (5)使用新的更大的数据集CC-NEWS,以更好地控制训练集大小的影响。

RoBERTa在GLUE任务上,创造了4项新的SOTA记录,并在SQuAD和RACE上也与SOTA水平相匹配。

○ 总之,本文的贡献是:

  • (1)提出一系列重要的BERT设计选择和训练策略。
  • (2) 使用新的更大的数据集CC-NEWS,证明了更多的训练数据能够进一步提升BERT模型在下流任务中的表现。
  • (3)实验结果表明,masked language model在正确的模型设计配置下,比最近提出的其他模型方法都要好。

2、 背景:

在本节中,我们简要概述了BERT的预训练方法和一些训练选择,我们将在下一节中进行实验研究。

2.1 设置:

BERT将两段(tokens序列)的串联作为输入, x1, . . . , xN 及 y1, . . . , yM。片段通常由多个自然句子组成。这两个段以单个输入序列的形式呈现给BERT,并用特殊标记对其进行分隔: [CLS], x1, . . . , xN , [SEP], y1, . . . , yM, [EOS]。M和N受到约束,使得M+N<T。其中T是一个参数,用于控制训练期间的最大序列长度。该模型首先在一个大型的未标记文本语料库上进行预训练,然后使用结束任务标记的数据进行微调。

2.2 架构:

BERT使用了现在无处不在的Transformer架构,我们将不详细回顾。我们使用带有L层的Transformer架构。每个Block块使用一个self-attention heads,隐藏层的维度为 H。

2.3 训练目标:

○ 训练期间,BERT的两个训练目标:

  • (1)masked language modeling,MLM
  • (2)next sentence prediction,NSP

Masked Language Model (MLM):随机的输入序列中的token示例如下:选择并替换为特殊token[MASK]。在预测被masked的tokens时,MLM的目标函数是交叉熵损失函数。

BERT 的 mask策略:
随机选择 15% 的 token;
这些15%要被 masked 的 token 并不会真的全替换成 [MASK],而是从这些 token 中:
(1)随机选择 80% 替换成 [MASK] ;
(2)随机选择 10% 替换成随机 token;
(3)随机选择 10% 不改变原 token。
然后 使用交叉熵损失来预测原始的 token。

在最初的实现中,随机mask和replace在开始时执行一次,并在训练期间保存,尽管在实践中,数据是重复的,但每个训练句子的mask并不总是相同的。

Next Sentence Prediction (NSP)
下一句预测(NSP)NSP是一种二元分类损失,用于预测原始文本中两段话是否上下文。通过从文本语料库中选取连续的句子来构建正例。通过将不同文档中的片段配对,可以构建负例**。正反两个例子的抽样概率相等。

NSP目标旨在提高下游任务的性能,例如自然语言推理,这些任务需要对句子对之间的关系进行推理。

2.4 优化:

BERT使用Adam进行优化参数如下: β1 = 0.9, β2 = 0.999, ǫ = 1e-6,L2重量衰减系数为0.01,在前10000个步骤中,学习速率被预热到1e-4的峰值,然后线性衰减。BERT训练时,所有层和注意力权重的dropout值均为0.1,并具有一个GELU激活函数。模型针对S=1000000更新进行预训练,小批量包含最大长度为T=512的 B=256 序列标记。

2.5 数据:
  • BERT训练数据是BOOKCORPUS图书语料库和WIKIPEDIA英文维基百科的结合,总共16GB的未压缩文本。

3、实验设置:

在本节中,将介绍我们对BERT进行复制研究的实验设置。

3.1 实施:

我们在FAIRSEQ重新实施了BERT。我们主要遵循原始BERT优化超参数,除了峰值学习率和预热步骤数,这两个参数分别针对每个设置进行调整。此外,我们还发现训练对Adam 的ε项非常敏感,在某些情况下,我们在调整后获得了更好的性能或稳定性。同样,我们发现当以较大的batch size训练时,将正则项系数β2=0.98也能提升模型稳定性。

我们用最多T=512个标记的序列进行预训练。与Devlin等人不同,我们不会随机注入短序列,也不会在前90%的更新中使用缩短的序列长度进行训练。我们只训练全长序列。我们在DGX-1机器上使用混合精度浮点算法进行训练,每台机器配备 8×32GB Nvidia V100 GPU,由Infiniband互连。

3.2 数据:

BERT风格的预训练主要依赖于大量的文本。Baevski等人对比于BERT,通过几项工作针对更大、更多样化的数据集进行了训练,得以证明:增加数据大小可以提高最终任务的性能

不幸的是,并非所有额外的数据集都可以公开发布。在文中的研究中,作者专注于收集尽可能多的实验数据,使能够在每次比较中匹配数据的整体质量和数量。

原文考虑五个不同大小和域的英语语料库,总计超过160GB的未压缩文本。使用以了下文本语料库:

  • BOOKCORPUS:再加上英语维基百科。这是用于测试的原始数据训练BERT,大小为 16GB。

  • CC-NEWS:这是从新闻的英文部分收集的数据集。数据包含63个数以百万计的英语新闻文章,2016年过滤后为 76GB。

  • OPENWEBTEXT:这是对Radford等人中描述的WebText语料库的开源再创作。该文本是从Reddit上共享的URL中提取的web内容,至少有三次投票,大小为 38GB。

  • STORIES:Trinh和Le引入的一个数据集,其中包含经过过滤的CommonCrawl数据子集,以匹配Winograd模式的故事式风格,大小为 31GB。

3.3 评估:

在之前的工作之后,我们使用以下三个基准来评估下游任务的预训练模型

  • (1)GLUE: General Language Understanding Evaluation
○ GLUE通用语言理解评估基准是评估自然语言理解系统的9个数据集的集合。

6项任务分为单句分类任务和句子对分类任务。GLUE组织者提供训练和开发数据拆分,以及一个提交服务器和排行榜,允许参与者评估和比较他们的系统与私有的测试数据。

对于第4节中的复制研究,我们报告了在相应的单任务训练数据(即,没有多任务训练或整合)上微调预训练模型后,开发集的结果。我们的微调程序遵循最初的BERT论文。在第5节中,我们还报告了从公共排行榜获得的测试集结果。这些结果取决于我们在第5.1节中描述的几个特定于任务的修改。

  • (2)SQuAD: Stanford Question Answering Dataset
○ 斯坦福问答数据集(STAND)提供了一段上下文和一个问题。任务是回答这个问题通过从上下文中提取相关span。

我们评估了两个版本的SQuAD:V1.1 和 V2.0。在V1中上下文总是包含答案,而在V2中提供的上下文中,有些问题没有得到回答,使任务更具挑战性。

对于SQuAD 的V1.1版本,我们采用了与BERT相同的span预测方法。 对于SQuAD V2.2,我们添加了一个额外的二元分类器来预测问题是否可以回答,我们通过将分类项和span损失项相加来联合训练。在评估过程中,我们只预测分类为成对的span指数。

(3)RACE: ReAding Comprehension from Examinations

○ RACE考试阅读理解任务是一个大规模的阅读理解数据集:

包含28000多篇文章和近100000个问题。该数据集收集自中国为中学生设计的英语考试。在比赛中,每篇文章都有多个问题。对于每个问题的任务是从四个选项中选择一个正确答案。与其他流行的阅读理解数据集相比,RACE的语境要长得多,而且需要推理的问题比例非常大。

4 训练程序分析:

该章节探索和量化什么样的设置对于预训练BERT是重要的。
作者实验的模型初始设置与BERT-base ( L = 12 , H = 768 , A = 12 , 110 M params ) 一致。

4.1 Static vs. Dynamic Masking:
○ BERT依赖于随机mask和预测标记。原始的BERT实现在数据预处理期间执行一次mask,从而产生一个静态mask。为了避免对每个epoch中的每个训练实例使用相同的mask,训练数据被复制了10次,以便在40个epoch中,每个序列以10种不同的方式被mask训练。因此,在训练过程中,每个训练序列都被用同一个mask观看四次。

我们将这种策略与动态mask进行比较,在动态mask中,我们每次向模型提供一个序列时都会生成mask模式。当进行更多步骤的预训练或使用更大的数据集时,这一点变得至关重要。

○ 动态mask:对每个序列进行mask的操作是在喂给模型该序列时执行的。这在预训练更多步骤或更大数据集时,至关重要。
image.png
实验结果:

表1发现:动态mask略比静态mask好,因此作者后面的实验均采用动态mask方式。

4.2 模型输入格式和下一个句子预测:

Model Input Format and Next Sentence Prediction

在原始的BERT预训练过程中,模型观察到两个串联的文档段,它们要么是连续采样的来自同一文档(p=0.5)或不同文档。除了MLM 建模目标,该模型还通过辅助下一句预测(NSP)来预测观察到的文档片段是否来自相同或不同的文档。

假设NSP loss是训练原始BERT模型的一个重要因素。Devlin等人观察到,移除NSP会损害性能,QNLI、MNLI和SQuAD1.1的性能显著下降。然而,最近的一些研究质疑了NSP loss 的必要性。为了更好地理解这种差异,我们比较了几种不同的训练形式:

  • SEGMENT-PAIR+NSP:这遵循了BERT中使用的原始输入格式,带有 NSP
    loss。每个输入都有一对段,每个段可以包含多个自然句子,但总的组合长度必须小于512个tokens。

  • SENTENCE-PAIR+NSP:每个输入都包含一对自然句子,可以从一个文档的连续部分采样,也可以从另一个文档中采样单独的文件。由于这些输入明显短于512个tokens,因此我们增加了批处理大小 batch size ,以使tokens的总数与段对+NSP类似。我们保留NSP的loss。

  • FULL-SENTENCES:每个输入都包含从一个或多个文档中连续采样的完整句子,因此总长度为最多512个tokens。输入可能会跨越文档边界。当我们到达一个文档的末尾时,我们开始从下一个文档中抽取句子,并在文档之间添加一个额外的分隔符标记。我们移除了NSP loss。

  • DOC-SENTENCES:输入的结构类似于FULL-SENTENCES,只是它们不能跨越文档边界。在文档末尾附近采样的输入可能短于512个tokens,因此在这些情况下,我们会动态增加批处理大小,以获得与FULLSENTENCES相似的总tokens数,我们移除了NSP loss。

image.png
实验结果:
  • (1)作者发现使用单个句子会损害下游任务的性能,作者推测这是因为该模型无法学习远程依赖关系。
  • (2)去掉NSP任务会有略微的提升。
  • (3)DOC-SENTENCES比FULL-SENTENCES表现好。

然而,由于DOC-sequences格式会导致不同的批量大小,我们在剩下的实验中使用FULL-SENTENCES,以便与相关工作进行比较。

4.3 大批量训练:

过去的工作在神经机器翻译已经表明,训练非常大的小批量可以同时提高优化速度和结束任务性能时,学习率适当增加。最近的研究表明,BERT很适合较大规模的batch训练。

Devlin等人最初对BERT-base进行了1M步的训练,批量大小为256个序列。这相当于计算成本,通过梯度累积,训练125K步,批量大小为2K序列,或批量为8K的31K步骤。

image.png

在表3中,我们比较了BERT-base在增加batch size时的困惑度和最终任务性能,控制了通过训练数据的次数。我们观察到,大批量的训练提高了MLM模型目标的复杂性,以及最终任务的准确性。通过分布式数据并行训练,大批量也更容易并行化,在以后的实验中,我们使用8K序列进行批量训练。

值得注意的是,You等人用更大的批量训练BERT,最多32K序列。我们将进一步探索大批量训练的局限性留给未来的工作。

总结:通过实验发现,增大batch size能够进一步提升模型的性能,且更大的batch size更易于分布式数据的并行训练。
4.4 文本编码 - Text Encoding:
○ 字节对编码Byte-Pair Encoding (BPE) :

是字符级和单词级表示的混合,允许处理自然语言语料库中常见的大型词汇。BPE依赖于子词单元,而不是完整的词,子词单元是通过对训练语料库进行统计分析来提取的。BPE词汇表的大小通常在10K-100K子单词单位之间。然而,unicode字符在其中占了相当大的一部分在建模大型和多样的语料库时使用的词汇,例如本工作中考虑的语料库。Radford et al介绍了一种巧妙的BPE实现,它使用字节而不是unicode字符作为基本子字单元。使用字节可以学习中等大小(50K个单位)的子单词词汇表,它仍然可以对任何输入文本进行编码,而不引入任何“未知”标记。

最初的BERT实现使用字符级别大小为30K的BPE词汇表,在使用启发式标记化规则对输入进行预处理后学习。在Radford等人之后,我们考虑用更大的字节级的BPE词汇来训练BERT,其中包含50K的子字单位,而不需要任何额外的预处理或令牌化。这分别为BERT - base和Bert - lagle增加了约15M和20M的额外参数。

文本编码总结以下几点:
  • 字节对编码(BPE)是字符级和单词级表示形式的混合体,可以处理自然语言语料库中常见的大词汇。

  • Radford在GPT2里提出了一种更巧妙的BPE实现版本byte-level text encoding,该方法使用bytes作为基础的子词单元,这样便把词汇表的大小控制到了5w。它可以在不需要引入任何未知字符前提下对任意文本进行编码。

  • BERT原始版本使用字符级(character-level)的BPE词汇表,大小是3w,是用启发式分词规则对输入进行预处理学习得到的。

  • 之前的一些实验结果表明,这两种文本编码的实验性能区别不大,可能Radford BPE Encoding在某些任务上的终端性能略微差点,但是RoBerta作者坚信通用的编码模式比性能上的轻微损失更重要,所以在实验中采用了byte-level text encoding。

5、RoBERTa:

  • 结合之前章节提出的改进配置,作者将这些配置结合起来,改进后的模型成为RoBERTa
○ 具体来说,RoBERTa使用:
  • (1)dynamic mask。
  • (2)FULL-SENTENCES without NSP。
  • (3)large mini-batches。
  • (4)byte-level BPE等设置。

此外,我们还调查了在之前的工作中被低估的另外两个重要因素

  • (1)用于预训练的数据。
  • (2)通过数据的训练次数。

例如,最近提出的XLNet架构使用比原始BERT多近10倍的数据进行预训练。它还以8倍于优化步骤一半的批量进行训练,因此在预训练中看到的序列数量是BERT的4倍。

为了将这些因素的重要性与其他建模选择区分开来,从训练RoBERTa开始遵循大型架构(L=24,H=1024,A=16,355M参数)。在Devlin等人使用的可比图书语料库和维基百科数据集上预训练了10万步。使用1024个V100 GPU对模型进行了大约一天的预训练。

image.png
实验结果:
  • 在控制训练数据时,观察到RoBERTa比最初报告的BERT-large结果有了很大的改进

  • 接下来,将这些数据与第3.2节中描述的三个附加数据集结合起来。与之前相同的训练步骤数(100K)。总共预训练了超过160GB的文本。观察到,整个计算性能进一步改善所有下游任务,证明了在预训练过程中,数据集规模和多样性的重要性

  • 最后,我们对RoBERTa进行了更长时间的预训练,将预训练步骤的数量从100K增加到300K,然后进一步增加到500K。我们再次观察到下游任务性能显著提高,在大多数任务中,300K和500K步长模型的性能优于XLNet-large。我们注意到,即使是我们训练时间最长的模型似乎也不会过度拟合我们的数据,并且可能会从额外的训练中受益。

  • 作者在GLUE,SQuaD和RACE这三个不同的基准上评估了RoBERTa模型。具体来说,考虑RoBERTa在前面介绍的所有五个数据集上训练超过500 K步。

5.1 GLUE 结果:
image.png
对于GLUE,我们考虑两个定影设置:
  • 在第一个设置(single task,dev)中,我们分别为每个GLUE任务微调RoBERTa,只使用相应任务的训练数据。我们考虑每个任务的有限超参数扫描,具有批量大小∈ {16, 32}以及学习率∈ {1e−5,2e−5,3e−5} ,在前6%的步骤中进行线性预热,然后线性衰减到0。我们为10个epochs和根据dev集合上每个任务的评估指标提前停止。其余超参数与训练前相同。在此设置中,我们报告了在五次随机初始化过程中每个任务的开发集结果中值,无需进行模型置乱。

  • 在第二个场景(合奏、测试)中,我们通过GLUE排行榜将RoBERTa与测试集上的其他方法进行比较。虽然许多对GLUE排行榜的提交依赖于多任务微调,但我们的提交仅依赖于单任务微调。对于RTE、STS和MRPC我们发现,从MNLI单任务模型开始,而不是从基线预训练的RoBERTa开始,进行微调是有帮助的。我们探索了一个更广阔的领域附录中描述的超参数空间,以及每个任务5到7个模型之间的集成。

○ 特定于任务的改进:

GLUE任务中的两个需要特定于任务的微调方法,以实现有竞争力的排行榜结果。

  • (1)QNLI:最近在GLUE排行榜上提交的报告采用了QNLI任务的两两排名公式,从训练集中挖掘候选答案并相互比较,以及单个(问题,候选)配对被归类为正例。
    这个公式大大简化了任务,但不能直接进行比较致BERT。在最近的工作之后,我们在提交测试时采用了排名方法,但用于与BERT进行直接比较我们报告基于纯分类方法的开发集结果。
  • WNLI
    我们发现提供的NLI格式数据处理起来很有挑战性。相反我们使用SuperGLUE重新格式化的WNLI数据,这表明查询代词和指代词的span。我们利用margin ranking loss微调。
    对于给定的输入句子,使用spaCy来从句子中提取额外的候选名词短语,并对模型进行微调,使其对正例的指称短语的评分高于任何负例候选短语。但是缺点是,我们只能使用正例的训练样本,而这排除了提供的一半以上的训练样本。
  • 结果

  • 第一个设置(单任务,dev),RoBERTa实现所有9种GLUE的最新结果任务开发集。重要的是,RoBERTa使用与Bert-large一样的MLM预训练目标和架构,然而,它的表现始终优于XLNet - large。与我们在这项工作中探索的数据集大小和训练时间等更普通的细节相比,这就提出了关于模型体系结构和训练前目标的相对重要性的问题。

  • 在第二个场景(合奏、测试)中,将RoBERTa提交给GLUE排行榜,并在9项任务中的4项任务中取得SOTA。这尤其令人兴奋,因为与其他大多数任务不同,RoBERTa不依赖于多任务微调。预计,未来的工作可能会通过结合更复杂的多任务微调程序进一步改善这些结果。

5.2 SQuAD 结果:

与过去的工作相比,我们对SQuAD采取了更简单的方法。特别是,虽然BERT和XLNet都使用额外的QA数据集来增加他们的训练数据,但我们仅使用提供的SQuAD训练数据对RoBERTa进行微调。Yang等人还采用了一个定制的分层学习速率计划layer-wise learning rate schedule来进行微调。

image.png

对于SQuAD v1.1我们遵循与Devlin等人相同的微调程序。此外SQuAD v2.0,我们还对给定的这个问题是可以回答的;我们通过将分类项和span loss项相加,将该分类器与span 预测器联合训练。

结果:

结果我们在表6中给出了我们的结果。SQuAD v1.1开发集,RoBERTa与XLNet最先进的设置相匹配(SOTA:state-of-the-art)。

在SQuAD v2.0开发集,RoBERTa设置了一个新的SOTA,提高了0.4个点(EM)和0.6个点(F1)。我们还将RoBERTa提交公SQuA D2.0排行榜,并评估其相对于其他系统的性能。

大多数顶级系统建立在BERT或XLNet。两者都依赖于额外的外部训练数据。相比之下,我们提交的工作没有使用任何其他数据。单一RoBERTa模型优于其他所有单一模型,是不依赖数据扩充的模型中得分最高的。

5.3 RACE 结果:

在RACE中,系统提供一条通道文本、一个相关问题和四个候选答案。系统需要对以下哪项进行分类这四个候选答案是正确的。我们通过将每个候选答案与相应的问题和段落连接起来来改进RoBERTa的这项任务。然后我们对每个这四个序列并将[CLS]经过全连接层进行表示,用于预测正确答案。截断长度大于问题-答案对的128个tokens,甚至还包括通道,以便总长度最多为512个tokens。

  • RACE测试集的结果如所示表7。RoBERTa均取得SOTA。
image.png

6、相关工作:

最近的许多论文都为每个最终任务使用了微调模型的基本方式,并使用某种不同的MLM模型目标进行预训练。然而,较新的方法通过多任务微调、实体嵌入、span预测和自回归预训练的多种变体提高了性能。通过在更多数据上训练更大的模型,性能通常也会得到改善。我们的目标是复制、简化和更好地调整BERT的训练,作为更好地理解所有这些方法的相对性能的参考点。

7、 结论:

在预训练BERT模型时,我们仔细评估了一些设计策略。发现,通过对模型进行更长时间的训练,对更多数据进行更大批量的训练,可以显著提高性能;删除下一句预测目标NSP;长序列训练;以及动态地改变应用于训练数据的mask模式。这些改进称之为RoBERTa,在GLUE, RACE 和 SQuAD方面取得了SOTA,而不需要对GLUE进行多任务微调,也不需要为SQuAD提供额外的数据。

这些结果说明了这些之前被忽视的设计决策的重要性,并表明BERT的预训练目标与最近提出的备选方案相比仍然具有竞争力。此外,我们还使用了一个新的数据集CC-NEWS,并在以下网址发布了预训练和微调的模型和代码:https://github.com/pytorch/fairseq

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

推荐阅读更多精彩内容