Backpropagation

简介: 【6月更文挑战第24天】

反向传播算法(Backpropagation)是深度学习中用于训练多层神经网络的算法。它基于梯度下降法,通过计算损失函数关于网络参数的梯度,并更新参数以最小化损失。

反向传播算法的步骤:

  1. 初始化网络参数:通常使用小的随机数初始化权重和偏置。
  2. 前向传播:输入数据通过网络,逐层计算直到输出层,得到预测结果。
  3. 计算损失:使用损失函数(如均方误差、交叉熵等)计算预测结果与真实标签之间的差异。
  4. 反向传播:从输出层开始,逆向通过网络,计算每个参数的梯度。
  5. 参数更新:使用梯度下降法或其他优化算法更新网络参数。
  6. 迭代优化:重复步骤2-5,直到达到预定的迭代次数或损失函数值收敛。

代码实现

以下是一个简单的Python示例,实现一个具有单个隐藏层的多层感知器(MLP)的反向传播算法:

import numpy as np

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

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

# 损失函数(均方误差)
def mse_loss(y_true, y_pred):
    return ((y_true - y_pred) ** 2).mean()

# 反向传播算法
def backpropagation(X, y, weights, learning_rate, epochs):
    input_size = X.shape[1]
    hidden_size = 4  # 假设隐藏层有4个神经元
    output_size = 1  # 假设输出层有1个神经元

    # 初始化权重和偏置
    weights_input_to_hidden = np.random.randn(input_size, hidden_size)
    weights_hidden_to_output = np.random.randn(hidden_size, output_size)
    biases_hidden = np.zeros((1, hidden_size))
    biases_output = np.zeros((1, output_size))

    for epoch in range(epochs):
        # 前向传播
        hidden_layer_input = np.dot(X, weights_input_to_hidden) + biases_hidden
        hidden_layer_output = sigmoid(hidden_layer_input)

        output_layer_input = np.dot(hidden_layer_output, weights_hidden_to_output) + biases_output
        y_pred = sigmoid(output_layer_input)

        # 计算损失
        loss = mse_loss(y, y_pred)

        # 反向传播
        d_output = (y_pred - y)
        d_weights_hidden_to_output = np.dot(hidden_layer_output.T, d_output * sigmoid_derivative(output_layer_input))
        d_biases_output = np.sum(d_output * sigmoid_derivative(output_layer_input), axis=0, keepdims=True)

        d_hidden_output = np.dot(d_output * sigmoid_derivative(output_layer_input), weights_hidden_to_output.T)
        d_weights_input_to_hidden = np.dot(X.T, d_hidden_output * sigmoid_derivative(hidden_layer_input))
        d_biases_hidden = np.sum(d_hidden_output * sigmoid_derivative(hidden_layer_input), axis=0, keepdims=True)

        # 参数更新
        weights_hidden_to_output -= learning_rate * d_weights_hidden_to_output
        biases_output -= learning_rate * d_biases_output
        weights_input_to_hidden -= learning_rate * d_weights_input_to_hidden
        biases_hidden -= learning_rate * d_biases_hidden

        if epoch % 100 == 0:
            print(f"Epoch {epoch}, Loss: {loss}")

    return weights_input_to_hidden, weights_hidden_to_output, biases_hidden, biases_output

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

# 训练模型
learning_rate = 0.1
epochs = 1000
weights_input_to_hidden, weights_hidden_to_output, biases_hidden, biases_output = backpropagation(X, y, None, learning_rate, epochs)
目录
相关文章
|
3月前
|
存储 分布式计算 Linux
安装篇--CentOS 7 虚拟机安装
VMware 装 CentOS 7 不知道从哪下手?这篇超详细图文教程手把手教你在 VMware Workstation 中完成 CentOS 7 桌面系统的完整安装流程。从 ISO 镜像下载、虚拟机配置,到安装图形界面、设置用户密码,每一步都有截图讲解,适合零基础新手快速上手。装好之后无论你是要搭 Hadoop 集群,还是练 Linux ,这个环境都够你折腾一整天!
1468 2
|
机器学习/深度学习 人工智能 自然语言处理
PGL图学习之图神经网络GNN模型GCN、GAT[系列六]
本次项目讲解了图神经网络的原理并对GCN、GAT实现方式进行讲解,最后基于PGL实现了两个算法在数据集Cora、Pubmed、Citeseer的表现,在引文网络基准测试中达到了与论文同等水平的指标。 目前的数据集样本节点和边都不是很大,下个项目将会讲解面对亿级别图应该如何去做。
|
Dart 小程序 API
鸿蒙原生开发手记:01-元服务开发
元服务是鸿蒙系统中的一种轻量级应用形态,无需下载即可直接运行,类似于微信小程序但更轻量。使用原生开发,性能和体验更优。创建元服务需使用 DevEco 工具,支持深色模式和服务卡片功能,开发测试和上架流程详见相关文档。
852 0
鸿蒙原生开发手记:01-元服务开发
|
存储 监控 Devops
centos7安装influxdb2
centos7安装influxdb2
589 0
|
机器学习/深度学习 人工智能 并行计算
StableDiffusion-01本地服务器部署服务 10分钟上手 底显存 中等显存机器 加载模型测试效果 附带安装指令 多显卡 2070Super 8GB*2
StableDiffusion-01本地服务器部署服务 10分钟上手 底显存 中等显存机器 加载模型测试效果 附带安装指令 多显卡 2070Super 8GB*2
309 0
|
人工智能
AI生图美学在淘宝的实践应用(2)
AI生图美学在淘宝的实践应用
621 8
|
存储 监控 Java
InfluxDB时序数据库安装和使用
InfluxDB时序数据库安装和使用
1065 2
|
存储 传感器 数据采集
influxDB使用客户端教程
influxDB使用客户端教程
2154 0