實戰(zhàn)文本分類對抗攻擊

文章寫得比較長,先列出大綱,以便讀者直取重點。

“文本分類對抗攻擊”是清華大學(xué)和阿里安全2020年2月舉辦的一場AI比賽,從開榜到比賽結(jié)束20天左右,內(nèi)容是主辦方在線提供1000條辱罵樣本,參賽者用算法逐條擾動,使線上模型將其判別為非辱罵樣本,盡量讓擾動較小同時又保留辱罵性質(zhì)(辱罵性質(zhì)前期由模型判定,最終由人工判定)。

比賽規(guī)則

線上模型和評測使用的1000條樣本不公開,選手根據(jù)賽方指定的接口實現(xiàn)算法,并用docker方式提交以供線上評測,每天最多評測15次,單次運行時間需控制在30分鐘之內(nèi)。
(第一個知識點:熟悉Docker,簡單環(huán)境調(diào)試)

其評價公式如下:

共1000條評測樣本(samples=1000且全部為辱罵文本),vi為最終的人工評測結(jié)果,1為辱罵,0為非辱罵在(只對最終入圍數(shù)據(jù)作人工評測,前期提交都認為vi=1);ci是分類結(jié)果,由多個線上模型作出評判并取均值,攻擊成功為1,攻擊失敗為0;pi是原始文本與擾動文本的差異,綜合考慮了字符差異和語義差異,最終結(jié)果Sfinal滿分為1000分。詳見賽題介紹: https://tianchi.aliyun.com/competition/entrance/231762/information 細看之下,可以發(fā)現(xiàn),其中最重要值是ci,如果未攻擊成功,該樣本ci得分為0,而修改的多少pi相對ci沒那么重要,只作為判斷句意變化的輔助手斷(否則整句替換將取得高分)。

比賽提供一個線下評測模型,它可能是多個線上模型之一,明顯弱于線上模型,也就是說能攻擊線下模型的算法,不一定能攻擊線上模型;過分與線下模型對抗還可能造成對線下模型過擬合,反而影響算法的線上效果。但對選手來說,線下模型是一個重要參考,可以使用它做基礎(chǔ)評價,此次比賽不提供訓(xùn)練數(shù)據(jù),因此自行收集數(shù)據(jù)后,可用線下模型來判別其辱罵性質(zhì)。

賽題可分解成兩部分:定位哪些詞是決定辱罵與否的關(guān)鍵詞,以及如何替換,一開始筆者的工作重心在前者,認為只要能定位得足夠精準,定位到足夠少的詞,隨意替換成特殊字符即可;后來發(fā)現(xiàn)替換特殊字符可能改變其辱罵性質(zhì),而替換成特殊字符與替換成詞線上得分差異非常大。因此,定位和生成都很重要。

收集數(shù)據(jù)

比賽不提供任何辱罵數(shù)據(jù),靠選手自行采集,賽方給出一個辱罵文本生成網(wǎng)站:罵人寶典https://nmsl.shadiao.app/,可使用它生成一些辱罵數(shù)據(jù)(罵得夠狠),試了一下,使用爬蟲只能抓取1500條左右,去重之后僅400多條,可見一斑,但不足以訓(xùn)練。
(第二個知識點:爬蟲與尋找辱罵場景,簡單的數(shù)據(jù)工程)

筆者絞盡腦汁尋找網(wǎng)絡(luò)辱罵的密集地帶,典型場景,卻始終未果。最終定位到豆瓣的低分影評,發(fā)現(xiàn)一星兩星的影評辱罵比例在10-20%左右。覺得挺奇怪,不喜歡還買票去看,看完了還罵,這是怎么想的,看了評分最低的10部電影,還真不是沒聽說的電影和演員,還不乏王晶、郭德綱、周潤發(fā)等明星,引起大家負面情緒可能不是實際的好壞,而是實際與期待的差異(差值):評價=實際-期待。

最終覺得下載太麻煩,于是在CSDN下載了影評數(shù)據(jù)庫,花一些C幣節(jié)省了時間。從中過濾出20000+辱罵數(shù)據(jù),這樣的數(shù)據(jù)量也可供簡單訓(xùn)練了。

另外,還下載了“網(wǎng)絡(luò)敏感詞”,用于關(guān)鍵字判別。一開始筆者認為帶臟字的才叫辱罵,畢竟網(wǎng)絡(luò)上長期以來都以此作為評價標準,后來發(fā)現(xiàn),如果只屏蔽臟字,得分在100之內(nèi)(約只占10%)。目前的模型可以通過詞之間的相互作用識別出大部分不帶臟字卻有攻擊性的語言,只是要消耗一些時間和算力。

算法嘗試

本次比賽筆者嘗試了很多算法,雖然最終模型用到的不多,但也算對自然語言對抗的一些學(xué)習(xí)和嘗試,在此分享。

對抗模型GAN

目前常用的對抗模型源自2014年的論文《Generative Adversarial Nets》,它同時訓(xùn)練兩個深度學(xué)習(xí)網(wǎng)絡(luò),生成模型G(進攻)和判別模型D(防守),比如用對抗模型生成卡通頭像,模型G用于生成頭像,模型D用于判別圖片是模型G生成的,還是實際的頭像。兩個模型交替訓(xùn)練,迭代提升。具體方法是通過梯度調(diào)整網(wǎng)絡(luò)參數(shù)。由于圖片是連續(xù)型數(shù)據(jù),因此可以通過逐步微調(diào)來改進模型。

對抗網(wǎng)絡(luò)生成序列數(shù)據(jù)時常使用SeqGAN方法,它源自2016年的論文《SeqGAN: Sequence Generative Adversarial Nets with Policy Gradient》,與簡單對抗不同的是,在一單次生成過程中,模型多次用到了生成模型G和判別模型D。以生成文字為例,每生成新詞時,調(diào)用生成模型G根據(jù)當前已生成的詞生成多個備選項,并使用判別模型對其評分(reward),根據(jù)評分選擇最好的策略Policy,并調(diào)整策略模型(Policy Gradient)。這里涉及很多強化學(xué)習(xí)中的概念。

本賽題只需要替換句中的少數(shù)文字,較少涉及GAN生成連續(xù)數(shù)據(jù)時遇到的問題,可以將語言模型(比如BERT)作為生成模型,線下模型作為判別模型,用生成語句的評分變化調(diào)整生成模型,從而生成不易被察覺的辱罵文本,但這樣做不能保證保留辱罵性質(zhì)。
(第二個知識點:對抗網(wǎng)絡(luò))

強化學(xué)習(xí)模型

強化模型中最重要的概念是狀態(tài)S,行為A,獎勵R,根據(jù)當前狀態(tài),選擇行為A,獲得獎勵R,然后逐步調(diào)整模型參數(shù),以便再次遇到狀態(tài)S時選擇更好的行為,以便得到更大獎勵。

近年來強化模型中最流行的算法是蒙特卡洛梯度策略,也是SeqGAN中用到的強化學(xué)習(xí)算法,蒙特卡洛樹搜索常用于情況非常多,無法一一列舉的場景,比如:當前比賽中一句話“ABCDEFGHIJKLMNOPQRSTUVWXYZ”,共26個詞,如果從中刪除三個詞(多數(shù)情況不止三個)能達到最佳效果,則有2600種可能,若判別每種可能性,并且每次都生成這幾個字的換代方案,將非常耗費時間。

最簡單的方法是隨機抽取,但是隨機抽取的效果又不好,蒙特卡洛樹搜索方法比較復(fù)雜,簡單地說,就是一開始隨機抽取一些組合,對其評分,并記錄下來,對于評分越高的組合賦予更高的下次被選中的概率,經(jīng)過多次迭代,使隨機抽取偏向評分更高的策略。梯度策略一般使用深度學(xué)習(xí)網(wǎng)絡(luò)與蒙特卡洛樹搜索相結(jié)合,用兩個模型分別調(diào)整策略和狀態(tài)價值,使模型更快收斂。

(第四個知識點:強化學(xué)習(xí)模型)

筆者借鑒了蒙特卡洛梯度策略中的強化高分項隨機抽取方法,作為定位辱罵關(guān)鍵詞的算法。

Attention模型

Attention模型最幾年超越了Text-CNN,RNN成為最流行的自然語言處理算法,其中又以GPT和BERT最為流行。GPT常用于生成文章,而BERT則更加靈活,由于其可參考前后兩個方向的上下文,在完型填空類的應(yīng)用中有明顯優(yōu)勢。

本賽題在定位了辱罵位置之后,需要用其它詞替換辱罵詞,類似于完型填空,非常適合使用BERT模型,且BERT模型源碼中提供了完型填空功能的API(筆者使用的是Transformers庫Pytorch版本的BertForMaskedLM)。由于BERT可下載中文的預(yù)訓(xùn)練模型,由此無需訓(xùn)練也可生成較為通順的語句。
(第五個知識點:自然語言處理模型)

在使用模型中也遇到一些問題:

  • BERT是結(jié)構(gòu)和參數(shù)都很巨大的模型,每次預(yù)測都很耗時(尤其是在沒有GPU支持的情況下),因此必須限制使用次數(shù),還有一種方案是使用ALBERT,它是一個簡化版的BERT,效果差異不大,但模型只有BERT的幾十分之一大小,速度也更快一些。

  • 是否需要使用自己構(gòu)建的辱罵數(shù)據(jù)集對BERT做fine-tune,這是個兩難選擇,如果find-tune,那么BERT生成的文本更趨近辱罵,更容易被模型識別,如果不fine-tune,生成非辱罵文本,最終版本又可能通不過人工評測。且本地數(shù)據(jù)集都使用線下模型過濾得到,這樣訓(xùn)練也可能會過擬合線下模型。

筆者還做了另外一些嘗試,比如訓(xùn)練GPT,使用BERT訓(xùn)練一個辱罵判別模型,把數(shù)據(jù)拆分成8:2分別用于訓(xùn)練和驗證時,測試集的成功率在97-98%,從它模型的Embedding層以及隱藏層中抽取數(shù)據(jù),希望能定位到一些辱罵的關(guān)鍵詞,但是由于數(shù)據(jù)過于細碎,最終沒能實現(xiàn)(當時沒想到用gensim根據(jù)Embedding找同義詞,以及用加減法做組合減去辱罵性質(zhì)的方法,后來覺得非常值得嘗試)。

筆者在本次比賽提交的最終版本中只使用了基本的BERT模型,每次選可能性最高的topN個詞作為備選項,選出其中辱罵評分最低的,并限制了調(diào)用次數(shù),同時嘗試批量預(yù)測以節(jié)約時間。但調(diào)用次數(shù)太少,線上沒能達到期望的效果。感覺最好的方法可能是使用BERT模型與評測工具相結(jié)合,先用辱罵數(shù)據(jù)fine-tune辱罵模型,然后在生成詞的過程中將評測工具的得分作為評價,讓模型向生成非辱罵的方向進化,聽起來就很矛盾,也還沒來得及嘗試。

其它算法

除了上述典型方案之外,筆者還嘗試了其它一些方法,下面列出其中比較有效的方法。

  • 計算差異
    對于句子“ABCDEFGHIJKLMKOPQRSTUVWXYZ”,從第1個字符開始,每添加一個字符,對該句進行一次評分,如:第一次“A”,第二次“AB”,并將二者差異作為B的評分,最終排序各詞的辱罵性質(zhì),依次替換分數(shù)最高的詞,如果替換后判別不是辱罵,則完成修改。這樣的好處在于,對于26個詞組成的句子,基礎(chǔ)判別只需要做26次,也明顯減少了替換次數(shù)。原理是如果某詞加入后分數(shù)明顯增加,則說明它是關(guān)鍵詞(可能由于與前詞組合后才變得關(guān)鍵),分越高越應(yīng)該被替換。 除了從前向后添加,還嘗試了從后向前添加,去掉某個詞后對句子評分等方法,其中上述的從前向后添加方法效果最好。 在強化學(xué)習(xí)的評價中也涉及差異對比,用相對打分(絕對分值減均值)替代絕對分數(shù),該方法在機器學(xué)習(xí)中也常用于抽取關(guān)鍵特征。

  • 辱罵詞替換
    估計絕大多數(shù)選手都使用了,敏感詞替換,比如把“某個親屬”,“某個動詞”替換成非敏感詞。這里筆者將其作為輔助手段,在其它處理完成之后進行了辱罵詞替換。主要根據(jù)“網(wǎng)絡(luò)敏感詞”表中“色情”中的內(nèi)容判別辱罵詞。

  • 高頻詞
    另外一種定位高頻詞的方法是使用蒙特卡羅方法定位各句中可能性最大的辱罵詞,并統(tǒng)計其中最高頻的詞,然后對各句替換這些詞。

可以看到,最高頻的詞是“你”,當時筆者認為這個詞太普遍,并未加以處理(此處埋下伏筆),而對其它一些更明顯的辱罵詞做了變換。

  • 與黑盒對抗
    線上模型對選手來說幾乎是黑盒,它與線下評測版本的差異只能靠猜測和試榜(盡可能多提交版本,通過線上得分猜測其內(nèi)部邏輯)。這樣對抗限制了很多模型的效果,因為線下評分變好,可能是對線下模型的過擬合,線上反而可能變差。換言之,這不完全是一個有監(jiān)督學(xué)習(xí)問題,因為線下的label并非線上的label,同樣也不完全算強化學(xué)習(xí)問題,因為線下的reward也不是真實的reward,除非我們自己在線下實現(xiàn)與線上類似的評測邏輯(短時間內(nèi)很難做到)。
    另外一個難點在于,最后還加入了人工評測,需要讓線上模型認為不是罵人,而人認為是罵人,又增加了一層難度,且這個層面的判別完成沒有l(wèi)abel和reward可用。

借鑒他人算法

終于在比賽結(jié)束前的最后一個小時沖進了排行榜第一頁(Top20),感覺像長跑比賽里,已經(jīng)筋疲力盡,還被前面的同學(xué)落下好幾圈,終于堅持跑到了終點,然后豁然輕松。晚上大家就在釘釘群里公開了很多方法,果然腦洞大開,總結(jié)如下:

弱點攻擊

一位大俠的算法是把實例中所有的“你”字替換成與之類似的同音同意字,并在該字之后加一個阿拉伯數(shù)字,只用一行代碼打到600多分,完勝所有人。 相信很多同學(xué)也觀察到了辱罵中“你”字的特殊性,但“你”在人的認知中明顯不是辱罵詞。后來賽方也在聊天時說,對有些明顯的辱罵詞做了保護,但也沒特殊處理“你”字,這便形成了最終被擊破的漏洞。 只替換“你”提分有限,更有趣的是他還在“你”后面加了數(shù)字,筆者認為這個方法可以用于攻擊文字組合后的特殊含義,尤其是打破了CNN、RNN類模型的前后依賴性,能想到這點也很厲害。 (第六個知識點:模型原理) 添加的還是“數(shù)字”,其實在賽方提供的demo中,就可以看到如果將“死”替換成4就能騙過模型,數(shù)字也可以算是一個漏洞,或者說暗門。而這位排名第一的大俠有效地結(jié)合了上述三點。

在文中加減內(nèi)容

大家也分別嘗試了向文中加符號,加空格,加文字來降低其辱罵性質(zhì),尤其對于短文本,試想如果句子只有兩個字,全部替換掉,則相似度得分為0,只替換其中一個,還可能被識別為辱罵,加入內(nèi)容也是個好辦法。但不知為何,筆者嘗試后并沒提分。刪除內(nèi)容也是一種方法,尤其是長文本可能導(dǎo)致大量計算,適當刪減也是一種好辦法。

用詞向量找同義詞

定位辱罵關(guān)鍵詞,并找同義詞替換,也是一種普遍使用的方法,有人使用了騰訊詞向量,它提供800多萬中文詞條,相對于傳統(tǒng)的同義詞詞林或詞表來說,可以說非常高科技了,但是它提供的是一個通常意義上的詞義,自然語言任務(wù)可用它從文字中提取特征向量化(供機器學(xué)習(xí)算法使用),下面是官方給出的示例。

除了近義詞,Gensim還提供了加法減法功能,比如“king” - “man” + “woman” ≈”queen”,也是很好的想法。 騰訊詞向量雖然內(nèi)容豐富,但是速度也非常慢,使用賽方提供的詞向量可能更好一些,另外,還可以用辱罵語料訓(xùn)練模型,并從中提取詞向量,以及使用上面提到的減法功能。已在blog上具體用法文檔。
(第七個知識點:知識面)

梯度攻擊

賽方比較推薦的方法是梯度攻擊,其原理是調(diào)整輸入讓損失函數(shù)變大,具體做法是損失函數(shù)對輸入求導(dǎo),然后根據(jù)導(dǎo)數(shù)方向調(diào)整輸入數(shù)據(jù),調(diào)整Embedding層數(shù)據(jù)后再通過詞向量工具反推具體文字。很巧妙的方法,如果不看論文,自己很難想到。

Fasttext模型

賽方給出的線下評測是Fasttext模型,速度快且效果好。賽后看了fasttext相關(guān)論文,發(fā)現(xiàn)似乎還可以從簡單模型與深度學(xué)習(xí)模型的差異下手來尋找漏洞,比如n-gram一般涉及的相關(guān)詞很少,因此通過拉大詞距,就可能造成干擾,也可以從中提取詞向量特征,詞袋模型不支持語序等等。

總結(jié)

攻擊比賽需要研究對方的算法原理,弱點。這一次沒有深入探索賽方提供的信息,本來是半黑盒,讓我理解成了全黑盒。沒好好讀題,然后越走越偏,太多explore又太少exploit,需要在未來的比賽中認真對待。

比賽和真實場景有很大差別,比賽可以通過試榜、擬合評價函數(shù)爭取高分,而實際場景中更重視問題本身,比如怎么能更好地識別辱罵,更好的保留句意和辱罵性質(zhì)同時騙過模型,如何利用新的技術(shù),泛化現(xiàn)有算法,而不僅是捕捉模型的漏洞。

這次雖然成績不佳,但也收獲頗豐:有的領(lǐng)域從未知到已知,有的從模糊到了解,有的從知道到使用。非常感謝賽方提供的平臺以及活躍在討論區(qū)的小伙伴們。

賽后一周回顧了比賽相關(guān)的技術(shù),寫了一些文檔:

生成對抗網(wǎng)絡(luò)GAN
https://blog.csdn.net/xieyan0811/article/details/104297872

序列對抗網(wǎng)絡(luò)SeqGAN
https://blog.csdn.net/xieyan0811/article/details/104820731

自然語言處理——使用詞向量(騰訊詞向量)
https://blog.csdn.net/xieyan0811/article/details/104737002

梯度攻擊
https://blog.csdn.net/xieyan0811/article/details/104790915

輕量級BERT模型ALBERT
https://blog.csdn.net/xieyan0811/article/details/104838175

強化學(xué)習(xí)(一)基本概念和工具
https://blog.csdn.net/xieyan0811/article/details/104848328

Fasttext快速文本分類
https://blog.csdn.net/xieyan0811/article/details/104873708

最近準備換一份自然語言處理(或者深度學(xué)習(xí))相關(guān)的算法工作,工作地點最好在北京海淀附近,可以給個機會的小伙伴請與我聯(lián)系哦。 :P 郵箱xieyan0811@sina.com,微信66768512。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文上兩篇系列 NLP的巨人肩膀(上) NLP的巨人肩膀(中) 4.6 Bidirectional Encoder...
    weizier閱讀 6,837評論 1 22
  • 睡在我身側(cè)小小的人兒呀,你怎么那么小,所以用好多表情和聲響來吸引我的注意力?咯咯的笑,突然的哭,嗷嗷的叫,啊啊的喊...
    鶴的小樹洞閱讀 176評論 1 1
  • 曾不止一次的看過佛家的四大愛情故事,還記得石橋禪。 電影《劍雨》中也有陸竹對細雨曾靜所說之石橋禪,愛就是這么簡單,...
    燕飛花閱讀 649評論 2 10
  • 望川河的兩旁全是火紅的彼岸花,讓這個黃泉更顯得凄涼?;ㄈ~生生不相見,而奈何橋旁的三生石,一直立在那里,多少人的命運...
    栗子顏閱讀 673評論 4 5
  • “一場秋雨一場寒”,秋雨后氣溫驟降,許多女性感到手腳冰涼,頭痛感冒、腸胃感染也就接踵而來。 這個時節(jié),秋涼傷人于無...
    上善若水_8eae閱讀 146評論 0 0

友情鏈接更多精彩內(nèi)容