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

相关文章

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

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

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)