顯示具有 機器學習 標籤的文章。 顯示所有文章
顯示具有 機器學習 標籤的文章。 顯示所有文章

2018年1月26日 星期五

機器學習(10)--訊息量、資訊熵(Information Entropy)

訊息量

        在資訊理論中,訊息量是有確定解釋並可以量化計算的,這裡提到的訊息量是一種資訊數量化,度量的規則。
        用科學公式性的方法去量化一段文字有多少資訊的想法,最早是由哈萊特(RVL Hartley)在1928年首先提出。他將消息數的對數(log)定義為訊息量。若信源有m種消息,且每個消息是以相等的可能性產生的,該信源的訊息量可表示如下:



        上述公式是一個以m為引數的對數函數,舉個具體的例子:
假設中國桌球隊與巴西桌球隊的男子單打比賽,注意它不存在平局的狀況,也就是說要麼中國桌球隊獲勝不然就是巴西桌球隊獲勝,這兩個就是已經所有可能發生的情形。只有兩種情形,在上述公式中即m=2,信源有兩種,即"中國隊獲勝巴西隊失敗"或是"巴西隊獲勝中國隊失敗"。將m=2帶入上述公式:

       訊息量為1,單位是bit。

2017年7月3日 星期一

深度學習(5)--使用Tensorflow實現類AlexNet手寫數字辨識


 這一節介紹另一手寫數字辨識的範例,這次使用Tensorflow來實現類似Alexnet的架構。跟上一個範例一樣使用MNIST數據集來做訓練與測試。

    上一個範例請參閱:
深度學習(4)--使用Tensorflow實現類Lenet5手寫數字辨識


首先還是先來回顧Alexnet的經典架構,如下<圖一>
    2012年,Hinton的學生Alex Krizhevsky提出了深度卷積神經網絡模型AlexNet,它可以算是LeNet一種更深更廣的版本。AlexNet包含了幾個較新的技術點,也首次在CNN中成功應用了
ReLU,Dropout,LRN等Trick。同時AlexNet也使用了GPU進行了運算加速。
    AlexNet包含了6億三千萬個連接,6000萬個參數和65萬個神經元,擁有五個卷積層,其中3個卷積層後面連接最大池化層,最後還有3個全連接層。AlexNet以顯著的優勢贏得了競爭激烈的ILSVRC 2012比賽,Top-5的錯誤率降低至16.4%,比第二名的成績26.2%錯誤率有了巨大的提升。

<圖一>Alexnet網絡架構


2017年5月20日 星期六

深度學習(4)--使用Tensorflow實現類Lenet5手寫數字辨識


    這一節介紹一完整的手寫數字辨識的範例,使用Tensorflow來實現類似Lenet5的架構。除了使用MNIST數據集來做訓練與測試外,我們將訓練好的模型儲存起來,並用微軟小畫家自行手寫幾張數字來進行實際的辨識預測,最後使用Kaggle網站上的手寫數字數據進行預測,並將結果上傳至kaggle網站上打分數,得到預測的成績。

   本文主要提供程式實作,不會再提到太多相關的理論,有關相關的理論,大多可以在最底下之前提過的文章或參考資料閱讀相關理論。這個程式的建立環境是python 3.5 +tensorflow1.10 win10底下使用GPU加速運算,估計跑在Linux或是純CPU運算應該也沒太大問題。


首先來回顧Lenet5的經典架構,如下<圖一>
Lenet5模型是Yann LeCun教授於1998年在論文Gradient-based learning applied to document recognition中提出的,它是第一個成功應用於數字識別問題的卷積神經網路。在MNIST數據集上,Lenet5模型可以達到大約99.2%的正確率,Lenet5模型總共有7層。

有關CNN卷積神經網路的介紹可參閱之前文章:
深度學習(2)--使用Tensorflow實作卷積神經網路(Convolutional neural network,CNN)

<圖一>Lenet5架構


第一層 卷積層(Convolution)
    這一層的輸入就是原始圖像像素,Lenet5接受的輸入層大小為32x32x1。第一個卷積層filter的尺寸為5x5,深度為6,不使用zero padding,步長(Stride)為1,故這一層輸出的尺寸為32-5+1=28,深度為6。總共有5x5x1x6+6=156個參數,其中6為bias偏誤。因下一層節點矩陣有28x28x6=4704個節點,每個節點和5x5=25個節點相連,所以本層卷積層總共有4707x(25+1)=122304個連接。

第二層 池化層(Pooling)
    這一層的輸入為第一層的輸出,是一28x28x6的節點矩陣,本層採用的filter為2x2,stride=2,故輸出矩陣大小為14x14x6。

第三層 卷積層(Convolution)
    本層的輸入矩陣大小為14x14x6,使用的filter為5x5,深度為16,不使用Zero padding,stride=1,本層的輸出矩陣大小為10x10x6。因此本層應該有5x5x6x16+16=2416個參數,
10x10x16x(25+1)=41600個連接。

第四層 池化層(Pooling)
    本層的輸入矩陣大小為10x10x16,採用filter為2x2,stride為2,本層的輸出矩陣大小為5x5x16。

第五層 卷積層(Convolution)
    本層的輸入矩陣大小為5x5x16,在Lenet5模型的論文終將這一層稱為卷積層,但是因為filter大小即為5x5,所以和全連接層沒有區別,如果將5x5x16節點拉成一個向量,那麼這一層就和全連接層一樣,本層的輸出節點數為120,總共有5x5x16x120+120=48120個參數。

第六層 全連接層
    本層的輸入節點數為120個,輸出節點數為84個,參數總共為120x84+84=10164個。

第七層 全連接層
    本層的輸入節點數為84個,輸出節點為10個,參數總共為84x10+10=850個。

底下會使用Tensorflow來實現類似Lenet5的架構如下<圖二>
在卷積層因為使用了Zero padding所以,圖像尺寸不會縮小
在程式裡是以padding='SAME'來宣告。
conv1 = tf.nn.conv2d(input_tensor, conv1_weights, strides=[1, 1, 1, 1], padding='SAME')

<圖二>

2017年5月7日 星期日

深度學習(3)--循環神經網絡(RNN, Recurrent Neural Networks)


    本節介紹最簡單的循環神經網路,稱之為Simple-RNN,它是LSTM的基礎。Simple-RNN與BP一樣都有前饋層與反饋層。但是Simple-RNN引入了基於時間(狀態)的循環機制。

    下圖一所示為Simple-RNN的神經網路示意圖。神經網路為A,通過讀取某個時間(狀態)的
輸入xt,然後輸出一個值ht,循環可以使得信息從當前時間步傳遞到下一時間步。
    這些循環使得RNN可以被看作同一網路在不同時間步的多次循環,每個神經元會把更新的結果傳遞給下一個時間步,下圖一右側即為循環展開的情形。


<圖一>


2017年3月12日 星期日

機器學習(9)--大數據競賽平台Kaggle入門,練習手寫數字辨識

     我們這次利用多層感知器MLP所作的手寫數字辨識,來練習大數據競賽平台Kaggle的投稿方式。在Kaggle上有多項有獎金的項目正在進行,這些項目想必難度很高。另外也有提供入門的練習項目是沒有獎金的,但是有提供了相關數據可以下載,也有人分享了他們實作該競賽項目的方法,這些可以供我們練習及參考。
     接下來我們就練習從Kaggle下載它所提供的手寫數字數據,利用MLP辨識完後把結果上傳回Kaggle平台,它就會馬上幫我們算出辨識準確率及在該項目的排名。

     這邊直接省略註冊步驟,註冊是免費的而且可以直接使用Facebook 或是google+帳號即可,故我們直接從如何下載手寫數字數據開始。
進入Kaggle平台網頁上方選擇[Competitions],底下往下拉即可以看到目前正在進行的競賽項目。
Kaggle平台連結:https://www.kaggle.com/competitions

     如下圖,它有幾種分類,Featured 及Research都是有獎金的,至於新手入門可以從Playground及Getting Started 做起。我們在這邊直接選擇最下方Digit Recognizer 進去。


2017年3月11日 星期六

機器學習(8)--實作多層感知器(Multilayer Perceptron,MLP)手寫數字辨識


    在這章節,我們使用Python實作一多層感知器(Multilayer Perceptron,MLP)來做手寫數字辨識功能。使用MNIST的數據集及反向傳遞演算法(Backpropagation)做模型訓練及測試。並將訓練好的權重存成檔案,以便對新的數據直接作預測,不須每次都重新訓練模型。最後練習使用windows內建的"小畫家"自己手畫數字進行辨識。結果如下圖所示:

<圖一>第1、3列為使用windows小畫家手繪出的手寫數字,第2,4列為相對應的預測結果。




    有關反向傳遞演算法(Backpropagation)的公式推導,可以參閱底下連結:
該連結範例為有帶值的手解計算,作者:Matt Mazur已解釋的非常清楚了,
建議大家可以跟著做一次。
https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/

補充:對於啟動函數sigmoid 的求導推導有疑慮的,可以參考我下面手寫證明的方式:



2017年2月15日 星期三

機器學習(4)--資料標準常態化與隨機梯度下降法( standardization & Stochastic Gradient descent)


    這篇承接上一篇適應線性神經元與梯度下降法,講述隨機梯度下降法(Stochastic Gradient descent,簡稱SGD)與資料標準常態化(standardization)
    有關適應線性神經元與梯度下降法可先閱讀底下連結:
機器學習(3)--適應線性神經元與梯度下降法(Adaline neuron and Gradient descent)

首先資料標準常態化(standardization)是一種特徵縮放方法,標準化後,特徵值會滿足標準常態分佈,並且每個平均值都是0,標準差都是1。例如,若要標準化樣本x第j個特徵,只要將樣本減去平均值μ,再除以標準差σ,就完成了,計算方式如下:

可以簡單的使用Numpy的mean與std方法便可快速,簡單的完成標準化工作,程式如下:
X_std[:, 0] = (X[:, 0] - X[:, 0].mean()) / X[:, 0].std()
X_std[:, 1] = (X[:, 1] - X[:, 1].mean()) / X[:, 1].std()
print("標準化特徵值0:X_std[:, 0]",X_std[:, 0] )
print("標準化特徵值1:X_std[:, 1]",X_std[:, 1] )

結果如下圖一:特徵值0及特徵值1分別是上一篇所使用鳶尾花的花萼長及花瓣長。原本的資料單位為公分,可以看出原始資料比1.0或0.0大很多,而標準化後的資料皆在正負0~2之間,以直觀的數學來說這會比原本的資料容易做訓練及運算。因此資料在做過標準常態化的特徵縮放後可以獲得較佳的效能。

<圖一>未標準化與標準化後的資料


下圖二是使用上一節適應線性神經元與梯度下降法做資料標準化後的收斂速度比較,在上半
圖為標準化後的資料,學習速率設定為0.01在15輪的迭代後,成本即收斂至最佳化,而在下
圖為資料未標準化,學習速率設定為0.0001,需要150輪迭代後,成本才收斂至最佳化,為
何學習速率設定不也設定在0.01呢?因這個例子來講當資料未標準化,將學習速率設定為0.01,會發現成本函數無法收斂至最佳化也就是上一節所說的,當學習速率過大時會衝過全域最小值而無法收斂。故資料標準化後配合適當的學習速率便可得到好的訓練效能。


<圖二>未標準化與標準化後訓練資料收斂的速度比較




2017年2月14日 星期二

機器學習(3)--適應線性神經元與梯度下降法(Adaline neuron and Gradient descent)

        這一節要介紹另一種類型的單層神經網路:適應線性神經元(Adaline)。並以梯度下降法
(Gradient descent)最小化成本函數。適應線性神經元(Adaline)在實務上是非常吸引人的,因為它清楚的說明了如何定義"成本函數",以及如何最小化"成本函數"的觀念,奠定了機器學習的理論基礎。在本文中主要還要介紹幾個機器學習或是深度學習裡都會出現的名詞,包括梯度下降法(Gradient descent)批次(batch)學習速率啟動函數(activation function)、以及偏誤(bias),在文末會以Python實作適應線性神經元(Adaline)。


     適應線性神經元(Adaline)可以算是Rosenblatt感知器改進方法,Adaline規則(也稱Widrow-Hoff規則)與Rosenblatt感知器之間最主要的差異在於,權重更新是基於"線性啟動函數"(Linear activation function),不像感知器是使用"單位階梯函數"(unit step function),在Adaline規則中它的線性啟動函數Φ(z)就是淨輸入,因此
並使用單位階梯函數量化器(quantizer)來預測類別標籤。可看以下圖示:
比較下圖差異,Adaline使用連續值的線性啟動函數來計算誤差及更新權重,而不是用它來預測二元類別標籤。

<圖一>適應線性神經元(Adaline)