1. 程式人生 > 前端設計 >這可能是最詳盡的 Tensorflow Playground 講解

這可能是最詳盡的 Tensorflow Playground 講解

文/卡狸


筆者團隊作為前端在智慧化領域的先行探索者,在過去一年多時間裡普及機器學習知識的過程中也遇到了一些困難。具體來說,就是演算法領域的入門門檻橫向對比其他技術是比較高的,成為演算法工程師所需要的技術積累往往比其他工種研讀的前置知識要多得多。


為此,本文希望藉助有名的 TensorFlow Playground 來帶領大家循序漸進的進入深度學習的領域。



TensorFlow Playground 簡介

TenforFlow Playground 又名 TensorFlow 遊樂場,是一個用來圖形化教學的簡單神經網路線上演示和實驗的平臺,非常強大且極其易用。如果您已經有一部分神經網路知識,在這個超級易懂的 demo 裡,可以快速體驗一個演算法工程師的調參工作。


您可以本地執行這個專案,前往專案 github 地址,clone 至本地,依次執行 npm i ,npm run build ,npm run serve ,訪問 http://localhost:5000,即可在瀏覽器裡看到如下和線上一樣的 playground 頁面


image.png

(Tensorflow Playground)


我們對 Tensorflow Playground 進行一個細緻的佈局劃分,總體上有如下區域:

  • 執行控制區,這裡主要對演算法執行進行控制,可以啟動、暫停和重置
  • 迭代次數展示區,這裡展示當前演算法執行到了哪一次迭代
  • 超引數選擇區,這裡可以調整演算法的一些超引數,不同的超參能解決不同的演算法問題,得到不同的效果
  • 資料集調整區,資料集定義了我們要解決怎樣的問題,資料集是機器學習最為重要的一環,
  • 特徵向量選擇,從資料集中攫取出的可以用來被訓練的特徵值
  • 神經網路區域,演算法工程師構建的用於資料擬合的網路
  • 預測結果區,展示此演算法的預測結果


image.png

(Playground 區域劃分)


接下來我們會對深度學習做一個總體的介紹,然後對每個區域所涉及的深度學習知識詳解。

結合 Playground 自身極強的視覺化資訊,相信每個讀完本文的同學都能暢遊其中。



深度學習介紹

在 TensorFlow Playground 裡,您就是一個初級演算法工程師。需要選擇一個你想解決的資料集分類問題,依次調整資料集、超引數、特徵向量和隱藏層,點選執行並檢視預測結果。


迴歸到深度學習本身,我們要剝離其中晦澀的概念,給出一個零基礎的同學也能看懂的說明。


機器學習並沒有什麼魔法,它其實就是一個找出過往資料的內在規律,並對未來新資料進行預測的過程,所有的機器學習,包括深度學習,都是找到從輸入到輸出的最佳擬合函式 的過程,傳統機器學習可能用的是一些從統計學中傳承的方法,而作為機器學習的一個新領域的深度學習,則是從生物神經網路原理中得到的靈感,用網狀結構逐步調整各神經元權重的方法來擬合函式。


以 Playground 裡第三個資料集為例,我們選擇這個資料集,設定任意引數,執行就可以看到 output 區域裡的結果是對角劃分藍黃區域的這麼一個圖。


我們需要把節點和顏色分開來看,節點是我們的訓練資料,可以看見因為 x,y 值的不同,我們人為的將資料分為了黃藍兩類。現實中這種場景比比皆是,比如番茄和聖女果就可以根據寬高不同劃分,假定我們有番茄和聖女果兩類資料,一黃一藍,通過深度或傳統機器學習我們得到了一個可以判別水果型別的方法,這個方法視覺化之後就是一個區域劃分圖,座標系中長寬較大的右上角區域偏藍,一個新的資料進來,根據其寬高進行判斷,落在這裡就會被判別為番茄,反之則是聖女果。


image.png

(傳統機器學習和深度學習解題步驟)


上圖中,傳統機器學習的解題核心路徑來自統計學,比如 SVM 向量機的基本想法是求解能夠正確劃分訓練資料集並且幾何間隔最大的分離超平面。如下圖所示, 即為分離超平面,對於線性可分的資料集來說,這樣的超平面有無窮多個(即感知機),但是幾何間隔最大的分離超平面卻是唯一的。


image.png

(svm 原理圖)


深度學習核心是神經網路,通常一個簡單的神經網路包含3部分:輸入層、隱含層和輸出層,圖中的圓圈代表神經元,箭頭代表資料的流向,每根連線上面都對應一個不同的權重,權重是網路通過學習自己得到的。網路中每一個神經元都包含了輸入、輸出以及計算模型3個部分,可以把神經元看成一個計算與儲存單元,計算是神經元對其的輸入進行計算功能。儲存是神經元會暫存計算結果,並傳遞到下一層。


image.png

(神經網路原理)



資料集 dataSet

首先資料集區域,您可以在這裡選擇四種資料集,每個資料集都有兩個類別,這兩個類別分別可以用圓形、兩條正交直線、對角線和螺旋線的函式來劃分。相較於前三個資料集,最後一個數據集函式擬合最困難,是 playground 裡除錯起來最有難度的資料集。


image.png

(資料集型別)


您可以在 Ratio of training to test data 下調整訓練與測試資料的比率,一般來說完整的機器學習有訓練集、驗證集和測試集三類資料集。訓練集是程式尋找特徵的資料集,一般來說資料量最大。驗證集是每個迭代用於在訓練過程中檢驗模型的狀態和收斂情況的資料集。測試集用來評價模型泛化能力,就是訓練好了一個模型後需要在測試集上驗證真實的結果如何。測試集和驗證集數量可以稍微少點,吳恩達的深度學習課程裡對不同資料量級別的各資料集佔比給出了不同的推薦比例,在百萬甚至更多的資料量下,驗證集和測試集可以佔百分之一甚至千分之一的比例,而在資料量偏少的情況下時,驗證集和測試集需要避免過小,推薦訓練集、驗證集、測試集可以按 7:2: 1 的比例分配。tensorflow playground 裡面沒有驗證集概念,所以訓練與測試資料比例設為 80%+ 的情況下訓練效果最好。


noise 是資料噪聲,您可以視情況決定是否啟用噪聲,噪聲越小,訓練效果越好。batch size 是每批進入神經網路資料點的個數,我們一個迭代裡需要跑完整個資料集,大資料量的情況下一次性的把資料全部塞進網路裡顯然是不合理的,所以我們可以設定一個 batch size 大小,每次只把 size 大小的資料放進網路裡進行訓練。



特徵 feature

Feature 一欄包含了可供選擇的 7 種特徵,這裡寫的是 x1,x2,我們不妨直接把 X2 看做是 y 座標。對於 playground 裡的這些用 (x,y) 描述的二維平面資料集,我們可以從 x,y 入手,抽離出很多特徵,比如單純的 x,y 的大小,x,y 平方,sin(x),sin(y) 正弦分佈等。在這裡,特徵的小方塊中同樣有 黃藍兩種顏色,這個顏色是數值大小的意思,藍色代表大,黃色代表小,基本可以認為藍色是正數,黃色是負數。方塊本身代表著整個的取值空間,可以認為中心點就是座標原點,那麼以 x1x2 特徵來看,一三象限內值都是藍色,也就是正數,二四象限內都是負數,很形象的視覺化表述了我們的資料特徵。


image.png

(選擇合適的特徵很重要)


上圖用一個例子形象描述了選擇合適特徵的重要性,一個需要橫縱座標資料一起作用才能預測的資料集,只憑橫座標一個特徵不夠的,因為資料中和分類真正有關的有效資訊沒有傳進網路,那麼無論多少隱藏層多少神經元都無法實現對資料的有效劃分。


上圖我們只用橫座標嘗試失敗了,添加了縱座標特徵就成功了,然後我們選擇最為合適的 x*y 的特徵,則效果出乎意料的好。



隱藏層 hidden layers

一般來說,TensorFlow 、keras 等框架的模型的訓練結果包含了模型自身結構資訊和隱藏層權重資訊兩部分,所以神經網路的訓練其實就是隱藏層中各個節點權重值的訓練。我們可以通過解釋 playground 裡面的顏色來感知隱藏層權重的意義,他們的顏色和資料點藍黃顏色的意義還稍稍不一樣:

  • 每個神經元只有藍白兩色,藍色部分是此神經元的敏感區域
  • 每個神經元輸出的線有藍黃兩色,藍色是正反饋,黃色是負反饋。越粗則說明下游節點眼裡這個特徵越重要


image.png

(神經元和權重的視覺化)



hidden layers 一欄可以設定很多隱藏層。一般來說,隱藏層越多,衍生出的特徵型別也就越豐富,分類的效果也會越好。但是層數多了訓練速度會變慢,也可能不會有效收斂,容易過擬合。


我儘量用通俗易懂的方式來描述上面這段話。


簡單來說,我們要用神經網路擬合出一個可以劃分兩個資料邊界的線,隱藏層的深度和大小就是這個線的細緻程度,如果隱藏層越多那麼線就會越細緻,就會有越多的點被準確劃分。但是過於細緻也不行,因為如果資料存在噪聲,比如一個數據錯誤的跑到了對面去了,那我這條線就可能要為這個資料繞很大一個圈,這樣雖然訓練集的準確率高了,每個訓練資料的特徵都被完美的學到了,但是其實它的劃分線並不合理,新來一個數據很有可能就判斷出錯,如下圖所示:


image.png

(分類 classification 問題中的三種擬合狀態)


所以,機器學習中一個很常見的問題就是解決過擬合問題,解決它,就要求我們的網路或是其中的一些步驟具有一定的“模糊”效果。只要模糊了,擬合出的函式就會張弛有度,不會吹毛求疵。






迭代 Epoch

迭代理念是機器學習不同於傳統統計學分析的最大的點之一,首先我們要知道,機器學習是基於統計學的。機器學習建立在統計框架之上,作為一門處理資料的學科,不經過統計框架直接描述資料是不可能的。除此之外,機器學習也利用了大量其他資料和電腦科學知識。比如理論層面來自數學和統計學等領域,演算法層面來自優化、矩陣代數、微積分等領域,而實現層又來自電腦科學與工程學概念。雖然最終你使用 tensorflow 來做演算法工作時很多概念都不會有感知,但是究其來源才是掌握一門知識的正確方法。


回到我們“迭代”這個概念上來,我們以監督學習為例,我們已經有了一些資料,目標是找到將 x 值對映到 y 值的函式,可以描述此對映的所有可能函式集合我們成為假設空間,神經網路中每個節點的權重組成的權重網路就是假設空間中的每個“函式集合”。要找到這個最準確的函式,或是這個最準確的權重網路,我們就需要讓演算法有一些逐步逼近並找出最優解的最佳實踐。


這個最佳實踐就叫損失函式的求解過程。我們對於最終結果建立起一套“風險函式評估機制”,每次在假設空間中檢索的時候都會將這個風險函式計算出的資料拿出來實時檢視,始終往風險低的方向走。如果我們在假設空間裡是往正確的方向前進,則我們的風險函式(損失函式)也會越來越低,最後趨於一個最低值。


image.png

(損失函式求解過程)


這裡計算損失函式的步驟都是在全量的資料跑完之後進行的,全量的資料在網路裡跑完一次後計算出當前的損失函式大小,然後往下個方向繼續行進。這個過程就是一個迭代(Epoch),我們在 Tensorflow Playground 裡面執行演算法時,隨著 Epoch 的增加,Output 裡 loss(損失函式值)也在隨之變化,直到 N個迭代後到達損失函式最優點。這時候我們可以說,已經找到了當前資料樣本的最佳擬合函式,我們的模型已經訓練完成。



超引數

除了隱藏層的個數和神經元個數,我們還有很多左右訓練結果的初始引數,他們都叫超引數。


學習率 Learning rete

還是看上面的損失函式求解過程,學習率就是每個迭代完之後的行進步長,步長過大則有可能越過了最優解,反覆橫跳不能得到最優效果。步長過小則不僅收斂效果慢,還有可能如下圖一樣陷入區域性最優,這時候加大學習率才能越過山頭找到真正的最優解。總之,選用合適的學習率很重要,不同的模型也有不同的合適學習率可選擇。甚至你可以用一些動態學習率的方法來在運算的過程中動態調整學習率,loss 下降明顯時加大學習率,loss 趨緩時減小學習率。


image.png

(陷入區域性最優)


啟用函式 Activation

啟用函式是神經網路獨有的概念,可以這麼說,沒有啟用函式,那麼神經網路是畫不出那一條細緻的分類線的,再多的隱藏層和神經元都只能複合出線性運算,只能畫直線擬合線性函式。啟用函式在 Playground 裡面供我們選擇的有 Relu、Tanh、Sigmoid 等,他們樣子如下:


image.png

(啟用函式對比)


  • sigmoid 左端趨近於 0,右端趨近於 1,兩端趨於飽和。飽和就容易出現差別過小,從而梯度消失。
  • TanH 函式和 sigmoid 趨勢類似,但是比起 sigmoid 是中心對稱的
  • ReLU 函式是個分段線性函式,是目前用的最多的啟用函式。因為正值區間是線性的,所以很好的解決了梯度消失的問題。計算速度也快,收斂速度遠快於 sigmoid 和 tanh。Relu 的模型可以做的很深,也帶來了一批模型的突破


正則化 Regularization 和 正則化率 Regularization Rate

正則化是解決過擬合的手段之一,使用正則化可以降低模型的複雜度,增強模型的泛化能力。正則化常用的幾種方法有 L1 和 L2。


  • L1 範數:權值向量 w 中各個元素的絕對值之和。
  • L2 範數:權值向量 w 中各個元素的平方和求平方根


正則化率就是正則化的程度,提高正則化率可以減少過擬合,但是也要注意不要過高導致欠擬合。


Problem Type

可以更換問題型別,本文介紹的都是分類問題,目的是給定一個數據,我們猜測他的分類。

另一種問題型別叫回歸問題,給定一個數據,猜測的結果不需要是分類,而是一個數值。


image.png



模型評估

最後我們可以在 Playground 的右側檢視本次訓練的模型的好壞。

Loss 值本質上可以認為就是模型的好壞,loss 越小,說明我們模型當前估算出的函式越貼近資料集。所以每個演算法的 loss 函式的計算方式都是演算法核心之一,定義了 loss 函式等於定義了問題解題路徑。


說了這麼多,最後大家可以自己玩起來啦。如果能對第四個資料集有效收斂並得到一個邊緣相對圓滑的結果,就說明您已經是入門演算法調參員啦。有興趣的同學可以私下交流~


image.png