当前位置: 首页 > news >正文

Kronecker分解(K-FAC):让自然梯度在深度学习中飞起来

Kronecker分解(K-FAC):让自然梯度在深度学习中飞起来

在深度学习的优化中,自然梯度下降(Natural Gradient Descent)是一个强大的工具,它利用Fisher信息矩阵(FIM)调整梯度方向,让参数更新更高效。然而,Fisher信息矩阵的计算复杂度是个大难题——对于参数量巨大的神经网络,直接计算和求逆几乎是不可能的。这时,Kronecker分解(Kronecker-Factored Approximate Curvature,简称K-FAC)登场了。它通过巧妙的近似,让自然梯度在深度学习中变得实用。今天,我们就来聊聊K-FAC的原理、优势,以及参数正交性如何给它加分。


Fisher信息矩阵的挑战

Fisher信息矩阵 ( I ( θ ) I(\theta) I(θ) ) 衡量了模型输出对参数 ( θ \theta θ ) 的敏感度,在自然梯度下降中的更新公式是:

θ t + 1 = θ t − η I ( θ ) − 1 ∂ L ∂ θ \theta_{t+1} = \theta_t - \eta I(\theta)^{-1} \frac{\partial L}{\partial \theta} θt+1=θtηI(θ)1θL

这里,( I ( θ ) − 1 I(\theta)^{-1} I(θ)1 ) 是Fisher信息矩阵的逆,起到“校正”梯度的作用。但问题来了:

  • 存储复杂度:如果模型有 ( n n n ) 个参数,( I ( θ ) I(\theta) I(θ) ) 是一个 ( n × n n \times n n×n ) 的矩阵,需要 ( O ( n 2 ) O(n^2) O(n2) ) 的存储空间。
  • 计算复杂度:求逆需要 ( O ( n 3 ) O(n^3) O(n3)) 的时间复杂度。

对于一个有百万参数的神经网络,( n 2 n^2 n2 ) 和 ( n 3 n^3 n3 ) 是天文数字,直接计算完全不现实。K-FAC的出现,就是要解决这个“卡脖子”的问题。


什么是Kronecker分解(K-FAC)?

K-FAC是一种近似方法,全称是“Kronecker-Factored Approximate Curvature”。它的核心思想是利用神经网络的层级结构,将Fisher信息矩阵分解成小块矩阵,然后用Kronecker乘积(一种特殊的矩阵乘法)来近似表示。这样,既降低了计算成本,又保留了自然梯度的大部分优势。

通俗比喻

想象你在整理一个巨大的仓库(Fisher信息矩阵),里面堆满了杂乱的货物(参数间的关系)。直接搬运整个仓库太费力,而K-FAC就像把仓库分成几个小隔间(每一层网络一个),每个隔间用两个简单清单(小矩阵)描述货物分布。这样,你不用搬整个仓库,只需处理小隔间,就能大致知道货物的布局。


K-FAC的原理

1. 分层近似

神经网络通常是分层的,每一层有自己的权重(例如 ( W l W_l Wl ))。K-FAC假设Fisher信息矩阵 ( I ( θ ) I(\theta) I(θ) ) 对不同层之间的参数交叉项近似为零,只关注每层内部的参数关系。这样,( I ( θ ) I(\theta) I(θ) ) 变成一个块对角矩阵(block-diagonal matrix),每个块对应一层:

I ( θ ) ≈ diag ( I 1 , I 2 , … , I L ) I(\theta) \approx \text{diag}(I_1, I_2, \dots, I_L) I(θ)diag(I1,I2,,IL)

其中 ( I l I_l Il ) 是第 ( l l l ) 层的Fisher信息矩阵。

2. Kronecker分解

对于每一层 ( l l l ),权重 ( W l W_l Wl ) 是一个矩阵(比如 ( m × n m \times n m×n ))。对应的Fisher信息矩阵 ( I l I_l Il ) 本来是一个 ( ( m ⋅ n ) × ( m ⋅ n ) (m \cdot n) \times (m \cdot n) (mn)×(mn) ) 的大矩阵,直接计算很麻烦。K-FAC观察到,神经网络的梯度可以分解为输入和输出的贡献,于是近似为:

I l ≈ A l ⊗ G l I_l \approx A_l \otimes G_l IlAlGl

  • ( A l A_l Al ):输入激活的协方差矩阵(大小 ( m × m m \times m m×m )),表示前一层输出的统计特性。
  • ( G l G_l Gl ):梯度相对于输出的协方差矩阵(大小 ( n × n n \times n n×n )),表示当前层输出的统计特性。
  • ( ⊗ \otimes ):Kronecker乘积,将两个小矩阵“组合”成一个大矩阵。后文有解释。

3. 高效求逆

Kronecker乘积有个妙处:如果 ( I l = A l ⊗ G l I_l = A_l \otimes G_l Il=AlGl ),其逆可以通过小矩阵的逆计算:

I l − 1 = A l − 1 ⊗ G l − 1 I_l^{-1} = A_l^{-1} \otimes G_l^{-1} Il1=Al1Gl1

  • ( A l A_l Al ) 是 ( m × m m \times m m×m ),求逆是 ( O ( m 3 ) O(m^3) O(m3) )。
  • ( G l G_l Gl ) 是 ( n × n n \times n n×n ),求逆是 ( O ( n 3 ) O(n^3) O(n3) )。

相比直接求 ( ( m ⋅ n ) × ( m ⋅ n ) (m \cdot n) \times (m \cdot n) (mn)×(mn) ) 矩阵的 ( O ( ( m n ) 3 ) O((mn)^3) O((mn)3) ),K-FAC把复杂度降到了 ( O ( m 3 + n 3 ) O(m^3 + n^3) O(m3+n3) ),通常 ( m m m ) 和 ( n n n ) 远小于 ( m ⋅ n m \cdot n mn ),节省巨大。


K-FAC的数学细节

假设第 ( l l l ) 层的输出为 ( a l = W l h l − 1 a_l = W_l h_{l-1} al=Wlhl1 )(( h l − 1 h_{l-1} hl1 ) 是前一层激活),损失为 ( L L L )。Fisher信息矩阵的精确定义是:

I l = E [ vec ( ∂ L ∂ a l h l − 1 T ) vec ( ∂ L ∂ a l h l − 1 T ) T ] I_l = E\left[ \text{vec}\left( \frac{\partial L}{\partial a_l} h_{l-1}^T \right) \text{vec}\left( \frac{\partial L}{\partial a_l} h_{l-1}^T \right)^T \right] Il=E[vec(alLhl1T)vec(alLhl1T)T]

K-FAC近似为:

I l ≈ E [ h l − 1 h l − 1 T ] ⊗ E [ ∂ L ∂ a l ∂ L ∂ a l T ] = A l ⊗ G l I_l \approx E\left[ h_{l-1} h_{l-1}^T \right] \otimes E\left[ \frac{\partial L}{\partial a_l} \frac{\partial L}{\partial a_l}^T \right] = A_l \otimes G_l IlE[hl1hl1T]E[alLalLT]=AlGl

  • ( A l = E [ h l − 1 h l − 1 T ] A_l = E[h_{l-1} h_{l-1}^T] Al=E[hl1hl1T] ):输入协方差。
  • ( G l = E [ ∂ L ∂ a l ∂ L ∂ a l T ] G_l = E\left[ \frac{\partial L}{\partial a_l} \frac{\partial L}{\partial a_l}^T \right] Gl=E[alLalLT] ):输出梯度协方差。

自然梯度更新变成:

vec ( Δ W l ) = ( A l − 1 ⊗ G l − 1 ) vec ( ∂ L ∂ W l ) \text{vec}(\Delta W_l) = (A_l^{-1} \otimes G_l^{-1}) \text{vec}\left( \frac{\partial L}{\partial W_l} \right) vec(ΔWl)=(Al1Gl1)vec(WlL)

实际中,( A l A_l Al ) 和 ( G l G_l Gl ) 通过小批量数据的平均值估计,动态更新。


K-FAC的优势

1. 计算效率

从 ( O ( n 3 ) O(n^3) O(n3) ) 降到 ( O ( m 3 + n 3 ) O(m^3 + n^3) O(m3+n3) ),K-FAC让自然梯度在大型网络中可行。例如,一个隐藏层有 1000 个神经元,普通方法需要处理百万级矩阵,而K-FAC只需处理千级矩阵。

2. 保留曲率信息

虽然是近似,K-FAC依然捕捉了每层参数的局部曲率,帮助模型更快收敛,尤其在损失函数表面复杂时。

3. 并行性

每一层的 ( A l A_l Al ) 和 ( G l G_l Gl ) 可以独立计算,非常适合GPU并行加速。


参数正交性如何助力K-FAC?

参数正交性是指Fisher信息矩阵的非对角元素 ( I i j = 0 I_{ij} = 0 Iij=0 )(( i ≠ j i \neq j i=j )),意味着参数间信息独立。K-FAC天然假设层间正交(块对角结构),但层内参数的正交性也能进一步简化计算。

1. 更接近对角形式

如果模型设计时让权重尽量正交(比如通过正交初始化,( W l W l T = I W_l W_l^T = I WlWlT=I )),( A l A_l Al ) 和 ( G l G_l Gl ) 的非对角元素会减小,( I l I_l Il ) 更接近对角矩阵。求逆时计算量进一步降低,甚至可以用简单的逐元素除法近似。

2. 提高稳定性

正交参数减少梯度方向的耦合,自然梯度更新更稳定,避免震荡。例如,卷积网络中正交卷积核可以增强K-FAC的效果。

3. 实际应用

在RNN或Transformer中,正交初始化(如Hennig的正交矩阵)结合K-FAC,能显著提升训练速度和性能。


K-FAC的应用场景

  • 深度神经网络:K-FAC在DNN优化中加速收敛,常用于图像分类任务。
  • 强化学习:如ACKTR算法,结合K-FAC改进策略优化。
  • 生成模型:变分自编码器(VAE)中,K-FAC优化变分参数。

总结

Kronecker分解(K-FAC)通过分层和Kronecker乘积,将Fisher信息矩阵的计算复杂度从“天文数字”降到可接受范围,让自然梯度下降在深度学习中大放异彩。它不仅高效,还保留了曲率信息,适合现代大规模模型。参数正交性则是它的好帮手,通过减少参数间干扰,让K-FAC更简单、更稳定。下次训练网络时,不妨试试K-FAC,也许会带来惊喜!

补充:解释Kronecker乘积

详细解释Kronecker乘积(Kronecker Product)的含义,以及为什么K-FAC观察到神经网络的梯度可以分解为输入和输出的贡献,从而将其近似为 ( I l ≈ A l ⊗ G l I_l \approx A_l \otimes G_l IlAlGl )。


什么是Kronecker乘积?

Kronecker乘积是一种特殊的矩阵运算,用符号 ( ⊗ \otimes ) 表示。它可以将两个较小的矩阵“组合”成一个更大的矩阵。具体来说,假设有两个矩阵:

  • ( A A A ) 是 ( m × m m \times m m×m ) 的矩阵。
  • ( G G G ) 是 ( n × n n \times n n×n ) 的矩阵。

它们的Kronecker乘积 ( A ⊗ G A \otimes G AG ) 是一个 ( ( m ⋅ n ) × ( m ⋅ n ) (m \cdot n) \times (m \cdot n) (mn)×(mn) ) 的矩阵,定义为:

A ⊗ G = [ a 11 G a 12 G ⋯ a 1 m G a 21 G a 22 G ⋯ a 2 m G ⋮ ⋮ ⋱ ⋮ a m 1 G a m 2 G ⋯ a m m G ] A \otimes G = \begin{bmatrix} a_{11} G & a_{12} G & \cdots & a_{1m} G \\ a_{21} G & a_{22} G & \cdots & a_{2m} G \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} G & a_{m2} G & \cdots & a_{mm} G \end{bmatrix} AG= a11Ga21Gam1Ga12Ga22Gam2Ga1mGa2mGammG

其中,( a i j a_{ij} aij ) 是 ( A A A ) 的第 ( i i i ) 行第 ( j j j ) 列元素,( G G G ) 是整个 ( n × n n \times n n×n ) 矩阵。也就是说,( A A A ) 的每个元素 ( a i j a_{ij} aij ) 都被放大为一个 ( n × n n \times n n×n ) 的块矩阵 ( a i j G a_{ij} G aijG )。

通俗解释

想象你在做一个拼图,( A A A ) 是一个 ( m × m m \times m m×m ) 的模板,告诉你每个位置的重要性(比如协方差);( G G G ) 是一个 ( n × n n \times n n×n ) 的小图案。Kronecker乘积就像把 ( G G G ) 这个图案按照 ( A A A ) 的模板放大排列,形成一个更大的拼图,最终大小是 ( ( m ⋅ n ) × ( m ⋅ n ) (m \cdot n) \times (m \cdot n) (mn)×(mn) )。

例子

假设 ( A = [ 1 2 3 4 ] A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} A=[1324] )(2×2),( G = [ 0 1 1 0 ] G = \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix} G=[0110] )(2×2),则:

A ⊗ G = [ 1 ⋅ [ 0 1 1 0 ] 2 ⋅ [ 0 1 1 0 ] 3 ⋅ [ 0 1 1 0 ] 4 ⋅ [ 0 1 1 0 ] ] A \otimes G = \begin{bmatrix} 1 \cdot \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix} & 2 \cdot \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix} \\ 3 \cdot \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix} & 4 \cdot \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix} \end{bmatrix} AG= 1[0110]3[0110]2[0110]4[0110]

= [ 0 1 0 2 1 0 2 0 0 3 0 4 3 0 4 0 ] = \begin{bmatrix} 0 & 1 & 0 & 2 \\ 1 & 0 & 2 & 0 \\ 0 & 3 & 0 & 4 \\ 3 & 0 & 4 & 0 \end{bmatrix} = 0103103002042040

结果是一个 4×4 矩阵(( 2 ⋅ 2 × 2 ⋅ 2 2 \cdot 2 \times 2 \cdot 2 22×22 ))。


K-FAC为何用Kronecker乘积近似?

现在我们来看K-FAC为什么观察到神经网络的梯度可以分解为输入和输出的贡献,并用 ( I l ≈ A l ⊗ G l I_l \approx A_l \otimes G_l IlAlGl ) 来近似Fisher信息矩阵。

背景:Fisher信息矩阵的定义

对于第 ( l l l ) 层的权重 ( W l W_l Wl )(一个 ( m × n m \times n m×n ) 矩阵),Fisher信息矩阵 ( I l I_l Il ) 是关于 ( W l W_l Wl ) 的二阶统计量。假设输出为 ( a l = W l h l − 1 a_l = W_l h_{l-1} al=Wlhl1 )(( h l − 1 h_{l-1} hl1 ) 是前一层激活),损失为 ( L L L ),精确的Fisher信息矩阵是:

I l = E [ vec ( ∂ L ∂ a l h l − 1 T ) vec ( ∂ L ∂ a l h l − 1 T ) T ] I_l = E\left[ \text{vec}\left( \frac{\partial L}{\partial a_l} h_{l-1}^T \right) \text{vec}\left( \frac{\partial L}{\partial a_l} h_{l-1}^T \right)^T \right] Il=E[vec(alLhl1T)vec(alLhl1T)T]

这里:

  • ( ∂ L ∂ a l \frac{\partial L}{\partial a_l} alL ) 是损失对输出的梯度(大小为 ( n × 1 n \times 1 n×1 ))。
  • ( h l − 1 h_{l-1} hl1 ) 是输入激活(大小为 ( m × 1 m \times 1 m×1 ))。
  • ( ∂ L ∂ a l h l − 1 T \frac{\partial L}{\partial a_l} h_{l-1}^T alLhl1T ) 是 ( W l W_l Wl ) 的梯度(( m × n m \times n m×n ) 矩阵)。
  • ( vec ( ⋅ ) \text{vec}(\cdot) vec() ) 将矩阵拉成向量,( I l I_l Il ) 是 ( ( m ⋅ n ) × ( m ⋅ n ) (m \cdot n) \times (m \cdot n) (mn)×(mn) ) 的。

直接计算这个期望需要存储和操作一个巨大矩阵,复杂度为 ( O ( ( m n ) 2 ) O((mn)^2) O((mn)2) )。

K-FAC的观察:梯度分解

K-FAC注意到,神经网络的梯度 ( ∂ L ∂ W l = ∂ L ∂ a l h l − 1 T \frac{\partial L}{\partial W_l} = \frac{\partial L}{\partial a_l} h_{l-1}^T WlL=alLhl1T ) 天然具有“输入”和“输出”的分离结构:

  • 输入贡献:( h l − 1 h_{l-1} hl1 ) 是前一层的激活,决定了梯度的“空间结构”。
  • 输出贡献:( ∂ L ∂ a l \frac{\partial L}{\partial a_l} alL ) 是当前层的输出梯度,决定了梯度的“强度”。

这两个部分是外积(outer product)的形式,提示我们可以分别统计它们的特性,而不是直接算整个大矩阵的协方差。

分解为输入和输出的协方差

K-FAC假设梯度的期望可以近似分解为输入和输出的独立统计量:

I l ≈ E [ h l − 1 h l − 1 T ] ⊗ E [ ∂ L ∂ a l ∂ L ∂ a l T ] I_l \approx E\left[ h_{l-1} h_{l-1}^T \right] \otimes E\left[ \frac{\partial L}{\partial a_l} \frac{\partial L}{\partial a_l}^T \right] IlE[hl1hl1T]E[alLalLT]

  • ( A l = E [ h l − 1 h l − 1 T ] A_l = E[h_{l-1} h_{l-1}^T] Al=E[hl1hl1T] ):输入激活的协方差矩阵(( m × m m \times m m×m )),捕捉了 ( h l − 1 h_{l-1} hl1 ) 的统计特性。
  • ( G l = E [ ∂ L ∂ a l ∂ L ∂ a l T ] G_l = E\left[ \frac{\partial L}{\partial a_l} \frac{\partial L}{\partial a_l}^T \right] Gl=E[alLalLT] ):输出梯度的协方差矩阵(( n × n n \times n n×n )),捕捉了后续层反馈的统计特性。

为什么用Kronecker乘积 ( ⊗ \otimes )?因为梯度 ( ∂ L ∂ W l \frac{\partial L}{\partial W_l} WlL ) 是一个矩阵,其向量化形式 ( vec ( ∂ L ∂ W l ) \text{vec}(\frac{\partial L}{\partial W_l}) vec(WlL) ) 的协方差天然可以用输入和输出的外积结构表示。Kronecker乘积正好能将 ( A l A_l Al ) 和 ( G l G_l Gl ) “组合”成一个 ( ( m ⋅ n ) × ( m ⋅ n ) (m \cdot n) \times (m \cdot n) (mn)×(mn) ) 的矩阵,与 ( I l I_l Il ) 的维度一致。

为什么这个近似合理?
  1. 结构假设

    • 神经网络的分层设计让输入 ( h l − 1 h_{l-1} hl1 ) 和输出梯度 ( ∂ L ∂ a l \frac{\partial L}{\partial a_l} alL ) 在统计上相对独立。
    • 这种分解假设 ( h l − 1 h_{l-1} hl1 ) 和 ( ∂ L ∂ a l \frac{\partial L}{\partial a_l} alL ) 的相关性主要通过外积体现,忽略了更高阶的交叉项。
  2. 维度匹配

    • ( A l ⊗ G l A_l \otimes G_l AlGl ) 生成一个 ( ( m ⋅ n ) × ( m ⋅ n ) (m \cdot n) \times (m \cdot n) (mn)×(mn) ) 矩阵,与 ( I l I_l Il ) 的维度一致。
    • 它保留了输入和输出的主要统计信息,同时简化了计算。
  3. 经验验证

    • 实验表明,这种近似在实践中效果很好,尤其在全连接层和卷积层中,能捕捉梯度曲率的主要特征。

为什么分解为输入和输出的贡献?

回到K-FAC的观察:神经网络的梯度 ( ∂ L ∂ W l = ∂ L ∂ a l h l − 1 T \frac{\partial L}{\partial W_l} = \frac{\partial L}{\partial a_l} h_{l-1}^T WlL=alLhl1T ) 是一个外积形式,这种结构启发我们分开考虑:

  • 输入端(( h l − 1 h_{l-1} hl1 )):它来自前一层,反映了数据的空间分布(如激活的协方差)。
  • 输出端(( ∂ L ∂ a l \frac{\partial L}{\partial a_l} alL )):它来自后续层,反映了损失对当前输出的敏感度。

在神经网络中,梯度本质上是“输入”和“输出”交互的结果。K-FAC利用这一点,将Fisher信息矩阵分解为两部分的乘积,而不是直接处理整个权重矩阵的复杂关系。这种分解不仅符合直觉(网络是层层传递的),也大大降低了计算负担。


总结

Kronecker乘积 ( ⊗ \otimes ) 是K-FAC的核心工具,它将输入协方差 ( A l A_l Al ) 和输出梯度协方差 ( G l G_l Gl ) 组合成一个大矩阵,近似表示Fisher信息矩阵 ( I l I_l Il )。这种近似的依据是神经网络梯度的外积结构——输入和输出的贡献可以分开统计。K-FAC通过这种方式,把原本难以计算的 ( ( m ⋅ n ) × ( m ⋅ n ) (m \cdot n) \times (m \cdot n) (mn)×(mn) ) 矩阵问题,简化成了两个小矩阵的操作,既高效又实用。

后记

2025年2月24日22点48分于上海,在Grok3大模型辅助下完成。

相关文章:

Kronecker分解(K-FAC):让自然梯度在深度学习中飞起来

Kronecker分解(K-FAC):让自然梯度在深度学习中飞起来 在深度学习的优化中,自然梯度下降(Natural Gradient Descent)是一个强大的工具,它利用Fisher信息矩阵(FIM)调整梯度…...

Ubutu部署WordPress

前言 什么是word press WordPress是一种使用PHP语言开发的建站系统,用户可以在支持PHP和MySQL数据库的服务器上架设WordPress。它是一个开源的内容管理系统(CMS),允许用户构建动态网站和博客。现在的WordPress已经强大到几乎可以…...

请解释 React 中的 Hooks,何时使用 Hooks 更合适?

一、Hooks 核心理解 1. 什么是 Hooks? Hooks 是 React 16.8 引入的函数式编程范式,允许在函数组件中使用状态管理和生命周期能力。就像给函数组件装上了"智能芯片",让原本只能做简单展示的组件具备了处理复杂逻辑的能力。 2. 类…...

在Linux桌面上创建Idea启动快捷方式

1、在桌面新建idea.desktop vim idea.desktop [Desktop Entry] EncodingUTF-8 NameIntelliJ IDEA CommentIntelliJ IDEA Exec/home/software/idea-2021/bin/idea.sh Icon/home/software/idea-2021/bin/idea.svg Terminalfalse TypeApplication CategoriesApplication;Developm…...

如何在netlify一键部署静态网站

1. 准备你的项目 确保你的静态网站文件(如 HTML、CSS、JavaScript、图片等)都在一个文件夹中。通常,项目结构如下: my-static-site/ ├── index.html ├── styles/ │ └── styles.css └── scripts/└── script.js…...

网页制作09-html,css,javascript初认识のhtml如何使用表单

表单主要用来收集客户端提供的相关信息。,使网页具有交互作用。在网页制作的过程中,常常需要使用表单,如进行会员注册,网上调查和搜索等 访问者可以使用如文本域列表框,复选框以及单选按钮之类的表单对象输入信息,然后…...

Linux 命令大全完整版(03)

1. 系统管理命令 screen 功能说明&#xff1a;多重视窗管理程序。语  法&#xff1a;screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s <shell>][-S <作业名称>]补充说明&#xff1a;screen 为多重视窗管理程序。此处…...

【新人系列】Python 入门专栏合集

✍ 个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4dd; 专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12801353.html &#x1f4e3; 专栏定位&#xff1a;为 0 基础刚入门 Python 的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们…...

嵌入式软件数据结构(一)链表知识点专栏 附源码 附原理

嵌入式软件数据结构&#xff08;一&#xff09;链表知识点专栏 附源码 附原理 前言&#xff1a; 首先我们要知道什么是链表&#xff1f; 什么是链表&#xff0c;链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指…...

order by布尔盲注、时间盲注

pdo防御下&#xff0c;order by、limit不能参数绑定&#xff0c;可以进行sql注入 案例&#xff1a;靶场的less-46 布尔盲注&#xff1a; import requests from lxml import htmldef get_id_one(URL, paload):res requests.get(urlURL, paramspaload)tree html.fromstring(…...

数据结构与算法-图论-最短路-拓展运用

选择最佳路线 分析&#xff1a; 这是一道图论中的最短路径问题&#xff0c;目标是在给定的公交网络中&#xff0c;找到从琪琪家附近的车站出发&#xff0c;到她朋友家附近车站&#xff08;编号为 s &#xff09;的最短时间。以下是对该问题的详细分析&#xff1a; 问题关键信息…...

数据开发的简历及面试

简历 个人信息: 邮箱别写QQ邮箱, 写126邮箱/189邮箱等 学历>>本科及以上写,大专及以下不写 专业>>非计算机专业不写 政治面貌>>党员写, 群众不用写 掌握的技能: 精通 > 熟悉 > 了解 专业工具: 大数据相关的 公司: 如果没有可以写的>>金融服…...

android s下make otapackage编译失败

[DESCRIPTION] android s上&#xff0c;我司推荐使用split build的方式进行编译&#xff0c;但是部分客户依旧会采用AOSP full build的方式进行编译。而我司在这块release的时候&#xff0c;并未进行验证。因此执行make otapackage的时候&#xff0c;会出现如下报错。 [0312/…...

【算法通关村 Day12】字符串

字符串青铜挑战 字符串转换 转换为小写字母 给你一个字符串 s &#xff0c;将该字符串中的大写字母转换成相同的小写字母&#xff0c;返回新的字符串。leetcode791 public class ToLowerCase {/*** 将字符串中的大写字母转换为小写字母。** param s 输入字符串* return 转换…...

grafana K6压测

文章目录 install and runscript.jsoptions最佳实践 report 解析 https://grafana.com/docs/k6/latest/get-started install and run install # mac brew install k6当前目录下生成压测脚本 # create file script.js k6 new [filename] # create file ‘script.js’ in …...

SQLite 安装教程以及可视化工具介绍

目录 简述 1. Windows 系统安装 1.1 下载预编译的二进制文件 1.2 解压文件 1.3 配置环境变量 1.4 验证安装 2. GUI 可视化工具 2.1 免费工具 2.1.1 DB Browser for SQLite 2.1.2 SQLiteStudio 2.1.3 SQLite Expert 2.1.4 SQLiteGUI 2.1.5 Antares SQL 2.1.6 DbGa…...

谷云科技iPaaS×DeepSeek:构建企业智能集成的核心底座

2025年&#xff0c;DeepSeek大模型的爆发式普及&#xff0c;正引领软件行业实现 “智能跃迁”。从代码生成到系统集成&#xff0c;从企业级应用到消费级产品&#xff0c;自然语言交互能力已成为新一代软件的核心竞争力。据行业分析&#xff0c;超60%的软件企业已启动大模型适配…...

mac 下 java 调用 gurobi 不能加载 jar

在 mac 电脑中的 java 始终不能加载 gurobi 的 jar 包&#xff0c;java 的开发软件 eclipse&#xff0c;idea 总是显示找不到 gurobi 的 jar 包&#xff0c;但是 jar 包明明就在那里。 摸索了三个小时&#xff0c;最后发现原因竟然是&#xff1a; jar 包太新&#xff0c;替换…...

京准电钟:NTP精密时钟服务器在自动化系统中的作用

京准电钟&#xff1a;NTP精密时钟服务器在自动化系统中的作用 京准电钟&#xff1a;NTP精密时钟服务器在自动化系统中的作用 NTP精密时钟服务器在自动化系统中的作用非常重要&#xff0c;特别是在需要高精度时间同步的场景中。NTP能够提供毫秒级的时间同步精度&#xff0c;这…...

京东-零售-数据研发面经【附答案】

近期&#xff0c;有参加春招的同学和我交流了他的面试历程&#xff0c;我针对这些内容进行了细致的总结与梳理&#xff0c;并在此分享出来&#xff0c;希望能助力大家学习与借鉴。 1.八股文 1&#xff09;HashMap的底层原理是什么【见V6.0面试笔记 Java基础部分第19题】 2&am…...

面试之《react hooks在源码中是怎么实现的?》

要深入理解 React Hooks 在源码中的实现&#xff0c;可以从以下几个关键方面来剖析&#xff1a; 核心数据结构 在 React 内部&#xff0c;使用链表来管理每个函数组件的 Hooks。每个 Hook 对应一个节点&#xff0c;这些节点通过 next 指针相连。以下是简化后的 Hook 节点结构…...

泛型的约束有哪几种?(C#)

目录 1 值类型约束&#xff08;where T : struct&#xff09; 2 引用类型约束&#xff08;where T : class&#xff09; 3 无参构造函数约束&#xff08;where T : new ()&#xff09; 4 基类约束&#xff08;where T : <基类名>&#xff09; 5 接口约束&#xff08…...

Harmony开发笔记(未完成)

一、感想 作为一名拥有11年经验的Android开发者&#xff0c;我亲历了Android从高速发展到如今面临“僧多粥少”的过程。技术的世界瞬息万变&#xff0c;没有一种技术能够让人依赖一辈子。去年初&#xff0c;我自学了鸿蒙系统&#xff0c;并顺利通过了鸿蒙官方的初级和高级认。…...

DevSecOps普及:安全与开发运维的深度融合

一、引言 随着软件开发模式的演进&#xff0c;DevOps已成为现代软件工程的主流实践。然而&#xff0c;在传统的DevOps流程中&#xff0c;安全往往被视为开发和运维之外的额外环节&#xff0c;导致安全漏洞在产品交付后才被发现&#xff0c;增加了修复成本和风险。为了解决这一…...

JavaScript 系列之:Ajax、Promise、Axios

前言 同步&#xff1a;会阻塞。同步代码按照编写的顺序逐行依次执行&#xff0c;只有当前的任务完成后&#xff0c;才会执行下一个任务。 异步&#xff1a;异步代码不会阻塞后续代码的执行。当遇到异步操作时&#xff0c;JavaScript 会将该操作放入任务队列中&#xff0c;继续…...

為什麼使用不限量動態住宅IP採集數據?

在瞭解“不限量動態住宅IP數據採集”之前&#xff0c;我們需要先搞清楚什麼是“動態住宅IP”。簡單來說&#xff0c;動態IP是一種會定期變化的IP地址&#xff0c;通常由互聯網服務提供商&#xff08;ISP&#xff09;分配給家庭用戶。與固定IP&#xff08;靜態IP&#xff09;不同…...

vue3-06vue2(Object.defineProperty)与vue3(基于ES6的Proxy)的响应式原理对比

1.vue2响应原理 1.1对于对象与数组 对象类型: 通过 object.defineProperty() 对属性的读取、修改进行拦截 (数据劫持) 数组类型:通过重写更新数组的一系列方法来实现拦截。 (对数组的变更方法进行了包裹) Vue2的响应式是基于Object.defineProperty实现的 1.2 基本原理Objec…...

MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 4

第04章_逻辑架构 1. 逻辑架构剖析 首先MySQL是典型的C/S架构&#xff0c;即Client/Server架构&#xff0c;服务器端程序使用的mysqld。 不论客户端进程和服务器进程是采用哪种方式进行通信&#xff0c;最后实现的效果都是&#xff1a;客户端进程向服务器进程发送一段文本&…...

清华大学DeepSeek文档下载,清华大学deepseek下载(完成版下载)

文章目录 前言一、清华大学DeepSeek使用手册下载二、清华大学DeepSeek使用手册思维导图 前言 这是一篇关于清华大学deepseek使用手册pdf的介绍性文章&#xff0c;主要介绍了DeepSeek的定义、功能、使用方法以及如何通过提示语设计优化AI性能。以下是对这些核心内容的简要概述&…...

HDFS数据多目录、异构存储、回收站

1.NameNode元数据多目录 HDFS集群中可以在hdfs-site.xml中配置“dfs.namenode.name.dir”属性来指定NameNode存储数据的目录&#xff0c;默认NameNode数据存储在${hadoop.tmp.dir}/dfs/name目录&#xff0c;“hadoop.tmp.dir”配置项在core-site.xml中。 我们也可以将NameNod…...

windows设置暂停更新时长

windows设置暂停更新时长 win11与win10修改注册表操作一致 &#xff0c;系统界面不同 1.打开注册表 2.在以下路径 \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 右键新建 DWORD 32位值&#xff0c;名称为FlightSettingsMaxPauseDays 根据需求填写数…...

04 路由表的IP分组传输过程

目录 1、路由表的核心结构 2、IP分组传输过程和数据包转发过程 2.1、IP分组传输过程 2.2、数据包转发过程 2.3、IP分组传输过程和数据包转发的区别 3、数据包的变化 3.1、拓扑结构 3.2、传输过程详解&#xff08;主机A → 主机B&#xff09; 3.2.1、主机A发送数据 3.2…...

实现Python+Django+Transformers库中的BertTokenizer和BertModel来进行BERT预训练,并将其应用于商品推荐功能

一、环境安装准备 #git拉取 bert-base-chinese 文件#创建 虚拟运行环境python -m venv myicrplatenv#刷新source myicrplatenv/bin/activate#python Django 集成nacospip install nacos-sdk-python#安装 Djangopip3 install Django5.1#安装 pymysql settings.py 里面需要 # 强制…...

数据结构---定长顺序表

1.线性表的定义 存在唯一的一个被称为“第一个”的数据元素&#xff1b;存在唯一的一个被称为“最后一个”的数据元素&#xff1b;除第一个之外&#xff0c;集合中的每一个数据元素都只有一个前驱&#xff1b;除最后一个之外&#xff0c;集合中的每一个数据元素都只有一个后继…...

Elasticsearch 相关面试题

1. Elasticsearch基础 Elasticsearch是什么&#xff1f; Elasticsearch是一个分布式搜索引擎&#xff0c;基于Lucene实现。 Mapping是什么&#xff1f;ES中有哪些数据类型&#xff1f; Mapping&#xff1a;定义字段的类型和属性。 数据类型&#xff1a;text、keyword、integer、…...

冒泡排序(Bubble Sort)详细教程:Java实现与优化

一、什么是冒泡排序&#xff1f; 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它的基本思想是通过两两比较相邻元素&#xff0c;将较大的元素“冒泡”到数列的末尾。每一轮遍历会将一个较大的元素放到正确的位置&#xff0c;直到整个数组有序…...

【git】【reset全解】Git 回到上次提交并处理提交内容的不同方式

Git 回到上次提交并处理提交内容的不同方式 在 Git 中&#xff0c;若要回到上次提交并对提交内容进行不同处理&#xff0c;可使用 git reset 命令搭配不同选项来实现。以下为你详细介绍操作步骤及各选项的作用。 1. 查看提交历史 在操作之前&#xff0c;可通过以下命令查看提…...

矩阵的 正定(Positive Definite)与负定(Negative Definite):从Fisher信息矩阵看“曲率”的秘密

矩阵的正定与负定&#xff1a;从Fisher信息矩阵看“曲率”的秘密 在数学和统计学中&#xff0c;矩阵的“正定性”和“负定性”是一对重要概念&#xff0c;尤其在优化、统计推断和机器学习中频繁出现。比如&#xff0c;Fisher信息矩阵&#xff08;Fisher Information Matrix, F…...

Uniapp 小程序:语音播放与暂停功能的实现及优化方案

界面部分 //开启语音 <button class"open" v-if"showPlayfalse" click"playText">这是开启播放的图片</button >//关闭语音 <button class"close" v-if"showPlaytrue" click"stopText">这是…...

Python基于机器学习的微博舆情情感分析系统,微博评论情感分析可视化系统(全新升级)

大家好&#xff0c;今天为大家带来的是Python基于机器学习的微博舆情情感分析系统&#xff0c;微博评论情感分析可视化系统&#xff0c;这个系统在原本的系统上进行优化升级。 算法从开源框架的 snlow &#xff0c;到支持机器学习的 lstm 算法可以手动输入语句&#xff0c;进行…...

IP-------GRE和MGRE

4.GRE和MGRE 1.应用场景 现实场景 居家工作&#xff0c;公司工作&#xff0c;分公司工作----------需要传输交换数据--------NAT---在该场景中需要两次NAT&#xff08;不安全&#xff09; 为了安全有两种手段-----1.物理专线---成本高 2.VPN--虚拟专用网---隧道技术--封装技…...

内网综合渗透测试——WinterMute: 1靶场

靶场来源 <WinterMute: 1 ~ VulnHub> Wintermute 虚拟机网络配置指南 本实验涉及网络跳转技术&#xff0c;需正确配置VirtualBox网络。所有IP均为动态分配&#xff0c;配置快速简便。 通过"文件 >> 导入虚拟设备"导入各虚拟机。 STRAYLIGHT (网络#1 和 …...

项目进度管理工具:甘特图与关键路径法(2025实战指南)

在全球数字化转型加速的背景下&#xff0c;项目延期率高达42%的现状倒逼管理者掌握科学的进度管理工具。本文结合2025年最新实践&#xff0c;深度解析甘特图与关键路径法的原理及应用&#xff0c;助你构建精准可控的项目进度管理体系。 一、双剑合璧&#xff1a;工具组合的价值…...

deepseek-r1-centos-本地服务器配置方法

参考&#xff1a; 纯小白 Centos 部署DeepSeek指南_centos部署deepseek-CSDN博客 https://blog.csdn.net/xingxin550/article/details/145574080 手把手教大家如何在Centos7系统中安装Deepseek&#xff0c;一文搞定_centos部署deepseek-CSDN博客 https://blog.csdn.net/soso67…...

C# Unity 唐老狮 No.2 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体…...

一周学会Flask3 Python Web开发-flask3上下文全局变量session,g和current_app

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili flask3提供了session,g和current_app上下文全局变量来方便我们操作访问数据。 以下是一个表格&#xff0c;用于比较Flask中的…...

SpringBoot整合Mybatis-Plus+Druid实现多数据源

概述 Spring Boot&#xff1a; Spring Boot是一个基于Spring框架的开源Java开发框架&#xff0c;旨在简化Spring应用程序的开发、配置和部署。它提供了一种快速、敏捷的方式来构建独立的、生产级别的Spring应用程序&#xff0c;同时还提供了许多开箱即用的功能和工具&#xff0…...

【Mysql】我在广州学Mysql 系列—— 性能优化相关例题

ℹ️大家好&#xff0c;我是练小杰&#xff0c;时间过得真快&#xff0c;还有2天&#xff0c;2025年2月份就结束了&#xff01;&#xff01;&#x1f606; 本文是针对Mysql数据库中有关性能优化的相关示例&#xff0c;通过本文的学习可以深入了解性能优化的各类命令&#xff01…...

罗成华教授论腹膜后肿瘤核磁共振检查意义

腹膜后器官很少受生理运动的影响&#xff0c;而MRI又可进行除横断面以外的冠状面、矢状面或其它任意切面检查&#xff0c;其图像清晰&#xff0c;故其特别适用于腹膜后肿瘤的术前检查。早期经验显示MRI可提供比&#xff23;&#xff34;更多的信息&#xff0c;不用造影剂术前即…...

CSS3 圆角:实现与优化指南

CSS3 圆角&#xff1a;实现与优化指南 随着网页设计的发展&#xff0c;CSS3 圆角已经成为了现代网页设计中不可或缺的元素之一。本文将详细讲解 CSS3 圆角的基本用法、实现方式以及优化技巧&#xff0c;帮助您在网页设计中更好地运用这一功能。 一、CSS3 圆角基本用法 1.1 基…...