天天看點

有趣的Tensorflow遊樂場以及有趣的思考

閑來無事不小心發現一個好玩有适合神經網絡初學者的工具。google的神經網絡Tensorflow遊戲場,通過拖拽就可以選擇特征,配置權重,配置隐藏層等,下圖是通過左側點集的點位置(x1,x2),算出點集的藍色和橙色區域:

有趣的Tensorflow遊樂場以及有趣的思考
位址

有意思的反思:我從大二起就在公司實習一直到研究所學生、工作,先後接觸了電子設計,嵌入式軟體設計,嵌入式系統開發,linux系統開發和驅動開發,java後端設計,C#用戶端開發,app及前端開發,資料倉庫,大資料調研及資料分析,機器學習以及計算視覺等工作,可謂是一路追趕時代口号的發展,每一次技術的轉行吧,都會有深深的迷茫,回過頭來不禁發現,其實無論技術的怎樣變遷,都是為了解決現有的商業問題,所有看似前端的技術,無論是20年前的嵌入式還是現在的人工智能,大資料什麼的,都是解決問題的一個工具而已。不同于當時讀博的是,商業上是定義問題然後解決問題,進而實作價值,賣出去,收錢;讀博士找到一個感興趣的問題,然後解決的,發論文畢業。

TensorFlow遊樂場的左側提供了4個不同的資料集來測試神經網絡。預設的資料為左上角被框出來的那個。被選中的資料也會顯示在上圖中最右邊的“OUTPUT”欄下。在這個資料中,可以看到一個二維平面上有黑色或者灰色的點,每一個小點代表了一個樣例,而點的顔色代表了樣例的标簽。因為點的顔色隻有兩種,是以這是一個二分類的問題。在這裡舉一個例子來說明這個資料可以代表的實際問題。假設需要判斷某工廠生産的零件是否合格,那麼灰色的點可以表示所有合格的零件而黑色的表示不合格的零件。這樣判斷一個零件是否合格就變成了區分點的顔色。

  為了将一個實際問題對應到平面上不同顔色點的劃分,還需要将實際問題中的實體,比如上述例子中的零件,變成平面上的一個點①。這就是特征提取解決的問題。還是以零件為例,可以用零件的長度和品質來大緻描述一個零件。這樣一個實體意義上的零件就可以被轉化成長度和品質這兩個數字。在機器學習中,所有用于描述實體的數字的組合就是一個實體的特征向量(feature vector)。特征向量的提取對機器學習的效果至關重要。通過特征提取,就可以将實際問題中的實體轉化為空間中的點。假設使用長度和品質作為一個零件的特征向量,那麼每個零件就是二維平面上的一個點。TensorFlow遊樂場中FEATURES一欄對應了特征向量。在本例中,可以認為x1代表一個零件的長度,而x2代表零件的品質。

  特征向量是神經網絡的輸入,神經網絡的主體結構顯示在了上圖的中間位置。目前主流的神經網絡都是分層的結構,第一層是輸入層,代表特征向量中每一個特征的取值。比如如果一個零件的長度是0.5,那麼x1的值就是0.5。同一層的節點不會互相連接配接,而且每一層隻和下一層連接配接,直到最後一層作為輸出層得到計算的結果②。在二分類問題中,比如判斷零件是否合格,神經網絡的輸出層往往隻包含一個節點,而這個節點會輸出一個實數值。通過這個輸出值和一個事先設定的門檻值,就可以得到最後的分類結果。以判斷零件合格為例,可以認為當輸出的數值大于0時,給出的判斷結果是零件合格,反之則零件不合格。一般可以認為當輸出值離門檻值越遠時得到的答案越可靠。

  在輸入和輸出層之間的神經網絡叫做隐藏層,一般一個神經網絡的隐藏層越多,這個神經網絡越“深”。而所謂深度學習中的這個“深度”和神經網絡的層數也是密切相關的。在TensorFlow遊樂場中可以通過點選“+”或者“-”來增加/減少神經網絡隐藏層的數量。除了可以選擇神經網絡的深度,TensorFlow遊樂場也支援選擇神經網絡每一層的節點數以及學習率(learning rate)、激活函數(activation)、正則化(regularization)。如何使用這些參數将在後面的章節中讨論。在本文中都直接使用TensorFlow遊樂場預設的設定。當所有配置都選好之後,可以通過左上角的開始标志“”來訓練這個神經網絡。

那麼如何解讀TensorFlow遊樂場的訓練結果。在上圖中,一個小格子代表神經網絡中的一個節點,而邊代表節點之間的連接配接。每一個節點和邊都被塗上了或深或淺的顔色,但邊上的顔色和格子中的顔色含義有略微的差別。每一條邊代表了神經網絡中的一個參數,它可以是任意實數。神經網絡就是通過對參數的合理設定來解決分類或者回歸問題的。邊上的顔色展現了這個參數的取值,當邊的顔色越深時,這個參數取值的絕對值越大;當邊的顔色接近白色時,這個參數的取值接近于0。

  每一個節點上的顔色代表了這個節點的區分平面。具體來說,如果把這個平面當成一個卡迪爾坐标系,這個平面上的每一個點就代表了(x1,x2)的一種取值。而這個點的顔色就展現了x1,x2在這種取值下這個節點的輸出值。和邊類似,當節點的輸出值的絕對值越大時,顔色越深。下面将具體解讀輸入層x1所代表的節點。從上圖中可以看到x1這個節點的區分平面就是y軸。因為這個節點的輸出就是x1本身的值,是以當x1小于0時,這個節點的輸出就是負數,而x1大于0時輸出的就是正數。于是y軸的左側都為灰色,而右側都為黑色。上圖中其他節點可以類似的解讀。唯一特殊的是最右邊OUTPUT欄下的輸出節點。這個節點中除了顯示了區分平面之外,還顯示了訓練資料,也就是希望通過神經網絡區分的資料點。從上圖中可以看到,經過兩層的隐藏層,輸出節點的區分平面已經可以完全區分不同顔色的資料點。

  綜上所述,使用神經網絡解決分類問題主要可以分為以下4個步驟。

  1.提取問題中實體的特征向量作為神經網絡的輸入。不同的實體可以提取不同的特征向量,本書中将不具體介紹。本文假設作為神經網絡輸入的特征向量可以直接從資料集中擷取。

  2.定義神經網絡的結構,并定義如何從神經網絡的輸入得到輸出。這個過程就是神經網絡的前向傳播算法,以後将進行詳細介紹。

  3.通過訓練資料來調整神經網絡中參數的取值,這就是訓練神經網絡的過程。下一節将先介紹TensorFlow中表示神經網絡參數的方法,然後下一節将大緻介紹神經網絡優化算法的架構,并介紹如何通過TensorFlow實作這個架構。

  4.使用訓練好的神經網絡來預測未知的資料。這個過程和步驟2中的前向傳播算法一緻,本文不再贅述。

要點歸納;
- 在真實問題中,一般會從實體中抽取更多的特征,是以一個實體會被表示為高維空間中的點。
- 有一些神經網絡是可以跨層連接配接的,但目前大部分神經網絡結構中都隻是相鄰兩層有連接配接。
- 在TensorFlow遊樂場網站上,邊的顔色有黃色(文中淺色部分)和藍色(文中深色部分)的差別,黃色越深表示負得越大,藍色越深表示正得越大。
- 類似邊上的顔色,TensorFlow遊樂場網站中,點上的顔色也有黃色(淺色部分)和藍色(文中深色部分),和邊上顔色類似,黃色越深表示負得越大,藍色越深表示正得越大。
- 在TensorFlow遊樂場中,y軸左側為黃色(淺色部分),右側為藍色(深色部分)。           

繼續閱讀