Torch - 循环神经网络



Torch 中的循环神经网络 (RNN) 专门用于处理顺序数据,通过对捕获先前输入信息的隐藏状态进行分类来实现。在 Torch 中,我们可以使用torch.nn.RNN 模块来创建 RNN。这有助于我们理解输入大小、层数、非线性性和隐藏大小。RNN 适用于自然语言处理和序列预测等任务,在这些任务中,数据的顺序至关重要。RNN 可以处理变长序列作为输入,并提供变长序列作为输出。

处理向量和序列的神经网络

在 Torch 中,神经网络是使用torch.nn 模块构建的。这提供了一种灵活且高效的方式来构建和训练神经网络。

  • 向量: 向量是传统的神经网络,例如前馈网络,它处理固定大小的输入向量。向量中的每一层都通过一系列线性运算和非线性运算将输入向量转换为另一个向量。

  • 序列: RNN 专门用于处理顺序数据,其中数据点的顺序很重要。它们维护一个随时间演变的隐藏状态,该状态捕获来自其他输入的信息。

下面的代码允许 RNN 处理序列并捕获时间依赖性,使其适用于各种任务。在 Torch 中实现 RNN:

import torch
import torch.nn as nn

class SimpleRNN(nn.Module):
    def __init__(self,int_size, hdn_size, ott_size):
        super(SimpleRNN, self).__init__()
        self.rnn = nn.RNN(int_size, hdn_size, batch_first=True)
        self.fc = nn.Linear(hdn_size, ott_size)

    def forward(self, x):
        h0 = torch.zeros(1, x.size(0), hdn_size)  
        out, _ = self.rnn(x, h0)
        out = self.fc(out[:, -1, :])  
        return out

int_size = 20  #input
hdn_size = 30  #hidden
ott_size = 2   #output

model = SimpleRNN(int_size, hdn_size, ott_size)

y = torch.randn(2, 4, input_size)

output = model(y)
print(output)

神经网络中的前向和反向传播

在神经网络训练中,前向传播涉及将输入数据馈送到网络以生成预测和损失。反向传播计算损失相对于模型参数的梯度。这些梯度由优化器用来更新模型参数,从而在迭代过程中优化损失。

前向传播

在前向传播中,输入数据逐层馈送到神经网络。每一层都应用变换以产生输出。最后一层生成预测,这些预测使用损失函数与真实标签进行比较,以计算误差。

  • 输入数据: 数据被馈送到神经网络。

  • 逐层计算: 数据按顺序通过网络的每一层。

  • 输出和损失计算: 最后一层产生网络的输出,损失函数将预测与真实标签进行比较并计算损失,量化误差。

反向传播

在反向传播中,损失函数被反向传播到网络中,以计算损失相对于每个参数的梯度。这是使用反向传播完成的。这些梯度由优化器用来更新模型参数,从而在后续迭代中减少损失。

# Compute gradients
loss.backward() 
# Updates the parameters
optimizer.step() 
# Zero gradients
optimizer.zero_grad() 

nngraph 包

nngraph 包通过允许用户将神经网络定义为计算图来扩展 Torch 中 nn 包的功能。这种方法为复杂的架构(如循环神经网络和卷积神经网络)提供了更大的清晰度和灵活性。每个 nn 模块都表示为图中的一个节点。可视化包使用graphviz 等工具支持计算图。这有助于我们理解和调试网络结构。它允许灵活地创建具有多个输入和输出的网络。这支持使用顺序模型难以实现的复杂架构。

要使用 nngraph,我们需要安装它以及用于可视化的graphviz

brew install graphviz # Mac users

sudo apt-get install graphviz -yellow #Ubuntu users
广告