1. 程式人生 > >深度學習筆記——理論與推導之概念,成本函式與梯度下降演算法初識(一)

深度學習筆記——理論與推導之概念,成本函式與梯度下降演算法初識(一)

前情提要

一、神經網路介紹

  1. 概念:Learning ≈ Looking for a Function
  2. 框架(Framework):
    這裡寫圖片描述
  3. What is Deep Learning?
    深度學習其實就是一個定義方法、判斷方法優劣、挑選最佳的方法的過程:
    這裡寫圖片描述
    我們可以將nn定義成一個生產線(production line)
    這裡寫圖片描述

    • 比起過去的語音識別技術,DeepLearning的所有function都是從資料中進行學習的。
    • 深度學習通常指基於神經網路的方法。

二、神經網路的簡單理解:

  1. 每一個神經元都可以看成一個簡單的函式:
    這裡寫圖片描述
  2. 一個神經網路都是一個複雜的函式(從一個N維到M維的函式):
    這裡寫圖片描述

    • 將神經元級聯起來就可以組成一個神經網路,每一層都是production line上的一個簡單函式。
      這裡寫圖片描述
  3. 為什麼要深度神經網路:
    • Universality Theorem:如果給定足夠的neurons,任何一個R^N指向R^M的問題都能被解決。
    • 多層神經網路的效果,比一層多個的神經元的神經網路的效果要好的多。
    • Deeper:使用更少的引數就能達到與一層多個神經元的神經網路相同的效果。而更多引數也就意味著需要更多的training data
    • 有一些function用deep structure會更好

Neural Network的基礎概念

目錄

  • 如何定義方法集
  • 判斷方法優劣
  • 挑選最佳的方法
    這裡寫圖片描述

考慮的問題:

  • 分類問題:
    • Binary Classification(二分類問題):target只有兩個,例如:yes/no等
    • Multi-class Classification(多分類問題):target有多個但是可以列舉,例如:手寫數字識別等,注意:真的語言識別問題不是一個多分類問題,因為target是不可以列舉的

如何定義方法集?

  1. 我們想要的是什麼函式:
    • 對於一個分類問題:
      • 我們想要的函式y = f(x),是可以將問題中的N維轉化成target的M維。
      • 輸入x和輸出y可以被表達成一個固定長度的向量,其中x是一個N維向量,y是一個M維向量。
  2. 單一神經元:
    這裡寫圖片描述
    單一神經元只能用來判斷二分類問題,並不能來判斷多分類問題。
  3. 一層神經網路(一個hidden layer):
    這裡寫圖片描述
  4. 單一神經元的限制:
    • 單一神經元不能解決以下問題:
      這裡寫圖片描述
      這裡寫圖片描述
    • 參照logic circuit解決這個問題:
      這裡寫圖片描述
      在Hidden layer中加入兩個hidden neurons:
      這裡寫圖片描述
      這樣我們可以通過以下計算方法得到第一層的輸出,a1,a2:
      這裡寫圖片描述
      輸出層:
      這裡寫圖片描述
  5. Neural Network
    • Neural Network就像是一個模型,如下圖所示,是一個全連線前向傳播網路,深度神經網路就是有好多隱藏層。
      這裡寫圖片描述
    • 概念:
      1. 啟用函式的輸出a:
        這裡寫圖片描述
      2. 權重w:
        這裡要注意的是w的下標i,j與上標l,表示的是從第l-1層的神經元j指向第l層的神經元i
        這裡寫圖片描述
      3. 偏差:
        不同神經元可能會有不同偏差:
        這裡寫圖片描述
      4. 啟用函式的輸入z:
        這裡寫圖片描述
      5. 概念總結:
        這裡寫圖片描述
  6. 層輸出之間的關係:
    這裡寫圖片描述
    這裡寫圖片描述
    這裡寫圖片描述
    這裡寫圖片描述
    這裡寫圖片描述

判斷方法優劣(Cost Function)

  1. Best Function = Best Parameters
  2. Parameter指的就是權重W和偏差b,不同的偏差和權重會得到不同的function。我們用θ表示引數集:
    這裡寫圖片描述
  3. 我們通過Cost Function來判斷方法優劣,C(θ)也叫成本函式/損失函式/誤差函式。

挑選最佳的方法(Gradient Descent)

  1. 問題描述:
    • 函式C(θ):
      • θ={θ1,θ2,…},不同的θ表示不同的引數集
      • 我們令θ*為最好的引數集。
  2. 求解方法:讓C(θ)對θ求偏導,並使其等於0。
  3. Gradient Descent:
    • 做法:
      • 起始點為θ0,計算C(θ)在θ0這一點的偏導
      • 求出θ1,θ1 = θ0 - learning_rate * [C(θ)在θ0處的偏導]
      • 以此類推
        這裡寫圖片描述
    • 舉例:
      這裡寫圖片描述
      小球滑下的方向就是梯度的反方向,而梯度的反方向就是我們要移動的方向:
      這裡寫圖片描述
    • 梯度下降的推導過程:
      • 泰勒公式(Taylor Series):
        這裡寫圖片描述
        因此只要下圖上的紅圈圈足夠小,就能滿足下面式子:
        這裡寫圖片描述
        這裡寫圖片描述
        用s代替C(a,b),u 代替C(a,b)對θ1求偏導,v代替C(a,b)對θ2求偏導,因此:
        C(θ) = s + u(θ1 - a) + v(θ2 - b)
      • 梯度下降的更新過程:θ1和θ2是C(θ)在紅圈圈裡的最小值,根據上面推匯出來的公式,我們就可以求出θ1和θ2的值如下:
        這裡寫圖片描述
        對於神經網路的梯度下降演算法,我們可以看到C(θ)對θ求偏導就是對權重和偏差求偏導,由於引數很多,因此我們可以使用backpropagation(反向傳播演算法)
        這裡寫圖片描述
  4. 可能遇到的問題:local minima(區域性最優)與saddle point(鞍點)
  5. 例項:

    • 步驟:
      1. 引數初始化
      2. Learning Rate
      3. 隨機梯度下降(SGD)與Mini-batch
      4. Recipe for Learning
    • 引數初始化θ0:
      • 建議:
        1. 不要將所有引數的值都設成一樣的
        2. 隨機設定θ0。
    • 學習率:

      • 學習率不能設定的太大,也不能設定的太小:
        這裡寫圖片描述
        太小可能會導致效率過慢,要更新很多次才能找到minima;太大可能會導致震盪,也就是形成鋸齒狀。
    • SGD與Mini-batch GD:

      • SGD:訓練過程如下:
        這裡寫圖片描述
      • GD和SGD的區別:GD每次迭代都要用到全部的訓練資料。SGD每次迭代只用到一個訓練資料來更新引數。
        這裡寫圖片描述
        這裡寫圖片描述
        當訓練資料過大時,用GD可能造成記憶體不夠用,那麼就可以用SGD了,SGD其實可以算作是一種online-learning。另外SGD收斂會比GD快,但是對於代價函式求最小值還是GD做的比較好,不過SGD也夠用了。
      • Mini-batch Gradient Descent:Mini-batch Gradient Descent就是將training data中batch-size條資料做為一個batch B(記得要亂序shuffle your data),訓練完這個batch B後取batch B中梯度的平均值作為更新梯度的值。
      • Mini-batch GD、GD和SGD的區別如下:
        這裡寫圖片描述
        下圖是一個手寫數字識別的例子,在這例子中,橫座標代表的是BatchSize(也就是更新一次用的training data的數量,當batch size = 1時表示的就是SGD,batch size=full時表示的就是GD)
        這裡寫圖片描述
        可以看到收斂速度上:Mini-batch>SGD>GD,原因如下:sgd是一個vector x乘以一個權重矩陣W得到vector z;而Mini-batch是一個matrix x(也就是batch-size的x vector的總和)乘以一個權重W,得到一個matrix z。從速度上來說sgd是要快於Mini-batch的。
        這裡寫圖片描述
    • Recipe for Learning:
      • 是否又在Training set中得到好的結果:
        • 程式有bug
        • 沒有找到good function
          • 比如遇到了local minima或saddle point
          • 這時候就需要修改training strategy,比如修改learning rate或者是batch-size
        • Bad model:如:沒有hidden layer或者是neural不夠多。
      • 如果在training data中表現很好,testing data上表現不好,那你可能是overfitting(過擬合)。
        • overfitting的來源:
          • 因為我們是在training data中找最好的引數,所以testing data中不一定能找到一個好的function。
          • 解決overfitting,萬靈丹就是增加training data。