时间序列中的前馈神经网络 (Feed-Forward Neural Network) 详细解释及举例
前馈神经网络 (Feed-Forward Neural Network, FFNN) 是Transformer模型中的一个重要组成部分,它用于对自注意力层的输出进行进一步的非线性变换。FFNN通过两个线性变换和一个非线性激活函数(通常是ReLU)来增强模型的表达能力。
工作原理
举例说明
假设我们有一个时间序列输入 ( X ),自注意力层的输出形状为 ( (4, 3) ),即序列长度为4,每个时间步有3个特征。
输入数据
import numpy as np
# 自注意力机制的输出(示例)
X = np.array([[0.5, 0.6, 0.7], [0.8, 0.9, 1.0], [1.1, 1.2, 1.3], [1.4, 1.5, 1.6]])
第一层线性变换
假设前馈神经网络的隐藏层维度 ( dff = 6 ):
# 初始权重和偏置
W1 = np.random.rand(3, 6)
b1 = np.random.rand(6)
# 第一层线性变换
X_ff1 = np.dot(X, W1) + b1
非线性激活函数
应用ReLU激活函数:
# ReLU激活函数
def relu(x):
return np.maximum(0, x)
X_relu = relu(X_ff1)
第二层线性变换
将特征维度还原到原始维度 ( dff= 3 ):
# 初始权重和偏置
W2 = np.random.rand(6, 3)
b2 = np.random.rand(3)
# 第二层线性变换
X_ff2 = np.dot(X_relu, W2) + b2
完整代码示例
import numpy as np
# 自注意力机制的输出(示例)
X = np.array([[0.5, 0.6, 0.7], [0.8, 0.9, 1.0], [1.1, 1.2, 1.3], [1.4, 1.5, 1.6]])
# 初始权重和偏置
W1 = np.random.rand(3, 6)
b1 = np.random.rand(6)
W2 = np.random.rand(6, 3)
b2 = np.random.rand(3)
# 第一层线性变换
X_ff1 = np.dot(X, W1) + b1
# ReLU激活函数
def relu(x):
return np.maximum(0, x)
X_relu = relu(X_ff1)
# 第二层线性变换
X_ff2 = np.dot(X_relu, W2) + b2
print("Input X:\n", X)
print("First Layer Output (X_ff1):\n", X_ff1)
print("ReLU Activation Output (X_relu):\n", X_relu)
print("Second Layer Output (X_ff2):\n", X_ff2)
输出解释
- Input X: 自注意力机制的输出。
- First Layer Output (X_ff1): 第一层线性变换的输出,维度从3增加到6。
- ReLU Activation Output (X_relu): 应用ReLU激活函数后的输出。
- Second Layer Output (X_ff2): 第二层线性变换的输出,维度还原到3。
通过前馈神经网络的两次线性变换和一次非线性激活函数,可以对输入进行非线性变换,增强模型的表达能力,捕捉更复杂的特征。