顯示具有 深度學習 標籤的文章。 顯示所有文章
顯示具有 深度學習 標籤的文章。 顯示所有文章

2018年1月26日 星期五

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

訊息量

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



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

       訊息量為1,單位是bit。

2017年3月26日 星期日

深度學習(2)--使用Tensorflow實作卷積神經網路(Convolutional neural network,CNN)


    卷積神經網路(Convolutional neural network,CNN),是一多層的神經網路架構,是以類神經網路實現的深度學習,在許多實際應用上取得優異的成績,尤其在影像物件識別的領域上表現優異。

     傳統的多層感知器(Multilayer Perceptron,MLP)可以成功的用來做影像識別,如之前
所介紹,可以用來做MNIST 手寫數字辨識,但是由於多層感知器(Multilayer Perceptron,MLP)在神經元之間採用全連接的方式(Full connectivity),當使用在較高解析度或是較高維度的影像或資料時,便容易發生維度災難而造成過度適合(Overfitting)

     例如,考慮MNIST的手寫輸入資料為28x28解析度,考慮神經元全連接的方式
(Full connectivity),連接到第一個隱藏層神經元便需要28x28=784個權重(Weight)。如果考慮一
RGB三通道色彩圖像輸入,如CIFAR-10為32x32x3的圖像解析度,連接到第一個隱藏層神經
元便需32x32x3=3072個權重(Weight)。那麼如果是200x200x3的圖像解析度,便需要120000
個權重,而這只是連接到隱含層的第一個神經元而已,如果隱含層有多個神經元,那麼連
接權重的數量必然再倍數增加。
     像這樣子的網路架構,沒有考慮到原始影像資料各像素(pixel)之間的遠近,或是密集關係,只是一昧的將全部像素(pixel)當各個輸入的特徵值,連接到隱含層神經元,造成爆量增加的權重不僅是一種浪費,因為實際上不須這麼多的權重,效果不僅沒增加,只是增加了運算的負荷,而且很可能會造成過度適合(Overfitting)。而卷積神經網路(Convolutional neural network,
CNN)被提出來後,可以有效的解決此一問題。

    事實上卷積神經網路(Convolutional neural network,CNN)設計的目標就是用來處理以多陣列型態表達的資料,如以RGB三通道表達的彩色圖片。CNN和普通神經網路之間的一個實質差別在於,CNN是對原始圖像直接做操作,而傳統神經網路是人為的先對影像提取特徵(例如灰階化,二值化)才做操作。

CNN有三個主要的特點。

1.感知區域(Receptive field):可採用3維的圖像資料(width,height,depth)與神經元連接方式,
    實際上也可以直接採用2維的圖像資料,但隱含層內部的神經元只與原本圖像的某一小塊
    區域做連結。該區塊我們稱之為感知區域(Receptive field)

2.局部連結採樣(Local connectivity):根據上述感知區域(Receptive field)的概念,CNN使用過濾
  器(filters)增強與該局部圖形空間的相關性,然後堆疊許多這樣子的層,可以達到非線性
   濾波的功能,且擴及全域,也就是允許網路架構從原圖小區塊的較好的特徵值代表性,組
   合後變成大區塊的特徵值代表性。

3.共享權重(Shared weights):使用的過濾器(filters)是可以重複使用的,當在原始圖像產生一
    特徵圖(Feature Map)時,其權重向量(weights vector)及偏誤(bias)是共用的。這樣可以確保
    在該卷積層所使用的神經元會偵測相同的特徵。並且即使圖像位置或是有旋轉的狀態,
    仍然可以被偵測。

        這三個特點使得CNN在圖像辨識上有更好的效果。在實際操作上的三個基礎分別是:
    區域感知域(Local Receptive field),卷積(Convolutional ),池化(pooling)。
    我們可以從下面圖形化的實際操作來理解它的意思。

卷積層(Convolutional Layer )

      下圖1,2說明在卷積層的運作方式,假設原始影像為一32x32x3維度,我們可以任意給定一
卷積核(filter),其卷積核的值即為權重(weight)。其大小可以為5x5x3,3為與原影像有一樣的深度(RGB三通道),如果輸入影像為一灰階單通道色彩,那麼卷積核大小5x5即可。卷積核大小3x3或5x5或7x7...等等可以自訂,通常為奇數維度。
    接著與原圖像相同的小區域計算點積,得到的一個值便是在新的feature Map的一個新元素值。卷積核會在原始的圖像或者前一個圖像(Map)按照Stride(步伐)的設定移動,直到掃描完全部圖像區域,這樣便會產生一個新的Feature Map。便是下圖圖3~圖5所示,在這個步驟中產生單一新feature Map所使用的權重W,也就是卷積核是共用的,並且共用同一個偏誤(bias),通常初始預設偏誤(bias)可以為0。這樣確保這一新的feature map偵測的是該原始圖像同一特徵。

<圖1>

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月23日 星期四

機器學習(6)--主成分分析(Principal component analysis,PCA)



    這一篇介紹主成分分析(Principal component analysis,PCA),是一種特徵提取的技術,利用特徵降維來避免因維度災難所造成的過度適合(Overfitting)現象。就是說假如訓練資料集裡有很多個特徵數據,我們可以利用主成分分析(Principal component analysis,PCA)來選取最有影響的幾個特徵來做分類器模型的訓練而不需要使用所有的特徵數據來做訓練。
    在這個範例裡,我們將使用葡萄酒數據集來做示範,把原本有的13個特徵,利用PCA分析後只找出兩個主要的特徵值作為分類器模型分類的特徵依據。

    PCA著眼在高維度的數據,"最大化變異數"並投影到與原數據及相同維數或較低維數的"新特徵子空間"。新特徵子空間的正交軸即是"主成分"。

<圖一>x1,x2軸維原本的,PC1,PC2為主成分




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年1月7日 星期六

深度學習(1)-如何在windows安裝Theano +Keras +Tensorflow並使用GPU加速訓練神經網路


本篇文章介紹如何安裝Theano 及Keras, Tensorflow深度學習的框架在windows環境上,並快速的使用Keras的內建範例來執行人工神經網路的訓練。

     之前也有實作Tensorflow 及caffe在VM+ubuntu16.04環境安裝的經驗,甚至安裝在NVIDIA的Jetson TX1 的慘痛經驗XD(雖然後來也是有安裝成功)。各深度學習的框架各有它的優缺點,有許多文章已做過類似的分析,在此我不會對這部分著墨太多,只會敘述自己之前安裝的一些經驗來提供大家參考,特別如果是要在windows環境上使用,並且具有NVIDIA CUDA支援GPU加速運算的功能。
      雖然也很多人認為應該直接使用Linux環境會比較適合做深度學習框架的使用及學習,原因是使用Linux的人或網路資源比較多,而且Linux對於電腦硬體效能有優化。但對於Linux環境不熟的人,使用windows環境仍然有它方便性存在,而對於Python程式語言來說,其程式碼在Linux環境或windows環境做切換是很容易的,當然Theano ,Keras,Tensorflow也可以安裝在Linux環境上使用。接下來開始正式介紹如何在一般常見的筆電上建構這個環境,在一般的筆電上也可以使用GPU加速訓練人工神經網路的快感。


<圖一>為Keras 的lstm_benchmark.py 範例輸出結果