LSTM学习笔记

先前学习

Karpathy博客链接:[传送门](http://karpathy.github.io/2015/05/21/rnn-effectiveness/)
Colah博客链接:[传送门](http://colah.github.io/posts/2015-08-Understanding-LSTMs/)
B站干货课程:[传送门](https://www.bilibili.com/video/av30578651?from=search&seid=9493375067974870259)
  神经网络模拟了人脑处理未来信号的行为过程。每一个信号都有一个合理的weights。下图为一个神经元的样子:

神经元本身不是"线性"的,而是“二值”的,根据刺激决定是否“兴奋”,因而存在activation function,信号达到一定强度才会on。从数学角度,不太像是神经网络。

RNN

  人类不会每秒钟都从头开始思考。对于每个词的理解,都是建立在对之前的词的理解上的。传统的神经网络做不到这一点。RNN解决了这个问题,它们是带有循环的网络,信息可以“持续存在”,解决sequence问题。

可以将循环神经网络视为同一个网络的多个副本,每个副本都将消息传递给后继者。
RNN是双向变深的,通常“很大”。

  RNN的一个吸引力是他们可能能够将先前信息连接到当前任务(环线),例如使用先前的视频帧参与对当前帧的理解。但是有一些情况需要更多的背景信息(时间较长的记忆关系),RNN有可能无法学习连接信息。理论上,RNN绝对能够处理这种“长期依赖性”。人类可以仔细挑选参数来解决这种形式的问题。遗憾的是,在实践中,RNN似乎无法学习它们。庆幸的是,LSTM没有这个问题!

代码看RNN

  核心部分,RNN的API十分友好,它接受x,输出y。

rnn = RNN()
y = rnn.step(x) # x is an input vector, y is the RNN's output vector
class RNN:
  # ...
  def step(self, x):
    # update the hidden state
    self.h = np.tanh(np.dot(self.W_hh, self.h) + np.dot(self.W_xh, x))
    # compute the output vector
    y = np.dot(self.W_hy, self.h)
    return y

两层的RNN:

y1 = rnn1.step(x)
y = rnn2.step(y1)

LSTM

  长短期内存网络–通常只称为“LSTM” - 是一种特殊的RNN,能够学习长期依赖性。LSTM可以选择性忘记不重要的信息,只关联重要的信息。所有的递归神经网络都有一个神经网络的重复模块链的形式。在LSTM中,这个重复模块有4层。

一些符号的意义如下:

LSTM的核心思想

  LSTM最关键的是细胞的状态,也就是贯穿整个图像的最上方一条线。它像是一条传输带一样,数据只是有一些线性的互动。想做到信息顺其运送而不发生改变很简单。

LSTM可以通过gates改变细胞状态,包含一个sigmoid神经层和一个逐点乘法运算。sigmoid输出从0到1的一个数字,表示每种元素应该传输多少。LSTM有三个这样的gates,控制细胞状态。   LSTM可以衡量信息是否重要,而不是“无脑”传递。

一步一步看LSTM

  LSTM的第一步是决定要从状态中丢弃什么信息。这是由一个叫做“forget gate layer”的sigmoid层实现的。它检查ht−1和xt,并输出一个针对每一个Ct-1的介于0与1之间的事情。

  LSTM的第二步是判断要在细胞状态中存储什么新的信息。由两部分组成,包括一个叫做“input gate layer”的sigmoid层决定需要更新什么内容;和一个tanh层创建需要被加入现在state的结果向量。
  LSTM的第三步是根据自身input以及要不要忘记衡量自己的价值,最终传递到output layer,决定输出。

LSTM的应用

对于不确定性很高的内容(语音识别、手写识别),LSTM非常重要。

  • input不是sequence,output是
     上传一张图片,生成文字描述
  • input是sequence,output不是
     视频分类,财经数据分析
  • input和output都是sequence
     语音翻译。

Bi-LSTM

介绍博客:传送门
训练代码博客:传送门
  BiLSTM是Bi-directional Long Short-Term Memory的缩写,是由前向LSTM与后向LSTM组合而成。LSTM模型可以捕捉到较长距离的依赖关系,但是无法捕捉反向的语义依赖(e.g. ”这个餐厅脏得不行“,“不行”修饰的是“脏”)。Bi-LSTM可以解决这个问题。
  对“我爱中国”进行编码:

Tree-LSTM

介绍与计算博客:传送门

空白方框是一个LSTM的单元。文本序列为x1,x2,x4,x5,x6。x是输入序列,y是每个x输入后经过LSTM一个时间片段的预测输出。树型结构展示了结果y之间的依靠关系。
### 关于LSTM的教程与学习笔记 #### LSTM网络简介 长期短期记忆(Long Short-Term Memory, LSTM)是一种特殊的循环神经网络架构,旨在解决传统RNN中的梯度消失问题。通过引入门控机制,LSTM能够有效地捕捉长时间依赖关系并处理序列数据[^1]。 #### LSTM结构解析 LSTM的核心组件包括输入门、遗忘门和输出门三个部分。这些门的作用分别是控制新信息进入细胞状态的程度;决定哪些值应该被丢弃以及如何更新当前的记忆单元;最后则是基于新的细胞状态来计算最终输出向量。 #### PyTorch实现多层LSTM模型 在构建深层LSTM时,`num_layers`参数用于指定堆叠多少个LSTM层。当设置 `num_layers=2` 时,则表示会创建一个由两个连续工作的LSTM组成的网络体系,在这种情况下第二个LSTM接收来自前一层的结果作为其输入,并继续对其进行加工直至得出整个系统的预测结果[^2]。 ```python import torch.nn as nn class StackedLSTM(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size): super(StackedLSTM, self).__init__() self.lstm = nn.LSTM(input_size=input_size, hidden_size=hidden_size, num_layers=num_layers, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): out, _ = self.lstm(x) out = self.fc(out[:, -1, :]) return out ``` 此代码片段展示了如何利用PyTorch库定义一个多层LSTM模型类。其中包含了初始化函数(`__init__()`) 和正向传播过程 (`forward()`) 的具体实现方式。 #### 学习资源推荐 对于希望深入了解LSTM理论和技术应用的学习者来说,可以从上述提到的文章入手进一步探索更多案例研究和技术细节[^3]。此外还有其他优秀的在线博客文章提供了丰富的实践经验和技巧分享[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值