官术网_书友最值得收藏!

3.1 基于推理的方法和神經網絡

用向量表示單詞的研究最近正在如火如荼地展開,其中比較成功的方法大致可以分為兩種:一種是基于計數的方法;另一種是基于推理的方法。雖然兩者在獲得單詞含義的方法上差別很大,但是兩者的背景都是分布式假設。

本節我們將指出基于計數的方法的問題,并從宏觀角度說明它的替代方法——基于推理的方法的優點。另外,為了做好word2vec的準備工作,我們會看一個用神經網絡處理單詞的例子。

3.1.1 基于計數的方法的問題

如上一章所說,基于計數的方法根據一個單詞周圍的單詞的出現頻數來表示該單詞。具體來說,先生成所有單詞的共現矩陣,再對這個矩陣進行SVD,以獲得密集向量(單詞的分布式表示)。但是,基于計數的方法在處理大規模語料庫時會出現問題。

在現實世界中,語料庫處理的單詞數量非常大。比如,據說英文的詞匯量超過100萬個。如果詞匯量超過100萬個,那么使用基于計數的方法就需要生成一個100萬×100萬的龐大矩陣,但對如此龐大的矩陣執行SVD顯然是不現實的。

對于一個n×n的矩陣,SVD的復雜度是On3),這表示計算量與n的立方成比例增長。如此大的計算成本,即便是超級計算機也無法勝任。實際上,利用近似方法和稀疏矩陣的性質,可以在一定程度上提高處理速度,但還是需要大量的計算資源和時間。

基于計數的方法使用整個語料庫的統計數據(共現矩陣和PPMI等),通過一次處理(SVD等)獲得單詞的分布式表示。而基于推理的方法使用神經網絡,通常在mini-batch數據上進行學習。這意味著神經網絡一次只需要看一部分學習數據(mini-batch),并反復更新權重。這種學習機制上的差異如圖3-1所示。

圖3-1 基于計數的方法和基于推理的方法的比較

如圖3-1所示,基于計數的方法一次性處理全部學習數據;反之,基于推理的方法使用部分學習數據逐步學習。這意味著,在詞匯量很大的語料庫中,即使SVD等的計算量太大導致計算機難以處理,神經網絡也可以在部分數據上學習。并且,神經網絡的學習可以使用多臺機器、多個GPU并行執行,從而加速整個學習過程。在這方面,基于推理的方法更有優勢。

基于推理的方法和基于計數的方法相比,還有一些其他的優點。關于這一點,在詳細說明基于推理的方法(特別是word2vec)之后,我們會在3.5.3節再次討論。

3.1.2 基于推理的方法的概要

基于推理的方法的主要操作是“推理”。如圖3-2所示,當給出周圍的單詞(上下文)時,預測“?”處會出現什么單詞,這就是推理。

圖3-2 基于兩邊的單詞(上下文),預測“?”處出現什么單詞

解開圖3-2中的推理問題并學習規律,就是基于推理的方法的主要任務。通過反復求解這些推理問題,可以學習到單詞的出現模式。從“模型視角”出發,這個推理問題如圖3-3所示。

圖3-3 基于推理的方法:輸入上下文,模型輸出各個單詞的出現概率

如圖3-3所示,基于推理的方法引入了某種模型,我們將神經網絡用于此模型。這個模型接收上下文信息作為輸入,并輸出(可能出現的)各個單詞的出現概率。在這樣的框架中,使用語料庫來學習模型,使之能做出正確的預測。另外,作為模型學習的產物,我們得到了單詞的分布式表示。這就是基于推理的方法的全貌。

基于推理的方法和基于計數的方法一樣,也基于分布式假設。分布式假設假設“單詞含義由其周圍的單詞構成”。基于推理的方法將這一假設歸結為了上面的預測問題。由此可見,不管是哪種方法,如何對基于分布式假設的“單詞共現”建模都是最重要的研究主題。

3.1.3 神經網絡中單詞的處理方法

從現在開始,我們將使用神經網絡來處理單詞。但是,神經網絡無法直接處理you或say這樣的單詞,要用神經網絡處理單詞,需要先將單詞轉化為固定長度的向量。對此,一種方式是將單詞轉換為one-hot表示(one-hot向量)。在one-hot表示中,只有一個元素是1,其他元素都是0。

我們來看一個one-hot表示的例子。和上一章一樣,我們用“You say goodbye and I say hello.”這個一句話的語料庫來說明。在這個語料庫中,一共有7個單詞(“you”“say”“goodbye”“and”“i”“hello”“.”)。此時,各個單詞可以轉化為圖3-4所示的one-hot表示。

圖3-4 單詞、單詞ID以及它們的one-hot表示

如圖3-4所示,單詞可以表示為文本、單詞ID和one-hot表示。此時,要將單詞轉化為one-hot表示,就需要準備元素個數與詞匯個數相等的向量,并將單詞ID對應的元素設為1,其他元素設為0。像這樣,只要將單詞轉化為固定長度的向量,神經網絡的輸入層的神經元個數就可以固定下來(圖3-5)。

圖3-5 輸入層的神經元:各個神經元對應于各個單詞。圖中神經元為1的地方用黑色繪制,為0的地方用白色繪制

如圖3-5所示,輸入層由7個神經元表示,分別對應于7個單詞(第1個神經元對應于you,第2個神經元對應于say)。

現在事情變得很簡單了。因為只要將單詞表示為向量,這些向量就可以由構成神經網絡的各種“層”來處理。比如,對于one-hot表示的某個單詞,使用全連接層對其進行變換的情況如圖3-6所示。

圖3-6 基于神經網絡的全連接層的變換:輸入層的各個神經元分別對應于7個單詞(中間層的神經元暫為3個)

如圖3-6所示,全連接層通過箭頭連接所有節點。這些箭頭擁有權重(參數),它們和輸入層神經元的加權和成為中間層的神經元。另外,本章使用的全連接層將省略偏置(這是為了配合后文對word2vec的說明)。

沒有偏置的全連接層相當于在計算矩陣乘積。在很多深度學習的框架中,在生成全連接層時,都可以選擇不使用偏置。在本書中,不使用偏置的全連接層相當于MatMul層(該層已經在第1章中實現)。

在圖3-6中,神經元之間的連接是用箭頭表示的。之后,為了明確地顯示權重,我們將使用圖3-7所示的方法。

圖3-7 基于全連接層的變換的簡化圖示:將全連接層的權重表示為一個7 × 3形狀的W矩陣

現在,我們看一下代碼。這里的全連接層變換可以寫成如下的Python代碼。

        import numpy as np

        c = np.array([[1, 0, 0, 0, 0, 0, 0]])  # 輸入
        W = np.random.randn(7, 3)                # 權重
        h = np.dot(c, W)                          # 中間節點
        print (h)
        # [[-0.70012195  0.25204755 -0.79774592]]

這段代碼將單詞ID為0的單詞表示為了one-hot表示,并用全連接層對其進行了變換。作為復習,全連接層的計算通過矩陣乘積進行。這可以用NumPy的np.dot()來實現(省略偏置)。

這里,輸入數據(變量c)的維數(ndim)是2。這是考慮了mini-batch處理,將各個數據保存在了第1維(0維度)中。

希望讀者注意一下c和W進行矩陣乘積計算的地方。此處,c是one-hot表示,單詞ID對應的元素是1,其他地方都是0。因此,如圖3-8所示,上述代碼中的c和W的矩陣乘積相當于“提取”權重的對應行向量。

圖3-8 在上下文c和權重W的矩陣乘積中,對應位置的行向量被提取(權重的各個元素的大小用灰度表示)

這里,僅為了提取權重的行向量而進行矩陣乘積計算好像不是很有效率。關于這一點,我們將在4.1節進行改進。另外,上述代碼的功能也可以使用第1章中實現的MatMul層完成,如下所示。

        import sys
        sys.path.append('..')
        import numpy as np
        from common.layers import MatMul

        c = np.array([[1, 0, 0, 0, 0, 0, 0]])
        W = np.random.randn(7, 3)
        layer = MatMul(W)
        h = layer.forward(c)
        print (h)
        # [[-0.70012195  0.25204755 -0.79774592]]

這里,我們先導入了common目錄下的MatMul層。之后,將MatMul層的權重設為了W,并使用forward()方法執行正向傳播。

主站蜘蛛池模板: 沁源县| 图木舒克市| 大宁县| 昭苏县| 清远市| 延寿县| 河西区| 荃湾区| 营山县| 黎平县| 奉化市| 阳朔县| 卓资县| 龙川县| 石柱| 嵩明县| 大安市| 时尚| 白玉县| 承德市| 华坪县| 山阴县| 峨眉山市| 宿迁市| 石泉县| 山阳县| 安康市| 兴海县| 墨玉县| 子洲县| 乌拉特前旗| 皮山县| 定日县| 凯里市| 晴隆县| 新安县| 龙江县| 长沙县| 英超| 黄龙县| 竹北市|