官术网_书友最值得收藏!

1.2.2 機器如何學習

鑒于前面的場景,你作為程序員找出構成一條線的規則,然后用計算機實現它們,現在讓我們看看機器學習方法會有什么不同。

讓我們從了解機器學習代碼的結構開始。雖然這在很大程度上是一個“Hello World”問題,但代碼的整體結構與你在更復雜的代碼中所看到的非常相似。

我喜歡繪制一個頂層架構,概述使用機器學習來解決這樣的問題。請記住,在這種情況下,我們有xy值,想算出WB以便擁有一個直線方程。一旦有了這個方程,我們就可以得到給定x的新y值。

第1步:猜答案

是的,你沒看錯。首先,我們不知道答案可能是什么,因此猜測與任何其他答案一樣。實際上,這意味著我們為WB選擇隨機值。稍后我們會更智能地循環回這一步,所以后續的值不會是隨機的,但我們純粹是隨機開始的。因此,讓我們假設第一個“猜測”是W=10和B=5。

第2步:衡量猜測的準確性

現在有了WB的值,我們可以把這些值用于已知的數據,看看這些猜測的好壞。因此,我們可以使用y=10x+5來計算每個x值的y,將y與“正確”值進行比較,并使用它來推導出我們的猜測有多好或多壞。顯然,對于這種情況,我們的猜測非常糟糕,因為我們的數字會相差很遠。我們很快就會詳細討論這個問題,但現在,我們意識到我們的猜測真的很糟糕,并且關于具體有多糟糕我們有一個衡量標準——這通常稱為損失。

第3步:優化我們的猜測

現在我們有了一個猜測,并且對猜測的結果(或損失)有了了解,我們便有了可以幫助創建新的、更好的猜測的信息。這個過程稱為優化。如果你過去查看過任何AI編碼或訓練,并且其中涉及大量數學,那么你很可能正在考慮優化。在這里,花哨的微積分在稱為梯度下降的過程中可用于幫助做出更好的猜測。像這樣的優化技術可以找出對參數進行小幅調整的方法,從而使誤差最小。我不打算在這里詳細介紹,雖然了解優化的工作原理是一項有用的技能,但事實是,像TensorFlow這樣的框架會為你實現它們,因此你可以繼續使用它們。隨著時間的推移,值得深入研究它們以獲得更復雜的模型,讓你可以調整它們的學習行為。但就目前而言,你只需使用內置優化器。完成此操作后,你只需轉到第1步。根據定義,重復此過程有助于我們隨著時間的推移和多次循環,找出參數WB

這就是此過程被稱為機器學習的原因。隨著時間的推移,通過進行猜測,弄清楚猜測的好壞,根據該信息優化下一個猜測,然后重復它,計算機將“學習”WB的參數(或者實際上其他任何東西),然后從那里找出構成我們一條線的規則。從視覺上看,這可能如圖1-4所示。

圖1-4:機器學習算法

在代碼中實現機器學習

這里有很多描述,還有很多理論。現在讓我們看看這在代碼中會是什么樣子,如此你就可以看到它自己運行了。很多代碼一開始對你來說可能看起來很陌生,但隨著時間的推移,你會掌握它的竅門。我喜歡稱其為機器學習的“Hello World”,因為你要使用一個非常基礎的神經網絡(稍后我會解釋)來“學習”一條線的參數WB,僅給定幾個點就行了。

這是代碼(可以在本書的GitHub中找到代碼示例):

這是使用TensorFlow Keras API編寫的。Keras是一個開源框架,旨在通過高級API簡化模型的定義和訓練。隨著TensorFlow 2.0的發布,它于2019年緊密集成到TensorFlow中。

讓我們一行一行地探索。

首先是模型的概念。在創建學習數據細節的代碼時,我們經常使用術語“模型”來定義結果對象。在這種情況下,模型大致類似于前面代碼示例中的get_y()函數。這里的不同之處在于,模型不需要給定WB。它會根據給定的數據自己計算出來,所以你可以直接問它y并給它一個x,它會給你答案。

所以我們的第一行代碼看起來像這樣——它定義了模型:

但剩下的代碼是什么?好吧,讓我們從單詞Dense開始,你可以在第一組括號中看到它。你可能已經看過如圖1-5所示的神經網絡圖片。

圖1-5:基礎神經網絡

你可能會注意到,在圖1-5中,左側的每個圓圈(或神經元)都連接到右側的每個神經元。每個神經元都以密集的方式連接到每個其他神經元。因此得名密集(Dense)。此外,左側有三個堆疊的神經元,右側有兩個堆疊的神經元,它們依次形成非常明顯的神經元“層”,其中第一個“層”有三個神經元,第二個有兩個神經元。

讓我們回到代碼:

這段代碼是說我們想要一個層序列(Sequential),在括號內,我們定義這些層序列。序列中的第一個將是Dense,表示如圖1-5所示的神經網絡。沒有定義其他層,所以我們的Sequential只有一層。這一層只有一個單元,由units=1參數表示,該單元的輸入形狀只是一個值。

所以我們的神經網絡將如圖1-6所示。

圖1-6:最簡單的神經網絡

這就是為什么我喜歡稱其為神經網絡的“Hello World”。它有一層,而該層有一個神經元。通過這行代碼,我們現在已經定義了自己的模型架構。讓我們繼續下一行:

這里我們指定了內置函數來計算損失(記住第2步,我們想看看自己的猜測有多好或多壞)和優化器(第3步,我們生成一個新的猜測),這樣就可以改進神經元內WB的參數。

在這種情況下,'sgd'代表“隨機梯度下降”,這超出了本書的范圍。總之,它使用微積分和均方誤差損失來計算如何最小化損失,一旦損失最小化,我們應該就能得到準確的參數。

接下來,讓我們定義數據。兩點可能不夠,所以我在這個例子中將其擴展為6點:

np代表“NumPy”,這是一個常用于數據科學和機器學習的Python庫,它使數據處理變得非常簡單。你可以在https://numpy.org上了解有關NumPy的更多信息。

我們將創建一個由x值及其對應的y值組成的數組,給定x=-1,y為-3,當x為0時,y為-1,以此類推。快速查看可以表明,y=2x-1的關系對于這些值成立。

接下來讓我們執行之前說過的循環——進行猜測,衡量損失的好壞,優化新的猜測,然后重復。在TensorFlow的說法中,這通常稱為擬合,即我們有x's和y's,想要將x's擬合到y's,或者換句話說,找出規則使用我們擁有的示例為給定的x提供正確的y。epochs=500參數只是表明我們將循環500次:

當你運行這樣的代碼時(如果對此不熟悉,你將在本章后面看到如何執行此操作),你將看到如下輸出:

注意損失(loss)值。單位并不重要,重要的是它變得越來越小。請記住,損失越低,你的模型就會表現得越好,其答案也就越接近你的預期。因此,第一次猜測的損失為32.4543,但到第五次猜測時,損失減少到13.3362。

如果后續查看500的最后5個epoch,并查看損失,我們會得到如下輸出:

它小得多,大約為5.3×10-5

這表明神經元計算出的WB的值相差很小。它不是零,所以我們不應該期待精確的正確答案。例如,假設我們給定x=10,像這樣:

答案不會是19,而是非常接近19的值,通常約為18.98。為什么?這里有兩個主要原因。第一個是像這樣的神經網絡處理的是概率,而不是確定性,因此它計算出的WB很可能是正確的,但可能不是100%準確。第二個原因是我們只給了神經網絡6個點。雖然這6個點是線性的,但這并不能證明我們可能預測的所有其他點都必然在這條線上。數據可能偏離那條線……出現這種情況的可能性非常低,但它不為零。我們沒有告訴計算機這是一條線,只是要求它找出xy匹配的規則,它得出的結果看起來像一條線,但不能保證是一條線。

這是在處理神經網絡和機器學習時需要注意的事情——你將處理像這樣的概率!

我們模型的方法名稱中也有提示——注意,我們沒有要求它計算x=10.0的y,而是預測它。在這種情況下,預測(通常稱為推理)反映了這樣一個事實:模型將嘗試根據它所知道的事實來確定“值”是什么,但可能并不總是正確的。

主站蜘蛛池模板: 咸阳市| 廊坊市| 井冈山市| 资中县| 雅安市| 宝鸡市| 武邑县| 柳林县| 清流县| 南投县| 桦甸市| 和平县| 印江| 南和县| 灵璧县| 崇阳县| 合江县| 陵川县| 荔波县| 北流市| 浏阳市| 泸水县| 芜湖县| 定边县| 米林县| 滨州市| 临漳县| 保德县| 吴堡县| 秦皇岛市| 琼海市| 普兰县| 乃东县| 旬邑县| 社会| 邵武市| 彭山县| 舟山市| 清远市| 泸西县| 余干县|