神經網絡原來這麼簡單,機器學習入門貼送給你

2020-06-23 08:21:06

白交 發自 凹非寺
量子位 報道 | 公衆號 QbitAI

你想學機器學習嗎?這裏有一個入門貼適合你。

什麼神經網絡、隨機森林、計算機視覺通通一網打盡。

這個Facebook軟件工程師做了一個入門貼。

專爲基礎爲零的初學者打造。

有基礎的同學,也可以來看看加深一下理解。

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

我們就以神經網絡爲例先來一睹爲快吧!

神經網絡概論

作者說,神經網絡並不複雜!

“神經網絡”一詞很流行,人們通常認爲它很難,但其實要簡單得多。

是不是這樣呢?先看再說。

神經網絡的理解主要分爲三個部分,神經元、神經網絡的構建、訓練神經網絡。

神經元——神經網絡的基本單元

 

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

 

這是2-input神經元的樣子。

首先神經元接受輸入x1、x2,進行一些數學運算以後,然後產生一個輸出y。

在神經元裏,通常會發生三件事:

1、每個輸入乘以相應的權重;

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

2、將所有加權輸入加在一起,在加上一個偏差b;

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

3、導入一個激活函數,得到輸出y。

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

通常來說,激活函數使用Sigmoid函數,也就是常說的S型函數,輸入任意值(-∞,+∞),最後輸出都能停留在0-1之間。

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

對此,他還舉了一個簡單的例子。

以激活函數是S型函數、2輸入神經元爲例,設置參數 w=[0,1] (w1=0,w2=1),b=4。

input:x=[2,3]

output:y=0.999

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

這也就是最爲樸素的神經網絡——前饋神經網絡。

對此,作者還用Python實現了整個過程。

import numpy as np

def sigmoid(x):
  # Our activation function: f(x) = 1 / (1 + e^(-x))
  return 1 / (1 + np.exp(-x))

class Neuron:
  def __init__(self, weights, bias):
    self.weights = weights
    self.bias = bias

  def feedforward(self, inputs):
    # Weight inputs, add bias, then use the activation function
    total = np.dot(self.weights, inputs) + self.bias
    return sigmoid(total)

weights = np.array([0, 1]) # w1 = 0, w2 = 1
bias = 4                   # b = 4
n = Neuron(weights, bias)

x = np.array([2, 3])       # x1 = 2, x2 = 3
print(n.feedforward(x))    # 0.9990889488055994

 

構建神經網絡

神經元連接在一起就是神經網絡。

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

兩個輸入,一個含有兩個神經元的隱藏層,一個含有1個神經元的輸出層就構建了一個神經網絡。

需要注意的是,可以用多層隱藏層。就比如,像這樣:

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

我們仍以上個示例的條件爲例。

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

一個神經網絡可以包含任意數量的層和任意數量的神經元。

以Python代碼示例如下:

import numpy as np

# ... code from previous section here

class OurNeuralNetwork:
  '''
  A neural network with:
    - 2 inputs
    - a hidden layer with 2 neurons (h1, h2)
    - an output layer with 1 neuron (o1)
  Each neuron has the same weights and bias:
    - w = [0, 1]
    - b = 0
  '''
  def __init__(self):
    weights = np.array([0, 1])
    bias = 0

    # The Neuron class here is from the previous section
    self.h1 = Neuron(weights, bias)
    self.h2 = Neuron(weights, bias)
    self.o1 = Neuron(weights, bias)

  def feedforward(self, x):
    out_h1 = self.h1.feedforward(x)
    out_h2 = self.h2.feedforward(x)

    # The inputs for o1 are the outputs from h1 and h2
    out_o1 = self.o1.feedforward(np.array([out_h1, out_h2]))

    return out_o1

network = OurNeuralNetwork()
x = np.array([2, 3])
print(network.feedforward(x)) # 0.7216325609518421

 

訓練神經網路——計算損失函數

假設,我們正在處理以下這個項目。通過人員的體重和身高來判斷性別。

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

以weight、height作爲輸入,以gender作爲輸出。

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

Male設置爲0,Female設置爲1,還對其餘數據進行了簡化。

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

在訓練神經網絡之前,首先需要一個方法來量化它做得有多“好”,是否能夠做得“更好”,那就是損失函數(loss)。

這裏,我們將使用損失函數的一種——均方誤差來計算。

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

預測結果越好,說明損失也就會越低。而訓練神經網絡的目的,就在於儘可能的減少損失。

如果我們確信所有的人都是Male,也就是說預測值爲0,會出現什麼樣的結果?

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

Python示例:

import numpy as np

def mse_loss(y_true, y_pred):
  # y_true and y_pred are numpy arrays of the same length.
  return ((y_true - y_pred) ** 2).mean()

y_true = np.array([1, 0, 0, 1])
y_pred = np.array([0, 0, 0, 0])

print(mse_loss(y_true, y_pred)) # 0.5

訓練神經網絡——最小化損失

計算了損失函數之後,就需要將損失最小化,這也是訓練神經網絡的最終目的所在。

接下來帖子有一段多變量演算,涉及微積分。

作者表示,

如果對微積分不滿意,可隨時跳過。

簡單起見,我們就假設這個數據集中只有Alice。

那麼,它的損失函數就是這樣。

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

那麼它的權重w跟偏差b,在圖上標示,那麼就有6個權重變量,3個偏差變量。

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

於是,便將損失函數寫爲多變量函數。

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

想象一下,我們只要調整w1,就可能導致L的變化。那具體是如何變化的呢?這就需要計算偏導數了。

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

利用鏈式求導法則進行反向求導,而這一過程就叫做反向傳播

詳細計算過程就不放在這裏了,大家去他個人網站去看哦~(鏈接已附文末)

作者溫馨提示,看這個過程的時候不要着急,拿出手中的筆和紙,能夠幫助你理解。

接下來,使用隨機梯度下降的優化算法,公式表示如下(以w1爲例):

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

其中的“學習速率”控制着訓練速度,過大或者過小都不合適。

如果我們將所有的變量都進行這樣的優化,那麼損失函數將逐漸減少,神經網絡就能夠得到改善。

神經網絡原來這麼簡單,機器學習入門貼送給你 | 乾貨

 

簡單來說,整個訓練過程是這樣的:

1、數據集中選擇一個樣本,就如Alice。

2、利用反向傳播計算所有變量的偏導數。

3、使用隨機梯度下降來訓練神經網絡,更新變量。

4、返回步驟1。

神經網絡的部分就介紹到這裏,怎麼樣?看完之後,有什麼感想?

是不是覺得神經網絡也還好了。還有其他概念等着你來學習呢!

傳送門

https://victorzhou.com/tag/machine-learning/

— 完 —

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章