从感知机到神经网络
深度学习是当今人工智能领域最热门的技术之一,而理解深度学习的第一步就是从感知机开始,逐步理解神经网络的基本原理。
感知机(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
|
前向传播与反向传播
神经网络的训练过程分为两个关键步骤:
- 前向传播:输入数据从输入层经过隐藏层传递到输出层,得到预测结果。
- 反向传播:根据预测结果与真实标签的误差,利用链式法则计算各层参数的梯度,并更新参数。
激活函数的作用
激活函数是神经网络中不可或缺的组成部分,它引入了非线性,使得神经网络能够学习复杂的映射关系。常见的激活函数包括:
- 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)
|
总结
从感知机到多层神经网络,我们看到了深度学习基础模型的演进。感知机虽然简单但受限于线性可分问题,而多层感知机通过引入隐藏层和激活函数,大大增强了模型的表达能力。理解这些基础概念是深入学习更复杂深度学习模型的前提。