2021年9月7日 星期二

TensorFlow 自然語言處理閱讀筆記

最近查詢發現借自母校圖書館的這本書被預約了 :

TensorFlow 自然語言處理 (2019, 籃子軒譯, 碁峰)


Source : 博客來

此書譯自 2018 年 Packt 出版的這本 : 



Source : 天瓏


這本書我在五月疫情爆發前借來已數月, 利用零星時間已大致瀏覽過一遍, 正打算要重讀+細讀卻被預約了, 參考 :


在快速發展的 NLP 領域來說, 雖然這本已是三年前的老書, 且 TensorFlow 已推出第二版 (此書使用 TensorFlow 第一版), 但基礎的 CNN, RNN, LSTM 等都有詳細說明. 由於 NLP 繁體中文書並不多, 故此書對入門者而言彌足珍貴. 摘要如下 :

前言 :  
  1. 深度學習本質上是可以找出原始資料與我們所需要的輸出之間對應關係的複雜神經網路. 深度學習不需要針對特定任務進行繁複的特徵工程. 
  2. 如果你想改變世界, 好好研究 NLP 就是一件很重要的事. 
  3. 最基本的深度學習演算法 : 全連結神經網路.
  4. 單詞內嵌 (word embedding) 亦稱為單詞向量 (word vector), 是單詞的一種數值化表示方式. 
  5. 遞迴神經網路 RNN (Recurrent Neural Netwok) 用來使時間序列型資料模型化, 可用來生成文字, 但 RNN 在保留長期記憶上效果不佳, 另一種更強大的網路稱為長短期記憶 LSTM (Long Short-Term Memory) 則可補其短. 
CH1 :
  1. NLP 的目標 : 讓機器理解人類口說與書寫的文字. NLP 是極具挑戰性的領域, 因為單詞與語意之間有高度複雜的非線性關係. 
  2. 傳統的 NLP 流程是一種統計式作法, 包括在文字預處理時刪除不需要的資料, 然後在特徵工程步驟中將文字轉成數值表示. 其中特徵工程 (feature engineering) 是最耗時, 但也是獲取良好表現的最關鍵步驟. 完成特徵工程後, 學習演算法根據所獲得之特徵與結構化之訓練資料與外部資源進行學習建立預測所需要之模型. 
  3. 文字預處理的目的是為了減少詞彙量, 從而減少對記憶體之需求. 預處理包含詞幹處理與分詞等. 對某些語言例如英語來說分詞處理相當簡單, 但對於中文, 日文, 泰文等沒有明顯單詞間隔的語言來說就不是那麼容易了. 
  4. 特徵工程主要的目標是讓演算法在進行學習時更容易些, 這些特徵都是基於人類對語言的了解 (需要領域專家即語言學家的參與), 以人工方式挑選出來的, 特徵的挑選對傳統 NLP 演算法的性能至關重要. BOW (Bag-Of-Word, 單詞袋) 與 n-gram 就是較常用的簡單特徵工程技術. 
  5. NLP 的任務 : 
    (1). 分詞 (tokenization) : 將文本切分成不可分割的單詞.
    (2). 消除歧義 (word-sense disambiguation, WSD)
    (3). 具名實體識別 (NER, Named Entity Recognition), 例如人地物機構等.
    (4). 詞性標記 (POS, Part-Of-Speech tagging) : 為單詞標記詞性
    (5). 句子或摘要分類 (sentence/synopsis classification)
    (6). 語言生成 (language generation)
    (7). 詢答系統 (Q&A) : 例如聊天機器人與虛擬助理
    (8). 機器翻譯 (MT, Machine Translation)
  6. 單詞袋 BOW (Bag-Of-Word) 是一種簡易的特徵工程技術, 它會根據單詞出現的頻率, 產生句子的另一種特徵表達方式. 首先針對所處理的句子建立所有用到的單詞組成的詞彙表 (vocabulary), 假設詞彙表長度為 V, 然後對句子中每個單詞在句中出現的次數作為相對應分量, 建立一個大小為 V 的特徵向量, 這些向量即 BOW. 單詞袋做法的缺點是它沒有保留單詞出現的次序, 因此會喪失前後文 (context) 相關的資訊. 
  7. n-gram 也是一種特徵工程技術, 它是將文字分解成許多由 n 個字母所組成的較小單元, 例如 2-gram 就是將文字以兩個字母或兩個單詞為單位移動拆解, 例如 "Hello World" 以兩個字母為單位可分解為 ['He', 'el', 'll', 'lo', 'o ', ' W', 'Wo', 'or', 'rl', 'ld']. 
  8. 傳統 NLP 作法的缺點 :
    (1). 預處理步驟會捨棄潛藏於文字內部的有用資訊 (例如次序).
    (2). 特徵工程需要領域專家以人工方式處理.
    (3). 為提高效能所需之外部免費資源不多, 自建又曠日廢時. 
  9. 深度學習 NLP 作法優點 :
    (1). 不需要昂貴且須人工處理之特徵工程.
    (2). 深度模型可以同時進行特徵與任務的學習.
    (3). 深度模型含有大量參數 (權重), 比特徵工程人工挑選的更多.
  10. 深度模型是一個從原始資料直接對應到預測結果的端對端 (end-to-end) 模型, 中間的隱藏層負責從原始資料中學習可以精確預測輸出的良好特徵, 但這些權重參數的可解釋性差, 故深度模型常被認為是黑盒子. 
  11. Fukushima 於 1979 年引進了 neocognitron 概念, 為後來的 CNN 卷積神經網路奠定了基礎. 感知器採用的是一維輸入, 而 neocognition 不同之處在於它使用卷積操作來處理二維輸入. 
  12. 人工神經網路會以反向傳播方式傳遞輸出與目標間的誤差訊號, 計算出每一層與前一層的 Jacobian 矩陣用來最佳化網路參數. 不過梯度消失問題限制了神經網路的深度 (層數), 這是因為在使用偏微分連鎖規則計算權重的梯度 (即 Jacobian 矩陣) 時, 越接近輸入層的梯度會變得非常小甚至消失. 不過使用例如 ReLu 這樣的非線性激活函數可以減輕深度模型中梯度消失的問題. 
  13. 與其他機器學習模型相比, 增加隱藏層數目的能力可說是讓神經網路模型明顯擁有更好表現的主要原因. 
  14. 卷積神經網路 (CNN) 可以從二維資料 (例如 RGB 圖片) 中進行學習, 而多層感知器 (MLP) 則是必須把輸入轉成一維向量, 從而導致失去重要的空間維度相關資訊. 
  15. 處理文字最直觀的方式是把它當作一系列的字元來處理, 而學習模型必須具有將這種時間序列與以模型化的能力, 因此擁有記憶能力非常重要, 例如 RNN 網路, 但此記憶並非是網路透過學習得到的權重, 切勿混淆. 序列式模型例如 RNN 不但會學習調整權重, 也會關注序列的前一個元素, 藉此來預測序列的下一個輸出. 
  16. RNN 的一個明顯缺點是其記憶無法超過大概 7 個時間步驟, 可說缺少長期記憶能力, 屬於短期記憶模型, 而 LSTM (長短期記憶) 模型則是 RNN 的擴展, 具有長期記憶能力. 
  17. 深度學習主要分成兩大類 :
    (1). 非序列模型 : 一次只處理單一輸入 (例如圖片分類)
    (2). 序列模型 : 可處理任意長度的序列輸入
    非序列模型又可分為處理一維的多層感知器, 與處理二維的 CNN 卷積網路, 依層數又可分為深度 (< 20 層) 與極深度 (例如數百層) 網路.  
  18. 多層感知器 (MLP) 是最早期的一種全連接神經網路 (fully-connected neural network), 其目標是將輸入 (例如圖片或句子) 對應到特定的標籤, 即透過 h=sigma(W*x+b) 的轉換, 計算 x 所對應之輸出, 其中 sigma() 為 S 型激活函數, 然後再經過一個 softmax() 分類器, 具有最高 softmax 值的輸出節點會被視為輸入資料的相應輸出標籤, 其與預測輸出標籤的差異則會透過均方損失誤差函數 (mean square loss) 進行反饋, 並以隨機最佳化工具 (例如 SGD 隨機梯度遞減演算法) 以調整權重參數使神經網路達到最佳化.   

CH3 : Word2vec 學習單詞內嵌
  1. Word2vec=單詞內嵌=單詞向量=單詞的分散式數值表示法. 此乃透過整個表達向量中, 各分量所構成的特定模式來表達單詞語意, 而不只是採用單一分量 (例如江某分量設為 1, 其餘分量為 0).
  2. 單詞的語意 (meaning) 就是該單詞所要傳遞的想法或內容. 
  3. 單詞的數值表達方式是許多 NLP 任務的基礎, 它不僅要保持單詞的語意, 還要保留單詞的前後文的相關訊息.
  4. 以數值表示單詞的傳統做法有兩種 :
    (1). 使用外部資源 : 例如 WordNet
    (2). 不使用外部資源 (本地化作法) : 例如 one-hot 與 TF-IDF 等
  5. WordNet 是以表達單詞最流行的傳統做法, 又稱為 NLP 統計做法, 它必須依賴外部詞彙知識庫才能運作, 這個知識庫會對單詞的定義, 詞性, 同義詞, 原型, 衍生詞等訊息進行編碼, 可以讓使用者推測單詞的相關訊息, 例如計算兩個單詞語意之相似度. 
  6. WordNet 由普林斯頓大學心理系創設, 目前由資訊科學系維護, 目前擁有超過 15 萬個單詞, 10 萬個同義詞組, 內容不限於英語, 已建立多語言的 WordNet, 查詢網址 :
    http://globalwordnet.org/wordnets-in-the-world/ 
  7. 想了解如何使用 WordNet 需搞清楚其使用之術語, 例如 :
    Synset : 同義詞集, 一組同義詞
    Lemmas : 同義詞集內所包含的各個同義詞
CH5 : CNN 捲積神經網路/句子分類
  1. CNN 在許多類型的任務中都已達到最先進的表現, 例如圖片分類, 物體偵測, 語音辨識, 與句子分類等. 
  2. 與全連結神經網路 (FCNN, Full Connected Neural Network) 相比, CNN 主要的優點是具有更少數量的參數, 因此可以較不擔心記憶體溢出問題, 也可以使用較深度模型.
  3. CNN 在結構上是由卷積層, 池化層, 與全連接層這三種網路層疊起來的, 它在神經網路中加入了卷積 (convolution) 與池化 (pooling) 操作, 引入了一些超參數 (super parameter), 例如過濾器大小 (filter size), 填充 (padding), 以及步幅 (stride) 等. 
  4. CNN 運作時輸入矩陣會先送入卷積層, 它會使用一個權重矩陣 (稱為過濾器 filter 或卷積核心 kernel) 滑過整個輸入矩陣 (即進行卷積運算), 此權重矩陣比輸入矩陣小很多 (例如 3x3 或 5x5), 每次只能覆蓋輸入矩陣的一小塊區域, 當它沿著各維度一格一格滑動進行卷積運算時便產生輸出結果矩陣, 如果輸入矩陣中存在與過濾器相似的特定模式, 卷積運算就會得到較高的值 (強化), 否則就會得到很小的值 (弱化), 因此卷積運算後的結果就會指出在各位置是否存在特定模式 (即過濾器所表示的) 的圖案. 
  5. 在卷積層之間會穿插池化層, 它會將輸入分成好幾塊, 透過最大, 最小, 或平均等池化措施轉換成單一元素, 池化的作用是降低輸入的維度, 且讓 CNN 具有平移不變性, 迫使 CNN 在訊息較少的情況下學習. 
CH6 : RNN 遞迴神經網路
  1. RNN 是一種用來處理時間序列的特殊神經網路, RNN 會持續使用一個狀態變數 (state variable) 來擷取序列中存在的各種特定模式, 適合用來處理具有時間順序性的序列資料, 例如文字或股價等.
  2. 傳統的正向饋送神經網路並沒有能力擷取出序列資料中的特定模式, 除非資料所採用的特徵表達方式即可擷取出序列中的特定模式, 但是要取得這種特徵表達方式是很困難的. 替代方式是替每一個時間序列位置準備一組特徵組合, 但這種做法會耗掉大量記憶體. RNN 捨棄這種作法, 採用在任一時間都共用同一組參數, 當我們觀察序列中的每個輸入, 狀態變數就會隨時間更新, 只要結合狀態向量, 就可以根據先前所觀察到的序列值, 預測出序列的下一個值. 由於一次只處理單一個資料, 因此 RNN 可以處理任意長度之資料, 不需要再使用特殊標記把資料填充到特定長度. 
  3. RNN 會持續維護一個狀態變數, 這個狀態變數會因為 RNN 持續看到更多資料而隨時間演變, 它會隨時間的推移, 透過一組遞迴連結 (recurrent connection) 持續進行更新. 遞迴連結的存在就是 RNN 與正向饋送網路在結構上最主要的差異. 它可以被理解為 RNN 在過去所學習到一系列記憶彼此間的連結, 而這些連結全都與 RNN 目前的狀態變數有關. 總之, 遞迴連結使 RNN 可以根據過去的記憶更新目前的狀態變數, 使其有能力根據先前與目前的輸入進行預測. 
  4. 正向饋送神經網路在時間 t 所預測的輸出 yt 完全只能依據目前的輸入 xt 來決定, 亦即它完全不知道 xt 以前的狀況, 如果目前的輸入除了與目前輸入有關, 還受到過去的輸入影響 (例如時間序列資料), 那麼正向饋送神經網路將得到失敗的結果, 亦即, 它在序列型任務中完全不管用. 

沒有留言:

張貼留言