循环神经网络RNN以及LSTM的推导和实现

本文介绍了循环神经网络RNN及其改进版LSTM的基础概念和工作原理。首先从传统的神经网络谈起,阐述了RNN解决序列问题的特性,接着详细推导了RNN的计算过程,并探讨了RNN的梯度消失问题。然后,重点讲解了LSTM的结构,包括遗忘门、输入门、输出门和细胞状态的计算,展示了如何通过LSTM克服RNN的问题。最后,讨论了LSTM的误差反向传播和参数求导。文章提供了LSTM的代码实现链接,帮助读者更好地理解和应用RNN与LSTM。
摘要由CSDN通过智能技术生成

1. 从神经网络谈起

了解神经网络的都知道,神经网络作为一种非线性模型,在监督学习领域取得了state-of-art的效果,其中反向传播算法的提出居功至伟,到如今仍然是主流的优化神经网络参数的算法. 递归神经网络、卷积神经网络以及深度神经网络作为人工神经网络的"变种",仍然延续了ANN的诸多特质,如权值连接,激励函数,以神经元为计算单元等,只不过因为应用场景的不同衍生了不同的特性,如:处理变长数据、权值共享等。

为了介绍RNN,先简单的介绍ANN. ANN的结构很容易理解,一般是三层结构(输入层-隐含层-输出层). 隐含层输出 o j o_j oj 和输出层输出 o k o_k ok如下。其中 n e t j net_j netj为隐含层第 j j j个神经元的输入, u u u为输入层和隐含层的连接权值矩阵, v v v为隐含层和输出层之间的连接权值矩阵.

$ \begin{align} o_j & = f(net_j) \
o_k & = f(net_k) \
net_j & =\sum_i(x_{i}u_{i,j})+b_j \
net_k & =\sum_j(o_{j}v_{j,k})+b_k \end{align} $$

定义损失函数为 E p = 1 2 ∑ k ( o k − d k ) 2 E_p=\frac{1}{2}\sum_k (o_k - d_k)^2 Ep=21k(okdk)2 ,其中 p p p为样本下标, o k o^k ok为第 k k k个输出层神经元的输出, d k d^k dk为样本在第 k k k个编码值。然后分别对参数 v j , k v_{j,k} vj,k u i , j u_{i,j} ui,j 进行求导,可得:

KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ \frac{\partial…

KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ \frac{\partial…

从对 ∂ E p ∂ u i ,

  • 9
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
反向传播算法(BackPropagation)是一种常用的神经网络训练算法,通过计算损失函数对神经网络中每个参数的偏导数来更新参数,从而实现神经网络的训练。 前馈神经网络的反向传播算法可以简单地概括为以下几个步骤: 1. 前向传播:将输入数据送入神经网络,计算每一层的输出值。 2. 计算输出层的误差:将输出层的输出值与真实值做差,得到误差。 3. 反向传播:从输出层开始,将误差逐层向前传播,并计算每个参数的偏导数。 4. 更新参数:利用偏导数和学习率等参数,更新每个参数的权重和偏置。 RNN循环神经网络)和LSTM(长短时记忆网络)的反向传播算法与前馈神经网络类似,但需要考虑时间序列上的依赖关系。具体来说,RNNLSTM的反向传播算法包括以下几个步骤: 1. 前向传播:将时间序列数据送入神经网络,计算每个时间步的输出值。 2. 计算最后一个时间步的误差:将最后一个时间步的输出值与真实值做差,得到误差。 3. 反向传播:从最后一个时间步开始,将误差逐个时间步向前传播,并计算每个参数的偏导数。 4. 更新参数:利用偏导数和学习率等参数,更新每个参数的权重和偏置。 在实现反向传播算法时,通常会利用矩阵算法进行计算,以提高计算效率。伪代码设计如下: ```python # 前向传播 for i in range(num_layers): z[i+1] = w[i+1] @ a[i] + b[i+1] a[i+1] = activation(z[i+1]) # 计算误差 delta[num_layers] = loss_derivative(a[num_layers], y) * activation_derivative(z[num_layers]) for i in range(num_layers-1, 0, -1): delta[i] = (w[i+1].T @ delta[i+1]) * activation_derivative(z[i]) # 计算偏导数 for i in range(num_layers): dw[i+1] = delta[i+1] @ a[i].T db[i+1] = np.sum(delta[i+1], axis=1, keepdims=True) # 更新参数 for i in range(num_layers): w[i+1] -= learning_rate * dw[i+1] b[i+1] -= learning_rate * db[i+1] ``` 其中,`z[i]` 表示第 i 层的加权输入,`a[i]` 表示第 i 层的输出,`delta[i]` 表示第 i 层的误差,`dw[i]` 和 `db[i]` 分别表示第 i 层的权重和偏置的偏导数。`@` 表示矩阵乘法运算,`np.sum()` 表示求和运算。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值