一個JS程序員對機器學習的概念簡單手記

爲何要學習機器學習,我認爲有如下重要的三點:git

  • 可縮短咱們的編程時間,好比能夠經過機器學習學習垃圾話樣本,進行更快速更精準的垃圾話的檢測
  • 普通編程方法難以解決的問題,好比用戶潛在喜愛和用戶行爲的預測
  • 更重要的是擴寬咱們程序員的思惟邏輯,對於適用的方向可以提出這方面的構思

從前JS程序員要學習機器學習,老是困難的,不少時候被算法和複雜的邏輯所困住,但如今問題獲得很大的緩解,咱們能夠用tensorflow.js(訓練和部署機器語言模型的JavaScript庫)提供的庫和用更好的方式來更簡單的實現機器學習能力。程序員

本文將主要講解機器學習的一些主要概念。更偏重適用tensorflow.js的實戰的入門級教程,請點擊這裏(前三節強烈推薦)github

基本的機器學習的流程通常是怎麼樣的

在學習機器學習前我認爲首先要明確如下幾點算法

  • 標籤 通常來講標籤就是預測目標的結果,也能夠是預測的正確值。
  • 特徵 通常是指提提供訓練的樣本,而樣本分如下幾類:
    • 有標籤的樣本(帶正確答案的樣本,大部分都是使用有標籤的樣本進行訓練)
    • 無標籤的樣本(不帶正常答案的樣本)
  • 模型 指的的是預測和訓練樣本的工具。你能夠形象的理解爲嬰兒的大腦。
  • 損失函數 用於計算標籤和模型預測值的差值。
  • 優化器 用於將損失函數計算的差值向正確方向優化的步伐
  • 學習速度 通常表明優化器的優化的步伐大小,過大則容易偏離正確值,太小則要更多運算才能到達正確值。就比如你要到馬路中間要走5米,然而一次走500米和一次走5釐米,都很難到達馬路中間。

好了,知道了以上幾種概念,那麼咱們來以一張圖的方式來展現,機器究竟是如何進行學習的。編程

basic.png

那麼從圖中很容易瞭解到,咱們是將特徵輸入到模型中計算出預測值,將標籤進行經過損失函數計算出偏差值,再交給優化器優化,參數更新後,模型再重複這一個過程,就構成了基本的機器學習的流程。網絡

過擬合

爲何要講過擬合?什麼是過擬合?機器學習

防止過擬合是分類器的一個核心任務。而好比人臉識別,實際上就是一個分類器,好比將圖片的風景,動物臉,人臉中的人臉的特徵進行歸類,將歐美人臉,亞太人臉,非洲人臉進行歸類,甚至能夠將某個特定的人的臉單獨歸爲一類。因此它在機器學習裏面也有舉足輕重的地位。函數

那什麼是過擬合呢?舉個例子,咱們在平常生活中見到的羊都是白色的,那有一天看到了除了顏色是黑色其餘特徵和咱們平常見到的白羊都是同樣的,那咱們是否是就會認爲這不是一隻羊,人固然不會由於顏色就判定這不是一隻羊,而機器卻會說我見過的羊都是白色的,因此不可能有黑色的羊,因此這不是一隻羊。過擬合官方的解釋是爲了獲得一致假設而使假設變得過分嚴格。工具

那麼過擬合要如何解決呢?這是一個機器學習重要的能力:泛化。學習

那麼如何保證泛化,經驗告訴咱們有3個要點:

  • 從分佈中抽取獨立同分布(iid)樣本
  • 分佈是平穩的不會隨時間變化而變化
  • 始終從同一分佈抽取樣本

但樣本的使用也一樣重要,通常咱們會將樣本分爲 訓練集,驗證集,測試集。

各自用途是什麼?爲何須要分3個集?

用途是什麼,這個問題很簡單:

  • 訓練集 用於訓練模型
  • 驗證集 用於評估模型,即在訓練每輪後驗證訓練的準確性,並幫助矯正參數
  • 測試集 用於測試模型,驗證模型的準確性

爲何須要分3個集?可能你們會以爲爲何要三個集,直接用測試集評估和測試模型不就行了。

那咱們作一個假設。若是咱們用測試集評估模型,而後調整參數的話以下圖:

error-train.png

那麼會不會出現以前所說過擬合的問題呢?答案是會的。即爲了獲得一致假設而使假設變得過分嚴格,請仔細思考這句話。

而正確的方式應該是:

right-train.png

使用這樣的流程就不會產生由於測試數據加入訓練,致使經過了最終的測試數據中。

處理源數據的技巧

在訓練模型以前咱們須要處理大量的源數據同時轉換爲咱們模型可使用的數據,那麼源數據的處理技巧就相當重要了。

在將原始數據處理成特徵的這個過程,咱們叫特徵工程。

那麼咱們在作特徵工程時有什麼技巧:

  • 字符串可使用獨熱編碼
  • 過濾非合理數據,好比庫中極少的數據
  • 篩選不隨時間變化的特徵
  • 使用分箱技巧處理非線性性特徵

固然咱們在處理這類數據時,也應保持如下幾點以更容易暴露有問題的數據:

  • 將數據可視化呈現
  • 不斷地對數據進行調試
  • 對數據進行監控

講了數據處理,咱們講講擴展數據集的方法,那麼什麼是擴展數據集呢?好比咱們的數據集不是很充足,好比只有10個,顯然是不足以訓練模型的數據集,目前最主流的方法是能夠經過它的單一特徵來實現擴展,好比都在某個城市出現過,這種是線性的擴展方式。可是 而對數據的處理中不少特徵,不是經過簡單的單一線性就能劃分的特徵,好比在某個城市出現過的且短時間存在的特徵,這個就是非線性特徵,咱們須要短時間存在和某個城市出現兩個特徵一塊兒查詢數據,這樣的過程叫作特徵交叉,即將兩個數據交叉後轉換爲線性的方法。目前的事實也證實經過經過線性擴展數據是最高效的方法。(我的以爲說特徵交叉就高大上一點,而兩個條件相交查詢就不專業了)

如何讓預測結果更加正常和正確評估模型

在以前說過咱們的模型訓練須要經過損失函數計算損失,那麼咱們如何下降更多的損失呢?就好比咱們訓練集的損失度經過不斷的學習愈來愈低,而測試集在訓練集損失最低的時刻並不能是最低點,甚至說訓練集樣本損失度更高的時候,測試集損失度反而更低,咱們應該如何解決這個問題。讓機器學習更好泛化到新樣本中呢?

解決方案:

  • 早停法,能夠簡單理解爲用測試集測試的損失度最低點時就中止訓練的模型
  • 正則化

第一種方案在實際的操做中比較難控制,那麼咱們今天主要來說講主要使用的L2(嶺迴歸)正則化,即如下幾點。

  • 定義複雜度(模型)= 權重的平方和
  • 使用適當的權重
  • 對於線性模型:首選比較平緩的斜率
  • 貝葉斯先驗機率:
    • 權重應該以 0 爲中心
    • 權重應該呈正態分佈

除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階段:權重更新

對於每一個突觸上的權重,按照如下步驟進行更新:

  • 將輸入激勵和響應偏差相乘,從而得到權重的梯度;
  • 將這個梯度乘上一個比例並取反後加到權重上。 這個比例(百分比)將會影響到訓練過程的速度和效果,所以成爲「訓練因子」。梯度的方向指明瞭偏差擴大的方向,所以在更新權重的時候須要對其取反,從而減少權重引發的偏差。

第 1 和第 2 階段能夠反覆循環迭代,直到網絡對輸入的響應達到滿意的預約的目標範圍爲止。

注意事項:

  • 梯度很重要
    • 若是它是可微的,則咱們纔可以對其進行學習
  • 梯度可能會消失
    • 每一個額外的層都會依次下降信噪比
    • ReLu 在這裏頗有用
  • 梯度可能會分解(好比媽媽裏面出現男,其實這在中國很常見)
    • 學習速率在這裏很重要
    • 批標準化(實用按鈕)能夠提供幫助
  • ReLu 層可能會消失
    • 保持冷靜,並下降您的學習速率

如何解決該問題,標準化特徵值很重要

  • 特徵具備合理的範圍
    • 大體以 0 爲中心,[-1, 1] 的範圍一般效果比較好
    • 有助於梯度降低法收斂;避免 NaN 陷阱
    • 避免離羣值也會有幫助
  • 可使用一些標準方法:
    • 線性縮放
    • 爲最大值和最小值設定硬性上下限(截斷)
    • 對數縮放

其次在深度神經網絡裏面還有一個頗有用的技巧,丟棄

  • 丟棄:另外一種正則化形式,對神經網絡頗有用
  • 工做原理是,在一個梯度步長中隨機「丟棄」網絡的單元
    • 有一個可用於集成學習此處的模型的鏈接
  • 丟棄得越多,正則化效果就越強
    • 0.0(一點都不丟棄) = 無丟棄正則化,獲得原來的複雜模型
    • 1.0 (所有丟棄) = 丟棄全部內容!學不到任何規律,獲得特別簡單且無用的模型
    • 中間值更有用(在這個位置進行丟棄,則是在這個位置應用了有效的正則化)

多類別神經網絡

在以前的章節裏面說到,邏輯迴歸很適合一些是或者不是的問題,它能夠很方便給某樣東西的是是或不是加上機率,好比是不是是垃圾郵件仍是非垃圾郵件。

但在多類別中,咱們是怎麼處理的呢,即如何處理狗是哺乳動物?仍是植物?仍是其餘什麼?這種多分支選擇。

那麼咱們在一對多類別中,咱們能夠:

  • 爲每一個可能的類別建立惟一輸出
  • 分別對「個人類別」與「全部其餘類別」信號進行訓練
  • 能夠在深度網絡中執行,也能夠藉助單獨的模型執行

那咱們有沒有更好,更方便的方法呢?對的,咱們可使用SoftMax進行多類別劃分。SoftMax使得:

  • 添加了附加限制:要求全部一對多節點的輸出總和爲 1.0(100%,這就是邏輯迴歸的多類別升級版)
  • 附加限制有助於快速訓練收斂
  • 另外,容許輸出解析爲機率

咱們可使用兩種方式讓SoftMax進行計算

  • 所有數據計算 即暴力破解;針對全部類別進行計算
  • 採樣數據計算 即針對全部正類別標籤進行計算,但僅針對負類別標籤的隨機樣本進行計算。

那咱們應該如何使用標籤給多類別分類呢?

多類別單一標籤分類:

  • 一個樣本可能只是一個類別的成員。
  • 類別互斥這一限制是有用的結構。
  • 有助於在損失中對此進行編碼。
  • 將一個 softmax 損失用於全部可能的類別。

多類別多標籤分類:

  • 一個樣本多是多個類別的成員。
  • 無需對類別成員資格設定額外的限制。
  • 將一個邏輯迴歸損失用於每一個可能的類別。

類似性神經網絡

這個在商品推薦和廣告推薦比較經常使用。一般咱們須要在多維度分析用戶來推薦對應商品:

  • 好比用戶對商品的興趣可大體從N個方面分析
  • 每部商品都變成一個點,在不一樣的維度中,這個點的高度都是不同的
  • 那麼咱們可從數據中嵌套學習,用戶在不一樣維度的興趣點

在深度網絡中學習嵌套能作什麼?

  • 無需單獨的訓練過程,也就是說,嵌套層只是隱藏層,每一個維度一個單元
  • 監督式信息針對所需任務調整學到的嵌套,即根據用戶上一個商品調整,下一個商品出現
  • 隱藏單元直觀地發現整理多維空間中的各項,才能最大限度地優化最終目標

咱們可使用輸入表示法來顯示用戶用戶興趣的相同特徵

  • 每一個樣本是用戶興趣的相同的特徵的稀疏矢量
  • 使矩陣樣本的密集表示法表示

好比

x 雙肩包 沙發 冰箱 單肩包
x x v x x
x x x v x
用戶 v x x v

那麼用戶的矩陣樣本可表示爲(1,0,0,1),但這種方法從空間和時間上來講,這種表示法並不高效,由於每一個看過的商品都是一行,我這裏只例舉了雙肩包,沙發,冰箱,單肩包。而正常來講,用戶看的遠超這些。

咱們如何選擇嵌套維度個數,請根據如下三條判斷:

  • 嵌套維度的個數越多,越能準確地表示輸入值之間的關係
  • 不過,維度個數越多,過擬合的可能性就越高,訓練速度也會越慢
  • 經驗法則

嵌套能作什麼?

  • 嵌套會以類似內容彼此靠近的方式將各項內容(如影片、文字等)映射到低維實矢量
  • 嵌套也可應用於密集數據(如音頻),以建立有意義的類似度指標
  • 聯合嵌套多種類型的數據(如文字、圖片、音頻等),以定義這些數據之間的類似度

結語

爲何要學習這些概念,我認爲概念講解每每比代碼講解更容易理解同樣東西,代碼也僅僅是概念的一種實現,概念能更好幫助咱們在後續的階段更好的學習,歡迎查看tensorflow.js的實戰的入門級教程學習更多實戰內容。

相關文章
相關標籤/搜索