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) (m?n)×(m?n) ) 的大矩陣,直接計算很麻煩。K-FAC觀察到,神經網絡的梯度可以分解為輸入和輸出的貢獻,于是近似為:

I l ≈ A l ? G l I_l \approx A_l \otimes G_l Il?Al??Gl?

  • ( 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?=Al??Gl? ),其逆可以通過小矩陣的逆計算:

I l ? 1 = A l ? 1 ? G l ? 1 I_l^{-1} = A_l^{-1} \otimes G_l^{-1} Il?1?=Al?1??Gl?1?

  • ( 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) (m?n)×(m?n) ) 矩陣的 ( 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 m?n ),節省巨大。


K-FAC的數學細節

假設第 ( l l l ) 層的輸出為 ( a l = W l h l ? 1 a_l = W_l h_{l-1} al?=Wl?hl?1? )(( h l ? 1 h_{l-1} hl?1? ) 是前一層激活),損失為 ( 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(?al??L?hl?1T?)vec(?al??L?hl?1T?)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 Il?E[hl?1?hl?1T?]?E[?al??L??al??L?T]=Al??Gl?

  • ( A l = E [ h l ? 1 h l ? 1 T ] A_l = E[h_{l-1} h_{l-1}^T] Al?=E[hl?1?hl?1T?] ):輸入協方差。
  • ( 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[?al??L??al??L?T] ):輸出梯度協方差。

自然梯度更新變成:

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?)=(Al?1??Gl?1?)vec(?Wl??L?)

實際中,( 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 Wl?WlT?=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 Il?Al??Gl? )。


什么是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 A?G ) 是一個 ( ( m ? n ) × ( m ? n ) (m \cdot n) \times (m \cdot n) (m?n)×(m?n) ) 的矩陣,定義為:

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} A?G= ?a11?Ga21?G?am1?G?a12?Ga22?G?am2?G??????a1m?Ga2m?G?amm?G? ?

其中,( 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 aij?G )。

通俗解釋

想象你在做一個拼圖,( 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) (m?n)×(m?n) )。

例子

假設 ( A = [ 1 2 3 4 ] A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} A=[13?24?] )(2×2),( G = [ 0 1 1 0 ] G = \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix} G=[01?10?] )(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} A?G= ?1?[01?10?]3?[01?10?]?2?[01?10?]4?[01?10?]? ?

= [ 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} = ?0103?1030?0204?2040? ?

結果是一個 4×4 矩陣(( 2 ? 2 × 2 ? 2 2 \cdot 2 \times 2 \cdot 2 2?2×2?2 ))。


K-FAC為何用Kronecker乘積近似?

現在我們來看K-FAC為什么觀察到神經網絡的梯度可以分解為輸入和輸出的貢獻,并用 ( I l ≈ A l ? G l I_l \approx A_l \otimes G_l Il?Al??Gl? ) 來近似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?=Wl?hl?1? )(( h l ? 1 h_{l-1} hl?1? ) 是前一層激活),損失為 ( 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(?al??L?hl?1T?)vec(?al??L?hl?1T?)T]

這里:

  • ( ? L ? a l \frac{\partial L}{\partial a_l} ?al??L? ) 是損失對輸出的梯度(大小為 ( n × 1 n \times 1 n×1 ))。
  • ( h l ? 1 h_{l-1} hl?1? ) 是輸入激活(大小為 ( m × 1 m \times 1 m×1 ))。
  • ( ? L ? a l h l ? 1 T \frac{\partial L}{\partial a_l} h_{l-1}^T ?al??L?hl?1T? ) 是 ( 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) (m?n)×(m?n) ) 的。

直接計算這個期望需要存儲和操作一個巨大矩陣,復雜度為 ( 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 ?Wl??L?=?al??L?hl?1T? ) 天然具有“輸入”和“輸出”的分離結構:

  • 輸入貢獻:( h l ? 1 h_{l-1} hl?1? ) 是前一層的激活,決定了梯度的“空間結構”。
  • 輸出貢獻:( ? L ? a l \frac{\partial L}{\partial a_l} ?al??L? ) 是當前層的輸出梯度,決定了梯度的“強度”。

這兩個部分是外積(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] Il?E[hl?1?hl?1T?]?E[?al??L??al??L?T]

  • ( A l = E [ h l ? 1 h l ? 1 T ] A_l = E[h_{l-1} h_{l-1}^T] Al?=E[hl?1?hl?1T?] ):輸入激活的協方差矩陣(( m × m m \times m m×m )),捕捉了 ( h l ? 1 h_{l-1} hl?1? ) 的統計特性。
  • ( 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[?al??L??al??L?T] ):輸出梯度的協方差矩陣(( n × n n \times n n×n )),捕捉了后續層反饋的統計特性。

為什么用Kronecker乘積 ( ? \otimes ? )?因為梯度 ( ? L ? W l \frac{\partial L}{\partial W_l} ?Wl??L? ) 是一個矩陣,其向量化形式 ( vec ( ? L ? W l ) \text{vec}(\frac{\partial L}{\partial W_l}) vec(?Wl??L?) ) 的協方差天然可以用輸入和輸出的外積結構表示。Kronecker乘積正好能將 ( A l A_l Al? ) 和 ( G l G_l Gl? ) “組合”成一個 ( ( m ? n ) × ( m ? n ) (m \cdot n) \times (m \cdot n) (m?n)×(m?n) ) 的矩陣,與 ( I l I_l Il? ) 的維度一致。

為什么這個近似合理?
  1. 結構假設

    • 神經網絡的分層設計讓輸入 ( h l ? 1 h_{l-1} hl?1? ) 和輸出梯度 ( ? L ? a l \frac{\partial L}{\partial a_l} ?al??L? ) 在統計上相對獨立。
    • 這種分解假設 ( h l ? 1 h_{l-1} hl?1? ) 和 ( ? L ? a l \frac{\partial L}{\partial a_l} ?al??L? ) 的相關性主要通過外積體現,忽略了更高階的交叉項。
  2. 維度匹配

    • ( A l ? G l A_l \otimes G_l Al??Gl? ) 生成一個 ( ( m ? n ) × ( m ? n ) (m \cdot n) \times (m \cdot n) (m?n)×(m?n) ) 矩陣,與 ( 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 ?Wl??L?=?al??L?hl?1T? ) 是一個外積形式,這種結構啟發我們分開考慮:

  • 輸入端(( h l ? 1 h_{l-1} hl?1? )):它來自前一層,反映了數據的空間分布(如激活的協方差)。
  • 輸出端(( ? L ? a l \frac{\partial L}{\partial a_l} ?al??L? )):它來自后續層,反映了損失對當前輸出的敏感度。

在神經網絡中,梯度本質上是“輸入”和“輸出”交互的結果。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) (m?n)×(m?n) ) 矩陣問題,簡化成了兩個小矩陣的操作,既高效又實用。

后記

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71982.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71982.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71982.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【HTML— 快速入門】HTML 基礎

準備工作 vscode下載 百度網盤 Subline Text 下載 Sublime Text下載 百度網盤 vscode 下載 Sublime Text 是一款輕量好用的文本編輯器,我們在寫前端代碼時,使用 Sublime Text 打開比使用記事本打開,得到的代碼體驗更好,比 vscode…

鴻蒙開發深入淺出01(基本環境搭建、頁面模板與TabBar)

鴻蒙開發深入淺出01(基本環境搭建、頁面模板與TabBar) 1、效果展示2、下載 DevEco Studio3、創建項目4、新建頁面模板5、更改應用信息6、新建以下頁面7、Index.ets8、真機運行9、圖片資源文件 1、效果展示 2、下載 DevEco Studio 訪問官網根據自己的版本…

自動駕駛泊車算法詳解(一)

自動駕駛泊車算法是自動駕駛技術中的重要組成部分,主要用于實現車輛在復雜場景下的自動泊車功能(如垂直泊車、側方位泊車、斜列泊車等)。其核心目標是通過感知、規劃和控制技術,使車輛在無人工干預的情況下安全、高效地完成泊車動…

鴻蒙next 點擊穿透實現

點擊穿透可以參考華為開發的保留文章,該章節只能在developer preview版本下查看 點擊穿透 主要的方法是hitTestBehavior // xxx.ets Entry Component struct HitTestBehaviorExample {build() {// outer stackStack() {Button(outer button).onTouch((event) > {console.i…

27.[前端開發-JavaScript基礎]Day04-函數基本使用-遞歸-變量作用域-函數式編程

一、JavaScript函數 1 認識JavaScript函數 程序中的foo、bar、baz 認識函數 函數使用的步驟 2 函數的聲明和調用 聲明和調用函數 函數的參數 有參數的函數練習 函數的返回值 函數的練習 arguments參數(JS高級再學習) 3 函數的遞歸調用 函數中調用函數…

藍橋杯練習代碼

一、最長公共前綴 編寫一個函數來查找字符串數組中的最長公共前綴。 如果不存在公共前綴,返回空字符串 ""。 示例 1: 輸入:strs = ["flower","flow","flight"] 輸出:"fl"示例 2: 輸入:strs = ["dog",&q…

添加成對約束后的標簽傳播算法研究:使用Python語言編寫算法,在空手道數據集下驗證算法的準確性,在一定程度上解決非對齊問題

背景: 輔導的過程中遇到了一個比較新穎的問題,下面是我對這個問題的分析和簡要思路介紹。 思路分析: 這算機器學習下面的無監督學習,標簽傳播算法簡稱LPA,傳統的標簽傳播算法會出現非對齊問題,一句話描述就…

鴻蒙開發第4篇__關于在鴻蒙應用中使用Java語言進行設計

本博文很重要 HarmonyOS從 API8 開始不再支持使用Java作為開發語言,未來的新功能將在ArkTS中實現. API 8對應的是HarmonyOS 3.0.0版本。請看下圖: 因此, 讀者如果看到類似《鴻蒙應用程序開發》(2021年版本 清華大學出版計)書 還使用Java語言…

sklearn機器學習 Python代碼通用模板

以下是一個使用 scikit-learn(sklearn)進行機器學習的通用 Python 代碼模板。這個模板涵蓋了數據加載、預處理、模型訓練、評估和預測的基本流程,適用于常見的機器學習任務。 python # 導入必要的庫 import numpy as np import pandas as …

P9420 [藍橋杯 2023 國 B] 雙子數--最高效的質數篩【埃拉托斯特尼篩法】

P9420 [藍橋杯 2023 國 B] 雙子數 題目 分析代碼 題目 分析 首先&#xff0c;我們如何找到雙子數&#xff1f; 1&#xff09;找到所有質數滿足范圍內的質數&#xff08;即至少質數^2<23333333333333) 我們看見雙子數x的范圍2333<x<23333333333333&#xff0c;又因為…

deepseek 導出導入模型(docker)

前言 實現導出導入deepseek 模型。deepseek 安裝docker下參考 docker 導出模型 實際生產環境建議使用docker-compose.yml進行布局&#xff0c;然后持久化ollama模型數據到本地參考 echo "start ollama" docker start ollama#壓縮容器內文件夾&#xff0c;然后拷貝…

mysql有索引但是查詢沒有使用索引是什么問題

關鍵原因分析 索引選擇性問題 如果 order_id 沒有索引&#xff0c;即使 insert_time 有索引&#xff0c;優化器可能認為先通過 order_id 過濾數據更高效。但由于 order_id 無索引&#xff0c;只能全表掃描后過濾。即使 insert_time 有索引&#xff0c;如果滿足 insert_time >…

【Qt】為程序增加閃退crash報告日志

背景 隨著軟件代碼量的增加&#xff0c;軟件崩潰閃退的肯能行越來越大&#xff0c;其中一些是難以復現的&#xff0c;比如訪問了訪問了非法地址、被操作系統殺死等。 為此&#xff0c;在軟件出現閃退情況時&#xff0c;盡可能多的記錄閃退發生時信息&#xff0c;對排查閃退原…

C#從入門到精通(35)—如何防止winform程序因為誤操作被關閉

前言: 大家好,我是上位機馬工,碩士畢業4年年入40萬,目前在一家自動化公司擔任軟件經理,從事C#上位機軟件開發8年以上!我們在開發的上位機軟件運行起來以后,一般在右上角都有一個關閉按鈕,正常情況下點擊關閉按鈕就能關閉軟件,但是不排除我們不想關閉軟件,但是因為不…

ffmpeg avdevice_register_all 注冊設備的作用

在 FFmpeg 中&#xff0c;avdevice_register_all() 是一個用于注冊所有輸入和輸出設備的函數。它是 FFmpeg 的 libavdevice 模塊的一部分&#xff0c;專門用于處理音頻和視頻的輸入/輸出設備&#xff08;如攝像頭、麥克風、屏幕捕獲等&#xff09;。 以下是對 avdevice_regist…

[RH342]tcpdump

[RH342]tcpdump 1. 題目2. 解題 1. 題目 服務器serverc 和 servera 之間有進程定期發送一個明文密碼,找出它2. 解題 找出通信端口 抓包分析 tcpdump -X -vv port 6644紅框中就是密碼,所以密碼是root123

連接Sql Server時報錯無法通過使用安全套接字層加密與 SQL Server 建立安全連接

文章目錄 一. 前言二. 解決方案 方案1方案2 三. 總結 一. 前言 在《數據庫原理》這門課的實驗上&#xff0c;需要使用SQL Server&#xff0c;然后使用jdbc連接sql server突然報錯為&#xff1a;SQLServerException: “Encrypt”屬性設置為“true”且 “trustServerCertific…

從 Spring Boot 2 升級到 Spring Boot 3 的終極指南

一、升級前的核心準備 1. JDK 版本升級 Spring Boot 3 強制要求 Java 17 及以上版本。若當前項目使用 Java 8 或 11&#xff0c;需按以下步驟操作&#xff1a; 安裝 JDK 17&#xff1a;從 Oracle 或 OpenJDK 官網下載&#xff0c;配置環境變量&#xff08;如 JAVA_HOME&…

Buildroot 添加自定義模塊-內置文件到文件系統

目錄 概述實現步驟1. 創建包目錄和文件結構2. 配置 Config.in3. 定義 cp_bin_files.mk4. 添加源文件install.shmy.conf 5. 配置與編譯 概述 Buildroot 是一個高度可定制和模塊化的嵌入式 Linux 構建系統&#xff0c;適用于從簡單到復雜的各種嵌入式項目. buildroot的源碼中bui…

物聯網通信應用案例之《智慧農業》

案例概述 在智慧農業方面&#xff0c;一般的應用場景為可以自動檢測溫度濕度等一系列環境情況并且可以自動做出相應的處理措施如簡單的澆水和溫度控制等&#xff0c;且數據情況可遠程查看&#xff0c;以及用戶可以實現遠程控制。 基本實現原理 傳感器通過串口將數據傳遞到Wi…