一文搞懂變分自編碼器(VAE, CVAE)

變分自編碼,英文是Variational AutoEncoder肴甸,簡(jiǎn)稱VAE寂殉。它是包含隱變量的一種模型

變分自編碼器與對(duì)抗生成網(wǎng)絡(luò)類(lèi)似塑径,均是為了解決數(shù)據(jù)生成問(wèn)題而生的。在自編碼器結(jié)構(gòu)中荣赶,通常需要一個(gè)輸入數(shù)據(jù)捺球,而且所生成的數(shù)據(jù)與輸入數(shù)據(jù)是相同的。但是通常希望生成的數(shù)據(jù)具有一定程度的不同柳沙,這需要輸入隨機(jī)向量并且模型能夠?qū)W習(xí)生成圖像的風(fēng)格化特點(diǎn),因此在后續(xù)研究中以隨機(jī)化向量作為輸入生成特定樣本的對(duì)抗生成網(wǎng)絡(luò)結(jié)構(gòu)便產(chǎn)生了。變分自編碼器同樣的以特定分布的隨機(jī)樣本作為輸入澳泵,并且可以生成相應(yīng)的圖像,從此方面來(lái)看其與對(duì)抗生成網(wǎng)絡(luò)目標(biāo)是相似的兼呵。但是變分自編碼器不需要判別器兔辅,而是使用編碼器來(lái)估計(jì)特定分布』魑梗總體結(jié)構(gòu)來(lái)看與自編碼器結(jié)構(gòu)類(lèi)似维苔,但是中間傳遞向量為特定分布的隨機(jī)向量,這里需要特別區(qū)分:編碼器懂昂、解碼器介时、生成器和判別器

一. VAE原理

先假設(shè)一個(gè)隱變量Z的分布,構(gòu)建一個(gè)從Z到目標(biāo)數(shù)據(jù)X的模型凌彬,即構(gòu)建X=g(Z)沸柔,使得學(xué)出來(lái)的目標(biāo)數(shù)據(jù)與真實(shí)數(shù)據(jù)的概率分布相近

VAE的結(jié)構(gòu)圖如下:

VAE對(duì)每一個(gè)樣本X_k匹配一個(gè)高斯分布,隱變量Z就是從高斯分布中采樣得到的铲敛。對(duì)K個(gè)樣本來(lái)說(shuō)褐澎,每個(gè)樣本的高斯分布假設(shè)為\mathcal N(\mu_k,\sigma_k^2),問(wèn)題就在于如何擬合這些分布伐蒋。VAE構(gòu)建兩個(gè)神經(jīng)網(wǎng)絡(luò)來(lái)進(jìn)行擬合均值與方差工三。即\mu_k=f_1(X_k),log\sigma_k^2=f_2(X_k),擬合log\sigma_k^2的原因是這樣無(wú)需加激活函數(shù)

此外先鱼,VAE讓每個(gè)高斯分布盡可能地趨于標(biāo)準(zhǔn)高斯分布\mathcal N(0,1)俭正。這擬合過(guò)程中的誤差損失則是采用KL散度作為計(jì)算,下面做詳細(xì)推導(dǎo):

VAE與同為生成模型的GMM(高斯混合模型)也有很相似型型,實(shí)際上VAE可看成是GMM的一個(gè)distributed representation的版本段审。GMM是有限個(gè)高斯分布的隱變量z的混合,而VAE可看成是無(wú)窮個(gè)隱變量z的混合,VAE中的z可以是高斯也可以是非高斯的

原始樣本數(shù)據(jù)x的概率分布:
P(x)=\int_Z P(x)P(x|z)dz\tag{1}
假設(shè)z服從標(biāo)準(zhǔn)高斯分布寺枉,先驗(yàn)分布P(x|z)是高斯的抑淫,即x|z \sim N(\mu(z),\sigma(z))\mu(z)姥闪、\sigma(z)是兩個(gè)函數(shù)始苇, 分別是z對(duì)應(yīng)的高斯分布的均值和方差,則P(x)就是在積分域上所有高斯分布的累加:

由于P(z)是已知的筐喳,P(x|z)未知催式,所以求解問(wèn)題實(shí)際上就是求\mu,\sigma這兩個(gè)函數(shù)。最開(kāi)始的目標(biāo)是求解P(x)避归,且希望P(x)越大越好荣月,這等價(jià)于求解關(guān)于x最大對(duì)數(shù)似然:
L=\sum_x logP(x)\tag{2}
logP(x)可變換為:
\begin{aligned} logP(x)&=\int_z q(z|x)logP(x)dz \\ &=\int_z q(z|x)log(\dfrac{P(z,x)}{P(z|x)})dz \\ &=\int_z q(z|x)log(\dfrac{P(z,x)}{q(z|x)}\dfrac{q(z|x)}{P(z|x)})dz\\ &=\int_z q(z|x)log(\dfrac{P(z,x)}{q(z|x)})dz+ \int_z q(z|x)log(\dfrac{q(z|x)}{P(z|x)})dz\\ &=\int_z q(z|x)log(\dfrac{P(x|z)P(z)}{q(z|x)})dz + \int_z q(z|x)log(\dfrac{q(z|x)}{P(z|x)})dz \end{aligned}\tag{3}
到這里我們發(fā)現(xiàn),第二項(xiàng)\int_z q(z|x)log(\dfrac{q(z|x)}{P(z|x)})dz其實(shí)就是qP的KL散度梳毙,即KL(q(z|x)\;||\;P(z|x))哺窄,因?yàn)镵L散度是大于等于0的,所以上式進(jìn)一步可寫(xiě)成:
logP(x)\geq \int_z q(z|x)log(\dfrac{P(x|z)P(z)}{q(z|x)})dz\tag{4}
這樣就找到了一個(gè)下界(lower bound)账锹,也就是式子的右項(xiàng)萌业,即:
L_b=\int_z q(z|x)log(\dfrac{P(x|z)P(z)}{q(z|x)})dz\tag{5}
原式也可表示成:
logP(x)=L_b+KL(q(z|x)\;||\;P(z|x))
為了讓logP(x)越大,目的就是要最大化它的這個(gè)下界

推到這里奸柬,可能會(huì)有個(gè)疑問(wèn):為什么要引入q(z|x)生年,這里的q(z|x)可以是任何分布?

實(shí)際上,因?yàn)楹篁?yàn)分布P(z|x)很難求(intractable)廓奕,所以才用q(z|x)來(lái)逼近這個(gè)后驗(yàn)分布抱婉。在優(yōu)化的過(guò)程中發(fā)現(xiàn),首先q(z|x)logP(x)是完全沒(méi)有關(guān)系的懂从,logP(x)只跟P(z|x)有關(guān)授段,調(diào)節(jié)q(z|x)是不會(huì)影響似然也就是logP(x)的。所以番甩,當(dāng)固定住P(x|z)時(shí)侵贵,調(diào)節(jié)q(z|x)最大化下界L_b,KL則越小缘薛。當(dāng)q(z|x)與不斷逼近后驗(yàn)分布P(z|x)時(shí)窍育,KL散度趨于為0,logP(x)就和L_b等價(jià)宴胧。所以最大化logP(x)就等價(jià)于最大化L_b

回顧L_b
\begin{aligned} L_b&=\int_z q(z|x)log(\dfrac{P(x|z)P(z)}{q(z|x)})dz \\ &=\int_z q(z|x)log(\dfrac{P(z)}{q(z|x)})dz+\int_z q(z|x)logP(x|z)dz \\ &=-KL(q(z|x)\;||\;P(z)) + \int_z q(z|x)logP(x|z)dz \\ &=-KL(q(z|x)\;||\;P(z)) + E_{q(z|x)}[log(P(x|z))] \end{aligned}\tag{6}
顯然漱抓,最大化L_b就是等價(jià)于最小化KL(q(z|x)\;||\;P(z))和最大化E_{q(z|x)}[log(P(x|z))]

第一項(xiàng)恕齐,最小化KL散度:前面已假設(shè)了P(z)是服從標(biāo)準(zhǔn)高斯分布的乞娄,且q(z∣x)是服從高斯分布\mathcal N(\mu,\sigma^2),于是代入計(jì)算可得:
\begin{aligned} KL(q(z|x)\;||\;P(z))=KL(\mathcal N(\mu,\sigma^2)\;||\;\mathcal N(0,1))=&\int\dfrac{1}{\sqrt{2\pi\sigma^2}}e^{\frac{-(x-\mu)^2}{2\sigma^2}} \left( log\dfrac{e^{\frac{-(x-\mu)^2}{2\sigma^2}}/\sqrt{2\pi\sigma^2}}{ e^{\frac{-x^2}{2}}/\sqrt{2\pi} } \right)dx \\&...\text{化簡(jiǎn)得到} \\=&\dfrac{1}{2}\dfrac{1}{\sqrt{2\pi\sigma^2}}\int e^{\frac{-(x-\mu)^2}{2\sigma^2}} \left(-log\sigma^2 +x^2-\dfrac{(x-\mu)^2}{\sigma^2} \right)dx \\=&\dfrac{1}{2}\int \dfrac{1}{\sqrt{2\pi\sigma^2}} e^{\frac{-(x-\mu)^2}{2\sigma^2}} \left(-log\sigma^2 +x^2-\dfrac{(x-\mu)^2}{\sigma^2} \right)dx \end{aligned}\tag{7}
對(duì)上式中的積分進(jìn)一步求解,\dfrac{1}{\sqrt{2\pi\sigma^2}}e^{\frac{-(x-\mu)^2}{2\sigma^2}}實(shí)際就是概率密度f(x)仪或,而概率密度函數(shù)的積分就是1确镊,所以積分第一項(xiàng)等于-log\sigma^2;而又因?yàn)楦咚狗植嫉亩A矩就是E(X^2)=\int x^2f(x)dx=\mu^2+\sigma^2范删,正好對(duì)應(yīng)積分第二項(xiàng)蕾域。又根據(jù)方差的定義可知\sigma=\int (x-\mu)dx,所以積分第三項(xiàng)為-1

最終化簡(jiǎn)得到的結(jié)果如下:
KL(q(z|x)\;||\;P(z))=KL(\mathcal N(\mu,\sigma^2)\;||\;\mathcal N(0,1))=\dfrac{1}{2}(-log\sigma^2+\mu^2+\sigma^2-1)\tag{8}
第二項(xiàng)到旦,最大化期望旨巷。也就是表明在給定q(z|x)(編碼器輸出)的情況下P(x∣z)(解碼器輸出)的值盡可能高

  1. 第一步,利用encoder的神經(jīng)網(wǎng)絡(luò)計(jì)算出均值與方差添忘,從中采樣得到z采呐,這一過(guò)程就對(duì)應(yīng)式子中的q(z∣x)
  2. 第二步,利用decoder的N計(jì)算z的均值方差昔汉,讓均值(或也考慮方差)越接近x,則產(chǎn)生x的幾率logP(x|z)越大靶病,對(duì)應(yīng)于式子中的最大化logP(x∣z)這一部分

重參數(shù)技巧

最后模型在實(shí)現(xiàn)的時(shí)候,有一個(gè)重參數(shù)技巧沪停,就是想從高斯分布\mathcal N(\mu,\sigma^2)中采樣Z時(shí),其實(shí)是相當(dāng)于從\mathcal N(0,1)中采樣一個(gè)\epsilon,然后再來(lái)計(jì)算 Z=\mu+\epsilon\times\sigma躬它。這么做的原因是祖娘,采樣這個(gè)操作是不可導(dǎo)的失尖,而采樣的結(jié)果是可導(dǎo)的,這樣做個(gè)參數(shù)變換渐苏,Z=\mu+\epsilon\times\sigma這個(gè)就可以參與梯度下降掀潮,模型就可以訓(xùn)練了

class VAE(nn.Module):
    """Implementation of VAE(Variational Auto-Encoder)"""
    def __init__(self):
        super(VAE, self).__init__()
        self.fc1 = nn.Linear(784, 200)
        self.fc2_mu = nn.Linear(200, 10)
        self.fc2_log_std = nn.Linear(200, 10)
        self.fc3 = nn.Linear(10, 200)
        self.fc4 = nn.Linear(200, 784)
    def encode(self, x):
        h1 = F.relu(self.fc1(x))
        mu = self.fc2_mu(h1)
        log_std = self.fc2_log_std(h1)
        return mu, log_std
    def decode(self, z):
        h3 = F.relu(self.fc3(z))
        recon = torch.sigmoid(self.fc4(h3))  # use sigmoid because the input image's pixel is between 0-1
        return recon
    def reparametrize(self, mu, log_std):
        std = torch.exp(log_std)
        eps = torch.randn_like(std)  # simple from standard normal distribution
        z = mu + eps * std
        return z
    def forward(self, x):
        mu, log_std = self.encode(x)
        z = self.reparametrize(mu, log_std)
        recon = self.decode(z)
        return recon, mu, log_std
    def loss_function(self, recon, x, mu, log_std) -> torch.Tensor:
        recon_loss = F.mse_loss(recon, x, reduction="sum")  # use "mean" may have a bad effect on gradients
        kl_loss = -0.5 * (1 + 2*log_std - mu.pow(2) - torch.exp(2*log_std))
        kl_loss = torch.sum(kl_loss)
        loss = recon_loss + kl_loss
        return loss

二. CVAE原理

在條件變分自編碼器(CVAE)中,模型的輸出就不是\mathbf{x}_j了琼富,而是對(duì)應(yīng)于輸入\mathbf{x}_i的任務(wù)相關(guān)數(shù)據(jù)\mathbf{y}_i仪吧,不過(guò)套路和VAE是一樣的,這次的最大似然估計(jì)變成了\log p_{\theta}(\mathbf{Y}\mid\mathbf{X})鞠眉,即::
\begin{aligned} \log p_{\theta}(\mathbf{Y}\mid\mathbf{X})&=1\cdot\log p_{\theta}(\mathbf{Y}\mid\mathbf{X})\\ &=\left(\int_{\mathbf{z}}q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})\mathrmckaog4i\mathbf{z}\right)\log p_{\theta}(\mathbf{Y}\mid\mathbf{X}) \\ &=\int_{\mathbf{z}}q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})\log p_{\theta}(\mathbf{Y}\mid\mathbf{X})\mathrma6akuue\mathbf{z}\\ &=\int_{\mathbf{z}}q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})\log\frac{p_{\theta}(\mathbf{z}, \mathbf{X}, \mathbf{Y})}{p_{\theta}(\mathbf{z}\mid\mathbf{X},\mathbf{Y})p_{\theta}(\mathbf{X})}\mathrmgyoeeo6\mathbf{z}\\ &=\int_{\mathbf{z}}q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})\log\frac{q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})}{p_{\theta}(\mathbf{z}\mid\mathbf{X},\mathbf{Y})}\frac{p_{\theta}(\mathbf{z}, \mathbf{X}, \mathbf{Y})}{q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})p_{\theta}(\mathbf{X})}\mathrmiikoeu4\mathbf{z}\\ &=\int_{\mathbf{z}}q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})\log\frac{q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})}{p_{\theta}(\mathbf{z}\mid\mathbf{X},\mathbf{Y})}\mathrmqk666c4\mathbf{z}~+~\int_{\mathbf{z}}q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})\log\frac{p_{\theta}(\mathbf{z}, \mathbf{X}, \mathbf{Y})}{q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})p_{\theta}(\mathbf{X})}\mathrmywk4c6s\mathbf{z}\\ &=D_{K L}(q_{\phi}, p_{\theta}) ~+~ \ell(p_{\theta}, q_{\phi})\end{aligned} \tag{9}
ELBO(Empirical Lower Bound)\ell(p_{\theta}, q_{\phi})薯鼠,進(jìn)一步:
\begin{aligned} \ell(p_{\theta}, q_{\phi})&=\int_{\mathbf{z}}q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})\log\frac{p_{\theta}(\mathbf{z}, \mathbf{X}, \mathbf{Y})}{q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})p_{\theta}(\mathbf{X})}\mathrmags6iss\mathbf{z}\\ &=\int_{\mathbf{z}}q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})\log\frac{p_{\theta}(\mathbf{Y}\mid\mathbf{X},\mathbf{Z})p_{\theta}(\mathbf{Z}\mid\mathbf{X})p_{\theta}(\mathbf{X})}{q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})p_{\theta}(\mathbf{X})}\mathrmok0kqco\mathbf{z}\\ &=\int_{\mathbf{z}}q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})\log\frac{p_{\theta}(\mathbf{Z}\mid\mathbf{X})}{q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})}\mathrmgmc0k6s\mathbf{z}~+~\int_{\mathbf{z}}q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})\log p_{\theta}(\mathbf{Y}\mid\mathbf{X,\mathbf{Z}})\mathrmawyg6w4\mathbf{z}\\ &=-D_{K L}(q_{\phi}(\mathbf{z}\mid\mathbf{X}, \mathbf{Y})\mid p_{\theta}(\mathbf{Z}\mid\mathbf{X}))~+~\mathbb{E}_{q_{\phi}}[\log p_{\theta}(\mathbf{Y}\mid\mathbf{X},\mathbf{Z})] \end{aligned} \tag{10}
網(wǎng)絡(luò)結(jié)構(gòu)包含三個(gè)部分:

  • 先驗(yàn)網(wǎng)絡(luò)p_{\theta}(\mathbf{z}\mid\mathbf{X}),如下圖(b)所示
  • Recognition網(wǎng)絡(luò)q_{\phi}(\mathbf{z}\mid\mathbf{X},\mathbf{Y})械蹋, 如下圖(c)所示D
  • ecoder網(wǎng)絡(luò)p_{\theta}(\mathbf{Y}\mid\mathbf{X},\mathbf{Z})出皇,如下圖(b)所示
class CVAE(nn.Module):
    """Implementation of CVAE(Conditional Variational Auto-Encoder)"""
    def __init__(self, feature_size, class_size, latent_size):
        super(CVAE, self).__init__()
        self.fc1 = nn.Linear(feature_size + class_size, 200)
        self.fc2_mu = nn.Linear(200, latent_size)
        self.fc2_log_std = nn.Linear(200, latent_size)
        self.fc3 = nn.Linear(latent_size + class_size, 200)
        self.fc4 = nn.Linear(200, feature_size)
    def encode(self, x, y):
        h1 = F.relu(self.fc1(torch.cat([x, y], dim=1)))  # concat features and labels
        mu = self.fc2_mu(h1)
        log_std = self.fc2_log_std(h1)
        return mu, log_std
    def decode(self, z, y):
        h3 = F.relu(self.fc3(torch.cat([z, y], dim=1)))  # concat latents and labels
        recon = torch.sigmoid(self.fc4(h3))  # use sigmoid because the input image's pixel is between 0-1
        return recon
    def reparametrize(self, mu, log_std):
        std = torch.exp(log_std)
        eps = torch.randn_like(std)  # simple from standard normal distribution
        z = mu + eps * std
        return z
    def forward(self, x, y):
        mu, log_std = self.encode(x, y)
        z = self.reparametrize(mu, log_std)
        recon = self.decode(z, y)
        return recon, mu, log_std
    def loss_function(self, recon, x, mu, log_std) -> torch.Tensor:
        recon_loss = F.mse_loss(recon, x, reduction="sum")  # use "mean" may have a bad effect on gradients
        kl_loss = -0.5 * (1 + 2*log_std - mu.pow(2) - torch.exp(2*log_std))
        kl_loss = torch.sum(kl_loss)
        loss = recon_loss + kl_loss
        return loss
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哗戈,隨后出現(xiàn)的幾起案子郊艘,更是在濱河造成了極大的恐慌,老刑警劉巖谱醇,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暇仲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡副渴,警方通過(guò)查閱死者的電腦和手機(jī)奈附,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)煮剧,“玉大人斥滤,你說(shuō)我怎么就攤上這事将鸵。” “怎么了佑颇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵顶掉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我挑胸,道長(zhǎng)痒筒,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任茬贵,我火速辦了婚禮簿透,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘解藻。我一直安慰自己老充,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布螟左。 她就那樣靜靜地躺著啡浊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪胶背。 梳的紋絲不亂的頭發(fā)上巷嚣,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音奄妨,去河邊找鬼涂籽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛砸抛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播树枫,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼直焙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了砂轻?” 一聲冷哼從身側(cè)響起奔誓,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎搔涝,沒(méi)想到半個(gè)月后厨喂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庄呈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蜕煌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诬留。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡斜纪,死狀恐怖贫母,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盒刚,我是刑警寧澤腺劣,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站因块,受9級(jí)特大地震影響橘原,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涡上,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一趾断、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吓懈,春花似錦歼冰、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至甘穿,卻和暖如春腮恩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背温兼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工秸滴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人募判。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓荡含,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親届垫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子释液,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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