LSTM基本原理

感觉RNN比CNN会难理解一点,刚开始对RNN并不是很理解,直到看了大神的这篇文章Understanding LSTM Networks才感觉理解了一些,写个总结。

三个门

原始输入循环体的是当前输入 xt 和上前一步的输出 ht1 ,以及上一步的状态 Ct1 ,

xt ht1 先遇到遗忘门(forget gate)

ft=sigmoid(Wf[ht1,xt]+bf)

经过遗忘门的函数之后产生一个0到1之间的输出 ft ,代表遗忘多少之前的状态 Ct1 ,当 ft 为0时代表全部遗忘,1代表完全保持。

另外一条路线上, xt ht1 又会遇见输入门(input gate),输入门会决定记忆哪些值:

it=sigmoid(Wi[ht1,xt]+bi)

另外同时经过 tanh 函数会产生一个新的状态 Ct

Ct=tanh(WC[ht1,xt]+bC)

这个时候,由 Ct1 , ft , Ct , it 就可以决定循环体的当前状态 Ct 了:

Ct=ftCt1+itCt

有了当前的状态,自然就可以去输出门(output gate)了:

ot=sigmoid(Wo[ht1,xt]+bo)

ht=ottanh(Ct)

总结:从上面的公式,我们容易发现,每个门的形态是一样的,都是通过 sigmoid 函数作用于当前的输入 xt 和前一时刻的输出 ht1 产生一个0到1的数值,以此来决定通过多少信息。

循环体内部结构

先抛开这几个门,最简单的循环体内部就是一个全连接的神经网络,真实输出可能会再追加一个全连接的神经网络。

我们在用TensorFlow创建RNN模型的时候要设置hidden_size是真实输出的网络的输出神经元个数。

输入的数据是上一时刻的输出 ht1 加上当前时刻的输入 xt ,如果是0时刻的话根据自己的设定填充。

比如当前输入神经元是x个上一状态的输入神经元是h个,那么合在一起的输入神经元就是(x+h)个,因为内部输出要作用于下一个循环体因此内部输出神经元也是h个,于是循环体内部就是(h+x)*h个权重和h个偏置,内部的输出再外接一个hidden_size个输出神经元的全连接层便产生了真实输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值