GRU
原理说白了就是,控制,什么时候当前信息比较重要而历史信息不重要,什么时候当前信息不重要历史信息不重要,LSTM GRU都是这么一个套路,没什么好说的
门
GRU中有两个门,重置门和更新门。说是门,那是比较硬的说法, 本质上他们是一个(0-1)的向量,十用的是sigmod函数,是比较软的
其实说来说去还是对隐藏状态动手脚
这四个公式写出来就完事了具体怎么写
def gru(inputs, state, params):
W_xz, W_hz, b_z, W_xr, W_hr, b_r, W_xh, W_hh, b_h, W_hq, b_q = params
H, = state
outputs = []
for X in inputs:
Z = torch.sigmoid((X @ W_xz) + (H @ W_hz) + b_z) # 更新门
R = torch.sigmoid((X @ W_xr) + (H @ W_hr) + b_r) # 重置门
H_tilda = torch.tanh((X @ W_xh) + ((R * H) @ W_hh) + b_h) #候选隐藏状态
H = Z * H + (1 - Z) * H_tilda
Y = H @ W_hq + b_q
outputs.append(Y)
return torch.cat(outputs, dim=0), (H,)
从0开始实现,就是上面公式的重写而已,只不过手写的RNN我们把输出层也给加上去了
LSTM原理差不多,只不过门不同而已,实际上效果也是一样的