RNN
RNN有很多种。
从输入输出的角度有:
- one to one
-
one to n
-
n to n
-
n to one
- n to m
RNN经典算法
RNN最经典的版本是,N个输入,对N的输出。
中间的是隐藏层。
有 h 1 = f ( U x 1 + W h 0 + b ) h1 = f(Ux1 + Wh0 + b) h1=f(Ux1+Wh0+b)
- 同一次迭代,需要记住的是,h0,h1,h2…这些迭代的时候用的U,W,b都是一样的。
对于输出部分:
y 1 = S o f t m a x ( V h 1 + c ) y1 = Softmax(Vh1 + c) y1=Softmax(Vh1+c)
- 类似的,输出用的V还有c对于y1,y2…来说都是一样的。
序列等长, 这就是经典的RNN模型
- 对于序列数据,RNN提出了一个隐藏数据H。H为提取出来的特征向量。
- 对于每个序列节点x,都有一个对应的隐藏数据H。
- 每个H都是有X和前一个节点的H生成的。
h i = f ( U x i + W h i − 1 + b ) h_i = f(Ux_i+Wh_{i-1}+b) hi=f(Uxi+Whi−1+b)
- U, W, b 为共享的参数
- f 为激活函数,一般为tanh
目前还没有输出,输出是直接通过H来计算出来的。
y i = S o f t m a x ( V h i + c ) y_i = Softmax(Vh_{i}+c) yi=Softmax(Vhi+c)
N to M
N to M需要被单独拿出来讲。这个就是Encoder-Decoder模型。
-
这个只是一个框架,中间的生成步骤,其实把RNN换成LSTM也是可以的。
-
局限性:
- 编码和解码的唯一联系就是固定的语义向量c。
- 压缩过程必然带来的信息损失
- RNN本身机制导致,先输入的信息被后输入的信息给稀释掉。
Attention机制
- Encoder的过程输入的c有多个,分别作为decoder过程中的输入。
- 同时对不同的c,不同的隐藏层的映射权重不一致。
A这个矩阵的生成:
RNN 改进版 LSTM
LSTM(long short term memory, 长短期记忆网络)
- 经典的RNN,由于是复合函数带进去求导,导致反向传播求梯度时,会将所有的梯度连乘起来,引起梯度爆炸或者是梯度消失。
- LSTM由于添加了常量C(15年之前都是C对于每个cell都是hi一个常数)
- 在15年之后,认为它不是一个常数而是可以往后求导的。
除了经典RNN中的隐藏状态H之外,LSTM还提出了新的隐藏状态C。
每次输入的有两个隐藏状态,同时也有两个隐藏状态输出
- 遗忘门
f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t = \sigma(W_f·[h_{t-1}, x_t] + b_f) ft=σ(Wf⋅[ht−1,xt]+bf)
- 记忆门
i t = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) i_t = \sigma(W_i·[h_{t-1}, x_t] + b_i) it=σ(Wi⋅[ht−1,xt]+bi)
C ~ t = t a n h ( W C ⋅ [ h t − 1 , x t ] + b C ) \widetilde C_t = tanh(W_C·[h_{t-1}, x_t] + b_C) C t=tanh(WC⋅[ht−1,xt]+bC)
- 用于远程传播的C的更新
C t = f t ∗ C t − 1 + C ~ t ∗ i t C_t =f_t * C_{t-1} + \widetilde C_t * i_t Ct=ft∗Ct−1+C t∗it
- 输出门(用于输出H,而H控制输出)
o t = σ ( W o ⋅ [ h t − 1 , x t ] + b o ) o_t = \sigma(W_o·[h_{t-1}, x_t] + b_o) ot=σ(Wo⋅[ht−1,xt]+bo)
h t = o t ∗ t a n h ( C t ) h_t = o_t * tanh(C_t) ht=ot∗tanh(Ct)
参考文献
- https://www.jiqizhixin.com/articles/2018-12-14-4
- https://easyai.tech/ai-definition/rnn/