一文深入了解DeepSeek-R1:模型架構

本文深入探討了 DeepSeek-R1 模型架構。讓我們從輸入到輸出追蹤 DeepSeek-R1 模型,以找到架構中的新發展和關鍵部分。DeepSeek-R1 基于 DeepSeek-V3-Base 模型架構。本文旨在涵蓋其設計的所有重要方面。

📝 1. 輸入上下文長度

DeepSeek-R1的輸入上下文長度為128K。

DeepSeek-R1 從其基礎模型 DeepSeek-V3-Base 繼承了 128K 上下文長度。最初,DeepSeek-V3 使用 4K 上下文長度進行預訓練。然后,利用 YaRN 技術,兩階段上下文長度擴展首先將其增加到 32K,然后增加到 128K。

YaRN(另一種 RoPE 擴展方法)是一種旨在有效擴展使用旋轉位置嵌入 (RoPE)的大型語言模型 (LLM) 的上下文窗口的技術。RoPE 使用旋轉矩陣對位置信息進行編碼,而 YaRN 則修改這些旋轉頻率的縮放方式。它不是簡單地推斷頻率(這通常會導致性能下降),而是平滑地插入和調整這些頻率,從而能夠更好地推廣到更長的上下文。它在計算上是高效的,并且無需大量重新訓練即可擴展模型上下文長度。

🏛 2. 總層數

DeepSeek-R1 由一個嵌入層、其后的 61 個變換器層以及輸出階段的多個預測頭組成。

DeepSeek-R1 在所有 Transformer 層上采用多頭潛在注意力 (MLA) 層,而不是標準多頭注意力。前三個 Transformer 層與其他層不同,使用標準前饋網絡 (FFN) 層。從第 4 層到第 61 層,混合專家 (MoE) 層取代了 FFN 層。MLA 和 MoE 的細節將在以下部分中探討。
在這里插入圖片描述

帶有維度的完整模型架構描述:

DeepSeek-V3使用多標記預測 (MTP) 技術,利用最后兩個預測頭預測接下來的2 個標記。第二個預測標記的接受率介于85% 和 90%之間,表明在各個生成主題中均具有很高的可靠性。 DeepSeek-R1 (DeepSeek-V3) 總共包含 671B 個參數,其中每個標記激活 37B 個。在這里插入圖片描述

🔬 3. 前 3 個 DeepSeek-R1 層

前 3 層由多頭潛在注意力 (MLA) 和標準 FFN 層組成。這些通常被稱為“密集 LLM 層”,因為 FFN 層不會被 MoE 層取代,相比之下 MoE 層被認為更稀疏。

DeepSeek-R1 中的前 3 個 Transformer 層

🧩 4. DeepSeek-R1 的第 4 層至第 61 層

這些層由 MLA 層和 MoE 層組成。我們將在接下來的部分中了解什么是 MLA 層和 MoE 層以及它們如何工作。

MoE Transformer 層

🧠 5.多頭潛在注意力(MLA)

現在讓我們了解什么是 MLA。

MLA 首次在 DeepSeek-V2 中引入,并已延續到 DeepSeek-V3 和 DeepSeek-R1。

為什么要開發MLA?

以下是 DeepSeek-V2 論文/技術報告中的一份聲明,它清楚地闡述了開發 MLA 背后的原因。

“傳統的Transformer模型通常采用多頭注意力機制(MHA),但在生成過程中,其繁重的鍵值(KV)緩存會成為限制推理效率的瓶頸。為了減少KV緩存,提出了多查詢注意力機制(MQA)和分組查詢注意力機制(GQA)。它們需要的KV緩存量級較小,但性能不如MHA。

對于 DeepSeek-V2,我們設計了一種創新的注意力機制,稱為多頭潛在注意力 (MLA)。MLA 配備了低秩鍵值聯合壓縮,性能優于 MHA,但所需的 KV 緩存量卻少得多。”

MLA 與 MHA、GQA 和 MQA 的比較:來自 DeepSeek-V2 的圖表

MLA 如何實現減少 KV 緩存以加快推理速度?

“MLA 的核心是對注意力鍵和值進行低秩聯合壓縮,以減少推理過程中的鍵值 (KV) 緩存。” — DeepSeek-V2

讓我們一步一步地理解這個圖:

步驟 1:Q、K 和 V 的下投影

MLA 層的輸入是 h t ? h_t? ht??。為清楚起見,我們假設 h t h_t ht? 的形狀為 (input_sequence_length×2000)。

在傳統的 Transformer 層中,權重矩陣用于將 h_t? 投影到查詢 (Q)、鍵 (K) 和值 (V) 表示中。這些表示中的每一個通常都保留與輸入相同的隱藏維度,從而導致 Q、K、V 具有 (input_sequence_length×2000) 的形狀。

MLA 層的輸入是 h t h_t ht??。為清楚起見,我們假設 h t h_t ht? 的形狀為 (input_sequence_length×2000)。

在傳統的 Transformer 層中,權重矩陣用于將 h_t? 投影到查詢 (Q)、鍵 (K) 和值 (V) 表示中。這些表示中的每一個通常都保留與輸入相同的隱藏維度,從而導致 Q、K、V 具有 (input_sequence_length×2000) 的形狀。

然而,在具有多頭潛在注意力 (MLA) 的 Transformer 層中,權重矩陣生成的 Q、K 和 V 的尺寸明顯小于輸入。MLA 不會保留完整的隱藏維度,而是會減小它們的尺寸。例如,如果輸入 h t h_t ht?? 的形狀為 (序列長度 × 2000),則生成的 Q、K 和 V 的形狀可能為 (序列長度 × 100)。

在實施過程中,通常會融合 Q、K 和 V 的權重矩陣,以提高GPU 上的計算和內存效率。不是應用單獨的投影,而是使用組合權重矩陣來優化操作。在 MLA 中, K和V的生成遵循這一原則。具體而言,在方程中使用單個權重矩陣,表示為 W D K V W^{DKV} WDKV ?。這里, W D K V W^{DKV} WDKV? 中的“D”代表下投影權重矩陣,反映了其在降低維度以實現高效注意力計算方面的作用。

潛在 K 和 V 嵌入

此投影的輸出是包含 K 和 V 的連接表示。可以使用簡單的切片機制輕松提取它們。結果輸出的形狀為 (序列長度 × 200),其中第一個 (序列長度 × 100) 對應于 K,其余 (序列長度 × 100) 對應于 V。

壓縮的 K 和 V 輸出在推理期間被緩存,從而顯著減少了 KV 緩存的內存占用。

類似地,Q 也在MLA中被壓縮。Q 的結果形狀為(序列長度 × 100)。

第 2 步:Q、K 和 V 的向上投影

壓縮后,Q、K 和 V被向上投影回更大的尺寸以進行注意力計算。這個更大的尺寸可以匹配原始輸入 h t h_t ht? ?,也可以遵循基于注意力頭配置的結構。

例如,向上投影的形狀可以是:

  • (序列長度×2000),與輸入大小匹配。
  • 序列長度×3200),其中3200來自于64×50(有64 個注意力頭,每個頭有 50 個維度)。

K 和 V 向上投影

Q 向上投影

Q、K 和 V的上投影是使用專用權重矩陣執行的:

  • W_UK? 表示K 向上投影
  • W_UV? 用于垂直向上投影
  • W_UQ? 用于Q 向上投影

這里,“U”代表向上投影,表示將壓縮表示擴展回更大維度的空間以進行注意力計算。

注意:每個注意力頭的輸入維度將進行調整以適應旋轉位置嵌入 (RoPE)。此調整將在接下來的部分中變得更加清晰。

步驟 3:Q 和 K 中的 RoPE 嵌入用于編碼位置信息

此步驟用于計算 RoPE 嵌入來編碼位置信息。

旋轉位置嵌入(RoPE)的結合:

  • 解耦 RoPE 策略:為了整合位置信息,DeepSeek-V2(隨后是 DeepSeek-V3 和 DeepSeek-R1)采用了解耦 RoPE 方法。這涉及創建專門用于攜帶位置信息的額外查詢 (Q) 和密鑰 (K) 向量。
  • 連接:這些 RoPE 增強的 Q 和 K 向量與上投影的 Q 和 K 向量連接。
    這是 MLA 中比較棘手的部分。

我將嘗試按照我從 DeepSeek 的技術報告中理解的方式來解釋它。

在傳統的 Transformer 層中,RoPE 操作直接作用于 Q 和 K。它不改變 Q 和 K 的維度,而是改變 Q 和 K 中的語義表示(Q 和 K 中的數值)來編碼位置信息。因此,得到的 Q 和 K 同時具有語義和位置信息。

但是,在具有 MLA 的transformer層中,RoPE 被應用于分離新生成的查詢(Q)和鍵(K)嵌入,并將其連接到上投影的 Q 和 K。

步驟 3.1:為 Q 生成 RoPE 嵌入

傳統上,RoPE(旋轉位置嵌入)會根據查詢 (Q) 和鍵 (K) 向量在序列中的位置,對它們應用旋轉矩陣。此轉換會直接在 Q 和 K 中編碼相對位置信息,從而無需使用正弦或絕對編碼等顯式位置嵌入。

但是在 MLA 中,不是將 RoPE 應用于上投影的 Q( q t C q_t^C qtC?),而是從 c t Q c_t^Q ctQ? 生成新的 Q 嵌入( q t R q_t^R qtR?)并對其應用 RoPE。

通過將 c t Q c_t^Q ctQ? 與權重矩陣 W Q R W^{QR} WQR 相乘,可以生成完全獨立的查詢嵌入。這些新的獨立查詢嵌入經過 RoPE 轉換,為我們提供位置編碼查詢嵌入 ( q t R q_t^R qtR?)。

q t R q_t^R qtR? 的生成方式是,它們可以連接到每個注意力頭的輸入查詢嵌入,以便每個注意力頭都具有位置信息。 [從等式來看,這個說法似乎是正確的,但需要進一步驗證。]

步驟 3.2:為 K 生成 RoPE 嵌入
類似地,不是將 RoPE 應用于上投影的 K,而是生成新的 K 嵌入并對其應用 RoPE。

但是與 RoPE 嵌入的 q t R q_t^R qtR?有兩個關鍵區別:

新的 K 嵌入是由 h t h_t ht?(輸入嵌入)而不是向下投影的 K( c t K c_t^K ctK?)生成的。
相同的 RoPE 嵌入 K(鍵)連接到每個注意力頭的輸入。但是,單獨的 RoPE 嵌入 Q(查詢)被計算并連接到每個注意力頭,如步驟 3.1 所示。[從等式來看,這個說法似乎是正確的,但需要進一步驗證。]

為什么不從向上投影的 K 即 k t C k_t^C ktC? 生成?

DeepSeek-V2報告中的推理:

“如果我們將 RoPE 應用于鍵k _𝐶,𝑊𝑈𝐾 將與位置敏感的 RoPE 矩陣耦合。這樣,𝑊𝑈𝐾 在推理過程中就不能再被吸收到𝑊_𝑄 中,因為與當前生成的 token 相關的 RoPE 矩陣將位于 𝑊_𝑄 和 𝑊𝑈𝐾 之間,而矩陣乘法不遵循交換律。”

從下面的解釋截圖可以更好地理解這一點:

K 的 RoPE 嵌入:第 1 部分

K 的 RoPE 嵌入:第 2 部分

K 的 RoPE 嵌入:第 3 部分

因此,為了提高推理效率,位置嵌入的 K(關鍵)嵌入是從輸入嵌入 h t h_t ht? 生成的。

在 MLA 中引入額外的權重矩陣不會導致內存和計算效率低下嗎?

為了解決這些開銷,DeepSeek-V2 報告:

“此外,在推理過程中,由于 𝑊𝑈𝐾 可以被吸收到 𝑊𝑄 中,而 𝑊𝑈𝑉 可以被吸收到 𝑊𝑂 中,我們甚至不需要計算鍵和值來引起注意。”

為了進一步減少內存消耗:

“此外,為了減少訓練期間的激活內存,我們還對查詢執行低秩壓縮,即使它不能減少 KV 緩存”

步驟4:計算注意力輸出

連接過程會增加 Q 和 K 向量的維數。為了管理這種增加的維數,模型可以采取以下任一方式:

  • 增加注意力頭的數量:這將保持原始的每個頭的維度,但需要更多的計算資源。
  • 調整每個頭的維數:保持頭的數量不變,但增加每個頭的維數以適應連接的向量。

注意力輸出是使用這些標準注意力方程來計算的:


O_t_i 是注意力得分,u_t 是注意力輸出。W_o 表示輸出投影權重矩陣。輸出被投影回與輸入相同的維度(就像在我們的例子中:這個形狀將是 input_sequence_length x 2000)

🎭 6.混合專家(MoE)

什么是混合專家 (MoE)?

為了清楚地理解什么是 MoE,首先讓我們看看它在 Transformer 中的具體用途以及它的架構簡介。標準 Transformer 層中的 FFN 被 MoE 取代。

從本質上講,MoE 遵循標準 Transformer 設計,但通過引入多個并行專家網絡(FFN) 而不是單個密集 FFN來修改前饋層。其工作原理如下:

1. 多個 FFN(而非一個)

MoE 不使用單個共享的 FFN,而是使用多個并行訓練的FFN 層(專家) 。

2. 輸入處理和令牌路由

  • 每個 token 都像往常一樣經過 transformer自注意力層。
  • 它不是由單個 FFN 處理,而是被發送到路由器,由路由器決定哪些專家應該處理它。

3. 通過路由器選擇專家

  • 一個小型的、可訓練的路由器決定哪個專家子集(FFN)應該處理每個標記。
  • 通常,每個 token僅選擇 1 或 2 個專家以保持效率(例如, top-1 或 top-2 門控)。DeepSeek -V3(DeepSeek-R1)使用 9 個專家,其中 1 個是共享專家,其他 8 個是路由專家。
  • 選擇通常基于softmax 評分機制,其中路由器為每個專家分配概率。具體來說,在 DeepSeek-V3 (DeepSeek-R1) 中,使用 Sigmoid 而不是 softmax。

4. 專家稀疏計算

  • 只有選定的專家才能處理令牌,而其他人則保持不活動狀態。
  • 專家輸出使用加權求和進行組合,并傳遞到下一個 Transformer 層。在 DeepSeek-V3/R1 中,權重是歸一化的 S 型輸出。
  • 這種稀疏激活可確保任何時候僅使用模型的一小部分,從而保持計算可管理。

為什么要用 MoE 取代單一 FFN?

  • 可擴展性— MoE 允許模型使用更多參數進行擴展,而無需線性增加計算量。
  • 高效學習— 專家專注于數據的不同方面,從而提高泛化能力。
  • 計算節省— 由于每個 token 僅使用專家子集,因此與相同大小的密集模型相比,MoE 模型的運行成本更低。DeepSeek-V3/R1 共有 6710 億個參數,其中每個 token 激活 370 億個參數。

MoE 在 DeepSeek-R1 中如何發揮作用?

以下來自 DeepSeek-V3 技術報告的公式顯示了每個 MoE 層中的計算。在 DeepSeek 系列模型中,MoE 架構首次在 DeepSeekMoE 模型中引入,并且正在 DeepSeek-V2、DeepSeek-V3 和 DeepSeek-R1 中使用。

路由器計算:

在 DeepSeek-V3 、 DeepSeek-R1 和其他一些現代混合專家 (MoE) 模型中,e_i? 表示學習到的質心,有助于將輸入路由到正確的專家。與傳統的 MoE 架構中基于 FFN 的路由器計算門控分數不同,此方法預定義了一組可學習向量e_i?,每個向量對應一位專家。

關鍵思想:

  • 每個專家 i 都有一個相關的質心向量 e i e_i ei?
  • 我們不是將輸入 u t ? u_t? ut?? 傳遞給 FFN 來獲取專家概率,而是通過點積來計 u t u_t ut? 和每個 e i ? e_i? ei?? 之間的相似度:
  • 該分數決定了專家與給定輸入的相關程度。
  • 僅激活具有最高 s i , t s_{i,t} si,t?? 值的Top-K專家進行處理。

  • 在 S 型輸出中添加了一個偏差項,以創建無輔助損失的 MoE 負載平衡。

DeepSeek-V3 論文中的這段描述進一步闡明了它的用途以及它在訓練過程中的計算方式:

  • 使用選定的 top-k 值對輸出值進行標準化。


專家計算:


u t u_t ut?是 MoE 層的輸入。等式中的第二項表示輸入與共享專家相乘。每個專家由 FFN(前饋網絡)組成,因此用“FFN”表示。在 DeepSeek-R1 中,只有 1 個共享專家。因此,Ns=1。同樣,等式中的第三項表示輸入與活躍的個人專家相乘。在 DeepSeek-R1 中,總共有 256 個個人專家。但每個 token 只有 8 個活躍,因此 Nr=8。每個活躍的個人專家都將具有與等式 13 中關聯的 g i , t g_{i,t} gi,t?。它用于計算第三項。

輸出


h t h_t ht?表示 MoE 層的輸出。 u t u_t ut? 是 MoE 層的輸入。專家計算結果添加到輸入 u t u_t ut? 中,得到 MoE 層的輸出。

🔢 7. 多標記預測(MTP)

什么是多標記預測?

多標記預測是語言建模中的一種高級方法,其中模型不是一次預測一個序列中的下一個單詞,而是同時預測多個未來標記。此方法使模型能夠并行預測多個即將到來的單詞,從而提高學習效率并加速文本生成。


Meta 引入了一種多標記預測架構,可訓練語言模型同時預測多個未來標記,從而提高采樣效率并加快推理速度。在此概念的基礎上,DeepSeek-V3 整合了多標記預測 (MTP) 目標,使模型能夠同時預測多個標記。這種方法使訓練信號密集化,并能夠更好地預先規劃標記表示,從而提高復雜基準測試的性能。

DeepSeek-V3/R1 和 Meta 的多令牌預測有兩個關鍵區別:

“與 Gloeckle 等人(2024 年)[Meta Research] 使用獨立輸出頭并行預測 𝐷 個額外標記不同,我們按順序預測其他標記,并在每個預測深度保留完整的因果鏈。” — DeepSeek-V3

  1. Meta 的模型預測了4 個 token,而 DeepSeek-V3 預測了2 個 token。
  2. Meta 模型中的預測頭是獨立的,而 DeepSeek-V3 的預測頭是順序連接的。

MTP 在 DeepSeek-R1 中如何工作?


讓我們一步一步地看一下該圖表。

在訓練期間,輸入標記(位于左下角)穿過嵌入層,然后傳播到所有變壓器塊/層。

第一個預測頭(包括輸出頭)直接連接到主模型的最終 Transformer 層。輸出頭通常是前饋網絡 (FFN),其輸出維度與模型的詞匯量相匹配。該頭負責按順序預測下一個標記。給定輸入標記t?、t?、t?、t?,它會預測t?、t?、t?、t? 。但是,在推理過程中,只計算最終標記t? 。

第二個預測頭通過添加額外的可學習層擴展了這種方法。它從主模型的最終 Transformer 層獲取輸出,應用 RMSNorm 進行歸一化,然后將其與輸入嵌入連接起來。這些輸入嵌入是從主模型中使用的相同嵌入層獲得的。與第一個預測頭不同,這個頭從t?而不是t?開始處理輸入標記。然后使用線性投影層將連接的輸出投影到合適的嵌入大小,然后使用可學習的 Transformer 塊/層進行進一步處理。在訓練期間,這個頭將t?預測為t?,但在推理中,只計算t? 。

類似地,第三個預測頭從第二個預測頭的transformer器塊/層獲取輸入以及相應的輸入嵌入,現在從t?開始到t?。它遵循與前幾個頭相同的結構,在訓練期間預測t?到t?,但在推理期間僅計算t?。

每個預測頭使用交叉熵計算損失。然后,這些損失用因子λ加權,取其平均值作為最終損失值。

單獨預測頭損失

最終損失

在 DeepSeek-V3 和 R1 中,MTP 僅在訓練期間使用,而不在推理期間使用:

“推理中的 MTP:我們的 MTP 策略主要是為了提高主模型的性能,因此在推理過程中,我們可以直接丟棄 MTP 模塊,主模型可以獨立正常運行。”——DeepSeek-V3

參考資料

  • https://arxiv.org/pdf/2412.19437
  • https://arxiv.org/pdf/2405.04434
  • https://arxiv.org/pdf/2402.03300
  • https://arxiv.org/pdf/2401.02954
  • https://arxiv.org/pdf/2401.06066
  • https://arxiv.org/pdf/2404.19737

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

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

相關文章

開發基礎(8):鴻蒙圖表開發

mpchart mpchart是一個包含各種類型圖表的圖表庫,主要用于業務數據匯總,例如銷售數據走勢圖,股價走勢圖等場景中使用,方便開發者快速實現圖表UI,mpchart主要包括線形圖、柱狀圖、餅狀圖、蠟燭圖、氣泡圖、雷達圖、瀑布圖等自定義圖表庫。 柱狀圖 導入import {BarChart, …

條款03:盡可能使用 const

const 允許我們指定一個語義約束,使某個值應該保持不變 1、const 修飾 變量,指針,函數,函數返回值等,可以使程序減少錯誤,或者更容易檢測錯誤: 指針常量:int* const p;//指針地址不…

算法兵法全略(譯文)

目錄 始計篇 謀攻篇 軍形篇 兵勢篇 虛實篇 軍爭篇 九變篇 行軍篇 地形篇 九地篇 火攻篇 用間篇 始計篇 算法,在當今時代,猶如國家關鍵的戰略武器,也是處理各類事務的核心樞紐。算法的世界神秘且變化萬千,不夠賢能聰慧…

開關電源實戰(一)寬范圍DC降壓模塊MP4560

系列文章目錄 文章目錄 系列文章目錄MP4560MP4560 3.8V 至 55V 的寬輸入范圍可滿足各種降壓應用 MOSFET只有250mΩ 輸出可調0.8V-52V SW:需要低VF肖特基二極管接地,而且要靠近引腳,高壓側開關的輸出。 EN:輸入使能,拉低到閾值以下關閉芯片,拉高或浮空啟動 COMP:Compens…

微軟AutoGen高級功能——Magentic-One

介紹 大家好,博主又來給大家分享知識了,這次給大家分享的內容是微軟AutoGen框架的高級功能Magentic-One。那么它是用來做什么的或它又是什么功能呢,我們直接進入正題。 Magentic-One Magnetic-One是一個通用型多智能體系統,用于…

DeepSeek是如何通過“蒸餾”技術打造自己的AI模型

1 引言: 最近,外媒對中國公司——DeepSeek進行了猛烈抨擊,指控其采用了所謂的“蒸餾”(Distillation)技術,涉嫌抄襲甚至作弊。那么,什么是“蒸餾”技術? 在人工智能領域,…

【廣州大學主辦,發表有保障 | IEEE出版,穩定EI檢索,往屆見刊后快至1個月檢索】第二屆電氣技術與自動化工程國際學術會議 (ETAE 2025)

第二屆電氣技術與自動化工程國際學術會議 (ETAE 2025) The 2nd International Conference on Electrical Technology and Automation Engineering 大會官網:http://www.icetae.com/【更多詳情】 會議時間:2025年4月25-27日 會議地點&#xff1a…

伯克利 CS61A 課堂筆記 08 —— Strings and Dictionaries

本系列為加州伯克利大學著名 Python 基礎課程 CS61A 的課堂筆記整理,全英文內容,文末附詞匯解釋。 目錄 01 Strings 字符串 Ⅰ Strings are An Abstraction. Ⅱ Strings Literals have Three Forms Ⅲ String are Sequences 02 Dictionaries 字典 …

基于 GEE 計算研究區年均地表溫度數據

目錄 1 代碼解析 2 完整代碼 3 運行結果 1 代碼解析 (1)定義研究區: // 研究區的范圍需要自己提前上傳 var dataset table;// 將研究區顯示在中心,后面的數字為縮放等級,范圍從1 - 24 Map.centerObject(dataset,…

docker compose快速部署kafka-connect集群

先部署kafka集群,啟動 參考:docker compose部署kafka集群-CSDN博客 創建timezone文件,內容填寫Asia/Shanghai 再部署kafka-connect集群 networks: net: external: true services: kafka-connect1: restart: always image:…

Hutool - BloomFilter:便捷的布隆過濾器實現

1. 布隆過濾器簡介 布隆過濾器(Bloom Filter)是一種空間效率極高的概率型數據結構,用于判斷一個元素是否存在于一個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的算法,但缺點是有一定的誤判率,即判斷元素存在…

日常知識點之遺留問題梳理(定時器/時間輪定時器)

1:簡單基礎 定時器的核心知識點,對我來說就是獲取當前時間和設置回調函數。 簡單練習: ? c語言通過gettimeofday 獲取當前時間并進行處理 ? 回調函數的定義(函數參數有必要適當存儲) typedef void(Timerfunc)(vo…

Python + WhisperX:解鎖語音識別的高效新姿勢

大家好,我是烤鴨: 最近在嘗試做視頻的質量分析,打算利用asr針對聲音判斷是否有人聲,以及識別出來的文本進行進一步操作。asr看了幾個開源的,最終選擇了openai的whisper,后來發現性能不行,又換了…

$ npx electron-forge import 一直報權限問題 resource busy or locked,

jackLAPTOP-7DHDAAL0 MINGW64 /e/project/celetron-project/my-electron-app (master) $ npx electron-forge import > Checking your system > Checking git exists > Checking node version > Checking packageManager version √ Found node22.14.0 √ Found gi…

mapbox 從入門到精通 - 目錄

👨??? 主頁: gis分享者 👨??? 感謝各位大佬 點贊👍 收藏? 留言📝 加關注?! 👨??? 收錄于專欄:mapbox 從入門到精通 文章目錄 一、🍀總目錄1.1 ?? mapbox基礎1.2 ??…

Kotlin 2.1.0 入門教程(十五)繼承、重寫、派生類初始化順序

繼承 所有類都有一個共同的超類 Any,對于沒有聲明超類型的類來說,Any 是其默認的超類: // 隱式繼承自 Any。 class ExampleAny 有三個方法:equals()、hashCode() 和 toString()。因此,所有類都定義了這些方法。 默認…

sqlilabs--小實驗

一、先盲注判斷 ?id1 and sleep(2)-- 如果發現頁面存在注點,使用時間盲注腳本進行注入 import requestsdef inject_database(url):name for i in range(1, 20): # 假設數據庫名稱長度不超過20low 48 # 0high 122 # zmiddle (low high) // 2while low &l…

【數字】異步FIFO面試的幾個小問題與跨時鐘域時序約束

入門數字設計的時候,跨時鐘域的數據處理是繞不開的課題,特別是多比特數據跨時鐘域時,都會采用異步FIFO的方法。 異步FIFO中涉及較多的考點這里記錄幾個以供大家參考。 1. 異步FIFO的空滿判斷分別在哪個域? 根據異步FIFO的結構&…

淺談Java Spring Boot 框架分析和理解

Spring Boot是一個簡化Spring開發的框架,它遵循“約定優于配置”的原則,通過內嵌的Tomcat、Jetty或Undertow等容器,使得開發者能夠快速構建獨立運行的、生產級別的基于Spring框架的應用程序。Spring Boot包含了大量的自動配置功能&#xff0c…

算法06-回溯算法

一、回溯算法詳解 回溯算法是一種通過逐步構建解決方案來解決問題的算法。它通常用于解決組合問題、排列問題、子集問題等。回溯算法的核心思想是“試錯”,即在每一步嘗試所有可能的選項,如果發現當前選擇無法達到目標,就回退到上一步&#…