| 第31行: |
第31行: |
| | | | |
| | == RWKV 模型结构 == | | == RWKV 模型结构 == |
| − | '''RWKV''' 是 '''RNN(循环神经网络)''' 的一个变体。在深入探讨 RWKV 之前,我们有必要先了解 RNN 的基本原理,特别是其 '''隐藏状态(Hidden State)''' 的概念。 | + | '''RWKV''' 是 '''[[循环神经网络]]''' 的一个变体。在深入探讨 RWKV 之前,我们有必要先了解 RNN 的基本原理,特别是其 '''隐藏状态(Hidden State)''' 的概念。 |
| | | | |
| | === RNN 架构与隐藏状态 === | | === RNN 架构与隐藏状态 === |
| − | '''循环神经网络(RNN, Recurrent Neural Network, RNN)''' 是一种广泛应用于序列数据(如文本、语音、时间序列等)的深度学习模型。 | + | '''[[循环神经网络]]([[RNN]], Recurrent Neural Network)''' 是一种广泛应用于序列数据(如文本、语音、时间序列等)的深度学习模型。 |
| | | | |
| − | ==== RNN 的核心机制:隐藏状态 ==== | + | ==== [[RNN]] 的核心机制:隐藏状态 ==== |
| − | RNN 在运行过程中会维护一个 '''隐藏状态(Hidden State)''',可以将其类比为 RNN 的“记忆”或“心理状态”。 | + | [[RNN]] 在运行过程中会维护一个 '''隐藏状态(Hidden State)''',可以将其类比为 [[RNN]] 的“记忆”或“心理状态”。 |
| | | | |
| − | * 就像人类在思考时,大脑会保留与当前任务最相关的“关键信息”一样,RNN 的隐藏状态存储了网络在处理序列时的上下文信息。 | + | * 就像人类在思考时,大脑会保留与当前任务最相关的“关键信息”一样,[[RNN]] 的隐藏状态存储了网络在处理序列时的上下文信息。 |
| − | * 每当 RNN 处理一个新的输入(如一个 '''token'''),它会结合 '''当前隐藏状态''' 计算输出,并更新自身的隐藏状态,以便影响后续的计算。 | + | * 每当 [[RNN]] 处理一个新的输入(如一个 '''token'''),它会结合 '''当前隐藏状态''' 计算输出,并更新自身的隐藏状态,以便影响后续的计算。 |
| − | ==== RNN 的工作流程 ==== | + | ==== [[RNN]] 的工作流程 ==== |
| | | | |
| − | # '''输入处理''':RNN 依次接收序列中的每个 token(如单词或字符)。 | + | # '''输入处理''':[[RNN]] 依次接收序列中的每个 token(如单词或字符)。 |
| − | # '''状态更新''':对于每个 token,RNN 结合 '''当前隐藏状态''' 计算输出,并生成 '''新的隐藏状态'''。 | + | # '''状态更新''':对于每个 token,[[RNN]] 结合 '''当前隐藏状态''' 计算输出,并生成 '''新的隐藏状态'''。 |
| | # '''循环反馈''':更新后的隐藏状态会被传递到下一步,用于处理下一个 token。 | | # '''循环反馈''':更新后的隐藏状态会被传递到下一步,用于处理下一个 token。 |
| − | # '''输出预测(可选)''':如果有任务需求(如语言建模),RNN 可以在每一步生成预测结果(如下一个可能的 token)。 | + | # '''输出预测(可选)''':如果有任务需求(如语言建模),[[RNN]] 可以在每一步生成预测结果(如下一个可能的 token)。 |
| | | | |
| | 这一过程不断循环,直到整个序列处理完毕或达到终止条件,如下图所示:[[文件:RNN.png|缩略图|替代=RNN结构示意图|居中|RNN结构示意图|800x800像素]] | | 这一过程不断循环,直到整个序列处理完毕或达到终止条件,如下图所示:[[文件:RNN.png|缩略图|替代=RNN结构示意图|居中|RNN结构示意图|800x800像素]] |
| 第53行: |
第53行: |
| | | | |
| | * '''LayerNorm''' | | * '''LayerNorm''' |
| − | LayerNorm 的标准定义如下:
| |
| | | | |
| − | :<math>\text{LayerNorm}(x) = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}} \cdot \gamma + \beta</math>
| |
| − |
| |
| − | 其中:
| |
| − |
| |
| − | <math>x \in \mathbb{R}^d</math>:输入向量
| |
| − |
| |
| − | <math>\mu = \frac{1}{d} \sum_{i=1}^{d} x_i</math>:均值
| |
| − |
| |
| − | <math>\sigma^2 = \frac{1}{d} \sum_{i=1}^{d} (x_i - \mu)^2</math>:方差
| |
| − |
| |
| − | <math>\epsilon</math>:小常数,防止除零
| |
| − |
| |
| − | <math>\gamma, \beta</math>:可学习的缩放和平移参数
| |
| − |
| |
| − | LayerNorm 通常作用于每个时间步的输入向量 <math>x_t</math>,即:
| |
| − |
| |
| − | :<math>\tilde{x}_t = \text{LayerNorm}(x_t)</math>
| |
| − |
| |
| − | 然后将 <math>\tilde{x}_t</math> 用于后续的 TimeMix 操作,如:
| |
| − |
| |
| − | :<math>k_t = W_k \cdot \left(\tilde{x}t \cdot (1 - w{\text{mixk}}) + \tilde{x}{t-1} \cdot w{\text{mixk}}\right)</math>
| |
| | * '''TimeMix''' | | * '''TimeMix''' |
| | TimeMix 的核心计算过程如下: | | TimeMix 的核心计算过程如下: |