jax可微分编程的笔记(8)

2024-03-01 10:28
文章标签 笔记 编程 微分 jax

本文主要是介绍jax可微分编程的笔记(8),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

jax可微分编程的笔记(8)

第八章 循环神经网络

神经网络是可微分编程中最为重要的模型构造形式,也是当代
深度学习的基本组成部分,深度学习中的“深度”一词,便是对
神经网络的层数的形容。

8.1 神经网络的生物学基础

通过层层近似,从复杂的生物学模型中抽象出一系列较为简化
的数学结构。简单了解计算神经科学后,让我们对数学意义上
的“神经网络”,有了更加丰富的物理直觉。

8.1.1 神经元的电化学性质

神经网络的基本组成单元称为神经元(neuron),又称为神经细胞。
它是一个来自于生物学的术语。神经元可以被视作一个“装有带
电液体的漏水的袋子”。

在可微分编程的语境之下,对膜电位和细胞溶质输运过程的讨论
之所以显得重要,是因为相连接的神经元为我们提供了一个绝好的
物理图像,使得数学意义下“神经网络”较为抽象的训练过程,开始
变得更加真实而具体可感。

各种门控离子通道的存在,使得不同的神经元之间的相互“交流”
成为了可能。

8.1.2 神经元输出过程的建模

由于不同种类的膜蛋白具有不同的动力学性质,我们需要对它们
分别进行建模。膜电位与时间的非线性关系,用非线性函数来描述。
在深度学习中,这样的非线性函数称为激活函数。激活函数的选取
方式极为多样。例如,当我们需要对函数的输出范围进行限制(比如
某一事件发生的概率只能在范围[0,1]包含于R之内)则可以选取
sigmoid函数。常用的sigmoid函数有逻辑斯蒂函数和双曲正切函数。
delta(x)=1/(1+exp(-x))    tanh(x)=(exp(x)-exp(-x))/(exp(x)+exp(-x))

为了解决sigmoid函数带来的梯度消失的问题,ReLU函数(rectified linear unit
修正线性单元)成为最受欢迎的激活函数之一。
ReLU(x)=max(x,0)
ReLU函数在原点处并不连续,为此可以使用softplus函数作为对ReLU函数的近似。
softplus(x)=ln(1+exp(x)) 对于多分类问题,我们还可以采用softmax等激活函数。

8.1.3 神经元构成网络的建模

根据推导,得到公式 tr dv(t)/dt =-v(t)+f(Wu(t))
这个公式是对神经网络讨论的起点,其中的函数f对应着单个神经元的激活函数。
在平衡状态下,表达式v=f(Wu)刻画了一层前馈神经网络中所蕴含的数据结构。
例如4.2.4节中表达式h(x;0)=softmax(wx+b)就相当于给出了神经网络的
一个全连接层。同一层神经元间存在通过突触的相互连接,这样的网络结构被
称为循环神经网络。


8.2 循环神经网络

对于音乐,股票,文字等存在顺序的样本输入,独立同分布假设一般将不再成立。
此时我们期待循环神经网络,表现出色。

8.2.1 简单循环神经网络

设计循环神经网络的要点,在于为单向传播的网络引入反馈的结构。
从递推关系导出微分方程的过程利用了将离散变量连续化的思想。
同样,依照第7章关于动量法的讨论,在时间尺度上离散化,可以把
8.24的微分方程,相当自然地推导得到8.27的递推关系,在这样的
视角下,循环神经网络的训练过程,不过是对生物学意义上神经网络
系统的一次物理模拟,令其“学习”到最优的参数.

8.2.2 循环神经网络的梯度回传

在自然语言处理的语境中,我们通常会选取交叉熵作为词向量之间的
损失函数,并选择softmax作为输出函数G中的激活函数。

对于存在上界Mc<1的情形,梯度在实际传递的过程中容易出现梯度消失
的现象,从而给计算效率带来相当的损失。为了缓解由梯度消失带来的
计算资源的浪费,人们通常会对时间步进行截断。

当序列|Cn|的上确界Mc>=1时,尽管在实践中时间步永远为有限值,但不
稳定的级数,暗示着类似于蝴蝶效应,梯度爆炸等一系列病态数值现象存在。

梯度裁剪的本质,是在梯度矢量的范数过大时动态地调整学习率的大小。
尽管它实际上并未完全解决梯度爆炸的问题,但至少为该问题提供了一个
快速的修复方式。

简单循环神经网络在时间尺度上的收敛性,取决于隐藏层节点间权重矩阵
M的最大本征值λmax;而一般循环神经网络中隐藏层参数的梯度,其理论上界
的存在性,则取决于序列{|Cn|}{n=1,T}的上确界Mc。

这篇关于jax可微分编程的笔记(8)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析