RNN代码和原理
时间: 2023-07-03 19:14:05 浏览: 112
以下是简单的RNN代码示例,以及相关原理的解释:
```python
import numpy as np
# 定义RNN的参数
input_size = 4 # 输入维度
hidden_size = 3 # 隐藏层维度
output_size = 2 # 输出维度
# 定义RNN的权重矩阵
Wxh = np.random.randn(hidden_size, input_size) # 输入层到隐藏层的权重
Whh = np.random.randn(hidden_size, hidden_size) # 隐藏层到隐藏层的权重
Why = np.random.randn(output_size, hidden_size) # 隐藏层到输出层的权重
bh = np.zeros((hidden_size, 1)) # 隐藏层偏置
by = np.zeros((output_size, 1)) # 输出层偏置
# 定义RNN的前向传播函数
def rnn_forward(inputs, hprev):
# 存储中间结果
xs, hs, ys, ps = {}, {}, {}, {}
# 初始化第一个隐藏状态
hs[-1] = np.copy(hprev)
# 循环遍历序列
for t in range(len(inputs)):
# 将当前时刻的输入转换成列向量
xs[t] = np.zeros((input_size, 1))
xs[t][inputs[t]] = 1
# 计算隐藏状态
hs[t] = np.tanh(np.dot(Wxh, xs[t]) + np.dot(Whh, hs[t-1]) + bh)
# 计算输出
ys[t] = np.dot(Why, hs[t]) + by
# 计算概率分布
ps[t] = np.exp(ys[t]) / np.sum(np.exp(ys[t]))
# 返回中间结果
return xs, hs, ys, ps
# 示例输入序列
inputs = [1, 2, 0, 1, 3]
# 初始化第一个隐藏状态
hprev = np.zeros((hidden_size, 1))
# 进行前向传播
xs, hs, ys, ps = rnn_forward(inputs, hprev)
# 输出结果
print("输入序列:", inputs)
print("隐藏状态:", hs)
print("输出结果:", ys)
print("概率分布:", ps)
```
以上代码实现了一个简单的RNN,其输入维度为4,隐藏层维度为3,输出维度为2。其中,`Wxh`表示输入层到隐藏层的权重矩阵,`Whh`表示隐藏层到隐藏层的权重矩阵,`Why`表示隐藏层到输出层的权重矩阵,`bh`表示隐藏层偏置,`by`表示输出层偏置。
在前向传播函数`rnn_forward`中,我们循环遍历输入序列,将每个时刻的输入向量转换成列向量`xs[t]`,然后计算当前时刻的隐藏状态`hs[t]`,输出结果`ys[t]`和概率分布`ps[t]`。计算隐藏状态的公式为:
$$h_t = tanh(W_{xh} x_t + W_{hh} h_{t-1} + b_h)$$
其中,$x_t$表示当前时刻的输入向量,$h_{t-1}$表示上一时刻的隐藏状态,$W_{xh}$和$W_{hh}$分别表示输入层到隐藏层的权重矩阵和隐藏层到隐藏层的权重矩阵,$b_h$表示隐藏层偏置。
计算输出结果的公式为:
$$y_t = W_{hy} h_t + b_y$$
其中,$W_{hy}$表示隐藏层到输出层的权重矩阵,$b_y$表示输出层偏置。
计算概率分布的公式为:
$$p_t = softmax(y_t)$$
其中,$softmax$函数用于将输出结果转换成概率分布。
以上就是一个简单的RNN的原理和代码实现。在实际应用中,可以根据具体情况进行调整和优化,例如使用LSTM或GRU等变种结构。
阅读全文