1、LSTM基本结构
h t = f ( W x x t + W h h t − 1 ) h_t = f(W_xx_t+W_hh_{t-1}) ht=f(Wxxt+Whht−1)
,f可以是tanh函数,也可以是sigmoid函数,这个公式是LSTM中最基本的结果,如果没有 W h h t − 1 W_hh_{t-1} Whht−1,就是一层MLP,RNN把历史状态添加到当前输入中,作为当前的状态。
问题:这个结构也是最经典的Simple RNN结构,你会发现h隐藏数据是一个级联结构,反向传播中的多层梯度相乘,必然会导致隐层层h的梯度消失,例如100个0.9相乘等于0.000026。
2、LSTM的公式
直接上1997年原始LSTM的公式
输入门:
i t = σ ( W i x t + b i + U i h t − 1 ) i_t = \sigma(W_ix_t + b_i + U_ih_{t-1}) it=σ(Wixt+bi+Uiht−1)
其中 x t x_t xt是当前输入,
h t − 1 上一时刻隐藏状态 h_{t-1}上一时刻隐藏状态 ht−1上一时刻隐藏状态,
输出 i t ∈ ( 0 , 1 ) i_t \in (0,1) it∈(0,1)
候选内容:
g t = t a n h ( W c x t + b c + U c h t − 1 ) g_t = tanh(W_cx_t + b_c + U_ch_{t-1}) gt=tanh(Wcxt+bc+Ucht−1)
输出 g t ∈ ( − 1 , 1 ) g_t \in (-1,1) gt∈(−1,1)
CEC的核心思想 :
C t = C t − 1 + i t ⋅ g t C_t = C_{t-1} +i_t \cdot g_t Ct=Ct−1+it⋅gt
∂ C t ∂ C t − 1 = 1 \frac{\partial C_t}{\partial C_{t-1}} = 1 ∂Ct−1∂Ct=1
这个公式表示 C t C_t Ct对 C t − 1 C_{t-1} Ct−1的偏导数为1,这是LSTM中Constant Error Carousel(CEC)的核心思想:细胞状态C的梯度可以稳定地向前传播,避免了梯度消失问题。
输出门:
o t = σ ( W o x t + b o + U o h t − 1 ) o_t = \sigma(W_ox_t +b_o +U_oh_{t-1}) ot=σ(Woxt+bo+Uoht−1)
输出:
h t = o t ⋅ t a n h ( C t ) h_t = o_t \cdot tanh(C_t) ht=ot⋅tanh(Ct)
3、LSTM本质思想CEC
Constant Error Carouse CEC
∂ C t ∂ C t − 1 = 1 \frac{\partial C_t}{\partial C_{t-1}} = 1 ∂Ct−1∂Ct=1
LSTM只是保证了Cell State 上的梯度不会消失,也就是记忆状态的长期保存问题,而不是让所有参数的梯度都变成1。
Gate 只是让这个CEC变得可控
4、我的思考
4.1 h t = f ( W x x t + W h h t − 1 ) h_t = f(W_xx_t+W_hh_{t-1}) ht=f(Wxxt+Whht−1)
这个公式的理解,这个公式中,我看到了两个最基本的操作:1、矩阵相乘,原始数据不管是输入x,还是隐藏层信息(历史信息)都要经过一层MLP也就是矩阵相乘;2、矩阵相加,将处理过的原始信息进行相加融合。
这是神经网络中的基本操作,例如MLP CNN RNN LSTM等,最后都会退化成两种基本操作:1、线性变换(矩阵乘法);2、信息融合(加法)。
这个公式更像是神经网络思想的一个缩影,第一层理解,矩阵乘法 W x x t W_xx_t Wxxt=特征提取 ,很多人会认为矩阵乘法=计算,更深一步的理解,矩阵乘法的本质是将原始坐标系投影到新的坐标系中,也就是换一种观察数据的方式。
h t − 1 h_{t-1} ht−1是过去信息的压缩,矩阵相乘后,从历史压缩信息中,提取特征。
在这里,信息流的融合采用的是加法,而不是乘法,或者其他方式,多个信息,每个信息都按照各自的贡献率对最后的结果进行贡献,因此加法最合适。transformer的本质就是加权和。
理解这个公式的,会发现,LSTM RNN Transformer都是基本操作的不同组合。
4.2 如何理解基本操作后,需要经过sigmod 和 tanh 两种激活函数
如果没有sigmod 层,也就是,当前信息和过去状态融合后的当前状态,全部要写入记忆中,有了sigmod 作为门后,会对当前状态进行一个过滤,这个操作非常符合人对信息的过滤和融合
4.3 为什么神经网络里,任何输入进来第一件事就是乘一个矩阵?
h t = f ( W x x t + W h h t − 1 ) h_t = f(W_xx_t+W_hh_{t-1}) ht=f(Wxxt+Whht−1),其实可以注意到,凡是只要是输入向量,例如x,就要进行一个矩阵相乘W_x,因为我们的输入大部分是原始符号,例如x=红灯,速度,减速,。。。等,输入x中的每个维度都是原始符号,PDD的思想告诉我们,原始符号不是最终的节点,原始符号所呈现的状态,是很多神经元共同作用的结果,但一个原始符号,不能够展开表达这种关系,所以必须进行一个矩阵相乘,将原始符号投影到其他维度空间中进行表示。