引言
深度學習背后的主要原理是從大腦中汲取靈感。,這種觀點產生了“神經網絡”術語,大腦包含數十億個神經元,它們之間有數萬個連接。 在許多情況下,深度學習算法類似於大腦,因為大腦和深度學習模型都涉及大量的計算單元(神經元),這些單元在未激活時並不是活躍的,它們彼此交互時會變得智能化。
神經元
神經網絡的基本構建模塊是人工神經元--模仿人類大腦神經元。 這些是強大的計算單元,具有加權輸入信號並使用激活功能產生輸出信號。 這些神經元分布在神經網絡的幾個層中。
什么網絡是如何工作的?
深度學習由人工神經網絡組成,這些網絡以人腦中存在的類似網絡為模型。 當數據通過這個人工網格時,每個層處理數據的一個方面,過濾異常值,找到合適的實體,並產生最終輸出。
- 輸入層(Input Layer):該層由神經元組成,它們不接收輸入並將其傳遞給其他層。 輸入層中的元素應等於數據集中的屬性(即變量個數)。
- 輸出圖層(Output Layer):輸出圖層是預測的特征,它主要取決於模型的類型。
- 隱藏層(Hidden Layer):在輸入和輸出層之間,將存在基於模型類型的隱藏層。 隱藏層包含大量神經元。 隱藏層中的神經元將變換應用於輸入。 隨着網絡的訓練,權重得到更新,更具預測性。
神經元的權重
權重是指兩個神經元之間連接的強度或幅度,如果您熟悉線性回歸,則可以比較輸入的權重,例如我們在回歸方程中使用的系數。權重通常被初始化為較小的隨機值,例如 在0到1之間。
前饋深度網絡
前饋監督神經網絡是第一個也是最成功的學習算法。 它們也被稱為深度網絡,多層感知器(MLP)或簡單的神經網絡,並且顯示出了具有單個隱藏層的連接體系結構。
網絡處理輸入變量,並向后傳遞,激活神經元,最終產生輸出值。這被稱為網絡上的前向傳遞。
激活函數
激活函數是加權輸入與神經元輸出的加和的映射。 它被稱為激活或者傳遞函數,因為它控制激活神經元的初始值和輸出信號的強度。
表達式:
常用的有:
反向傳播
將網絡的預測值與預期輸出進行比較,並使用函數計算誤差, 然后,該錯誤在整個網絡內傳播回來,一次一層,並根據它們對錯誤的貢獻值更新權重。 這個聰明的數學運算稱為反向傳播算法。 對訓練數據中的所有示例重復該過程。 為整個訓練數據集更新網絡的一輪稱為紀元。 可以訓練網絡數十,數百或數千個時期。
成本函數和梯度下降
成本函數是神經網絡對其給定的訓練輸入和預期輸出所做的“有多好”的度量。 它還可能取決於權重和偏差等屬性。
成本函數是單值的,而不是向量,因為它評估神經網絡作為一個整體執行得有多好。 使用梯度下降優化算法,在每個時期之后遞增地更新權重。
成本函數:
通過在成本梯度的相反方向上采取步驟來計算權重更新的大小和方向。
其中Δw是包含每個權重系數w的權重更新的向量,其計算如下:
我們計算梯度下降直到導數達到最小誤差,並且每個步驟由斜率(梯度)的陡度確定。
多層感知器(前向傳播)
這類網絡由多層神經元組成,通常以前饋方式互連(向前移動)。一層中的每個神經元具有與后續層的神經元的直接連接。在許多應用中,這些網絡的單元應用sigmoid或ReLU作為激活功能。
現在考慮一個問題,找出交易數量,給定帳戶和家庭成員作為輸入。
首先要解決這個問題,我們需要從創建前向傳播神經網絡開始。我們的輸入圖層將是家庭成員和帳戶的數量,隱藏圖層的數量是一個,輸出圖層將是交易數量。
給定權重,如圖所示,從輸入層到隱藏層,其中家庭成員2的數量和賬戶數量3作為輸入。
現在,將通過以下步驟使用前向傳播來計算隱藏層(i,j)和輸出層(k)的值。
處理過程
- 乘法 - 添加過程。
- 點積(輸入*權重)。
- 一次一個數據點的前向傳播。
- 輸出是該數據點的預測。
$i$的值將根據輸入值和與所連接的神經元相對應的權重來計算。
$i = (2 * 1) + (3 * 1)$
→ i = 5
類似的,
$j = (2 * -1) + (3 * 1)$
→ j = 1
$K = (5 * 2) + (1 * -1)$
→ k = 9
python 實現
為了使神經網絡達到最大預測能力,我們需要為隱藏層應用激活函數。它用於捕獲非線性。 我們將它們應用於輸入層,隱藏層以及值上的某些方程式。
這里我們使用ReLU激活函數。
import numpy as np def relu(input): # Rectified Linear Activation output = max(input, 0) return(output) print("Enter the two values for input layers") a = int(input()) b = int(input()) input_data = np.array([a, b]) weights = { 'node_0': np.array([1, 1]), 'node_1': np.array([-1, 1]), 'output_node': np.array([2, -1]) } node_0_input = (input_data * weights['node_0']).sum() node_0_output = relu(node_0_input) node_1_input = (input_data * weights['node_1']).sum() node_1_output = relu(node_1_input) hidden_layer_outputs = np.array([node_0_output, node_1_output]) model_output = (hidden_layer_outputs * weights['output_node']).sum() print(model_output)
輸出:
Enter the two values for input layers 2 3 9