第一次個人編程作業


0.作業聲明

這個作業屬於哪個課程 信安1912-軟件工程 (廣東工業大學 - 計算機學院)
這個作業要求在哪里 個人項目作業
這個作業的目標 論文查重

1.作業github鏈接

作業github鏈接

2.PSP表格

PSP2.1 Personal Software Process Stages 預計耗時(分鍾) 實際耗時(分鍾)
Planning 計划 15 5
Estimate 估計這個任務需要多少時間 15 5
Development 開發 300 330
Analysis 需求分析(包括學習新技術) 15 10
Design Spec 生成設計文檔 30 45
Design Review 設計復審 15 30
Coding Standard 代碼規范(為目前的開發制定合適的規范) 30 45
Design 具體設計 30 45
Coding 具體編碼 300 330
Code Review 代碼復審 30 15
Test 測試(自我測試,修改代碼,提交修改) 60 25
Reporting 報告 30 45
Test Reporting 測試報告 30 10
Size Measurement 計算工作量 15 5
Postmortem & Process Improvement Plan 事后總結,並提出過程改進計划 15 25
合計 930 970

3.計算模塊接口的設計與實現過程

0.設計前提

由於大二學年跟隨部分研究生師兄姐以及導師學習,所以學習內容與大部分同學不同,本人主要學習內容為深度學習(deep learning)中的自然語言處理(natural language processing),此次作業目標為論文查重,涉及到的自然語言處理任務為文本匹配,可用模型有dssm、cdssm、arc-ii、mvlstm、match_pyramid、drcn、esim。此處說明一些細節方面的問題,作業要求中指明輸出的相似度規范到小數點后兩位,原本程序對此按要求編程了,但為了體現程序的精確度和不同文件的差別,所以不約束相似度的計算結果,程序注釋了約束精度的代碼;其次是絕對路徑,本程序通過命令行可以輸入文件的絕對路徑並正常運行,但是為了博客和截圖的簡潔性,以下內容均通過相對路徑指定文件

1.模型簡介

dssm模型是早期為了解決文本匹配問題而被提出,其工作原理較為簡單,但其確實文本匹配領域的開山之作,后期誕生的模型大多都以dssm模型為base model改進,這里簡要描述一下dssm模型的工作原理:由於單詞或字符是可以不斷創造的,容易產生OOV(單詞不在詞庫的范圍內)的情況,於是先將傳進來的輸入經過一個word hashing,而word hashing實際上是一個tri-gram的操作,例如單詞boy,轉化為“#bo”、“boy”、“oy#”,這樣便可極大程度的消除OOV情況,從而也將維度從50w降到3w;然后經過三層全連接層,對輸入進行語義特征的提取;最終得到輸入的語義向量,根據對兩個輸入的語義向量求取余弦相似度,即等同於文本相似度

隨着時代的推移,卷積神經網絡誕生了,根據后世經驗,CNN在提取語義特征的功能絕對是優於全連接層,於是微軟公司針對DSSM在網絡架構方面的局限性,於2014年提出cssm模型的變種cdssm模型。程序中最終選擇效法的模型為cdssm模型,模型所涵蓋的知識點為詞向量(Word2Vec)、卷積神經網絡(CNN)、池化(pooling)、多層感知機(MLP)、Dropout,模型相較於dssm模型最大差別就在於使用CNN代替了全連接層用來提取語義特征

2.代碼組成

a.數據預處理函數pad_sequences

函數pad_sequences可對輸入的數據進行padding操作,比如如果輸入的數據短於程序設定的長度,剩余不足長度的序列將用[pad]來填充,這個操作推進了后期注意力機制中mask操作的出現;而如果輸入的數據長於程序設定的長度,超長的部分將被截斷,本程序設定最大長度前使用Notepad++查看過各文件的長度,均在35000個字符以下,於是設定最大長度為35000

b.模型定義函數bitter

模型定義函數bitter構建模型的網絡結構,定義一個embedding層,接着定義一個一維卷積層,一維卷積層的卷積核大小設置為3;為了節省部分不必要的時間,通過一個dropout層丟棄部分信息,后對信息序列分別進行全局最大池化,經過一層全連接層雙曲正切,送入多層感知機降維,最后輸出層使用softmax進行2分類任務,即是否為同義文

c.工作函數work

工作函數work先為程序設定了模型的參數,后獲取程序啟動時輸入的文件名,並獲取對應文件的內容,比如"python main.py paper_text.txt paper_add.txt similarity_number_1.txt",程序就可讀取指定的論文原文,增操作后的抄襲論文,保存重復率的文件路徑;獲取文本內容后,制作詞庫,做一個word to index字典,讓每一個字符對應一個下標,詞庫和字典供模型的embedding層將論文內容轉化為下標序列;調用模型定義函數,建立模型,編譯模型,然后預測相似度

f.主函數main

調用工作函數work

3.程序流程圖

4.算法關鍵及特殊點

算法的關鍵在於word hashing結構的存在,程序為了避免OOV的情況,采用了word hashing的操作,比如單詞"boy"就會被tri-gram分為"#bo"、"boy"、"oy#",單詞是可造可無限的,但是組成單詞的字符必是有限的,所以使用word hashing可以避免OOV的情況;同樣padding的存在也是必要的,padding使用[pad]補缺兩篇論文字數差,使得兩篇論文哪怕字數不一樣也可以進行比較

4.計算模塊接口部分的性能改進

1.從繁到簡的突破

參照作業要求中的限制,原先編程完畢的第一版程序不符合作業要求(5秒內給出答案,不能讀寫其他任何文件),此處簡介一下第一版程序:內含前文列舉的cdssm、arc-ii、mvlstm、match_pyramid、drcn、esim六種模型,均可以運行,且該六種模型均有經過訓練,保存了最優權重,訓練數據采用螞蟻金服2019年的NLP比賽數據,其中mvlstm、drcn、esim三種模型的訓練時間均在2h以上,並且在計算論文相似度的時候,六種模型均需要較長時間的預處理操作和加載預訓練權重以及預測操作,無法在5秒內給出答案,且占用大量顯存,其中受限於我本身的顯卡條件,esim模型甚至無法高精度運行,產生OOM的報錯,以下展示第一版程序的相關信息:

修改后的第二版程序刪去了arc-ii、mvlstm、match_pyramid、drcn、esim五種模型,僅保留了cdssm模型,其精度上對比第一版程序絕對是不如的,且刪除了預訓練操作,直接構建模型然后就投入使用,並將預處理操作一並放入一個.py文件內,極大地壓縮了占用空間與計算時間,雖然第一版程序較大,但后續會嘗試將第一版程序一同上傳

2.性能分析工具(VS 2019)

3.程序中消耗最大的函數

此處從work函數逐層分析尋找消耗最大函數

5.計算模塊部分單元測試展示

在test文件夾中存放了13個不同抄襲程度的論文供test.py使用"coverage run test.py"進行單元測試並記錄代碼覆蓋率,使用"coverage report"讀取前面保存的.coverage文件,輸出覆蓋率

6.計算模塊部分異常處理說明

1.文件路徑錯誤

正常的運行指令應類似於"python main.py paper_text.txt paper_add.txt,similarity_number_1.txt",但如果在輸入參數的時候,輸錯了文件名,則報錯FileNotFoundError,這個時候只要重新確認指令就可以了

2.空文件仍有相似度

在前文進行單元測試的時候,一個"nothing.txt"文件仍可以與原論文計算出0.50444204的相似度,這顯然是不合理的,此時修改代碼,在最后向答案文件輸入相似度的時候,添加一個判斷條件,具體如下:

7.總結

講道理,這第一次作業難度還是存在一點的,涉及到的具體知識較為廣泛,多為NLP領域知識,好在自身之前就在學習相關內容,第二版程序跑出來的結果依次如下,做完這次作業自身的收獲還是頗多的,反復修改代碼,寫bug改bug這個過程也是對自己耐心的一次鍛煉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM