Java实现搭积木_搭积木之LSTM的实现

背景

原生的循环神经网络即RNN(Recurrent Neural Network)网络在训练过程中容易出现梯度消失和梯度爆炸的问题,导致的结果是模型很难学习到长期的信息,对此,Sepp Hochreiter和Jurgen Schmidhuber在1997年提出了长短期记忆即LSTM(Long Short Term Memory)模型,该模型的特殊之处在于循环单元的精密设计,相比于RNN网络结构,LSTM网络结构中的一个重复单元包含着三个Gate(input、forget、output)和一个Cell(Memory Cell)组成。

结构图

具体的LSTM网络结构中重复单元结构如下图所示:

b83b31f07473

LSTM网络结构中的重复单元

从上图可以看出,该单元包括四个输入,一个输出,而具体的计算过程如下图所示:

b83b31f07473

LSTM网络结构中重复单元计算图

计算公式

LSTM网络结构的计算过程和BP神经网络下面给出每个Gate和Cell的计算公式,其中,三个Gate对应的计算公式如下:

b83b31f07473

三个Gate计算公式

输入变换公式如下:

b83b31f07473

输入变换公式

Memory Cell更新公式如下:

b83b31f07473

Memory Cell更新公式

实现

上面就是LSTM重复单元前向计算的过程,那么现在根据公式一步一步实现前向计算过程,具体过程如下(python):

首先,我们定义一个LSTM类,并随机初始化连接上述Gate和Memory Cell之间的权值和偏置:

b83b31f07473

LSTM类

其中,initialize函数的实现利用了numpy库中的random函数:

b83b31f07473

initialize函数

initSequence函数的实现过程:

b83b31f07473

initSequence函数

下面给出LSTM类中前向计算过程函数forward的实现过程,按照公式的每一步一一实现:

b83b31f07473

forward函数

上面的公式只是描述了前向计算过程,并没有给出反向计算梯度的过程,下面直接给出反向计算函数backward的实现过程:

b83b31f07473

backward函数

上面几个函数中的sigmoid函数、sigmoid_grad函数、tanh函数、tanh_grad函数、ones函数和zeros函数的实现过程:

b83b31f07473

总结

上面从模型提出的背景到模型结构,再到前向计算公式的展开,最后给出实现过程,希望能从原理理解到动手实现这一步骤给出较为清晰的过程,记录下来帮助自己和他人能够深刻的掌握这一经典神经网络,在后续记录中,会结合具体的应用场景来理解LSTM的价值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值