cs231n課程筆記:神經(jīng)網(wǎng)絡(luò)(二)

筆記參考:https://zhuanlan.zhihu.com/p/21407711?refer=intelligentunit
感謝原作者的翻譯!!
非原創(chuàng),禁止轉(zhuǎn)載本文


內(nèi)容列表:

    1. 設(shè)置數(shù)據(jù)和模型
    • 1.1 數(shù)據(jù)預(yù)處理
    • 1.2 權(quán)重初始化
    • 1.3 批量歸一化(Batch Normalization)
    • 1.4 正則化(L2/L1/Maxnorm/Dropout)
    1. 損失函數(shù)
    1. 小結(jié)

1. 設(shè)置數(shù)據(jù)和模型

在上一節(jié)中介紹了神經(jīng)元的模型孙技,它在計(jì)算內(nèi)積后進(jìn)行非線性激活函數(shù)計(jì)算夜赵,神經(jīng)網(wǎng)絡(luò)將這些神經(jīng)元組織成各個(gè)層明棍。這些做法共同定義了評(píng)分函數(shù)(score function)的新形式,該形式是從前面線性分類章節(jié)中的簡(jiǎn)單線性映射發(fā)展而來(lái)的寇僧。具體來(lái)說(shuō)摊腋,神經(jīng)網(wǎng)絡(luò)就是進(jìn)行了一系列的線性映射與非線性激活函數(shù)交織的運(yùn)算沸版。

1.1 數(shù)據(jù)預(yù)處理

關(guān)于數(shù)據(jù)預(yù)處理我們有3個(gè)常用的符號(hào),數(shù)據(jù)矩陣X兴蒸,假設(shè)其尺寸是[N x D](N是數(shù)據(jù)樣本的數(shù)量视粮,D是數(shù)據(jù)的維度)。

均值減法(Mean subtraction)是預(yù)處理最常用的形式橙凳。它對(duì)數(shù)據(jù)中每個(gè)獨(dú)立特征減去平均值蕾殴,從幾何上可以理解為在每個(gè)維度上都將數(shù)據(jù)云的中心都遷移到原點(diǎn)。在numpy中岛啸,該操作可以通過(guò)代碼X -= np.mean(X, axis=0)實(shí)現(xiàn)钓觉。而對(duì)于圖像,更常用的是對(duì)所有像素都減去一個(gè)值坚踩,可以用X -= np.mean(X)實(shí)現(xiàn)荡灾,也可以在3個(gè)顏色通道上分別操作。

歸一化(Normalization)是指將數(shù)據(jù)的所有維度都?xì)w一化瞬铸,使其數(shù)值范圍都近似相等批幌。有兩種常用方法可以實(shí)現(xiàn)歸一化。第一種是先對(duì)數(shù)據(jù)做零中心化(zero-centered)處理嗓节,然后每個(gè)維度都除以其標(biāo)準(zhǔn)差逼裆,實(shí)現(xiàn)代碼為X /= np.std(X, axis=0)。第二種方法是對(duì)每個(gè)維度都做歸一化赦政,使得每個(gè)維度的最大和最小值是1和-1胜宇。這個(gè)預(yù)處理操作只有在確信不同的輸入特征有不同的數(shù)值范圍(或計(jì)量單位)時(shí)才有意義窝稿,但要注意預(yù)處理操作的重要性幾乎等同于學(xué)習(xí)算法本身美莫。在圖像處理中,由于像素的數(shù)值范圍幾乎是一致的(都在0-255之間)宗挥,所以進(jìn)行這個(gè)額外的預(yù)處理步驟并不是很必要掰派。

一般數(shù)據(jù)預(yù)處理流程:左邊:原始的2維輸入數(shù)據(jù)从诲。中間:在每個(gè)維度上都減去平均值后得到零中心化數(shù)據(jù),現(xiàn)在數(shù)據(jù)云是以原點(diǎn)為中心的靡羡。右邊:每個(gè)維度都除以其標(biāo)準(zhǔn)差來(lái)調(diào)整其數(shù)值范圍系洛。紅色的線指出了數(shù)據(jù)各維度的數(shù)值范圍,在中間的零中心化數(shù)據(jù)的數(shù)值范圍不同略步,但在右邊歸一化數(shù)據(jù)中數(shù)值范圍相同描扯。

PCA和白化(Whitening)是另一種預(yù)處理形式。在這種處理中趟薄,先對(duì)數(shù)據(jù)進(jìn)行零中心化處理绽诚,然后計(jì)算協(xié)方差矩陣,它展示了數(shù)據(jù)中的相關(guān)性結(jié)構(gòu)。

# 假設(shè)輸入數(shù)據(jù)矩陣X的尺寸為[N x D]
X -= np.mean(X, axis = 0) # 對(duì)數(shù)據(jù)進(jìn)行零中心化(重要)
cov = np.dot(X.T, X) / X.shape[0] # 得到數(shù)據(jù)的協(xié)方差矩陣

數(shù)據(jù)協(xié)方差矩陣的第(i, j)個(gè)元素是數(shù)據(jù)第i個(gè)和第j個(gè)維度的協(xié)方差恩够。具體來(lái)說(shuō)卒落,該矩陣的對(duì)角線上的元素是方差。還有蜂桶,協(xié)方差矩陣是對(duì)稱和半正定的儡毕。我們可以對(duì)數(shù)據(jù)協(xié)方差矩陣進(jìn)行SVD(奇異值分解)運(yùn)算。

U,S,V = np.linalg.svd(cov)

U的列是特征向量扑媚,S是裝有奇異值的1維數(shù)組(因?yàn)閏ov是對(duì)稱且半正定的腰湾,所以S中元素是特征值的平方)。為了去除數(shù)據(jù)相關(guān)性钦购,將已經(jīng)零中心化處理過(guò)的原始數(shù)據(jù)投影到特征基準(zhǔn)上:

Xrot = np.dot(X,U) # 對(duì)數(shù)據(jù)去相關(guān)性

為啥這里就去相關(guān)了?我還是要學(xué)習(xí)一個(gè)肮酉簟Q禾摇!导犹、唱凯、、

注意U的列是標(biāo)準(zhǔn)正交向量的集合(范式為1谎痢,列之間標(biāo)準(zhǔn)正交)磕昼,所以可以把它們看做標(biāo)準(zhǔn)正交基向量。因此节猿,投影對(duì)應(yīng)x中的數(shù)據(jù)的一個(gè)旋轉(zhuǎn)票从,旋轉(zhuǎn)產(chǎn)生的結(jié)果就是新的特征向量。如果計(jì)算Xrot的協(xié)方差矩陣滨嘱,將會(huì)看到它是對(duì)角對(duì)稱的峰鄙。np.linalg.svd的一個(gè)良好性質(zhì)是在它的返回值U中,特征向量是按照特征值的大小排列的太雨。我們可以利用這個(gè)性質(zhì)來(lái)對(duì)數(shù)據(jù)降維吟榴,只要使用前面的小部分特征向量,丟棄掉那些包含的數(shù)據(jù)沒(méi)有方差的維度囊扳。 這個(gè)操作也被稱為主成分分析( Principal Component Analysis 簡(jiǎn)稱PCA)降維:

Xrot_reduced = np.dot(X, U[:,:100]) # Xrot_reduced 變成 [N x 100]

經(jīng)過(guò)上面的操作吩翻,將原始的數(shù)據(jù)集的大小由[N x D]降到了[N x 100],留下了數(shù)據(jù)中包含最大方差的100個(gè)維度锥咸。通常使用PCA降維過(guò)的數(shù)據(jù)訓(xùn)練線性分類器和神經(jīng)網(wǎng)絡(luò)會(huì)達(dá)到非常好的性能效果狭瞎,同時(shí)還能節(jié)省時(shí)間和存儲(chǔ)器空間。

白化(whitening)搏予。白化操作的輸入是特征基準(zhǔn)上的數(shù)據(jù)脚作,然后對(duì)每個(gè)維度除以其特征值來(lái)對(duì)數(shù)值范圍進(jìn)行歸一化。該變換的幾何解釋是:如果數(shù)據(jù)服從多變量的高斯分布,那么經(jīng)過(guò)白化后球涛,數(shù)據(jù)的分布將會(huì)是一個(gè)均值為零劣针,且協(xié)方差相等的矩陣。該操作的代碼如下:

# 對(duì)數(shù)據(jù)進(jìn)行白化操作:
# 除以特征值 
Xwhite = Xrot / np.sqrt(S + 1e-5)

警告:夸大的噪聲亿扁。注意分母中添加了1e-5(或一個(gè)更小的常量)來(lái)防止分母為0捺典。該變換的一個(gè)缺陷是在變換的過(guò)程中可能會(huì)夸大數(shù)據(jù)中的噪聲,這是因?yàn)樗鼘⑺芯S度都拉伸到相同的數(shù)值范圍从祝,這些維度中也包含了那些只有極少差異性(方差小)而大多是噪聲的維度襟己。在實(shí)際操作中,這個(gè)問(wèn)題可以用更強(qiáng)的平滑來(lái)解決(例如:采用比1e-5更大的值)牍陌。

這里是真的不懂擎浴。。毒涧。

PCA/白化贮预。左邊是二維的原始數(shù)據(jù)。中間:經(jīng)過(guò)PCA操作的數(shù)據(jù)契讲》峦蹋可以看出數(shù)據(jù)首先是零中心的,然后變換到了數(shù)據(jù)協(xié)方差矩陣的基準(zhǔn)軸上捡偏。這樣就對(duì)數(shù)據(jù)進(jìn)行了解相關(guān)(協(xié)方差矩陣變成對(duì)角陣)唤冈。右邊:每個(gè)維度都被特征值調(diào)整數(shù)值范圍,將數(shù)據(jù)協(xié)方差矩陣變?yōu)閱挝痪仃囈啊膸缀紊峡茨愫纾褪菍?duì)數(shù)據(jù)在各個(gè)方向上拉伸壓縮,使之變成服從高斯分布的一個(gè)數(shù)據(jù)點(diǎn)分布彤避。

舉例
我們可以使用CIFAR-10數(shù)據(jù)將這些變化可視化出來(lái)售葡。CIFAR-10訓(xùn)練集的大小是50000x3072,其中每張圖片都可以拉伸為3072維的行向量忠藤。我們可以計(jì)算[3072 x 3072]的協(xié)方差矩陣然后進(jìn)行奇異值分解(比較耗費(fèi)計(jì)算性能)挟伙,那么經(jīng)過(guò)計(jì)算的特征向量看起來(lái)是什么樣子呢?

最左:一個(gè)用于演示的集合模孩,含49張圖片尖阔。左二:3072個(gè)特征值向量中的前144個(gè)≌ジ溃靠前面的特征向量解釋了數(shù)據(jù)中大部分的方差介却,可以看見(jiàn)它們與圖像中較低的頻率相關(guān)。(求問(wèn)咋看出來(lái)與圖像低頻相關(guān)的块茁?...)第三張是49張經(jīng)過(guò)了PCA降維處理的圖片齿坷,展示了144個(gè)特征向量桂肌。這就是說(shuō),展示原始圖像是每個(gè)圖像用3072維的向量永淌,向量中的元素是圖片上某個(gè)位置的像素在某個(gè)顏色通道中的亮度值崎场。而現(xiàn)在每張圖片只使用了一個(gè)144維的向量,其中每個(gè)元素表示了特征向量對(duì)于組成這張圖片的貢獻(xiàn)度遂蛀。為了讓圖片能夠正常顯示谭跨,需要將144維度重新變成基于像素基準(zhǔn)的3072個(gè)數(shù)值。因?yàn)閁是一個(gè)旋轉(zhuǎn)李滴,可以通過(guò)乘以U.transpose()[:144,:]來(lái)實(shí)現(xiàn)螃宙,然后將得到的3072個(gè)數(shù)值可視化∷鳎可以看見(jiàn)圖像變得有點(diǎn)模糊了谆扎,這正好說(shuō)明前面的特征向量獲取了較低的頻率。然而芹助,大多數(shù)信息還是保留了下來(lái)堂湖。最右:將“白化”后的數(shù)據(jù)進(jìn)行顯示。其中144個(gè)維度中的方差都被壓縮到了相同的數(shù)值范圍周瞎。然后144個(gè)白化后的數(shù)值通過(guò)乘以U.transpose()[:144,:]轉(zhuǎn)換到圖像像素基準(zhǔn)上∶缢酰現(xiàn)在較低的頻率(代表了大多數(shù)方差)可以忽略不計(jì)了饵蒂,較高的頻率(代表相對(duì)少的方差)就被夸大了声诸。

實(shí)踐操作。在這個(gè)筆記中提到PCA和白化主要是為了介紹的完整性退盯,實(shí)際上在卷積神經(jīng)網(wǎng)絡(luò)中并不會(huì)采用這些變換彼乌。然而對(duì)數(shù)據(jù)進(jìn)行零中心化操作還是非常重要的,對(duì)每個(gè)像素進(jìn)行歸一化也很常見(jiàn)渊迁。

常見(jiàn)錯(cuò)誤慰照。進(jìn)行預(yù)處理很重要的一點(diǎn)是:任何預(yù)處理策略(比如數(shù)據(jù)均值)都只能在訓(xùn)練集數(shù)據(jù)上進(jìn)行計(jì)算,算法訓(xùn)練完畢后再應(yīng)用到驗(yàn)證集或者測(cè)試集上琉朽。例如毒租,如果先計(jì)算整個(gè)數(shù)據(jù)集圖像的平均值然后每張圖片都減去平均值,最后將整個(gè)數(shù)據(jù)集分成訓(xùn)練/驗(yàn)證/測(cè)試集箱叁,那么這個(gè)做法是錯(cuò)誤的墅垮。應(yīng)該怎么做呢?應(yīng)該先分成訓(xùn)練/驗(yàn)證/測(cè)試集耕漱,只是從訓(xùn)練集中求圖片平均值算色,然后各個(gè)集(訓(xùn)練/驗(yàn)證/測(cè)試集)中的圖像再減去這個(gè)平均值。

1.2 權(quán)重初始化

我們已經(jīng)看到如何構(gòu)建一個(gè)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)并對(duì)數(shù)據(jù)進(jìn)行預(yù)處理螟够,但是在開(kāi)始訓(xùn)練網(wǎng)絡(luò)之前灾梦,還需要初始化網(wǎng)絡(luò)的參數(shù)峡钓。

錯(cuò)誤:全零初始化。如果網(wǎng)絡(luò)中的每個(gè)神經(jīng)元都計(jì)算出同樣的輸出若河,然后它們就會(huì)在反向傳播中計(jì)算出同樣的梯度能岩,從而進(jìn)行同樣的參數(shù)更新。換句話說(shuō)牡肉,如果權(quán)重被初始化為同樣的值捧灰,神經(jīng)元之間就失去了不對(duì)稱性的源頭。(具體Ng的教程也講過(guò))

小隨機(jī)數(shù)初始化统锤。因此毛俏,權(quán)重初始值要非常接近0又不能等于0。解決方法就是將權(quán)重初始化為很小的數(shù)值饲窿,以此來(lái)打破對(duì)稱性煌寇。其思路是:如果神經(jīng)元?jiǎng)傞_(kāi)始的時(shí)候是隨機(jī)且不相等的,那么它們將計(jì)算出不同的更新逾雄,并將自身變成整個(gè)網(wǎng)絡(luò)的不同部分阀溶。小隨機(jī)數(shù)權(quán)重初始化的實(shí)現(xiàn)方法是:W = 0.01 * np.random.randn(D,H)。其中randn函數(shù)是基于零均值和標(biāo)準(zhǔn)差的一個(gè)高斯分布來(lái)生成隨機(jī)數(shù)的鸦泳。根據(jù)這個(gè)式子银锻,每個(gè)神經(jīng)元的權(quán)重向量都被初始化為一個(gè)隨機(jī)向量,而這些隨機(jī)向量又服從一個(gè)多變量高斯分布做鹰,這樣在輸入空間中击纬,所有的神經(jīng)元的指向是隨機(jī)的。也可以使用均勻分布生成的隨機(jī)數(shù)钾麸,但是從實(shí)踐結(jié)果來(lái)看更振,對(duì)于算法的結(jié)果影響極小。

警告(缺點(diǎn))饭尝。并不是小數(shù)值一定會(huì)得到好的結(jié)果肯腕。例如,一個(gè)神經(jīng)網(wǎng)絡(luò)的層中的權(quán)重值很小钥平,那么在反向傳播的時(shí)候就會(huì)計(jì)算出非常小的梯度(因?yàn)樘荻扰c權(quán)重值是成比例的)实撒。這就會(huì)很大程度上減小反向傳播中的“梯度信號(hào)”,在深度網(wǎng)絡(luò)中涉瘾,就會(huì)出現(xiàn)問(wèn)題知态。

使用1/sqrt(n)校準(zhǔn)方差。上面做法存在一個(gè)問(wèn)題睡汹,隨著輸入數(shù)據(jù)量的增長(zhǎng)肴甸,隨機(jī)初始化的神經(jīng)元的輸出數(shù)據(jù)的分布中的方差也在增大。我們可以除以輸入數(shù)據(jù)量的平方根來(lái)調(diào)整其數(shù)值范圍囚巴,這樣神經(jīng)元輸出的方差就歸一化到1了原在。也就是說(shuō)友扰,建議將神經(jīng)元的權(quán)重向量初始化為:w = np.random.randn(n) / sqrt(n)。其中n是輸入數(shù)據(jù)的數(shù)量庶柿。這樣就保證了網(wǎng)絡(luò)中所有神經(jīng)元起始時(shí)有近似同樣的輸出分布村怪。實(shí)踐經(jīng)驗(yàn)證明,這樣做可以提高收斂的速度浮庐。

上述結(jié)論的推導(dǎo)過(guò)程如下:假設(shè)權(quán)重 w 和輸入 x 之間的內(nèi)積為

這是還沒(méi)有進(jìn)行非線性激活函數(shù)運(yùn)算之前的原始數(shù)值甚负。我們可以檢查 s 的方差:

在前兩步,使用了方差的性質(zhì)审残。在第三步梭域,因?yàn)榧僭O(shè)輸入和權(quán)重的平均值都是0,所以E[xi] = E[wi] = 0搅轿。注意這并不是一般化情況病涨,比如在ReLU單元中均值就為正。在最后一步璧坟,我們假設(shè)所有的 wi, xi 都服從同樣的分布既穆。從這個(gè)推導(dǎo)過(guò)程我們可以看見(jiàn),如果想要 s 有和輸入 x 一樣的方差雀鹃,那么在初始化的時(shí)候必須保證每個(gè)權(quán)重 w 的方差是 1/n幻工。又因?yàn)閷?duì)于一個(gè)隨機(jī)變量 X 和標(biāo)量 a ,有 Var(aX) = a2Var(X) 黎茎,這就說(shuō)明可以基于一個(gè)標(biāo)準(zhǔn)高斯分布囊颅,然后乘以 a = sqrt(1/n) ,使其方差為 1/n 工三,于是得出:w = np.random.randn(n) / sqrt(n)迁酸。

該主題下最新的一篇論文是:Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification先鱼,作者是He等人俭正。文中給出了一種針對(duì)ReLU神經(jīng)元的特殊初始化,并給出結(jié)論:網(wǎng)絡(luò)中神經(jīng)元的方差應(yīng)該是 2.0/n 焙畔。代碼為w = np.random.randn(n) * sqrt(2.0/n)掸读。這個(gè)形式是神經(jīng)網(wǎng)絡(luò)算法使用ReLU神經(jīng)元時(shí)的當(dāng)前最佳推薦

稀疏初始化(Sparse initialization)宏多。另一個(gè)處理非標(biāo)定方差的方法是將所有權(quán)重矩陣設(shè)為0儿惫,但是為了打破對(duì)稱性,每個(gè)神經(jīng)元都同下一層固定數(shù)目的神經(jīng)元隨機(jī)連接(其權(quán)重?cái)?shù)值由一個(gè)小的高斯分布生成)伸但。一個(gè)比較典型的連接數(shù)目是10個(gè)肾请。

偏置(biases)的初始化。通常將偏置初始化為0更胖,這是因?yàn)殡S機(jī)小數(shù)值權(quán)重矩陣已經(jīng)打破了對(duì)稱性铛铁。對(duì)于ReLU非線性激活函數(shù)隔显,有研究人員喜歡使用如0.01這樣的小數(shù)值常量作為所有偏置的初始值,這是因?yàn)樗麄冋J(rèn)為這樣做能讓所有的ReLU單元一開(kāi)始就激活饵逐,這樣就能保存并傳播一些梯度括眠。然而,這樣做是不是總是能提高算法性能并不清楚(有時(shí)候?qū)嶒?yàn)結(jié)果反而顯示性能更差)倍权,所以通常還是使用0來(lái)初始化偏置參數(shù)掷豺。

實(shí)踐。當(dāng)前的推薦是使用ReLU激活函數(shù)薄声,并且使用w = np.random.randn(n) * sqrt(2.0/n)來(lái)進(jìn)行權(quán)重初始化当船,關(guān)于這一點(diǎn),這篇文章有討論默辨。

1.3 批量歸一化(Batch Normalization)

批量歸一化是loffe和Szegedy最近才提出的方法生年,該方法減輕了如何合理初始化神經(jīng)網(wǎng)絡(luò)這個(gè)棘手問(wèn)題帶來(lái)的頭痛:),其做法是讓激活數(shù)據(jù)在訓(xùn)練開(kāi)始前通過(guò)一個(gè)網(wǎng)絡(luò)廓奕,網(wǎng)絡(luò)處理數(shù)據(jù)使其服從標(biāo)準(zhǔn)高斯分布抱婉。因?yàn)闅w一化是一個(gè)簡(jiǎn)單可求導(dǎo)的操作,所以上述思路是可行的桌粉。在實(shí)現(xiàn)層面蒸绩,應(yīng)用這個(gè)技巧通常意味著全連接層(或者是卷積層,后續(xù)會(huì)講)與激活函數(shù)之間添加一個(gè)BatchNorm層铃肯。對(duì)于這個(gè)技巧本節(jié)不會(huì)展開(kāi)講患亿,因?yàn)樯厦娴膮⒖嘉墨I(xiàn)中已經(jīng)講得很清楚了,需要知道的是在神經(jīng)網(wǎng)絡(luò)中使用批量歸一化已經(jīng)變得非常常見(jiàn)押逼。在實(shí)踐中步藕,使用了批量歸一化的網(wǎng)絡(luò)對(duì)于不好的初始值有更強(qiáng)的魯棒性。最后一句話總結(jié):批量歸一化可以理解為在網(wǎng)絡(luò)的每一層之前都做預(yù)處理挑格,只是這種操作以另一種方式與網(wǎng)絡(luò)集成在了一起咙冗。

1.4 正則化

有不少方法是通過(guò)控制神經(jīng)網(wǎng)絡(luò)的容量來(lái)防止其過(guò)擬合的:

L2正則化可能是最常用的正則化方法了∑可以通過(guò)懲罰目標(biāo)函數(shù)中所有參數(shù)的平方將其實(shí)現(xiàn)雾消。即對(duì)于網(wǎng)絡(luò)中的每個(gè)權(quán)重 w ,向目標(biāo)函數(shù)中增加一個(gè) 1/2*λw2挫望,其中 λ 是正則化強(qiáng)度立润。前面這個(gè) 1/2 很常見(jiàn),是因?yàn)榧由?1/2 后媳板,該式子關(guān)于 w梯度就是 λw 而不是 2λw 了桑腮。L2正則化可以直觀理解為它對(duì)于大數(shù)值的權(quán)重向量進(jìn)行嚴(yán)厲懲罰,傾向于更加分散的權(quán)重向量蛉幸。在線性分類章節(jié)中討論過(guò)破讨,由于輸入和權(quán)重之間的乘法操作旨巷,這樣就有了一個(gè)優(yōu)良的特性:使網(wǎng)絡(luò)更傾向于使用所有輸入特征,而不是嚴(yán)重依賴輸入特征中某些小部分特征添忘。最后需要注意在梯度下降和參數(shù)更新的時(shí)候采呐,使用L2正則化意味著所有的權(quán)重都以w += -lambda * W向著0線性下降。

L1正則化是另一個(gè)相對(duì)常用的正則化方法搁骑。對(duì)于每個(gè) w 我們都向目標(biāo)函數(shù)增加一個(gè) λ|w| 斧吐。L1和L2正則化也可以進(jìn)行組合: λ1|w| + λ2w2 ,這也被稱作Elastic net regularizaton仲器。L1正則化有一個(gè)有趣的性質(zhì)煤率,它會(huì)讓權(quán)重向量在最優(yōu)化的過(guò)程中變得稀疏(即非常接近0)。也就是說(shuō)乏冀,使用L1正則化的神經(jīng)元最后使用的是它們最重要的輸入數(shù)據(jù)的稀疏子集蝶糯,同時(shí)對(duì)于噪音輸入則幾乎是不變的了。相較L1正則化辆沦,L2正則化中的權(quán)重向量大多是分散的小數(shù)字昼捍。在實(shí)踐中,如果不是特別關(guān)注某些明確的特征選擇肢扯,一般說(shuō)來(lái)L2正則化都會(huì)比L1正則化效果好妒茬。

最大范式約束(Max norm constraints)。另一種形式的正則化是給每個(gè)神經(jīng)元中權(quán)重向量的量級(jí)設(shè)定上限蔚晨,并使用投影梯度下降來(lái)確保這一約束乍钻。在實(shí)踐中,與之對(duì)應(yīng)的是參數(shù)更新方式不變铭腕,然后要求神經(jīng)元中的權(quán)重向量 w 必須滿足 ||w||2 < c 這一條件银择,一般 c 值為3或者4。有研究者發(fā)文稱在使用這種正則化方法時(shí)效果更好累舷。這種正則化還有一個(gè)良好的性質(zhì)浩考,即使在學(xué)習(xí)率設(shè)置過(guò)高的時(shí)候,網(wǎng)絡(luò)中也不會(huì)出現(xiàn)數(shù)值“爆炸”笋粟,這是因?yàn)樗膮?shù)更新始終是被限制著的怀挠。

隨機(jī)失活(Dropout)是一個(gè)簡(jiǎn)單又極其有效的正則化方法析蝴。該方法由Srivastava在論文Dropout: A Simple Way to Prevent Neural Networks from Overfitting中提出的害捕,與L1正則化,L2正則化和最大范式約束等方法互為補(bǔ)充闷畸。在訓(xùn)練的時(shí)候尝盼,隨機(jī)失活的實(shí)現(xiàn)方法是讓神經(jīng)元以超參數(shù) p 的概率被激活或者被設(shè)置為0。

圖片來(lái)源自論文佑菩,展示其核心思路盾沫。在訓(xùn)練過(guò)程中裁赠,隨機(jī)失活可以被認(rèn)為是對(duì)完整的神經(jīng)網(wǎng)絡(luò)抽樣出一些子集,每次基于輸入數(shù)據(jù)只更新子網(wǎng)絡(luò)的參數(shù)(然而赴精,數(shù)量巨大的子網(wǎng)絡(luò)們并不是相互獨(dú)立的佩捞,因?yàn)樗鼈兌脊蚕韰?shù))。在測(cè)試過(guò)程中不使用隨機(jī)失活蕾哟,可以理解為是對(duì)數(shù)量巨大的子網(wǎng)絡(luò)們做了模型集成(model ensemble)一忱,以此來(lái)計(jì)算出一個(gè)平均的預(yù)測(cè)。

一個(gè)3層神經(jīng)網(wǎng)絡(luò)的普通版隨機(jī)失活可以用下面代碼實(shí)現(xiàn):

""" 普通版隨機(jī)失活: 不推薦實(shí)現(xiàn) (看下面筆記) """

p = 0.5 # 激活神經(jīng)元的概率. p值更高 = 隨機(jī)失活更弱

def train_step(X):
  """ X中是輸入數(shù)據(jù) """
  
  # 3層neural network的前向傳播
  H1 = np.maximum(0, np.dot(W1, X) + b1)
  U1 = np.random.rand(*H1.shape) < p # 第一個(gè)隨機(jī)失活遮罩
  H1 *= U1 # drop!
  H2 = np.maximum(0, np.dot(W2, H1) + b2)
  U2 = np.random.rand(*H2.shape) < p # 第二個(gè)隨機(jī)失活遮罩
  H2 *= U2 # drop!
  out = np.dot(W3, H2) + b3
  
  # 反向傳播:計(jì)算梯度... (略)
  # 進(jìn)行參數(shù)更新... (略)
  
def predict(X):
  # 前向傳播時(shí)模型集成
  H1 = np.maximum(0, np.dot(W1, X) + b1) * p # 注意:激活數(shù)據(jù)要乘以p
  H2 = np.maximum(0, np.dot(W2, H1) + b2) * p # 注意:激活數(shù)據(jù)要乘以p
  out = np.dot(W3, H2) + b3

在上面的代碼中谭确,train_step函數(shù)在第一個(gè)隱層和第二個(gè)隱層上進(jìn)行了兩次隨機(jī)失活帘营。在輸入層上面進(jìn)行隨機(jī)失活也是可以的,為此需要為輸入數(shù)據(jù)X創(chuàng)建一個(gè)二值的遮罩逐哈。反向傳播保持不變芬迄,但是肯定需要將遮罩U1U2加入進(jìn)去。

注意:在predict函數(shù)中不進(jìn)行隨機(jī)失活昂秃,但是對(duì)于兩個(gè)隱層的輸出都要乘以 p 禀梳,調(diào)整其數(shù)值范圍。這一點(diǎn)非常重要肠骆,因?yàn)樵跍y(cè)試時(shí)所有的神經(jīng)元都能看見(jiàn)它們的輸入出皇,因此我們想要神經(jīng)元的輸出與訓(xùn)練時(shí)的預(yù)期輸出是一致的。以 p = 0.5 為例哗戈,在測(cè)試時(shí)神經(jīng)元必須把它們的輸出減半郊艘,這是因?yàn)樵谟?xùn)練的時(shí)候它們的輸出只有一半。為了理解這點(diǎn)唯咬,先假設(shè)有一個(gè)神經(jīng)元 x 的輸出纱注,那么進(jìn)行隨機(jī)失活的時(shí)候,該神經(jīng)元的輸出就是 px + (1 - p)0胆胰,這是有 1 - p 的概率神經(jīng)元的輸出為0狞贱。在測(cè)試時(shí)神經(jīng)元總是激活的,就必須調(diào)整 x → px 來(lái)保持同樣的預(yù)期輸出蜀涨。在測(cè)試時(shí)會(huì)在所有可能的二值遮罩(也就是數(shù)量龐大的所有子網(wǎng)絡(luò))中迭代并計(jì)算它們的協(xié)作預(yù)測(cè)瞎嬉,進(jìn)行這種減弱的操作也可以認(rèn)為是與之相關(guān)的。

上述操作不好的性質(zhì)是必須在測(cè)試時(shí)對(duì)激活數(shù)據(jù)要按照 p 進(jìn)行數(shù)值范圍調(diào)整厚柳。既然測(cè)試性能如此關(guān)鍵氧枣,實(shí)際更傾向使用反向隨機(jī)失活(inverted dropout),它是在訓(xùn)練時(shí)就進(jìn)行數(shù)值范圍調(diào)整别垮,從而讓前向傳播在測(cè)試時(shí)保持不變便监。這樣做還有一個(gè)好處,無(wú)論你決定是否使用隨機(jī)失活,預(yù)測(cè)方法的代碼可以保持不變烧董。反向隨機(jī)失活的代碼如下:

""" 
反向隨機(jī)失活: 推薦實(shí)現(xiàn)方式.
在訓(xùn)練的時(shí)候drop和調(diào)整數(shù)值范圍毁靶,測(cè)試時(shí)不做任何事.
"""

p = 0.5 # 激活神經(jīng)元的概率. p值更高 = 隨機(jī)失活更弱

def train_step(X):
  # 3層neural network的前向傳播
  H1 = np.maximum(0, np.dot(W1, X) + b1)
  U1 = (np.random.rand(*H1.shape) < p) / p # 第一個(gè)隨機(jī)失活遮罩. 注意/p!
  H1 *= U1 # drop!
  H2 = np.maximum(0, np.dot(W2, H1) + b2)
  U2 = (np.random.rand(*H2.shape) < p) / p # 第二個(gè)隨機(jī)失活遮罩. 注意/p!
  H2 *= U2 # drop!
  out = np.dot(W3, H2) + b3

  # 反向傳播:計(jì)算梯度... (略)
  # 進(jìn)行參數(shù)更新... (略)

def predict(X):
  # 前向傳播時(shí)模型集成
  H1 = np.maximum(0, np.dot(W1, X) + b1) # 不用數(shù)值范圍調(diào)整了
  H2 = np.maximum(0, np.dot(W2, H1) + b2)
  out = np.dot(W3, H2) + b3

前向傳播中的噪音。在更一般化的分類上逊移,隨機(jī)失活屬于網(wǎng)絡(luò)在前向傳播中有隨機(jī)行為的方法预吆。測(cè)試時(shí),通過(guò)分析法(在使用隨機(jī)失活的本例中就是乘以 p )或數(shù)值法(例如通過(guò)抽樣出很多子網(wǎng)絡(luò)胳泉,隨機(jī)選擇不同子網(wǎng)絡(luò)進(jìn)行前向傳播啡浊,最后對(duì)它們?nèi)∑骄⒃胍暨吘壔T谶@個(gè)方向上的另一個(gè)研究是DropConnect胶背,它在前向傳播的時(shí)候巷嚣,一系列權(quán)重被隨機(jī)設(shè)置為0。提前說(shuō)一下钳吟,卷積神經(jīng)網(wǎng)絡(luò)同樣會(huì)吸取這類方法的優(yōu)點(diǎn)廷粒,比如隨機(jī)匯合(stochastic pooling),分級(jí)匯合(fractional pooling)红且,數(shù)據(jù)增長(zhǎng)(data augmentation)坝茎。我們?cè)诤竺鏁?huì)詳細(xì)介紹。

偏置正則化暇番。在線性分類器的章節(jié)中介紹過(guò)嗤放,對(duì)于偏置參數(shù)的正則化并不常見(jiàn),因?yàn)樗鼈冊(cè)诰仃嚦朔ㄖ泻洼斎霐?shù)據(jù)并不產(chǎn)生互動(dòng)壁酬,所以并不需要控制其在數(shù)據(jù)維度上的效果次酌。然而在實(shí)際應(yīng)用中(使用了合理數(shù)據(jù)預(yù)處理的情況下),對(duì)偏置進(jìn)行正則化也很少會(huì)導(dǎo)致算法性能變差舆乔。這可能是因?yàn)橄噍^于權(quán)重參數(shù)岳服,偏置參數(shù)實(shí)在太少,所以分類器需要它們來(lái)獲得一個(gè)很好的數(shù)據(jù)損失希俩,那么還是能夠承受的吊宋。

每層正則化。對(duì)于不同的層進(jìn)行不同強(qiáng)度的正則化很少見(jiàn)(可能除了輸出層以外)颜武,關(guān)于這個(gè)思路的相關(guān)文獻(xiàn)也很少璃搜。

實(shí)踐:通過(guò)交叉驗(yàn)證獲得一個(gè)全局使用的L2正則化強(qiáng)度是比較常見(jiàn)的。在使用L2正則化的同時(shí)在所有層后面使用隨機(jī)失活也很常見(jiàn)鳞上。 p 值一般默認(rèn)設(shè)為0.5这吻,也可能在驗(yàn)證集上調(diào)參。

2. 損失函數(shù)

我們已經(jīng)討論過(guò)損失函數(shù)的正則化損失部分因块,它可以看做是對(duì)模型復(fù)雜程度的某種懲罰橘原。損失函數(shù)的第二個(gè)部分是數(shù)據(jù)損失,它是一個(gè)有監(jiān)督學(xué)習(xí)問(wèn)題涡上,用于衡量分類算法的預(yù)測(cè)結(jié)果(即分類評(píng)分)和真實(shí)標(biāo)簽結(jié)果之間的一致性趾断。數(shù)據(jù)損失是對(duì)所有樣本的數(shù)據(jù)損失求平均。也就是說(shuō)吩愧, L = 1/N ∑iLi中芋酌,N 是訓(xùn)練集數(shù)據(jù)的樣本數(shù)。我們把神經(jīng)網(wǎng)絡(luò)中輸出層的激活函數(shù)簡(jiǎn)寫(xiě)為 f = f(xi雁佳;W) 脐帝,在實(shí)際中你可能需要解決以下幾類問(wèn)題:

分類問(wèn)題是我們一直討論的。在該問(wèn)題中糖权,假設(shè)有一個(gè)裝滿樣本的數(shù)據(jù)集堵腹,每個(gè)樣本都有一個(gè)唯一的正確標(biāo)簽(是固定分類標(biāo)簽之一)。在這類問(wèn)題中星澳,一個(gè)最常見(jiàn)的損失函數(shù)就是SVM(是Weston Watkins 公式):

之前簡(jiǎn)要提起過(guò)疚顷,有些學(xué)者的論文中指出平方折葉損失算法的結(jié)果會(huì)更好。第二個(gè)常用的損失函數(shù)是Softmax分類器禁偎,它使用交叉熵?fù)p失:

問(wèn)題:類別數(shù)目巨大腿堤。當(dāng)標(biāo)簽集非常龐大(例如字典中的所有英語(yǔ)單詞,或者ImageNet中的22000種分類)如暖,就需要使用分層Softmax(Hierarchical Softmax了(參考文獻(xiàn))笆檀。分層softmax將標(biāo)簽分解成一個(gè)樹(shù)。每個(gè)標(biāo)簽都表示成這個(gè)樹(shù)上的一個(gè)路徑盒至,這個(gè)樹(shù)的每個(gè)節(jié)點(diǎn)處都訓(xùn)練一個(gè)Softmax分類器來(lái)在左和右分枝之間做決策酗洒。樹(shù)的結(jié)構(gòu)對(duì)于算法的最終結(jié)果影響很大,而且一般需要具體問(wèn)題具體分析枷遂。

屬性(Attribute)分類寝蹈。上面兩個(gè)損失公式的前提,都是假設(shè)每個(gè)樣本只有一個(gè)正確的標(biāo)簽 yi 登淘。但是如果 yi 是一個(gè)二值向量箫老,每個(gè)樣本可能有,也可能沒(méi)有某個(gè)屬性黔州,而且屬性之間并不相互排斥呢耍鬓?比如在Instagram上的圖片,就可以看成是被一個(gè)巨大的標(biāo)簽集合中的某個(gè)子集打上標(biāo)簽流妻,一張圖片上可能有多個(gè)標(biāo)簽牲蜀。在這種情況下,一個(gè)明智的方法是為每個(gè)屬性創(chuàng)建一個(gè)獨(dú)立的二分類的分類器绅这。例如涣达,針對(duì)每個(gè)分類的二分類器會(huì)采用下面的公式:

上式中,求和是對(duì)所有分類 j ,(這里的 j 應(yīng)該是屬性分類yij 的值為1或者-1度苔,具體根據(jù)第 i 個(gè)樣本是否被第 j 個(gè)屬性打標(biāo)簽而定匆篓,當(dāng)該類別被正確預(yù)測(cè)并展示的時(shí)候,分值向量 fj 為正寇窑,其余情況為負(fù)鸦概。可以發(fā)現(xiàn)甩骏,當(dāng)一個(gè)正樣本的得分小于+1窗市,或者一個(gè)負(fù)樣本得分大于-1的時(shí)候,算法就會(huì)累計(jì)損失值饮笛。

另一種方法是對(duì)每種屬性訓(xùn)練一個(gè)獨(dú)立的邏輯回歸分類器咨察。二分類的邏輯回歸分類器只有兩個(gè)分類(0,1)福青,其中對(duì)于分類1的概率計(jì)算為:

因?yàn)轭悇e0和類別1的概率和為1摄狱,所以類別0的概率為: P(y = 0|x; w, b) = 1 - P(y = 1|x; w, b) 。這樣素跺,如果 σ(wTx + b) > 0.5 或 wTx + b > 0二蓝,那么樣本就要被分類成為正樣本(y=1)。然后損失函數(shù)最大化這個(gè)對(duì)數(shù)似然函數(shù)指厌,問(wèn)題可以簡(jiǎn)化為:

上式中刊愚,假設(shè)標(biāo)簽 yij 非0即1,σ( . ) 就是sigmoid函數(shù)踩验。上面的公式看起來(lái)嚇人鸥诽,但是 f 的梯度實(shí)際上非常簡(jiǎn)單:

回歸問(wèn)題是預(yù)測(cè)實(shí)數(shù)的值的問(wèn)題,比如預(yù)測(cè)房?jī)r(jià)箕憾,預(yù)測(cè)圖片中某個(gè)東西的長(zhǎng)度等牡借。對(duì)于這種問(wèn)題,通常是計(jì)算預(yù)測(cè)值和真實(shí)值之間的損失袭异。然后用L2平方范式或L1范式度量差異钠龙。對(duì)于某個(gè)樣本,L2范式計(jì)算如下:

在上式中御铃,如果有多個(gè)數(shù)量被預(yù)測(cè)了碴里,就要對(duì)預(yù)測(cè)的所有維度的預(yù)測(cè)求和。觀察第 i 個(gè)樣本的第 j 維上真,用 δij 表示預(yù)測(cè)值與真實(shí)值之間的差異咬腋。關(guān)于該維度的梯度(也就是 ?Li / ?fj)能夠輕松地通過(guò)被求導(dǎo)為L(zhǎng)2范式的 δijsign(δij) 。這就是說(shuō)睡互,評(píng)分值的梯度要么與誤差中的差值直接成比例根竿,要么是固定的并從差值中繼承sign陵像。

注意:L2損失比起較為穩(wěn)定的Softmax損失來(lái),其最優(yōu)化過(guò)程要困難很多寇壳。直觀而言醒颖,它需要網(wǎng)絡(luò)具備一個(gè)特別的性質(zhì),即對(duì)于每個(gè)輸入(和增量)都要輸出一個(gè)確切的正確值九巡。而在Softmax中就不是這樣图贸,每個(gè)評(píng)分的準(zhǔn)確值并不是那么重要:只有當(dāng)它們量級(jí)適當(dāng)?shù)臅r(shí)候蹂季,才有意義冕广。還有,L2損失魯棒性不好偿洁,因?yàn)楫惓V悼梢詫?dǎo)致很大的梯度撒汉。所以在面對(duì)一個(gè)回歸問(wèn)題時(shí),先考慮將輸出變成二值化是否真的不夠用涕滋。例如睬辐,如果對(duì)一個(gè)產(chǎn)品的星級(jí)進(jìn)行預(yù)測(cè),使用5個(gè)獨(dú)立的分類器來(lái)對(duì)1-5星進(jìn)行打分的效果一般比使用一個(gè)回歸損失要好很多宾肺。分類還有一個(gè)額外優(yōu)點(diǎn)溯饵,就是能給出關(guān)于回歸的輸出的分布,而不是一個(gè)簡(jiǎn)單的毫無(wú)把握的輸出值锨用。如果確信分類不適用丰刊,那么使用L2損失吧,但是一定要謹(jǐn)慎:L2非常脆弱增拥,在網(wǎng)絡(luò)中使用隨機(jī)失活(尤其是在L2損失層的上一層)不是好主意啄巧。

當(dāng)面對(duì)一個(gè)回歸任務(wù),首先考慮是不是必須這樣掌栅。一般而言秩仆,盡量把你的輸出變成二分類,然后對(duì)它們進(jìn)行分類猾封,從而變成一個(gè)分類問(wèn)題澄耍。(這倒是讓人耳目一新....

結(jié)構(gòu)化預(yù)測(cè)(structured prediction)。結(jié)構(gòu)化損失是指標(biāo)簽可以是任意的結(jié)構(gòu)晌缘,例如圖表齐莲、樹(shù)或者其他復(fù)雜物體的情況。通常這種情況還會(huì)假設(shè)結(jié)構(gòu)空間非常巨大枚钓,不容易進(jìn)行遍歷铅搓。結(jié)構(gòu)化SVM背后的基本思想就是在正確的結(jié)構(gòu) Li 和得分最高的非正確結(jié)構(gòu)之間畫(huà)出一個(gè)邊界。解決這類問(wèn)題搀捷,并不是像解決一個(gè)簡(jiǎn)單無(wú)限制的最優(yōu)化問(wèn)題那樣使用梯度下降就可以了星掰,而是需要設(shè)計(jì)一些特殊的解決方案多望,這樣可以有效利用對(duì)于結(jié)構(gòu)空間的特殊簡(jiǎn)化假設(shè)。我們簡(jiǎn)要地提一下這個(gè)問(wèn)題氢烘,但是詳細(xì)內(nèi)容就超出本課程范圍怀偷。

3. 小結(jié)

小結(jié)如下

  • 推薦的預(yù)處理操作是對(duì)數(shù)據(jù)的每個(gè)特征都進(jìn)行零中心化,然后將其數(shù)值范圍都?xì)w一化到[-1,1]范圍之內(nèi)播玖。
  • 使用標(biāo)準(zhǔn)差為 sqrt(2.0/n) 的高斯分布來(lái)初始化權(quán)重椎工,其中 n 是輸入的神經(jīng)元數(shù)。例如用numpy可以寫(xiě)作:w = np.random.randn(n) * sqrt(2.0/n)蜀踏。
  • 使用L2正則化和隨機(jī)失活的倒置版本维蒙。
  • 使用批量歸一化。
  • 討論了在實(shí)踐中可能要面對(duì)的不同任務(wù)果覆,以及每個(gè)任務(wù)對(duì)應(yīng)的常用損失函數(shù)颅痊。

現(xiàn)在,我們預(yù)處理了數(shù)據(jù)局待,初始化了模型斑响。在下一節(jié)中,我們將討論算法的學(xué)習(xí)過(guò)程及其運(yùn)作特性钳榨。


再次感謝原作者的翻譯

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舰罚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子薛耻,更是在濱河造成了極大的恐慌营罢,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昭卓,死亡現(xiàn)場(chǎng)離奇詭異愤钾,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)候醒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)能颁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人倒淫,你說(shuō)我怎么就攤上這事伙菊。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)唾戚。 經(jīng)常有香客問(wèn)我杠娱,道長(zhǎng)蜓陌,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上财剖,老公的妹妹穿的比我還像新娘悠夯。我一直安慰自己,他們只是感情好躺坟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布沦补。 她就那樣靜靜地躺著,像睡著了一般咪橙。 火紅的嫁衣襯著肌膚如雪夕膀。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天美侦,我揣著相機(jī)與錄音产舞,去河邊找鬼。 笑死音榜,一個(gè)胖子當(dāng)著我的面吹牛庞瘸,可吹牛的內(nèi)容都是我干的捧弃。 我是一名探鬼主播赠叼,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼违霞!你這毒婦竟也來(lái)了嘴办?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤买鸽,失蹤者是張志新(化名)和其女友劉穎涧郊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體眼五,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妆艘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了看幼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片批旺。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诵姜,靈堂內(nèi)的尸體忽然破棺而出汽煮,到底是詐尸還是另有隱情,我是刑警寧澤棚唆,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布暇赤,位于F島的核電站,受9級(jí)特大地震影響宵凌,放射性物質(zhì)發(fā)生泄漏鞋囊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一瞎惫、第九天 我趴在偏房一處隱蔽的房頂上張望溜腐。 院中可真熱鬧坯门,春花似錦、人聲如沸逗扒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)矩肩。三九已至现恼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間黍檩,已是汗流浹背叉袍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刽酱,地道東北人喳逛。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像棵里,于是被迫代替她去往敵國(guó)和親润文。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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