深度學習筆記之BERT(五)TinyBERT

深度學習筆記之TinyBERT

  • 引言
    • 回顧:DistilBERT模型
    • TinyBERT模型結構
    • TinyBERT模型策略
      • Transformer層蒸餾
      • 嵌入層蒸餾
      • 預測層蒸餾
    • TinyBERT模型的訓練
    • 效果展示

引言

上一節介紹了 DistilBERT \text{DistilBERT} DistilBERT模型,本節將繼續介紹優化性更強的知識蒸餾 BERT \text{BERT} BERT模型—— TinyBERT \text{TinyBERT} TinyBERT模型。

回顧:DistilBERT模型

DistilBERT \text{DistilBERT} DistilBERT模型是一種基于 BERT-base \text{BERT-base} BERT-base知識蒸餾版本,其模型結構表示如下。單從模型結構的角度觀察,學生模型神經元的維度沒有發生變化 ( 768 ) (768) (768),僅是 Encoder \text{Encoder} Encoder層數減少為 BERT-base \text{BERT-base} BERT-base的一半;并且各層的初始化繼承了一部分 BERT-base \text{BERT-base} BERT-base從教師模型的 Encoder \text{Encoder} Encoder層中每兩層選擇一層作為學生模型 Encoder \text{Encoder} Encoder層的初始化
DistilBERT模型結構
DistilBERT \text{DistilBERT} DistilBERT訓練出的學生模型( param:66M \text{param:66M} param:66M)依然可以達到 BERT-base \text{BERT-base} BERT-base模型幾乎 97 97 97%的準確度。能夠達到這個效果離不開 DistilBERT \text{DistilBERT} DistilBERT的三個核心策略

  • 掩碼語言模型策略 ( Masked?Language?Model ) (\text{Masked Language Model}) (Masked?Language?Model):根據 RoBERTa \text{RoBERTa} RoBERTa中的描述,摒棄掉下句預測 ( Next?Sentence?Prediction,NSP ) (\text{Next Sentence Prediction,NSP}) (Next?Sentence?Prediction,NSP)策略,并使用動態掩碼替代靜態掩碼作為 BERT \text{BERT} BERT模型的訓練策略;
  • 蒸餾策略 ( Distillation?loss ) (\text{Distillation loss}) (Distillation?loss):通過使用 Softmax \text{Softmax} Softmax溫度函數教師模型 BERT-base \text{BERT-base} BERT-base學生模型 DistilBERT \text{DistilBERT} DistilBERT輸出層的解空間盡可能地相似:
    其中 N N N表示教師模型和學生模型的輸出層維度,在 DistilBERT \text{DistilBERT} DistilBERT模型中,兩者的維度相同,均為 768 768 768
    T ( x ) = ( t 1 , t 2 , ? , t N ) S ( x ) = ( s 1 , s 2 , ? , s N ) L c r o s s = ? ∑ i = 1 N t i ? log ? ( s i ) \begin{aligned} & \mathcal T(x) = (t_1,t_2,\cdots,t_N) \\ & \mathcal S(x) = (s_1,s_2,\cdots,s_{N}) \\ & \mathcal L_{cross} = -\sum_{i=1}^{N} t_i * \log (s_i) \end{aligned} ?T(x)=(t1?,t2?,?,tN?)S(x)=(s1?,s2?,?,sN?)Lcross?=?i=1N?ti??log(si?)?
  • 余弦嵌入策略 ( Cosine?Embedding?loss ) (\text{Cosine Embedding loss}) (Cosine?Embedding?loss):通過計算輸出層分布向量之間夾角的余弦值 cos ? [ T ( x ) , S ( x ) ] \cos [\mathcal T(x),\mathcal S(x)] cos[T(x),S(x)],當該值為 1 1 1時,對應的 L c o s i n e \mathcal L_{cosine} Lcosine?達到最小。此時兩向量的方向為同一方向,教師和學生模型輸出的解空間已被對齊:
    L c o s i n e = 1 ? cos ? [ T ( x ) , S ( x ) ] \mathcal L_{cosine} = 1 - \cos[\mathcal T(x),\mathcal S(x)] Lcosine?=1?cos[T(x),S(x)]

總結:
ALBERT \text{ALBERT} ALBERT模型中介紹過,雖然 ALBERT \text{ALBERT} ALBERT也是 BERT \text{BERT} BERT的簡化版本,但它們的解空間并不相同
解空間:ALBERT vs BERT
與此相反, DistilBERT \text{DistilBERT} DistilBERT中除了繼承了 BERT \text{BERT} BERT中的掩碼語言模型策略外,剩余的兩條策略均是圍繞牢牢綁定教師模型與學生模型的解空間而設計。

重新觀察學生模型 DistilBERT \text{DistilBERT} DistilBERT,它能夠達到如此精煉的模型結構 ( param:110M?->?66M ) (\text{param:110M -> 66M}) (param:110M?->?66M),但依然保持極高的準確性,沒有出現欠擬合的情況。這至少意味著: DistilBERT \text{DistilBERT} DistilBERT模型中的神經元被利用得更加充分

在這種情況下,是否可以百尺竿頭更進一步 ? TinyBERT ?\text{ TinyBERT} ??TinyBERT模型給了我們一個更精進的答案。

TinyBERT模型結構

相比于 DistilBERT \text{DistilBERT} DistilBERT模型中 Encoder \text{Encoder} Encoder層數減半的嚴肅操作, TinyBERT \text{TinyBERT} TinyBERT模型可以自定義學生模型的層數。并且還可以設置隱藏層單元中神經元的維度,從而使模型更加精簡。那么它是如何實現在如此精簡的模型結構下,不僅沒有欠擬合,而且還能保持優秀的訓練結果呢 ? ? ? 自然是依靠更加嚴苛的策略作為約束

TinyBERT \text{TinyBERT} TinyBERT模型的教師-學生模型結構表示如下:
TinyBERT structure
其中索引 0 0 0表示嵌入層 1 1 1表示第一個 Encoder \text{Encoder} Encoder,以此類推。最后 N+1,M+1 \text{N+1,M+1} N+1,M+1分別表示教師、學生模型的預測層

該蒸餾結構與 DistilBERT \text{DistilBERT} DistilBERT之間沒有太大區別,只不過沒有 DistilBERT \text{DistilBERT} DistilBERT中的初始化操作。教師與學生模型中各層的遷移過程可以表示為如下式子:
n = G ( m ) n = \mathcal G(m) n=G(m)
其表達的含義是:將教師模型中的第 n n n層遷移到學生模型的第 m m m。例如:

  • 0 = G ( 0 ) 0 = \mathcal G(0) 0=G(0)表示將教師模型的嵌入層知識遷移到學生模型的嵌入層;
  • N + 1 = G ( M + 1 ) N+1 = \mathcal G(M+1) N+1=G(M+1)表示將教師模型的預測層知識遷移到學生模型的預測層;
  • n = G ( m ) n = \mathcal G(m) n=G(m)表示將教師模型的第 n n n Encoder \text{Encoder} Encoder層知識遷移到學生模型的第 m m m Encoder \text{Encoder} Encoder層。

TinyBERT模型策略

那么 TinyBERT \text{TinyBERT} TinyBERT如何制定策略的呢 ? ? ? 主要圍繞三個部分制定策略:

  • Transformer \text{Transformer} Transformer ( Encoder ) (\text{Encoder}) (Encoder)
  • 嵌入層 ( Embedding?Layer ) (\text{Embedding Layer}) (Embedding?Layer)
  • 預測層 ( Predict?Layer ) (\text{Predict Layer}) (Predict?Layer)

Transformer層蒸餾

Transformer \text{Transformer} Transformer層也就是編碼器層,需要使用多頭注意力機制計算注意力矩陣,再使用 FeedForward?Network \text{FeedForward Network} FeedForward?Network進行一個前饋計算,并將最終計算得到的隱藏狀態特征作為該編碼器的輸出。在 TinyBERT \text{TinyBERT} TinyBERT除了將教師模型中 Encoder \text{Encoder} Encoder內的注意力矩陣遷移到學生模型相應的 Encoder \text{Encoder} Encoder中,也同時將相應的隱藏狀態特征遷移到學生模型中。因而 Transformer \text{Transformer} Transformer層蒸餾包括兩次知識蒸餾

  • 基于注意力的蒸餾
    通過最小化對應學生 Encoder \text{Encoder} Encoder和教師 Encoder \text{Encoder} Encoder內注意力矩陣的均方誤差來訓練對應學生 Encoder \text{Encoder} Encoder層:
    • 其中 h h h表示注意力機制頭的數量; A i S \mathcal A_i^{\mathcal S} AiS?表示學生 Encoder \text{Encoder} Encoder內第 i i i個頭的注意力矩陣; A i T \mathcal A_i^{\mathcal T} AiT?表示教師 Encoder \text{Encoder} Encoder內第 i i i個頭的注意力矩陣; MSE \text{MSE} MSE表示均方誤差操作。
    • 個人疑問:當學生模型隱藏層維度變化的時候 A i S , A i T \mathcal A_i^{\mathcal S},\mathcal A_i^{\mathcal T} AiS?,AiT?是一樣大的嗎?但書中并沒有解釋。
      L a t t n = 1 h ∑ i = 1 h MSE ( A i S , A i T ) \mathcal L_{attn} = \frac{1}{h} \sum_{i=1}^{h} \text{MSE}(\mathcal A_i^{\mathcal S}, \mathcal A_i^{\mathcal T}) Lattn?=h1?i=1h?MSE(AiS?,AiT?)
      需要注意的是,這里的注意力矩陣 A i S , A i T \mathcal A_i^{\mathcal S},\mathcal A_i^{\mathcal T} AiS?,AiT?使用的是執行 Layer?Norm \text{Layer Norm} Layer?Norm映射前的矩陣,這樣做的目的是保證信息的完整性,并且更快地收斂
  • 基于隱藏狀態的蒸餾
    隱藏狀態是當前 Encoder \text{Encoder} Encoder的輸出,我們同樣需要將教師 Encoder \text{Encoder} Encoder的隱藏層知識遷移到學生 Encoder \text{Encoder} Encoder的隱藏層狀態中
    其中 H S \mathcal H_{\mathcal S} HS?表示學生 Encoder \text{Encoder} Encoder內的隱藏層狀態; H T \mathcal H_{\mathcal T} HT?表示教師 Encoder \text{Encoder} Encoder內的隱藏層狀態。同樣使用均方誤差使 H S \mathcal H_{\mathcal S} HS? H T \mathcal H_{\mathcal T} HT?方向擬合。
    L h i d n = MSE ( H S , H T ) \mathcal L_{hidn} = \text{MSE}(\mathcal H_{\mathcal S},\mathcal H_{\mathcal T}) Lhidn?=MSE(HS?,HT?)
    但需要注意的是:當學生 Encoder \text{Encoder} Encoder隱藏層維度發生變化時, H S \mathcal H_{\mathcal S} HS? H T \mathcal H_{\mathcal T} HT?兩者之間的維度之間存在差異,因而需要訓練一個新的權重矩陣 W h \mathcal W_{h} Wh?使兩者處于同一級別的維度空間
    相當于作用在損失函數上的權重矩陣,反向傳播過程中同樣存在梯度更新。
    L h i d n = MSE ( H S W h , H T ) \mathcal L_{hidn} = \text{MSE}(\mathcal H_{\mathcal S}\mathcal W_h, \mathcal H_{\mathcal T}) Lhidn?=MSE(HS?Wh?,HT?)

嵌入層蒸餾

關于嵌入層的蒸餾與隱藏狀態的蒸餾相似,當學生模型設置的隱藏層維度與教師模型維度不同時,兩者對應的 Embedding \text{Embedding} Embedding也不同。同樣在損失函數中添加一個新的權重參數 W E \mathcal W_{\mathcal E} WE?,使兩個 Embedding \text{Embedding} Embedding處于同一級別的維度空間
其中 E S \mathcal E_{\mathcal S} ES?表示學生模型的 Embedding \text{Embedding} Embedding矩陣; E T \mathcal E_{\mathcal T} ET?表示教師模型的 Embedding \text{Embedding} Embedding矩陣。 MSE \text{MSE} MSE表示均方誤差。

L e m b = MSE ( E S W E , E T ) \mathcal L_{emb} = \text{MSE}(\mathcal E_{\mathcal S} \mathcal W_{\mathcal E} ,\mathcal E_{\mathcal T}) Lemb?=MSE(ES?WE?,ET?)

預測層蒸餾

在預測層蒸餾部分,遷移的是輸出層的知識信息。這里和 DistilBERT \text{DistilBERT} DistilBERT模型關于預測層的損失類似。對于教師模型的輸出 Z T \mathcal Z^{\mathcal T} ZT學生模型的輸出 Z S \mathcal Z^{\mathcal S} ZS

  • 使用 Softmax \text{Softmax} Softmax溫度函數分別獲取對應的軟目標 P T \mathcal P^{\mathcal T} PT軟預測 P S \mathcal P^{\mathcal S} PS結果:
    同理, Z T \mathcal Z^{\mathcal T} ZT對應的軟目標結果 P T \mathcal P^{\mathcal T} PT不再贅述。
    { P i S = exp ? ( Z i S / T ) ∑ j exp ? ( Z j S ) / T P S = ( P 1 S , P 2 S , ? , P N S ) \begin{cases} \begin{aligned} \mathcal P_{i}^{\mathcal S} = \frac{\exp(\mathcal Z_i^{\mathcal S} / \mathcal T)}{\sum_{j} \exp(\mathcal Z_j^{\mathcal S}) / \mathcal T} \end{aligned} \\ \quad \\ \mathcal P^{\mathcal S} = (\mathcal P_1^{\mathcal S},\mathcal P_{2}^{\mathcal S},\cdots,\mathcal P_{N}^{\mathcal S}) \end{cases} ? ? ??PiS?=j?exp(ZjS?)/Texp(ZiS?/T)??PS=(P1S?,P2S?,?,PNS?)?
  • 再使用交叉熵損失函數 P S \mathcal P^{\mathcal S} PS P T \mathcal P^{\mathcal T} PT進行描述:
    L p r e d = ? P T ? log ? ( P S ) \mathcal L_{pred} = - \mathcal P^{\mathcal T} \cdot \log \left(\mathcal P^{\mathcal S} \right) Lpred?=?PT?log(PS)

最終, TinyBERT \text{TinyBERT} TinyBERT包含所有層的損失函數表示如下:
這里 [ S m , T G ( m ) ] [\mathcal S_{m},\mathcal T_{\mathcal G(m)}] [Sm?,TG(m)?]表示學生模型的第 m m m層與教師模型第 G ( m ) \mathcal G(m) G(m)之間的遷移關系。
L [ S m , T G ( m ) ] = { L e m b ( S 0 , T 0 ) m = 0 L h i d n ( S m , T G ( m ) ) M ≥ m > 0 L p r e d ( S M + 1 , T N + 1 ) m = M + 1 \mathcal L \left[ \mathcal S_{m},\mathcal T_{\mathcal G(m)}\right]= \begin{cases} \mathcal L_{emb}(\mathcal S_0,\mathcal T_0) \quad m = 0 \\ \mathcal L_{hidn}(\mathcal S_m,\mathcal T_{\mathcal G(m)}) \quad M \geq m > 0 \\ \mathcal L_{pred} (\mathcal S_{M+1},\mathcal T_{N+1}) \quad m = M + 1 \end{cases} L[Sm?,TG(m)?]=? ? ??Lemb?(S0?,T0?)m=0Lhidn?(Sm?,TG(m)?)Mm>0Lpred?(SM+1?,TN+1?)m=M+1?
可以看出:

  • TinyBERT \text{TinyBERT} TinyBERT損失函數數量是不確定的。它取決于設計學生模型 ( TinyBERT ) (\text{TinyBERT}) (TinyBERT)的層的數量;
  • 相比于 DistilBERT \text{DistilBERT} DistilBERT TinyBERT \text{TinyBERT} TinyBERT需要為削減隱藏層狀態維度層數付出相應的代價——設計的策略需要與教師模型關系更加緊密,并精確到注意力矩陣和隱藏層狀態,從而得到一個與教師模型關聯更加緊密的、學生模型的解空間

TinyBERT模型的訓練

在文章中作者描述的訓練流程表示如下:
train and fune-tuning
TinyBERT \text{TinyBERT} TinyBERT模型中,使用兩個階段進行訓練:

  • 通用蒸餾:在該階段,使用 BERT-base \text{BERT-base} BERT-base預訓練模型作為教師,并使用 BERT-base \text{BERT-base} BERT-base的訓練集對學生模型 ( TinyBERT ) (\text{TinyBERT}) (TinyBERT)進行蒸餾。并將該模型稱作通用 TinyBERT \text{TinyBERT} TinyBERT模型
  • 特定任務蒸餾:在微調階段,將基于一項具體任務對通用 TinyBERT \text{TinyBERT} TinyBERT模型進行微調 ( fine-tuning ) (\text{fine-tuning}) (fine-tuning)。具體微調過程方式為:
    • 使用預訓練 BERT-base \text{BERT-base} BERT-base模型針對具體任務進行微調,并將這個微調后的 BERT-base \text{BERT-base} BERT-base模型作為教師
    • 將上述經過通用蒸餾得到的通用 TinyBERT \text{TinyBERT} TinyBERT模型作為學生,經過蒸餾,得到的 TinyBERT \text{TinyBERT} TinyBERT模型稱作微調的 TinyBERT \text{TinyBERT} TinyBERT模型

效果展示

論文中關于 TinyBERT \text{TinyBERT} TinyBERT對于各下游任務中,與各模型比較結果如下:
tinyBERT result
其中, DistilBERT 4 \text{DistilBERT}_4 DistilBERT4?表示學生模型包含 4 4 4 Encoder \text{Encoder} Encoder,其他同理。可以發現:

  • 相比于 DistilBERT 4 \text{DistilBERT}_4 DistilBERT4? TinyBERT 4 \text{TinyBERT}_4 TinyBERT4?使用不到其 30 30 30%,但準確率卻遠高于 DistilBERT \text{DistilBERT} DistilBERT模型
  • TinyBERT 6 \text{TinyBERT}_6 TinyBERT6?參數數量是 BERT-base \text{BERT-base} BERT-base 60 60 60%左右,但其準確性基本與 BERT-base \text{BERT-base} BERT-base持平。

Reference \text{Reference} Reference
論文鏈接
《BERT基礎教程——Transformer大模型實戰》

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

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

相關文章

正則表達式——參考視頻B站《奇樂編程學院》

智能指針 一、背景🎈1.1. 模式匹配🎈1.2. 文本替換🎈1.3. 數據驗證🎈1.4. 信息提取🎈1.5. 拆分字符串🎈1.6. 高級搜索功能 二、原料2.1 參考視頻2.2 驗證網址 三、用法3.1 限定符3.1.1 ?3.1.2 *3.1.3 3.1.…

appium學習之二:adb命令

1、查看設備 adb devices 2、連接 adb connect IP:端口 3、安裝 adb install xxx.apk 4、卸載 adb uninstall 【包名】 5、把對應目錄下的1.txt文件傳到手機sdcard下 adb push 1.txt /sdcard 6、進入對應的設備里 adb shell 7、切入sdcard目錄 cd /sdcard 8、ls 查…

Tablesaw封裝Plot.ly實現數據可視化

上文介紹tablesaw的數據處理功能,本文向你展示其數據可視化功能,并通過幾個常用圖表示例進行說明。 Plot.ly包裝 可視化是數據分析的重要組成部分,無論你只是“查看”新數據集還是驗證機器學習算法的結果。Tablesaw是一個開源、高性能的Java…

Python實現中國象棋

探索中國象棋 Python 代碼實現:從規則邏輯到游戲呈現 中國象棋,這款源遠流長的棋類游戲,承載著深厚的文化底蘊與策略智慧。如今,借助 Python 與 Pygame 庫,我們能夠在數字世界中復刻其魅力,深入探究代碼背后…

互聯網、物聯網的相關標準

互聯網的相關標準 網絡通信協議: HTTP(Hypertext Transfer Protocol):用于在網絡中傳輸文本、圖像、音頻和視頻等數據的協議。它基于請求-響應模型,客戶端發送請求給服務器,服務器返回響應。HTTPS&a…

學習Ajax (概述,應用場景,使用jQury 實現ajax)

目錄 前言 概述 什么是Ajax? 同步交互與異步交互的區別是什么呢? 應用場景 場景1 在搜索框搜索 資源 場景2 登錄業務的對用戶名處理 AJAX的優缺點 優點: 缺點: 使用jQury 實現ajax 使用步驟 1 引入jQury 文件 2 使用Ajax 函數…

網迅通推出新一代智能家居拓展網關

Zigbee 型智能家居拓展網關 產品概述 A、概述 Zigbee 是一種短距離、低功耗的無線通信技術名稱。其特點是近距離、低復雜度、低功耗、低數據速率、低成本。ZigBee 模塊是一種物聯網無線數據終端,利用 ZigBee 網絡為用戶提供無線數據傳輸功能。該產品采用高性能的…

ArcGIS字符串補零與去零

我們有時候需要 對屬性表中字符串的補零與去零操作 我們下面直接視頻教學 下面看視頻教學 ArcGIS字符串去零與補零 推薦學習 ArcGIS全系列實戰視頻教程——9個單一課程組合 ArcGIS10.X入門實戰視頻教程(GIS思維) ArcGIS之模型構建器(Mod…

NIFI使用

1 從Kafka接收消息,存儲到數據庫中。 (1) ConsumerKafka processor (2)Execute Scripts Processor 我這里是使用JS腳本進行處理。 還有很多其他語言的腳本。 var flowFile session.get(); if (flowFile ! null) {v…

linux系統使用nginx代理mysql數據庫

##使用nginx代理mysql數據庫 ##安裝nginx ./configure --prefix/home/yym/nginx/nginx-install/ --with-http_addition_module --with-http_realip_module --with-stream make && make install ##nginx配置文件 stream { upstream mysqlserver { serv…

kubeadm安裝K8s集群之高可用組件keepalived+nginx

系列文章目錄 1.kubeadm安裝K8s集群之基礎環境配置 2.kubeadm安裝K8s集群之高可用組件keepalivednginx 3.kubeadm安裝K8s集群之master節點加入 4.kubeadm安裝K8s集群之worker1節點加入 kubeadm安裝K8s集群之高可用組件keepalivednginx 1.安裝kubeadm、kubectl、kubelet2.安裝高…

子網劃分實例

看到有人問這個問題: 想了一下,這是一個子網劃分的問題: 處理方法如圖: 這是一個子網劃分的問題 設備1用三層交換機,端口設置為路由模式,設備2和設備3為傻瓜交換機模式 設備2和設備3下掛設備都是26為掩碼&…

【前端知識】微前端框架qiankun

微前端框架qiankun 簡介一、核心思想二、主要特性三、關鍵技術四、使用場景五、使用示例六、優勢與劣勢七、總結 使用一、創建主應用(Angular CLI項目)二、創建子應用(Vue CLI項目)三、啟動并測試 使用場景一、大型前端應用的拆分…

Ubuntu22.04深度學習環境安裝【Anaconda+Pycharm】

anaconda可以提供多個獨立的虛擬環境,方便我們學習深度學習(比如復現論文); Pycharm編輯器可以高效的編寫python代碼,也是一個很不錯的工具。 下面就記錄下Ubuntu22.04的安裝流程: 1.Anaconda安裝 下載Ana…

Transformer圖解

前言 transformer是目前NLP甚至是整個深度學習領域不能不提到的框架,同時大部分LLM也是使用其進行訓練生成模型,所以transformer幾乎是目前每一個機器人開發者或者人工智能開發者不能越過的一個框架。接下來本文將從頂層往下去一步步掀開transformer的面…

網絡安全在數字時代保護庫存數據中的作用

如今,通過軟件管理庫存已成為一種標準做法。企業使用數字工具來跟蹤庫存水平、管理供應鏈和規劃財務。 然而,技術的便利性也帶來了網絡威脅的風險。黑客將庫存數據視為有價值的目標。保護這些數據不僅重要,而且必不可少。 了解網絡安全及其…

種子流和花粉流怎么理解它們之間的大小關系

種子流和花粉流是植物繁殖和遺傳多樣性研究中的兩個重要概念,它們分別描述了種子和花粉在空間上的傳播過程。理解它們之間的大小關系,即傳播距離和對遺傳結構的影響,對于生態學和保護生物學具有重要意義。 種子流(Seed Dispersal&…

唇形同步視頻生成工具:Wav2Lip

一、模型介紹 今天介紹一個唇形同步的工具-Wav2Lip;Wav2Lip是一種用于生成唇形同步(lip-sync)視頻的深度學習算法,它能夠根據輸入的音頻流自動為給定的人臉視頻添加準確的口型動作。 (Paper) Wav2Lip模型…

C編程求助問題:實驗報告類型如何畫出流程圖并編寫程序?

求助問題:請問一下怎么做 是實驗報告類型的 畫出流程圖并編寫程序: (1) 從鍵盤上任意輸入5個字母,按ASCII從小到大的順序依次排列輸出。 (2) 輸入某個字母,查找題(1)數組中是否存在,若存在則輸出該字母在數組中的位置。…

C—指針初階(2)

如果看完閣下滿意的話,能否一鍵三連呢,我的動力就是大家的支持與肯定,沖! 二級指針 我們先看概念以及作用:用來存放一級指針的地址的指針 先看例子,我們逐一分析 我們先分析上面那個“1” 標注那里&#x…