文章目录

  • 线性回归快速回忆
  • 逻辑回归中的正向传播与反向传播
  • 逻辑回归中的正向传播与反向传播-代码实战
  • 神经网络的正向传播与反向传播
    • 参考资料

线性回归快速回忆

在线性回归(y=ax+by=ax+by=ax+b)中,使用梯度下降时的公式为:
a=a−ηdJdaa = a-\eta \frac{dJ}{da} a=a−ηdadJ​

通过求出代价函数 JJJ 对参数 aaa 的导数,来更新 aaa ,不断重复该过程,直到某次a值的变化趋于0,即认为已经找到了最佳的 aaa

逻辑回归中的正向传播与反向传播


这里将逻辑回归看成一个:有两个输入,没有隐藏层的简单神经网络

其中:
z=w0+w1x1+w2x2y^=a=σ(z)L(a,y)=−(ylog⁡(a)+(1−y)log⁡(1−a))\begin{aligned} & z = w_0 + w_1 x_1 + w_2 x_2 \\\\ & \hat{y}=a=\sigma(z) \\\\ & \mathcal{L}(a, y)=-(y \log (a)+(1-y) \log (1-a)) \end{aligned} ​z=w0​+w1​x1​+w2​x2​y^​=a=σ(z)L(a,y)=−(ylog(a)+(1−y)log(1−a))​

使用sigmoid σ\sigmaσ 作为激活函数,L\mathcal{L}L 为损失函数

正向传播就是输出 x1,x2x_1,x_2x1​,x2​ ,通过上述公式计算出 y^\hat{y}y^​

反向传播就是通过得到的 y^\hat{y}y^​,利用上述公式,推导出 dLdw1\frac{d\mathcal{L}}{dw_1}dw1​dL​ 和 dLdw2\frac{d\mathcal{L}}{dw_2}dw2​dL​(假设只取一样本)

正向传播很简单,只需要代入算即可。

反向传播只需要使用微积分中的链式法则即可,即:

dLdw1=dLdadadzdzdw1\frac{d\mathcal{L}}{dw_1} = \frac{d\mathcal{L}}{da} \frac{da}{dz} \frac{dz}{dw_1} dw1​dL​=dadL​dzda​dw1​dz​

其中:
dLda=−ya+1−y1−adadz=a(1−a)dzdw1=x1\begin{aligned} & \frac{d\mathcal{L}}{da} = -\frac{y}{a} + \frac{1-y}{1-a}\\\\ & \frac{da}{dz} = a(1-a) \\\\ & \frac{dz}{dw_1} = x_1 \end{aligned} ​dadL​=−ay​+1−a1−y​dzda​=a(1−a)dw1​dz​=x1​​

将上式代入原式,得:

dLdw1=(a−y)x1=(y^−y)x1\frac{d\mathcal{L}}{dw_1} = (a - y)x_1 = (\hat{y} - y)x_1 dw1​dL​=(a−y)x1​=(y^​−y)x1​

到这里,我们计算出了 dLdw1\frac{d\mathcal{L}}{dw_1}dw1​dL​ ,这样就可以利用梯度下降求解最佳的 w1w_1w1​,即:
w1=w1−ηdLdw1w_1 = w_1 - \eta \frac{d\mathcal{L}}{dw_1} w1​=w1​−ηdw1​dL​

w0和w2w_0 和w_2w0​和w2​ 同理

逻辑回归中的正向传播与反向传播-代码实战

有了上面的理论基础,就可以轻松进行实现:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
import math
import random
iris = datasets.load_iris() # 去iris数据集X = iris.data
y = iris.targetX = X[y<2, :2] # 只要0、1的,且只取两个特征
y = y[y<2]
plt.scatter(X[y==0, 0],X[y==0, 1])
plt.scatter(X[y==1, 0],X[y==1, 1])
plt.xlabel("x1")
plt.ylabel("x2")
plt.show()

def z(x1, x2, w0, w1, w2):return w0 + w1*x1 + w2*x2
def y_hat(z):return 1 / (1 + math.exp(-z))
def dw1(y_hat, y, x1):return (y_hat-y) * x1
def dw2(y_hat, y, x2):return (y_hat-y) * x2
def dw0(y_hat, y):return y_hat - y
# 初始化权重
w0, w1, w2 = random.random(), random.random(), random.random()
eta = 0.01 # 学习率
for _ in range(1000): # 进行1000次学习for i, x in enumerate(X):x1 = x[0]x2 = x[1]y_predict = y_hat(z(x1, x2, w0, w1, w2))w1 = w1 - eta * dw1(y_predict, y[i], x1)w2 = w2 - eta * dw2(y_predict, y[i], x2)w0 = w0 - eta * dw0(y_predict, y[i])
x1_plot = np.arange(4, 7, 0.1) # 将直线绘制出来
x2_plot = (w0 + w1*x1_plot)/(-w2)
plt.scatter(X[y==0, 0],X[y==0, 1])
plt.scatter(X[y==1, 0],X[y==1, 1])
plt.plot(x1_plot, x2_plot)
plt.xlabel("x1")
plt.ylabel("x2")
plt.show()

神经网络的正向传播与反向传播

有了上面的基础,我们就可以推导神经网络的正向传播和反向传播的公式了。

这里使用西瓜书的相关符号。


这里,我们有一个神经网络,ddd 个输入, lll 个输出,单个隐层,隐层有 qqq 个神经元。vihv_{ih}vih​表示xix_ixi​与bhb_hbh​之间的权重,whjw_{hj}whj​ 表示 bhb_hbh​ 与 yjy_jyj​ 之间的权重。

激活函数使用 sigmoid,记作 fff

对于训练集 (xk,yk)(x_k, y_k)(xk​,yk​), 利用正向传播,我们可以得到第j个输出 y^jk\hat{y}^k_jy^​jk​ 得值,公式为:

y^jk=f(βj−θj)(1)\hat{y}^k_j = f(\beta_j - \theta_j) ~~~~~~~~~~~~~~~(1) y^​jk​=f(βj​−θj​)               (1)


(1) 公式的解释

βj\beta_jβj​ 为所有隐层“b1,⋯,bqb_1, \cdots , b_qb1​,⋯,bq​” 与 输出层 yjy_jyj​ 的乘积,即:

βj=w1jb1+w2jb2+⋯+wqjbq=∑h=1qwhjbh\beta_j = w_{1_j} b_1 + w_{2_j} b_2 + \cdots + w_{q_j} b_q = \sum_{h=1}^{q} w_{h j} b_{h} βj​=w1j​​b1​+w2j​​b2​+⋯+wqj​​bq​=h=1∑q​whj​bh​

相当于上一章的 z=w0+w1x1+w2x2z = w_0 + w_1 x_1 + w_2 x_2z=w0​+w1​x1​+w2​x2​

此时可以发现 βj\beta_jβj​ 少了一个偏移量w0w_0w0​,在西瓜书中,使用 θj\theta_jθj​ 表示了这个偏移量。所以才会有 βj−θj\beta_j - \theta_jβj​−θj​。

将其代入 sigmoid 函数,就可以得到 y^jk\hat{y}^k_jy^​jk​ 的值:
y^jk=f(βj−θj)\hat{y}^k_j = f(\beta_j - \theta_j) y^​jk​=f(βj​−θj​)

y^jk\hat{y}^k_jy^​jk​ 的公式中为什么不包含输入 xxx ? 其实输入变量 x 包含在 隐层中,即隐层的 bjb_jbj​ 是通过所有 xxx 和 www 算出来的


拿到了 y^jk\hat{y}^k_jy^​jk​ ,就可以定义代价函数了,这里使用均方误差来得出代价函数:

Ek=12∑j=1l(y^jk−yjk)2E_{k}=\frac{1}{2} \sum_{j=1}^{l}\left(\hat{y}_{j}^{k}-y_{j}^{k}\right)^{2} Ek​=21​j=1∑l​(y^​jk​−yjk​)2

有了代价函数 EkE_kEk​,那只要求出来 ∂Ek∂whj\frac{\partial E_{k}}{\partial w_{h j}}∂whj​∂Ek​​,那就可以利用梯度下降更新whjw_{hj}whj​了,即

whj=whj−η∂Ek∂whjw_{hj} = w_{hj} - \eta \frac{\partial E_{k}}{\partial w_{h j}} whj​=whj​−η∂whj​∂Ek​​

与上节一样,利用链式法则求∂Ek∂whj\frac{\partial E_{k}}{\partial w_{h j}}∂whj​∂Ek​​, 即:

∂Ek∂whj=∂Ek∂y^jk⋅∂y^jk∂βj⋅∂βj∂whj\frac{\partial E_{k}}{\partial w_{h j}}=\frac{\partial E_{k}}{\partial \hat{y}_{j}^{k}} \cdot \frac{\partial \hat{y}_{j}^{k}}{\partial \beta_{j}} \cdot \frac{\partial \beta_{j}}{\partial w_{h j}} ∂whj​∂Ek​​=∂y^​jk​∂Ek​​⋅∂βj​∂y^​jk​​⋅∂whj​∂βj​​

到这如果可以看懂,基本就算成功了。通过简单计算可以得出:

∂βj∂whj=bh∂y^jk∂βj=y^jk(1−y^jk)∂Ek∂y^jk=y^jk−yjk\begin{aligned} & \frac{\partial \beta_{j}}{\partial w_{h j}}=b_{h} \\\\ & \frac{\partial \hat{y}_{j}^{k}}{\partial \beta_{j}} = \hat{y}^k_j (1-\hat{y}^k_j) \\\\ & \frac{\partial E_{k}}{\partial \hat{y}_{j}^{k}} = \hat{y}_{j}^{k}-y_{j}^{k} \end{aligned} ​∂whj​∂βj​​=bh​∂βj​∂y^​jk​​=y^​jk​(1−y^​jk​)∂y^​jk​∂Ek​​=y^​jk​−yjk​​

将其代入原始就可以得到 whjw_{hj}whj​ 的梯度下降公式,即:
whj=whj−η∂Ek∂whj=whj−η(y^jk−yjk)y^jk(1−y^jk)bhw_{hj} = w_{hj} - \eta \frac{\partial E_{k}}{\partial w_{h j}} = w_{hj} - \eta (\hat{y}_{j}^{k}-y_{j}^{k})\hat{y}^k_j (1-\hat{y}^k_j)b_{h} whj​=whj​−η∂whj​∂Ek​​=whj​−η(y^​jk​−yjk​)y^​jk​(1−y^​jk​)bh​

同理,也可以得出 vhjv_{hj}vhj​ 和 θj\theta_jθj​ 的梯度下降公式。

参考资料

考研必备数学公式大全: https://blog.csdn.net/zhaohongfei_358/article/details/106039576

机器学习纸上谈兵之线性回归: https://blog.csdn.net/zhaohongfei_358/article/details/117967229

Sigmoid函数求导过程: https://blog.csdn.net/zhaohongfei_358/article/details/119274445

周志华西瓜书

吴恩达深度学习

详解+推导 神经网络中的前向传播和反向传播公式(神经网络中的梯度下降)相关推荐

  1. 卷积神经网络CNN的前向和后向传播(一)

    卷积神经网络CNN的前向和后向传播 卷积运算与相关的区别 卷积运算的正向和反向传播 原文 Forward And Backpropagation in Convolutional Neural Net ...

  2. 神经网络的前向传播与反向传播

    神经网络的前向传播和反向传播 相信一开始,大家可能都对神经网络的前向传播和反向传播很头疼,我之前也是一样,后来慢慢懂了,现在深感知识传递的重要性.因此现在我就把我的一点点对两者的理解表达一下,希望能帮 ...

  3. (二十四) 手推BP神经网络的前向传播和反向传播

    手推BP神经网络的前向传播和反向传播 一.基本术语 1.监督学习与非监督学习 Supervised Learning有监督式学习: 输入的数据被称为训练数据,一个模型需要通过一个训练过程,在这个过程中 ...

  4. LSTM前向传播与反向传播算法推导(非常详细)

    1.长短期记忆网络LSTM LSTM(Long short-term memory)通过刻意的设计来避免长期依赖问题,是一种特殊的RNN.长时间记住信息实际上是 LSTM 的默认行为,而不是需要努力学 ...

  5. 花书+吴恩达深度学习(十三)卷积神经网络 CNN 之运算过程(前向传播、反向传播)

    目录 0. 前言 1. 单层卷积网络 2. 各参数维度 3. CNN 前向传播反向传播 如果这篇文章对你有一点小小的帮助,请给个关注,点个赞喔~我会非常开心的~ 花书+吴恩达深度学习(十)卷积神经网络 ...

  6. 神经网络理解:前向传播与反向传播

    文章目录 参考资料 神经网络 前向传播 1. 输入层->隐含层 2. 隐含层->输出层 反向传播 1. 计算总误差 2. 隐藏层与输出层之间的权重更新 3. 输入层与隐藏层之间的权重更新 ...

  7. 对于CNN卷积神经网络的前向传播和反向传播的理解

    对于CNN卷积神经网络的前向传播和反向传播的理解 前向传播示意图: ​ 咋一看这张图,作为初学者可能会不知所云( ̄ω ̄=)?但是想要很好的理解前向传播的原理,我们得从这张图细说. 文章目录 对于CNN ...

  8. 神经网络前向传播和反向传播公式推导(公式+图解)

    以如下的预测是否是猫的双层神经网络为例进行公式推导: 符号注解: n_x :  输入特征的数量 n_h : 隐藏层的节点数量 n_y : 输出层的节点数量 m : 样本数量 W :权重矩阵 b :偏置 ...

  9. 深度神经网络(DNN)正向传播与反向传播推导(通俗易懂)

    一.前言 我在之前的博客里面介绍过浅层的神经网络,现在就从浅层神经网络出发,介绍深度神经网络(DNN)的正向传播和反向传播.希望网友们看本博客之前需要对神经网络有个简单的了解,或者可以看博客初探神经网 ...

最新文章

  1. 白领学python_大学生应该早早自学Python,Ps,Pr,office三件套,还是等到要用的时候再学?...
  2. spring-boot-2.0.3之quartz集成,不是你想的那样哦!
  3. juqery-筛选器-找前后上下
  4. java ssm框架 mapper文件里的#符号和$符号的区别
  5. 都说不建议使用递归操作,到底为什么?
  6. mac 您没有权限打开应用程序_Mac应用程序无法打开或文件损坏的解决方法
  7. 吉林大学计算机学院刘衍衍教授,周柚-吉林大学计算机科学与技术学院
  8. java jdk运行_JDK如何运行
  9. 两台计算机怎么网络连接,两台电脑怎么连接局域网,详细教您两台电脑怎么连接局域网...
  10. Java 找水仙花数
  11. 3.Adaptive AUTOSAR 架构详解
  12. 网页导出pdf不完整_网页文本无法复制?学会这3个套路,一分钟帮你突破限制...
  13. 消费者运营-阿里系三大模型
  14. javaSE - 逻辑控制和输入输出(复习)
  15. Hexo的Next主题配置
  16. B. Multiply by 2, divide by 6(数学) Codeforces Round #653 (Div. 3)
  17. 重新认识 Java 的 System.in
  18. Python之路【第十六篇】:Django【基础篇】
  19. 软件对计算机有配置要求吗,学软件工程对笔记本电脑配置有要求吗?
  20. Ubuntu系统_安装NVIDIA显卡驱动与CUDA Toolkit

热门文章

  1. Dual-Path Fusion:遥感融合
  2. MySQL查询不以某个字符串为开头
  3. 关于关闭谷歌的QUERY_ALL_PACKAGES权限问题
  4. RSTP P/A机制分析
  5. 学习笔记:AC+AP配置:同一个SSID,多个AP的无缝连接漫游。
  6. 帧率、码流与分辨率相关知识
  7. 怎样降低EDIUS中声音
  8. nginx加权轮训算法
  9. Python自学教程
  10. 升级到Win10后悔了?来,教你如何恢复系统