RNN数学推导
循环神经网络(RNN)是一种特殊类型的神经网络,它在输入之间保持一种状态,并使用该状态来处理序列数据。下面是RNN的数学推导。
假设我们有一个输入序列\(x = (x_1, x_2, ..., x_T)\),其中每个\(x_t\)都是一个向量,\(y\)是输出序列,\(h_t\)是RNN在处理\(x_t\)时的隐藏状态。RNN的隐藏状态\(h_t\)通过以下递归方式计算:
\[h_t = f(Ux_t + Wh_{t-1})
\]
其中,\(U\)和\(W\)是权重矩阵,\(f\)是激活函数,通常是tanh或ReLU。\(h_0\)通常被初始化为全零向量。
在计算完所有隐藏状态后,我们可以通过一个输出层来预测输出序列\(y\),该输出层可以是全连接层,也可以是softmax层,具体取决于任务的要求。例如,在情感分类任务中,我们可能只需要一个全连接层来预测情感标签。
输出层的计算方式如下:
\[y_t = g(Vh_t)
\]
其中,\(V\)是权重矩阵,\(g\)是激活函数。在分类任务中,\(g\)通常是softmax函数。
现在我们可以通过反向传播算法来训练RNN,其中损失函数\(L\)定义为预测输出\(y\)与实际输出\(\hat{y}\)之间的交叉熵:
\[L = -\sum_{t=1}^{T}\hat{y}_t\log(y_t)
\]
在反向传播过程中,我们需要计算损失函数对权重矩阵\(U\)、\(W\)和\(V\)的梯度。假设\(\delta_t\)表示损失函数对\(h_t\)的梯度,则:
\[\delta_T = \frac{\partial L}{\partial y_T} \odot g'(Vh_T)
\]
\[\delta_t = \left(\frac{\partial L}{\partial y_t} + \frac{\partial L}{\partial h_{t+1}}\frac{\partial h_{t+1}}{\partial h_t}\right) \odot f'(Ux_t + Wh_{t-1})
\]
其中,\(\odot\)表示向量点积,\(g'\)和\(f'\)分别是\(g\)和\(f\)的导数。我们可以使用这些梯度来更新权重矩阵,例如:
\[V \leftarrow V - \eta\sum_{t=1}^{T}\delta_t h_t^T
\]
\[U \leftarrow U - \eta\sum_{t=1}^{T}\delta_t x_t^T
\]
\[W \leftarrow W - \eta\sum_{t=1}^{T}\delta_t h_{t-1}^T
\]
其中,\(\eta\)是学习率。这些更新将使网络逐步调整权重,以最小化损失函数并提高预测精度。