深度学习入门:从感知机到神经网络

🎙️ 语音朗读 当前: 晓晓 (温柔女声)

从感知机到神经网络

深度学习是当今人工智能领域最热门的技术之一,而理解深度学习的第一步就是从感知机开始,逐步理解神经网络的基本原理。

感知机(Perceptron)

感知机是最简单的神经网络模型,由Frank Rosenblatt于1957年提出。它是一个二分类的线性分类模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import numpy as np

class Perceptron:
def __init__(self, learning_rate=0.01, n_iters=1000):
self.lr = learning_rate
self.n_iters = n_iters
self.weights = None
self.bias = None

def fit(self, X, y):
n_samples, n_features = X.shape
self.weights = np.zeros(n_features)
self.bias = 0

for _ in range(self.n_iters):
for idx, x_i in enumerate(X):
linear_output = np.dot(x_i, self.weights) + self.bias
y_predicted = self.activation(linear_output)
update = self.lr * (y[idx] - y_predicted)
self.weights += update * x_i
self.bias += update

def activation(self, x):
return np.where(x >= 0, 1, 0)

def predict(self, X):
linear_output = np.dot(X, self.weights) + self.bias
return self.activation(linear_output)

感知机的局限性在于它只能解决线性可分的问题,比如无法解决异或(XOR)问题。

多层感知机(MLP)

为了克服感知机的局限性,我们引入了多层感知机,即包含隐藏层的神经网络:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import numpy as np

class MLP:
def __init__(self, input_size, hidden_size, output_size, lr=0.01):
self.lr = lr
# 初始化权重
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))

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

def sigmoid_derivative(self, x):
return x * (1 - x)

def forward(self, X):
self.hidden = self.sigmoid(np.dot(X, self.W1) + self.b1)
self.output = self.sigmoid(np.dot(self.hidden, self.W2) + self.b2)
return self.output

def backward(self, X, y, output):
output_error = y - output
output_delta = output_error * self.sigmoid_derivative(output)

hidden_error = output_delta.dot(self.W2.T)
hidden_delta = hidden_error * self.sigmoid_derivative(self.hidden)

self.W2 += self.hidden.T.dot(output_delta) * self.lr
self.b2 += np.sum(output_delta, axis=0, keepdims=True) * self.lr
self.W1 += X.T.dot(hidden_delta) * self.lr
self.b1 += np.sum(hidden_delta, axis=0, keepdims=True) * self.lr

前向传播与反向传播

神经网络的训练过程分为两个关键步骤:

  1. 前向传播:输入数据从输入层经过隐藏层传递到输出层,得到预测结果。
  2. 反向传播:根据预测结果与真实标签的误差,利用链式法则计算各层参数的梯度,并更新参数。

激活函数的作用

激活函数是神经网络中不可或缺的组成部分,它引入了非线性,使得神经网络能够学习复杂的映射关系。常见的激活函数包括:

  • Sigmoid:将输出压缩到(0,1)区间,适合二分类输出层
  • Tanh:将输出压缩到(-1,1)区间,零中心化
  • ReLU:计算简单,缓解梯度消失问题

实际应用

神经网络在图像识别、自然语言处理、语音识别等领域都有广泛应用。以下是一个使用Keras构建简单神经网络的示例:

1
2
3
4
5
6
7
8
9
10
from keras.models import Sequential
from keras.layers import Dense

model = Sequential()
model.add(Dense(64, input_dim=20, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train, epochs=50, batch_size=32, validation_split=0.2)

总结

从感知机到多层神经网络,我们看到了深度学习基础模型的演进。感知机虽然简单但受限于线性可分问题,而多层感知机通过引入隐藏层和激活函数,大大增强了模型的表达能力。理解这些基础概念是深入学习更复杂深度学习模型的前提。

© 2019-2026 ovo$^{mc^2}$ All Rights Reserved. | 站点总访问 28969 次 | 访客 19045
Theme by hiero