深度学习的基础_多层感知机的手动实现

多层感知机(Multilayer Perceptron,简称MLP)是一种前馈人工神经网络。它包含至少三层节点:一个输入层、一个或多个隐藏层以及一个输出层。除输入节点外,每个节点都是一个带有非线性激活函数的神经元(或称为处理单元)。MLP利用一种称为反向传播的监督学习技术进行训练,通常与梯度下降算法结合使用。

一:多层感知机的介绍

组成部分:

  1. 输入层:接收输入数据。
  2. 隐藏层:由多个神经元组成,每个神经元与上一层的每个神经元相连。
  3. 输出层:产生网络的最终输出。

工作原理:

  1. 前向传播:数据从输入层开始,通过隐藏层,最终到达输出层。在每一层,数据都会通过加权求和后应用一个激活函数。
  2. 激活函数:常用的激活函数包括Sigmoid、tanh、ReLU等,它们为网络引入非线性,使得网络能够学习复杂的模式。
  3. 损失函数:用于评估模型的预测与实际值之间的差异,常见的损失函数包括均方误差(MSE)和交叉熵损失。
  4. 反向传播:根据损失函数计算梯度,然后通过网络反向传播这些梯度,以更新权重和偏置。

例如一个激活函数如下:

6b6b22f63baf481e941cbf3bcd26f96e.png

训练过程:

  1. 初始化:随机初始化网络权重和偏置。
  2. 迭代:通过多次迭代训练数据集,每次迭代都包括前向传播和反向传播。
  3. 优化:使用梯度下降或其他优化算法调整权重和偏置,以最小化损失函数。

应用领域:

  • 图像识别
  • 语音识别
  • 自然语言处理
  • 推荐系统
  • 游戏和模拟

多层感知机是深度学习的基础之一,也是许多复杂神经网络架构的构建块。随着深度学习的发展,MLP的概念被扩展到了更深的网络结构,如卷积神经网络(CNN)和循环神经网络(RNN)。

二:手动实现多层感知机

接下来将展示一个简单多层感知机模型的基本框架,演示了如何手动实现一个神经网络的前向传播和反向传播过程。这个例子中,我们将构建一个具有一个隐藏层的MLP,用于二分类问题。

请注意,这个例子是非常基础的,并没有涉及到诸如权重初始化策略、激活函数的选择、正则化、批处理、学习率衰减等许多实际应用中重要的概念。在实际应用中,通常会使用更高级的库,如TensorFlowPyTorch,它们提供了更高效、更灵活的方式来构建和训练神经网络。

导入模块

import numpy as np

这里我们导入了numpy库,它是一个强大的Python库,用于进行数值计算。在神经网络中,我们经常使用numpy来处理矩阵运算。

Step1:激活函数和它的导数

# 激活函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 激活函数的导数
def sigmoid_derivative(x):
    return x * (1 - x)

sigmoid函数是一个常用的激活函数,它将任何实数值映射到(0, 1)区间内。它的导数sigmoid_derivative用于在反向传播过程中计算梯度。

Step2:多层感知机类

class MultiLayerPerceptron:

这里定义了一个名为MultiLayerPerceptron的类,它表示我们的多层感知机模型。

初始化方法

def __init__(self, input_size, hidden_size, output_size):
        # 初始化权重和偏置
        self.weights_input_to_hidden = np.random.uniform(size=(input_size, hidden_size))
        self.bias_hidden = np.random.uniform(size=(1, hidden_size))
        self.weights_hidden_to_output = np.random.uniform(size=(hidden_size, output_size))
        self.bias_output = np.random.uniform(size=(1, output_size))

初始化方法__init__设置了多层感知机的结构。我们定义了输入层到隐藏层和隐藏层到输出层的权重以及隐藏层和输出层的偏置。这些权重和偏置被初始化为均匀分布的随机值。

前向传播方法

def forward(self, X):
        # 输入层到隐藏层的正向传播
        self.hidden_input = np.dot(X, self.weights_input_to_hidden) + self.bias_hidden
        self.hidden_output = sigmoid(self.hidden_input)
        
        # 隐藏层到输出层的正向传播
        self.final_input = np.dot(self.hidden_output, self.weights_hidden_to_output) + self.bias_output
        self.final_output = sigmoid(self.final_input)
        
        return self.final_output

forward方法实现了前向传播,即数据从输入层流向隐藏层,再从隐藏层流向输出层。我们计算了隐藏层和输出层的输入和输出,并使用sigmoid激活函数。

反向传播方法

 def backward(self, X, y, output):
        # 输出层到隐藏层的反向传播
        output_error = y - output
        output_delta = output_error * sigmoid_derivative(output)
        
        # 隐藏层到输入层的反向传播
        hidden_error = output_delta.dot(self.weights_hidden_to_output.T)
        hidden_delta = hidden_error * sigmoid_derivative(self.hidden_output)
        
        # 更新权重和偏置
        self.weights_hidden_to_output += self.hidden_output.T.dot(output_delta)
        self.bias_output += np.sum(output_delta, axis=0, keepdims=True)
        self.weights_input_to_hidden += X.T.dot(hidden_delta)
        self.bias_hidden += np.sum(hidden_delta, axis=0, keepdims=True)

backward方法实现了反向传播,即计算损失函数关于每个权重的梯度,并更新权重和偏置。首先计算输出层的误差和梯度,然后计算隐藏层的误差和梯度,最后更新权重和偏置。

训练方法

  def train(self, X, y, epochs=1000, learning_rate=0.01):
        for epoch in range(epochs):
            output = self.forward(X)
            self.backward(X, y, output)
            # 打印训练进度
            if epoch % 100 == 0:
                loss = np.mean(np.square(y - output))
                print(f"Epoch {epoch}, Loss: {loss}")

这样就得到了一个名为MultiLayerPerceptron的表示我们的多层感知机模型的类。

Step3:训练模型

train方法用于训练多层感知机模型。它接受输入数据X和目标数据y,并重复执行前向传播和反向传播过程epochs次。每100个epoch,它会打印当前的损失,以便观察训练进度。

# 示例数据
X = np.array([[0, 0],
              [0, 1],
              [1, 0],
              [1, 1]])

# 理想输出
y = np.array([[0],
              [1],
              [1],
              [0]])

# 创建多层感知机模型
mlp = MultiLayerPerceptron(input_size=2, hidden_size=3, output_size=1)

# 训练模型
mlp.train(X, y)

最后,我们定义了输入数据X和目标数据y,它们分别对应于异或问题的输入和输出。我们创建了MultiLayerPerceptron的实例,并调用train方法来训练模型。

在这个例子中,我们定义了一个MultiLayerPerceptron类,它有初始化方法、前向传播方法、反向传播方法以及一个训练方法。我们使用了一个简单的二分类问题(异或问题)来训练我们的网络。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值