反向传播算法的算法原理与Python实现

前言

反向传播算法是深度学习中最常用的算法之一,用于训练神经网络。它通过计算网络输出的误差,然后反向传播误差到每个神经元,不断更新网络参数,以使误差最小化。
反向传播算法的原理可以分为两个步骤:前向传播和反向传播。

前向传播

在前向传播过程中,我们首先将输入数据传入神经网络中,然后通过神经元之间的连接和激活函数计算出网络的输出。具体而言,对于一个有 L L L层的神经网络,假设输入层有 n n n个神经元,输出层有 m m m个神经元,第 i i i层的神经元个数为 h i h_i hi,则前向传播的计算公式如下:

z ( i + 1 ) = W ( i ) a ( i ) + b ( i ) z^{(i+1)} = W^{(i)}a^{(i)} + b^{(i)} z(i+1)=W(i)a(i)+b(i)

a ( i + 1 ) = f ( z ( i + 1 ) ) a^{(i+1)} = f(z^{(i+1)}) a(i+1)=f(z(i+1))

其中, a ( 1 ) a^{(1)} a(1)为输入数据, f f f为激活函数, W W W为权重矩阵, b b b为偏置向量, z z z为加权输入。

反向传播

在反向传播过程中,我们首先计算出网络输出与期望输出之间的误差,然后将误差反向传播到每个神经元,根据误差调整每个神经元之间的权重和偏置。具体而言,对于一个有 L L L层的神经网络,假设输出层的误差为 E E E,第 i i i层的误差为 E ( i ) E^{(i)} E(i),则反向传播的计算公式如下:

E = 1 2 ∑ j = 1 m ( y j − y ^ j ) 2 E = \frac{1}{2}\sum_{j=1}^{m}(y_j-\hat{y}_j)^2 E=21j=1m(yjy^j)2

E ( i ) = ∂ E ∂ z ( i ) = ∂ E ∂ a ( i ) ∂ a ( i ) ∂ z ( i ) E^{(i)} = \frac{\partial E}{\partial z^{(i)}} = \frac{\partial E}{\partial a^{(i)}} \frac{\partial a^{(i)}}{\partial z^{(i)}} E(i)=z(i)E=a(i)Ez(i)a(i)

∂ E ∂ W ( i ) = ∂ E ( i ) ∂ W ( i ) = a ( i − 1 ) ( E ( i ) ) T \frac{\partial E}{\partial W^{(i)}} = \frac{\partial E^{(i)}}{\partial W^{(i)}} = a^{(i-1)}(E^{(i)})^T W(i)E=W(i)E(i)=a(i1)(E(i))T

∂ E ∂ b ( i ) = ∂ E ( i ) ∂ b ( i ) = E ( i ) \frac{\partial E}{\partial b^{(i)}} = \frac{\partial E^{(i)}}{\partial b^{(i)}} = E^{(i)} b(i)E=b(i)E(i)=E(i)

其中, y y y为期望输出, y ^ \hat{y} y^为网络输出, ∂ E ∂ z ( i ) \frac{\partial E}{\partial z^{(i)}} z(i)E为第 i i i层的误差, ∂ E ∂ W ( i ) \frac{\partial E}{\partial W^{(i)}} W(i)E为权重矩阵的梯度, ∂ E ∂ b ( i ) \frac{\partial E}{\partial b^{(i)}} b(i)E为偏置向量的梯度。

在得到权重和偏置的梯度之后,我们可以根据梯度下降法,不断更新权重和偏置,以最小化误差函数 E E E

import numpy as np

class NeuralNetwork:
    def __init__(self, input_dim, hidden_dim, output_dim):
        self.input_dim = input_dim
        self.hidden_dim = hidden_dim
        self.output_dim = output_dim
        self.W1 = np.random.randn(input_dim, hidden_dim)
        self.b1 = np.zeros((1, hidden_dim))
        self.W2 = np.random.randn(hidden_dim, output_dim)
        self.b2 = np.zeros((1, output_dim))

    def forward(self, X):
        self.z1 = np.dot(X, self.W1) + self.b1
        self.a1 = np.tanh(self.z1)
        self.z2 = np.dot(self.a1, self.W2) + self.b2
        self.a2 = np.tanh(self.z2)

    def backward(self, X, y):
        self.delta2 = self.a2 - y
        self.delta1 = np.dot(self.delta2, self.W2.T) * (1 - np.power(self.a1, 2))
        self.dW2 = np.dot(self.a1.T, self.delta2)
        self.db2 = np.sum(self.delta2, axis=0, keepdims=True)
        self.dW1 = np.dot(X.T, self.delta1)
        self.db1 = np.sum(self.delta1, axis=0)

    def update(self, alpha):
        self.W1 -= alpha * self.dW1
        self.b1 -= alpha * self.db1
        self.W2 -= alpha * self.dW2
        self.b2 -= alpha * self.db2

    def fit(self, X, y, epochs, alpha):
        for i in range(epochs):
            self.forward(X)
            self.backward(X, y)
            self.update(alpha)

    def predict(self, X):
        self.forward(X)
        return self.a2

在以上代码中,我们定义了一个NeuralNetwork类,包含了前向传播、反向传播和权重更新等方法。具体而言,我们使用tanh作为激活函数,使用sum of squares作为误差函数,使用随机梯度下降法更新权重和偏置。在训练完成后,我们可以使用predict方法对新数据进行预测。

以上是一个简单的反向传播算法的Python实现示例,实际应用中,我们可以使用深度学习框架如TensorFlow、PyTorch等来更方便地实现和训练神经网络。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/3139.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6.网络爬虫——BeautifulSoup详讲与实战

网络爬虫——BeautifulSoup详讲与实战BeautifulSoup简介:BS4下载安装BS4解析对象Tag节点遍历节点find_all()与find()find_all()find()豆瓣电影实战前言: 📝​📝​此专栏文章是专门针对网络爬虫基础,欢迎免费订阅&#…

数据结构中的堆

一、树的重要知识点 节点的度:一个节点含有的子树的个数称为该节点的度(有几个孩子)叶节点或终端节点:度为0的节点称为叶节点;如上图:B、C、H、I...等节点为叶节点(0个孩子)非终端节点或分支节点…

java与Spring的循环依赖

java与Spring的循环依赖一、循环依赖是什么有什么危害二、循环依赖在Spring中的体现和类型三、Spirng如何解决循环依赖四、总结一、循环依赖是什么有什么危害 什么是循环依赖 java中循环依赖用一张图来说就是下图:在对象的创建过程中多个对象形成了依赖闭环&#xf…

指针进阶(中)

提示: 上集内容小复习🥰🥰 int my_strlen(const char* str) {return 1; } int main() {//指针数组char* arr[10];//数组指针int arr2[5] { 0 };int(*p)[5] &arr2; //p是一个指向数组的指针变量//函数指针int (*pf)(const char*)&m…

对于并发的学习-AQS

AbstractQueueSynchronized AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如 ReentrantLock,Semaphore等。 AQS的原理 核心思想: 如果被请求的共享资源空闲,则将当前…

JVM学习.04. Java内存模型与线程模型

1、前言该篇内容主要介绍JVM如何实现多线程,多线程间由于共享和竞争数据而导致的一系列问题以及解决方案。2、内存模型(JMM)Java内存模型(Java Memory Model,简称JMM)的主要目的是定义程序中各种变量的访问…

【数据结构与算法】队列和栈的相互实现以及循环队列

目录🌔一.用队列实现栈🌙1.题目描述🌙2.思路分析🌙3.代码实现⛈二.用栈实现队列☔1.题目描述☔2.思路分析☔3.代码实现🌈三.实现循环队列🌔一.用队列实现栈 🌙1.题目描述 我们先看一下题目链接…

有手就行 -- 搭建图床(PicGo+腾讯云)

🍳作者:贤蛋大眼萌,一名很普通但不想普通的程序媛\color{#FF0000}{贤蛋 大眼萌 ,一名很普通但不想普通的程序媛}贤蛋大眼萌,一名很普通但不想普通的程序媛🤳 🙊语录:多一些不为什么的…

交叉编译说明:工具链安装和环境变量配置

目录 一 简单了解交叉编译 ① 什么是交叉编译 ② 为什么需要交叉编译 ③ 宿主机和目标机 二 搭建交叉编译工作环境 ① 安装工具链 ② 配置环境变量 ● 配置临时环境变量 ● 配置永久环境变量 三 交叉编译宿主机和目标机 ● 宿主机编译生成的可执行文件下载到目…

如何优雅编写测试用例

当你学会了如何设计测试用例之后,接下来便是开始用例的编写。 在设计阶段,更准确的说应该是识别测试点的过程,而编写阶段则是将测试点细化成一条条测试用例的过程,有了比较全的用例场景后,如何让别人更舒服、更方便、…

Linux基本命令

相比Windows系统而言,在一般的企业开发中,使用linux系统无疑是更加广泛的,因此掌握常见的linux基本命令于我们来说是必要的,本文就是对Linux基本命令的简单介绍。 ls 列出当前目录下,所包含的目录及文件; …

宝刀未老?低代码何德何能受大厂们的推崇

风口之下,低代码蓬勃发展,本文从国内低代码的走红现象引入,浅析低代码发展中的变化趋势,重点探讨如此趋势之下,国内大厂如何通过低代码实现了良性发展。 一、国内爆火的低代码 据Gartner最新报告显示,到2…

WebSocket 测试工具

一、WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直…

Windows中: ‘ssh‘ 不是内部或外部命令 解决办法

目录 1. 先查看是否安装openssh -> 1.1 按下winR按键,输入services.msc,点击确定 -> 1.2 随便点一个 然后搜索o -> 1.3 有跳过2 , 没有看2 2. windows 安装 openSSH方式 -> 2.1 设置-> 应用-> 应用和功能-> 管理可选功能​编辑…

【Vue全家桶】详解Vue Router(一)

【Vue全家桶】Vue Router详解(一) Vue系列文章目录: 内容参考链接Vue(一)【Vue全家桶】邂逅Vue、Vue的多种引入方式Vue(二)【Vue全家桶】声明式编程、MVVMVue(三)【Vue…

内存操作函数

前言 🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯 c语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介:>:介绍c语言中有关指针更深层的知识. 金句分享: ✨未来…

Portainer堪称最优秀的容器化管理平台

一、Portainer是什么? Portainer是一款开源的容器管理平台,支持多种容器技术,如Docker、Kubernetes和Swarm等。它提供了一个易于使用的Web UI界面,可用于管理和监控容器和集群。Portainer旨在使容器管理更加简单和可视化&#xf…

Visual chatgpt多模态大模型的前菜

刚开始感觉这就是一篇工程类文章,把各种的模型做了整合,把最近很热的两个方向chatgpt和文本生成图、图文提问整合在一起。看完文章发现自己太自傲了,绝对轻视了微软亚研院大佬们的实力。表面看起来这是一个用chatgpt做意图理解、对话管理&…

平板触控笔哪些品牌好?ipad触控笔推荐平价

苹果电容笔与平替电容笔两者需要根据我们的预算以及需求去选择,要是日常多用于用于绘画,建议可以用Apple Pencil,而对于日常仅仅用于学习与记笔记,可以用平替电容笔,由于平替电容笔的品质与表现都非常优秀。小编整理了…

第十三届蓝桥杯省赛 python B组复盘

文章目录前言主要内容🦞试题 A:排列字母思路代码🦞试题 B:寻找整数思路代码🦞试题 C:纸张尺寸思路代码🦞试题 D:数位排序思路代码🦞试题 E:蜂巢思路代码&…
最新文章