【单层神经网络】快速入门AI系列
单层神经网络原理
单层神经网络(Single-Layer Neural Network)是最简单的神经网络形式,通常由一个输入层和一个输出层组成,没有隐藏层。其核心原理如下:
-
输入层:
- 输入层接收特征向量 x = [ x 1 , x 2 , … , x n ] \mathbf{x} = [x_1, x_2, \dots, x_n] x=[x1,x2,…,xn],每个 x i x_i xi代表一个特征。
-
权重和偏置:
- 每个输入 x i x_i xi与一个权重 w i w_i wi 相乘,权重表示特征的重要性。
- 偏置 ( b ) 用于调整输出。
-
加权求和:
- 计算加权和 z = ∑ i = 1 n w i x i + b z = \sum_{i=1}^{n} w_i x_i + b z=i=1∑nwixi+b。
-
激活函数:
- 通过激活函数 f ( z ) f(z) f(z) 引入非线性,常见激活函数包括Sigmoid、ReLU等。
-
输出层:
- 输出 y = f ( z ) y = f(z) y=f(z),表示神经网络的预测结果。
数学表示
神经网络的输出可以表示为:
y
=
f
(
∑
i
=
1
n
w
i
x
i
+
b
)
y = f\left( \sum_{i=1}^{n} w_i x_i + b \right)
y=f(i=1∑nwixi+b)
训练过程
-
前向传播:
- 计算输出 y y y。
-
损失函数:
- 计算预测值与真实值的误差,常用损失函数包括均方误差(MSE)和交叉熵损失。
-
反向传播:
- 通过梯度下降法更新权重和偏置,最小化损失函数。
-
参数更新:
- 更新公式为:
w i ← w i − η ∂ L ∂ w i w_i \leftarrow w_i - \eta \frac{\partial L}{\partial w_i} wi←wi−η∂wi∂L
b ← b − η ∂ L ∂ b b \leftarrow b - \eta \frac{\partial L}{\partial b} b←b−η∂b∂L
其中, η \eta η是学习率, L L L是损失函数。
- 更新公式为:
能解决的问题
单层神经网络适合解决线性可分问题,典型应用包括:
-
线性回归:
- 预测连续值,如房价预测。
-
二分类问题:
- 如垃圾邮件分类,通过Sigmoid函数输出概率。
-
多分类问题:
- 使用Softmax函数进行多类别分类,如手写数字识别。
局限性
单层神经网络无法解决非线性问题,如异或(XOR)问题。解决复杂问题需要引入多层神经网络(如多层感知机MLP)。
Python代码实现
import numpy as np
# 生成数据集
def generate_data(num_samples, w_true):
np.random.seed(42)
X = np.random.rand(num_samples, 2) # 生成二维输入
y = np.dot(X, w_true) # 计算目标值 y = w1*x1 + w2*x2
return X, y
# 定义单层神经网络
class SingleLayerNeuralNetwork:
def __init__(self, input_dim):
self.w = np.random.randn(input_dim) # 初始化权重
self.b = np.random.randn() # 初始化偏置
def forward(self, X):
return np.dot(X, self.w) + self.b # 计算预测值 y = X * w + b
def train(self, X, y, learning_rate=0.01, epochs=200):
for epoch in range(epochs):
# 前向传播
y_pred = self.forward(X)
# 计算损失(均方误差)
loss = np.mean((y_pred - y) ** 2)
# 反向传播(计算梯度)
dw = np.dot(X.T, (y_pred - y)) / len(X) # 权重梯度
db = np.mean(y_pred - y) # 偏置梯度
# 更新参数
self.w -= learning_rate * dw
self.b -= learning_rate * db
# 打印损失
if (epoch + 1) % 10 == 0:
print(f"Epoch {epoch + 1}, Loss: {loss:.4f}")
# 参数设置
num_samples = 100 # 样本数量
w_true = np.array([3.0, -2.0]) # 真实的权重
learning_rate = 0.1
epochs = 300
# 生成数据
X, y = generate_data(num_samples, w_true)
# 创建模型
model = SingleLayerNeuralNetwork(input_dim=2)
# 训练模型
model.train(X, y, learning_rate=learning_rate, epochs=epochs)
# 打印训练后的权重和偏置
print("训练后的权重 w:", model.w)
print("训练后的偏置 b:", model.b)```