手搓GPT系列之 - 通过理解LSTM的反向传播过程,理解LSTM解决梯度消失的原理 - 逐条解释LSTM创始论文全部推导公式,配超多图帮助理解(中篇)

news2025/1/14 22:57:46

近期因俗事缠身,《通过理解LSTM的反向传播过程,理解LSTM解决梯度消失的原理 - 逐条解释LSTM创始论文全部推导公式,配超多图帮助理解》的中下篇鸽了实在太久有些不好意思了。为了避免烂尾,还是抽时间补上(上篇在此)。本文承接上篇,继续就Sepp Hochreiter 1997年的开山大作 Long Short-term Memory 中APPENDIX A.1和A.2所载的数学推导过程进行详细解读。希望可以帮助大家理解了这个推导过程,进而能顺利理解为什么那几个门的设置可以解决RNN里的梯度消失和梯度爆炸的问题。一家之言,若有任何错漏欢迎大家评论区指正。好了,Dig in!

上篇文章最后讲到了LSTM中记忆单元的激活状态关于各权重值的求偏导公式(公式15)。这里我们将从公式16开始。

5. 后向传播过程

前面介绍了那么多截断求导,后向传播过程将应用这些经过截断处理的求导公式来计算每个权重的误差值。

5.1 总误差

总误差是指输出单元在第 t t t时刻的输出值与目标值之间的方差。我们设 t t t时刻目标值为 t k ( t ) t^k(t) tk(t)。则有:
E ( t ) = ∑ k :   k   o u t p u t   u n i t ( t k ( t ) − y k ( t ) ) 2 , (16) E(t) = \sum_{k:\ k\ output\ unit} (t^k(t) - y^k(t))^2 \tag{16}, E(t)=k: k output unit(tk(t)yk(t))2,(16)
其中 y k ( t ) y^k(t) yk(t)是输出单元在 t t t时刻的激活值(参考公式6)。
t t t时刻,各权重值的梯度(记为 Δ w l m ( t ) \Delta w_{lm}(t) Δwlm(t))计算公式为:
Δ w l m ( t ) = − α ∂ E ( t ) ∂ w l m . (17) \Delta w_{lm}(t) = - \alpha \frac{\partial E(t)}{\partial w_{lm}} \tag{17}. Δwlm(t)=αwlmE(t).(17)
其中 l ∈ { k , c j , i n j , o u t j , i } l \in \{ k, c_{j},in_{j},out_{j}, i\} l{k,cj,inj,outj,i},分别代表输出单元 k k k,记忆单元 c j c_{j} cj,输入门 i n j in_{j} inj,输出门 o u t j out_{j} outj及隐藏单元 i i i α \alpha α为学习率(learning rate),用于控制学习步进,如果学习步进过大,在遇到悬崖时很可能会一下把权重更新太多,跳跃到很远的地方(over shoot),如果学习率太小,影响训练速度。
我们把不同单元和门在 t t t时刻的误差公式定义为:
e l ( t ) : = − ∂ E ( t ) ∂ n e t l ( t ) . (18) e_l(t) := - \frac{\partial E(t)}{\partial net_l(t)}\tag{18}. el(t):=netl(t)E(t).(18)

5.2 输出单元误差计算

l = k l=k l=k,我们通过式18可以得到输出单元在 t t t时刻的误差:
e k ( t ) = − ∂ E ( t ) ∂ n e t k ( t ) = − ∂ E ( t ) ∂ y k ∗ ∂ y k ∂ n e t k ( t ) = − f ′ ( n e t k ( t ) ) ∗ 2 ( t k ( t ) − y k ( t ) ) ∗ ( − 1 ) = 2 f ′ ( n e t k ( t ) ) ( t k ( t ) − y k ( t ) ) \begin{aligned} e_k(t) &= - \frac{\partial E(t)}{\partial net_k(t)}\\ &= - \frac{\partial E(t)}{\partial y^k} * \frac{\partial y^k}{\partial net_k(t)}\\ &= - f'(net_k(t))*2(t^k(t) - y^k(t))*(-1 )\\ &= 2f'(net_k(t))(t^k(t) - y^k(t)) \end{aligned} ek(t)=netk(t)E(t)=ykE(t)netk(t)yk=f(netk(t))2(tk(t)yk(t))(1)=2f(netk(t))(tk(t)yk(t))
我们把上边这个式子前面前边的常数 2 2 2 α \alpha α吸收掉,就可以得到式19:
e k ( t ) = f ′ ( n e t k ( t ) ) ( t k ( t ) − y k ( t ) ) (19) e_k(t) = f'(net_k(t))(t^k(t) - y^k(t))\tag{19} ek(t)=f(netk(t))(tk(t)yk(t))(19)

下图为输出单元的梯度传播示意图:
在这里插入图片描述

5.3 隐藏单元误差计算

l = i l=i l=i,我们可以得到隐藏单元在 t t t时刻的误差:
e i ( t ) = − ∂ E ( t ) ∂ n e t i ( t ) = f i ′ ( n e t i ( t ) ) ∑ k :   k   o u t p u t   u n i t w k i e k ( t ) (20) \begin{aligned} e_i(t) &= - \frac{\partial E(t)}{\partial net_i(t)}\\ &= f_i'(net_i(t))\sum_{k:\ k\ output\ unit}w_{ki}e_k(t)\tag{20}\\ \end{aligned} ei(t)=neti(t)E(t)=fi(neti(t))k: k output unitwkiek(t)(20)

下图显示了隐藏单元的梯度传播路线:
在这里插入图片描述

式20的第一个因子很好理解,就是隐藏单元的激活函数的求导。第二个因子会有点难以理解。
∑ k :   k   o u t p u t   u n i t w k i e k ( t ) = ∂ E ( t ) ∂ y i \sum_{k:\ k\ output\ unit}w_{ki}e_k(t) = \frac{\partial E(t)}{\partial y^i} k: k output unitwkiek(t)=yiE(t)
我们只需要画个神经网络的图就很好理解了:
在这里插入图片描述
根据后向传播的规则,对于一个数据节点,如果同时作为多个操作节点的输入,那么其梯度值为所有上游梯度值之和。

5.4 输出门误差计算

l = o u t j l=out_j l=outj,可得:
e o u t j ( t ) = − ∂ E ( t ) ∂ n e t o u t j ( t ) = f o u t j ′ ( n e t o u t j ( t ) ) ( ∑ v = 1 s j h ( s c j v ) ∑ k :   k   o u t p u t   u n i t w k c j v e k ( t ) ) . (21) \begin{aligned} e_{out_j}(t) &= - \frac{\partial E(t)}{\partial net_{out_j}(t)}\\ &= f_{out_j}'(net_{out_j}(t))(\sum_{v=1}^{s_j} h(s_{c_j^v})\sum_{k:\ k\ output\ unit}w_{kc_j^v}e_k(t))\tag{21}.\\ \end{aligned} eoutj(t)=netoutj(t)E(t)=foutj(netoutj(t))(v=1sjh(scjv)k: k output unitwkcjvek(t)).(21)
上边这个式子是针对有多个记忆块(memory block),每个记忆块 b l o c k v block_v blockv都与其前边的所有记忆块 b l o c k x , x < v block_x,x<v blockx,x<v相连的情况,我们为了便于理解做一个简化,只有一个包含了多个记忆单元的记忆块,因此上式可以写成:
e o u t j ( t ) = − ∂ E ( t ) ∂ n e t o u t j ( t ) = f o u t j ′ ( n e t o u t j ( t ) ) h ( s c j ( t ) ) ∑ k :   k   o u t p u t   u n i t w k c j e k ( t ) . \begin{aligned} e_{out_j}(t) &= - \frac{\partial E(t)}{\partial net_{out_j}(t)}\\ &= f_{out_j}'(net_{out_j}(t))h(s_{c_j}(t))\sum_{k:\ k\ output\ unit}w_{kc_j}e_k(t).\\ \end{aligned} eoutj(t)=netoutj(t)E(t)=foutj(netoutj(t))h(scj(t))k: k output unitwkcjek(t).
这个公式有三个因子:

  1. f o u t j ′ ( n e t o u t j ( t ) ) f_{out_j}'(net_{out_j}(t)) foutj(netoutj(t)):这是输出门的激活函数的求导,
  2. h ( s c j ( t ) ) h(s_{c_j}(t)) h(scj(t)):根据向量相乘的求导公式, ∂ y c j ∂ y o u t j = h ( s c j ( t ) ) \frac{\partial y^{c_j}}{\partial y^{out_j}} = h(s_{c_j}(t)) youtjycj=h(scj(t))
  3. ∑ k :   k   o u t p u t   u n i t w k c j e k ( t ) \sum_{k:\ k\ output\ unit}w_{kc_j}e_k(t) k: k output unitwkcjek(t):可参考式20的解释。

我们同样可以通过梯度传播图来理解这个公式:
在这里插入图片描述

对于任何单元或门 l l l,在时间点 t t t,对权重 w l m w_{lm} wlm的贡献值为:
Δ w l m ( t ) = α e l ( t ) y m ( t − 1 ) . (22) \Delta w_{lm}(t) = \alpha e_l(t)y^m(t-1).\tag{22} Δwlm(t)=αel(t)ym(t1).(22)
式22的推导过程为:
Δ w l m ( t ) = − α ∂ E ( t ) ∂ w l m ( 式 17 ) = α ( − ∂ E ( t ) ∂ n e t l ( t ) ) ∂ n e t l ( t ) ∂ w l m ( 应用链式规则求导 ) = α e l ( t ) ∂ n e t l ( t ) ∂ w l m ( 代入式 18 ) = α e l ( t ) y m ( t − 1 ) \begin{aligned} \Delta w_{lm}(t) &= - \alpha \frac{\partial E(t)}{\partial w_{lm}}&(式17)\\ & = \alpha(- \frac{\partial E(t)}{\partial net_l(t)}) \frac{\partial net_l(t)}{\partial w_{lm}}&(应用链式规则求导)\\ & = \alpha e_{l}(t) \frac{\partial net_l(t)}{\partial w_{lm}} &(代入式18)\\ &= \alpha e_l(t)y^m(t-1) \end{aligned} Δwlm(t)=αwlmE(t)=α(netl(t)E(t))wlmnetl(t)=αel(t)wlmnetl(t)=αel(t)ym(t1)(17)(应用链式规则求导)(代入式18)

我们可以把前文中得到的 e i ( t ) , e o u t j ( t ) , e k ( t ) e_i(t),e_{out_j}(t), e_k(t) ei(t),eoutj(t),ek(t)代入上式得到相应的 Δ w l m \Delta w_{lm} Δwlm值。

5.5 输入门的误差计算

由于输入门藏得比较深,因此需要先计算一个中间节点 s c j s_{c_j} scj的误差。
e s c j ( t ) = − ∂ E ( t ) ∂ s c j ( t ) = f o u t j ( n e t o u t j ( t ) ) h ′ ( s c j ( t ) ) ( ∑ k :   k   o u t p u t   u n i t w k c j e k ( t ) ) (23) \begin{aligned} e_{s_{c_j}}(t) &= - \frac{\partial E(t)}{\partial s_{c_{j}}(t)}\\ &= f_{out_j}(net_{out_j}(t))h'(s_{c_{j}}(t)) (\sum_{k:\ k\ output\ unit}w_{kc_j}e_k(t)) \tag{23} \end{aligned} escj(t)=scj(t)E(t)=foutj(netoutj(t))h(scj(t))(k: k output unitwkcjek(t))(23)

这个式子有三个因子:

  1. f o u t j ( n e t o u t j ( t ) ) f_{out_j}(net_{out_j}(t)) foutj(netoutj(t)) ∂ y c j ( t ) ∂ h ( s c j ( t ) ) = f o u t j ( n e t o u t j ( t ) ) \frac{\partial y^{c_j}(t)}{\partial h(s_{c_{j}}(t))} = f_{out_j}(net_{out_j}(t)) h(scj(t))ycj(t)=foutj(netoutj(t))
  2. h ′ ( s c j ( t ) ) h'(s_{c_{j}}(t)) h(scj(t)) s c j ( t ) s_{c_j}(t) scj(t)后的激活函数 h h h的求导。
  3. ∑ k :   k   o u t p u t   u n i t w k c j e k ( t ) \sum_{k:\ k\ output\ unit}w_{kc_j}e_k(t) k: k output unitwkcjek(t):同公式21的解释。

我们令 l = i n j l=in_j l=inj 或者 l = c j v l=c_j^v l=cjv,计算:
− ∂ E ( t ) ∂ w l m = ∑ v = 1 s j e s c j v ( t ) ∂ s c j v ( t ) ∂ w l m . (24) -\frac{\partial E(t)}{\partial w_{lm}} = \sum_{v=1}^{s_j}e_{s_{c_j}^v}(t) \frac{\partial s_{c_j}^v(t)}{\partial w_{lm}}\tag{24}. wlmE(t)=v=1sjescjv(t)wlmscjv(t).(24)
同样,式24采用了多记忆块模型,我们为了便于理解先简化为单记忆块模型,上式可以简化为:
− ∂ E ( t ) ∂ w l m = e s c j ( t ) ∂ s c j ( t ) ∂ w l m . -\frac{\partial E(t)}{\partial w_{lm}} = e_{s_{c_j}}(t) \frac{\partial s_{c_j}(t)}{\partial w_{lm}}. wlmE(t)=escj(t)wlmscj(t).
l = i n j l=in_j l=inj,我们进一步计算上式的第二个因子 ∂ s c j ( t ) ∂ w l m \frac{\partial s_{c_j}(t)}{\partial w_{lm}} wlmscj(t)
我们代入 s c j s_{c_j} scj的计算公式:
s c j ( t ) = s c j ( t − 1 ) + g ( n e t c j ( t ) ) f i n j ( n e t i n j ( t ) ) s_{c_j}(t) = s_{c_j}(t-1) + g(net_{c_j}(t)) f_{in_j}(net_{in_j}(t)) scj(t)=scj(t1)+g(netcj(t))finj(netinj(t))
可得:
∂ s c j ( t ) ∂ w i n j m = ∂ s c j ( t − 1 ) ∂ w i n j m + g ( n e t c j ( t ) ) f i n j ′ ( n e t i n j ( t ) ) y m ( t − 1 ) (25) \frac{\partial s_{c_j}(t)}{\partial w_{in_j m}} = \frac{\partial s_{c_j}(t-1)}{\partial w_{in_j m}}+ g(net_{c_j}(t))f_{in_j}'(net_{in_j}(t))y^m(t-1)\tag{25} winjmscj(t)=winjmscj(t1)+g(netcj(t))finj(netinj(t))ym(t1)(25)
题目都做到这里了,估计大家都可以理解上边这个式子怎么得到的吧。

到此我们可得在时间 t t t w i n j m w_{in_j m} winjm的误差更新值为:
Δ w i n j m ( t ) = α ∑ v = 1 s j e s c j ( t ) ∂ s c j ( t ) ∂ w i n j m . (26) \Delta w_{in_j m}(t) = \alpha \sum_{v=1}^{s_j} e_{s_{c_j}}(t) \frac{\partial s_{c_j}(t)}{\partial w_{in_j m}}\tag{26}. Δwinjm(t)=αv=1sjescj(t)winjmscj(t).(26)
下图显示了输入门的误差传播路径:
在这里插入图片描述

5.5 记忆单元的误差计算

l = c j l=c_j l=cj,为了计算记忆单元的误差公式,我们先计算 ∂ s c j ( t ) ∂ w c j m \frac{\partial s_{c_j}(t)}{\partial w_{c_j} m} wcjmscj(t)
代入 s c j s_{c_j} scj的计算公式:
s c j ( t ) = s c j ( t − 1 ) + g ( n e t c j ( t ) ) f i n j ( n e t i n j ( t ) ) s_{c_j}(t) = s_{c_j}(t-1) + g(net_{c_j}(t)) f_{in_j}(net_{in_j}(t)) scj(t)=scj(t1)+g(netcj(t))finj(netinj(t))
可得:
∂ s c j ( t ) ∂ w c j m = ∂ s c j ( t − 1 ) ∂ w c j m + g ′ ( n e t c j ( t ) ) ( f i n j ( n e t i n j ( t ) ) ) y m ( t − 1 ) . (27) \frac{\partial s_{c_j}(t)}{\partial w_{c_j} m} = \frac{\partial s_{c_j}(t-1)}{\partial w_{c_j m}} + g'(net_{c_j}(t))(f_{in_j}(net_{in_j}(t)))y^m(t-1)\tag{27}. wcjmscj(t)=wcjmscj(t1)+g(netcj(t))(finj(netinj(t)))ym(t1).(27)
上式的理解类似于式25。

因此记忆单元的权重 w c j m w_{c_j m} wcjm t t t时刻的更新值为:
Δ w c j m ( t ) = α e s c j ( t ) ∂ s c j ( t ) ∂ w c j m . (28) \Delta w_{c_j m} (t)=\alpha e_{s_{c_j}}(t) \frac{\partial s_{c_j}(t)}{\partial w_{c_j} m}\tag{28}. Δwcjm(t)=αescj(t)wcjmscj(t).(28)
误差值传播路径图:
在这里插入图片描述

5.6 权重更新算法的时间复杂度

K K K为输出向量的长度, C C C为记忆单元块的个数(在我们简化的单记忆块的版本中,该值为1), S S S为每个记忆块中记忆单元的个数, H H H为隐藏单元的向量长度, I I I为与记忆单元、门、和隐藏单元互相连接的向量度。
这个 I I I指的就是向量 y u y^u yu的长度,如下图所示:
在这里插入图片描述
所有权重数据的个数为 W W W
W = K H + K C S + C S I + 2 C I + H I . W = KH + KCS +CSI + 2CI + HI. W=KH+KCS+CSI+2CI+HI.
其中:

  • K H + K C S KH + KCS KH+KCS w k w_k wk的权重个数。
  • C S I CSI CSI w c j w_{c_j} wcj的权重个数。
  • 2 C I 2CI 2CI w i n j , w o u t j w_{in_j},w_{out_j} winj,woutj的权重个数之和。
  • H I HI HI w i w_i wi的权重个数。

更新所有权重需要 K H + K C S + C S I + 2 C I + H I KH + KCS + CSI + 2CI + HI KH+KCS+CSI+2CI+HI步操作, O ( W ) = O ( K H + K C S + C S I + H I ) O(W) = O(KH+KCS+CSI + HI) O(W)=O(KH+KCS+CSI+HI)

在程序开发过程中,我们只需要实现等式(19),(20),(21),(22),(23),(25),(26),(27),(28)。因此我们只需要逐步计算每个等式的时间复杂度即可算出整个算法的时间复杂度。

  • 式19: e k ( t ) = f ′ ( n e t k ( t ) ) ( t k ( t ) − y k ( t ) ) e_k(t) = f'(net_k(t))(t^k(t) - y^k(t)) ek(t)=f(netk(t))(tk(t)yk(t)),需要 K K K步计算,
  • 式20: e i ( t ) = f i ′ ( n e t i ( t ) ) ∑ k :   k   o u t p u t   u n i t w k i e k ( t ) e_i(t) = f_i'(net_i(t))\sum_{k:\ k\ output\ unit}w_{ki}e_k(t) ei(t)=fi(neti(t))k: k output unitwkiek(t),需要 K H KH KH步计算,
  • 式21: e o u t j ( t ) = f o u t j ′ ( n e t o u t j ( t ) ) ( ∑ v = 1 s j h ( s c j v ) ∑ k :   k   o u t p u t   u n i t w k c j v e k ( t ) ) e_{out_j}(t) = f_{out_j}'(net_{out_j}(t))(\sum_{v=1}^{s_j} h(s_{c_j^v})\sum_{k:\ k\ output\ unit}w_{kc_j^v}e_k(t)) eoutj(t)=foutj(netoutj(t))(v=1sjh(scjv)k: k output unitwkcjvek(t)),需要 K C S KCS KCS步计算,
  • 式22: Δ w l m ( t ) = α e l ( t ) y m ( t − 1 ) \Delta w_{lm}(t) = \alpha e_l(t)y^m(t-1) Δwlm(t)=αel(t)ym(t1),当 l = k l=k l=k时需要 K ( H + C ) K(H+C) K(H+C)步计算,当 l = i l=i l=i时需要 H I HI HI步计算,当 l = o u t j l=out_j l=outj时需要 C I CI CI步计算,
  • 式23: e s c j ( t ) = f o u t j ( n e t o u t j ( t ) ) h ′ ( s c j ( t ) ) ( ∑ k :   k   o u t p u t   u n i t w k c j e k ( t ) ) e_{s_{c_j}}(t) = f_{out_j}(net_{out_j}(t))h'(s_{c_{j}}(t)) (\sum_{k:\ k\ output\ unit}w_{kc_j}e_k(t)) escj(t)=foutj(netoutj(t))h(scj(t))(k: k output unitwkcjek(t)),需要 K C S KCS KCS步计算,
  • 式25: ∂ s c j ( t ) ∂ w i n j m = ∂ s c j ( t − 1 ) ∂ w i n j m + g ( n e t c j ( t ) ) f i n j ′ ( n e t i n j ( t ) ) y m ( t − 1 ) \frac{\partial s_{c_j}(t)}{\partial w_{in_j m}} = \frac{\partial s_{c_j}(t-1)}{\partial w_{in_j m}}+ g(net_{c_j}(t))f_{in_j}'(net_{in_j}(t))y^m(t-1) winjmscj(t)=winjmscj(t1)+g(netcj(t))finj(netinj(t))ym(t1),需要 C S I CSI CSI步计算,
  • 式26: Δ w i n j m ( t ) = α ∑ v = 1 s j e s c j ( t ) ∂ s c j ( t ) ∂ w i n j m \Delta w_{in_j m}(t) = \alpha \sum_{v=1}^{s_j} e_{s_{c_j}}(t) \frac{\partial s_{c_j}(t)}{\partial w_{in_j m}} Δwinjm(t)=αv=1sjescj(t)winjmscj(t),需要 C S I CSI CSI步计算,
  • 式27: ∂ s c j ( t ) ∂ w c j m = ∂ s c j ( t − 1 ) ∂ w c j m + g ′ ( n e t c j ( t ) ) ( f i n j ( n e t i n j ( t ) ) ) y m ( t − 1 ) \frac{\partial s_{c_j}(t)}{\partial w_{c_j} m} = \frac{\partial s_{c_j}(t-1)}{\partial w_{c_j m}} + g'(net_{c_j}(t))(f_{in_j}(net_{in_j}(t)))y^m(t-1) wcjmscj(t)=wcjmscj(t1)+g(netcj(t))(finj(netinj(t)))ym(t1),需要 C S I CSI CSI步计算,
  • 式28: Δ w c j m ( t ) = α e s c j ( t ) ∂ s c j ( t ) ∂ w c j m \Delta w_{c_j m} (t)=\alpha e_{s_{c_j}}(t) \frac{\partial s_{c_j}(t)}{\partial w_{c_j} m} Δwcjm(t)=αescj(t)wcjmscj(t),需要 C S I CSI CSI步计算。

把所有步骤加起来就是:
K + K H + K C S + K ( H + C ) + H I + C I + K C S + 4 C S I = K + 2 K H + K C + 2 K C S + H I + C I + 4 C S I = O ( K H + K C S + C S I + H I ) K + KH + KCS + K(H+C) + HI + CI + KCS + 4CSI = K + 2KH + KC + 2KCS + HI +CI + 4CSI = O(KH+KCS+CSI+HI) K+KH+KCS+K(H+C)+HI+CI+KCS+4CSI=K+2KH+KC+2KCS+HI+CI+4CSI=O(KH+KCS+CSI+HI)

因此可以得到LSTM每一时间步的计算时间复杂度为:
O ( K H + K C S + C S I + H I ) = O ( W ) (29) O(KH+KCS+CSI + HI)=O(W)\tag{29} O(KH+KCS+CSI+HI)=O(W)(29)

由于文章太长,我把整个文章分为上中下三篇,在下篇我将给大家介绍在LSTM模型的后向传播过程中,误差信号的缩放情况。
上篇:上篇在此
中篇:中篇在此
下篇:下篇还没写

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/693295.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

孚盟云 SQL注入漏洞

漏洞说明 孚盟与阿里强强联手将最受青睐的经典C系列产品打造成全新的孚盟云产品&#xff0c;让用户可以用云模式实现信息化管理&#xff0c;让用户的异地办公更加流畅&#xff0c;大大降低中小企业在信息化上成本&#xff0c;用最小的投入享受大型企业级别的信息化服务&#x…

22-UMAP-Towards Fair Multi-Stakeholder Recommender Systems

KY&#xff1a;datasets, neural networks, gaze detection, text tagging AB&#xff1a;RSs通常建立在大型&#xff08;可能是非常稀疏的&#xff09;数据集上&#xff0c;因此妨碍了非常复杂去偏技术的使用。我们的方法引入了一个公平函数&#xff08;fairness functional&a…

Spring 定时任务@Scheduled 注解中的 Cron 表达式

引言&#xff1a; Spring 框架提供了强大的定时任务功能&#xff0c;通过 Scheduled 注解可以方便地定义和管理定时任务。其中&#xff0c;Cron 表达式作为定时任务触发的时间表达式&#xff0c;扮演着重要的角色。本篇博客将详细介绍和讲解 Cron 表达式的语法和常见用法&…

Centos 从0到N

0x00 前言 最近一直在搞虚拟机&#xff0c;索性写一篇记录一下全过程&#xff0c;免得下次再去到处查资料 0x01 ssh 首先修改配置文件 vi /etc/ssh/sshd_config 开启端口以及listen 保存后重启服务 systemctl restart sshd 开机自启 chkconfig sshd on0x02 安装基础工具…

【Simulink】极值搜索控制 Extremum Seeking Control(无模型控制)

1.什么是极值搜索控制&#xff1f; 首先明确一下&#xff0c;对于yf(x)&#xff0c;f(a)是函数f(x)的极大值或极小值&#xff0c;则a为函数f(x)的极值点&#xff0c;极大值点与极小值点统称为极值点。 极值搜索&#xff0c;顾名思义&#xff0c;就是找到极小值点或者极大值点…

【Java】什么是 Java 虚拟机 (JVM)

本文仅供学习参考&#xff01; 相关教程(文章)地址&#xff1a; https://zhuanlan.zhihu.com/p/34426768 https://github.com/doocs/jvm Java 虚拟机 (JVM) 是 Java 编程语言的关键组件&#xff0c;为跨大多数主要硬件、操作系统和软件架构执行 Java 代码提供了一个独立于平台的…

在Windows上编译和调试CoreCLR

生成CoreCLR - Windows篇 本文的唯一目的就是让你运行Hello World 运行环境 Window 7 Visual studio 2015 确保C 工具已经被安装&#xff0c;默认是不安装的&#xff0c;所以要选择自定义模式&#xff0c;VS 2015 精简版不支持。 CMake 下载 CMake for windows,并把Cmak…

LeetCode刷题 | 518. 零钱兑换 II、377. 组合总和 Ⅳ、

518. 零钱兑换 II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 …

Python学习——集合

一、集合的定义 集合也是Python语言所提供的内置数据结构&#xff0c;集合与列表、字典一样都属于可变类型的序列&#xff0c;集合是没有value的字典&#xff0c;所以集合也是无序的。 二、集合的创建 方式一&#xff1a;使用大括号进行创建 #使用大括号创建结合 s{1,3,5,7,9}…

STM32H743 SOEM EtherCAT基于STM32H743芯片和SOEM的EtherCAT主站源码

一个基于STM32H743芯片和SOEM协议栈的EtherCAT主站源码。该源码提供了配套的CUBE工程&#xff0c;使用的是SOEM协议栈的1.3.1版本。此外&#xff0c;还可以使用NUCLEO-H743ZI开发板进行配套开发。该系统支持DC同步&#xff0c;并且可以与多种驱动器型号配合使用&#xff0c;包括…

VC++添加一般类

VC6新建一个单文档工程&#xff1b; 然后从菜单中选择 插入类&#xff1b;弹出下图对话框&#xff1b;选择类的类型为 Generic Class&#xff1b; 输入类名&#xff1b; 确定之后&#xff0c;会生成一个.h文件&#xff0c;一个.cpp文件&#xff1b;包含基本的构造和析构函数&…

Day07

目录 1、使用JsonIgnoreProperties 2、前端日期字符串转换LocalDateTime异常 1、使用JsonIgnoreProperties 在做项目时把前端的JSON对象转为dto对象时&#xff0c;出现了异常 Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse er…

go-cqhttp签名服务sign-server的本地搭建

新版go-cqhttp新增签名服务器签名服务器相关问题 Issue #2242 Mrs4s/go-cqhttp GitHubhttps://github.com/Mrs4s/go-cqhttp/issues/2242 其在win10系统下本地化搭建的方式为&#xff1a; 1.解压缩qq安装包提取lib里面的libfekit.so、libQSec.so文件并存放至一个文件夹&…

【Vue3】CustomImport 导入文件组件

1. 效果图 2. 组件完整代码 <template><div class"custom-import-warpper"><el-dialog v-model"dialogVisible" :title"dialogTitle" width"600px" :close-on-click-modal"false"><el-form label-wid…

SAP从入门到放弃系列之报废率-主数据维护-Scrap

文章目录 一、前言二、场景概述&#xff1a;三、报废的类型&#xff1a;3.1、装配报废3.2、组件报废3.3、工序报废-料废3.4、工序报废-工废 四、数据维护&#xff1a;4.1、装配报废&#xff08;Assembly scrap&#xff09;4.2、组件报废(Component scrap)4.3、工序报废-料废(Op…

windows环境使用cmake配置pcl

安装环境 cmake版本&#xff1a;cmake-3.26.3-windows-x86_64 pcl版本&#xff1a;PCL 1.13.1 vs版本&#xff1a;vs2022 配置流程 cmake编译准备&#xff1a;新建两个文件夹source和cmake_bin。source用于存放.cpp文件和CMakeLists.txt 文件&#xff1b;cmake_bin存放配置生…

【NLP】理解LSTM的内在逻辑

一、说明 在学习RNN的时候,多少有些东西可以作为实例进行原理性实践;而进入LSTM时代,短小的能说明原理的案例实验并不多,相反,对此的参考文献却海啸般地到来,让人来不及消化;本文是万篇论文之一,因其叙述的独特性,被我选入介绍给大家。 二、从循环神经网络说起 人类并…

LeetCode刷题 | 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c; 且 x < y。那么粉碎的可能结…

死信是什么,如何运用RabbitMQ的死信机制?

系列文章目录 手把手教你&#xff0c;本地RabbitMQ服务搭建&#xff08;windows&#xff09; 消息队列选型——为什么选择RabbitMQ RabbitMQ 五种消息模型 RabbitMQ 能保证消息可靠性吗 推或拉&#xff1f; RabbitMQ 消费模式该如何选择 死信是什么&#xff0c;如何运用Rabbit…

使用影刀RPA合并excel数据

合并不同sheet&#xff1a; 先获取不同sheet中的表头&#xff0c;合并所有表头并去重存作列表&#xff0c;新建excel在第一行插入该表头数据,作合并数据存放使用循环方法&#xff0c;依次获取每个sheet的数据&#xff0c;用if判断表头是否在1的列表中&#xff0c;在的话则将整…