我对全链接神经网络理解
全连接神经网络在我看来就是多层感知器,是一种常见的人工神经网络模型。它包括一个或多个全连接层(我觉得也可以叫密集层或仿射层)和一些非线性激活函数层,用于解决各种机器学习任务,特别是在图像分类、自然语言处理、回归分析等领域中取得了成功。
我分析的其结构为:
-
输入层: 接受原始输入数据的层。每个输入特征都与输入层中的一个神经元相对应。
-
隐藏层: 这些层位于输入层和输出层之间。每个隐藏层都由多个神经元组成,每个神经元都与上一层的每个神经元相连接。隐藏层的数量和神经元的数量是可以调整的超参数。这些层的存在允许模型捕获输入数据中的复杂关系。
-
全连接层: 也称为输出层或密集层,这是网络的最后一层。在分类任务中,通常有与类别数目相等的神经元,每个神经元表示一个类别的得分或概率。
-
激活函数: 每个神经元都会应用一个非线性激活函数,如ReLU(Rectified Linear Unit)、Sigmoid或Tanh。这些函数引入了非线性性质,使神经网络能够学习复杂的函数映射。
-
前向传播: 数据从输入层经过隐藏层,最终到达输出层。每个神经元计算加权和,并将其输入到激活函数中。
-
反向传播: 用于训练神经网络的算法。通过比较网络的预测输出与实际目标值,计算损失函数,并反向传播误差以更新网络中的权重和偏差。
-
损失函数: 用于衡量模型输出与实际目标之间的差距,通常使用交叉熵损失(Cross-Entropy Loss)用于分类任务和均方误差(Mean Squared Error)用于回归任务
全连接神经网络在许多任务上表现良好,但对于复杂的问题,可能需要更深、更复杂的网络结构,例如卷积神经网络(CNN)用于图像处理或循环神经网络(RNN)用于序列数据。然而,全连接神经网络仍然是理解神经网络工作原理的基础。
全链接神经网络python代码:
import numpy as np
# 定义激活函数(这里使用Sigmoid函数)
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 定义网络结构
input_size = 2
hidden_size = 4
output_size = 1
learning_rate = 0.01
# 初始化权重和偏置
np.random.seed(0)
weights_input_hidden = np.random.randn(input_size, hidden_size)
bias_input_hidden = np.zeros((1, hidden_size))
weights_hidden_output = np.random.randn(hidden_size, output_size)
bias_hidden_output = np.zeros((1, output_size))
# 训练数据
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])
# 训练神经网络
for epoch in range(10000):
# 前向传播
hidden_input = np.dot(X, weights_input_hidden) + bias_input_hidden
hidden_output = sigmoid(hidden_input)
output_input = np.dot(hidden_output, weights_hidden_output) + bias_hidden_output
predicted_output = sigmoid(output_input)
# 计算损失函数
loss = 0.5 * np.sum((predicted_output - y) ** 2)
# 反向传播
delta_output = (predicted_output - y) * predicted_output * (1 - predicted_output)
delta_hidden = np.dot(delta_output, weights_hidden_output.T) * hidden_output * (1 - hidden_output)
# 更新权重和偏置
weights_hidden_output -= learning_rate * np.dot(hidden_output.T, delta_output)
bias_hidden_output -= learning_rate * np.sum(delta_output, axis=0)
weights_input_hidden -= learning_rate * np.dot(X.T, delta_hidden)
bias_input_hidden -= learning_rate * np.sum(delta_hidden, axis=0)
if epoch % 1000 == 0:
print(f"Epoch {epoch}, Loss: {loss}")
# 在训练集上测试模型
hidden_input = np.dot(X, weights_input_hidden) + bias_input_hidden
hidden_output = sigmoid(hidden_input)
output_input = np.dot(hidden_output, weights_hidden_output) + bias_hidden_output
predicted_output = sigmoid(output_input)
print("Predicted Output:")
print(predicted_output)
以上为使用Python和NumPy库实现的简单全连接神经网络的代码,包括前向传播和反向传播的基本步骤,并使用梯度下降来更新权重和偏置。
全链接神经网络python运行截图:
全链接神经网络数学公式推导:
前向传播:
反向传播:
单个变量的求导
最终可得:
结果是相当整齐且优雅的。
此外,只要将前面数据中的1改为m,即为batch size