请求提供含独热向量与数值运算的Simple RNN概念示例
一个清晰易懂的Simple RNN概念性示例(带独热向量与数值运算)
我完全懂你的痛点——那些只有循环框图的示例太抽象,带向量的又不说清数值来源,学起来真的懵。下面我用一个超简单的小例子,从独热输入开始,一步步拆解RNN的运算过程,所有数值都是手动明确设定的(模拟模型训练好后的参数),你能清清楚楚看到每个数的来龙去脉。
先明确核心组件(所有数值来源提前说清)
我们先把所有需要用到的元素和参数都摆出来,避免中途出现莫名其妙的数值:
- 输入:独热向量:假设我们的词汇表只有3个词:["猫", "狗", "球"],对应的独热向量分别是:
- 猫 →
[1, 0, 0] - 狗 →
[0, 1, 0] - 球 →
[0, 0, 1]
- 猫 →
- RNN参数(模拟训练后得到的固定值):
- 输入到隐藏层的权重矩阵
W_xh(2行3列,因为隐藏层设2个神经元,输入是3维独热向量):[[0.1, 0.2, 0.3], [0.4, 0.5, 0.6]] - 隐藏层到自身的权重矩阵
W_hh(2行2列,和隐藏层维度匹配):[[0.7, 0.8], [0.9, 1.0]] - 隐藏层偏置
b_h(2维):[0.1, 0.2]
- 输入到隐藏层的权重矩阵
- 激活函数:用最简单的
tanh,我们会用近似值手动计算,不用复杂公式。
用输入序列「猫 → 狗」一步步运算
假设我们的输入序列是["猫", "狗"],对应独热向量x1 = [1,0,0]、x2 = [0,1,0],我们分两个时间步计算:
时间步1:输入x1 = [1,0,0]
- 初始隐藏状态
h0通常设为全0向量:h0 = [0, 0] - 计算隐藏层预激活值
z1:z1 = (W_xh 点乘 x1) + (W_hh 点乘 h0) + b_h
分步拆解:W_xh · x1:第一行0.1*1 + 0.2*0 + 0.3*0 = 0.1;第二行0.4*1 + 0.5*0 + 0.6*0 = 0.4→ 结果是[0.1, 0.4]W_hh · h0:全0向量乘任何矩阵都是[0, 0]- 加上偏置
b_h:[0.1+0.1, 0.4+0.2] = [0.2, 0.6]
- 通过
tanh激活得到当前隐藏状态h1:tanh(0.2)≈0.197,tanh(0.6)≈0.537→h1 = [0.197, 0.537]
时间步2:输入x2 = [0,1,0]
现在用前一步的隐藏状态h1来计算当前的隐藏状态h2:
- 计算预激活值
z2:z2 = (W_xh 点乘 x2) + (W_hh 点乘 h1) + b_h
分步拆解:W_xh · x2:第一行0.1*0 + 0.2*1 + 0.3*0 = 0.2;第二行0.4*0 + 0.5*1 + 0.6*0 = 0.5→ 结果是[0.2, 0.5]W_hh · h1:第一行0.7*0.197 + 0.8*0.537 ≈ 0.1379 + 0.4296 = 0.5675;第二行0.9*0.197 + 1.0*0.537 ≈ 0.1773 + 0.537 = 0.7143→ 结果是[0.5675, 0.7143]- 加上偏置
b_h:[0.2+0.5675+0.1, 0.5+0.7143+0.2] = [0.8675, 1.4143]
- 通过
tanh激活得到当前隐藏状态h2:tanh(0.8675)≈0.699,tanh(1.4143)≈0.885→h2 = [0.699, 0.885]
为什么这个示例能帮你理解?
你看,所有数值的来源都完全透明:
- 输入是明确对应词汇的独热向量,没有歧义
- 权重矩阵和偏置是我们提前设定好的(就像模型训练后学到的参数)
- 每一步的隐藏状态都是通过「前一步状态+当前输入+固定参数」计算出来的,没有模糊的未知值
如果你想扩展到输出层,只需要再加一个「隐藏层到输出层的权重矩阵W_hy」和偏置b_y,比如设W_hy = [[0.2, 0.3], [0.4, 0.5], [0.6, 0.7]](对应3个词的输出),就能计算出每个时间步的输出向量,再通过softmax得到概率分布。
内容的提问来源于stack exchange,提问作者A D
相关产品推荐
相关产品推荐

