收藏 | 神经网络的 5 种常见求导,附详细的公式过程

2024-04-13 19:18

本文主要是介绍收藏 | 神经网络的 5 种常见求导,附详细的公式过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

20edd45b1d19f2c625f8efe7f8b07a02.png

来源:机器学习与生成对抗网络
本文约1800字,建议阅读5分钟 
本文为你介绍5种常见求导的详细过程!

01 derivative of softmax

1.1 derivative of softmax

一般来说,分类模型的最后一层都是softmax层,假设我们有一个  分类问题,那对应的softmax层结构如下图所示(一般认为输出的结果  即为输入  属于第i类的概率):

5de7c76a170fd76c800836c7e3f68558.png

假设给定训练集  ,分类模型的目标是最大化对数似然函数  。

通常来说,我们采取的优化方法都是gradient based的(e.g., SGD),也就是说,需要求解  。而我们只要求得  ,之后根据链式法则,就可以求得  ,因此我们的核心在于求解  。

由上式可知,我们只需要知道各个样本  的  ,即可通过求和求得  ,进而通过链式法则求得  。因此下面省略样本下标j,仅讨论某个样本  。

实际上对于如何表示  属于第几个类,有两种比较直观的方法:

  • 一种是直接法(i.e., 用  来表示x属于第3类),则  ,其中  为指示函数;

  • 另一种是one-hot法(i.e., 用  来表示x属于第三类),则  ,其中  为向量  的第  个元素。

  • p.s., 也可以将one-hot法理解为直接法的实现形式,因为one-hot向量实际上就是  。

为了方便,本文采用one-hot法。于是,我们有:

1.2 softmax & sigmoid

再补充一下softmax与sigmoid的联系。当分类问题是二分类的时候,我们一般使用sigmoid function作为输出层,表示输入  属于第1类的概率。

然后利用概率和为1来求解  属于第2类的概率,即

乍一看会觉得用sigmoid做二分类跟用softmax做二分类不一样:

  • 在用softmax时,output的维数跟类的数量一致,而用sigmoid时,output的维数比类的数量少;

  • 在用softmax时,各类的概率表达式跟sigmoid中的表达式不相同。

但实际上,用sigmoid做二分类跟用softmax做二分类是等价的。我们可以让sigmoid的output维数跟类的数量一致,并且在形式上逼近softmax。

通过上述变化,sigmoid跟softmax已经很相似了,只不过sigmoid的input的第二个元素恒等于0(i.e., intput为  ),而softmax的input为  ,下面就来说明这两者存在一个mapping的关系(i.e., 每一个  都可以找到一个对应的  来表示相同的softmax结果。不过值得注意的是,反过来并不成立,也就是说并不是每个  仅仅对应一个  )。

因此,用sigmoid做二分类跟用softmax做二分类是等价的。

02 backpropagation

一般来说,在train一个神经网络时(i.e., 更新网络的参数),我们都需要loss function对各参数的gradient,backpropagation就是求解gradient的一种方法。

07da776aa6729539ad9ad3c62e3a4499.png

假设我们有一个如上图所示的神经网络,我们想求损失函数  对  的gradient,那么根据链式法则,我们有

而我们可以很容易得到上述式子右边的第二项,因为  ,所以有

其中,  是上层的输出。

而对于式子右边的的第一项,可以进一步拆分得到

我们很容易得到上式右边第二项,因为  ,而激活函数  (e.g., sigmoid function)是我们自己定义的,所以有

其中,  是本层的线性输出(未经激活函数)。

a4553d493229f52ea857ced1d4f79b64.png

观察上图,我们根据链式法则可以得到


其中,根据  可知

  和  的值是已知的,因此,我们离目标  仅差  和  了。接下来我们采用动态规划(或者说递归)的思路,假设下一层的  和  是已知的,那么我们只需要最后一层的graident,就可以求得各层的gradient了。而通过softmax的例子,我们知道最后一层的gradient确实可求,因此只要从最后一层开始,逐层向前,即可求得各层gradient。

因此我们求  的过程实际上对应下图所示的神经网络(原神经网络的反向神经网络):

3368b032e9cd7372bd425ddf78566947.png

综上,我们先通过神经网络的正向计算,得到  以及  ,进而求得  和  ;然后通过神经网络的反向计算,得到  和  ,进而求得  ;然后根据链式法则求得  。这整个过程就叫做backpropagation,其中正向计算的过程叫做forward pass,反向计算的过程叫做backward pass。

03 derivative of CNN

卷积层实际上是特殊的全连接层,只不过:

神经元中的某些  为  ;

神经元之间共享  。

具体来说,如下图所示,没有连线的表示对应的w为0:

2c6b604f73d08a399073462e2f8a13c6.png

如下图所示,相同颜色的代表相同的  :

7feec11722e297ec7f4ad8c9a85b24d9.png

因此,我们可以把loss function理解为  ,然后求导的时候,根据链式法则,将相同w的gradient加起来就好了。

在求各个  时,可以把他们看成是相互独立的  ,那这样就跟普通的全连接层一样了,因此也就可以用backpropagation来求。

04 derivative of RNN

RNN按照时序展开之后如下图所示(红线表示了求gradient的路线):

bff90b86634aa7ca5830c36ece9fd846.png

跟处理卷积层的思路一样,首先将loss function理解为  ,然后把各个w看成相互独立,最后根据链式法则求得对应的gradient。

由于这里是将RNN按照时序展开成为一个神经网络,所以这种求gradient的方法叫Backpropagation Through Time(BPTT)。


05 derivative of max pooling

一般来说,函数  是不可导的,但假如我们已经知道哪个自变量会是最大值,那么该函数就是可导的(e.g., 假如知道y是最大的,那对y的偏导为1,对其他自变量的偏导为0)。

而在train一个神经网络的时候,我们会先进行forward pass,之后再进行backward pass,因此我们在对max pooling求导的时候,已经知道哪个自变量是最大的,于是也就能够给出对应的gradient了。

references:

http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML17_2.html

http://www.wildml.com/2015/10/recurrent-neural-networks-tutorial-part-3-backpropagation-through-time-and-vanishing-gradients/

编辑:王菁

校对:林亦霖2922f19217b3ee2960601d815066ce53.png

这篇关于收藏 | 神经网络的 5 种常见求导,附详细的公式过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/900987

相关文章

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

Mysql中设计数据表的过程解析

《Mysql中设计数据表的过程解析》数据库约束通过NOTNULL、UNIQUE、DEFAULT、主键和外键等规则保障数据完整性,自动校验数据,减少人工错误,提升数据一致性和业务逻辑严谨性,本文介绍My... 目录1.引言2.NOT NULL——制定某列不可以存储NULL值2.UNIQUE——保证某一列的每一

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

2025版mysql8.0.41 winx64 手动安装详细教程

《2025版mysql8.0.41winx64手动安装详细教程》本文指导Windows系统下MySQL安装配置,包含解压、设置环境变量、my.ini配置、初始化密码获取、服务安装与手动启动等步骤,... 目录一、下载安装包二、配置环境变量三、安装配置四、启动 mysql 服务,修改密码一、下载安装包安装地

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat