【激活函数】
1、sigmoid函数
σ(x) = y = 1/(1 + e**(-x))
σ'(x) = y * (1 -y)
2、tanh函数
tanh(x) = y = (e**x - e**(-x))/(e**x + e**(-x))
tanh'(x) = 1 - y**2
【RNN推导】
RNN求解过程推导与实现
https://www.cnblogs.com/YiXiaoZhou/p/6058890.html
1、前向传播
1)、隐层节点输入:u[t] = V * x[t] + U* h[t-1] + b
2)、隐层节点输出:h[t] = f(u[t])
3)、输出层输入:v[t] = W * h[t] + c
4)、输出层输出:o[t] = g(v[t])
5)、损失函数:L[t]= (∑(o[t] - y[t]**2)/2
6)、符号说明
x[t]:序列t的输入
u[t]:序列t的隐藏层输入
h[t]:序列t的隐藏层状态
v[t]:序列t的输出层输入
o[t]:序列t的预测输出
b、c:隐藏层、输出层的偏执
L[t]:序列t的损失函数
y[t]:序列t的真实输出
U,W,V:模型的线性关系参数
f(x)、g(x):隐藏层、输出层的激活函数
它在整个RNN网络中是共享的,这点和DNN很不相同。
也正因为共享体现了RNN的模型的"循环反馈"的思想。
2、反向传播
1)、最终损失: L= ∑L[t]
2)、v[t]、u[t]梯度
δ[y][t] = ∂L/∂v[t] = ∂L[t]/∂o[t]) * (∂o[t]/∂v[t])
= (y[t]-o[t]) * g'(v[t])
【位置t的梯度损失由当前和t+1的梯度损失共同决定】
δ[h][t] = ∂L/∂u[t] = {∂L[t]/∂v[t]) * (∂v[t]/∂h[t]))
+ ∂L[t]/∂u[t+1]) * (∂u[t+1]/∂h[t])} * (∂h[t]/∂u[t])
= (δ[y][t] * W' + δ[h][t+1] * U' )* f'(u[t])
3)、W、U、V、b、c梯度
∂L/∂W = ∑(∂L[t]/∂v[t]) * (∂c[t]/∂W) = ∑h[t]'*δ[y]
∂L/∂c = ∑(∂L[t]/∂v[t]) * (∂c[t]/∂c) = ∑δ[y]
∂L/∂U = ∑(∂L[t]/∂u[t]) * (∂u[t]/∂U) = ∑h[t-1]'*δ[h]
∂L/∂U = ∑(∂L[t]/∂u[t]) * (∂u[t]/∂V) = ∑x[t]'*δ[h]
∂L/∂b = ∑(∂L[t]/∂u[t]) * (∂u[t]/∂V) = ∑δ[h]
【LSTM推导】
[简洁版]详解 LSTM
https://www.jianshu.com/p/dcec3f07d3b5
[详细版]零基础入门深度学习(6) - 长短时记忆网络(LSTM)
https://zybuluo.com/hanbingtao/note/581764
1、前向传播
1)、决定从"细胞状态"中丢弃什么信息即"遗忘门"
net[f] = W[f] * [h[t-1], x[t]] + b[f]
f[t] = σ(net[f])
2)、决定放什么信息到"细胞状态"中
net[i] = W[i] * [h[t-1], x[t]] + b[i]
net[C'] = W[c]*[h[t-1], x[t]] + b[c]
i[t] = σ(net[i])
C'[t] = tanh(net[C'])
3)、更新"细胞状态"
C[t] = f[t] ⊙C'[t-1] + i[t] ⊙C'[t]
4)、基于"细胞状态"得到输出
net[o] = W[o] * [h[t-1], x[t]] + b[o]
o[t] = σ(net[o])
h[t] = o[t] ⊙ tanh(C[t])
5)、在RNN中当前状态值:S[t]= tanh(x[t] * U + W * S[t-1])
若其中只要有一个是接近零的那么总体值就容易为0,导致梯度消失,不能解决长时依赖问题
而LSTM更新状态值:C[t] = f[t] ⊙ C'[t-1] + i[t] ⊙ C'[t]
是相加的形式所以不容易出现状态值逐渐接近0的情况
6)、符号说明
加权输入:net
遗忘门的权重矩阵:W[f]和偏置项:b[f]
输入门的权重矩阵:W[i]和偏置项:b[i]
计算单元状态的权重矩阵:W[c]和偏置项:b[c]
输出门的权重矩阵:W[o]和偏置项:b[o]
2、反向传播
1)、加权误差项定义(参数皆来自加权项)
δ[f,t] = ∂L/∂net[f]
δ[i,t] = ∂L/∂net[i]
δ[C',t] = ∂L/∂net[C']
δ[o,t] = ∂L/∂net[o]
2)、t-1时刻的误差项(对h即传递的求导)
δ[t-1] = ∂L/∂h[t-1] = (∂L/∂h[t])*(∂h[t]/∂h[t-1]) = δ[t] * (∂h[t]/∂h[t-1])
= δ[t] * {(∂h[t]/o[t])*(∂o[t]/∂h[t-1]) + (∂h[t]/∂C[t])*(∂C[t]/∂h[t-1])}
= {δ[t] * (∂h[t]/o[t])*(∂o[t]/∂net[t])}*(∂net[t]/∂h[t-1])
+ {δ[t] * (∂h[t]/∂C[t])*{(∂C[t]/∂f[t])*(∂f[t]/∂net[f]}*(∂net[f]/∂h[t-1])
+ {δ[t] * (∂C[t]/∂i[t])*(∂i[t]/∂net[i]}*(∂net[i]/∂h[t-1])
+ {δ[t] * (∂C[t]/∂C'[t])*(∂C'[t]/∂net[C']}*(∂net[C']/∂h[t-1])}
= {δ[t] * tanh(C[t]) . o[t] . (1 - o[t] )} . W[o,h]
+ {δ[t] * o[t] . (1 - C[t]**2 ) . C'[t-1] . f[t] . (1 - f[t])} . W[f,h]
+ {δ[t] * o[t] . (1 - C[t]**2 ) . C'[t] . i[t] . (1 - i[t])} . W[i,h]
+ {δ[t] * o[t] . (1 - C[t]**2 ) . i[t] . (1 - C'[t]**2)} . W[c,h]
= δ[o,t] * W[o,h] + δ[f,t] * W[f,h] + δ[i,t] * W[i,h] + δ[C',t] * W[C',h]
= >
δ[o,t] = {δ[t] * tanh(C[t]) . o[t] . (1 - o[t] )
δ[f,t] = δ[t] * o[t] . (1 - C[t]**2 ) . C'[t-1] . f[t] . (1 - f[t])
δ[C',t] = δ[t] * o[t] . (1 - C[t]**2 ) . C'[t] . i[t] . (1 - i[t])
δ[i,t] = {δ[t] * o[t] . (1 - C[t]**2 ) . i[t] . (1 - C'[t]**2)
3)、W[f,h]、W[i,h]、W[C',h]、W[o,h]梯度
∂L/∂W[f,h] = (∂L/∂net[f])*(net[f]/∂W[f,h]) = ∑ δ[f,t]*h'[t-1]
∂L/∂W[i,h] = (∂L/∂net[i])*(net[i]/∂W[i,h]) = ∑ δ[i,t]*h'[t-1]
∂L/∂W[C',h] = (∂L/∂net[C'])*(net[C']/∂W[C',h]) = ∑ δ[C',t]*h'[t-1]
∂L/∂W[o,h] = (∂L/∂net[o])*(net[o]/∂W[o,h]) = ∑ δ[o,t]*h'[t-1]
4)、W[f,x]、W[i,x]、W[C',x]、W[o,x]梯度
∂L/∂W[f,x] = (∂L/∂net[f])*(net[f]/∂W[f,x]) = ∑ δ[f,t]*x'[t]
∂L/∂W[i,x] = (∂L/∂net[i])*(net[i]/∂W[i,x]) = ∑ δ[i,t]*x'[t]
∂L/∂W[C',x] = (∂L/∂net[C'])*(net[C']/∂W[C',x]) = ∑ δ[C',t]*x'[t]
∂L/∂W[o,x] = (∂L/∂net[o])*(net[o]/∂W[o,x]) = ∑ δ[o,t]*x'[t]
5)、b[f]、b[i]、b[C']、b[o]梯度
∂L/∂b[f] = (∂L/∂net[f])*(net[f]/∂b[f]) = ∑ δ[f,t]
∂L/∂b[i] = (∂L/∂net[i])*(net[i]/∂b[i]) = ∑ δ[i,t]
∂L/∂b[C'] = (∂L/∂net[C'])*(net[C']/∂b[C']) = ∑ δ[C',t]
∂L/∂b[o] = (∂L/∂net[o])*(net[o]/∂b[o]) = ∑ δ[o,t]
【LSTM核心理念】
https://www.jianshu.com/p/75eeaee7f67d
LSTM的关键点是细胞状态,就是穿过图中的水平线。
单元状态有点像是个传送带,贯穿整个链条,只有一些线性相互作用。
这很容易让信息以不变的方式向下流动。
LSTM有能力向单元状态中移除或添加信息,通过门结构来管理,包括"遗忘门","输出门","输入门"。