0
本文作者: AI研習(xí)社-譯站 | 2020-09-21 10:58 |
字幕組雙語(yǔ)原文:NLP 模型壓縮方法綜述
英語(yǔ)原文:A Survey of Methods for Model Compression in NLP
翻譯:wiige
近年來(lái),基于Transformer的語(yǔ)言模型在神經(jīng)機(jī)器翻譯,自然語(yǔ)言推理,and 其他一攬子自然語(yǔ)言理解任務(wù)中取得了實(shí)質(zhì)性進(jìn)展。 采用不同語(yǔ)言建模損失進(jìn)行自監(jiān)督的預(yù)訓(xùn)練,意味著模型可以通過大規(guī)模語(yǔ)料來(lái)提高許多下游任務(wù)的性能。 然而,海量參數(shù)和長(zhǎng)計(jì)算軌跡意味著BERT及其變體在生產(chǎn)部署中困難重重。 值得慶幸的是,在過去2年里,我們看到了各種各樣的技術(shù)的發(fā)展,它們緩解了這些苦痛并加速了模型的預(yù)測(cè)。具體來(lái)說,本文將重點(diǎn)介紹下面這套模型預(yù)訓(xùn)練后可以打的組合拳,這能降低模型預(yù)測(cè)的計(jì)算成本:
數(shù)值精度縮減: 通過減少浮點(diǎn)數(shù)精度和量化來(lái)加快速度
操作合并: 在計(jì)算圖中合并所選節(jié)點(diǎn)
剪枝: 識(shí)別并刪除網(wǎng)絡(luò)中的非必要部分
知識(shí)蒸餾: 訓(xùn)練高效的小規(guī)模學(xué)生模型,以模仿表達(dá)力更強(qiáng)、開銷更大的老師模型
模塊替換: 通過替換來(lái)降低模型的復(fù)雜性或深度
數(shù)值精度縮減可能是加速模型預(yù)測(cè)的最通用方法。在過去的幾年里,GPU硬件對(duì)16位浮點(diǎn)數(shù)運(yùn)算的支持不佳,這意味著降低權(quán)重和激活函數(shù)的計(jì)算精度往往效果適得其反,但帶有Tensor Core的NVIDIA Volta和Turing 架構(gòu)的引入意味著現(xiàn)代GPU現(xiàn)在已經(jīng)具備了高效的16位浮點(diǎn)數(shù)運(yùn)算能力。
浮點(diǎn)數(shù)的表示
浮點(diǎn)類型存儲(chǔ)三種的數(shù)值信息——符號(hào)、指數(shù)和分?jǐn)?shù)。 傳統(tǒng)的32位浮點(diǎn)數(shù)表示法用8位表示指數(shù),用23位來(lái)表示尾數(shù)。 而傳統(tǒng)的16位浮點(diǎn)數(shù)表示法(即NVIDIA硬件使用的格式)將32位表示法中的指數(shù)和尾數(shù)位差不多減少了一半。TPU則用了一種名為 bfloat16 的表示方法,它將部分比特位從尾數(shù)移至指數(shù),以部分精度為代價(jià)換取了更大的數(shù)值表示能力。
圖源: https://cloud.google.com/tpu/docs/bfloat16
Transformer網(wǎng)絡(luò)大部分的都可以簡(jiǎn)單地轉(zhuǎn)換為16位浮點(diǎn)權(quán)重和激活,而不會(huì)產(chǎn)生精度問題。 而網(wǎng)絡(luò)剩下的一小部分——特別是softmax操作這部分——必須堅(jiān)持使用32位浮點(diǎn)數(shù)。 這是因?yàn)榇罅啃?shù)值(對(duì)數(shù)計(jì)算產(chǎn)生的)的和可能會(huì)累積出很大誤差。因?yàn)橥瑫r(shí)使用了float16和float32,這種方法通常被稱為"混合精度".
較不精確的數(shù)值表示法能夠從兩個(gè)方面加速計(jì)算:
原生半精度指令
更緊湊的表示使得批尺寸(batch size)更大
NVIDIA已經(jīng)發(fā)布了一套與浮點(diǎn)精度縮減相關(guān)的通用基準(zhǔn)——在實(shí)踐中,這種方法可以實(shí)現(xiàn)高達(dá)3倍的加速。
整型量化
將32位浮點(diǎn)值量化為8位整型值也是可能的,但應(yīng)用起來(lái)頗為微妙。 特別是,為了確保8位整型值的計(jì)算盡可能地接近32位浮點(diǎn)值的計(jì)算,訓(xùn)練后必須要增加一個(gè)校準(zhǔn)步驟.
如果你知道一個(gè)網(wǎng)絡(luò)的激活值可能在什么樣的區(qū)間內(nèi),你可以把這個(gè)區(qū)間劃分成256個(gè)離散的塊,并將每個(gè)塊分配給一個(gè)整數(shù)。 只要你記得了縮放因子和區(qū)間范圍,就可以用整數(shù)近似值進(jìn)行矩陣乘法,并在輸出的時(shí)候結(jié)果恢復(fù)為浮點(diǎn)值.
圖源: Szymon Migacz's 演講, "8-bit Inference with TensorRT"
簡(jiǎn)單來(lái)說,你可以選擇一個(gè)縮放比例和偏移量,使得一組校準(zhǔn)輸入上的全部浮點(diǎn)數(shù)激活都不會(huì)被映射到8位整型值表示范圍(-128,127)的端點(diǎn)值上。 然而,在這樣做的過程中,為了適應(yīng)極端的值我們犧牲了一些精度。 相反,像TensorRT這樣的框架會(huì)選擇規(guī)模和偏移值,來(lái)最小化32位浮點(diǎn)版本和8位整型版本的模型激活輸出之間的KL散度,這使得我們?cè)瓌t上可以權(quán)衡好范圍和精度。 由于KL散度就是不同編碼下的信息損失量,所以它完美符合計(jì)算需求.
下面的資料介紹了如何使用NVIDIA的TensorRT將8位整型值量化應(yīng)用到自己的模型中:
Tensorflow TensorRT 用戶指南
Tensorflow TensorRT Github
除了浮點(diǎn)縮減和量化,操作合并也為更高效的預(yù)測(cè)提供了一個(gè)實(shí)用而通用的選擇。合并的基本原理是將一些網(wǎng)絡(luò)層執(zhí)行的操作結(jié)合起來(lái),以更高效少次地訪問設(shè)備內(nèi)存。 通過將多種操作合并到一個(gè)核(kernel)中,可以大幅提高訪問內(nèi)存的速度。
上圖中,將跳連的求和操作與層標(biāo)準(zhǔn)化的縮放和偏置合并.
軟件優(yōu)化還可以讓我們重組一些矩陣乘法,以更好地利用并行性。 特別是,這可以將自注意力層的查詢、鍵和值投影合并到一次矩陣乘法中去。
圖片由NVIDIA開發(fā)者博客提供
不幸的是,關(guān)于這種圖優(yōu)化所帶來(lái)的速度提升幅度的細(xì)節(jié)很少,但我的樂觀估計(jì)是,這種改進(jìn)是漸進(jìn)但不可忽視的——它會(huì)在吞吐量上提升10%。
除了純粹地提高軟件效率之外,還有一些方法可以用來(lái)剪枝神經(jīng)網(wǎng)絡(luò),去除那些對(duì)最終模型貢獻(xiàn)最小的權(quán)重。 許多剪枝方法(如Fan等人的 "Reducing Transformer Depth on Command With Structured Dropout")需要在預(yù)訓(xùn)練期間對(duì)網(wǎng)絡(luò)進(jìn)行修改,以產(chǎn)生足夠稀疏的模型,而且可在訓(xùn)練后再進(jìn)行剪枝。 剪枝相關(guān)的其他文獻(xiàn)則側(cè)重于理解習(xí)得的連接模式的稀疏程度,而沒有以高效預(yù)測(cè)為目的(例如,Gorden等人的 "Compressing BERT: Studying the Effects of Weight Pruning on Transfer Learning")。
雖然所有這些方法本身都很意思(結(jié)構(gòu)化層丟棄在實(shí)際應(yīng)用中表現(xiàn)出巨大的前景),但我對(duì)那些可以在部署應(yīng)用并仍然提升性能的方法更感興趣。這類方法通?;?quot;模型中只有一部分是解決具體任務(wù)所必需的"這一事實(shí)。
為獲得性能提升而進(jìn)行剪枝對(duì)結(jié)構(gòu)化的稀疏性有所要求。 簡(jiǎn)單地將奇異權(quán)重歸零并不能有效產(chǎn)生性能提升,因?yàn)槲覀儧]有實(shí)際的方法來(lái)利用這種稀疏性。 所以我們必須剪掉網(wǎng)絡(luò)中更大的部分,才能產(chǎn)生實(shí)際的性能提升。
"Are Sixteen Heads Really Better than One?", 一文中,Paul Michel、Peter Levy和Graham Neubig迭代地從BERT中減少頭的數(shù)量. 他們使用基于梯度檢測(cè)的方法(梯度是在下游任務(wù)上估計(jì)出來(lái)的)來(lái)估計(jì)每個(gè)頭的重要性,并以頭剪枝百分比作為性能的函數(shù)來(lái)評(píng)估模型對(duì)頭剪枝的魯棒性。
在實(shí)踐中,作者發(fā)現(xiàn)20 - 40%的頭可以剪枝,它們對(duì)精度的影響可以忽略不計(jì)。
資料來(lái)源 https://arxiv.org/abs/1905.10650
在J.S. McCarley和Rishav Chakravarti以及Avirup Sil的"Structured Pruning of a BERT-based Question Answering Model"中,作者探索了一種更通用的模型剪枝方法。 作者沒有只關(guān)注注意力頭,還對(duì)每一層的輸入以及每個(gè)BERT層的前饋層的激活進(jìn)行了門控。
他們探索了幾種機(jī)制來(lái)選出要剪枝的網(wǎng)絡(luò)元素——包括Michel等人提出的方法——最終確定了一種L0正則化項(xiàng),它可以用在精調(diào)期間,提高模型的稀疏性。為了使這個(gè)L0正則化項(xiàng)可微,他們采用了類似于變分自編碼器中的重參數(shù)化技巧。
圖片來(lái)自 Christos Louizos, Max Welling和Diederik P. Kingma的文章 "Learning Sparse Neural Networks Through L0 regularization"。
他們實(shí)驗(yàn)發(fā)現(xiàn), 用稀疏性懲罰來(lái)微調(diào)比"Are 16 Heads Really Better than 1 "中提出的重要性估計(jì)方法更勝一籌,并且他們發(fā)現(xiàn)可以多去掉近50%的前饋激活,而對(duì)短問題回答任務(wù)(他們視之為基準(zhǔn)任務(wù))的性能影響可以忽略不計(jì)。
在Squad 2.0上剪枝模型的注意力頭和前饋激活的魯棒性。
為進(jìn)一步加速模型,作者的還推薦使用下一個(gè)技術(shù)——"知識(shí)蒸餾"
知識(shí)蒸餾是由Geoffrey Hinton, Oriol Vinyals, 和Jeff Dean在2015年的工作"Distilling the Knowledge in a Neural Network"中提出的, 知識(shí)蒸餾是指到將一個(gè)網(wǎng)絡(luò)("教師")中包含的知識(shí)通過特定的修正損失遷移到另一個(gè)網(wǎng)絡(luò)中去("學(xué)生")。
首先想象一下,我們有一大堆無(wú)標(biāo)記的樣本。如果我們信賴教師模型的預(yù)測(cè),但其模型太過龐大或計(jì)算成本太高而無(wú)法在實(shí)際環(huán)境中使用,那我們就用教師模型來(lái)分類無(wú)標(biāo)記的樣本,并將這些分類信號(hào)作為監(jiān)督信號(hào)饋給學(xué)生模型。 然而如果不將對(duì)應(yīng)類別的最大似然作為最終目標(biāo),而是在所有可能的類別上產(chǎn)生一個(gè)概率分布,那么學(xué)生模型就可以獲得信息更豐富的監(jiān)督信號(hào)。
直覺上,學(xué)生模型所犯的某些錯(cuò)誤比其他錯(cuò)誤更合理——把勺子的圖認(rèn)成哈士奇明顯就走遠(yuǎn)了,但把哈士奇誤分為一只阿拉斯加就比較想得通了。所以損失函數(shù)應(yīng)該反映出錯(cuò)誤的嚴(yán)重程度。通過懲罰教師預(yù)測(cè)和學(xué)生預(yù)測(cè)之間的差異(鼓勵(lì)對(duì)數(shù)匹配),學(xué)生可以從教師網(wǎng)絡(luò)也覺得可能的類別中學(xué)習(xí)有用信息。作者認(rèn)為,在原任務(wù)上用僅3%的訓(xùn)練數(shù)據(jù)就可以幾乎實(shí)現(xiàn)教師網(wǎng)絡(luò)的性能。
有樣?xùn)|西和兩個(gè)完全不一樣。圖源維基百科,遵循CC BY-SA 3.0協(xié)議發(fā)布。
有證據(jù)表明,大量參數(shù)可能是樣本利用率高的關(guān)鍵,而且在同樣時(shí)長(zhǎng)內(nèi)把大型語(yǔ)言模型訓(xùn)練到某個(gè)困惑度也可能比訓(xùn)練一個(gè)等效的緊湊模型更有高效,因此,高效地將這些習(xí)得的知識(shí)遷移到緊湊的學(xué)生模型上的方法擁有光明的未來(lái)。
相似模型架構(gòu)的蒸餾
在前面討論的"Structured Pruning of a BERT-based Question Answering Model" 中作者利用知識(shí)蒸餾方法,將未剪枝的教師模型中的知識(shí)遷移到剪枝后的學(xué)生模型上。 在中立問題數(shù)據(jù)集(Natural Questions)上,教師模型在長(zhǎng)回答和短回答上的F1值分別為70.3和58.8。剪枝50%左右的注意力頭和前饋激活后,F(xiàn)1分別下降為67.8和55.5 ——平均下降了約2.5。 如果在微調(diào)過程中用蒸餾損失來(lái)代替交叉熵?fù)p失,F(xiàn)1則可以恢復(fù)1.5到2個(gè)點(diǎn),F(xiàn)1分別達(dá)到了69.3和58.4。
知識(shí)蒸餾有助于恢復(fù)剪枝過程中丟失的信息。
Hugging Face的Victor Sanh、Lysandre Debut、Julien Chaumond和Thomas Wolf在其文章"DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter"中, 在對(duì)遮罩語(yǔ)言模型的二次預(yù)訓(xùn)練中將知識(shí)從基線BERT模型蒸餾到了6層BERT學(xué)生模型上。 令人印象深刻的是, (以任務(wù)無(wú)關(guān)的方式訓(xùn)練的)學(xué)生模型保留了97%的GLUE性能,同時(shí)還減少了60%的預(yù)測(cè)時(shí)間.
在 TinyBERT: Distilling BERT for Natural Language Understanding一文中, Xiaoqi Jiao, Yichun Yin, Lifeng Shang, Xin Jiang, Xiao Chen, Linlin Li, Fang Wang 和 Qun Liu 將一個(gè)BERT教師模型蒸餾到了一個(gè)隱層大小為312的4層Transformer學(xué)生模型上。 模型在預(yù)訓(xùn)練時(shí)和微調(diào)時(shí)都進(jìn)行了知識(shí)蒸餾,得到的學(xué)生模型GLUE得分實(shí)現(xiàn)了BERT基線模型的96%,而軟件尺寸減小了7.5倍,推理速度快了近10倍。
在 "Patient Knowledge Distillation for BERT Model Compression"這篇文章里, Siqi Sun, Yu Cheng, Zhe Gan, Jingjing Liu 在12層BERT老師模型和6層BERT學(xué)生模型的許多中間表征上加入了知識(shí)蒸餾損失,相較于僅對(duì)模型logits應(yīng)用知識(shí)蒸餾損失的基線模型,這樣能在5/6個(gè)GLUE評(píng)分項(xiàng)上實(shí)現(xiàn)更高的準(zhǔn)確率。
相異模型架構(gòu)的知識(shí)蒸餾
在前文提到的論文中,教師模型和學(xué)生基本架構(gòu)是相似的,教師模型的權(quán)重通常用來(lái)初始化學(xué)生模型的權(quán)重。然而,即使在教師模型和學(xué)生模型架構(gòu)差異巨大的情況下,也可以應(yīng)用知識(shí)蒸餾損失。
在 "Training Compact Models for Low Resource Entity Tagging using Pre-trained Language Models"一文中, 英特爾AI實(shí)驗(yàn)室的Peter Izsak、Shira Guskin和Moshe Wasserblat將一個(gè)在命名實(shí)體識(shí)別任務(wù)上訓(xùn)練的BERT教師模型(約330M個(gè)參數(shù))蒸餾成了一個(gè)明顯更緊湊高效的CNN-LSTM學(xué)生模型(約3M個(gè)參數(shù))。 這樣的學(xué)生模型以最少的精度損失在CPU硬件上的提速高達(dá)2個(gè)數(shù)量級(jí)。
"Distilling Transformers into Simple Neural Networks with Unlabeled Transfer Data"中,Subhabrata Mukherjee和Ahmed Hassan Awadallah將BERT-Base和BERT-Large教師模型蒸餾成了一個(gè)BiLSTM學(xué)生模型,在4個(gè)分類任務(wù)(Ag News、IMDB、Elec和DBPedia)中用少量參數(shù)(13M)就戰(zhàn)平了教師模型。 他們還發(fā)現(xiàn),知識(shí)蒸餾使得樣本利用效率有了很大的提升,每個(gè)任務(wù)只需要500個(gè)帶標(biāo)注樣本就能達(dá)到(使用大量無(wú)標(biāo)注數(shù)據(jù)的)教師模型性能。
在 "Distilling Task-Specific Knowledge from BERT into Simple Neural Networks" 中,Raphael Tang、Yao Lu、Linqing Liu、Lili Mou、Olga Vechtomova和Jimmy Lin通過少于1M參數(shù)的單層BiLSTM在各種句對(duì)任務(wù)(QQP、MNLI等)上的實(shí)驗(yàn)得出了類似結(jié)論。
在 "Attentive Student Meets Multi-Task Teacher: Improved Knowledge Distillation for Pretrained Models" 中, Linqing Liu, Huan Wang, Jimmy Lin, Richard Socher, 和Caiming Xiong 將多任務(wù)學(xué)習(xí)與知識(shí)蒸餾方法結(jié)合起來(lái),將Transformer教師模型的知識(shí)遷移到一個(gè)帶注意力機(jī)制的深度LSTM中。 他們發(fā)現(xiàn),知識(shí)蒸餾的好處與多任務(wù)學(xué)習(xí)框架的泛化優(yōu)勢(shì)融合得很好,預(yù)測(cè)速度提升至耐心知識(shí)蒸餾(Patient Knowledge Distillation)模型的30倍,TinyBERT的7倍。
知識(shí)蒸餾近來(lái)風(fēng)靡各界的原因很好懂——基于Transformer的語(yǔ)言模型參數(shù)量漲個(gè)沒完——而可能就是專治參數(shù)爆炸的靈丹妙藥。 如果我們要讓這些吃顯存的無(wú)底洞切實(shí)落地,就需要像知識(shí)蒸餾這樣的方法來(lái)保持模型預(yù)測(cè)的高吞吐量。
模塊替換
列表中的最后一篇文章有兩個(gè)與眾不同之處:一是采用了比較新穎的模型壓縮方法,二是文章里有這么張圖:
這圖要是做成T-shirt的話我必穿來(lái)游街。
BERT-of-Theseus: Compressing BERT by Progressive Module Replacing 是Canwen Xu, Wangchunshu Zhou, Tao Ge, Furu Wei, and Ming Zhou發(fā)表的文章。 忒修斯BERT(BERT-of-Theseus)沒有單獨(dú)訓(xùn)練一個(gè)學(xué)生模型來(lái)最小化知識(shí)蒸餾的損失,而是在模型精調(diào)時(shí),每批(batch)以一定的概率用 "后輩模塊"(新模塊的塊)隨機(jī)替換一個(gè) "先輩模塊"(即原模型的塊)。
忒修斯BERT是對(duì) "忒修斯之船 "悖論的延展,這個(gè)悖論探討的是一艘船在經(jīng)過不斷的細(xì)小維修和升級(jí)后,是否還是那一艘船。 忒修斯BERT將這種漸進(jìn)式替換的思想應(yīng)用在了模型壓縮上。
后輩模塊是低配的先輩模塊——下圖這種情況里,單個(gè)Transformer的層替換掉了一個(gè)雙層Transformer組成的塊 。 與知識(shí)蒸餾不同的是,模塊替換中沒有使用損失來(lái)鼓勵(lì)后輩模塊模仿先輩模塊。 實(shí)際上,是通過后輩和先輩模塊的互換使用來(lái)鼓勵(lì)后輩學(xué)習(xí)模仿先輩的行為。
ArXiv論文中的"忒修斯BERT"圖示
這種隱式行為的一個(gè)好處是,我們不再需要選擇如何用目標(biāo)模型損失來(lái)加權(quán)各種知識(shí)蒸餾損失——因?yàn)樗ǔP枰粋€(gè)超參數(shù)α,使得模型損失的形式為L(zhǎng)=αLKD+(1-α)LCEL=αLKD+(1-α)LCE。 與TinyBERT不同的是,它沒有二次預(yù)訓(xùn)練這一步——模型壓縮與下游精調(diào)是同時(shí)進(jìn)行的。 最后,漸進(jìn)式模塊替換方法也適用于模型架構(gòu)不同的情況——它在設(shè)計(jì)中就沒有利用Transformer的任何具體特征。
論文作者用線性學(xué)習(xí)率進(jìn)行了實(shí)驗(yàn),他發(fā)現(xiàn)隨著時(shí)間的推移,線性增加模塊的替換率比恒定的替換率效果要好。
忒修斯BERT的替換率的比較實(shí)驗(yàn)
為了測(cè)試其方法的魯棒性,作者在GLUE跑分的時(shí)候在BERT-base上用了"忒修斯壓縮",這輕松超越了幾種基于知識(shí)蒸餾方法的性能,在將原始模型壓縮到50%大小的情況下,僅僅落后BERT-base不到1個(gè)百分點(diǎn)。
忒修斯BERT的GLUE跑分結(jié)果
我覺得漸進(jìn)式模塊替換方法十分誘人的部分原因是,它打開了用實(shí)驗(yàn)方法提高其他模型吞吐量的大門, 而以前模型通常需要從零開始重新訓(xùn)練。 對(duì)于獨(dú)立研究員和小公司來(lái)說,從頭開始重新訓(xùn)練Transformer模型的成本通常是難以承受的,所以哪些提出了更高效模型的好點(diǎn)子但沒發(fā)布預(yù)訓(xùn)練模型的論文就很難復(fù)現(xiàn)。
我很想看看忒修斯BERT提出的漸進(jìn)式模塊替換, 是否能夠很好地替換
"Fast Transformer Decoding: One Write-Head is All You Need"中提出的共享鍵和值的預(yù)訓(xùn)練注意力模塊,或者換成一個(gè)稀疏的注意力等價(jià)模塊。更一般地講,我們需要繼續(xù)開發(fā)一些方法,這些方法既能利用語(yǔ)言模型預(yù)訓(xùn)練過程中的大量計(jì)算開銷,又能讓我們事后進(jìn)行修改,以便使這些昂貴的模型能適應(yīng)特定任務(wù)。我對(duì)未來(lái)研究如何在這一的基石上向前發(fā)展翹首以盼。
如果您有興趣了解更多關(guān)于基于BERT模型的更高效預(yù)測(cè)方法,您可能會(huì)喜歡下面的:
Prakhar Ganesh , Yao Chen , Xin Lou , Mohammad Ali Khan, Yin Yang , Deming Chen , Marianne Winslett , Hassan Sajjad and Preslav Nakov的Compressing Large-Scale Transformer-Based Models: A Case Study on BERT
Michael Gordon的一篇博文:All the Ways You Can Compress BERT,我寫這篇文章的時(shí)候經(jīng)常引用之。
雷鋒字幕組是一個(gè)由AI愛好者組成的翻譯團(tuán)隊(duì),匯聚五五多位志愿者的力量,分享最新的海外AI資訊,交流關(guān)于人工智能技術(shù)領(lǐng)域的行業(yè)轉(zhuǎn)變與技術(shù)創(chuàng)新的見解。
團(tuán)隊(duì)成員有大數(shù)據(jù)專家,算法工程師,圖像處理工程師,產(chǎn)品經(jīng)理,產(chǎn)品運(yùn)營(yíng),IT咨詢?nèi)?,在校師生;志愿者們?lái)自IBM,AVL,Adobe,阿里,百度等知名企業(yè),北大,清華,港大,中科院,南卡羅萊納大學(xué),早稻田大學(xué)等海內(nèi)外高校研究所。
如果,你也是位熱愛分享的AI愛好者。歡迎與雷鋒字幕組一起,學(xué)習(xí)新知,分享成長(zhǎng)。
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。