全连接层与链式求导法则在神经网络中的应用

目录

​编辑

引言

全连接层的工作原理

前向传播

反向传播

链式求导法则及其在神经网络中的应用

链式求导法则

应用于全连接层

计算梯度

结论


引言

在深度学习领域,全连接层(Fully Connected Layer,FC)和链式求导法则是构建和训练神经网络的基石。全连接层负责将特征从一种形式转换为另一种形式,而链式求导法则则是反向传播算法的核心,用于计算神经网络参数的梯度。本文将详细探讨全连接层的工作原理以及链式求导法则在神经网络训练中的应用。

全连接层的工作原理

全连接层是神经网络中的一种基本构建块,其主要作用是将输入特征映射到输出特征。在全连接层中,每个输入神经元都与每个输出神经元相连,因此得名“全连接”。

前向传播

假设我们有一个全连接层,其输入向量为 ( \mathbf{x} \in \mathbb{R}n),权重矩阵为 (\mathbf{W} \in \mathbb{R}{n \times m}),偏置向量为 ( \mathbf{b} \in \mathbb{R}^m)。全连接层的前向传播过程可以表示为:

import numpy as npdef activation_function(z):# 以ReLU激活函数为例return np.maximum(0, z)def fully_connected_forward(x, W, b):# 计算线性组合z = np.dot(W, x) + b# 应用激活函数a = activation_function(z)return a, z  # 返回激活后的输出和线性组合输出# 示例输入
x = np.array([1.0, 2.0])
W = np.array([[1.0, 2.0], [3.0, 4.0]])
b = np.array([1.0, 2.0])# 执行前向传播
output, pre_activation = fully_connected_forward(x, W, b)
print("Output of fully connected layer:", output)
print("Pre-activation output:", pre_activation)

在这段代码中,我们定义了一个ReLU激活函数,并在全连接层的前向传播中使用它。fully_connected_forward 函数接受输入向量 x,权重矩阵 W 和偏置向量 b,计算线性组合输出 z 和激活后的输出 a

反向传播

在训练神经网络时,我们需要计算损失函数 ( L) 关于网络参数(权重 ( \mathbf{W} ) 和偏置 ( \mathbf{b})的梯度。这一过程依赖于链式求导法则。

链式求导法则及其在神经网络中的应用

链式求导法则是微积分中的一个基本法则,它允许我们计算复合函数的导数。在神经网络的背景下,链式求导法则被用来计算损失函数关于网络参数的梯度,这是反向传播算法的核心。

链式求导法则

对于任意的复合函数 ( y = g(f(x)) ),链式求导法则表明:

[ \frac{dy}{dx} = \frac{dy}{df} \cdot \frac{df}{dx} ]

这个法则可以扩展到多变量的情况,对于神经网络中的多维参数,链式求导法则同样适用。

应用于全连接层

在全连接层中,我们有:

def activation_derivative(z):# 以ReLU激活函数的导数为例return (z > 0).astype(float)def fully_connected_backward(d_out, z, x, W):# 计算激活函数的导数dz = d_out * activation_derivative(z)# 计算关于W的梯度dW = np.dot(dz, x.T)# 计算关于b的梯度db = np.sum(dz, axis=1, keepdims=True)# 计算关于x的梯度dx = np.dot(W.T, dz)return dx, dW, db# 示例梯度
d_out = np.array([1.0, 1.0])# 执行反向传播
dx, dW, db = fully_connected_backward(d_out, pre_activation, x, W)
print("Gradient with respect to input x:", dx)
print("Gradient with respect to weights W:", dW)
print("Gradient with respect to bias b:", db)

在这段代码中,我们定义了ReLU激活函数的导数,并在全连接层的反向传播中使用它。fully_connected_backward 函数接受损失函数关于激活后输出的梯度 d_out,线性组合输出 z,输入向量 x和权重矩阵 W,计算损失函数关于输入 dx,权重 dW 和偏置 db 的梯度。

计算梯度

  1. 权重梯度 ( \frac{\partial \mathbf{z}}{\partial \mathbf{W}})
    • 这是权重矩阵 (\mathbf{W} ) 对于线性输出 ( \mathbf{z} ) 的梯度,它简单地是输入向量 ( \mathbf{x} ) 的转置乘以损失函数关于线性输出的梯度。
# 权重梯度的计算
dW = np.dot(dz, x.T)
print("Detailed calculation of dW:\n", dW)
# 进一步分析dW的计算过程
print("The gradient of the loss with respect to the weights is calculated by taking the dot product of the gradient of the loss with respect to the output (dz) and the transpose of the input (x.T).")
# 模拟多个数据点的梯度计算
dW_batch = np.dot(dz, x.T)  # 假设dz和x是batch的数据
print("Batch gradient calculation for weights:\n", dW_batch)
  1. 偏置梯度 ( \frac{\partial \mathbf{z}}{\partial \mathbf{b}}\frac{\partial \mathbf{z}}{\partial \mathbf{b}})
    • 这是偏置向量 ( \mathbf{b}) 对于线性输出 ( \mathbf{z}) 的梯度,它是一个常数,因为每个偏置项对输出的影响是独立的。

# 偏置梯度的计算
db = np.sum(dz, axis=1, keepdims=True)
print("Detailed calculation of db:\n", db)
# 进一步分析db的计算过程
print("The gradient of the loss with respect to the bias is calculated by taking the sum of the gradient of the loss with respect to the output (dz) across the rows, which effectively gives us the gradient for each bias term.")
# 模拟多个数据点的梯度计算
db_batch = np.sum(dz, axis=0, keepdims=True)  # 假设dz是batch的数据
print("Batch gradient calculation for bias:\n", db_batch)
  1. 损失函数关于权重的梯度 ( \frac{\partial L}{\partial \mathbf{W}})
    • 这是损失函数 ( L ) 关于权重矩阵 ( \mathbf{W}) 的梯度,它涉及到损失函数关于激活函数输出的梯度 ( \frac{\partial L}{\partial \mathbf{a}} ),激活函数的导数 ( \frac{\partial \mathbf{a}}{\partial \mathbf{z}} ),以及输入向量 ( \mathbf{x}) 的转置。
# 损失函数关于权重的梯度
dL_dW = np.dot(d_out, x.T)
print("Detailed calculation of dL_dW:\n", dL_dW)
# 进一步分析dL_dW的计算过程
print("The gradient of the loss with respect to the weights is calculated by taking the dot product of the gradient of the loss with respect to the output (d_out) and the transpose of the input (x.T).")
# 模拟多个数据点的梯度计算
dL_dW_batch = np.dot(d_out, x.T)  # 假设d_out和x是batch的数据
print("Batch gradient calculation for weights:\n", dL_dW_batch)
  1. 损失函数关于偏置的梯度 ( \frac{\partial L}{\partial \mathbf{b}})
    • 这是损失函数 (L ) 关于偏置向量 ( \mathbf{b} ) 的梯度,它涉及到损失函数关于激活函数输出的梯度 ( \frac{\partial L}{\partial \mathbf{a}}) 和激活函数的导数 ( \frac{\partial \mathbf{a}}{\partial \mathbf{z}} )。
# 损失函数关于偏置的梯度
dL_db = np.sum(d_out, axis=1, keepdims=True)
print("Detailed calculation of dL_db:\n", dL_db)
# 进一步分析dL_db的计算过程
print("The gradient of the loss with respect to the bias is calculated by taking the sum of the gradient of the loss with respect to the output (d_out) across the rows, which effectively gives us the gradient for each bias term.")
# 模拟多个数据点的梯度计算
dL_db_batch = np.sum(d_out, axis=0, keepdims=True)  # 假设d_out是batch的数据
print("Batch gradient calculation for bias:\n", dL_db_batch)

结论

全连接层和链式求导法则是深度学习中不可或缺的部分。全连接层负责特征的线性变换和非线性激活,而链式求导法则则使得我们能够通过反向传播算法有效地训练神经网络。理解这两个概念对于构建和优化深度学习模型至关重要。通过上述代码示例,我们可以看到如何将这些理论应用于实际的神经网络训练过程中。这些代码示例不仅展示了全连接层的前向传播和反向传播的数学原理,还提供了如何在Python中实现这些过程的具体方法。通过这些详细的代码实现,我们可以更深入地理解全连接层和链式求导法则在神经网络中的作用和重要性。

这些原理和代码的实现不仅适用于全连接层,而且是构建更复杂神经网络结构的基础。例如,在卷积神经网络(CNN)中,全连接层通常用于网络的末端,以将学习到的特征映射到最终的输出类别。在递归神经网络(RNN)中,链式求导法则被用来处理序列数据中的依赖关系,从而计算时间步上的梯度。掌握这些基础知识,可以帮助我们更好地理解和改进深度学习模型,以解决更复杂的实际问题。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于框架的逻辑回归:原理、实现与应用

目录 ​编辑 逻辑回归原理 损失函数与优化 正则化 基于框架的实现 1. 数据预处理 2. 模型初始化与训练 3. 模型评估与调优 4. 特征缩放 逻辑回归的应用 信用评分 医疗诊断 垃圾邮件识别 推荐系统 结论 在机器学习领域,逻辑回归是一种基础且强大的分类…

【SpringBoot】Day11-10 yml文件配置

三种配置文件 前面我们一直使用springboot项目创建完毕后自带的application.properties进行属性的配置,那其实呢,在springboot项目当中是支持多种配置方式的,除了支持properties配置文件以外,还支持另外一种类型的配置文件&#x…

强化学习新突破:情节记忆与奖励机制引领多智能体协作

简介 本推文介绍了韩国科学技术院发表在人工智能顶会ICLR 2024上的论文《Efficient Episodic Memory Utilization of Cooperative Multi-Agent Reinforcement Learning》。该论文提出创新性高效情节记忆利用(Efficient Episodic Memory Utilization,EMU…

【python自动化四】日志打印

我们在进行自动化测试时,需要打印过程日志和结果日志等,这里记录下日志的相关配置。这里我们直接自己新建一个logger。 先贴上日志代码如下,可根据需要修改: import logging import os import timefrom logging.handlers import …

【精选】AI Coding 新范式:Windsurf、Cursor、Coze齐上阵

2AGI.NET | 探索 AI 无限潜力,2AGI 为您带来最前沿资讯。 随着人工智能技术的飞速发展,AI Coding领域迎来了前所未有的变革。Codeium的Windsurf、Cursor的agent模式更新、Copilot的新版本以及Coze的AI应用能力,都在推动着编程领域的创新。本期…

Free-RTOS实现LED闪烁

开发板:正点原子探索者 F407 LED定时定时闪烁 本次实验验证: 配置文件 1、打开CubeMX 2、选择芯片型号,然后点击开始项目 3、配置时钟 配置烧录引脚,与FreeRTOS系统时钟 选择FreeRTOS 这里已经默认有一个任务&#xff…

java+ssm+mysql水产品商城

项目介绍: 使用javassmmysql开发的水产品商城,系统包含管理员、用户角色,功能如下: 管理员:用户管理;种类管理;商品管理;订单管理;评论管理;新闻管理&#…

SYN6288语音合成模块使用说明(MicroPython、STM32、Arduino)

模块介绍 SYN6288中文语音合成模块是北京宇音天下科技有限公司推出的语音合成模块。该模块通过串口接收主控传来的语音编码后,可自动进行自然流畅的中文语音播报。 注:SYN6288模块无法播报英文单词和句子,只能按字母播报英文 ;而…

Windows设备go环境安装配置

一、下载go安装包 官网链接:All releases - The Go Programming Language (google.cn) 安装过程比较简单,这里不再赘述,可参考这位博主的文章。本文重点在环境配置。golang环境详细安装、配置_golang安装-CSDN博客 二、环境变量配置 1.添…

vulnhub靶场【hacksudo】之aliens

前言 靶机:hacksudo-aliens 攻击:kali 都是采用虚拟机的形式,网卡桥接模式 主机发现 使用arp-scan -l或者netdiscover -r 192.168.1.1/24进行探索 信息收集 使用nmap扫描 两个http服务,一个ssh服务 网站信息 访问查看 访…

(数据结构与算法)递归 递归是什么 递归的案例和场景 递归进阶

递归的定义和应用条件 递归就是程序调用自身的编程技巧; 把大型复杂的问题转化为一个与原问题相似规模较小的问题来进行求解; 递归每次调用传入的是不同的变量 递归不是算法,是调用自己的过程 调用的那个是一个小问题,自己是一个…

鼠标右键单击Git Bash here不可用

最近在学习git时突然发现右键的git bash没反应,但是去点击应用图标就能正常运行,通常是因为你在安装git之后改变了它的目录名称或者位置,我就是因为安装后改变了一个文件夹的文件名导致不可用 在安装git时系统会默认给鼠标右键选项的git Bas…

【0x0002】HCI_Inquiry_Cancel命令详解

目录 一、命令概述 二、命令格式及参数说明 三、返回事件及参数说明 3.1. HCI_Command_Complete事件 3.2. Status 3.3. 示例 四、命令执行过程 4.1. 前提条件检查 4.2. 命令构建与发送 4.3. 控制器处理 4.4. 返回状态参数 4.5. 主机接收反馈与处理 4.6. 执行流程结…

OpenAI 12Days 第二天 强化微调(RFT):推动语言模型在科学研究中的应用

OpenAI 12Days 第二天 强化微调(RFT):推动语言模型在科学研究中的应用 文章目录 OpenAI 12Days 第二天 强化微调(RFT):推动语言模型在科学研究中的应用RFT的工作原理与应用领域案例研究:基因突变…

公共云提供商正在错失人工智能机遇

他们目前的成功和增长得益于人工智能的应用,但从长远来看,不可持续的成本和可行的替代方案可能会让企业望而却步。 生成式人工智能正在蓬勃发展,并且将继续蓬勃发展。因此,本地和公共云提供商都看到了对其人工智能产品的需求激增…

【Linux系列】AWK 使用指南

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

什么是 k8s CNI ?

1、什么是 CNI ? CNI 是容器网络接口 (Container Network Interface)的缩写。定义了容器运行时如何与网络插件进行交互,从而管理容器网络。只要开发者遵循 CNI 定义的规范就可以接入 kubernetes ,为 Pod 创建虚拟网卡…

深入理解进程的退出、等待与替换(Linux系统)

个人主页:敲上瘾-CSDN博客 个人专栏:Linux学习、游戏、数据结构、c语言基础、c学习、算法 目录 一、进程退出 1.退出场景 2.常见退出方法 3.退出码与退出信号 4._exit函数与exit函数 二、进程等待 1.什么是进程等待(是什么?…

【初阶数据结构与算法】二叉树链式结构刷题训练(Leetcode二叉树遍历、单值二叉树、相同的树、另一棵树的子树、对称二叉树)

文章目录 一、二叉树的遍历二、单值二叉树三、相同的树四、另一颗树的子树五、对称二叉树 一、二叉树的遍历 在链式二叉树的定义与实现中我们已经详细讲解了二叉树常见的三种遍历方式,以及层序遍历,这里给出链接:【初阶数据结构与算法】二叉树…

深入浅出 Go 语言 sync包中的互斥锁、条件变量

深入浅出 Go 语言 sync包中的互斥锁、条件变量 引言 在并发编程中,多个 Goroutine 同时访问共享资源可能会导致数据竞争(Race Condition),进而引发程序的不一致性或崩溃。为了确保并发程序的正确性和稳定性,Go 语言提…