解碼Transformer:自注意力機制與編解碼器機制詳述與代碼實現(xiàn)

本文全面探討了Transformer及其衍生模型,深入分析了自注意力機制麻裁、編碼器和解碼器結(jié)構(gòu),并列舉了其編碼實現(xiàn)加深理解薪夕,最后列出基于Transformer的各類模型如BERT原献、GPT等。文章旨在深入解釋Transformer的工作原理讲仰,并展示其在人工智能領(lǐng)域的廣泛影響。

作者 TechLead趁矾,擁有10+年互聯(lián)網(wǎng)服務(wù)架構(gòu)毫捣、AI產(chǎn)品研發(fā)經(jīng)驗饶辙、團(tuán)隊管理經(jīng)驗,同濟(jì)本復(fù)旦碩蹋宦,復(fù)旦機器人智能實驗室成員冷冗,阿里云認(rèn)證的資深架構(gòu)師蒿辙,項目管理專業(yè)人士思灌,上億營收AI產(chǎn)品研發(fā)負(fù)責(zé)人

一泰偿、 Transformer的出現(xiàn)背景

file

Transformer的出現(xiàn)標(biāo)志著自然語言處理領(lǐng)域的一個里程碑。以下將從技術(shù)挑戰(zhàn)蜈垮、自注意力機制的興起耗跛,以及Transformer對整個領(lǐng)域的影響三個方面來全面闡述其背景。

1.1 技術(shù)挑戰(zhàn)與先前解決方案的局限性

RNN和LSTM

早期的序列模型攒发,如RNN和LSTM调塌,雖然在某些場景下表現(xiàn)良好,但在實際操作中遇到了許多挑戰(zhàn):

  • 計算效率:由于RNN的遞歸結(jié)構(gòu)惠猿,它必須逐個處理序列中的元素羔砾,從而使計算無法并行化。
  • 長距離依賴問題:RNN難以捕獲序列中的長距離依賴玩祟,而LSTM雖有所改善盘寡,但仍不完美变隔。

卷積神經(jīng)網(wǎng)絡(luò)(CNN)在序列處理中的嘗試

卷積神經(jīng)網(wǎng)絡(luò)(CNN)通過使用多層卷積可以捕獲局部依賴,并在某些方面改善了長距離依賴的捕獲盒音。但是胁镐,CNN的固定卷積窗口大小限制了其能捕獲的依賴范圍,并且對全局依賴的處理不夠靈活。

1.2 自注意力機制的興起

自注意力機制解決了上述挑戰(zhàn):

  • 并行化計算:通過同時觀察序列中的所有元素廓旬,自注意力機制允許模型并行處理整個序列旁赊。
  • 捕獲長距離依賴:自注意力機制能有效捕獲序列中的長距離依賴,無論距離有多遠(yuǎn)絮识。

這一機制的引入,讓Transformer模型成為了一項技術(shù)突破吩案。

1.3 Transformer的革命性影響

Transformer的出現(xiàn)對整個領(lǐng)域產(chǎn)生了深遠(yuǎn)影響:

  • 設(shè)立新標(biāo)準(zhǔn):在多個NLP任務(wù)中闪湾,Transformer都設(shè)立了新的性能基準(zhǔn)何暇。
  • 推動新研究和應(yīng)用:Transformer的結(jié)構(gòu)推動了許多新的研究方向和實際應(yīng)用,如BERT魂爪、GPT等先進(jìn)模型的誕生耘擂。
  • 跨領(lǐng)域影響:除了自然語言處理,Transformer還對其他領(lǐng)域如生物信息學(xué)、圖像處理等產(chǎn)生了影響悼枢。

二百揭、自注意力機制

file

2.1 概念和工作原理

自注意力機制是一種能夠捕捉序列內(nèi)部元素之間關(guān)系的技術(shù)统翩。它計算序列中每個元素與其他元素的相似度,從而實現(xiàn)全局依賴關(guān)系的捕捉暖释。

  • 權(quán)重計算:通過計算序列中每個元素之間的相似性橄杨,為每個元素分配不同的權(quán)重衷佃。
  • 全局依賴捕獲:能夠捕獲序列中任意距離的依賴關(guān)系克婶,突破了先前模型的局限青柄。

元素的權(quán)重計算

file
  • Query致开、Key、Value結(jié)構(gòu):序列中的每個元素被表示為Query雌桑、Key喇喉、Value三個部分。
  • 相似度度量:使用Query和Key的點積計算元素間的相似度校坑。
  • 權(quán)重分配:通過Softmax函數(shù)將相似度轉(zhuǎn)換為權(quán)重拣技。

例如,考慮一個元素的權(quán)重計算:

import torch
import torch.nn.functional as F

# Query, Key
query = torch.tensor([1, 0.5])
key = torch.tensor([[1, 0], [0, 1]])

# 相似度計算
similarity = query.matmul(key)

# 權(quán)重分配
weights = F.softmax(similarity, dim=-1)
# 輸出:tensor([0.7311, 0.2689])

加權(quán)求和

自注意力機制利用計算的權(quán)重對Value進(jìn)行加權(quán)求和耍目,從而得到每個元素的新表示膏斤。

value = torch.tensor([[1, 2], [3, 4]])
output = weights.matmul(value)
# 輸出:tensor([1.7311, 2.7311])

自注意力與傳統(tǒng)注意力的區(qū)別

自注意力機制與傳統(tǒng)注意力的主要區(qū)別在于:

  • 自我參照:自注意力機制是序列自身對自身的注意,而不是對外部序列邪驮。
  • 全局依賴捕獲:不受局部窗口限制莫辨,能捕獲序列中任意距離的依賴關(guān)系。

計算效率

自注意力機制能夠并行處理整個序列,不受序列長度的限制沮榜,從而實現(xiàn)了顯著的計算效率盘榨。

  • 并行化優(yōu)勢:自注意力計算可同時進(jìn)行,提高了訓(xùn)練和推理速度蟆融。

在Transformer中的應(yīng)用

在Transformer中草巡,自注意力機制是關(guān)鍵組成部分:

  • 多頭注意力:通過多頭注意力,模型能同時學(xué)習(xí)不同的依賴關(guān)系型酥,增強了模型的表現(xiàn)力山憨。
  • 權(quán)重可視化:自注意力權(quán)重可被用來解釋模型的工作方式,增加了可解釋性弥喉。

跨領(lǐng)域應(yīng)用

自注意力機制的影響遠(yuǎn)超自然語言處理:

  • 圖像處理:在圖像分割和識別等任務(wù)中的應(yīng)用郁竟。
  • 語音識別:幫助捕獲語音信號中的時間依賴。

未來趨勢和挑戰(zhàn)

雖然自注意力取得了卓越的成功由境,但仍有研究空間:

  • 計算和存儲需求:高復(fù)雜度帶來了內(nèi)存和計算挑戰(zhàn)棚亩。
  • 可解釋性和理論理解:對于注意力機制的深入理解還有待進(jìn)一步探索。

2.2 計算過程

file

輸入表示

自注意力機制的輸入是一個序列藻肄,通常由一組詞向量或其他元素組成蔑舞。這些元素會被分別轉(zhuǎn)換為Query拒担、Key嘹屯、Value三部分。

import torch.nn as nn

embedding_dim = 64
query_layer = nn.Linear(embedding_dim, embedding_dim)
key_layer = nn.Linear(embedding_dim, embedding_dim)
value_layer = nn.Linear(embedding_dim, embedding_dim)

相似度計算

通過Query和Key的點積計算从撼,得到各元素之間的相似度矩陣州弟。

import torch

embedding_dim = 64

# 假設(shè)一個序列包含三個元素
sequence = torch.rand(3, embedding_dim)

query = query_layer(sequence)
key = key_layer(sequence)
value = value_layer(sequence)

def similarity(query, key):
    return torch.matmul(query, key.transpose(-2, -1)) / (embedding_dim ** 0.5)

權(quán)重分配

將相似度矩陣歸一化為權(quán)重。

def compute_weights(similarity_matrix):
    return torch.nn.functional.softmax(similarity_matrix, dim=-1)

加權(quán)求和

利用權(quán)重矩陣對Value進(jìn)行加權(quán)求和低零,得到輸出婆翔。

def weighted_sum(weights, value):
    return torch.matmul(weights, value)

多頭自注意力

在實際應(yīng)用中,通常使用多頭注意力來捕獲序列中的多方面信息掏婶。

class MultiHeadAttention(nn.Module):
    def __init__(self, embedding_dim, num_heads):
        super(MultiHeadAttention, self).__init__()
        self.num_heads = num_heads
        self.head_dim = embedding_dim // num_heads
        
        self.query_layer = nn.Linear(embedding_dim, embedding_dim)
        self.key_layer = nn.Linear(embedding_dim, embedding_dim)
        self.value_layer = nn.Linear(embedding_dim, embedding_dim)
        self.fc_out = nn.Linear(embedding_dim, embedding_dim)

    def forward(self, query, key, value):
        N = query.shape[0]
        query_len, key_len, value_len = query.shape[1], key.shape[1], value.shape[1]

        # 拆分多個頭
        queries = self.query_layer(query).view(N, query_len, self.num_heads, self.head_dim)
        keys = self.key_layer(key).view(N, key_len, self.num_heads, self.head_dim)
        values = self.value_layer(value).view(N, value_len, self.num_heads, self.head_dim)

        # 相似度計算
        similarity_matrix = torch.einsum("nqhd,nkhd->nhqk", [queries, keys]) / (self.head_dim ** 0.5)

        # 權(quán)重分配
        weights = torch.nn.functional.softmax(similarity_matrix, dim=-1)

        # 加權(quán)求和
        attention = torch.einsum("nhql,nlhd->nqhd", [weights, values])

        # 串聯(lián)多個頭的輸出
        attention = attention.permute(0, 2, 1, 3).contiguous().view(N, query_len, embedding_dim)

        # 通過線性層整合輸出
        output = self.fc_out(attention)

        return output


三啃奴、Transformer的結(jié)構(gòu)

file

3.1 編碼器(Encoder)

file

編碼器是Transformer的核心組成部分之一,它的主要任務(wù)是理解和處理輸入數(shù)據(jù)雄妥。編碼器通過組合自注意力機制最蕾、前饋神經(jīng)網(wǎng)絡(luò)、規(guī)范化層和殘差連接老厌,構(gòu)建了一個強大的序列到序列的映射工具瘟则。自注意力機制使得模型能夠捕獲序列內(nèi)部的復(fù)雜關(guān)系,前饋網(wǎng)絡(luò)則提供了非線性計算能力枝秤。規(guī)范化層和殘差連接則有助于穩(wěn)定訓(xùn)練過程醋拧。
以下是編碼器的各個組件和它們的詳細(xì)描述。

3.1.1 自注意力層

編碼器的第一部分是自注意力層。如之前所述丹壕,自注意力機制使模型能夠關(guān)注輸入序列中的所有位置庆械,并根據(jù)這些信息來編碼每個位置。

class SelfAttentionLayer(nn.Module):
    def __init__(self, embedding_dim, num_heads):
        super(SelfAttentionLayer, self).__init__()
        self.multi_head_attention = MultiHeadAttention(embedding_dim, num_heads)
    
    def forward(self, x):
        return self.multi_head_attention(x, x, x)

3.1.2 前饋神經(jīng)網(wǎng)絡(luò)

自注意力層后菌赖,編碼器包括一個前饋神經(jīng)網(wǎng)絡(luò)(Feed-Forward Neural Network, FFNN)干奢。這個網(wǎng)絡(luò)由兩個線性層和一個激活函數(shù)組成。

class FeedForwardLayer(nn.Module):
    def __init__(self, embedding_dim, ff_dim):
        super(FeedForwardLayer, self).__init__()
        self.fc1 = nn.Linear(embedding_dim, ff_dim)
        self.fc2 = nn.Linear(ff_dim, embedding_dim)
        self.relu = nn.ReLU()
    
    def forward(self, x):
        return self.fc2(self.relu(self.fc1(x)))

3.1.3 規(guī)范化層

為了穩(wěn)定訓(xùn)練和加快收斂速度盏袄,每個自注意力層和前饋層后面都有一個規(guī)范化層(Layer Normalization)忿峻。

layer_norm = nn.LayerNorm(embedding_dim)

3.1.4 殘差連接

Transformer還使用了殘差連接,使得每一層的輸出都與輸入相加辕羽。這有助于防止梯度消失和爆炸逛尚。

output = layer_norm(self_attention(x) + x)
output = layer_norm(feed_forward(output) + output)

3.1.5 編碼器的完整結(jié)構(gòu)

最終的編碼器由N個這樣的層堆疊而成。

class Encoder(nn.Module):
    def __init__(self, num_layers, embedding_dim, num_heads, ff_dim):
        super(Encoder, self).__init__()
        self.layers = nn.ModuleList([
            nn.Sequential(
                SelfAttentionLayer(embedding_dim, num_heads),
                nn.LayerNorm(embedding_dim),
                FeedForwardLayer(embedding_dim, ff_dim),
                nn.LayerNorm(embedding_dim)
            )
            for _ in range(num_layers)
        ])

    def forward(self, x):
        for layer in self.layers:
            x = layer(x)
        return x

3.2 解碼器(Decoder)

file

解碼器負(fù)責(zé)根據(jù)編碼器的輸出和先前生成的部分輸出序列生成目標(biāo)序列刁愿。解碼器采用了與編碼器類似的結(jié)構(gòu)绰寞,但增加了掩碼自注意力層和編碼器-解碼器注意力層,以生成目標(biāo)序列铣口。掩碼確保解碼器僅使用先前的位置生成每個位置的輸出滤钱。編碼器-解碼器注意力層則使解碼器能夠使用編碼器的輸出。通過這種結(jié)構(gòu)脑题,解碼器能夠生成符合上下文和源序列信息的目標(biāo)序列件缸,為許多復(fù)雜的序列生成任務(wù)提供了強大的解決方案。
下面是解碼器的主要組成部分和它們的工作原理叔遂。

3.2.1 自注意力層

解碼器的第一部分是掩碼自注意力層他炊。該層與編碼器中的自注意力層相似,但是添加了一個掩碼已艰,以防止位置關(guān)注其后的位置痊末。

def mask_future_positions(size):
    mask = (torch.triu(torch.ones(size, size)) == 1).transpose(0, 1)
    return mask.float().masked_fill(mask == 0, float('-inf')).masked_fill(mask == 1, float(0.0))

mask = mask_future_positions(sequence_length)

3.2.2 編碼器-解碼器注意力層

解碼器還包括一個編碼器-解碼器注意力層,允許解碼器關(guān)注編碼器的輸出哩掺。

class EncoderDecoderAttention(nn.Module):
    def __init__(self, embedding_dim, num_heads):
        super(EncoderDecoderAttention, self).__init__()
        self.multi_head_attention = MultiHeadAttention(embedding_dim, num_heads)
    
    def forward(self, queries, keys, values):
        return self.multi_head_attention(queries, keys, values)

3.2.3 前饋神經(jīng)網(wǎng)絡(luò)

解碼器也有一個前饋神經(jīng)網(wǎng)絡(luò)凿叠,結(jié)構(gòu)與編碼器中的前饋神經(jīng)網(wǎng)絡(luò)相同。

3.2.4 規(guī)范化層和殘差連接

這些組件也與編碼器中的相同嚼吞,并在每個子層之后使用盒件。

3.2.5 解碼器的完整結(jié)構(gòu)

解碼器由自注意力層、編碼器-解碼器注意力層誊薄、前饋神經(jīng)網(wǎng)絡(luò)履恩、規(guī)范化層和殘差連接組成,通常包括N個這樣的層呢蔫。

class Decoder(nn.Module):
    def __init__(self, num_layers, embedding_dim, num_heads, ff_dim):
        super(Decoder, self).__init__()
        self.layers = nn.ModuleList([
            nn.Sequential(
                SelfAttentionLayer(embedding_dim, num_heads, mask=mask),
                nn.LayerNorm(embedding_dim),
                EncoderDecoderAttention(embedding_dim, num_heads),
                nn.LayerNorm(embedding_dim),
                FeedForwardLayer(embedding_dim, ff_dim),
                nn.LayerNorm(embedding_dim)
            )
            for _ in range(num_layers)
        ])

    def forward(self, x, encoder_output):
        for layer in self.layers:
            x = layer(x, encoder_output)
        return x

四切心、以Transformer為基礎(chǔ)的各類模型

file

以Transformer為基礎(chǔ)的模型不斷涌現(xiàn)飒筑,為各種NLP和其他序列處理任務(wù)提供了強大的工具。從生成文本到理解上下文绽昏,這些模型都具有不同的優(yōu)勢和特點协屡,共同推動了自然語言處理領(lǐng)域的快速發(fā)展。這些模型的共同之處在于全谤,它們都采用了原始Transformer的核心概念肤晓,并在此基礎(chǔ)上做了各種創(chuàng)新和改進(jìn)。未來可期望更多以Transformer為基礎(chǔ)的模型不斷涌現(xiàn)认然,進(jìn)一步拓寬其應(yīng)用范圍和影響力补憾。

4.1 BERT(Bidirectional Encoder Representations from Transformers)

BERT是一種基于Transformer編碼器的模型,用于生成上下文相關(guān)的詞嵌入卷员。不同于傳統(tǒng)的詞嵌入方法盈匾,BERT能夠理解單詞在句子中的具體含義。

主要特點

  • 雙向訓(xùn)練毕骡,捕獲上下文信息
  • 大量預(yù)訓(xùn)練削饵,適用于多種下游任務(wù)

4.2 GPT(Generative Pre-trained Transformer)

與BERT不同,GPT側(cè)重于使用Transformer解碼器生成文本未巫。GPT被預(yù)訓(xùn)練為語言模型窿撬,并可微調(diào)用于各種生成任務(wù)。

主要特點

  • 從左到右生成文本
  • 在多種生成任務(wù)上具有很高的靈活性

4.3 Transformer-XL(Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context)

Transformer-XL通過引入可重復(fù)使用的記憶機制叙凡,解決了原始Transformer模型的上下文長度限制問題劈伴。

主要特點

  • 更長的上下文依賴
  • 記憶機制提高效率

4.4 T5(Text-to-Text Transfer Transformer)

T5模型將所有NLP任務(wù)都視為文本到文本的轉(zhuǎn)換問題。這種統(tǒng)一的框架使得在不同的任務(wù)之間轉(zhuǎn)換變得非常容易狭姨。

主要特點

  • 通用性宰啦,適用于多種NLP任務(wù)
  • 簡化了任務(wù)特定架構(gòu)的需求

4.5 XLNet

XLNet是一種通用自回歸預(yù)訓(xùn)練模型苏遥,結(jié)合了BERT的雙向能力和GPT的自回歸優(yōu)勢饼拍。

主要特點

  • 雙向和自回歸結(jié)合
  • 提供了一種有效的預(yù)訓(xùn)練方法

4.6 DistilBERT

DistilBERT是BERT模型的輕量級版本,保留了大部分性能田炭,但模型大小顯著減小师抄。

主要特點

  • 更少的參數(shù)和計算量
  • 適用于資源有限的場景

4.7 ALBERT(A Lite BERT)

ALBERT是對BERT的另一種優(yōu)化,減少了參數(shù)數(shù)量教硫,同時改善了訓(xùn)練速度和模型性能叨吮。

主要特點

  • 參數(shù)共享
  • 更快的訓(xùn)練速度

五、總結(jié)

Transformer自從被引入以來瞬矩,已經(jīng)深刻改變了自然語言處理和許多其他序列處理任務(wù)的面貌茶鉴。通過其獨特的自注意力機制,Transformer克服了以前模型的許多局限性景用,實現(xiàn)了更高的并行化和更靈活的依賴捕獲涵叮。

在本文中惭蹂,我們詳細(xì)探討了Transformer的以下方面:

  1. 出現(xiàn)背景:了解了Transformer是如何從RNN和CNN的限制中誕生的,以及它是如何通過自注意力機制來處理序列的割粮。
  2. 自注意力機制:詳細(xì)解釋了自注意力機制的計算過程盾碗,以及如何允許模型在不同位置之間建立依賴關(guān)系。
  3. Transformer的結(jié)構(gòu):深入了解了Transformer的編碼器和解碼器的結(jié)構(gòu)舀瓢,以及各個組件如何協(xié)同工作廷雅。
  4. 基于Transformer的各類模型:探討了一系列以Transformer為基礎(chǔ)的模型,如BERT京髓、GPT航缀、T5等,了解了它們的特點和應(yīng)用堰怨。

Transformer不僅推動了自然語言處理領(lǐng)域的研究和應(yīng)用谬盐,還在其他領(lǐng)域,如生物信息學(xué)诚些、圖像分析等飞傀,展示了其潛力。現(xiàn)代許多最先進(jìn)的模型都以Transformer為基礎(chǔ)诬烹,利用其靈活砸烦、高效的結(jié)構(gòu)解決了先前難以解決的問題。

今后绞吁,我們可以期待Transformer和其衍生模型繼續(xù)在更廣泛的領(lǐng)域中扮演重要角色幢痘,不斷創(chuàng)新和推動人工智能領(lǐng)域的發(fā)展。


如有幫助家破,請多關(guān)注
分享AI與云服務(wù)研發(fā)的全維度知識颜说,談?wù)勎易鳛門echLead對技術(shù)的獨特洞察。
TeahLead KrisChang汰聋,10+年的互聯(lián)網(wǎng)和人工智能從業(yè)經(jīng)驗门粪,10年+技術(shù)和業(yè)務(wù)團(tuán)隊管理經(jīng)驗,同濟(jì)軟件工程本科烹困,復(fù)旦工程管理碩士玄妈,阿里云認(rèn)證云服務(wù)資深架構(gòu)師,上億營收AI產(chǎn)品業(yè)務(wù)負(fù)責(zé)人髓梅。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拟蜻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子枯饿,更是在濱河造成了極大的恐慌酝锅,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奢方,死亡現(xiàn)場離奇詭異搔扁,居然都是意外死亡擒权,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門阁谆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碳抄,“玉大人,你說我怎么就攤上這事场绿∑市В” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵焰盗,是天一觀的道長璧尸。 經(jīng)常有香客問我,道長熬拒,這世上最難降的妖魔是什么爷光? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮澎粟,結(jié)果婚禮上蛀序,老公的妹妹穿的比我還像新娘。我一直安慰自己活烙,他們只是感情好徐裸,可當(dāng)我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啸盏,像睡著了一般重贺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上回懦,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天气笙,我揣著相機與錄音,去河邊找鬼怯晕。 笑死潜圃,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贫贝。 我是一名探鬼主播秉犹,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稚晚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起型诚,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤客燕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后狰贯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體也搓,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡赏廓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了傍妒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幔摸。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖颤练,靈堂內(nèi)的尸體忽然破棺而出既忆,到底是詐尸還是另有隱情,我是刑警寧澤嗦玖,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布患雇,位于F島的核電站,受9級特大地震影響宇挫,放射性物質(zhì)發(fā)生泄漏苛吱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一器瘪、第九天 我趴在偏房一處隱蔽的房頂上張望翠储。 院中可真熱鬧,春花似錦橡疼、人聲如沸彰亥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽任斋。三九已至,卻和暖如春耻涛,著一層夾襖步出監(jiān)牢的瞬間废酷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工抹缕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留澈蟆,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓卓研,卻偏偏與公主長得像趴俘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子奏赘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,722評論 2 345

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