循环神经网络

PyTorch 深度学习进阶

Michal Oleszak

Machine Learning Engineer

循环神经元

  • 前馈网络
  • RNN:含有回连
  • 循环神经元:
    • 输入 x
    • 输出 y
    • 隐藏状态 h
  • 在 PyTorch 中:nn.RNN()

普通 RNN 神经元示意:神经元对输入 x 加权并激活,产生输出 y 和 h,h 反馈给自身。

PyTorch 深度学习进阶

按时间展开循环神经元

循环神经元示意图。在时间步 0,接收输入 h0 和 x0,输出 y0 和 h1。

PyTorch 深度学习进阶

按时间展开循环神经元

循环神经元示意图。在时间步 1,接收输入 h1 和 x1,输出 y1。

PyTorch 深度学习进阶

按时间展开循环神经元

循环神经元示意图。在时间步 2,接收输入 h2 和 x2,输出 y2 和 h3。

PyTorch 深度学习进阶

深层 RNN

两个循环神经元构成一层的示意图。每个时间步,输出 y 传递给下一个神经元。

PyTorch 深度学习进阶

序列到序列架构

  • 输入序列,使用完整输出序列
  • 示例:实时语音识别

架构示意:每个时间步有新输入,且每步产生的输出 y 被使用(绿色标记)。

PyTorch 深度学习进阶

序列到向量架构

  • 输入序列,仅使用最后一个输出
  • 示例:文本主题分类

架构示意:每个时间步有新输入,但仅使用最后一个时间步的输出 y(绿色标记)。

PyTorch 深度学习进阶

向量到序列架构

  • 输入单个向量,使用完整输出序列
  • 示例:文本生成

架构示意:仅在首个时间步有一个输入,随后每步产生的所有输出 y 都被使用(绿色标记)。

PyTorch 深度学习进阶

编码器-解码器架构

  • 先输入完整序列,再开始使用输出序列
  • 示例:机器翻译

架构示意:第一部分(编码器)每步接收输入但忽略输出;第二部分(解码器)不再接收输入,使用每步的所有输出。

PyTorch 深度学习进阶

PyTorch 中的 RNN

class Net(nn.Module):
    def __init__(self):
        super().__init__()

self.rnn = nn.RNN( input_size=1, hidden_size=32, num_layers=2, batch_first=True, )
self.fc = nn.Linear(32, 1)
def forward(self, x): h0 = torch.zeros(2, x.size(0), 32)
out, _ = self.rnn(x, h0)
out = self.fc(out[:, -1, :]) return out
  • 定义模型类与 __init__ 方法
  • 定义循环层 self.rnn
  • 定义线性层 fc
  • forward() 中将初始隐藏态设为全零
  • 将输入与初始隐藏态传入 RNN 层
  • 取 RNN 的最后一步输出并传入线性层
PyTorch 深度学习进阶

Passons à la pratique !

PyTorch 深度学习进阶

Preparing Video For Download...