神經網絡與深度學習基礎筆記

前進的道路上,我們將擴展出很多關于神經網絡的關鍵的思想,其中包括兩個重要的人工神經元 (感知機和 S 型神經元),以及標準的神經網絡學習算法,即隨機梯度下降算法。自始至終,我專注于解釋事情的原委,并構筑你對神經網絡的直觀感受。

感知機


感知機在20世紀五、 六十年代由科學家 Frank Rosenblatt 發明,其受到 Warren McCulloch 和 Walter Pitts 早期著 作的影響。今天,使用其它人工神經元模型更為普遍---在這本書中,以及更多現代的神經網絡著作中,主要使用的是一種叫做 S 型神經元的神經元模型。我們很快會講到S型神經元。但是要理解為什么S型神經元被定義為那樣的方式,值得花點時間先來理解下感知機。

感知機是如何工作的呢?

一個感知機接受幾個二進制輸入,x1, x2, . . .,并產生一個二進制輸 出:

image.png

示例中的感知機有三個輸入,x1, x2, x3。通??梢杂懈嗷蚋佥斎?。Rosenblatt 提議一個簡單的規則來計算輸出。他引入權重,w1, w2, . . .,表示相應輸入對于輸出重要性的實數。神經 元的輸出,0 或者 1,則由分配權重后的總和 ∑ wjxj 小于或者大于一些閾值決定。和權重一樣,閾值是一個實數,一個神經元的參數。用更精確的代數形式:

image.png

這就是感知機要做的事情,一個基本的數學模型。

image.png

在這個網絡中,第一列感知機 —— 我們稱其為第一層感知機 —— 通過權衡輸入依據做出三 個非常簡單的決定。那第二層的感知機呢?每一個都在權衡第一層的決策結果并做出決定。以這種方式,一個第二層中的感知機可以比第一層中的做出更復雜和抽象的決策。在第三層中的感 知機甚至能進行更復雜的決策。以這種方式,一個多層的感知機網絡可以從事復雜巧妙的決策。
順便提一下,當我定義感知機時我說的是感知機只有一個輸出。在上面的網絡中感知機看上 去像是有多個輸出。實際上,他們仍然是單輸出的。多個感知機輸出箭頭僅僅便于說明一個感 知機的輸出被用于其它感知機的輸入。

讓我們簡化感知機的數學描述。條件 ∑ wjxj 看上去有些冗?,我們可以創建兩個符號的變動來簡化。第一個變動是把∑wjxj 改寫成點乘,w · x ≡ ∑wjxj,這里 w 和 x 對應權重和輸入的向量。第二個變動是把閾值移到不等式的另一邊,并用感知機的偏置 b ≡ ?threshold 代替。用偏置而不是閾值,那么感知機的規則可以重寫為:

image.png

S型神經元


我們用描繪感知機的相同方式來描繪 S 型神經元:

image.png

正如一個感知機,S型神經元有多個輸入,x1,x2,...。但是這些輸入可以取 0 和 1 中的任意值,而不僅僅是 0 或 1。例如,0.638 . . . 是一個S型神經元的有效輸入。同樣,S型神經元對每個輸入有權重,w1,w2,...,和一個總的偏置,b。但是輸出不是 0 或 1。相反,它現在是 σ(w · x + b),這里 σ 被稱為S 型函數,定義為:

image.png

把它們放在一起來更清楚地說明,一個具有輸入 x1, x2, . . .,權重 w1, w2, . . .,和偏置 b 的 S 型神經元的輸出是:

image.png

為了理解和感知機模型的相似性,假設 z ≡ w · x + b 是一個很大的正數。那么 e?z ≈ 0 而 σ(z) ≈ 1。即,當 z = w · x + b 很大并且為正,S 型神經元的輸出近似為 1,正好和感知機一樣。 相反地,假設 z = w·x+b 是一個很大的負數。那么 e?z → ∞,σ(z) ≈ 0。所以當 z = w·x+b 是一個很大的負數,S 型神經元的行為也非常近似一個感知機。只有在 w · x + b 取中間值時, 和感知機模型有比較大的偏離。

σ 的精確形式不重要 —— 重要的是這個函數繪制的形狀。是這樣:

image.png

這個形狀是階躍函數平滑后的版本:

image.png

如果 σ 實際是個階躍函數,既然輸出會依賴于 w · x + b 是正數還是負數2,那么 S 型神經元會成為一個感知機。利用實際的 σ 函數,我們得到一個,就像上面說明的,平滑的感知機。確實,σ函數的平滑特性,正
是關鍵因素,而不是其細部形式。σ 的平滑意味著權重和偏置的微小變化,即 ?wj 和 ?b,會從神經元產生一
個微小的輸出變化 ?output。實際上,微積分告訴我 們 ?output 可以很好地近似表示為:

image.png

它的意思非常簡單:?output 是一個反映權重和偏置變化 —— 即 ?wj 和 ?b —— 的線性函數。利用這個線性特性,我們比較容易細微地修改權重 和偏置的值,從而獲得我們需要的細微的輸出變化。所以,因為S型神經元具有與感知機類似的本質行為,它們可以幫助我們了解權重和偏置的變化如何影響輸出值。

我們應該如何解釋一個 S 型神經元的輸出呢? 很明顯,感知機和 S 型神經元之間一個很大的不同是 S 型神經元不僅僅輸出 0 或 1。它可以輸出 0 到 1 之間的任何實數,所以諸如 0.173和0.689的值是合理的輸出。

神經網絡的架構


image.png

這個網絡中最左邊的稱為輸入層,其中的神經元稱為輸入神經元。最右邊的, 輸出層包含有輸出神經元,在本例中,輸出層只有一個神經元。中間層,既然這層中的神經元既不是輸入也不是輸出,則被稱為隱藏層。

相比于神經網絡中輸入輸出層的直觀設計,隱藏層的設計則堪稱一?藝術。特別是,通過一些簡單的經驗法則來總結隱藏層的設計流程是不可行的。相反,神經網絡的研究人員已經為隱藏層開發了許多設計最優法則,這有助于網絡的行為能符合人們期望的那樣。例如,這些法則可以用于幫助權衡隱藏層數量和訓練網絡所需的時間開銷。

目前為止,我們討論的神經網絡,都是以上一層的輸出作為下一層的輸入。這種網絡被稱為前饋神經網絡。這意味著網絡中是沒有回路的 —— 信息總是向前傳播,從不反向回饋。如果確 實有回路,我們最終會有這樣的情況:σ 函數的輸入依賴于輸出。

一個簡單的分類手寫數字的網絡


定義神經網絡后,讓我們回到手寫識別上來。我們可以把識別手寫數字的問題分成兩個子問題。
首先,我們希望有個方式把包含許多數字的圖像分成一系列單獨的圖像,每個包含單個數字。
其次,我們將專注于編程解決第二個問題,識別單獨的數字。

我們將使用一個三層神經網絡來識別單個數字:

image.png

網絡的輸出層包含有 10 個神經元。如果第一個神經元激活,即輸出 ≈ 1,那么表明網絡認為數字是一個0。如果第二個神經元激活,就表明網絡認為數字是一個1。依此類推。更確切地說,我們把輸出神經元的輸出賦予編號 0 到 9,并計算出那個神經元有最高的激活值。比如,如果編號為 6 的神經元激活,那么我們的網絡會猜到輸入的數字是6。其它神經元相同。

你可能會好奇為什么我們用 10 個輸出神經元。畢竟我們的任務是能讓神經網絡告訴我們哪個數字(0, 1, 2, . . . , 9 )能和輸入圖片匹配。一個看起來更自然的方式就是使用4個輸出神經元,把每一個當做一個二進制值,結果取決于它的輸出更靠近 0 還是 1 。四個神經元足夠編碼這個問題了,因為 2 ^ 4 = 16 大于 10 種可能的輸入。為什么我們反而要用 10 個神經元呢? 這樣做難道效率不低嗎? 最終的判斷是基于經驗主義的: 我們可以實驗兩種不同的網絡設計,結果證明對于這個特定的問題而言,10個輸出神經元的神經網絡比 4 個的識別效果更好。但是令我們好奇的是為什么使用 10 個輸出神經元的神經網絡更有效呢。有沒有什么啟發性的方法能提前告訴我們用10個輸出編碼比使用4個輸出編碼更有好呢?

為了理解為什么我們這么做,我們需要從根本原理上理解神經網絡究竟在做些什么。首先考 慮有 10 個神經元的情況。我們首先考慮第一個輸出神經元,它告訴我們一個數字是不是 0。它能那么做是因為可以權衡從隱藏層來的信息。隱藏層的神經元在做什么呢?假設隱藏層的第一個神經元只是用于檢測如下的圖像是否存在:

image.png

為了達到這個目的,它通過對此圖像對應部分的像素賦予較大權重,對其它部分賦予較小 的權重。同理,我們可以假設隱藏層的第二,第三,第四個神經元是為檢測下列圖片是否存在:

image.png

就像你能猜到的,這四幅圖像組合在一起構成了前面顯示的一行數字圖像中的 0:

image.png

如果所有隱藏層的這四個神經元被激活那么我們就可以推斷出這個數字是 0。當然,這不是 我們推斷出 0 的唯一方式 —— 我們能通過很多其他合理的方式得到 0 (舉個例子來說,通過上述圖像的轉換,或者稍微變形)。但至少在這個例子中我們可以推斷出輸入的數字是 0。

假設神經網絡以上述方式運行,我們可以給出一個貌似合理的理由去解釋為什么用 10 個輸 出而不是 4 個。如果我們有 4 個輸出,那么第一個輸出神經元將會盡力去判斷數字的最高有效位是什么。把數字的最高有效位和數字的形狀聯系起來并不是一個簡單的問題。很難想象出有 什么恰當的歷史原因,一個數字的形狀要素會和一個數字的最高有效位有什么緊密聯系。

上面我們說的只是一個啟發性的方法。沒有什么理由表明這個三層的神經網絡必須按照我所 描述的方式運行,即隱藏層是用來探測數字的組成形狀??赡芤粋€聰明的學習算法將會找到一 些合適的權重能讓我們僅僅用 4 個輸出神經元就行。但是這個啟發性的方法通常很有效,它會節省你大量時間去設計一個好的神經網絡結構。

使用梯度下降算法進行學習


我們將使用 MNIST 數據集,其包含有數以萬計的連 帶著正確分類器的手寫數字的掃描圖像。MNIST 的名字來源于 NIST ——美國國家標準與技術 研究所 —— 收集的兩個數據集改進后的子集。

我們希望有一個算法,能讓我們找到權重和偏置,以至于網絡的輸出 y(x) 能夠擬合所有的訓練輸入 x。為了量化我們如何實現這個目標,我們定義一個代價函數:

image.png

這里 w 表示所有的網絡中權重的集合,b 是所有的偏置,n 是訓練輸入數據的個數,a 是表示當輸入為 x 時輸出的向量,求和則是在總的訓練輸入 x 上進行的。當然,輸出 a 取決于 x, w 和 b,但是為了保持符號的簡潔性,我沒有明確地指出這種依賴關系。符號 ∥v∥ 是指向量 v 的模。我們把 C 稱為二次代價函數;有時也被稱為均方誤差或者 MSE

觀察二次代價函數的形式我們可以看到 C(w, b)是非負的,因為求和公式中的每一項都是非負的。此外,代價函數 C(w,b) 的值相當小,即 C(w,b) ≈ 0,精確地說,是當對于所有的訓練輸入 x,y(x) 接近于輸出 a 時。因此如果我們的學習算法能找到合適的權重和偏置,使得 C(w, b) ≈ 0,它就能很好地工作。相反,當 C(w, b) 很大時就不怎么好了,那意味著對于大量地輸入,y(x) 與輸出 a 相差很大。 因此我們的訓練算法的目的,是最小化權重和偏置的代價函數 C(w, b)。換句話說,我們想要找到一系列能讓代價盡可能小的權重和偏置。我們將采用稱為梯度下降的算法來達到這個目的。

假設 C 是一個有 m 個變量 v1, ..., vm 的多元函數。那么對 C 中 自變量的變化 ?v = (?v1, ..., ?vm)T ,?C 將會變為:

image.png

這里的梯度 ?C 是向量

image.png

我們可以選取

image.png

這里的 η 是個很小的正數(稱為學習速率) 。

這給了我們一種方式從梯度中去取得最小值, 即使 C 是任意的多元函數,我們也能重復運用更新規則

image.png

事實上,甚至有一種觀點認為梯度下降法是求最小值的最優策略。假設我們正在努力去改變 ?v 來讓 C 盡可能地減小。這相當于最小化 ?C ≈ ?C · ?v。我們首先限制步?為小的固定值, 即 ∥?v∥ = ε,ε > 0。當步?固定時,我們要找到使得 C 減小最大的下降方向??梢宰C明,使得 ?C ·?v 取得最小值的 ?v 為 ?v = ?η?C,這里 η = ε/∥?C∥ 是由步?限制 ∥?v∥ = ε 所決定的。因此,梯度下降法可以被視為一種在 C 下降最快的方向上做微小變化的方法

反向傳播


反向傳播算法最初在 1970 年代被提及,但是人們直到 David Rumelhart、Geo rey Hinton 和 Ronald Williams 的著名的 1986 年的論文中才認識到這個算法的重要性。這篇論文描述了對一些神經網絡反向傳播要比傳統的方法更快,這使得使用神經網絡來解決之前無法完成的問題變得可行?,F在,反向傳播算法已經是神經網絡學習的重要組成部分了。

反向傳播的核心是一個對代價函數 C 關于任何權重 w (或者偏置 b )的 偏導數 ?C/?w 的表達式。這個表達式告訴我們在改變權重和偏置時,代價函數變化的快慢。盡管表達式會有點復雜,不過里面也包含一種美感,就是每個元素其實是擁有一種自然的直覺上的解釋。所以反向傳播不僅僅是一種學習的快速算法。實際上它讓我們細致領悟如何通過改變權 重和偏置來改變整個網絡的行為。因此,這也是學習反向傳播細節的重要價值所在。

反向傳播的四個基本方程

image.png

輸出層誤差的方程

image.png

使用下一層的誤差來表示當前層的誤差

image.png

代價函數關于網絡中任意偏置的改變率

image.png

代價函數關于任何一個權重的改變率

image.png

兩個神經元之間的連接其實是關聯與一個變化率因子,這僅僅是一個神經元的激活值相對于其他神經元的激活值的偏導數。從第一個權重到第一個神經元的變化率因子是 ?a /?w 。路徑的變化率因子其實就是這條路徑上的眾多因子的乘積。而整個的變化率就是對于所有可能的從初始權重到最終輸出的代價函數的路徑的變化率因子的和。

反向傳播就是一種巧妙地追蹤權重(和偏置)微小變化的傳播,抵達輸出層影響代價函數的技術。

改進神經網絡的學習方法

涉及的技術包括:更好的代價函數的選擇 —— 交叉熵代價函數;四種稱為“正則化”的 方法(L1 和 L2 正則化,棄權和訓練數據的人為擴展),這會讓我們的網絡在訓練集之外的數據 上更好地泛化;更好的權重初始化方法;還有幫助選擇好的超參數的啟發式想法。

交叉熵代價函數

假設,我們現在要訓練一 個包含若干輸入變量的的神經元,x1, x2, . . . 對應的權重為 w1, w2, . . . 和偏置 b:

image.png

神經元的輸出就是 a = σ(z),其中 z = ∑ wj xj + b 是輸入的帶權和。我們如下定義這個神經元的交叉熵代價函數:

image.png

當我們使用二次代價函數時,學習在神經元犯了明顯的錯誤的時候卻比學習快接近 真實值的時候緩慢;而使用交叉熵學習正是在神經元犯了明顯錯誤的時候速度更快。特別地,當 我們使用二次代價函數時,當神經元在接近正確的輸出前犯了明顯錯誤的時候,學習變得更加緩慢;而使用交叉熵,在神經元犯明顯錯誤時學習得更快。這些現象并不依賴于如何設置學習速率。

過度擬合與正則化


過度擬合是神經網絡的一個主要問題。這在現代網絡中特別正常,因為網絡權重和偏置數量巨大。為了高效地訓練,我們需要一種檢測過度擬合是不是發生的技術,這樣我們不會過度訓練。并且我們也想要找到一些技術來降低過度擬合的影響。

一般來說,最好的降低過度擬合的方式之一就是增加訓練樣本的量。有了足夠的訓練數據,就算是一個規模非常大的網絡也不大容易過度擬合。不幸的是,訓練數據其實是很難或者很昂貴的資源,所以這不是一種太切實際的選擇。

幸運的是,還有其他的技術能夠緩解過度擬合,即使我們只有一個固定的網絡和固定的訓練集合。這種技術就是正則化。本節,我會給出一種最為常用的正則化手段 —— 有時候被稱為權重衰減或者 L2正則化。L2 正則化的想法是增加一個額外的項到代價函數上,這個項叫做正則化項。下面是正則化的交叉熵:

image.png

其中第一個項就是常規的交叉熵的表達式。第二個現在加入的就是所有權重的平方的和。然 后使用一個因子 λ/2n 進行量化調整,其中 λ > 0 可以稱為規范化參數,而 n 就是訓練集合的 大小。我們會在后面討論 λ 的選擇策略。需要注意的是,正則化項里面并不包含偏置。

直覺地看,正則化的效果是讓網絡傾向于學習小一點的權重,其他的東西都一樣的。大的權重只有能夠給出代價函數第一項足夠的提升時才被允許。換言之,正則化可以當做一種尋找小 的權重和最小化原始的代價函數之間的折中。這兩部分之間相對的重要性就由 λ 的值來控制了: λ 越小,就偏向于最小化原始代價函數,反之,傾向于小的權重。

正則化在實踐中能夠減少過度擬合了。這是令人振奮的,不過,這背后的原 因還不得而知!通常的說法是:小的權重在某種程度上,意味著更低的復雜性,也就對數據給出了一種更簡單卻更強大解釋,因此應該優先選擇。

所以,我們應當時時記住這一點,正則化的神經網絡常常能夠比非正則化的泛化能力更強, 這只是一種實驗事實(empirical fact)。

激活函數的作用


摘自:https://www.zhihu.com/question/22334626

激活函數(Activation Function)是用來加入非線性因素的,因為線性模型的表達能力不夠。

以下,同種顏色為同類數據。
某些數據是線性可分的,意思是,可以用一條直線將數據分開。比如下圖:

image.png

這時候你需要通過一定的機器學習的方法,比如感知機算法(perceptron learning algorithm) 找到一個合適的線性方程。
但是有些數據不是線性可分的。比如如下數據:

image.png

第二組數據你就沒有辦法畫出一條直線來將數據區分開。
這時候有兩個辦法,第一個辦法,是做線性變換(linear transformation),比如講x,y變成x2,y2,這樣可以畫出圓形。如圖所示:

image.png

如果將坐標軸從x,y變為以x2,y2為標準,你會發現數據經過變換后是線性可分的了。大致示意圖如下:

image.png

另外一種方法是引入非線性函數。
我們來看異或問題(xor problem)。以下是xor真值表:

image.png

個真值表不是線性可分的,所以不能使用線性模型,如圖所示:

image.png

我們可以設計一種神經網絡,通過激活函數來使得這組數據線性可分。
激活函數我們選擇閥值函數(threshold function),也就是大于某個值輸出1(被激活了),小于等于則輸出0(沒有激活)。這個函數是非線性函數。
神經網絡示意圖如下:

image.png

其中直線上的數字為權重。圓圈中的數字為閥值。第二層,如果輸入大于1.5則輸出1,否則0;第三層,如果輸入大于0.5,則輸出1,否則0。

我們來一步步算。第一層到第二層(閥值1.5):

image.png

第二層到第三層(閥值0.5):

image.png

可以看到第三層輸出就是我們所要的xor的答案。
經過變換后的數據是線性可分的(n維,比如本例中可以用平面),如圖所示:

image.png


這是一個單層的感知機, 也是我們最常用的神經網絡組成單元啦. 用它可以劃出一條線, 把平面分割開:

image.png

那么很容易地我們就會想用多個感知機來進行組合, 獲得更強的分類能力, 這是沒問題的啦~~~~ 如圖所示:

image.png

那么我們動筆算一算, 就可以發現, 這樣一個神經網絡組合起來,輸出的時候無論如何都還是一個線性方程哎~~~~納尼, 說好的非線性分類呢?

我們在每一層疊加完了以后, 加一個激活函數, 如圖中的
y=\sigma(a)
y=\sigma(a)

.
這樣輸出的就是一個不折不扣的非線性函數!

image.png

有了這樣的非線性激活函數以后, 神經網絡的表達能力更加強大。

image.png

加上非線性激活函數之后, 我們就有可能學習到這樣的平滑分類平面。

image.png

所以到這里為止,我們就解釋了這個觀點,加入激活函數是用來加入非線性因素的,解決線性模型所不能解決的問題。

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

推薦閱讀更多精彩內容

  • #自我管理之年復盤# 我覺得能夠成功實現自我管理最有效的方法就是每日檢視與反思,這樣搭配才能更好地達到自我管理! ...
    JessicaPeng閱讀 253評論 0 1
  • 去掉標簽之間的空格或換行inline-block元素之間有空格或換行時,會產生縫隙。所以要想除去縫隙可以刪除空格或...
    __Qiao閱讀 592評論 0 2
  • 對我來說寫作靠的就是興趣和堅持,或者只有不斷的日積月累,當我能更熟練的、更真實的描述一件事或心有所感時,并且讓讀者...
    龍膽閱讀 175評論 0 1
  • 我最喜歡的一位美國作家海明威曾在《致下一場戰爭:一封主題嚴肅的信件》寫道:“在現代戰爭里,你只能像牲畜一樣毫無意義...
    先生文字工作坊閱讀 10,136評論 2 9
  • 有一個怪博士,因為自己付出了很多,但妻子拋棄自己而去,就恨這個世界,造出機器人控制世界,因為機器人是知道聽話的,人...
    王以薩閱讀 425評論 0 0