Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >神经网络 反向传播

神经网络 反向传播

作者头像
小小程序员
发布于 2023-12-04 00:18:14
发布于 2023-12-04 00:18:14
3220
举报
神经网络 反向传播算法

之前我们在计算神经网络预测结果的时候我们采用了一种正向传播方法,我们从第一层开始正向一层一层进行计算,直到最后一层的

hθ(x)

现在,为了计算代价函数的偏导数

Θ(l)ijJ(Θ)

,我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。 以一个例子来说明反向传播算法。

假设我们的训练集只有一个样本

(x(1),y(1))

,我们的神经网络是一个四层的神经网络,其中

K=4SL=4L=4

前向传播算法:

我们从最后一层的误差开始计算,误差是激活单元的预测( a ( 4 ) {a^{(4)}} a(4))与实际值( y k y^k yk)之间的误差,( k = 1 : k k=1:k k=1:k)。 我们用 δ \delta δ来表示误差,则: δ ( 4 ) = a ( 4 ) − y \delta^{(4)}=a^{(4)}-y δ(4)=a(4)−y 我们利用这个误差值来计算前一层的误差: δ ( 3 ) = ( Θ ( 3 ) ) T δ ( 4 ) ∗ g ′ ( z ( 3 ) ) \delta^{(3)}=\left({\Theta^{(3)}}\right)^{T}\delta^{(4)}\ast g'\left(z^{(3)}\right) δ(3)=(Θ(3))Tδ(4)∗g′(z(3)) 其中 g ′ ( z ( 3 ) ) g'(z^{(3)}) g′(z(3))是 S S S 形函数的导数, g ′ ( z ( 3 ) ) = a ( 3 ) ∗ ( 1 − a ( 3 ) ) g'(z^{(3)})=a^{(3)}\ast(1-a^{(3)}) g′(z(3))=a(3)∗(1−a(3))。而 ( θ ( 3 ) ) T δ ( 4 ) (θ^{(3)})^{T}\delta^{(4)} (θ(3))Tδ(4)则是权重导致的误差的和。下一步是继续计算第二层的误差: δ(2)=(Θ(2))Tδ(3)g(z(2)) 因为第一层是输入变量,不存在误差。我们有了所有的误差的表达式后,便可以计算代价函数的偏导数了,假设 λ = 0 λ=0 λ=0,即我们不做任何正则化处理时有: ∂ ∂ Θ i j ( l ) J ( Θ ) = a j ( l ) δ i l + 1 \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(\Theta)=a_{j}^{(l)} \delta_{i}^{l+1} ∂Θij(l)​∂​J(Θ)=aj(l)​δil+1​

重要的是清楚地知道上面式子中上下标的含义:

l

代表目前所计算的是第几层。

j

代表目前计算层中的激活单元的下标,也将是下一层的第

j

个输入变量的下标。

i

代表下一层中误差单元的下标,是受到权重矩阵中第

i

行影响的下一层中的误差单元的下标。

如果我们考虑正则化处理,并且我们的训练集是一个特征矩阵而非向量。在上面的特殊情况中,我们需要计算每一层的误差单元来计算代价函数的偏导数。在更为一般的情况中,我们同样需要计算每一层的误差单元,但是我们需要为整个训练集计算误差单元,此时的误差单元也是一个矩阵,我们用

Δ(l)ij

来表示这个误差矩阵。第

l

层的第

i

个激活单元受到第

j

个参数影响而导致的误差。

我们的算法表示为:

即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
什么?C/C++面试过不了?因为你还没看过这个!
(为了方便记忆可以想成)被 const 修饰(在 const 后面)的值不可改变,如下文使用例子中的 p2、p3。
杨源鑫
2020/06/04
3.9K0
并发编程(从C++11到C++17)
自C++11标准以来,C++语言开始支持多线程模型。借助多线程模型,我们可以开发出更好的并发系统。本文以C++语言为例,讲解如何进行并发编程。并尽可能涉及C++11,C++14以及C++17中的主要内容。
高性能架构探索
2023/06/13
1.1K0
并发编程(从C++11到C++17)
《C++并发编程实战》读书笔记(1):并发、线程管控
计算机系统中的并发包括任务切换与硬件并发,往往同时存在,关键因素是硬件支持的线程数。不论何种,本书谈论的技术都适用。
C语言与CPP编程
2023/08/10
4680
《C++并发编程实战》读书笔记(1):并发、线程管控
c++11多线程笔记
1 thread类 thread f; 线程等待join() 线程分离detach()
2019/05/25
5260
C++多线程unique_lock详解
       C++11中的unique_lock使用起来要比lock_guard更灵活,但是效率会第一点,内存的占用也会大一点。同样,unique_lock也是一个类模板,但是比起lock_guard,它有自己的成员函数来更加灵活进行锁的操作。
Ch_Zaqdt
2020/02/14
20.7K0
C++11中的互斥锁讲解
我们现在有一个需求,我们需要对 g_exceptions 这个 vector 的访问进行同步处理,确保同一时刻只有一个线程能向它插入新的元素。为此我使用了一个 mutex 和一个锁(lock)。mutex 是同步操作的主体,在 C++ 11 的 <mutex> 头文件中,有四种风格的实现:
泽霖
2023/11/26
3680
UNIX(多线程):04---Mutex互斥量
Mutex 又称互斥量,如果你要在代码里使用和互斥量相关的变量或者函数,你需要包含头文件mutex,std::mutex 是 C++11 中最基本的互斥量,std::mutex 对象提供了独占所有权的特性——即不支持递归地对 std::mutex 对象上锁,而 std::recursive_lock 则可以递归地对互斥量对象上锁。
用户3479834
2021/02/03
8530
【c++】一篇文章带你了解c++11的新特性&&c++11详解
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。
用户10925563
2024/08/06
2720
【c++】一篇文章带你了解c++11的新特性&&c++11详解
C++11:多线程(1)
C++11现在也有了自己的多线程库,从C++11的线程库开始学习了解。 库主要分为:
何其不顾四月天
2023/03/10
5720
C++11-lambda表达式/包装器/线程库
捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用
用户9645905
2022/11/30
1.2K0
C++11-lambda表达式/包装器/线程库
C++并发编程(C++11到C++17)
大型的软件项目常常包含非常多的任务需要处理。例如:对于大量数据的数据流处理,或者是包含复杂GUI界面的应用程序。如果将所有的任务都以串行的方式执行,则整个系统的效率将会非常低下,应用程序的用户体验会非常的差。
范蠡
2021/07/16
1.5K0
C++ 多线程 —— 锁
并发编程中经常需要考虑并发资源竞争读写的问题,因为多个流程同时修改、读取同一个资源时往往会发生超出预期的奇怪行为,因此我们的原则是并发执行任务但是资源读取的过程是清楚干净的。
为为为什么
2023/03/24
1.5K0
C++ 中文周刊 2024-07-21 第164期
七月邮件列表 https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/#mailing2024-07
王很水
2024/07/30
1380
C++ 中文周刊 2024-07-21 第164期
c/c++问题集五
C++11开始引入了多线程库<thread>,其中也包含了互斥锁的API:std::mutex
_咯噔_
2022/04/28
1.2K0
C++11知识点总结(全面解析C++11经常考到的知识点)
相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率。
海盗船长
2020/08/27
2.2K0
来聊聊C++中头疼的线程、并发
在一个应用程序(进程)中同时执行多个小的部分(线程),这就是多线程。多个线程虽然共享一样的数据,但是却执行不同的任务。
AI算法修炼营
2020/05/08
5.1K0
C++11的互斥包装器
在C++多线程中会经常用到mutex,在使用的时候lock后,有时候会忘记使用unlock进行解锁造成死锁,或者在lock和unlock之间代码异常跳出,导致程序无法执行到unlock造成死锁,因此在C++11中引入互斥体包装器,互斥体包装器为互斥提供了便利的RAII风格机制,本质上就是在包装器的构造函数中加锁,在析构函数中解锁,将加锁和解锁操作与对象的生存期深度绑定,防止使用mutex加锁(lock)后,忘记解锁(unlock)或者两者之间出现异常退出等造成死锁。
艰默
2023/11/17
2730
C++11的互斥包装器
【C++航海王:追寻罗杰的编程之路】C++11(四)
在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法。
枫叶丹
2024/06/04
1710
【C++航海王:追寻罗杰的编程之路】C++11(四)
C++并发编程 - 互斥锁(lock_guard和unqiue_lock)
鲜衣怒马少年时,不负韶华行且知。 -- 鹊桥仙
开源519
2022/12/01
6400
C++11的简单介绍(下)
上述代码就是使用C++11中的lambda表达式来解决,可以看出lambda表达式实际是一个匿名函数。
ahao
2024/03/19
1580
C++11的简单介绍(下)
相关推荐
什么?C/C++面试过不了?因为你还没看过这个!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档