零基础入门深度学习(5) - 循环神经网络
深度学习——循环神经网络GRU公式推导

深度学习——循环神经网络GRU公式推导循环神经网络(Recurrent Neural Network,RNN)是一类具有自循环能力的神经网络,可以处理序列数据的模型。
其中,门控循环单元(Gated Recurrent Unit,GRU)是一种常用的循环神经网络架构,用于解决传统的RNN存在的梯度消失和梯度爆炸问题。
GRU网络由Cho等人于2024年提出,相较于长短时记忆网络(Long Short-Term Memory,LSTM)具有更简化的结构。
GRU通过引入两个门控机制,分别为更新门和重置门,来解决RNN网络中梯度消失和梯度爆炸的问题。
下面将详细介绍GRU的公式推导。
GRU的计算包含三个关键步骤:更新门、重置门和隐藏状态更新。
首先,我们定义输入序列为$x$,隐藏状态为$h$,更新门为$z$,重置门为$r$。
GRU的参数包含三部分:输入门参数矩阵$W_z$,隐藏状态参数矩阵$W_h$和偏置向量$b$。
1. 更新门(Update Gate)$z$的计算:$z_t=\sigma(W_z \cdot [h_{t-1}, x_t] + b_z)$其中,$W_z$为权重矩阵,$h_{t-1}$为上一时刻的隐藏状态,$x_t$为当前时刻的输入序列,$b_z$为更新门的偏置向量,$\sigma$表示sigmoid函数。
2. 重置门(Reset Gate)$r$的计算:$r_t=\sigma(W_r \cdot [h_{t-1}, x_t] + b_r)$其中,$W_r$为权重矩阵,$h_{t-1}$为上一时刻的隐藏状态,$x_t$为当前时刻的输入序列,$b_r$为重置门的偏置向量,$\sigma$表示sigmoid函数。
3. 隐藏状态更新(Hidden State Update):$\tilde{h}_t = \tanh(W_h \cdot [r_t \odot h_{t-1}, x_t] + b_h)$其中,$W_h$为权重矩阵,$r_t$为当前时刻的重置门,$h_{t-1}$为上一时刻的隐藏状态,$x_t$为当前时刻的输入序列,$b_h$为隐藏状态更新的偏置向量,$\odot$表示逐元素乘积。
深度学习RNN循环神经网络ppt课件

RNN—LSTM
ft (Wfx xt Wfhht1 bf ) (a) C 't tanh(WCx xt WChht1 bC ) (b) it (Wix xt Wihht1 bi ) (c) Ct ft *Ct1 it *C 't (d ) ot (Wox xt Wohht1 bo ) (e) ht ot * tanh(Ct ) ( f )
右图中的网络是seq2vec模型,可以 用于情感识别,文本分类等,主要 针对输入为序列信号,输出为向量 的模型建模
右图中的网络包含三个权值,分别 是U,W和V,最后损失函数采用的 是标签和输出的softmax交叉熵,其 实和最大似然函数最终推倒结果是 一致的。
RNN—vec2seq
右图是一个vec2seq模型,它的输入是 一个固定长度的向量,而输出是一个 序列化的信号,比如文本数据。这个 模型的输入x可以当作是循环神经网络 的额外输入,添加到每个隐藏神经元 中,同时每个时间步的输出y也会输入 到隐藏神经元。 在训练期间,下一个时间步的标签和 上一个时间步的输出构成交叉熵损失 函数,最终依旧采用BPTT算法进行训 练。 这样的模型可以用作image captioning 也就是看图说话。
每一个时间步计算都是用相同的激活函数和输入连接权以及循环连接权
RNN—Synced seq2seq
a(t) b Wh(t1) Ux(t) h(t) tanh(a(t) ) 2015-ReLU o(t) c Vh(t) y(t) soft max(o(t) )
L({x(1) ,..., x( )},{y(1) ,..., y( )}) 上图是隐藏神经元之间有循环连接,并且每一个
深度学习基础知识

深度学习基础知识深度学习(Depth Learning)是机器学习的一个重要分支,旨在模仿人类大脑的工作方式,通过神经网络的构建和训练实现智能化的数据分析与决策。
在深度学习的背后,有一些基础知识需要我们掌握,才能更好地理解和应用深度学习技术。
一、神经网络的基本结构神经网络是深度学习的核心,它由多个神经元组成,每个神经元都有激活函数,能接收来自其他神经元的输入,并产生输出。
神经网络通常包括输入层、隐藏层和输出层,其中隐藏层可以有多个。
输入层接受外部数据输入,隐藏层负责对数据进行特征提取和转换,输出层产生最终的结果。
二、梯度下降算法梯度下降算法是深度学习中最基础且最常用的优化算法,用于调整神经网络中各个神经元之间的连接权重,以最小化损失函数。
在训练过程中,通过计算损失函数对权重的偏导数,不断地更新权重值,使得损失函数逐渐减小,模型的性能逐渐提升。
三、反向传播算法反向传播算法是神经网络中用于训练的关键算法,通过将误差从输出层倒推到隐藏层,逐层计算每个神经元的误差贡献,然后根据误差贡献来更新权重值。
反向传播算法的核心思想是链式法则,即将神经网络的输出误差按照权重逆向传播并进行计算。
四、卷积神经网络(CNN)卷积神经网络是一种主要用于图像处理和识别的深度学习模型。
它通过共享权重和局部感受野的方式,有效地提取图像中的特征。
卷积神经网络通常包括卷积层、池化层和全连接层。
其中卷积层用于提取图像中的局部特征,池化层用于降低特征的维度,全连接层用于输出最终的分类结果。
五、循环神经网络(RNN)循环神经网络是一种主要用于序列数据处理的深度学习模型。
它通过引入时间维度,并在每个时间步上传递隐藏状态,实现对序列数据的建模。
循环神经网络可以解决序列数据中的时序依赖问题,适用于音频识别、语言模型等任务。
六、生成对抗网络(GAN)生成对抗网络是一种通过让生成器和判别器相互博弈的方式,实现模型训练和生成样本的深度学习模型。
生成器负责生成与真实样本相似的假样本,判别器负责对真假样本进行分类。
卷积神经网络与循环神经网络

卷积神经网络与循环神经网络卷积神经网络(Convolutional Neural Network,CNN)和循环神经网络(Recurrent Neural Network,RNN)是目前深度学习领域最为流行的两种神经网络架构。
它们分别适用于不同的数据类型和任务,能够有效地处理图像、语音、文本等各种形式的数据。
一、卷积神经网络卷积神经网络是一种专门用于处理格状数据(如图像)的神经网络模型。
它的核心思想是利用卷积操作对输入数据进行特征提取,然后通过池化操作减小特征图的尺寸,最后将提取到的特征输入全连接层进行分类或回归。
卷积神经网络的结构主要包括卷积层、池化层和全连接层。
1.1卷积层卷积层是卷积神经网络的核心组件,它通过卷积操作对输入数据进行特征提取。
卷积操作是指使用一个滤波器(也称为卷积核)在输入数据上进行滑动计算,得到对应位置的输出。
滤波器的参数是在训练过程中通过反向传播算法学习得到的。
在图像处理中,卷积操作可以帮助提取图像中的边缘、纹理、角点等特征。
卷积层一般会使用多个不同的滤波器,从而提取多个不同的特征。
1.2池化层池化层是利用池化操作对卷积层的输出进行降采样,从而减小特征图的尺寸。
常见的池化操作有最大池化和平均池化。
最大池化是保留每个区域内的最大值作为输出,平均池化是计算每个区域内的平均值作为输出。
池化操作的目的是减少计算复杂度和减小过拟合。
1.3全连接层全连接层是卷积神经网络的最后一层,它将池化层的输出作为输入进行分类或回归。
全连接层的每个神经元都与上一层的所有神经元相连,输出一个标量值。
全连接层通常使用一种称为softmax的函数将输出转化为概率分布,再根据不同任务进行相应的损失函数计算和优化。
卷积神经网络通过共享权重和局部感知野的设计,大大减少了模型参数的数量,同时也能够保留输入数据的局部结构特征。
这使得卷积神经网络在图像识别、目标检测、语义分割等计算机视觉任务中取得了很大的成功。
二、循环神经网络循环神经网络是一种专门用于处理序列数据(如语音、文本)的神经网络模型。
理解循环神经网络(RNN)和其在自然语言处理中的应用

理解循环神经网络(RNN)和其在自然语言处理中的应用循环神经网络(Recurrent Neural Network,简称RNN)是一种深度学习模型,具有一种独特的结构,使其在自然语言处理(Natural Language Processing,简称NLP)领域中得到广泛应用。
本文将深入探讨RNN的基本原理,以及它在NLP中的应用,帮助读者更好地理解这一关键技术。
**RNN的基本原理**RNN是一种递归神经网络,其核心思想是在神经网络中引入循环结构,使得信息可以在不同时间步之间传递。
这种循环结构使RNN非常适合处理序列数据,如文本、时间序列和音频数据。
RNN的核心结构包括一个隐藏状态(hidden state)和一个输入(input)。
在RNN中,每个时间步都有一个输入和一个隐藏状态。
输入通常是序列中的当前元素,例如在文本处理中可以是一个单词或一个字符。
隐藏状态包含了网络在之前时间步的信息,并在当前时间步进行更新。
这种循环结构使得RNN能够捕捉序列数据中的长期依赖关系,这对于自然语言处理非常重要,因为语言中的词汇和语法结构通常依赖于前文的内容。
RNN的数学表达如下:\[h_t = f(h_{t-1}, x_t)\]其中,\(h_t\)是当前时间步的隐藏状态,\(h_{t-1}\)是前一个时间步的隐藏状态,\(x_t\)是当前时间步的输入,\(f\)是RNN的激活函数,通常是tanh或ReLU。
通过不断更新隐藏状态,RNN可以逐步理解输入序列并捕捉关键信息。
然而,传统的RNN模型存在梯度消失和梯度爆炸等问题,限制了其在长序列上的性能。
为了解决这些问题,出现了一些改进型的RNN结构,如长短时记忆网络(Long Short-Term Memory,LSTM)和门控循环单元(Gated Recurrent Unit,GRU),它们能够更好地处理长序列数据。
**RNN在自然语言处理中的应用**RNN在NLP领域有着广泛的应用,以下是一些常见的例子:1. **文本生成**:RNN可以用于生成文本,如文章、故事、甚至代码。
五大神经网络模型解析

五大神经网络模型解析近年来,人工智能的快速发展使得深度学习成为了热门话题。
而深度学习的核心就在于神经网络,它是一种能够模拟人脑神经系统的计算模型。
今天,我们就来一起解析五大神经网络模型。
1.前馈神经网络(Feedforward Neural Network)前馈神经网络是最基本的神经网络模型之一。
在前馈神经网络中,信息是单向传输的,即神经元的输出只会被后续神经元接收,不会造成回流。
前馈神经网络能够拟合线性和非线性函数,因此在分类、预测等问题的解决中被广泛应用。
前馈神经网络的一大优势在于简单易用,但同时也存在一些缺点。
例如,神经网络的训练难度大、泛化能力差等问题,需要不断探索解决之道。
2.循环神经网络(Recurrent Neural Network)与前馈神经网络不同,循环神经网络的信息是可以进行回流的。
这意味着神经元的输出不仅会传向后续神经元,还会传回到之前的神经元中。
循环神经网络在时间序列数据的处理中更为常见,如自然语言处理、语音识别等。
循环神经网络的优点在于增强了神经网络处理序列数据的能力,但是它也存在着梯度消失、梯度爆炸等问题。
为了解决这些问题,一些变种的循环神经网络模型应运而生,如长短期记忆网络(LSTM)、门控循环单元(GRU)等。
3.卷积神经网络(Convolutional Neural Network)卷积神经网络是一种类似于图像处理中的卷积操作的神经网络模型。
卷积神经网络通过卷积神经层和池化层的堆叠来对输入数据进行分层提取特征,从而进一步提高分类性能。
卷积神经网络在图像、视频、语音等领域的应用非常广泛。
卷积神经网络的优点在于对于图像等数据具有先天的特征提取能力,可以自动识别边缘、角点等特征。
但是,卷积神经网络也存在着过拟合、泛化能力欠佳等问题。
4.生成对抗网络(Generative Adversarial Network)生成对抗网络可以说是最近几年最热门的神经网络模型之一。
它基于博弈论中的对抗训练模型,由两个神经网络构成:生成器和判别器。
rnn 核心知识点和原理

rnn 核心知识点和原理全文共四篇示例,供读者参考第一篇示例:RNN(循环神经网络)是一种广泛应用于自然语言处理和时间序列数据处理中的深度学习模型。
其独特的结构使其能够处理序列数据,并具有记忆功能,能够根据之前的输入来预测未来的输出。
本文将介绍RNN的核心知识点和原理。
一、RNN的基本结构RNN由一个输入层、一个隐藏层和一个输出层组成。
隐藏层中的神经元之间存在循环连接,使得网络能够记忆之前的输入。
在每个时间步,RNN接收一个输入向量,并输出一个隐藏状态向量。
隐藏状态向量可以被视为网络在时间步t的记忆。
该隐藏状态向量会被传递到下一个时间步,并与新的输入向量一起计算出新的隐藏状态。
二、RNN的前向传播过程\[ h_t = f(W_{hh}h_{t-1} + W_{xh}x_t + b_h) \]\[ y_t = g(W_{hy}h_t + b_y) \]\( h_t \)是在时间步t的隐藏状态,\( x_t \) 是在时间步t的输入向量,\( W_{hh} \)、\( W_{xh} \)、\( W_{hy} \) 是分别表示隐藏状态到隐藏状态、输入到隐藏状态和隐藏状态到输出的权重矩阵,\( b_h \) 和\( b_y \) 是偏置项,\( f \) 和\( g \) 是激活函数。
RNN的反向传播是通过一种称为反向传播通过时间(BPTT)的方法来计算梯度,并更新参数。
在训练过程中,需要将每个时间步的梯度进行累积,以便更新参数。
四、梯度消失和梯度爆炸问题RNN存在梯度消失和梯度爆炸问题。
梯度消失是由于在反向传播过程中,随着时间步数的增加,梯度会变得非常小,导致参数几乎不会更新。
而梯度爆炸则是由于梯度会变得非常大,导致网络不稳定。
为了解决这个问题,可以使用一些技术,如梯度裁剪和长短期记忆(LSTM)网络。
五、LSTM网络LSTM是一种特殊的RNN结构,通过增加门控单元来解决梯度消失和梯度爆炸问题。
LSTM包括输入门、遗忘门、输出门和记忆细胞,能够更好地处理长序列数据。
深度学习知识:卷积神经网络与循环神经网络的比较

深度学习知识:卷积神经网络与循环神经网络的比较深度学习(Deep Learning)是一种机器学习的方法,它旨在通过彼此之间有关的多层神经网络相互作用来解决复杂的模式识别问题。
在深度学习领域中,卷积神经网络(Convolutional Neural Network,CNN)和循环神经网络(Recurrent Neural Network,RNN)是两种最常用的神经网络架构。
它们分别适用于不同类型的任务,且各有优劣。
本文将对卷积神经网络和循环神经网络进行较为全面的比较。
我们将首先分别介绍这两种网络的基本原理和结构,然后从不同的角度对它们进行比较,包括适用领域、处理长期依赖性、参数共享、计算效率等方面。
1.卷积神经网络卷积神经网络是一种专门用于处理图像、语音识别、自然语言处理等高维数据的神经网络。
其核心思想是局部感知(local perception)和参数共享(parameter sharing)。
卷积层通过滤波器(filter)来提取数据的特征,池化层(pooling layer)通过降采样(down-sampling)来减少数据维度,全连接层(fully connected layer)则用于输出分类结果。
1.1卷积层:卷积层通过一系列的滤波器对输入数据进行卷积运算,从而提取数据的空间信息。
卷积运算的优势在于参数共享,使得网络对于输入的平移、旋转、尺度变化具有一定的不变性。
1.2池化层:池化层用于减少数据维度,提高模型的鲁棒性。
常用的池化操作包括最大池化(max pooling)、平均池化(average pooling)等。
1.3全连接层:全连接层将卷积层和池化层提取的特征映射到具体的分类结果上。
2.循环神经网络循环神经网络是一种适用于处理序列数据的神经网络结构。
其核心特点是具有循环连接(recurrent connection),能够在网络内部建立记忆,从而处理不定长的输入序列。
为了解决长期依赖性(long-term dependency)的问题,循环神经网络引入了门控机制,其中最典型的模型是长短期记忆网络(Long Short-Term Memory,LSTM)和门控循环单元(Gated Recurrent Unit,GRU)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[关闭]零基础入门深度学习(5) - 循环神经网络机器学习深度学习入门无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就out了?现在救命稻草来了,《零基础入门深度学习》系列文章旨在讲帮助爱编程的你从零基础达到入门级水平。
零基础意味着你不需要太多的数学知识,只要会写程序就行了,没错,这是专门为程序员写的文章。
虽然文中会有很多公式你也许看不懂,但同时也会有更多的代码,程序员的你一定能看懂的(我周围是一群狂热的Clean Code程序员,所以我写的代码也不会很差)。
文章列表零基础入门深度学习(1) - 感知器零基础入门深度学习(2) - 线性单元和梯度下降零基础入门深度学习(3) - 神经网络和反向传播算法零基础入门深度学习(4) - 卷积神经网络零基础入门深度学习(5) - 循环神经网络零基础入门深度学习(6) - 长短时记忆网络(LSTM)零基础入门深度学习(7) - 递归神经网络往期回顾在前面的文章系列文章中,我们介绍了全连接神经网络和卷积神经网络,以及它们的训练和使用。
他们都只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。
但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。
比如,当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列;当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。
这时,就需要用到深度学习领域中另一类非常重要神经网络:循环神经网络(Recurrent Neural Network)。
RNN种类很多,也比较绕脑子。
不过读者不用担心,本文将一如既往的对复杂的东西剥茧抽丝,帮助您理解RNNs以及它的训练算法,并动手实现一个循环神经网络。
语言模型RNN是在自然语言处理领域中最先被用起来的,比如,RNN可以为语言模型来建模。
那么,什么是语言模型呢?我们可以和电脑玩一个游戏,我们写出一个句子前面的一些词,然后,让电脑帮我们写下接下来的一个词。
比如下面这句:我昨天上学迟到了,老师批评了____。
我们给电脑展示了这句话前面这些词,然后,让电脑写下接下来的一个词。
在这个例子中,接下来的这个词最有可能是『我』,而不太可能是『小明』,甚至是『吃饭』。
语言模型就是这样的东西:给定一个一句话前面的部分,预测接下来最有可能的一个词是什么。
语言模型是对一种语言的特征进行建模,它有很多很多用处。
比如在语音转文本(STT)的应用中,声学模型输出的结果,往往是若干个可能的候选词,这时候就需要语言模型来从这些候选词中选择一个最可能的。
当然,它同样也可以用在图像到文本的识别中(OCR)。
使用RNN之前,语言模型主要是采用N-Gram。
N可以是一个自然数,比如2或者3。
它的含义是,假设一个词出现的概率只与前面N个词相关。
我纳尼?!相信第一次看到这个玩意的读者内心和我一样是崩溃的。
因为种抽象艺术手法。
不过,静下心来仔细看看的话,其实也是很好理解的。
如果把上面有W的那个带箭头的圈去掉,它就变成了最普通的接神经网络。
x是一个向量,它表示藏层面画了一个节点,你也可以想象这一层其实是多个节点,节点数与向量s的维度相同);U是输入层到隐藏层的第三篇文章零基础入门深度学习(3) - 神经网络和反向传播算法现在看上去就比较清楚了,这个网络在t时刻接收到输入之后,隐藏层的值是,输出值是。
关键一点是,的值不仅仅取决于决于。
我们可以用下面的公式来表示循环神经网络的计算方法:式式我们把第i个隐藏层的值表示为、,则深度循环神经网络的计算方式可以表示为:前向计算上图展示了我们到目前为止,在前两步中已经计算得到的量,包括每个时刻t 循环层的输出值,以及误差项。
回忆一下我们在文章零基础入门深度学习(3) - 神经网络和反向传播算法介绍的全连接网络的权重梯度计算算法:只要知道了任意一个时刻的误差项,以及上一个时刻循环层的输出值,就可以按照下面的公式求出权重矩阵在t时刻的梯度:使用这种向量化方法,我们就得到了一个高维、稀疏的向量(稀疏是指绝大部分元素的值都是0)。
处理这样的向量会导致我们的神经网络有很多的参数,带来庞大的计算量。
因此,往往会需要使用一些降维方法,将高维的稀疏向量转变为低维的稠密向量。
不过这个话题我们就不再这篇文章中讨论了。
Softmax层从上图我们可以看到,softmax layer的输入是一个向量,输出也是一个向量,两个向量的维度是一样的(在这个例子里面是4)。
输入向量x=[1 2 3 4]经过softmax层之后,经过上面的softmax函数计算,转变为输出向量y=[0.03 0.09 0.24 0.64]。
计算过程为:2.d e f__i n i t__(s e l f,i n p u t_w i d t h,s t a t e_w i d t h,3.a c t i v a t o r,l e a r n i n g_r a t e):4.5.s e l f.i n p u t_w i d t h=i n p u t_w i d t h6.s e l f.s t a t e_w i d t h=s t a t e_w i d t h7.s e l f.a c t i v a t o r=a c t i v a t o r8.s e l f.l e a r n i n g_r a t e=l e a r n i n g_r a t e9.s e l f.t i m e s=0#当前时刻初始化为t010.s e l f.s t a t e_l i s t=[]#保存各个时刻的s t a t e11.s e l f.s t a t e_l i s t.a p p e n d(n p.z e r o s(12.(s t a t e_w i d t h,1)))#初始化s013.s e l f.U=n p.r a n d o m.u n i f o r m(-1e-4,1e-4,14.(s t a t e_w i d t h,i n p u t_w i d t h))#初始化U15.s e l f.W=n p.r a n d o m.u n i f o r m(-1e-4,1e-4,16.(s t a t e_w i d t h,s t a t e_w i d t h))#初始化W在forward方法中,实现循环层的前向计算,这部分比较简单。
1.d e f f o r w a r d(s e l f,i n p u t_a r r a y):2.'''3.根据『式2』进行前向计算4.'''5.s e l f.t i m e s+=16.s t a t e=(n p.d o t(s e l f.U,i n p u t_a r r a y)+7.n p.d o t(s e l f.W,s e l f.s t a t e_l i s t[-1]))8.e l e m e n t_w i s e_o p(s t a t e,s e l f.a c t i v a t o r.f o r w a r d)9.s e l f.s t a t e_l i s t.a p p e n d(s t a t e)在backword方法中,实现BPTT算法。
1.d e f b a c k w a r d(s e l f,s e n s i t i v i t y_a r r a y,2.a c t i v a t o r):3.'''4.实现B P T T算法5.'''6.s e l f.c a l c_d e l t a(s e n s i t i v i t y_a r r a y,a c t i v a t o r)7.s e l f.c a l c_g r a d i e n t()8.9.d e f c a l c_d e l t a(s e l f,s e n s i t i v i t y_a r r a y,a c t i v a t o r):10.s e l f.d e l t a_l i s t=[]#用来保存各个时刻的误差项11.f o r i i n r a n g e(s e l f.t i m e s):12.s e l f.d e l t a_l i s t.a p p e n d(n p.z e r o s(13.(s e l f.s t a t e_w i d t h,1)))14.s e l f.d e l t a_l i s t.a p p e n d(s e n s i t i v i t y_a r r a y)15.#迭代计算每个时刻的误差项16.f o r k i n r a n g e(s e l f.t i m e s-1,0,-1):17.s e l f.c a l c_d e l t a_k(k,a c t i v a t o r)18.19.d e f c a l c_d e l t a_k(s e l f,k,a c t i v a t o r):20.'''21.根据k+1时刻的d e l t a计算k时刻的d e l t a22.'''23.s t a t e=s e l f.s t a t e_l i s t[k+1].c o p y()24.e l e m e n t_w i s e_o p(s e l f.s t a t e_l i s t[k+1],25.a c t i v a t o r.b a c k w a r d)26.s e l f.d e l t a_l i s t[k]=n p.d o t(27.n p.d o t(s e l f.d e l t a_l i s t[k+1].T,s e l f.W),28.n p.d i a g(s t a t e[:,0])).T29.30.d e f c a l c_g r a d i e n t(s e l f):31.s e l f.g r a d i e n t_l i s t=[]#保存各个时刻的权重梯度32.f o r t i n r a n g e(s e l f.t i m e s+1):33.s e l f.g r a d i e n t_l i s t.a p p e n d(n p.z e r o s(34.(s e l f.s t a t e_w i d t h,s e l f.s t a t e_w i d t h)))35.f o r t i n r a n g e(s e l f.t i m e s,0,-1):36.s e l f.c a l c_g r a d i e n t_t(t)37.#实际的梯度是各个时刻梯度之和38.s e l f.g r a d i e n t=r e d u c e(39.l a m b d a a,b:a+b,s e l f.g r a d i e n t_l i s t,40.s e l f.g r a d i e n t_l i s t[0])#[0]被初始化为0且没有被修改过41.42.d e f c a l c_g r a d i e n t_t(s e l f,t):43.'''44.计算每个时刻t权重的梯度45.'''46.g r a d i e n t=n p.d o t(s e l f.d e l t a_l i s t[t],47.s e l f.s t a t e_l i s t[t-1].T)48.s e l f.g r a d i e n t_l i s t[t]=g r a d i e n t有意思的是,BPTT算法虽然数学推导的过程很麻烦,但是写成代码却并不复杂。