爲何要學習機器學習,我認爲有如下重要的三點:git
從前JS程序員要學習機器學習,老是困難的,不少時候被算法和複雜的邏輯所困住,但如今問題獲得很大的緩解,咱們能夠用tensorflow.js(訓練和部署機器語言模型的JavaScript庫)提供的庫和用更好的方式來更簡單的實現機器學習能力。程序員
本文將主要講解機器學習的一些主要概念。更偏重適用tensorflow.js的實戰的入門級教程,請點擊這裏(前三節強烈推薦)。github
在學習機器學習前我認爲首先要明確如下幾點算法
好了,知道了以上幾種概念,那麼咱們來以一張圖的方式來展現,機器究竟是如何進行學習的。編程
那麼從圖中很容易瞭解到,咱們是將特徵輸入到模型中計算出預測值,將標籤進行經過損失函數計算出偏差值,再交給優化器優化,參數更新後,模型再重複這一個過程,就構成了基本的機器學習的流程。網絡
爲何要講過擬合?什麼是過擬合?機器學習
防止過擬合是分類器的一個核心任務。而好比人臉識別,實際上就是一個分類器,好比將圖片的風景,動物臉,人臉中的人臉的特徵進行歸類,將歐美人臉,亞太人臉,非洲人臉進行歸類,甚至能夠將某個特定的人的臉單獨歸爲一類。因此它在機器學習裏面也有舉足輕重的地位。函數
那什麼是過擬合呢?舉個例子,咱們在平常生活中見到的羊都是白色的,那有一天看到了除了顏色是黑色其餘特徵和咱們平常見到的白羊都是同樣的,那咱們是否是就會認爲這不是一隻羊,人固然不會由於顏色就判定這不是一隻羊,而機器卻會說我見過的羊都是白色的,因此不可能有黑色的羊,因此這不是一隻羊。過擬合官方的解釋是爲了獲得一致假設而使假設變得過分嚴格。工具
那麼過擬合要如何解決呢?這是一個機器學習重要的能力:泛化。學習
那麼如何保證泛化,經驗告訴咱們有3個要點:
獨立同分布
(iid)樣本平穩的
不會隨時間變化而變化同一分佈
抽取樣本但樣本的使用也一樣重要,通常咱們會將樣本分爲 訓練集,驗證集,測試集。
各自用途是什麼?爲何須要分3個集?
用途是什麼,這個問題很簡單:
爲何須要分3個集?可能你們會以爲爲何要三個集,直接用測試集評估和測試模型不就行了。
那咱們作一個假設。若是咱們用測試集評估模型,而後調整參數的話以下圖:
那麼會不會出現以前所說過擬合
的問題呢?答案是會的。即爲了獲得一致假設而使假設變得過分嚴格,請仔細思考這句話。
而正確的方式應該是:
使用這樣的流程就不會產生由於測試數據加入訓練,致使經過了最終的測試數據中。
在訓練模型以前咱們須要處理大量的源數據同時轉換爲咱們模型可使用的數據,那麼源數據的處理技巧就相當重要了。
在將原始數據處理成特徵的這個過程,咱們叫特徵工程。
那麼咱們在作特徵工程時有什麼技巧:
固然咱們在處理這類數據時,也應保持如下幾點以更容易暴露有問題的數據:
講了數據處理,咱們講講擴展數據集的方法,那麼什麼是擴展數據集呢?好比咱們的數據集不是很充足,好比只有10個,顯然是不足以訓練模型的數據集,目前最主流的方法是能夠經過它的單一特徵來實現擴展,好比都在某個城市出現過,這種是線性的擴展方式。可是 而對數據的處理中不少特徵,不是經過簡單的單一線性就能劃分的特徵,好比在某個城市出現過的且短時間存在的特徵,這個就是非線性特徵,咱們須要短時間存在和某個城市出現兩個特徵一塊兒查詢數據,這樣的過程叫作特徵交叉,即將兩個數據交叉後轉換爲線性的方法。目前的事實也證實經過經過線性擴展數據是最高效的方法。(我的以爲說特徵交叉就高大上一點,而兩個條件相交查詢就不專業了)
在以前說過咱們的模型訓練須要經過損失函數計算損失,那麼咱們如何下降更多的損失呢?就好比咱們訓練集的損失度經過不斷的學習愈來愈低,而測試集在訓練集損失最低的時刻並不能是最低點,甚至說訓練集樣本損失度更高的時候,測試集損失度反而更低,咱們應該如何解決這個問題。讓機器學習更好泛化到新樣本中呢?
解決方案:
第一種方案在實際的操做中比較難控制,那麼咱們今天主要來說講主要使用的L2(嶺迴歸)正則化,即如下幾點。
除L2正則化還存在L0正則化,L0正則化主要是解決:
那麼L0,和L2的區別是什麼呢?即將權重設爲0,處理稀疏特徵組合數據。L10屬於非凸優化問題。
那麼L0可能過於暴力,會致使NP-hard的問題,但咱們還有一個折中的方案L1,即只對權重絕對值之和進行懲罰。同時L1屬於凸優化問題。
一般咱們可使用邏輯迴歸結合一塊兒使用
例如在求解機率的問題上,咱們可使用線性邏輯迴歸來快速求解問題,在非線性的狀況,咱們可使用上節提到的特徵交叉的方法來轉換成線性再進行線性邏輯迴歸來快速求解問題,同時引入早停法和正則化來防止過擬合。
例如以前說過人臉識別其實是一個分類問題,咱們就可使用邏輯迴歸來判斷分類機率,同時設置閾值來判斷是否加入該分類,有時在這方面準確率產生也會產生誤導性,如:
解決分類不平衡,我以爲咱們須要先了解下真正例和假正例,官方說的很好,我直接把這個狼來了的故事搬過來。
咱們能夠把真正例,假正例,假負例,假負例組成不一樣的指標
精確率和召回率每每處於此消彼長的狀態,精確率和召回率是模型的重要評估指標,但每每咱們沒法直接得出精確率和召回率,因此可使用AUC(ROC曲線下方的面積大小)來解決這個問題,即隨機挑選一個正樣本以及一個負樣本,當前的分類算法根據計算獲得的Score值將這個正樣本排在負樣本前面的機率就是AUC值,而這個AUC值越高,模型就越好。
還有一個重要評估的指標是預測誤差,即咱們全部預測項的總和和觀察項的總和比較下的結果。但誤差爲0也並不能說明模型就完美,但預測誤差是個很好的checklist項目。
在處理源數據的技巧的小節上說到,對於非線性特徵可使用特徵交叉的方法來轉換成線性特徵來解決,但對於十分複雜的特徵值,好比說真正例和假正例很接近,該如何處理呢?對的,可使用深度神經網絡來解決這個問題。
對於線性問題,咱們的層級大概只有兩層,即輸入層和輸出層
但對於非線性問題,咱們每每須要增長一些層,一般經過ReLU(線性整流函數)和BP(反向傳播算法)來實現。
對於ReLU能夠計算是否線性,通常來講大於0則爲線性問題
對於BP來講,常見的方法有SGD(隨機梯度降低法),算法由主要由兩個階段組成:激勵傳播與權重更新。
每次迭代中的傳播環節包含兩步:
對於每一個突觸上的權重,按照如下步驟進行更新:
第 1 和第 2 階段能夠反覆循環迭代,直到網絡對輸入的響應達到滿意的預約的目標範圍爲止。
注意事項:
如何解決該問題,標準化特徵值很重要
其次在深度神經網絡裏面還有一個頗有用的技巧,丟棄
在以前的章節裏面說到,邏輯迴歸很適合一些是或者不是的問題,它能夠很方便給某樣東西的是是或不是加上機率,好比是不是是垃圾郵件仍是非垃圾郵件。
但在多類別中,咱們是怎麼處理的呢,即如何處理狗是哺乳動物?仍是植物?仍是其餘什麼?這種多分支選擇。
那麼咱們在一對多類別中,咱們能夠:
那咱們有沒有更好,更方便的方法呢?對的,咱們可使用SoftMax進行多類別劃分。SoftMax使得:
咱們可使用兩種方式讓SoftMax進行計算
那咱們應該如何使用標籤給多類別分類呢?
多類別單一標籤分類:
多類別多標籤分類:
這個在商品推薦和廣告推薦比較經常使用。一般咱們須要在多維度分析用戶來推薦對應商品:
在深度網絡中學習嵌套能作什麼?
咱們可使用輸入表示法來顯示用戶用戶興趣的相同特徵
好比
x | 雙肩包 | 沙發 | 冰箱 | 單肩包 |
---|---|---|---|---|
x | x | v | x | x |
x | x | x | v | x |
用戶 | v | x | x | v |
那麼用戶的矩陣樣本可表示爲(1,0,0,1),但這種方法從空間和時間上來講,這種表示法並不高效,由於每一個看過的商品都是一行,我這裏只例舉了雙肩包,沙發,冰箱,單肩包。而正常來講,用戶看的遠超這些。
咱們如何選擇嵌套維度個數,請根據如下三條判斷:
嵌套能作什麼?
爲何要學習這些概念,我認爲概念講解每每比代碼講解更容易理解同樣東西,代碼也僅僅是概念的一種實現,概念能更好幫助咱們在後續的階段更好的學習,歡迎查看tensorflow.js的實戰的入門級教程學習更多實戰內容。