Mark Chang's Blog

Machine Learning, Deep Learning and Python

Neural Networks Backward Propagation

Introduction

在做 Logistic Regression的時候,可以用 gradient descent 來做訓練,而類神經網路本身即是很多層的 Logistic Regression 所構成,也可以用同樣方法來做訓練。

但類神經網路在訓練過程時,需要分為兩個步驟,為: Forward PhaseBackward Phase 。 也就是要先從 input 把值傳到 output,再從 output 往回傳遞 error 到每一層的神經元,去更新層與層之間權重的參數。

Forward Phase

Forward Phase 時,先從 input 將值一層層傳遞到 output

對於一個簡單的神經元 ,如下圖 <圖一>

將一筆訓練資料 bias 輸入到神經元 到輸出的過程,分成兩步,分別為 ,過程如下:

Hierarchical Probabilistic Neural Network Language Model (Hierarchical Softmax)

Introduction

將類神經網路應用在自然語言處理領域的模型有Neural Probabilistic Language Model(NPLM),但在實際應用時,運算瓶頸在於 output layer 的神經元個數,等同於總字彙量

每訓練一個字時,要讓 output layer 在那個字所對應的神經元輸出值為 ,而其他 個神經元的輸出為 , 這樣總共要計算 次,會使得訓練變得沒效率。

若要減少於 output layer 的訓練時間,可以把 output layer 的字作分類階層,先判別輸出的字是屬於哪類,再判斷其子類別,最後再判斷是哪個字。

Hierarchical Softmax

給定訓練資料為 ,輸出字的集合為 。當輸入的字串為 ,輸出的字為 時,訓練的演算法要將機率 最佳化。

如果 10000 種字,若沒有分類階層,訓練時就要直接對 做計算,即是對這 10000種字做計算,使 所對應的神經元輸出為 1 ,其它 9999 個神經元輸出 0 ,這樣要計算 10000 次,如下圖:

若在訓練前,就事先把 中的字彙分類好,以 代表字 的類別,則可以改成用以下機率做最佳化:

Neural Probabilistic Language Model

Introduction

傳統的語言模型 Ngram ,只考慮一個句子中的前面幾個字,來預測下個字是什麼。

當使用較長的 Ngram 的時候,則在測試資料中,找到和訓練資料相同的機率,就會大幅降低,甚至使機率為0,此種現象稱為 curse of dimensionality 。這類問題,傳統上可用 Smoothing, InterpolationBackoff來處理。

另一種對付 curse of dimensionality 的方法,可以用 Distributional Semantics 的概念,即把詞彙的語意用向量來表示。在訓練資料中,根據這個詞和鄰近周圍的詞的關係,計算出向量中各個維度的值,得出來的值即可表示這個詞的語意。例如,假設在訓練資料中出現 The cat is walking in the bedroomA dog was running in a room 這兩個句子,計算出 dogcat 語意向量中的詞,可得出這兩個詞在語意上是相近的。

所謂的 Neural Probabilistic Language Model ,即是用類神經網路,從語料庫中計算出各個詞彙的語意向量值。

Neural Probabilistic Language Model

給定訓練資料為 一連串的字,每個字都可包含於詞庫 中,即 ,然後,用此資料訓練出語言模型:

Machine Translation : IBM Model 1

Introduction

繼續之前統計機器翻譯所提到的,要計算 Translation Model ,即給定某個英文句子 ,則它被翻自成中文句子 的機率是多少?

計算 Translation Model 需要用到較複雜的模型,例如 IBM Model 。而 IBM Model 1 是最基本的一種 IBM Model

Alignment

在講 IBM Model 1 之前,要先介紹 alignment 是什麼。因為,要將英文翻譯成中文,則中文字詞的順序可能跟英文字詞的順序,不太一樣。例如:

這不是一個蘋果 This is not an apple

這兩個句子,在中文中的 “不是” 英文為 “is not(是不)” 。為了考慮到字詞順序會變,因此要定義 alignment ,來記錄中文句子中的哪個字,對應到英文句子中的哪個字。

此例中, alignment,表示第一個中文字對應到第一個英文字,第二個中文字對應到第三個英文字,以此類推。

Boolean Retrieval

Information Retrieval

所謂的資訊檢索( Information Retrieval ),就是從大量非結構的資料,例如網頁,根據某些關鍵字,找出具有此關鍵字的文件。例如,搜尋引擎,即是一種資訊檢索的應用。

資訊檢索的演算法,其實跟我們要在某本書中,找尋某個字的方法差不多。

例如我們想在 Introduction to Information Retrieval 這本教科書中,找到 informational queries 這個詞在哪一頁,如果從第一頁開始,一個字一個字慢慢找,要比對成千上萬個字才能找到。

但如果我們翻到書本後面的 Index (如下) ,即可很快找到 informational queries 這個字是在第 432 頁。

1
2
3
4
5
6
7
...
information gain, 285 
information need, 5, 152 
information retrieval, 1 
informational queries, 432 
inner product, 121 
...

所以,資訊檢索,最核心的概念就是建立 Index ,這樣就可以快速找到哪些文件中具有某個關鍵字。

Machine Translation : Statistical Machine Translation

Introduction

Statistical Machine Translation (統計機器翻譯)是一種機器翻譯的演算法,這種方法藉由從 parallel corpus(平行語料庫)語料庫,當成訓練資料,訓練出機器學習的模型,以此將句子翻譯成另一個句子。

平行語料庫中包含大量句子,這些句子意思一樣,但分別用兩種語言寫成,例如:

1
2
3
4
5
6
7
這是一個蘋果。
This is an apple.

桌上有一本書。
There is a book on the table.

...... 

藉由這種平行語料庫,就可以用統計的方式,讓機器學會如何將一種語言,翻譯成另一種語言。

Noisy Channel Model

Noicy Channel Model 是一種常用的統計機器翻譯的模型。

Brown Clustering

Introduction

Clustering 是一種非監督式的機器學習方法。所謂非監督式的學習方法,即是不需要事先提供人工標記好的語料庫給機器學習的演算法。可以直接從未標示的語料庫中,根據既有的特徵來做分類。

例如,可以根據某字的前面或後面有哪些字,來決定哪些字屬於同一類。給一語料庫如下:

The dog runs.

A dog jumps.

The dog jumps.

A cat runs.

The cat jumps.

The cat runs.

根據這些例句,可以把 catdog 歸在同一類,因為它們前面的字是 thea ,同理,也可以把 runjump 歸在同一類。

Defining the Formulation

現在來定義一下,進行這種分類所需要的數學公式。

Minimum Edit Distance

Minimum Edit Distance

Minimum Edit Distance (最小編輯距離),是用來計算兩個字串的相似程度。

可應用於拼字校正、或是計算兩個DNA序列的相似程度。

例如,假設有三個DNA序列:

1. AGCCT

2. AACCT

3. ATCT

直覺上,會認為,DNA序列 2.1. 的相似程度比 3.1. 的相似程度還要高。

但為何是 2.1. 較相似?相似程度又是多少?

若要把兩序列的相似程度量化成數值,就要計算「最小編輯距離」,最小編輯距離越小,就表示兩序列越相似。

Defining of Minimum Edit Distance

我們採用 Levenshtein 的最小編輯距離的定義,這是一種最簡單的定義方式。依此定義,若一個字串,編輯成另外一個字串,可以進行下面三種動作。

R Data Splitting

在做機器學習演算法時,常常需要把資料分成 training setvalidation set 這兩個資料組。

但是,要如何切割,才可以讓具有不同 label 的資料,在這兩個資料組中,平均分佈?

用統計語言 R 處理 iris 資料組為例。iris 的資料如下:

index Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
……
51 7.0 3.2 4.7 1.4 versicolor
52 6.4 3.2 4.5 1.5 versicolor
……
101 6.3 3.3 6.0 2.5 virginica
102 5.8 2.7 5.1 1.9 virginica
……

Python Logging

1. Introduction

python 程式中想要印出東西, 通常會用 print , 要 print 東西的時機很多, 例如, Debug 時要 print , 有 Error 時也要 print , 正常執行情況下也可能要 print 一些資訊

但是當程式寫好後, 原本用 print 出來的 debug message 就需要手動移除, 諸如此類的問題, 單純用 pring 就不方便

如果是用 logging , 可以設各種不同的層次, 例如在 debug 的時候, 印出 debug message , debug 結束後就不要印 debug message , 這樣只要調整一個參數即可, 不需要把所有用印出 debug 的程式碼都砍掉

pythonlogging 分成以下五個等級

等級 使用時機
DEBUG 程式執行時的詳細資訊, 可以找出BUG在哪
INFO 程式執行時的基本資訊, 用來顯示程式正常執行時的狀況
WARNING 程式執行時遇到某些狀況超乎預期, 或未來可能遇到問題, 但程式目前仍可以繼續執行
ERROR 程式執行時發生問題, 可能導致結果產生錯誤
CRITICAL 程式執行時遇到嚴重問題, 程式必須馬上停止