動手學深度學習Task7

2021-10-03 05:45:47 字數 3425 閱讀 7790

一、優化演算法高階

二、word2vec

三、詞嵌入高階

一、優化演算法高階

在 section 11.4 中,我們提到,目標函式有關自變數的梯度代表了目標函式在自變數當前位置下降最快的方向。因此,梯度下降也叫作最陡下降(steepest descent)。在每次迭代中,梯度下降根據自變數當前位置,沿著當前位置的梯度更新自變數。然而,如果自變數的迭代方向僅僅取決於自變數當前位置,這可能會帶來一些問題。對於noisy gradient,我們需要謹慎的選取學習率和batch size, 來控制梯度方差和收斂的結果。

gt=∂w1|bt|∑i∈btf(xi,wt−1)=1|bt|∑i∈btgi,t−1.

在二階優化中,我們使用hessian matrix的逆矩陣(或者pseudo inverse)來左乘梯度向量 i.e.δx=h−1g ,這樣的做法稱為precondition,相當於將 h 對映為乙個單位矩陣,擁有分布均勻的spectrum,也即我們去優化的等價標函式的hessian matrix為良好的identity matrix。

與section 11.4一節中不同,這裡將 x21 係數從 1 減小到了 0.1 。下面實現基於這個目標函式的梯度下降,並演示使用學習率為 0.4 時自變數的迭代軌跡。

adagrad

在之前介紹過的優化演算法中,目標函式自變數的每乙個元素在相同時間步都使用同乙個學習率來自我迭代。舉個例子,假設目標函式為 f ,自變數為乙個二維向量 [x1,x2]⊤ ,該向量中每乙個元素在迭代時都使用相同的學習率。例如,在學習率為 η 的梯度下降中,元素 x1 和 x2 都使用相同的學習率 η 來自我迭代:

x1←x1−η∂f∂x1,x2←x2−η∂f∂x2.

在「動量法」一節裡我們看到當 x1 和 x2 的梯度值有較大差別時,需要選擇足夠小的學習率使得自變數在梯度值較大的維度上不發散。但這樣會導致自變數在梯度值較小的維度上迭代過慢。動量法依賴指數加權移動平均使得自變數的更新方向更加一致,從而降低發散的可能。本節我們介紹adagrad演算法,它根據自變數在每個維度的梯度值的大小來調整各個維度上的學習率,從而避免統一的學習率難以適應所有維度的問題 [1]。

二、word2vec

f(x)->y

在 nlp 中,把 x 看做乙個句子裡的乙個詞語,y 是這個詞語的上下文詞語,那麼這裡的 f,便是 nlp 中經常出現的『語言模型』(language model),這個模型的目的,就是判斷 (x,y) 這個樣本,是否符合自然語言的法則,更通俗點說就是:詞語x和詞語y放在一起,是不是人話。

word2vec 正是**於這個思想,但它的最終目的,不是要把 f 訓練得多麼完美,而是只關心模型訓練完後的副產物——模型引數(這裡特指神經網路的權重),並將這些引數,作為輸入 x 的某種向量化的表示,這個向量便叫做——詞向量(這裡看不懂沒關係,下一節我們詳細剖析)。

我們來看個例子,如何用 word2vec 尋找相似詞:

對於一句話:『她們 誇 吳彥祖 帥 到 沒朋友』,如果輸入 x 是『吳彥祖』,那麼 y 可以是『她們』、『誇』、『帥』、『沒朋友』這些詞

現有另一句話:『她們 誇 我 帥 到 沒朋友』,如果輸入 x 是『我』,那麼不難發現,這裡的上下文 y 跟上面一句話一樣

從而 f(吳彥祖) = f(我) = y,所以大資料告訴我們:我 = 吳彥祖(完美的結論)

3.2. skip-gram 和 cbow 模型

上面我們提到了語言模型

如果是用乙個詞語作為輸入,來**它周圍的上下文,那這個模型叫做『skip-gram 模型』

而如果是拿乙個詞語的上下文作為輸入,來**這個詞語本身,則是 『cbow 模型』

3.2.1 skip-gram 和 cbow 的簡單情形

我們先來看個最簡單的例子。上面說到, y 是 x 的上下文,所以 y 只取上下文裡乙個詞語的時候,語言模型就變成:

用當前詞 x **它的下乙個詞 y

但如上面所說,一般的數學模型只接受數值型輸入,這裡的 x 該怎麼表示呢? 顯然不能用 word2vec,因為這是我們訓練完模型的產物,現在我們想要的是 x 的乙個原始輸入形式。

答案是:one-hot encoder

所謂 one-hot encoder,其思想跟特徵工程裡處理類別變數的 one-hot 一樣(參考我的前作『資料探勘比賽通用框架』、『深挖one-hot和dummy背後的玄機』)。本質上是用乙個只含乙個 1、其他都是 0 的向量來唯一表示詞語。

我舉個例子,假設全世界所有的詞語總共有 v 個,這 v 個詞語有自己的先後順序,假設『吳彥祖』這個詞是第1個詞,『我』這個單詞是第2個詞,那麼『吳彥祖』就可以表示為乙個 v 維全零向量、把第1個位置的0變成1,而『我』同樣表示為 v 維全零向量、把第2個位置的0變成1。這樣,每個詞語都可以找到屬於自己的唯一表示。

ok,那我們接下來就可以看看 skip-gram 的網路結構了,x 就是上面提到的 one-hot encoder 形式的輸入,y 是在這 v 個詞上輸出的概率,我們希望跟真實的 y 的 one-hot encoder 一樣。

首先說明一點:隱層的啟用函式其實是線性的,相當於沒做任何處理(這也是 word2vec 簡化之前語言模型的獨到之處),我們要訓練這個神經網路,用反向傳播演算法,本質上是鏈式求導,在此不展開說明了,

當模型訓練完後,最後得到的其實是神經網路的權重,比如現在輸入乙個 x 的 one-hot encoder: [1,0,0,…,0],對應剛說的那個詞語『吳彥祖』,則在輸入層到隱含層的權重裡,只有對應 1 這個位置的權重被啟用,這些權重的個數,跟隱含層節點數是一致的,從而這些權重組成乙個向量 vx 來表示x,而因為每個詞語的 one-hot encoder 裡面 1 的位置是不同的,所以,這個向量 vx 就可以用來唯一表示 x。

注意:上面這段話說的就是 word2vec 的精髓!!

此外,我們剛說了,輸出 y 也是用 v 個節點表示的,對應v個詞語,所以其實,我們把輸出節點置成 [1,0,0,…,0],它也能表示『吳彥祖』這個單詞,但是啟用的是隱含層到輸出層的權重,這些權重的個數,跟隱含層一樣,也可以組成乙個向量 vy,跟上面提到的 vx 維度一樣,並且可以看做是詞語『吳彥祖』的另一種詞向量。而這兩種詞向量 vx 和 vy,正是 mikolov 在**裡所提到的,『輸入向量』和『輸出向量』,一般我們用『輸入向量』。

需要提到一點的是,這個詞向量的維度(與隱含層節點數一致)一般情況下要遠遠小於詞語總數 v 的大小,所以 word2vec 本質上是一種降維操作——把詞語從 one-hot encoder 形式的表示降維到 word2vec 形式的表示。

三、詞嵌入高階

在「word2vec的實現」一節中,我們在小規模資料集上訓練了乙個 word2vec 詞嵌入模型,並通過詞向量的余弦相似度搜尋近義詞。雖然 word2vec 已經能夠成功地將離散的單詞轉換為連續的詞向量,並能一定程度上地儲存詞與詞之間的近似關係,但 word2vec 模型仍不是完美的,它還可以被進一步地改進:

動手學深度學習 task01

task 1 線性回歸 多層感知機 softmax函式 1 線性回歸作為基本的機器學習演算法,實現較簡單,應用廣泛。以下為用pytorch編寫的線性回歸類 import torch.nn as nn import torch from torch.autograd import variable f...

動手學深度學習Task3

過擬合 欠擬合及其解決方案 梯度消失 梯度 迴圈神經網路高階 1 過擬合和欠擬合 過擬合 模型的訓練誤差遠小於它在測試資料集上的誤差,我們稱該現象為過擬合 欠擬合 模型訓練誤差無法降低.如何應對欠擬合和過擬合?在這裡我們重點討論兩個因素 模型複雜度和訓練資料集大小。1.1.1 模型複雜度 為了解釋模...

Go學習之旅 Task7

在go語言中函式定義格式如下 func functionname parameter list returntypes 例1 下面的函式是用於求兩個數的和 func getsum num1 int num2 int int 這個函式傳遞了兩個引數,分別為num1與num2,並且他們都為int型別,將...