「春來我不先張口,哪個蟲兒敢作聲」
好好學習,是一件難得的事情,先推薦一篇乾貨(整理了數學、Python、NLP、機器學習的150個教程,希望愛學習的DC君也知道這事)http://mp.weixin.qq.com/s/JCZCQ485FPqDpEYjyBe8pA
然後,再扯個淡:昨晚想要按部就班的傳道授業解惑,沒想到被另外一個號搶了先,這怎麼能忍,這一篇直接沖頂,塞滿編輯器~~
ML:線性回歸
人們早就知曉,相比涼爽的天氣,蟋蟀在較為炎熱的天氣里鳴叫更為頻繁。數十年來,專業和業餘昆蟲學者已將每分鐘的鳴叫聲和溫度方面的數據編入目錄。Ruth阿姨將她喜愛的蟋蟀資料庫作為生日禮物送給您,並邀請您自己利用該資料庫訓練一個模型,從而預測鳴叫聲與溫度的關係。
首先建議您將數據繪製成圖表,了解下數據的分布情況:
圖1.每分鐘的鳴叫聲與溫度(攝氏度)的關係。
毫無疑問,此曲線圖表明溫度隨著鳴叫聲次數的增加而上升。鳴叫聲與溫度之間的關係是線性關係嗎?是的,您可以繪製一條直線來近似地表示這種關係,如下所示:
圖2.線性關係。
事實上,雖然該直線並未精確無誤地經過每個點,但針對我們擁有的數據,清楚地顯示了鳴叫聲與溫度之間的關係。只需運用一點代數知識,您就可以將這種關係寫下來,如下所示:
其中:
·y指的是溫度(以攝氏度表示),即我們試圖預測的值。
·m指的是直線的斜率。
·x指的是每分鐘的鳴叫聲次數,即輸入特徵的值。
·b指的是y軸截距。
按照機器學習的慣例,您需要寫一個存在細微差別的模型方程式:
其中:
·y"指的是預測標籤(理想輸出值)。
·b指的是偏差(y軸截距)。而在一些機器學習文檔中,它稱為w0。
·w1指的是特徵1的權重。權重與上文中用m表示的「斜率」的概念相同。
·x1指的是特徵(已知輸入項)。
要根據新的每分鐘的鳴叫聲值x1推斷(預測)溫度y",只需將x1值代入此模型即可。下標(例如w1和x1)預示著可以用多個特徵來表示更複雜的模型。例如,具有三個特徵的模型可以採用以下方程式
ML:訓練與損失
簡單來說,訓練模型表示通過有標籤樣本來學習(確定)所有權重和偏差的理想值。在監督式學習中,機器學習演算法通過以下方式構建模型:檢查多個樣本並嘗試找出可最大限度地減少損失的模型;這一過程稱為經驗風險最小化。
損失是對糟糕預測的懲罰。也就是說,損失是一個數值,表示對於單個樣本而言模型預測的準確程度。如果模型的預測完全準確,則損失為零,否則損失會較大。訓練模型的目標是從所有樣本中找到一組平均損失「較小」的權重和偏差。例如,下圖左側顯示的是損失較大的模型,右側顯示的是損失較小的模型。關於此圖,請注意以下幾點:
紅色箭頭表示損失,藍線表示預測。
請注意,左側曲線圖中的紅色箭頭比右側曲線圖中的對應紅色箭頭長得多。顯然,相較於左側曲線圖中的藍線,右側曲線圖中的藍線代表的是預測效果更好的模型。
您可能想知道自己能否創建一個數學函數(損失函數),以有意義的方式匯總各個損失。
平方損失:一種常見的損失函數
接下來我們要看的線性回歸模型使用的是一種稱為平方損失(又稱為L2損失)的損失函數。單個樣本的平方損失如下:
= the square of the differencebetween the label and the prediction
= (observation - prediction(x))2
= (y - y")2
均方誤差(MSE)指的是每個樣本的平均平方損失。要計算MSE,請求出各個樣本的所有平方損失之和,然後除以樣本數量:
ML:降低損失——迭代方法
上一單元介紹了損失的概念。在本單元中,您將了解機器學習模型如何以迭代方式降低損失。
迭代學習可能會讓您想到「Hot and Cold」這種尋找隱藏物品(如頂針)的兒童遊戲。在我們的遊戲中,「隱藏的物品」就是最佳模型。剛開始,您會胡亂猜測(「w1的值為。」),等待系統告訴您損失是多少。然後,您再嘗試另一種猜測(「w1的值為0.5。」),看看損失是多少。哎呀,這次更接近目標了。實際上,如果您以正確方式玩這個遊戲,通常會越來越接近目標。這個遊戲真正棘手的地方在於儘可能高效地找到最佳模型。
下圖顯示了機器學習演算法用於訓練模型的迭代試錯過程:
我們將在整個機器學習速成課程中使用相同的迭代方法詳細說明各種複雜情況,尤其是處於暴風雨中的藍雲區域。迭代策略在機器學習中的應用非常普遍,這主要是因為它們可以很好地擴展到大型數據集。
「模型」部分將一個或多個特徵作為輸入,然後返回一個預測(y")作為輸出。為了進行簡化,不妨考慮一種採用一個特徵並返回一個預測的模型:
我們應該為b和w1設置哪些初始值?對於線性回歸問題,事實證明初始值並不重要。我們可以隨機選擇值,不過我們還是選擇採用以下這些無關緊要的值:
b=0
w1=0
假設第一個特徵值是10。將該特徵值代入預測函數會得到以下結果:
y" = 0 + 0(10)
y"=
圖中的「計算損失」部分是模型將要使用的損失函數。假設我們使用平方損失函數。損失函數將採用兩個輸入值:
·y":模型對特徵x的預測
·y:特徵x對應的正確標籤。
最後,我們來看圖的「計算參數更新」部分。機器學習系統就是在此部分檢查損失函數的值,並為b和w1生成新值。現在,假設這個神秘的綠色框會產生新值,然後機器學習系統將根據所有標籤重新評估所有特徵,為損失函數生成一個新值,而該值又產生新的參數值。這種學習過程會持續迭代,直到該演算法發現損失可能最低的模型參數。通常,您可以不斷迭代,直到總體損失不再變化或至少變化極其緩慢為止。這時候,我們可以說該模型已收斂。
·要點:
在訓練機器學習模型時,首先對權重和偏差進行初始猜測,然後反覆調整這些猜測,直到獲得損失可能最低的權重和偏差為止。
ML:降低損失—梯度下降法
迭代方法圖(下圖)包含一個標題為「計算參數更新」的華而不實的綠框。現在,我們將用更實質的方法代替這種華而不實的演算法。
假設我們有時間和計算資源來計算w1的所有可能值的損失。對於我們一直在研究的回歸問題,所產生的損失與w1的圖形始終是凸形。換言之,圖形始終是碗狀圖,如下所示:
凸形問題只有一個最低點;即只存在一個斜率正好為的位置。這個最小值就是損失函數收斂之處。
通過計算整個數據集中w1每個可能值的損失函數來找到收斂點這種方法效率太低。我們來研究一種更好的機制,這種機制在機器學習領域非常熱門,稱為梯度下降法。
梯度下降法的第一個階段是為w1選擇一個起始值(起點)。起點並不重要;因此很多演算法就直接將w1設為或隨機選擇一個值。下圖顯示的是我們選擇了一個稍大於的起點:
然後,梯度下降法演算法會計算損失曲線在起點處的梯度。簡而言之,梯度是偏導數的矢量;它可以讓您了解哪個方向距離目標「更近」或「更遠」。請注意,損失相對於單個權重的梯度(上圖 所示)就等於導數。
?詳細了解偏導數和梯度。
請注意,梯度是一個矢量,因此具有以下兩個特徵:
·方向
·大小
梯度始終指向損失函數中增長最為迅猛的方向。梯度下降法演算法會沿著負梯度的方向走一步,以便儘快降低損失。
為了確定損失函數曲線上的下一個點,梯度下降法演算法會將梯度大小的一部分與起點相加,如下圖所示:
然後,梯度下降法會重複此過程,逐漸接近最低點。
ML:降低損失—學習速率
正如之前所述,梯度矢量具有方向和大小。梯度下降法演算法用梯度乘以一個稱為學習速率(有時也稱為步長)的標量,以確定下一個點的位置。例如,如果梯度大小為2.5,學習速率為0.01,則梯度下降法演算法會選擇距離前一個點0.025的位置作為下一個點。
超參數是編程人員在機器學習演算法中用於調整的旋鈕。大多數機器學習編程人員會花費相當多的時間來調整學習速率。如果您選擇的學習速率過小,就會花費太長的學習時間:
相反,如果您指定的學習速率過大,下一個點將永遠在U形曲線的底部隨意彈跳,就好像量子力學實驗出現了嚴重錯誤一樣:
每個回歸問題都存在一個金髮姑娘學習速率。「金髮姑娘」值與損失函數的平坦程度相關。如果您知道損失函數的梯度較小,則可以放心地試著採用更大的學習速率,以補償較小的梯度並獲得更大的步長。
ML:降低損失—隨機梯度下降法
在梯度下降法中,批量指的是用於在單次迭代中計算梯度的樣本總數。到目前為止,我們一直假定批量是指整個數據集。就Google的規模而言,數據集通常包含數十億甚至數千億個樣本。此外,Google數據集通常包含海量特徵。因此,一個批量可能相當巨大。如果是超大批量,則單次迭代就可能要花費很長時間進行計算。
包含隨機抽樣樣本的大型數據集可能包含冗餘數據。實際上,批量大小越大,出現冗餘的可能性就越高。一些冗餘可能有助於消除雜亂的梯度,但超大批量所具備的預測價值往往並不比大型批量高。
如果我們可以通過更少的計算量得出正確的平均梯度,會怎麼樣?通過從我們的數據集中隨機選擇樣本,我們可以通過小得多的數據集估算(儘管過程非常雜亂)出較大的平均值。隨機梯度下降法(SGD)將這種想法運用到極致,它每次迭代只使用一個樣本(批量大小為1)。如果進行足夠的迭代,SGD也可以發揮作用,但過程會非常雜亂。「隨機」這一術語表示構成各個批量的一個樣本都是隨機選擇的。
小批量隨機梯度下降法(小批量SGD)是介於全批量迭代與SGD之間的折衷方案。小批量通常包含10-1000個隨機選擇的樣本。小批量SGD可以減少SGD中的雜亂樣本數量,但仍然比全批量更高效。
為了簡化說明,我們只針對單個特徵重點介紹了梯度下降法。請放心,梯度下降法也適用於包含多個特徵的特徵集。
使用TensorFlow的起始步驟:工具包
下圖顯示了TensorFlow工具包的當前層次結構:
TensorFlow由以下兩個組件組成:
·圖協議緩衝區
·執行(分散式)圖的運行時
這兩個組件類似於Java編譯器和JVM。正如JVM會實施在多個硬體平台(CPU和GPU)上一樣,TensorFlow也是如此。
您應該使用哪個API?您應該使用能夠解決問題的最高級抽象層。較高級別的抽象層更易於使用,但(設計方面)不夠靈活。我們建議您先從最高級API入手,讓所有組件正常運作起來。如果您希望在某些特殊建模方面能夠更加靈活一些,則可以降低一個級別。請注意,每個級別都是使用低級API構建的,因此降低層次結構級別應該比較直觀。
tf.estimator API
我們將使用tf.estimator來完成機器學習速成課程中的大部分練習。您在練習中所做的一切都可以在較低級別(原始)的TensorFlow中完成,但使用tf.estimator會大大減少代碼行數。
tf.estimator與scikit-learn API兼容。scikit-learn是極其熱門的Python開放源代碼機器學習庫,擁有超過10萬名用戶,其中包括許多Google員工。
概括而言,以下是在tf.estimator中實現的線性回歸程序的格式:
ML:泛化—過擬合的風險
本單元將重點介紹泛化。為了讓您直觀地理解這一概念,我們將展示3張圖。假設這些圖中的每個點代表一棵樹在森林中的位置。圖中的兩種顏色分別代表以下含義:
·藍點代表生病的樹。
·橙點代表健康的樹。
接下來,我們來看看下圖。
您能設想出一個有效的模型來預測以後的生病或健康的樹嗎?花點時間在腦海里繪製一條弧線將藍點與橙點分開,或者在腦海中圈住一些橙點或藍點。然後再看看圖2,它顯示某種機器學習模型如何將生病的樹與健康的樹區分開。請注意,該模型產生的損失非常低。
損失很低,但仍然是糟糕的模型?
圖3顯示我們向該模型中添加了新數據後所發生的情況。結果表明,該模型在處理新數據方面表現非常糟糕。請注意,該模型對大部分新數據的分類都不正確。
圖2和圖3所示的模型過擬合了訓練數據的特性。過擬合模型在訓練過程中產生的損失很低,但在預測新數據方面的表現卻非常糟糕。如果某個模型在擬合當前樣本方面表現良好,那麼我們如何相信該模型會對新數據做出良好的預測呢?正如您稍後將看到的,過擬合是由於模型的複雜程度超出所需程度而造成的。機器學習的基本衝突是適當擬合我們的數據,但也要儘可能簡單地擬合數據。
機器學習的目標是對從真實概率分布(已隱藏)中抽取的新數據做出良好預測。遺憾的是,模型無法查看整體情況;模型只能從訓練數據集中取樣。如果某個模型在擬合當前樣本方面表現良好,那麼您如何相信該模型也會對從未見過的樣本做出良好預測呢?
奧卡姆的威廉是14世紀一位崇尚簡單的修士和哲學家。他認為科學家應該優先採用更簡單(而非更複雜)的公式或理論。奧卡姆剃刀定律在機器學習方面的運用如下:
機器學習模型越簡單,良好的實證結果就越有可能不僅僅基於樣本的特性。
現今,我們已將奧卡姆剃刀定律正式應用於統計學習理論和計算學習理論領域。這些領域已經形成了泛化邊界,即統計化描述模型根據以下因素泛化到新數據的能力:
·模型的複雜程度
·模型在處理訓練數據方面的表現
雖然理論分析在理想化假設下可提供正式保證,但在實踐中卻很難應用。機器學習速成課程則側重於實證評估,以評判模型泛化到新數據的能力。
機器學習模型旨在根據以前未見過的新數據做出良好預測。但是,如果您要根據數據集構建模型,如何獲得以前未見過的數據呢?一種方法是將您的數據集分成兩個子集:
·訓練集-用於訓練模型的子集。
·測試集-用於測試模型的子集。
一般來說,在測試集上表現是否良好是衡量能否在新數據上表現良好的有用指標,前提是:
·測試集足夠大。
您不會反覆使用相同的測試集來作假。
機器學習細則
以下三項基本假設闡明了泛化:
·我們從分布中隨機抽取獨立同分布(i.i.d)的樣本。換言之,樣本之間不會互相影響。(另一種解釋:i.i.d.是表示變數隨機性的一種方式)。
·分布是平穩的;即分布在數據集內不會發生變化。
·我們從同一分布的數據劃分中抽取樣本。
在實踐中,我們有時會違背這些假設。例如:
·想像有一個選擇要展示的廣告的模型。如果該模型在某種程度上根據用戶以前看過的廣告選擇廣告,則會違背i.i.d.假設。
·想像有一個包含一年零售信息的數據集。用戶的購買行為會出現季節性變化,這會違反平穩性。
如果違背了上述三項基本假設中的任何一項,那麼我們就必須密切注意指標。
總結
·如果某個模型嘗試緊密擬合訓練數據,但卻不能很好地泛化到新數據,就會發生過擬合。
·如果不符合監督式機器學習的關鍵假設,那麼我們將失去對新數據進行預測這項能力的重要理論保證。
先這麼多吧,竟然在我之前發布,簡直不能忍。
感謝Google開放這樣科普性的課程~~
TAG:矢口日網 |