本文主要是介绍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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!