Chainer - 前向傳播與反向傳播



Chainer 中的前向傳播

Chainer 中的前向傳播指的是將輸入資料透過神經網路各層傳遞以計算輸出的過程。眾所周知,Chainer是一個靈活的深度學習框架,它允許動態計算圖,這意味著圖是在資料透過網路向前移動時動態構建的。

在前向傳播過程中,網路的每一層都對輸入資料應用一系列操作,例如矩陣乘法、啟用函式等,從而逐步轉換輸入資料,直到生成最終輸出。此輸出可能是在分類或迴歸等任務中的預測。

在 Chainer 中,前向傳播通常透過將輸入資料作為引數呼叫模型來處理,並且在發生這種情況時動態構建計算圖。

前向傳播涉及的步驟

前向傳播是神經網路中的一個基本過程,其中輸入資料透過網路層傳遞以產生輸出。該過程涉及應用一系列數學運算,通常包括矩陣乘法和啟用函式,以將輸入轉換為所需的輸出。以下是前向傳播中涉及的詳細步驟:

  • 輸入層:該過程從將原始資料饋送到網路開始。每個輸入特徵都分配一個權重,該權重影響它如何影響後續層。
  • 加權求和(線性變換):對於網路的每一層,它計算輸入的加權和,計算公式如下:
    z = W . x + b
    

    其中 z 是加權和,W 是權重矩陣,x 是輸入向量,b 是偏置向量。

  • 啟用函式:將加權和 z 傳遞給啟用函式,以在模型中引入非線性。常見的函式例如 ReLU(校正線性單元)、Sigmoid 和 Tanh。例如,如果我們使用 ReLU,則應用啟用函式將如下所示:
    a = ReLU(z)
    

    其中 a 是結果,它是啟用函式的轉換輸出。

  • 層間傳播:每一層的輸出作為下一層的輸入。此過程在所有隱藏層中迭代應用,逐步細化資料表示。
  • 輸出層:最後一層產生網路的預測。此處啟用函式的選擇取決於任務,如下所示:
    • 分類:Softmax 用於生成類機率。
    • 迴歸:線性函式用於輸出連續值。
  • 最終輸出:網路的輸出用於進行預測或決策。在訓練期間,將此輸出與實際目標值進行比較以計算誤差,該誤差用於透過反向傳播更新權重。

示例

以下是在 Chainer 中使用簡單神經網路進行前向傳播的示例。此網路由一個輸入層、一個隱藏層和一個輸出層組成。以下程式碼顯示瞭如何執行前向傳播並獲取網路的輸出:

import chainer
import chainer.functions as F
import chainer.links as L
import numpy as np
from chainer import Variable

# Define the neural network model
class SimpleNN(chainer.Chain):
   def __init__(self):
      super(SimpleNN, self).__init__()
      with self.init_scope():
         self.l1 = L.Linear(3, 5)  # Input layer to hidden layer
         self.l2 = L.Linear(5, 2)  # Hidden layer to output layer

   def forward(self, x):
      # Compute the hidden layer output
      h = self.l1(x)
      print("Hidden layer (before activation):", h.data)
      
      # Apply ReLU activation function
      h = F.relu(h)
      print("Hidden layer (after ReLU):", h.data)
      
      # Compute the output layer
      y = self.l2(h)
      print("Output layer (before activation):", y.data)
      
      return y

# Create the model instance
model = SimpleNN()

# Prepare the input data
x = Variable(np.array([[1, 2, 3]], dtype=np.float32))  # Single sample with 3 features

# Perform forward propagation
output = model.forward(x)

# Display the final output
print("Final Output:", output.data)

以下是前向傳播的輸出:

Hidden layer (before activation): [[-3.2060928  -0.2460978   2.527906   -0.91410434  0.11754721]]
Hidden layer (after ReLU): [[0.       0.       2.527906   0.       0.11754721]]
Output layer (before activation): [[ 1.6746329  -0.21084023]]
Final Output: [[ 1.6746329  -0.21084023]]

Chainer 中的反向傳播

反向傳播是一種用於計算損失函式相對於神經網路引數梯度的方法。此過程對於透過調整權重以減少損失來訓練網路至關重要。

反向傳播步驟

反向傳播過程包含幾個關鍵步驟,每個步驟對於最佳化模型引數並提高其效能都至關重要。讓我們逐一詳細瞭解它們:

  • 前向傳遞:輸入資料透過網路饋送以產生預測。然後使用損失函式將這些預測與真實目標進行比較,以計算預測誤差。
  • 損失計算:損失函式透過提供反映模型效能的標量值來衡量預測值與實際目標之間的差異。
  • 反向傳遞:使用鏈式法則計算損失函式相對於每個網路引數的梯度。這涉及將梯度從輸出層反向傳播到輸入層。
  • 引數更新:計算出的梯度用於調整網路引數,例如權重和偏差。此調整通常由最佳化器(例如 SGD 或 Adam)執行,該最佳化器更新引數以最小化損失函式。

示例

以下示例顯示瞭如何在 Chainer 框架中透過列印損失函式來演示反向傳播的工作原理:

import chainer
import chainer.functions as F
import chainer.links as L
from chainer import Chain, optimizers
import numpy as np

# Define a simple neural network
class MLP(Chain):
   def __init__(self):
      super(MLP, self).__init__()
      with self.init_scope():
         self.l1 = L.Linear(2, 3)  # Input layer to hidden layer
         self.l2 = L.Linear(3, 1)  # Hidden layer to output layer

   def forward(self, x):
      h = F.relu(self.l1(x))  # Forward pass through hidden layer
      y = self.l2(h)  # Forward pass through output layer
      return y

# Create a model and an optimizer
model = MLP()
optimizer = optimizers.SGD()
optimizer.setup(model)

# Sample input and target data
x = chainer.Variable(np.array([[1.0, 2.0]], dtype=np.float32))
t = chainer.Variable(np.array([[1.0]], dtype=np.float32))

# Forward pass
y = model.forward(x)
loss = F.mean_squared_error(y, t)  # Compute loss

# Backward pass
model.cleargrads()  # Clear previous gradients
loss.backward()  # Compute gradients
optimizer.update()  # Update parameters using the optimizer

print("Loss:", loss.data)

以下是列印反向傳播的損失函式輸出的示例:

Loss: 1.0728482
廣告

© . All rights reserved.