Advertisement

Recurrent Neural Network Tutorial Step by Step Explana

阅读量:

作者:禅与计算机程序设计艺术

1.背景介绍

在本教程中,您将掌握构建基于RNN(Recurrent Neural Networks)的序列模型的技术,并将其应用于分析文本数据集的能力。作为深度学习的重要组成部分之一,RNN模型特别适合处理具有顺序特性的数据,并能生成相应的预测结果。它不仅适用于自然语言处理任务如语言建模和机器翻译等场景,在音频信号分析和视频分析等领域也展现出强大的应用潜力。通过完成本教程的学习任务后,您将具备以下能力:理解RNN的基本原理、设计高效的序列模型架构以及利用Python进行实际项目开发的能力。

  1. 您需要熟悉以下内容:包括 recurrent neural networks(RNNs)的核心构成模块及其工作原理、完整的模型训练流程及其适用场景分析,并通过典型案例进一步理解其应用场景范围。
  2. 您需要深入掌握TensorFlow API的使用方法,并能够完成基于该框架的RNN模型的训练任务。
  3. 您需要透彻理解长短时记忆网络(LSTM)的工作机制及其特点,并将其应用于实际场景中。
  4. 您将采用基于深度学习的RNN技术方案来完成文本分类任务,并构建相应的词嵌入表示并完成其训练工作。
  5. 针对实际应用需求,在深度学习框架下设计并实现具有创新性的序列处理模型,并在多个相关领域中进行具体的应用探讨。

2.核心概念与联系

2.1 RNN介绍

2.1.1 概念

回归分析(Regression):在预测连续型目标变量的情形下,默认情况下我们采用神经网络(Neural network)模型来解决回归问题。这类模型通常包括输入层、隐藏层以及输出层三个主要组成部分。其中,输入层接收外部数据作为特征输入,并将这些特征传递至隐藏层进行信息处理,在经过一系列复杂的计算后,在输出层生成相应的预测值。

分类问题(Classification):当处理的是离散型输出时,在机器学习中分类问题一般会使用Softmax函数来作为激活函数。例如,在多类别分类任务中通过Softmax函数对输出向量进行计算以确定各类别的概率值。这种模型也可称为多层感知机(MLP),它是一种常见的神经网络架构。

若处理的对象为序列数据或时间序列数据,则最简单有效的解决方案就是采用循环神经网络(RNN)。循环神经网络(RNN)由多个RNN单元构成,在模型训练的过程中,默认情况下会自动学习并提取所需特征。每个RNN单元的任务是接收前一时间步的信息,并在此基础上生成当前时间步的输出结果。其显著特征在于能够保持内部状态信息,并利用这一状态信息来预测或生成当前时间步的数据。

2.1.2 基本结构

首先,我们需要明确RNN的基本结构。如下图所示:

  • T 被定义为 time steps 的数量
  • X_t 对应于序列中的第 t 个元素
  • h_{t-1} 被称为 RNN 的隐含状态
  • h_t 被定义为当前时间步的状态
  • o_t 被视为当前时间步的结果

在每一个时间点t中,在线接收数据x_t并将其传递至神经网络的基础单元——即所谓的输入层环节,在经过一系列参数化的变换操作后,在时间轴上依次向前推进一层嵌入式计算模块——即所谓的第一层循环单元,在完成当前时态特征提取后输出一个状态向量h_t,并将该向量作为下一层循环单元的输入信号源;如此反复迭代直至抵达最终的输出层环节,在此阶段完成完整的特征映射与信息整合过程并输出结果o_t;值得注意的是,在整个过程中只有初始时刻接收单一的输入特征信号即可满足模型的基本需求;然而随着模型沿着时序轴展开运行,在每个后续的时间点上都会积累和更新其内部状态h_t这一特性使得模型能够在处理后续数据时结合过去的信息进行预测和决策

除了简单地并行处理单个时序数据外,RNN还具备接收和处理一系列连续的时间序列数据的能力,即同一输入序列可以在一次前馈过程中完成所有时间点的信息传递,而无需将每个时序拆分成单独的样本依次处理。这一策略有助于降低计算开销,从而提高效率,但在实际应用中,由于各种限制因素,RNN通常只能对单个时间步的数据进行操作,因此在大多数场景下其应用效果较为理想

2.1.3 时序数据和循环网络

除了用于处理时序数据外,在深度学习领域中还有许多其他特性可言。其中之一即是所谓的循环网络体系。即所谓的循环网络体系其核心特征在于时间序列数据中的各个元素之间存在相互作用连接从而能够形成了一个动态连贯的整体结构这种结构使得模型能够更好地理解和分析时序数据之间的关联性进而提升预测与建模的能力

循环网络的另一个长处在于它能体现序列间的长期相互依存关系,在许多情况下这一点都至关重要。例如,在一段电影评论中(或如一部电影评论序列中的),前面的观点会对当前段落的内容产生重要影响。此外,在实体之间(或如句子中的)存在丰富的上下文关联信息。

2.2 LSTM网络

2.2.1 基本结构

针对循环神经网络存在的局限性问题,研究者们开发出了更为复杂的循环网络架构。其中最具代表性的是Long Short-Term Memory (LSTM) 网络这一模型。这种模型具备高度灵活性,在处理时间序列数据时展现出更强的能力。下面我们将详细介绍该模型的基本架构设置与工作原理

由两部分构成的LSTM网络包括细胞状态cell state 和遗弃门forget gate。其中细胞状态cell state 具有维持先前信息的能力而使该系统能够识别时间序列中的长程依存性遗弃门则负责调节系统对记忆资源的使用情况其决定了每一步中被遗弃与被保存至细胞状体的信息内容

此外,在LSTM架构中还存在另一个关键组件:输入门input gate

此外,在LSTM架构中还包含一个专门负责控制输出层质量的输出门unit(output gate unit)。该机制能够通过其调控能力实现对模型输出质量的有效管理,并且在特定场景下能够调节模型输出的质量特性,在这些情况下可以更好地适应数据特征的变化规律。

针对本研究的关键发现,在分析现有深度学习模型时发现

2.2.2 LSTM特点

1.相比RNN具有更多的门控结构

在LSTM网络架构中,默认设置下存在遗忘门、输入门和输出门三种基本机制。然而,在实际应用中,默认设置可能无法满足所有需求。这种额外机制的存在不仅提升了模型对复杂序列数据的学习能力,并且增强了其抗干扰性能。

2.防止梯度消失和爆炸

LSTM模型内部有两个关键机制——输入门和遗忘门——共同作用于梯度流动问题。具体而言,在tanh激活单元发挥作用的过程中(即当其输出超出一定范围时),sigmoid激活器会因为导数值显著降低而导致梯度消失现象的发生。为了解决这一问题,在LSTM模型内部采用了双曲正切函数作为主要的激活单元选择,并通过这种选择确保了网络中的信息传递始终保持在合理范围内。同时,在这一过程中还引入了一个称为" forget gate "的机制(即通过sigmoid函数来控制信息流出),从而有效地限定了一定条件下信息传递的可能性,并避免了数值溢出或过小的问题。

3.梯度计算简单

尽管LSTM网络的计算量相对较小,但其采用了专门针对该网络设计的高效的求导方法.然而,在该网络中所涉及的参数数量仅为三个,并因此导致其总参数数目相对较少.从而使其能够在实际应用中被有效地应用.

2.3 文本序列分类任务

作为深度学习的主要研究方向之一,文本序列分类技术广泛应用于情感分析、垃圾邮件过滤等多方面。相较于传统的方法而言,在处理文本数据时需要更加关注其特殊的上下文信息结构。一个好的模型应具备以下特性:能够准确捕捉并利用上下文信息;算法设计需具备高效的计算性能;同时还需要具备良好的泛化能力以应对复杂多样的输入数据。

  1. 具备识别整体信息的能力,在面对文本序列分类任务时,在观察到特定内容时不仅要关注细节还要结合背景知识才能准确判断。
  2. 该模型具备抗干扰能力,在执行文本序列分类任务的过程中需要应对复杂多变的环境状态,则当环境发生变化时仍能保持稳定运行并实现适应。
  3. 该模型存在计算成本高的问题,在执行文本序列分类任务时因为构建完整序列模型而造成了较高的资源消耗。

2.3.1 数据集介绍

为了说明问题,我们选取了IMDB数据集作为示例分析。这是一个涵盖广泛内容且具备丰富性的大型文本序列分类数据集,在本研究中包含了来自IMDB电影评论数据库中的5万个样本。每个样本都会被标注上一个表示情感倾向性的标签值:如果是负面评价,则对应的标签标记为1;如果是正面评价,则对应的标签标记为2;如果是中性评价,则对应的标签标记为3。

IMDB 数据集由两个来源共同提供共计 5 万个评论:其中 IMDb 平台上用户的 5 万个评论以及 MovieLens 网站上的 2.5 万个电影评论将被整合形成统一的数据集合。这些不同来源的数据将被划分为用于训练的数据占 8 成和用于测试的数据占 2 成。

该数据集的格式如下:每个评论映射于一行条记录,每个样本占用50至250个词。可从http://ai.stanford.edu/获取该数据集的具体路径为/amaas/data/sentiment/。

2.3.2 数据处理

要处理文本序列分类任务的数据,需要进行三步:

  1. 分词:第一步是对原始评论数据进行初步划分。例如,在自然语言处理领域中,“I loved this movie”的分词结果可能包括[I, loved, this, movie]四个独立词汇单元。
  2. 对齐:为了确保所有评论具有相同的长度,在较短的评论末尾通常会添加占位符符号(如),以达到统一的数据维度要求。
  3. 编码:最终步骤是将这些分词后的文本内容进行编码处理,并通过向量化的方式将其转化为模型能够处理的数据格式。
复制代码
    import tensorflow as tf
    from tensorflow import keras
    from sklearn.model_selection import train_test_split
    
    # Load data and preprocess
    train_data = keras.datasets.imdb.load_data()
    X_train, y_train = train_data
    vocab_size = 10000 # set vocabulary size
    maxlen = 250 # set max length of each sentence
    embedding_dim = 100 # set embedding dimensionality
    
    tokenizer = keras.preprocessing.text.Tokenizer(num_words=vocab_size, lower=True)
    tokenizer.fit_on_texts(np.concatenate((X_train)))
    
    def vectorize_sequences(sequences):
    return tokenizer.texts_to_sequences(sequences)
    
    def pad_sequences(sequences):
    return keras.preprocessing.sequence.pad_sequences(sequences, maxlen=maxlen)
    
    X_train = pad_sequences(vectorize_sequences(X_train))
    y_train = np.array(y_train)
    
    # Split into train and validation sets
    X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=42)
    
    # Build the model
    inputs = keras.layers.Input(shape=(None,))
    embedding = keras.layers.Embedding(input_dim=vocab_size+1, output_dim=embedding_dim)(inputs)
    lstm = keras.layers.LSTM(units=100, dropout=0.2, recurrent_dropout=0.2)(embedding)
    dense = keras.layers.Dense(units=1, activation='sigmoid')(lstm)
    model = keras.models.Model(inputs=inputs, outputs=dense)
    
    model.summary()
    
    # Compile the model
    model.compile(optimizer='adam', loss='binary_crossentropy')
    
    # Train the model
    history = model.fit(X_train, y_train, batch_size=32, epochs=10, validation_data=(X_val, y_val), verbose=1)
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

首先,请导入必要的库与模块。随后,请加载数据并对数据进行预处理。接着,请设定词汇量大小为10000,并将每个句子的最大长度设定为250。然后,请创建一个Tokenizer对象,并通过调用其fit_on_texts()方法来统计评论数据中的所有单词频率;随后,请根据频率将那些出现次数较低的词替换为UNK标记。接着,请定义一个名为vectorize_sequences的函数,并调用其内部使用的texts_to_sequences()方法来实现评论内容向量化;同样地,请定义另一个名为pad_sequences的函数,并利用它来统一各条评论的长度至250个单位,并在必要时添加填充标记以确保序列的一致性与完整性。

随后, 我们调用train_test_split()函数将数据集合划分为训练子集和验证子集, 并使训练子集占比为80%, 验证子集占比为20%.

最后部分中, 我们构建了一个基础架构, 其中包含一个嵌入层, 一个LSTM层以及一个全连接层. 在随后的操作中, 我们对整个网络进行编译, 将损失函数设定为二元交叉熵损失, 并选择Adam优化器作为优化方法. 接下来, 我们启动了模型的训练流程, 并记录了训练过程中的各项指标数据.

2.3.3 模型效果评估

在模型训练完成后, 我们可以通过验证数据集对模型性能进行检验. 采用基于测试数据计算得到的分类正确率与损失函数作为评价指标使用的方式, 我们可以对模型性能进行量化评估.

复制代码
    loss, accuracy = model.evaluate(X_test, y_test)
    
    print('Test Accuracy:', accuracy)
    print('Test Loss:', loss)
    
      
      
      
    
    代码解读

最后,我们打印测试集上的准确率和损失函数。

3.基于RNN的文本分类模型原理详解

3.1 词向量

在自然语言处理领域中,在线性代数的基础上发展起来的一种新的数学工具——矩阵分解技术被广泛应用于推荐系统中。矩阵分解技术的基本思想是在数据稀疏的情况下对高维数据进行降维处理从而提高算法效率并解决数据稀疏性问题。该方法的核心在于通过构造用户-物品二元关系矩阵将其分解成两个低维矩阵从而实现对隐含用户偏好模式的有效建模。由于这种方法能够较好地平衡计算效率与建模能力因此得到了广泛应用并成为推荐系统中的重要技术基础。

3.2 RNN的基本原理

递归神经网络(RNN)属于深度学习领域中的一种核心网络架构。该模型在序列数据处理方面表现出色。该架构采用双向循环机制,在处理时间序列数据时能够有效地捕捉前后状态信息。在循环迭代过程中,每个时间步的输入不仅包含当前输入信号本身,并且也整合了前一个时间步输出的信息。其独特的结构设计使得该模型能够有效捕捉长时段内的依赖关系,并提供精确的未来预测能力。

RNN 的基本结构如下图所示:

其中 X^{(i)} 表示输入序列,并包含 T_x 个元素。而 H^{(i)} 则表示整个系统的隐藏层状态,在该状态下系统能够完成从输入到输出的信息处理过程。值得注意的是,在第 i 个时间步 t 的状态下(即其在第 i 个时间步 t 的状态),该系统的隐藏层状态由以下公式确定:

H^{i}_t = \sigma\left(\overrightarrow{H}^{i}_{t-1} * W_x + \overrightarrow{\bar{h}}^i_t * U_h + b_h\right)

\bm{H}^{(i)}_{t-1} 表示前一个时间段的隐藏层状态,
\bm{\hat{h}}^{(i)}_t\text{代表前一个时间段的隐藏层输出}, 权重矩阵分别为\bm{W}_x, \bm{U}_h, 偏置项则记作b_h$. 其中,
σ函数被定义为一种激活函数,
它主要用于调节神经信号在两个关键节点之间的传递强度,
从而影响着两个节点之间的关系强度。

RNN 的另一个显著特征在于它擅长处理长序列数据。它能够捕捉当前状态并传递到下一个状态,并最终实现对序列长期依赖关系的学习。

3.3 LSTM的基本原理

为了改进RNN算法在处理长序列数据时的表现不足,在研究领域内出现了许多创新性的解决方案。其中一种具有里程碑意义的方法是LSTM架构的发展。该方法在结构上具有相似性与原始RNN模型之间存在显著差异:它通过引入独特的机制实现了对长期依赖关系的有效捕捉能力提升。具体而言,LSTM网络由四个关键组件构成:输入通道用于接收当前时刻的信息,遗忘通道负责抑制不必要的短期信息,输出通道负责传递模型当前的状态信息,以及更新通道则决定了状态如何随时间逐步演变。这种多层递进式的组织方式不仅增强了模型对复杂模式的学习能力,还显著提升了其在实际应用中的表现

LSTM 网络的基本结构如下图所示:

其中涉及的变量包括:输入序列为\ X^{(i)}\ ;Cell State被定义为\ C^{(i)}\ ;Hidden State则表示\ H^{(i)}\ 。这些状态变量均参与构建从输入层到输出层的信息传递机制。

输入门

输入门用于调控网络对新的输入量的吸收情况。它是sigmoid函数的一种,在下文中通过公式(1)进行计算。

\gamma_t = \sigma(W_i _\overrightarrow{h}^{i}_{t-1} + W_{\bar{x}}_\overrightarrow{x}_t + b_i)\tag{1}

这些输入门的权值由 W_i, W_{\bar{x}}b_i 表示。上一个时间步的隐藏状态向量 \overrightarrow{h}^{i}_{t-1} 和输入向量 \overrightarrow{x}_t 将被用来计算当前时刻的状态值。激活函数 \sigma 被用来计算激活值。输出门信号 \gamma_t 负责控制信息流动。

遗忘门

遗忘门用于调控网络以判断是否忘记旧信息。它是通过 sigmoid 函数及其计算方式如下:

\alpha_t = \sigma(W_f _\overrightarrow{h}^{i}_{t-1} + W_{\bar{x}}_\overrightarrow{x}_t + b_f)\tag{2}

用于表示遗忘门参数的一组变量包括 W_f, W_{\bar{x}}, 和 b_f. 上一个时间步的隐藏状态 \overrightarrow{h}^{i}_{t-1} 和输入信号 \overrightarrow{x}_t, 被用来计算当前状态. 通过 \sigma 激活函数能够有效地计算出当前时间步的状态激活值. 系数 \alpha_t, 即遗忘因子, 在此机制中被定义为遗忘门的输出结果.

更新门

更新门负责调控细胞状态中所保留的信息状态的保持程度以及新信息的更新情况。
它是一种Tahn函数,并且其具体的数学表达式如下:

\tilde C_t 等于双曲正切函数作用于一系列加权向量之和及一个偏置项而计算得出,
其中 \tilde C_t = \text{Tanh}(W_β*\vec h_t^i+W_c*\vec C_t^{-1}+W_x*\vec x_t+b)\quad (3).

这些变量代表更新门权重参数;它们分别代表上一时刻的状态向量:隐藏态、细胞态以及输入向量;双曲正切函数用于计算激活值;其输出结果即为更新门的状态

Cell State

Cell State 由遗忘门与更新门共同作用来实现信息流动。其中分别负责管理Cell State中被遗忘和更新的信息量。以下所示的数学公式用于计算Cell State:

C_t = \gamma_t _\overrightarrow{C}_{t-1} + (1-\gamma_t)_ \tilde{C}_t \tag{4}

其中,C_t 是 cell state 的更新后结果;\gamma_t(1-\gamma_t) 分别对应着输入门和遗忘门的输出

Hidden State

Hidden State 则通过 Cell State 来更新信息。以下公式计算 Hidden State:

其中输出门权重由参数组W_o, b_o确定,在LSTM网络中新的Cell State(C_t)被更新以反映最新的输入信息。σ函数则用于计算神经元激活度,在此过程中当前时刻的状态变量h_t = H_t被系统所识别并加以利用。

3.4 Text Classification with RNN and LSTM

Text classification is a primary task in natural language processing, involving categorizing documents or sentences into predefined groups like spam detection, sentiment analysis, topic modeling, among others. In the task of text classification, we must transform raw textual data into numerical formats so it can be used by algorithms during training and testing. Various methods exist to represent text as vectors that capture its semantic meaning. A widely-used method involves representing words through real-valued vectors of fixed dimensions. The embedding layer learns patterns from input data to generate dense vector representations for each word depending on their usage context. Word embeddings capture nuanced local patterns while also reflecting broader semantic associations, making them powerful tools for understanding textual semantics.

为了构建一个文本分类器,在此过程中我们首先对输入文本进行分词操作并创建词汇表。随后我们将这些token作为神经网络的输入并结合其对应的词向量进行处理。经过多层处理后,在此过程中我们获得了该文档所属的最终预测类别标签。在进行文本分类任务时我们通常采用 recurrent neural networks (RNN) 或 long short-term memory (LSTM) 模型因为它们能够更好地处理长序列的数据相比传统的前馈网络具有显著的优势与传统的卷积神经网络相比RNN和LSTM架构具有诸多优势主要得益于它们能够有效保留输入序列中的时序依赖性

Moving forward, we will delve into the process of implementing a fundamental text classification model within the PyTorch library framework. Before proceeding, we must ensure that all required software packages are installed.

全部评论 (0)

还没有任何评论哟~