這一章告訴你如何用TensorFlow構建簡單的機器學習系統。第一部分回顧構建機器學習系統的基礎特別是講函數,連續性,可微性。接著我們介紹損失函數,然后討論機器學習歸根于找到復雜的損失函數最小化的點的能力。我們然后講梯度下降,解釋它如何使損失最小。然后簡單的討論自動微分的算法思想。第二節側重于介紹基于這些數學思想的TensorFlow概念。包括placeholders, scopes, optimizers,和TensorBoard, 并實際構建和分析學習系統。最后一節研究如何用TensorFlow訓練線性和邏輯回歸模型。這一章較長,并介紹許多新的思想。如果你不想了解每一個細節,你可以繼續往下讀然后在必要時返回來。在后面我們將重復這些基礎。
1.函數的數學回顧
第一節回顧概念上理解機器學習所需要的數學工具。我們盡量減少希臘符號側重概念上的理解而不是技術操作。
在我們討論的大部分問題里,我們的任務是創建數學函數:
y = f( x)
注意, x和y寫成黑體。這提示它們是向量。這個函數可以有任意數量的輸入,可以是上百個甚致是上百萬個,它的輸出也可以是許多個。你想創建的函數的例子有:
? x 包含圖像里所有像素的色彩。 如果圖像包含貓f(x)等于 1,如果不包含貓則等于0。
? 同上面一樣,f( x)應該是數字的向量。第一個數字表示圖像包含貓,第二個數字表示圖像包含狗,第三個數字表示它包含飛機,等等上千個對象。
? x 包含染色體的 DNA序列。 y 是向量它的長度等于染色體的堿基數量。如果那個堿基編碼某個蛋白質則對應元素應為1,否則為0。
? x 描述分子的結構。 (后面我們討論各種呈現分子的方法) y應為向量每個元素描述一些分子的特理特征:是否易溶于水,是否與某些分子強列結合等。
如你所見,f(x)可以是非常非常復雜的函數。它的輸入通常是長的向量,并從輸入里提取信息,這些信息是很難從輸入直接看出的。
解決這種問題的傳統方法是手工設計函數。你從分析問題開始。提示有貓的像素模式是什么?區別編碼區域和非編碼區域的DNA模式是什么?你可以寫計算機代碼來識別特定的特征,然后識別產生你想要的結果的特征組合。這個過程很慢而勞動強度大,嚴重依賴于個人的專業知識。
機器學習采用不同的方法。不是手工設計函函,你讓計算機基于數據學習函數。你收集上千個到上百萬個圖像,每個標簽提示是否有貓。你給計算機提供所有的訓練數據,然后讓計算機找到函數結果接近1表示有貓而函數結查接近0表示沒有貓。
“讓計算機找到函數”是什么意思?一般來說,你創建一個模型來定義一大類函數,模型包含參數,參數是可以取任意值的變量。通過選擇參數的值,你從模型定義的一大類函數里得到特定的函數。計算機的任務是找到參數的值。它試圖找到這種值,當你輸入訓練數據時,輸出盡量接近于目標。
函數和可微性
這一節簡單的回顧函數和可微的概念。函數f是一種將輸入轉變為輸出的規則。所有的計算機編程語言都有函數,函數的數學定義沒有很大的不同。但是通常用于物理學和工程學數學上的函數有些重要的特性例如連續性和可微性。連續函數,寬松的說,就是可以連續的在紙上畫而不需要將筆提起的函數,如圖3-1所示。 (當然這不是技術上的定義,但這是連續函數的精髓。)
????????????
圖 3-1. 一些連續函數.
可微性是函數的一種類型的平滑條件。它是說函數里沒有尖的轉角(如圖 3-2).
?????????????????????
圖3-2. 可微函數.
可微函數的好處是我們可以使用在某個點函數的斜率來找到比當前點更高或更低的值的點。這可以讓我們找到函數的最小值。可微函數f的微分記為f′,是另一個函數,它提供原函數在所有點的斜率。概念上的思想是函數在某一點的微分指示了函數值比當前值更低或更高的方向。優化算法按這種方向移動以逼近函數f的最小值。在最小值處,函數的微分為零。剛開始是看不到微分驅動的優化的強大之處的。 學微積分的學生都會覺得在紙上練習找小型函數的最小值很乏味。這些練習并沒有什么作用,因為用少量的輸入參數找到函數的最小值是微不足道的。當有上百個,上千個,上萬個變量時,微分驅動的優化的強大就變得很明顯了。在這種規模上,理解函數解析式幾乎不可能,并且所有的可視化都是令人擔心的練習,它可能失去函數的某些重要特征。在這種規模上,函數的梯度 ?f ,是多元函數微分f′的泛化,是理解函數和它的行為的最為強大的數學工具。后面我們將深入學習梯度 (那是概念上的;我們不在這里講梯度的技術細節)。
從高層次看,機器學習簡單的來說就是最小化函數:優化算法無非就是合適的函數的最小值發現者。這個定義的好處是數學上簡單。但是編碼有用的解決方案于最小值的特殊的可微函數到底是什么,我們如何找到它們?