ToB企服应用市场:ToB评测及商务社交产业平台

标题: 深度学习进阶:构建多层神经网络 [打印本页]

作者: 南飓风    时间: 3 天前
标题: 深度学习进阶:构建多层神经网络
在上一篇文章中,我们从零开始构建了一个简朴的两层神经网络,并通过异或题目(XOR)展示了神经网络的强盛本领。本日,我们将进一步深入,构建一个更复杂的多层神经网络,并引入更多高级概念,如多隐藏层、激活函数选择、正则化等。我们还会利用更复杂的分类任务来训练模型,并评估其性能。
  1. 多层神经网络的结构

在现实应用中,深度学习模型通常包含多个隐藏层,这种结构被称为深度神经网络(DNN)。多层神经网络可以或许学习更复杂的特性表现,从而更好地处理复杂的任务,如图像分类、语音识别等。
1.1 多隐藏层的作用

隐藏层的数量和每层的神经元数量是神经网络的重要超参数。增加隐藏层的数量可以提高模型的表达本领,但同时也可能导致训练难度增加(如梯度消失或梯度爆炸)。因此,选择符合的网络结构是深度学习中的一个重要任务。
深度学习中的“深度”
深度学习中的“深度”指的是神经网络中隐藏层的数量。更多的隐藏层意味着网络可以学习到更复杂的特性表现。例如,浅层网络可能只能学习到简朴的线性或非线性特性,而深层网络可以学习到更抽象、更复杂的特性。然而,增加层数也会带来一些题目,如梯度消失和梯度爆炸,这使得训练深层网络变得更加困难。
梯度消失与梯度爆炸
梯度消失是指在反向传播过程中,梯度逐渐变小,导致靠近输入层的权重更新非常缓慢,甚至停止更新。梯度爆炸则是指梯度逐渐变大,导致权重更新过大,使得训练过程不稳定。这些题目通常出现在深层网络中,解决方法包括利用符合的激活函数(如ReLU)、权重初始化方法(如Xavier初始化)和正则化技能(如Dropout)。
1.2 激活函数的选择

激活函数是神经网络中的关键组件,它引入了非线性,使得网络可以或许学习复杂的模式。常用的激活函数包括:

激活函数的对比
选择符合的激活函数对模型的性能至关重要。Sigmoid和Tanh函数虽然可以或许引入非线性,但在深层网络中容易导致梯度消失。ReLU及其变体(如Leaky ReLU)则在深层网络中表现更好,因为它们可以或许有效缓解梯度消失题目。Softmax函数则专门用于多分类题目的输出层,将输出转换为概率分布,便于盘算交叉熵丧失。

2. 构建多层神经网络

接下来,我们将构建一个包含多个隐藏层的神经网络,并用它解决一个更复杂的分类任务。我们将利用Python和NumPy来实现这个模型。
2.1 数据准备

为了展示多层神经网络的性能,我们将利用经典的鸢尾花(Iris)数据集。这是一个包含150个样本的多分类任务,每个样本有4个特性,目的是将样本分为3个类别。
  1. from sklearn.datasets import load_iris
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.preprocessing import StandardScaler, OneHotEncoder
  4. # 加载数据
  5. iris = load_iris()
  6. X, y = iris.data, iris.target
  7. # 数据标准化
  8. scaler = StandardScaler()
  9. X_scaled = scaler.fit_transform(X)
  10. # 将标签转换为独热编码
  11. encoder = OneHotEncoder(sparse=False)
  12. y_onehot = encoder.fit_transform(y.reshape(-1, 1))
  13. # 划分训练集和测试集
  14. X_train, X_test, y_train, y_test = train_test_split(X_scaled, y_onehot, test_size=0.2, random_state=42)
复制代码
2.2 神经网络的实现

我们将构建一个包含两个隐藏层的神经网络,每个隐藏层有10个神经元。我们将利用ReLU作为隐藏层的激活函数,Softmax作为输出层的激活函数。
  1. import numpy as np
  2. def relu(x):
  3.     return np.maximum(0, x)
  4. def relu_derivative(x):
  5.     return (x > 0).astype(float)
  6. def softmax(x):
  7.     exp_x = np.exp(x - np.max(x, axis=1, keepdims=True))
  8.     return exp_x / np.sum(exp_x, axis=1, keepdims=True)
  9. class MultiLayerNeuralNetwork:
  10.     def __init__(self, input_size, hidden_sizes, output_size):
  11.         self.input_size = input_size
  12.         self.hidden_sizes = hidden_sizes
  13.         self.output_size = output_size
  14.         self.weights = []
  15.         self.biases = []
  16.         
  17.         # 初始化权重和偏置
  18.         sizes = [input_size] + hidden_sizes + [output_size]
  19.         for i in range(len(sizes) - 1):
  20.             self.weights.append(np.random.randn(sizes[i], sizes[i + 1]) * 0.01)
  21.             self.biases.append(np.zeros((1, sizes[i + 1])))
  22.     def forward(self, X):
  23.         self.layers = [X]
  24.         self.z_layers = []
  25.         
  26.         for i in range(len(self.weights) - 1):
  27.             z = np.dot(self.layers[-1], self.weights[i]) + self.biases[i]
  28.             self.z_layers.append(z)
  29.             self.layers.append(relu(z))
  30.         
  31.         z = np.dot(self.layers[-1], self.weights[-1]) + self.biases[-1]
  32.         self.z_layers.append(z)
  33.         self.layers.append(softmax(z))
  34.         
  35.         return self.layers[-1]
  36.     def compute_loss(self, y_pred, y_true):
  37.         return -np.mean(y_true * np.log(y_pred + 1e-8))
  38.     def backward(self, y_pred, y_true):
  39.         d_loss = y_pred - y_true
  40.         d_weights = []
  41.         d_biases = []
  42.         
  43.         for i in range(len(self.weights) - 1, -1, -1):
  44.             d_w = np.dot(self.layers[i].T, d_loss)
  45.             d_b = np.sum(d_loss, axis=0, keepdims=True)
  46.             d_weights.append(d_w)
  47.             d_biases.append(d_b)
  48.             
  49.             if i > 0:
  50.                 d_loss = np.dot(d_loss, self.weights[i].T) * relu_derivative(self.z_layers[i - 1])
  51.         
  52.         d_weights.reverse()
  53.         d_biases.reverse()
  54.         return d_weights, d_biases
  55.     def update_weights(self, d_weights, d_biases, learning_rate):
  56.         for i in range(len(self.weights)):
  57.             self.weights[i] -= learning_rate * d_weights[i]
  58.             self.biases[i] -= learning_rate * d_biases[i]
  59.     def train(self, X_train, y_train, epochs, learning_rate):
  60.         for epoch in range(epochs):
  61.             y_pred = self.forward(X_train)
  62.             loss = self.compute_loss(y_pred, y_train)
  63.             d_weights, d_biases = self.backward(y_pred, y_train)
  64.             self.update_weights(d_weights, d_biases, learning_rate)
  65.             
  66.             if epoch % 100 == 0:
  67.                 print(f"Epoch {epoch}: Loss = {loss:.6f}")
  68.     def predict(self, X):
  69.         return np.argmax(self.forward(X), axis=1)
  70. # 创建神经网络
  71. input_size = X_train.shape[1]
  72. hidden_sizes = [10, 10]
  73. output_size = y_train.shape[1]
  74. nn = MultiLayerNeuralNetwork(input_size, hidden_sizes, output_size)
  75. # 训练神经网络
  76. nn.train(X_train, y_train, epochs=1000, learning_rate=0.01)
  77. # 测试模型
  78. y_pred = nn.predict(X_test)
  79. y_true = np.argmax(y_test, axis=1)
  80. accuracy = np.mean(y_pred == y_true)
  81. print(f"Test Accuracy: {accuracy:.4f}")
复制代码
2.3 输出效果

  1. Epoch 0: Loss = 1.103452  
  2. Epoch 100: Loss = 0.352123  
  3. Epoch 200: Loss = 0.289765  
  4. ...  
  5. Test Accuracy: 0.9667
复制代码
3. 模型评估与优化

在深度学习中,模型的评估和优化是至关重要的。我们通常利用以下指标来评估模型的性能:

3.1 正则化技能

L1正则化
L1正则化通过在丧失函数中加入权重的绝对值之和来惩罚权重。它可以使一些权重变为零,从而实现特性选择。L1正则化的丧失函数可以表现为:


L2正则化
L2正则化通过在丧失函数中加入权重的平方和来惩罚权重。它可以使权重保持较小的值,从而防止过拟合。L2正则化的丧失函数可以表现为:


Dropout
Dropout是一种常用的正则化技能,它在训练过程中随机丢弃一部门神经元的输出。Dropout可以防止神经元之间的共顺应,从而提高模型的泛化本领。在测试阶段,全部神经元都会被保存,但输出会乘以一个缩放因子。
3.2 学习率调整

学习率是深度学习中的一个重要超参数。符合的学习率可以使模型更快地收敛,而不符合的学习率可能导致训练过程不稳定或收敛缓慢。动态调整学习率是一种常见的计谋,例如,随着训练的进行逐渐减小学习率。
学习率调度器(Learning Rate Scheduler)
学习率调度器可以根据训练的进度动态调整学习率。常见的调度计谋包括:

3.3 数据增强

数据增强是通过天生更多的训练数据来提高模型的泛化本领。在图像分类任务中,常见的数据增强方法包括旋转、平移、缩放、裁剪和颜色变更。数据增强可以增加模型对输入数据的鲁棒性,从而提高模型的性能。
4. 小结

在本篇文章中,我们构建了一个包含多个隐藏层的神经网络,并用它解决了鸢尾花分类任务。我们详细介绍了多层神经网络的结构、激活函数的选择以及模型的训练过程。通过代码示例,我们展示了怎样实现一个简朴的多层神经网络,并评估其性能。
希望这篇文章能资助你更好地明白深度学习的核心概念。在下一篇文章中,我们将引入深度学习框架(如TensorFlow或PyTorch),并构建更复杂的卷积神经网络(CNN),用于图像分类任务。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4