在2020這個時間節點,對于NLP分類任務,我們的關注重點早已不再是如何構造模型、拘泥于分類模型長什么樣子了。如同CV領域當前的重點一樣,我們更應該關注如何利用機器學習思想,更好地去解決NLP分類任務中的低耗時、小樣本、魯棒性、不平衡、測試檢驗、增量學習、長文本等問題。
本文以QA形式探討了以下問題:
NLP分類任務我們每個NLPer都異常熟悉了,其在整個NLP業務中占據著舉足輕重的地位,更多領域的子任務也常常轉化為一個分類任務,例如新聞分類、情感識別、意圖識別、關系分類、事件類型判斷等等。構建一個完整的NLP分類任務主要包含4部分:標簽定義、數據構建、算法策略、測試部署。本文的組織架構,如下圖所示。
聲明:文中觀點謹代表筆者個人立場,盲目搬運有風險~
Q1: 如何科學地構建分類標簽體系?
分類標簽的定義至關重要,面對復雜的標簽問題,最為關鍵的一點就是要緊密貼合業務、和專家共同設定,而不是靠“蠻力”去解決。這里給出筆者曾涉及到的一些標簽定義方法:
長尾標簽:某些分類標簽下的樣本天然就很少,可以把這一類標簽設置「其他」,然后在下一層級單獨對這些長尾標簽進一步處理。
易混淆標簽:一些標簽下的樣本表現形式不易區分,首先需要思考這類標簽是否可以直接合并;如果不可以,可以先將這類標簽進行統一,然后在下一層級進行規則處理。
多標簽:一些場景下的標簽設置可能達到幾百個,可以設置多層級的標簽體系進行處理。例如,先構建標簽大類、再構建標簽小類;也可以設置多個二分類,適用于標簽分類相對獨立,并且經常需要新增修改的場景,能做到相互獨立、便于維護。
未知標簽:業務冷啟動時,如果尚不清楚設置哪些標簽合適,可以嘗試通過文本聚類方式初步劃分標簽,再輔以專家介入共同設定,這也是一個循環迭代的過程。
對于上述的「長尾標簽」和「易混淆標簽」,當然也可在模型層面進行優化,這往往涉及樣本不平衡和hard example的處理問題,我們在下文詳細闡述。
Q2: 標注是「人工」智能的精髓所在,如何省成本、魯棒、高效地構建任務數據集?
標簽定義好后,就需要構建分類任務數據集。數據集構建,是日常工作的重要一環。既要省成本、也要魯棒,更要高效。構建數據集的主要流程包括以下4步:
構建初始數據集:為每個標簽生產約100個樣本,具體的措施可以采取關鍵詞匹配等規則手段,再結合人工check進行。
「主動學習+遷移學習」降低標注規模:1)主動學習旨在挖掘高價值樣本:即通過構建較少的樣本就可以滿足指標要求。根據初始構建的數據集,可以train一個base model,然后挑選一些不確定性程度高(熵最大)+代表性高(非離群點)的樣本進行人工標注。2)遷移學習降低對數據的依賴:遷移學習中預訓練語言模型的成功,可以使其在較少的標注樣本上finetune就可達到目標指標。
擴充標注規模,數據增強最為關鍵:在標注規模較小的少樣本場景下,可以通過文本增強方式擴充數據集,撬動數據杠桿。在《NLP中的少樣本困境問題探究》一文中我們對有關的文本增強技術進行了詳細探究。
清洗數據噪音,讓模型更加魯棒:對于標注質量問題要嚴格把關,標志質量除了人工核查,也可以下面的方法自動化構建降噪系統:1)人工規則清洗:可以配置關鍵詞信息在內的黑白名單進行強規則清洗。2)交叉驗證:可以通過對訓練集進行交叉驗證,對那些標簽不一致的樣本進行去除或者人工糾正。3)置信學習:本質上是對交叉驗證的進一步推廣,構建置信度混淆矩陣并引入rank機制過濾噪聲樣本。《別讓數據坑了你!用置信學習找出錯誤標注》一文中有詳細介紹。4)深度KNN過濾:KNN中的最近鄰度量,使其在魯棒學習中更加有效。《Deep k-NN for Noisy Labels》一文表明:即使深度模型在含噪數據上進行訓練,而將模型中間層表示適配于KNN進行噪聲樣本過濾,效果提升也很明顯。
在構建數據集時,除了上述4步外,也要注重一些細節和原則問題:
針對少樣本問題,不能盲目追求前沿算法的變現落地。很多時候,我們總想寄托于某種方法能夠通用地解決低資源問題,但現實往往是策略調研的時間過長,指標增益還沒有直接人工補標數據來得快。筆者發現,絕大數少樣本問題,必要的人工標注不可少,多策略組合+“有計劃、有策略”的人工標注也許是解決少樣本問題的最佳方式。
智能標注是否是一個偽命題?智能標注的本質是高效,但主動學習往往并不高效。主動學習需要對專家系統多次查詢來進行標注。所以采用主動學習方法時,不僅要降低標注規模,也要注意降低查詢次數。實踐中,我們可以根據經驗公式,優先對指標增益明顯的類別標簽進行主動查詢。也可以根據經驗公式預估一下滿足增益目標的數據補充量,一次查詢盡量滿足要求,多標一點也沒關系。所謂的“智能標注系統”是否真正的智能,筆者總覺得多多少少還是不能脫離人工介入。
預訓練模型要具備領域性,不要停止預訓練!當我們所執行任務的標注數據較少,所屬的領域與初始預訓練語料越不相關,那就不要停止領域預訓練!
筆者這里給出了上述一些策略的簡要實驗結果,如下圖所示:
Q3: 模型化就是唯一嗎?分類任務中,算法策略構建的基本原則是什么?
算法策略主要包括規則挖掘和模型化方法,基本原則應是:
規則兜底:高頻case和hard case優先進入規則模塊,防止因模型的更新迭代,而使針對重要case的處理不夠健壯。規則挖掘主要包括重要case緩存、模式挖掘、關鍵詞+規則設置等。此外,規則也可以跟在分類模型后面進行兜底處理。
模型泛化:模型化方法適合處理無法命中規則的case,具備泛化性。還有另一種處理邏輯是:如果case命中了規則,但模型對于規則預測的結果給出了很低的置信度(也就是模型認為另一種類別的置信度更高),這時我們可以選擇相信模型,以模型輸出為準。
不過,無論是對于規則,還是模型,長尾問題的處理都是比較棘手的,但我們可以通過一些手段盡可能加強處理長尾case的能力(Q6中具體介紹)。
Q4: 特征挖掘立竿見影,如何在特征工程方面搞點事情?
對于NLP分類任務,特別是垂直領域的分類任務,如果能夠在業務特征層面更好地進行挖掘,那么指標增益可是立竿見影啊~
在特征工程方面,筆者這里主要給出了3種技巧:
離散數據挖掘
構建關鍵詞的高維稀疏特征:類似結構化數據挖掘(如CTR中的wide&deep),比如根據關鍵詞列表對文本內容進行挖掘,構建高維稀疏特征并喂入xDeepFM[1]中進行處理,最后與文本向量一同拼接。
其他業務特征:如疾病大類劃分、就診科室等業務特征。
文本特征挖掘
關鍵詞&實體詞與文本拼接:將從文本序列提取的關鍵詞或實體詞拼接在文本序列后,再進行分類。如在BERT中:[CLS][原始文本][SEP][關鍵詞1][SEP][實體詞1]...
關鍵詞embedding化:將關鍵詞劃分為不同的類別屬性,進行embedding化,不同于離散數據挖掘,這里的embedding不應稀疏。
領域化向量挖掘:除了在領域語料上繼續預訓練詞向量外,還可以有監督地構建詞向量:例如對于21分類問題,先根據弱監督方法訓練21個基于SVM的二分類器,然后提取每個詞匯在21個SVM中的權重,即可為每個詞匯可以構建21維的詞向量。
標簽特征融入
標簽embedding 化:設置label embedding,然后通過注意力機制與詞向量進行交互,提取全局向量分類。
標簽信息補充:可以將類別標簽與原始文本一同拼接,然后進行2分類,如在BERT中:[CLS][原始文本][SEP][類別標簽]。此外,也可以通過強化學習動態地補充標簽信息,具體可參考文獻[2]。
Q5: 數據為王,不要將數據閑置,如何將無標注數據更好地派上用場?
大量的無標注數據蘊藏著巨大的能量!機器學習中,能夠充分利用、并挖掘無標注數據價值的,自然是——自監督學習和半監督學習了。
自監督學習:乘風破浪的NLP預訓練語言模型充分利用了無標注數據,展現出強大能力。而如果我們設計分類任務時,能夠釋放更多的無標注數據,亦或者通過度量學習采集更多的無標注數據,就可以:
繼續進行任務級別的預訓練,這是一種廉價、快速提升指標的手段。
與分類任務一起構造語言模型loss,進行多任務學習。
半監督學習:半監督學習在CV中已經發揚光大,常常有兩種形式:
偽標:可分為自訓練和協同訓練,Q6中介紹的數據蒸餾就屬于自訓練的一種。在Google的最新論文《Rethinking Pre-training and Self-training》中,表明自監督的局限性,而自訓練表現良好,在每種條件設置下均能很好地發揮作用。可見,如果在NLP中能夠構建類似于ImageNet那樣大規模的有標簽數據集,自訓練“未來可期”。而聯合自監督預訓練和自訓練可能會獲得更大的增益。
一致性訓練:對于未標記數據,希望模型在其輸入受到輕微擾動時仍然產生相同的輸出分布,這種方式能夠提高一致性訓練性能,充分挖掘未標注數據中潛在的價值,最終增強泛化性能。
來自Google的《UDA:Unsupervised Data Augmentation for Consistency Training》結合了自監督預訓練和半監督學習中的一致性訓練,在六個文本分類任務進行了實驗,表明:
在少樣本場景下,借助UDA,最終能夠逼近全量數據集時所達到的指標:在IMDb的2分類任務上,具有20個標注數據的UDA優于在1250倍標注數據上訓練的SOTA模型。但相較于2分類任務,5分類任務難度更高,未來仍有提升空間。
全量數據下,融合UDA框架,性能也有一定提升。
下面是筆者的一些簡要實驗結果:
Q6: 攻克分類任務的難點:如何更好處理不平衡問題(hard example問題)?
不平衡問題(長尾問題)是文本分類任務一個難啃的骨頭。也許有人會問:為何不在初始構造數據集時,就讓每個分類標簽下的樣本數量相同,這不就解決不平衡問題了嗎?
事實上,不平衡問題不僅僅是分類標簽下樣本數量的不平衡,其本質上更是難易樣本的不平衡:即使樣本數量是平衡的,有的hard example還是很難學習。類似,對那些數量較少的類別進行學習,在不做數據補充的情況下,也可看作是一個hard example問題。
解決不平衡問題的通常思路有兩種:重采樣(re-sampling)和重加權(re-weighting):
(1)重采樣(re-sampling)
重采用的通用公式為:
為數據集的類別數量,為類別的樣本總數, 為從 類別中采樣一個樣本的概率., 表示所有類別都采樣相同數量的樣本。
常用的重采樣方法有:
欠采樣&過采樣&SMOTE
欠采樣:拋棄大量case,可能導致偏差加大;
過采樣:可能會導致過擬合;
SMOTE:一種近鄰插值,降低過擬合風險,但不能直接應用于NLP任務的離散空間插值。
數據增強:文本增強技術更適合于替代上述過采樣和SMOTE。
解耦特征和標簽分布:文獻[3] 認為對不平衡問題的再平衡本質應只是分類器的再平衡過程,類別標簽分布不應影響特征空間的分布。基于此,可以解耦類別標簽分布和特征空間分布:
首先不做任何再平衡,直接對原始數據訓練一個base_model。
將base_model的特征提取器freeze,通過類別平衡采樣(對尾部類別重采樣)只調整分類器。
分類器權重模與類別數量呈正相關,因此還需將做歸一化處理。
Curriculum Learning(課程學習):課程學習[4]是一種模擬人類學習過程的訓練策略,從易到難進行學習:
Sampling Scheduler:調整訓練集的數據分布,逐步將采樣數據集的樣本分布從原先的不平衡調整到后期的平衡狀態
Loss Scheduler:開始傾向于拉大不同類目之間特征的距離,后期再傾向于對特征做分類。
(2)重加權(re-weighting)
重加權就是改變分類loss。相較于重采樣,重加權loss更加靈活和方便。其常用方法有:
loss類別加權:通常根據類別數量進行加權,加權系數與類別數量成反比。
Focal Loss:上述loss類別加權主要關注正負樣本數量的不平衡,并沒有關注難易不平衡。Focal Loss主要關注難易樣本的不平衡問題,可根據對高置信度()樣本進行降權:
GHM Loss:GHM(gradient harmonizing mechanism) 是一種梯度調和機制。Focal Loss雖然強調對hard example的學習,但不是所有的hard example都值得關注,有的hard example很可能是離群點,過分關注不是錯上加錯了嗎?GHM定義了梯度模長g:
如下圖所示(圖片來自知乎[5]),梯度模長g接近于0的樣本數量最多,隨著梯度模長的增長,樣本數量迅速減少,但是在梯度模長接近于1時,樣本數量也挺多。
因此,GHM的出發點是:既不要關注那些容易學的樣本,也不要關注那些離群點特別難分的樣本。為此,作者定義了梯度密度,其物理含義是:單位梯度模長g部分的樣本個數。最終GHM Loss為:
Dice Loss:
與Focal Loss類似,訓練時推動模型更加關注困難的樣本,使用作為每個樣本的權重。改進之后的DSC為:
主要為了解決訓練和測試時F1指標不一致的問題,提出一個基于Dice Loss的自適應損失——DSC,對F1指標更加健壯:
對logit調整權重:實際上是將類別概率引入loss中,并對logit調整權重,本質上是一種通過互信息思想來緩解類別不平衡問題:
Q7: BERT時代,如何處理長文本分類?
由于顯存占用和算力的限制,BERT等預訓練語言模型的input一般來說最長512個token。某些場景下處理長文本分類,BERT可能還不如CNN效果好。為能讓BERT等更適合處理長文本,筆者從「文本處理」和「改進attention機制」兩個方面給出一些可以嘗試的方法:
(1)文本處理
固定截斷:一般來說,文本的開頭和結尾信息量較大,可以按照一定比例對截取出文本的開頭和結尾;
隨機截斷:如果固定截斷信息損失較大,可以在DataLoader中每次以不同的隨機概率進行截斷,這種截斷可以讓模型看到更多形態的case;
截斷&滑窗+預測平均:通過隨機截斷或者固定滑窗將一個樣本切割成多個樣本,在預測時對多個樣本的結果進行平均;
截斷+關鍵詞提取:采取直接截斷的方式可能會導致信息量損失,可以通過關鍵詞提取補充信息。如:[CLS][截斷文本][SEP][關鍵詞1][SEP][關鍵詞2]...
(2)改進attention機制
Transformer采取的attention機制,其時間復雜度為,其中為文本長度。最近一些paper聚焦于對attention機制的改進、降低計算復雜度,以更適合處理長文本序列。主要包括:
Reformer[6]:主要采取局部敏感哈希機制(Locality Sensitve Hashing,LSH),這種機制類似于桶排序:將相近的向量先歸為一類,只計算同類向量之間的點積,將時間復雜度降為O(nlog(n));考慮到相似的向量會被分到不同的桶里,Reformer進行了多輪LSH,但這反而會降低效率。
Linformer[7]:提出自注意力是低秩的,信息集中在少量(個)的最大奇異值中。Linformer利用線性映射將時間復雜度降為,當時,接近于線性時間。但實踐中表明,k增加效果會更好,k一般取256或512。
Longformer[8]:采取滑窗機制,只在固定窗口大小w內計算局部attention,復雜度降為,當時,接近于線性時間(實踐中仍然取512);為擴大感受野,也可以采取“膨脹滑窗機制”; 也可以在特殊位置,例如[CLS]處,局部地計算全局attention。詳見《Longformer:超越RoBERTa,為長文檔而生的預訓練模型》。
Big Bird[9]:在Longformer基礎上增加了Random attention,當前長序列建模的SOTA,刷新了QA和摘要的SOTA,同時也被證明是圖靈完備的。如下圖:
對于絕大數長文本分類問題,筆者建議首選「文本處理」方式。對于有條件的,可以采取上述「改進attention機制」方法進行嘗試,比如,對已經預訓練好的RoBERTa采取Longformer機制繼續預訓練。Longformer已經開源,并且可以直接在cuda內核上進行優化加速。
Q8: 預訓練融合:NLP競賽利器!
各大NLP競賽中,模型融合(集成)是一個重要的提分神器,而除了不同模型的融合,另一種更加有效的方式就是——預訓練融合。
在NLP任務中,不同模型的預測差異更多取決于底層模型(embedding層)的差異,這不同于CV領域往往取決于上層模型的異構程度。
那么怎么豐富底層模型呢?一個直接的方式就是把不同預訓練模型融合:如可以將word2vec、elmo、BERT、XLNET、ALBERT統一作為特征提取器,但這時需要注意(以下內容部分參考自"王然老師課程"[10],筆者進行了歸納整合):
一般不需要直接進行finetune。當然也可先單獨對BERT、XLNET、ALBERT進行finetune,然后再一起進行特征集成。
分詞器可以采取最佳預訓練模型的tokenizer,也可同時使用不同預訓練模型的tokenizer。
不要忽視簡單詞向量的作用。類似字詞向量、bi-gram向量的補充對于底層模型的豐富性很關鍵。
配置上層模型時,應注意學習率的調整。將集成的底層特征喂入biLSTM或CNN中,也可以拼接biLSTM和CNN共同作為上層模型。訓練時,可以先將底層預訓練模型freeze,只調整上層模型的學習率(較大),最后再全局調整學習率(較小)。
CLS最后一定還要再用一次。無論上層模型怎樣。CLS特征要再最后直接進入全連接層。
Q9: 你認真構造離線測試集了嗎?指標高,也許是虛高!
很多時候時候我們構造測試集,往往都是根據初始標注集自動劃分測試集,這在任務初期完全OK。但我們不能就此相信指標高,一切就OK。模型的評估環節至關重要,不能總是上線了才醒悟,不能總是等著線上badcase來迭代。
ACL2020最佳論文《Beyond Accuracy: Behavioral Testing of NLP Models with CHECKLIST》告訴我們:應通過CheckList全方位對模型多項“能力”進行評估,其可快速生成大規模的測試樣例。
筆者發現在具體實踐中,為了讓評估更加全面,其實可以:
積累同義詞庫、生僻字,進行性質不變測試、詞匯測試;
構造對抗樣本,進行攻擊測試;
防患于未然,提前撈一批數據,找到那些不確定性高的case進行測試;
從上述測試中,發現bug自然是一件好事,問題的暴露讓我們心里才有底。
最近開源的OpenAttack文本對抗攻擊工具包也可幫助我們進行魯棒性測試,主要包括:文本預處理、受害模型訪問、對抗樣本生成、對抗攻擊評測以及對抗訓練等。對抗攻擊能夠幫助暴露受害模型的弱點,有助于提高模型的魯棒性和可解釋性,具有重要的研究意義和應用價值。
Q10: 模型更新迭代時,如何進行增量學習,不遺忘先前記憶?
模型化的手段在進行更新迭代時,也許會出現遺忘問題,即對之前已經處理好的case不work。如果badcase不多,先采取規則優化是相對健壯的,可以用規則設置旁路,專門處置應急badcase。
此外,筆者給出以下幾種解決此問題的方案:
直接現有數據與原有數據混合訓練;
將特征抽取層freeze,對新類別只更新softMax全連接層;
采取知識蒸餾方式。在現有數據與原有數據混合一起訓練時,對原有類別進行蒸餾,指導新模型學習。
將分類標簽統一進行label embedding,新增類別單獨構建的label embedding不影響原有類別。從而將分類轉為一個match和rank問題。
Q11: 低耗時場景,如何讓TextCNN逼近BERT的效果?
BERT雖然強大,但在低耗時場景、少機器場景下,直接拿BERT部署分類模型通常行不通。我們是否可以采取一個輕量級的模型,比如TextCNN,去逼近BERT的效果呢?
為解決這一問題,我們通常采用知識蒸餾技術。蒸餾的本質是函數逼近,但如果直接將BERT(Teacher模型)蒸餾到一個十分輕量的TextCNN(Student模型),指標一般會下降。
如何盡量緩解這一情況呢?筆者根據「無標注數據規模大小」分別給出了2種蒸餾方案——模型蒸餾和數據蒸餾。
(1)模型蒸餾
如果業務中的無標注數據較少,我們通常采取logits近似(值近似)讓TextCNN進行學習,這種方式可稱之為模型蒸餾。這是一種離線蒸餾方式:即先對Teacher模型finetune,然后freeze,再讓Student模型學習。為避免蒸餾后指標下降明顯,我們可以采取以下方式改進:
數據增強:在蒸餾的同時引入文本增強技術,具體的增強技術可參考《NLP中的少樣本困境問題探究》。TinyBERT就采取了增強技術,以輔助蒸餾。
集成蒸餾:對不同Teacher模型(如不同的預訓練模型)的logits集成,讓TextCNN學習。「集成蒸餾+數據增強」可以有效避免指標明顯下降。
聯合蒸餾:不同于離線蒸餾,這是一種聯合訓練方式。Teacher模型訓練的同時,就將logits傳給Student模型學習。聯合蒸餾可以減輕異構化嚴重的Teacher和Student模型間的gap,Student模型可以慢慢從中間狀態進行學習,更好地模仿Teacher行為。
(2)數據蒸餾
如果業務中的無標注數據規模較大,我們可以采取標簽近似讓TextCNN進行學習。這種方式稱為數據蒸餾。其本質與偽標方法類似:讓Teacher模型對無標注數據進行偽標,再讓Student模型進行學習。其具體步驟為:
訓練1:BERT在標注數據集A上finetune,訓練一個bert_model;
偽標:bert_model對大量無標注數據U進行預測(偽標),然后根據置信度打分,選擇高置信度的數據B填充到標注數據A,這時候標注數據變為(A+B);
訓練2:基于標注數據A+B訓練TextCNN,得到textcnn_model_1;
訓練3(optional):讓第3步訓練好的textcnn_model_1基于標注數據A再訓練一次,形成最終模型textcnn_model_2;
對上述兩種蒸餾方式,筆者對業務中的一個21個分類任務(每類100條樣本)進行了實驗,相關結果如下:
從上圖可以看出,如果我們能夠獲取更多的無標注數據,采取數據蒸餾的方式則更為有效,可以讓一個輕量級的TextCNN最大程度逼近BERT。
不過也許有的讀者會問,為什么不直接蒸餾為一個淺層BERT呢?這當然可以,不過筆者這里推薦TextCNN的原因是:它實在太輕了,而且會更加方便引入一些業務相關的特征(會再之后的文章中再詳細介紹)。
如果仍然想蒸餾為一個淺層BERT,我們需要首先思考自己所在的領域是否與BERT原始預訓練領域的gap是否較大?如果gap較大,我們不要停止預訓練,繼續進行領域預訓練、然后再蒸餾;或者重新預訓練一個淺層BERT。此外,采取BERT上線時,也可以進行算子融合(Faster Transformer)或者混合精度等方式。
寫在最后
讓我們一起致敬:那些年陪我們一起入門(坑)NLP的分類模型吧~
-
機器學習
+關注
關注
66文章
8439瀏覽量
133087 -
數據集
+關注
關注
4文章
1209瀏覽量
24835 -
nlp
+關注
關注
1文章
489瀏覽量
22109
原文標題:打破BERT天花板:11種花式煉丹術刷爆NLP分類SOTA!
文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
《具身智能機器人系統》第7-9章閱讀心得之具身智能機器人與大模型
NLP技術在聊天機器人中的作用
【每天學點AI】KNN算法:簡單有效的機器學習分類器
![【每天學點AI】KNN算法:簡單有效的<b class='flag-5'>機器</b><b class='flag-5'>學習</b><b class='flag-5'>分類</b>器](https://file1.elecfans.com/web1/M00/F4/08/wKgaoWcjHw2Afh8GAABiK2PIrq8889.png)
【「時間序列與機器學習」閱讀體驗】時間序列的信息提取
【《時間序列與機器學習》閱讀體驗】+ 時間序列的信息提取
深度學習中的時間序列分類方法
nlp神經語言和NLP自然語言的區別和聯系
nlp自然語言處理的主要任務及技術方法
深度學習與nlp的區別在哪
NLP技術在機器人中的應用
基于神經網絡的呼吸音分類算法
一種利用光電容積描記(PPG)信號和深度學習模型對高血壓分類的新方法
機器學習多分類任務深度解析
![<b class='flag-5'>機器</b><b class='flag-5'>學習</b>多<b class='flag-5'>分類</b><b class='flag-5'>任務</b>深度解析](https://file1.elecfans.com/web2/M00/C4/BB/wKgZomX3rjmAQr-IAAADhkh42p0946.jpg)
評論