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 异步编程 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渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]