【机器学习】033_反向传播

本文介绍了计算图在神经网络中的应用,重点讲解了前向传播如何通过计算图展示操作步骤,并阐述了反向传播原理,以及如何利用Sympy计算导数以优化权重。还提及了ReLU激活函数的优势。
摘要由CSDN通过智能技术生成

一、计算图、反向传播原理

1. 回顾前向传播

        例:假设现在有一个神经网络,其仅有一个输出层和一个神经单元

        · 定义 z = wx+b

        · 定义 a = g(z) = z = wx+b,即激活函数对激活值不再做具体处理

        · 定义平方损失函数 J(w,b) = \frac{1}{2}(a-y)^2,计算a的值与真实值的差距

        此时,通过计算图,我们可以看到前向传播的过程:

        ①输入 x,分别与权重 w 和 b 做运算得到 z,再经过激活函数得到 a 的值;

        ②拿 a 的值与真实值 y 做比较,从而得到损失函数的值。

        

        在这个过程中,我们通过计算图将得到损失函数 J(w,b) 的每一小步操作都呈现了出来,并用诸如 c 和 d 的变量名表示其中的某一部分,※这方便我们后续进行反向传播的求导操作。

        如果我们要实现梯度下降不断更新权重 w 和 b 的值从而减小损失函数,就需要知道损失函数对于 w 和 b 的导数值。这个过程我们称之为【反向传播】。

2. 反向传播

        损失函数对于 w 和 b 的导数值不能够直接求导呈现,由于 J(w,b) 是 w 和 b 经过了多个变换最终计算出来的,因此要对 J(w,b) 求 w 和 b 的导数,就应该使用链式法则来进行计算。

        如图所示,在计算图中进行反向传播的运算,最终可以通过链式法则得到 \frac{\partial J}{\partial w} 和 \frac{\partial J}{\partial b} 的值。

        · 利用这些值,我们就可以进一步执行梯度下降算法的相关操作,来不断更新 w 和 b 的值从而使 J(w,b) 最小。

        · 一般地,当导数为0时,证明达到了极小值点,此时即是梯度下降收敛的位置。

※有关梯度下降算法的相关知识,详见先前学习笔记※

        激活函数的选择:

        目前使用较多的是ReLU函数,它的求导表现是要么让某个参数通过,要么让某个参数消失,因此优化表现更好,且缓解了梯度消失问题(后续会进一步学习)

二、使用 Sympy 的库和包自行计算导数

import sympy
# 使用J和w作为求导计算的符号
J, w = sympy.symbols('J, w')
# 确定两者之间的函数表达式
J = w**2
# diff()函数表示求第一个数对第二个数的导数
dJ_dw = sympy.diff(J, w)
print(dJ_dw)
print(dJ_dw.subs([(w,2)]))  # subs表示将w的值实际代入进去求dJ_dw的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值