神经网络基础原理

神经网络由输入层、隐藏层和输出层组成,核心是通过前向传播计算预测值,反向传播调整权重以最小化损失函数。常用激活函数如Sigmoid解决非线性问题,损失函数如均方误差(MSE)衡量预测偏差。

核心代码实现

1. 初始化网络参数

import numpy as np

class NeuralNetwork:
    def __init__(self, input_size, hidden_size, output_size):
        self.W1 = np.random.randn(input_size, hidden_size) * 0.01
        self.b1 = np.zeros((1, hidden_size))
        self.W2 = np.random.randn(hidden_size, output_size) * 0.01
        self.b2 = np.zeros((1, output_size))

2. 激活函数与损失计算

def sigmoid(self, x):
    return 1 / (1 + np.exp(-x))

def mse_loss(self, y_true, y_pred):
    return np.mean((y_true - y_pred) ** 2)

3. 前向传播

def forward(self, X):
    self.z1 = np.dot(X, self.W1) + self.b1
    self.a1 = self.sigmoid(self.z1)
    self.z2 = np.dot(self.a1, self.W2) + self.b2
    return self.z2  # 线性输出(回归任务)

4. 反向传播

def backward(self, X, y, lr=0.01):
    m = X.shape[0]
    dz2 = self.z2 - y
    dW2 = np.dot(self.a1.T, dz2) / m
    db2 = np.sum(dz2, axis=0, keepdims=True) / m
    da1 = np.dot(dz2, self.W2.T)
    dz1 = da1 * self.a1 * (1 - self.a1)
    dW1 = np.dot(X.T, dz1) / m
    db1 = np.sum(dz1, axis=0, keepdims=True) / m
    
    self.W1 -= lr * dW1
    self.b1 -= lr * db1
    self.W2 -= lr * dW2
    self.b2 -= lr * db2


 

可视化训练过程

训练代码示例

import matplotlib.pyplot as plt

nn = NeuralNetwork(2, 4, 1)
losses = []
for epoch in range(1000):
    y_pred = nn.forward(X)
    loss = nn.mse_loss(y, y_pred)
    nn.backward(X, y, lr=0.1)
    losses.append(loss)

plt.plot(losses)
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title('Training Loss Curve')
plt.show()

应用示例(异或问题)

数据准备与训练

X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([[0], [1], [1], [0]])

nn = NeuralNetwork(2, 2, 1)
for _ in range(5000):
    nn.forward(X)
    nn.backward(X, y, lr=0.1)

print("Predictions:", nn.forward(X))

关键点说明

  • 权重初始化使用小随机数避免梯度消失
  • 学习率(lr)需手动调整,过大导致震荡,过小收敛慢
  • 隐藏层神经元数量影响模型容量,需根据任务调整
  • 可视化损失曲线可监控训练是否收敛
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐