Transformer中的前饋神經網路



Transformer模型已經改變了自然語言處理(NLP)以及其他基於序列的任務領域。正如我們在前面的章節中討論的那樣,Transformer主要依賴於多頭注意力和自注意力機制,但還有一個關鍵元件同樣有助於該模型的成功。這個關鍵元件就是前饋神經網路 (FFNN)。

FFNN 子層幫助 Transformer 捕獲輸入資料序列中的複雜模式和關係。閱讀本章以瞭解 FFNN 子層、其在 Transformer 中的作用以及如何使用 Python 程式語言在 Transformer 架構中實現 FFNN。

前饋神經網路 (FFNN) 子層

在 Transformer 架構中,FFNN 子層位於多頭注意力子層之上。它的輸入是前一層後層歸一化的輸出 $\mathrm{d_{model} \: = \: 512}$。FFNN 是 Transformer 的一個簡單但功能強大的元件,它獨立地對序列的每個位置進行操作。

在下圖中,它是 Transformer 架構的編碼器堆疊,您可以看到 FFNN 子層的位置(用黑圈突出顯示)−

Feed Forward Neural Network Sub-layer

以下幾點描述了 FFNN 子層 −

  • Transformer 編碼器和解碼器中的 FFNN 子層是全連線的。
  • FFNN 是一個位置感知網路,其中每個位置都被單獨處理,但方式相似。
  • FFNN 包含兩個線性變換,並在它們之間應用啟用函式。最常見的啟用函式之一是 ReLU。
  • FFNN 子層的輸入和輸出都是 $\mathrm{d_{model} \: = \: 512}$。
  • 與輸入和輸出層相比,FFNN 子層的內部層更大,為 $\mathrm{d_{ff} \: = \: 2048}$。

FFNN 子層的數學表示

FFNN 子層可以用如下數學公式表示 −

第一次線性變換

$$\mathrm{X_{1} \: = \: XW_{1} \: + \: b_{1}}$$

這裡,X 是 FFNN 子層的輸入。$\mathrm{W_{1}}$ 是第一次線性變換的權重矩陣,$\mathrm{b_{1}}$ 是偏差向量。

ReLU 啟用函式

ReLU 啟用函式透過在網路中引入非線性來使網路能夠學習複雜的模式。

$$\mathrm{X_{2} \: = \: max(0, X_{1})}$$

第二次線性變換

$$\mathrm{Output \: = \: X_{2}W_{2} \: + \: b_{2}}$$

這裡,$\mathrm{W_{2}}$ 是第二次線性變換的權重矩陣,$\mathrm{b_{2}}$ 是偏差向量。

讓我們結合以上步驟來總結 FFNN 子層 −

$$\mathrm{Output \: = \: max(0, XW_{1} \: + \: b_{1})W_{2} \: + \: b_{2}}$$

FFNN 子層在 Transformer 中的重要性

以下是 FFNN 子層在 Transformer 中的作用和重要性 −

特徵變換

FFNN 子層對輸入資料序列執行復雜的變換。藉助它,模型可以從資料序列中學習詳細和高階的特徵。

位置獨立性

正如我們在上一章中討論的那樣,自注意力機制檢查輸入資料序列中各個位置之間的關係。但是,另一方面,FFNN 子層獨立地作用於輸入資料序列中的每個位置。此功能增強了多頭注意力子層生成的表示。

前饋神經網路的 Python 實現

下面是一個分步的 Python 實現指南,演示瞭如何在 Transformer 架構中實現前饋神經網路子層 −

步驟 1:初始化 FFNN 引數

在 Transformer 架構中,FFNN 子層由兩個線性變換以及它們之間的 ReLU 啟用函式組成。在此步驟中,我們將初始化這些變換的權重矩陣和偏差向量 −

import numpy as np

class FeedForwardNN:
   def __init__(self, d_model, d_ff):
      # Weight and bias for the first linear transformation
      self.W1 = np.random.randn(d_model, d_ff) * 0.01
      self.b1 = np.zeros((1, d_ff))

      # Weight and bias for the second linear transformation
      self.W2 = np.random.randn(d_ff, d_model) * 0.01
      self.b2 = np.zeros((1, d_model))

   def forward(self, x):
      # First linear transformation followed by ReLU activation
      x = np.dot(x, self.W1) + self.b1
      x = np.maximum(0, x)  # ReLU activation

      # Second linear transformation
      x = np.dot(x, self.W2) + self.b2
      return x

步驟 2:建立示例輸入資料

在此步驟中,我們將建立一些示例輸入資料以透過我們的 FFNN。在 Transformer 架構中,輸入通常是形狀為 (batch_size, seq_len, d_model) 的張量。

# Example input dimensions
batch_size = 64   # Number of sequences in a batch
seq_len = 10      # Length of each sequence
d_model = 512     # Dimensionality of the model (input/output dimension)

# Random input tensor with shape (batch_size, seq_len, d_model)
x = np.random.rand(batch_size, seq_len, d_model)

步驟 3:例項化和使用 FFNN

最後,我們將例項化 'FeedForwardNN' 類並使用上述示例輸入張量執行前向傳遞 −

# Create FFNN instance
ffnn = FeedForwardNN(d_model, d_ff=2048)  # Set d_ff as desired dimensionality for inner layer

# Perform forward pass
output = ffnn.forward(x)

# Print output shape (should be (batch_size, seq_len, d_model))
print("Output shape:", output.shape)

完整的實現示例

將上述三個步驟組合起來以獲得完整的實現示例 −

# Step 1 - Initializing Parameters for FFNN
import numpy as np

class FeedForwardNN:
   def __init__(self, d_model, d_ff):
      # Weight and bias for the first linear transformation
      self.W1 = np.random.randn(d_model, d_ff) * 0.01
      self.b1 = np.zeros((1, d_ff))

      # Weight and bias for the second linear transformation
      self.W2 = np.random.randn(d_ff, d_model) * 0.01
      self.b2 = np.zeros((1, d_model))

   def forward(self, x):
      # First linear transformation followed by ReLU activation
      x = np.dot(x, self.W1) + self.b1
      x = np.maximum(0, x)  # ReLU activation

      # Second linear transformation
      x = np.dot(x, self.W2) + self.b2
      return x 
      
# Step 2 - Creating Example Input Data
# Example input dimensions
batch_size = 64   # Number of sequences in a batch
seq_len = 10      # Length of each sequence
d_model = 512     # Dimensionality of the model (input/output dimension)

# Random input tensor with shape (batch_size, seq_len, d_model)
x = np.random.rand(batch_size, seq_len, d_model)

# Step 3 - Instantiating and Using the FFNN
# Create FFNN instance
# Set d_ff as desired dimensionality for inner layer
ffnn = FeedForwardNN(d_model, d_ff=2048)  

# Perform forward pass
output = ffnn.forward(x)

# Print output shape (should be (batch_size, seq_len, d_model))
print("Output shape:", output.shape)

輸出

執行上述指令碼後,它應該列印輸出張量的形狀以驗證計算 −

Output shape: (64, 10, 512)

結論

前饋神經網路 (FFNN) 子層是 Transformer 架構中的一個重要組成部分。它增強了模型捕獲輸入資料序列中複雜模式和關係的能力。

FFNN 透過獨立應用逐位置變換來補充自注意力機制。這使得 Transformer 成為用於自然語言處理和其他基於序列的任務的強大模型。

在本章中,我們全面概述了 FFNN 子層、其在 Transformer 中的作用和重要性,以及逐步指導說明如何在 Transformer 中實現 FFNN 的 Python 實現。與多頭注意力機制一樣,瞭解和使用 FFNN 對於充分利用 NLP 應用中的 Transformer 模型也很重要。

廣告
© . All rights reserved.