[TOC]
前言
神经网络的历史和背景
神经网络是一种模仿人类神经系统的计算模型,它由大量简略的神经元单元组成,通过它们之间的连贯和传递信息来模仿人脑的学习和推理过程。神经网络起源于上世纪40年代,过后Warren McCulloch和Walter Pitts提出了一种可模仿生物神经元的数学模型,这是第一个神经元模型。
20世纪50年代,Frank Rosenblatt创造了一种称为感知机(Perceptron)的神经网络,能够用来解决二元分类问题。然而,感知机存在一个显著的缺点:它只能解决线性可分的问题。
在20世纪60年代和70年代,神经网络的倒退陷入了低谷。然而,到了1980年代,因为电脑的迅速倒退,计算能力大幅晋升,使得神经网络的训练和优化变得更加可行。此时,很多新的算法被创造进去,包含误差反向流传算法、径向基函数神经网络、自组织神经网络等。
到了21世纪,深度学习逐步锋芒毕露,深度神经网络成为了钻研热点。深度神经网络领有更多的隐含层,能够学习到更加简单的特色和抽象概念,这种能力使得它在很多畛域都获得了很好的体现。神经网络也成为了当今人工智能畛域中的一种重要技术,利用宽泛,包含语音辨认、自然语言解决、图像识别、举荐零碎等畛域。
循环神经网络的呈现及其作用
循环神经网络(Recurrent Neural Networks,简称RNN)是一种用于解决序列数据的神经网络,它能够承受任意长度的输出序列,并通过外部的循环连贯来解决序列中的每个元素。RNN的呈现是为了解决传统神经网络无奈解决时序数据的问题,因为传统神经网络的输出和输入都是独立的,无奈思考上下文信息。
循环神经网络的根本思维是在网络中引入循环构造,使得网络能够保留之前的信息,并将其传递到下一步的计算中。通过这种形式,RNN能够解决具备时序性质的数据,例如语音、文本和视频等序列数据。RNN的一个重要特点是它能够解决变长的输出序列,这使得它在解决自然语言解决、语音辨认、机器翻译等畛域中十分有用。
RNN的利用十分宽泛,其中最有代表性的是自然语言解决畛域,例如情感剖析、文本分类、语言模型、机器翻译等工作。另外,RNN也被广泛应用于语音辨认、股票预测、动作辨认等畛域。除了根本的RNN,还有很多基于RNN的变体,例如长短时记忆网络(LSTM)和门控循环单元(GRU),它们都是为了解决RNN在长序列数据中存在的梯度隐没和梯度爆炸的问题。
LSTM在解决序列数据中的利用
长短时记忆网络(Long Short-Term Memory,简称LSTM)是一种循环神经网络的变体,它能够解决传统RNN在解决长序列数据中存在的梯度隐没和梯度爆炸问题,因而在解决序列数据中十分无效。
LSTM的根本单元是一个门控循环单元(Gated Recurrent Unit,简称GRU),由输出门、忘记门和输入门组成。输出门管制着新输出的重要性,忘记门管制着上一个时刻的记忆细胞状态的重要性,输入门管制着以后时刻的输入。这些门的作用是管制信息流的传递,从而实现长期依赖关系的建设。
LSTM在解决序列数据中的利用十分宽泛,其中最为重要的是语言建模和机器翻译。在语言建模工作中,LSTM能够通过后面的词汇预测下一个词汇呈现的概率分布。在机器翻译工作中,LSTM能够将源语言句子编码为一个固定长度的向量,而后再将其解码成目标语言的句子。此外,LSTM还能够利用于图像标注、视频剖析、音频辨认和工夫序列预测等工作中。
总之,LSTM在解决序列数据中的利用十分宽泛,它的门控机制能够无效地捕获序列之间的长期依赖关系,因而在解决具备时序性质的数据时体现出了很好的成果。
LSTM的基本原理
LSTM的构造和原理
长短时记忆网络(Long Short-Term Memory,简称LSTM)是一种循环神经网络的变体,它能够解决传统RNN在解决长序列数据中存在的梯度隐没和梯度爆炸问题,因而在解决序列数据中十分无效。
LSTM的根本构造是一个由记忆细胞和门控单元组成的网络,其中门控单元管制着信息流的传递,记忆细胞则负责存储和更新上下文信息。LSTM的一个重要特点是它的门控机制,包含输出门、忘记门和输入门,这些门的作用是管制信息流的传递,从而实现长期依赖关系的建设。具体来说,输出门管制着新输出的重要性,忘记门管制着上一个时刻的记忆细胞状态的重要性,输入门管制着以后时刻的输入。
在LSTM中,每个时刻的输出数据和上一个时刻的记忆细胞状态通过门控单元进行解决,计算出以后时刻的记忆细胞状态和输入。LSTM的计算过程能够分为三个局部:
- 忘记门管制着记忆细胞的更新,它决定了哪些信息须要从记忆细胞中忘记掉。忘记门的输出是以后时刻的输出和上一个时刻的暗藏状态,输入是一个介于0和1之间的数值,示意要保留的信息量。
- 输出门管制着新信息的输出,它决定了哪些信息须要增加到记忆细胞中。输出门的输出是以后时刻的输出和上一个时刻的暗藏状态,输入是一个介于0和1之间的数值,示意要增加的信息量。
- 输入门管制着输入的生成,它决定了从记忆细胞中输入多少信息。输入门的输出是以后时刻的输出和上一个时刻的暗藏状态以及以后时刻的记忆细胞状态,输入是一个介于0和1之间的数值,示意要输入的信息量。
LSTM的门控机制使得网络可能无效地捕获序列之间的长期依赖关系,并且可能在解决长序列数据时防止梯度隐没和梯度爆炸的问题。因而,LSTM在解决语音辨认、自然语言解决、视频剖析和工夫序列预测等畛域中广泛应用。
忘记门、输出门、输入门的作用
- 忘记门(Forget Gate):管制着哪些信息须要从记忆细胞中忘记掉。忘记门的输出是以后时刻的输出和上一个时刻的暗藏状态,输入是一个介于0和1之间的数值,示意要保留的信息量。如果输入值为0,则示意须要齐全忘记上一个时刻的记忆细胞状态;如果输入值为1,则示意齐全保留上一个时刻的记忆细胞状态。
- 输出门(Input Gate):管制着新信息的输出,决定了哪些信息须要增加到记忆细胞中。输出门的输出是以后时刻的输出和上一个时刻的暗藏状态,输入是一个介于0和1之间的数值,示意要增加的信息量。如果输入值为0,则示意不增加任何新信息;如果输入值为1,则示意齐全增加新的信息。
- 输入门(Output Gate):管制着输入的生成,决定了从记忆细胞中输入多少信息。输入门的输出是以后时刻的输出和上一个时刻的暗藏状态以及以后时刻的记忆细胞状态,输入是一个介于0和1之间的数值,示意要输入的信息量。如果输入值为0,则示意不输入任何信息;如果输入值为1,则示意齐全输入以后时刻的记忆细胞状态。
LSTM的训练方法
- 前向流传(Forward Propagation):将输出序列通过LSTM的各个门控单元,计算失去输入值。
- 计算损失函数(Compute Loss):将LSTM的输入值和理论标签值进行比拟,计算损失函数,通常应用穿插熵损失函数。
- 反向流传(Backward Propagation):依据损失函数对LSTM的参数进行求导,计算出每个参数对损失函数的影响水平,并通过链式法则将梯度传递回每个门控单元。
- 参数更新(Update Parameters):依据梯度降落法,依照肯定步长调整每个参数的取值,使得损失函数最小化。
反复以上步骤,直到达到最小化损失函数的指标。在理论利用中,通常会采纳一些优化算法,如随机梯度降落(SGD)、Adagrad、Adam等,来减速参数更新的过程,并进步模型的收敛速度和准确度。
须要留神的是,在LSTM的训练过程中,因为存在大量的门控单元和非线性激活函数,会产生梯度隐没和梯度爆炸等问题,这会导致训练成果不佳。为了解决这些问题,罕用的办法包含裁剪梯度、梯度加权均匀、残差连贯等。
代码
应用Python和Keras深度学习库:
from keras.models import Sequentialfrom keras.layers import LSTM, Dense# 定义LSTM模型model = Sequential()model.add(LSTM(64, input_shape=(timesteps, features)))model.add(Dense(num_classes, activation='softmax'))# 编译模型model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])# 训练模型model.fit(x_train, y_train, validation_data=(x_test, y_test), epochs=10, batch_size=32)
这里的LSTM层有64个神经元,输出形态是(timesteps, features)
,其中timesteps
是工夫步长,features
是每个工夫步的特色数。输入层应用softmax激活函数,损失函数为分类穿插熵,优化器为Adam,评估指标为准确率。模型在训练数据上进行了10个epoch的训练,每个batch的大小为32。请留神,这只是一个简略的示例,您能够依据本人的需要和数据集对模型进行更改和调整。
应用PyTorch实现的LSTM模型:
import torchimport torch.nn as nn# 定义LSTM模型class LSTMModel(nn.Module): def __init__(self, input_size, hidden_size, num_layers, num_classes): super(LSTMModel, self).__init__() self.hidden_size = hidden_size self.num_layers = num_layers self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True) self.fc = nn.Linear(hidden_size, num_classes) def forward(self, x): # 初始化LSTM隐状态 h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device) c0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(x.device) # 前向流传LSTM out, _ = self.lstm(x, (h0, c0)) # 提取最初一个工夫步的输入 out = out[:, -1, :] # 全连贯层 out = self.fc(out) return out# 创立LSTM模型实例model = LSTMModel(input_size=features, hidden_size=64, num_layers=1, num_classes=num_classes)# 定义损失函数和优化器criterion = nn.CrossEntropyLoss()optimizer = torch.optim.Adam(model.parameters(), lr=0.001)# 训练模型num_epochs = 10for epoch in range(num_epochs): for i, (inputs, labels) in enumerate(train_loader): # 前向流传 outputs = model(inputs) loss = criterion(outputs, labels) # 反向流传和优化 optimizer.zero_grad() loss.backward() optimizer.step() # 每隔100个batch输入一次loss if (i+1) % 100 == 0: print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, total_step, loss.item()))# 在测试集上评估模型with torch.no_grad(): correct = 0 total = 0 for inputs, labels in test_loader: outputs = model(inputs) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() print('Test Accuracy of the model on the test images: {} %'.format(100 * correct / total))
这里的LSTM模型与之前的Keras实现相似,然而采纳了PyTorch的nn.Module
基类和nn.LSTM
模块来定义模型。模型的训练和测试过程也与Keras实现相似,包含定义损失函数、优化器、训练循环和测试循环等。不同之处在于,PyTorch的训练过程须要手动定义反向流传和优化步骤。
LSTM的改良
GRU
GRU(Gated Recurrent Unit):GRU是一种与LSTM相似的门控循环单元,但它只有两个门(更新门和重置门),相比LSTM参数更少,计算也更简略,因而在某些场景下速度更快。
Attention机制
打算注意力LSTM(Scheduled Attentive LSTM)是一种具备注意力机制的LSTM模型,它能够在每个时刻动静地抉择输出序列中的不同局部进行计算,从而进步了建模成果。此外,打算注意力LSTM还能够依据工作要求进行不同水平的注意力管制,使得模型更加灵便。
## 双向LSTM
双向LSTM:双向LSTM(Bidirectional LSTM)将输出序列别离从前向后和从后向前进行计算,失去两个隐状态序列,而后将它们连接起来失去最终的输入序列。这种办法能够无效地捕获序列中的上下文信息,进步了序列建模的精度。
总结
LSTM的劣势和局限性
- 可能无效地解决长期依赖问题:在传统的RNN中,因为梯度隐没和梯度爆炸等起因,无奈无效地解决长序列,而LSTM通过门控机制和记忆单元的设计,可能无效地保留长期记忆,从而解决了长期依赖问题。
- 可能解决变长序列:LSTM模型可能解决变长的序列数据,例如自然语言解决中的不定长文本,图像处理中的不定数量的特色点等。
- 具备较好的鲁棒性:LSTM模型可能解决输出数据中的噪声和缺失值,从而在肯定水平上进步了模型的鲁棒性。
- 能够在多个工作中利用:因为LSTM具备弱小的序列建模能力,它能够在多个工作中失去利用,例如自然语言解决、语音辨认、图像处理等畛域。
然而,LSTM也存在一些局限性:
- 训练过程较慢:LSTM模型通常须要较长的工夫进行训练,尤其是在解决大规模数据时,训练工夫可能会十分长。
- 容易过拟合:LSTM模型具备大量的参数,当训练数据有余或者噪声较大时,容易产生过拟合景象。
- 难以调参:因为LSTM模型的复杂性,须要调整的超参数较多,这可能会减少模型的复杂性和训练工夫。
- 不易解释:LSTM模型中存在大量的暗藏状态和门控单元,因而对于模型的解释和可解释性方面存在肯定的艰难。