【ShuQiHere】从 FNN 到 RNN:用股票价格预测一步步理解神经网络的演化

【ShuQiHere】

引言

神经网络在人工智能和机器学习领域是一个核心的研究方向,而前馈神经网络(FNN)是最基础的模型之一。虽然 FNN 在许多任务中表现出色,但当面对时间序列数据时,例如预测股票价格,它往往显得力不从心。这是因为 FNN 无法有效利用历史信息来预测未来的走势。为了解决这一问题,循环神经网络(RNN)被引入。通过这个熟悉的例子——股票价格预测,我们将一步步探讨 RNN 是如何从 FNN 演化而来的,并深入解释这些模型的工作原理和应用。

一步步理解 FNN

第一步:什么是 FNN?

前馈神经网络(Feedforward Neural Network, FNN)是神经网络最基本的形式之一。顾名思义,“前馈”意味着数据在网络中是单向流动的:从输入层开始,经过若干隐藏层,最后到达输出层。在 FNN 中,每个输入数据点都独立处理,彼此之间没有关联。

想象一下,我们有一个盒子,这个盒子有多个输入口和一个输出口。你将过去三天的股票价格数据放入输入口,盒子内部进行一些计算,然后输出预测的未来价格。这个盒子就是一个典型的 FNN。

第二步:FNN 是如何工作的?

假设我们要预测股票的价格,FNN 的输入可以是过去几天的股票价格,例如 ( x_{t-2} )(两天前的价格)、( x_{t-1} )(前一天的价格)和 ( x_t )(今天的价格)。这些输入经过网络的计算后,输出一个预测值 ( y_{t+1} )(明天的价格)。数学上,这个过程可以用以下公式表示:

[
y t + 1 = f ( W ( 1 ) ⋅ [ x t − 2 , x t − 1 , x t ] + b ( 1 ) ) y_{t+1} = f(W^{(1)} \cdot [x_{t-2}, x_{t-1}, x_t] + b^{(1)}) yt+1=f(W(1)[xt2,xt1,xt]+b(1))
]

在这个公式中:

  • ( [x_{t-2}, x_{t-1}, x_t] ) 是过去三天的股票价格数据。
  • ( W^{(1)} ) 是权重矩阵,代表模型学习到的各个输入的重要性。
  • ( b^{(1)} ) 是偏置项,用于调整输出。
  • 激活函数 ( f(\cdot) ) 用来引入非线性关系,使模型能够处理更复杂的数据模式。

尽管 FNN 能够处理独立的输入数据,但它忽略了数据之间的时间关系。股票价格通常受到之前几天价格走势的影响,但 FNN 缺乏“记忆”功能,无法考虑这种时间依赖性。因此,FNN 在处理时间序列数据时表现不佳,因为它无法有效利用历史信息来改善预测。

RNN 的引入:一步步演化

第一步:引入“记忆”功能

为了克服 FNN 的局限性,我们需要一种能够“记住”过去信息的网络结构,这就是循环神经网络(Recurrent Neural Network, RNN)的核心思想。RNN 通过引入隐藏状态(( h_t )),将前一时间步的信息传递到当前时间步,使得模型能够考虑输入数据之间的时间依赖性。具体来说,RNN 通过引入一个循环结构,使得模型可以利用前一时刻的隐藏状态 ( h_{t-1} ) 来预测当前时刻的输出。

在 RNN 的结构中,隐藏状态 ( h_t ) 贯穿整个时间序列的计算。初始隐藏状态 ( h_0 ) 通常是一个全零向量或是通过某种初始化方法生成的向量,它代表了在时间序列开始时模型的初始“记忆”。之后的每个隐藏状态 ( h_t ) 都依赖于前一时间步的隐藏状态 ( h_{t-1} ) 以及当前的输入 ( x_t ),这使得 RNN 能够捕捉输入序列的时间依赖关系。

第二步:理解 RNN 的工作原理

RNN 与 FNN 的关键区别在于它引入了一个循环结构:当前的输出不仅依赖于当前的输入,还依赖于前一时间步的隐藏状态。这使得 RNN 能够基于之前的历史信息来做出预测。具体来说,RNN 在每个时间步的计算如下:

  1. 初始化隐藏状态 ( h_0 )

    在时间序列的开始,RNN 使用初始隐藏状态 ( h_0 ),它可以是一个全零向量或其他初始化方法生成的向量。这个隐藏状态在后续的计算中将逐步更新。

  2. 当前时间步的隐藏状态 ( h_t ) 的计算

    RNN 在每个时间步 ( t ) 使用当前输入 ( x_t ) 和前一时间步的隐藏状态 ( h_{t-1} ) 来计算当前的隐藏状态 ( h_t ):

    [
    h t = f ( W h ⋅ x t + U h ⋅ h t − 1 + b h ) h_t = f(W_h \cdot x_t + U_h \cdot h_{t-1} + b_h) ht=f(Whxt+Uhht1+bh)
    ]

    在这个公式中:

    • ( W_h ) 是当前输入 ( x_t ) 的权重矩阵。
    • ( U_h ) 是前一隐藏状态 ( h_{t-1} ) 的权重矩阵。
    • ( b_h ) 是偏置项。
    • 激活函数 ( f(\cdot) ) 通常使用 ( \text{tanh} ) 或 ( \text{ReLU} )。

    这个隐藏状态 ( h_t ) 是当前时间步 ( t ) 上的“记忆”,它包含了当前输入信息和前一时间步的隐藏状态信息。通过这个结构,RNN 能够“记住”过去的信息,并在未来的计算中使用它。

  3. 下一时间步的预测 ( y_{t+1} )

    在每个时间步 ( t ),RNN 使用当前的隐藏状态 ( h_t ) 来预测下一个目标值 ( y_{t+1} ):

    [
    y t + 1 = g ( W y ⋅ h t + b y ) y_{t+1} = g(W_y \cdot h_t + b_y) yt+1=g(Wyht+by)
    ]

    在这个公式中:

    • ( W_y ) 是将隐藏状态 ( h_t ) 映射到输出空间的权重矩阵。
    • ( b_y ) 是输出的偏置项。
    • 激活函数 ( g(\cdot) ) 通常是线性激活函数或 Softmax 函数(取决于具体任务)。

通过这些公式可以看出,RNN 在每个时间步上的输出不仅依赖于当前的输入 ( x_t ),更依赖于前一时间步的隐藏状态 ( h_{t-1} )。这使得 RNN 能够在时间序列数据中有效捕捉到信息的时间依赖性,从而在预测未来值时具备更强的能力。

第三步:逐步构建 RNN

为了更好地理解 RNN,我们可以将它的构建分为几个步骤:

  1. 从 FNN 到时间序列: 在这个阶段,我们仍然用 FNN 处理独立的输入数据,这意味着模型在每个时间步的预测是独立的,无法捕捉时间依赖性。

  2. 引入循环结构: 在每个时间步上添加一个循环连接,使得前一时间步的隐藏状态 ( h_{t-1} ) 可以影响当前时间步的计算。这一步引入了“记忆”功能,使得 RNN 能够记住之前的信息。

  3. 更新隐藏状态: 每个时间步的隐藏状态不仅取决于当前输入,还取决于前一时间步的隐藏状态。通过不断更新隐藏状态,RNN 可以捕捉到输入数据之间的时间依赖性,使得模型能够在后续的时间步上进行更加精准的预测。

第四步:RNN 的实际应用

通过这些步骤,RNN 实际上解决了 FNN 在处理时间序列数据时的主要问题。例如,在股票价格预测中,RNN 能够根据过去几天的价格走势,综合考虑这些信息,更加准确地预测未来的价格。

数学公式解析

为了更好地理解这些模型,我们可以通过一个具体的计算例子来看看这些公式是如何在股票价格预测中工作的。

  1. FNN 的公式:

    [
    y t + 1 = f ( W ( 1 ) ⋅ [ x t − 2 , x t − 1 , x t ] + b ( 1 ) ) y_{t+1} = f(W^{(1)} \cdot [x_{t-2}, x_{t-1}, x_t] + b^{(1)}) yt+1=f(W(1)[xt2,xt1,xt]+b(1))
    ]

    假设输入数据 ( x_{t-2}, x_{t-1}, x_t ) 分别是 $50, $55, 和 $53,那么通过权重矩阵 ( W^{(1)} ) 和偏置 ( b^{(1)} ) 的线性组合,FNN 会输出一个预测值。假设这个预测值是 $52,这意味着 FNN 认为未来价格会略有下跌。

  2. RNN 的公式:

    • 初始隐藏状态 ( h_0 ):

      [
      h 0 = 0 h_0 = 0 h0=0
      ]

    • 当前隐藏状态 ( h_t ):

      [
      h t = f ( W h ⋅ x t + U h ⋅ h t − 1 + b h ) h_t = f(W_h \cdot x_t + U_h \cdot h_{t-1} + b_h) ht=f(Whxt+Uhht1+bh)
      ]

    • 下一天的预测价格 ( y_{t+1} ):

      [
      y t + 1 = g ( W y ⋅ h t + b y ) y_{t+1} = g(W_y \cdot h_t + b_y) yt+1=g(Wyht+by)
      ]

    在 RNN 中,当前的隐藏状态 ( h_t ) 不仅取决于今天的价格 ( x_t ),还取决于昨天的隐藏状态 ( h_{t-1} )。假设昨天股价大幅波动,隐藏状态 ( h_{t-1} ) 会“记住”这一信息,并传递给 ( h_t )。因此,RNN 能够比 FNN 更加准确地预测未来价格。

RNN 的优势和局限

RNN 的优势:

  • 捕捉时间依赖性:RNN 能够在序列数据中捕捉到时间步之间的依赖性,这是 FNN 无法做到的。它的“记忆”功能使得模型在处理像股票价格这样的时间序列数据时更加得心应手。

  • 序列数据处理能力:由于 RNN 能够利用前一时刻的隐藏状态,它特别适合处理像语音识别、语言建模、时间序列预测等任务。

RNN 的局限性:

  • 梯度消失与爆炸问题:在训练 RNN 时,随着时间步数的增加,梯度反向传播可能会变得非常小(梯度消失)或者非常大(梯度爆炸),这使得网络的训练变得困难。这也是为什么我们需要更复杂的模型,如 LSTM(长短期记忆网络)和 GRU(门控循环单元)来应对这些问题。

  • 长期依赖问题:尽管 RNN 能够处理时间序列数据,但它在捕捉较远时间步之间的依赖关系时表现并不理想。这意味着如果我们想预测较远未来的价格,RNN 的性能可能不如预期。

总结

通过逐步构建和理解 RNN,我们可以清楚地看到它是如何从 FNN 演化而来的。RNN 通过引入循环结构和隐藏状态,赋予了网络“记忆”功能,从而能够更好地处理时间序列数据。然而,随着模型的复杂性增加,RNN 也面临了一些挑战,如梯度消失和长期依赖问题。这一演化展示了神经网络在处理复杂任务时的潜力与局限,为后续的模型改进(如 LSTM 和 GRU)奠定了基础。

你可能感兴趣的:(神经网络,rnn,人工智能)