這是我參與8月更文挑戰的第10天,活動詳情查看: 8月更文挑戰html
如今考慮這樣一個問題,給一句話,如何判斷這句話的情感是積極的(Positive)仍是消極的(Negative)markdown
例以下圖中的一句話"I hate this boring movie",咱們看一眼就知道這句話確定是消極的,可是如何構建一個網絡模型去識別呢? 網絡
有一種naive的方法,假設咱們把這句話變成一個維度是 的tensor,5表示這句話裏有5個詞,100表示每一個詞的維度是100。而後對於將每一個詞 做爲輸入,分別帶入5個Linear Layer,假設獲得的輸出 ,把這五個輸出合在一塊兒就是 ,它的維度是 。最後再接一個Linear Layer,輸出 ,它的維度是 ,這個值表示給出句子是 的狀況下,這個句子的情感是Positive的機率,即 ,就變成了一個二分類的問題app
這只是一個naive的作法,這樣作會存在不少問題。首先若是輸入是一個很長的句子,那麼這個句子裏的單詞就會不少,再加上每一個單詞對應還須要一段長度的詞向量,整個參數量就會很是大;其次,這種作法沒有考慮到上下文的信息,例如"我不喜歡你"這句話,若是你只分析"喜歡",你會覺得這是一個積極的句子,但其實沒有考慮到上文中的"不"字。再好比,一我的說:我喜歡旅遊,其中最喜歡的地方是雲南,之後有機會必定要去__
。這裏填空,是個正常人都知道填"雲南"。咱們是根據上下文內容推斷出來的,這就意味着,一句話不能單獨一個單詞一個單詞來分析,因此咱們但願能有一個consistent tensor來存儲語境信息,而且在訓練的時候可以將這個語境信息利用起來函數
對於第一個問題,如何解決參數量過大,咱們能夠參考CNN,卷積神經網絡中的每一個kernel都利用的權重共享的思想,應用到咱們這裏就是,每一個單詞通過的Linear Layer,其 和 ,都是相同的,而再也不是上面那張圖的 , ,... , ,...,具體見下圖post
對於第二個問題,如何將語境信息也貫穿在整個網絡訓練的過程當中?學習
看下圖的網絡結構,每一層的輸出,都會做爲下一層的一部分輸入。例如將"I"的詞向量 和 做爲輸入,輸出獲得 ,就,而後將"hate"這個詞的詞向量 和 做爲輸入,輸出獲得 ,如此循環下去。所以這種網絡被稱爲循環神經網絡(RNN)this
下圖是一個典型的RNN網絡結構。右邊能夠理解爲左邊按照時間進行展開spa
假設 表示輸入"我"和"是", 表示輸入"中國",連起來輸入就是"我是中國",那麼 就應該對應"是"和"中國",預測下一個詞最有多是什麼?就是預測 最有多是什麼,應該是"人"的機率比較大code
所以,咱們能夠作這樣的定義:
由於咱們當前時刻的輸出是由記憶和當前時刻的輸入共同決定的。就像你如今大四,你的知識是由大四學到的知識(當前輸入)和大三以及大三之前學到的知識(記憶)的結合。RNN在這點上也相似,神經網絡最擅長作的就是經過一系列參數把不少內容整合到一塊兒,而後學習這個參數,所以就定義了RNN的基礎:
這裏的 函數表示激活函數,對於CNN來講,激活函數通常選取的都是 ,可是RNN通常選用
假設你大四快畢業了,要參加考研,請問你參加考研是先記住學過的內容而後去考研,仍是直接帶幾本書參加考研呢?答案很顯然。RNN的作法也就是預測的時候帶着當前時刻的記憶 去預測。假如你要預測"我是中國"的下一個詞,運用SoftMax在合適不過了,但預測不能直接用一個矩陣去預測,要轉爲一個向量,因此最終的公式表示爲:
RNN的結構細節: