RNN中遠距離時間步梯度消失問題及解決辦法

RNN中遠距離時間步梯度消失問題及解決辦法

  • RNN 遠距離時間步梯度消失問題
  • LSTM如何解決遠距離時間步梯度消失問題


RNN 遠距離時間步梯度消失問題

經典的RNN結構如下圖所示:
在這里插入圖片描述
假設我們的時間序列只有三段, S 0 S_{0} S0? 為給定值,神經元沒有激活函數,則RNN最簡單的前向傳播過程如下:

S 1 = W x X 1 + W s S 0 + b 1 , O 1 = W 0 S 1 + b 2 S_{1} = W_{x} X_{1} + W_{s}S_{0} + b_{1},O_{1} = W_{0} S_{1} + b_{2} S1?=Wx?X1?+Ws?S0?+b1?O1?=W0?S1?+b2?

S 2 = W x X 2 + W s S 1 + b 1 , O 2 = W 0 S 2 + b 2 S_{2} = W_{x} X_{2} + W_{s}S_{1} + b_{1},O_{2} = W_{0} S_{2} + b_{2} S2?=Wx?X2?+Ws?S1?+b1?O2?=W0?S2?+b2?

S 3 = W x X 3 + W s S 2 + b 1 , O 3 = W 0 S 3 + b 2 S_{3} = W_{x} X_{3} + W_{s}S_{2} + b_{1},O_{3} = W_{0} S_{3} + b_{2} S3?=Wx?X3?+Ws?S2?+b1?O3?=W0?S3?+b2?

假設在 t = 3 t=3 t=3時刻,損失函數為 L 3 = 1 2 ( Y 3 ? O 3 ) 2 L_3 = \frac{1}{2}(Y_3 - O_3)^2 L3?=21?(Y3??O3?)2 。則對于一次訓練任務的損失函數為 L = ∑ t = 0 T L t L = \sum_{t=0}^{T} L_t L=t=0T?Lt? ,即每一時刻損失值的累加。

使用隨機梯度下降法訓練RNN其實就是對 W x W_x Wx? W s W_s Ws? W o W_o Wo? 以及 b 1 、 b 2 b_1 、 b_2 b1?b2? 求偏導,并不斷調整它們以使 L L L盡可能達到最小的過程。

現在假設我們我們的時間序列只有三段:t1,t2,t3。我們只對 t 3 t3 t3時刻的 W x W_x Wx? W s W_s Ws? W o W_o Wo? 求偏導(其他時刻類似):

? L 3 ? W 0 = ? L 3 ? O 3 ? O 3 ? W o = ? L 3 ? O 3 S 3 \frac{\partial L_3}{\partial W_0} = \frac{\partial L_3}{\partial O_3} \frac{\partial O_3}{\partial W_o} = \frac{\partial L_3}{\partial O_3} S_3 ?W0??L3??=?O3??L3???Wo??O3??=?O3??L3??S3?

? L 3 ? W x = ? L 3 ? O 3 ? O 3 ? S 3 ? S 3 ? W x + ? L 3 ? O 3 ? O 3 ? S 3 ? S 3 ? S 2 ? S 2 ? W x + ? L 3 ? O 3 ? O 3 ? S 3 ? S 3 ? S 2 ? S 2 ? S 1 ? S 1 ? W x = ? L 3 ? O 3 W 0 ( X 3 + S 2 W s + S 1 W s 2 ) \frac{\partial L_3}{\partial W_x} = \frac{\partial L_3}{\partial O_3} \frac{\partial O_3}{\partial S_3} \frac{\partial S_3}{\partial W_x} + \frac{\partial L_3}{\partial O_3} \frac{\partial O_3}{\partial S_3} \frac{\partial S_3}{\partial S_2} \frac{\partial S_2}{\partial W_x} + \frac{\partial L_3}{\partial O_3} \frac{\partial O_3}{\partial S_3} \frac{\partial S_3}{\partial S_2} \frac{\partial S_2}{\partial S_1} \frac{\partial S_1}{\partial W_x} = \frac{\partial L_3}{\partial O_3} W_0 (X_3 + S_2 W_s + S_1 W_s^2) ?Wx??L3??=?O3??L3???S3??O3???Wx??S3??+?O3??L3???S3??O3???S2??S3???Wx??S2??+?O3??L3???S3??O3???S2??S3???S1??S2???Wx??S1??=?O3??L3??W0?(X3?+S2?Ws?+S1?Ws2?)

? L 3 ? W s = ? L 3 ? O 3 ? O 3 ? S 3 ? S 3 ? W s + ? L 3 ? O 3 ? O 3 ? S 3 ? S 3 ? S 2 ? S 2 ? W s + ? L 3 ? O 3 ? O 3 ? S 3 ? S 3 ? S 2 ? S 2 ? S 1 ? S 1 ? W s = ? L 3 ? O 3 W 0 ( S 2 + S 1 W s + S 0 W s 2 ) \frac{\partial L_3}{\partial W_s} = \frac{\partial L_3}{\partial O_3} \frac{\partial O_3}{\partial S_3} \frac{\partial S_3}{\partial W_s} + \frac{\partial L_3}{\partial O_3} \frac{\partial O_3}{\partial S_3} \frac{\partial S_3}{\partial S_2} \frac{\partial S_2}{\partial W_s} + \frac{\partial L_3}{\partial O_3} \frac{\partial O_3}{\partial S_3} \frac{\partial S_3}{\partial S_2} \frac{\partial S_2}{\partial S_1} \frac{\partial S_1}{\partial W_s} = \frac{\partial L_3}{\partial O_3} W_0 (S_2 + S_1 W_s + S_0 W_s^2) ?Ws??L3??=?O3??L3???S3??O3???Ws??S3??+?O3??L3???S3??O3???S2??S3???Ws??S2??+?O3??L3???S3??O3???S2??S3???S1??S2???Ws??S1??=?O3??L3??W0?(S2?+S1?Ws?+S0?Ws2?)

關于上面這個多元復合函數鏈式求導過程,通過如下對變量層級樹的遍歷可以更加直觀理解這一點:
在這里插入圖片描述
可以看出對于 W o W_o Wo? 求偏導并沒有長期依賴,但是對于 W x W_x Wx? W s W_s Ws? 求偏導,會隨著時間序列產生長期依賴。因為 S t S_t St? 隨著時間序列向前傳播,而 S t S_t St? 又是 W x W_x Wx? W s W_s Ws? 的函數。

根據上述求偏導的過程,我們可以得出任意時刻對 W x W_x Wx? W s W_s Ws? 求偏導的公式:

? L t ? W x = ∑ k = 0 t ? L t ? O t ? O t ? S t ( ∏ j = k + 1 t ? S j ? S j ? 1 ) ? S k ? W x \frac{\partial L_t}{\partial W_x} = \sum_{k=0}^{t} \frac{\partial L_t}{\partial O_t} \frac{\partial O_t}{\partial S_t} \left(\prod_{j=k+1}^{t} \frac{\partial S_j}{\partial S_{j-1}}\right) \frac{\partial S_k}{\partial W_x} ?Wx??Lt??=k=0t??Ot??Lt???St??Ot?? ?j=k+1t??Sj?1??Sj?? ??Wx??Sk??

任意時刻對 W s W_s Ws? 求偏導的公式同上。

如果加上激活函數: S j = tanh ? ( W x X j + W s S j ? 1 + b 1 ) S_j = \tanh(W_x X_j + W_s S_{j-1} + b_1) Sj?=tanh(Wx?Xj?+Ws?Sj?1?+b1?)

∏ j = k + 1 t ? S j ? S j ? 1 = ∏ j = k + 1 t tanh ? ′ W s \prod_{j=k+1}^{t} \frac{\partial S_j}{\partial S_{j-1}} = \prod_{j=k+1}^{t} \tanh' W_s j=k+1t??Sj?1??Sj??=j=k+1t?tanhWs?

加上激活函數tanh復合后的多元鏈式求導過程如下圖所示:

在這里插入圖片描述

激活函數tanh和它的導數圖像如下。

在這里插入圖片描述

由上圖可以看出 tanh ? ′ ≤ 1 \tanh' \leq 1 tanh1,對于訓練過程大部分情況下tanh的導數是小于1的,因為很少情況下會出現 W x X j + W s S j ? 1 + b 1 = 0 W_x X_j + W_s S_{j-1} + b_1 = 0 Wx?Xj?+Ws?Sj?1?+b1?=0,如果 W s W_s Ws? 也是一個大于0小于1的值,則當t很大時 ∏ j = k + 1 t tanh ? ′ W s \prod_{j=k+1}^{t} \tanh' W_s j=k+1t?tanhWs?,就會趨近于0,和 0.0 1 50 0.01^{50} 0.0150 趨近于0是一個道理。同理當 W s W_s Ws? 很大時 ∏ j = k + 1 t tanh ? ′ W s \prod_{j=k+1}^{t} \tanh' W_s j=k+1t?tanhWs? 就會趨近于無窮,這就是RNN中梯度消失和爆炸的原因。

至于怎么避免這種現象,再看看 ? L t ? W x = ∑ k = 0 t ? L t ? O t ? O t ? S t ( ∏ j = k + 1 t ? S j ? S j ? 1 ) ? S k ? W x \frac{\partial L_t}{\partial W_x} = \sum_{k=0}^{t} \frac{\partial L_t}{\partial O_t} \frac{\partial O_t}{\partial S_t} \left(\prod_{j=k+1}^{t} \frac{\partial S_j}{\partial S_{j-1}}\right) \frac{\partial S_k}{\partial W_x} ?Wx??Lt??=k=0t??Ot??Lt???St??Ot?? ?j=k+1t??Sj?1??Sj?? ??Wx??Sk?? 梯度消失和爆炸的根本原因就是 ∏ j = k + 1 t ? S j ? S j ? 1 \prod_{j=k+1}^{t} \frac{\partial S_j}{\partial S_{j-1}} j=k+1t??Sj?1??Sj?? 這一坨,要消除這種情況就需要把這一坨在求偏導的過程中去掉,至于怎么去掉,一種辦法就是使 ? S j ? S j ? 1 ≈ 1 \frac{\partial S_j}{\partial S_{j-1}} \approx 1 ?Sj?1??Sj??1 另一種辦法就是使 ? S j ? S j ? 1 ≈ 0 \frac{\partial S_j}{\partial S_{j-1}} \approx 0 ?Sj?1??Sj??0。其實這就是LSTM做的事情。

總結:

  • RNN 的梯度計算涉及到對激活函數的導數以及權重矩陣的連乘

    • 以 sigmoid 函數為例,其導數的值域在 0 到 0.25 之間,當進行多次連乘時,這些較小的值相乘會導致梯度迅速變小。
    • 如果權重矩陣的特征值也小于 1,那么在多個時間步的傳遞過程中,梯度就會呈指數級下降,導致越靠前的時間步,梯度回傳的值越少。
  • 由于梯度消失,靠前時間步的參數更新幅度會非常小,甚至幾乎不更新。這使得模型難以學習到序列數據中長距離的依賴關系,對于較早時間步的信息利用不足,從而影響模型的整體性能和對序列數據的建模能力。

注意 : 注意: 注意:

RNN梯度爆炸好理解,就是 ? L t ? W x \frac{\partial L_t}{\partial W_x} ?Wx??Lt??梯度數值發散,甚至慢慢就NaN了;

那梯度消失就是 ? L t ? W x \frac{\partial L_t}{\partial W_x} ?Wx??Lt??梯度變成零嗎?

并不是,我們剛剛說梯度消失是 ∣ ? S j ? S j ? 1 ∣ \left|\frac{\partial S_j}{\partial S_{j-1}}\right| ??Sj?1??Sj?? ? 一直小于1,歷史梯度不斷衰減,但不意味著總的梯度就為0了。RNN中梯度消失的含義是距離當前時間步越長,那么其反饋的梯度信號越不顯著,最后可能完全沒有起作用,這就意味著RNN對長距離語義的捕捉能力失效了

說白了,你優化過程都跟長距離的反饋沒關系,怎么能保證學習出來的模型能有效捕捉長距離呢?

再次通俗解釋一下RNN梯度消失,其指的不是 ? L t ? W x \frac{\partial L_t}{\partial W_x} ?Wx??Lt??梯度值接近于0,而是靠前時間步的梯度 ? L 3 ? O 3 ? O 3 ? S 3 ? S 3 ? S 2 ? S 2 ? S 1 ? S 1 ? W x \frac{\partial L_3}{\partial O_3} \frac{\partial O_3}{\partial S_3} \frac{\partial S_3}{\partial S_2} \frac{\partial S_2}{\partial S_1} \frac{\partial S_1}{\partial W_x} ?O3??L3???S3??O3???S2??S3???S1??S2???Wx??S1??值算出來很小,也就是靠前時間步計算出來的結果對序列最后一個預測詞的生成影響很小,也就是常說的RNN難以去建模長距離的依賴關系的原因;這并不是因為序列靠前的詞對最后一個詞的預測輸出不重要,而是由于損失函數在把有用的梯度更新信息反向回傳的過程中,被若干小于0的偏導連乘給一點點削減掉了。


LSTM如何解決遠距離時間步梯度消失問題

在這里插入圖片描述

LSTM的更新公式比較復雜,它是:

f t = σ ( W f x t + U f h t ? 1 + b f ) f_t = \sigma (W_f x_t + U_f h_{t-1} + b_f) ft?=σ(Wf?xt?+Uf?ht?1?+bf?)
i t = σ ( W i x t + U i h t ? 1 + b i ) i_t = \sigma (W_i x_t + U_i h_{t-1} + b_i) it?=σ(Wi?xt?+Ui?ht?1?+bi?)
o t = σ ( W o x t + U o h t ? 1 + b o ) o_t = \sigma (W_o x_t + U_o h_{t-1} + b_o) ot?=σ(Wo?xt?+Uo?ht?1?+bo?)
c ^ t = tanh ? ( W c x t + U c h t ? 1 + b c ) \hat{c}_t = \tanh (W_c x_t + U_c h_{t-1} + b_c) c^t?=tanh(Wc?xt?+Uc?ht?1?+bc?)
c t = f t ° c t ? 1 + i t ° c ^ t c_t = f_t \circ c_{t-1} + i_t \circ \hat{c}_t ct?=ft?°ct?1?+it?°c^t?
h t = o t ° tanh ? ( c t ) h_t = o_t \circ \tanh(c_t) \qquad ht?=ot?°tanh(ct?)

我們可以像上面一樣計算 ? h t ? h t ? 1 \frac{\partial h_t}{\partial h_{t-1}} ?ht?1??ht??,但從 h t = o t ° tanh ? ( c t ) h_t = o_t \circ \tanh(c_t) ht?=ot?°tanh(ct?) 可以看出分析 c t c_t ct? 就等價于分析 h t h_t ht?,而計算 ? c t ? c t ? 1 \frac{\partial c_t}{\partial c_{t-1}} ?ct?1??ct?? 顯得更加簡單一些,因此我們往這個方向走。

同樣地,我們先只關心1維的情形,這時候根據求導公式,我們有

? c t ? c t ? 1 = f t + c t ? 1 ? f t ? c t ? 1 + c ^ t ? i t ? c t ? 1 + i t ? c ^ t ? c t ? 1 \frac{\partial c_t}{\partial c_{t-1}} = f_t + c_{t-1} \frac{\partial f_t}{\partial c_{t-1}} + \hat{c}_t \frac{\partial i_t}{\partial c_{t-1}} + i_t \frac{\partial \hat{c}_t}{\partial c_{t-1}} \qquad ?ct?1??ct??=ft?+ct?1??ct?1??ft??+c^t??ct?1??it??+it??ct?1??c^t??

右端第一項 f t f_t ft?,也就是我們所說的“遺忘門”,從下面的論述我們可以知道一般情況下其余三項都是次要項,因此 f t f_t ft? 是“主項”,由于 f t f_t ft? 在0~1之間,因此就意味著梯度爆炸的風險將會很小,至于會不會梯度消失,取決于 f t f_t ft? 是否接近于1。但非常碰巧的是,這里有個相當自洽的結論:如果我們的任務比較依賴于歷史信息,那么 f t f_t ft? 就會接近于1,這時候歷史的梯度信息也正好不容易消失;如果 f t f_t ft? 很接近于0,那么就說明我們的任務不依賴于歷史信息,這時候就算梯度消失也無妨了

所以,現在的關鍵就是看“其余三項都是次要項”這個結論能否成立。后面的三項都是“一項乘以另一項的偏導”的形式,而且求偏導的項都是 σ \sigma σ tanh ? \tanh tanh激活, σ \sigma σ tanh ? \tanh tanh的偏導公式基本上是等價的,它們的導數均可以用它們自身來表示:

tanh ? x = 2 σ ( 2 x ) ? 1 \tanh x = 2\sigma(2x) - 1 tanhx=2σ(2x)?1
σ ( x ) = 1 2 ( tanh ? x 2 + 1 ) \sigma(x) = \frac{1}{2} \left( \tanh \frac{x}{2} + 1 \right) \qquad σ(x)=21?(tanh2x?+1)
( tanh ? x ) ′ = 1 ? tanh ? 2 x (\tanh x)' = 1 - \tanh^2 x (tanhx)=1?tanh2x
σ ′ ( x ) = σ ( x ) ( 1 ? σ ( x ) ) \sigma'(x) = \sigma(x) (1 - \sigma(x)) σ(x)=σ(x)(1?σ(x))

其中 σ ( x ) = 1 / ( 1 + e ? x ) \sigma(x) = 1/(1 + e^{-x}) σ(x)=1/(1+e?x) 是sigmoid函數。

因此后面三項是類似的,分析了其中一項就相當于分析了其余兩項。以第二項為例,代入 h t ? 1 = o t ? 1 tanh ? ( c t ? 1 ) h_{t-1} = o_{t-1} \tanh(c_{t-1}) ht?1?=ot?1?tanh(ct?1?),可以算得

c t ? 1 ? f t ? c t ? 1 = f t ( 1 ? f t ) o t ? 1 ( 1 ? tanh ? 2 c t ? 1 ) c t ? 1 U f c_{t-1} \frac{\partial f_t}{\partial c_{t-1}} = f_t (1 - f_t) o_{t-1} (1 - \tanh^2 c_{t-1}) c_{t-1} U_f \qquad ct?1??ct?1??ft??=ft?(1?ft?)ot?1?(1?tanh2ct?1?)ct?1?Uf?

注意到 f t , 1 ? f t , o t ? 1 f_t, 1 - f_t, o_{t-1} ft?,1?ft?,ot?1?都是在0~1之間,也可以證明 ∣ ( 1 ? tanh ? 2 c t ? 1 ) c t ? 1 ∣ < 0.45 |(1 - \tanh^2 c_{t-1}) c_{t-1}| < 0.45 (1?tanh2ct?1?)ct?1?<0.45,因此它也在-1~1之間。所以 c t ? 1 ? f t ? c t ? 1 c_{t-1} \frac{\partial f_t}{\partial c_{t-1}} ct?1??ct?1??ft??就相當于1個 U f U_f Uf?乘上4個門,結果會變得更加小,所以只要初始化不是很糟糕,那么它都會被壓縮得相當小,因此占不到主導作用。

剩下兩項的結論也是類似的:

c ^ t ? i t ? c t ? 1 = i t ( 1 ? i t ) o t ? 1 ( 1 ? tanh ? 2 c t ? 1 ) c ^ t U i \hat{c}_t \frac{\partial i_t}{\partial c_{t-1}} = i_t (1 - i_t) o_{t-1} (1 - \tanh^2 c_{t-1}) \hat{c}_t U_i \qquad c^t??ct?1??it??=it?(1?it?)ot?1?(1?tanh2ct?1?)c^t?Ui?

i t ? c ^ t ? c t ? 1 = ( 1 ? c ^ t 2 ) o t ? 1 ( 1 ? tanh ? 2 c t ? 1 ) i t U c i_t \frac{\partial \hat{c}_t}{\partial c_{t-1}} = (1 - \hat{c}_t^2) o_{t-1} (1 - \tanh^2 c_{t-1}) i_t U_c it??ct?1??c^t??=(1?c^t2?)ot?1?(1?tanh2ct?1?)it?Uc?

所以,后面三項的梯度帶有更多的“門”,一般而言乘起來后會被壓縮的更厲害,因此占主導的項還是 f t f_t ft? f t f_t ft? 在0~1之間這個特性決定了它梯度爆炸的風險很小,同時 f t f_t ft? 表明了模型對歷史信息的依賴性,也正好是歷史梯度的保留程度,兩者相互自洽,所以LSTM也能較好地緩解梯度消失問題。因此,LSTM同時較好地緩解了梯度消失/爆炸問題,現在我們訓練LSTM時,多數情況下只需要直接調用Adam等自適應學習率優化器,不需要人為對梯度做什么調整了。


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

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

相關文章

Tomcat理論(Ⅰ)

目錄 服務器流程圖一覽 一、JavaWeb前奏(了解) 1. C/S結構 2. B/S結構 3. 靜態網頁&動態網頁 4.常見的網頁 5.Web服務器 知名服務器&#xff1a; ?編輯 二、Tomcat安裝&#xff08;熟練&#xff09; 1.Tomcat概述 2.Tomcat的作用 3.Tomcat安裝 4.Tomcat測試 3.…

如何使用 DeepSeek R1 構建開源 ChatGPT Operator 替代方案

開源大型語言模型&#xff08;LLMs&#xff09;的興起使得創建 AI 驅動的工具比以往任何時候都更容易&#xff0c;這些工具可以與 OpenAI 的 ChatGPT Operator 等專有解決方案相媲美。在這些開源模型中&#xff0c;DeepSeek R1 以其強大的推理能力、自由的可訪問性和適應性而脫…

使用Docker Desktop部署GitLab

1. 環境準備 確保Windows 10/11系統支持虛擬化技術&#xff08;需在BIOS中開啟Intel VT-x/AMD-V&#xff09;內存建議≥8GB&#xff0c;存儲空間≥100GB 2. 安裝Docker Desktop 訪問Docker官網下載安裝包安裝時勾選"Use WSL 2 instead of Hyper-V"&#xff08;推薦…

【復習】Java集合

集合概念 集合與數組 數組是固定長度&#xff1b;集合是動態長度的數據結構&#xff0c;需要動態增加或刪除元素 數組可以包含基本數據類型和對象&#xff1b;集合只能包含對象 數組可以直接訪問元素&#xff1b;集合需要通過迭代器訪問元素 線程安全的集合&#xff1f; …

vue3 文件類型傳Form Data數據格式給后端

在 Vue 3 中&#xff0c;如果你想將文件&#xff08;例如上傳的 Excel 文件&#xff09;以 FormData 格式發送到后端&#xff0c;可以通過以下步驟實現。這種方式通常用于處理文件上傳&#xff0c;因為它可以將文件和其他數據一起發送到服務器。 首先&#xff0c;創建一個 Vue…

使用 INFINI Console 配置集群監控 Webhook 通知指南

在集群管理中&#xff0c;監控關鍵指標如CPU、內存、磁盤、JVM等是至關重要的。對于Easysearch及ES生態系統&#xff0c;還需要關注集群本身的指標&#xff0c;例如搜索延遲、集群狀態、節點移除等。INFINI Console不僅提供了默認的監控指標&#xff0c;還支持用戶自定義監控項…

WPF的頁面設計和實用功能實現

目錄 一、TextBlock和TextBox 1. 在TextBlock中實時顯示當前時間 二、ListView 1.ListView顯示數據 三、ComboBox 1. ComboBox和CheckBox組合實現下拉框多選 四、Button 1. 設計Button按鈕的邊框為圓角&#xff0c;并對指針懸停時的顏色進行設置 一、TextBlock和TextBox…

二級公共基礎之數據結構與算法篇(八)排序技術

目錄 前言 一、交換類排序 1.冒泡排序法 1. 冒泡排序的思想 2. 冒泡排序的實現步驟 3. 示例 4. 冒泡排序的特點 2.快速排序 1. 快速排序的核心思想 2. 快速排序的實現步驟 3. 示例代碼(C語言) 4. 快速排序的特點 二、插入類排序 1. 簡單插入排序 1.簡單插入排…

記錄一次 ALG 的處理過程

前幾天朋友找我幫忙&#xff0c;說碰到很大困難了&#xff0c;實際上&#xff0c;不過如此 現象是這樣的&#xff1a; FreeSWITCH mod_unimrcp 工作不正常 FS 和 mrcp-server 兩邊同時抓包&#xff0c;看到的是&#xff1a; sip 流程正常 FS TCP 連接到 mccp-server 失敗&…

【Linux網絡編程】IP協議格式,解包步驟

目錄 解析步驟 1.版本字段&#xff08;大小&#xff1a;4比特位&#xff09; 2.首部長度&#xff08;大小&#xff1a;4比特位&#xff09;&#xff08;單位&#xff1a;4字節&#xff09; &#x1f35c;細節解釋&#xff1a; 3.服務類型&#xff08;大小&#xff1a;8比特…

CSDN文章質量分查詢系統【贈python爬蟲、提分攻略】

CSDN文章質量分查詢系統 https://www.csdn.net/qc 點擊鏈接-----> CSDN文章質量分查詢系統 <------點擊鏈接 點擊鏈接-----> https://www.csdn.net/qc <------點擊鏈接 點擊鏈接-----> CSDN文章質量分查詢系統 <------點擊鏈接 點擊鏈…

HTML應用指南:利用GET請求獲取全國瀘溪河門店位置信息

隨著新零售業態的快速發展,門店位置信息的獲取變得越來越重要。作為新興烘焙品牌之一,瀘溪河自2013年在南京創立以來,一直堅持“健康美味,香飄世界”的企業使命,以匠人精神打造新中式糕點。為了更好地理解和利用這些數據,本篇文章將深入探討GET請求的實際應用,并展示如何…

如何在 React 中測試高階組件?

在 React 中測試高階組件可以采用多種策略&#xff0c;以下是常見的測試方法&#xff1a; 1. 測試高階組件返回的組件 高階組件本身是一個函數&#xff0c;它返回一個新的組件。因此&#xff0c;可以通過測試這個返回的組件來間接測試高階組件的功能。通常使用 Jest 作為測試…

R語言Stan貝葉斯空間條件自回歸CAR模型分析死亡率多維度數據可視化

全文鏈接&#xff1a;https://tecdat.cn/?p40424 在空間數據分析領域&#xff0c;準確的模型和有效的工具對于研究人員至關重要。本文為區域數據的貝葉斯模型分析提供了一套完整的工作流程&#xff0c;基于Stan這一先進的貝葉斯建模平臺構建&#xff0c;幫助客戶為空間分析帶來…

Casbin 權限管理介紹及在 Go 語言中的使用入門

引言 在現代軟件開發過程中&#xff0c;權限管理是一個至關重要的環節&#xff0c;它關系到系統的安全性和用戶體驗。Casbin 是一個強大的訪問控制庫&#xff0c;支持多種訪問控制模型&#xff0c;如 ACL&#xff08;訪問控制列表&#xff09;、RBAC&#xff08;基于角色的訪問…

快速入門——第三方組件element-ui

學習自嗶哩嗶哩上的“劉老師教編程”&#xff0c;具體學習的網站為&#xff1a;10.第三方組件element-ui_嗶哩嗶哩_bilibili&#xff0c;以下是看課后做的筆記&#xff0c;僅供參考。 第一節 組件間的傳值 組件可以有內部Data提供數據&#xff0c;也可由父組件通過prop方式傳…

【算法通關村 Day7】遞歸與二叉樹遍歷

遞歸與二叉樹遍歷青銅挑戰 理解遞歸 遞歸算法是指一個方法在其執行過程中調用自身。它通常用于將一個問題分解為更小的子問題&#xff0c;通過重復調用相同的方法來解決這些子問題&#xff0c;直到達到基準情況&#xff08;終止條件&#xff09;。 遞歸算法通常包括兩個主要…

樸素貝葉斯法

文章目錄 貝葉斯定理樸素貝葉斯法的學習與分類條件獨立假設樸素貝葉斯的后驗概率最大化準則樸素貝葉斯的基本公式 樸素貝葉斯法的參數估計極大似然估計 貝葉斯定理 前置知識&#xff1a;條件概率、全概率、貝葉斯公式 推薦視頻&#xff0c;看完視頻后搜索博客了解先驗概率、后…

《A++ 敏捷開發》- 20 從 AI 到最佳設計

“我們現在推行AIGC&#xff0c;服務端不需要UI交互設計的用AI自動產出代碼&#xff0c;你建議的結對編程、TDD等是否還適用&#xff1f;” 這兩年AI確實很火&#xff0c;是報紙、雜志的熱門話題。例如&#xff0c;HBR雜志從2024年9月至2025年二月份3期&#xff0c;里面有接近一…

GO系列-IO 文件操作

os io 判斷文件是否存在 func fileExist(filePath string) (bool, error) {_, err : os.Stat(filePath)if err nil {return true, nil}if os.IsNotExist(err) {return false, nil}return false, &CheckFileExistError{filePath} } 讀取文件內容 func readFileContext(…