朋友們,朋友們,事情是這樣的。最近心血來潮,突然想起很久以前看過的一個NLP視覺化包。它的效果是下面這個樣子:
在此之前,已經有一些文章從論文的角度對這個包進行了介紹,詳情請見推薦一個可互動的 Attention 視覺化工具!我的Transformer可解釋性有救啦?
當時我第一眼就被這個包的效果折服了,想著這麼有意思的東西,我高低得去試一試,於是我懷著好奇的心點進了這個專案的github主頁,作者給出的使用介紹很簡單:
-
首先,複製專案
git clone git@github.com:poloclub/dodrio.git
-
然後,進入專案目錄,安裝依賴
npm install
-
最後,直接執行即可
npm run dev
該專案會預設在localhost:5000建立一個本地服務,一旦執行完成且資料無誤,就可以在本地看到上面炫酷的介面。
但事情遠遠沒有那麼簡單,作者提供的模型只能解釋其預先選擇好的模型與資料集,要想真正用到自己的專案上,還需要對專案進行一定程度的客製化。於是大約在一年前,我嘗試按照作者寫在Readme中的方法,嘗試將自己的模型與自己的資料集使用這個包進行視覺化。殊不知,這對於我來說是噩夢的開始。在實驗過程中,我遇到的困難包括且不僅限於以下幾點:
-
該專案需要安裝許多的依賴包,許多包存在著過期、更新等問題。同時,在本地部署時還會由於網路問題導致許多依賴無法正常安裝。最重要的是,由於該包使用的Transformers版本是3.3.1,Python版本高於3.7將無法正常地安裝與使用。
-
在遠端伺服器(例如Google Colab)等部署時,就不用擔心出現網路問題導致的安裝依賴失敗,但由於服務是部署在本地,所以還需要使用nagrok、localtunnel等工具進行對映。
-
在data-generation.py中,除了修改模型與資料集外,一些函式的用法與位置也發生了改變,因此需要自己慢慢摸索與除錯。
-
... ... ... ...
總之,之前嘗試了很久之後還是沒有結果,遂放棄。但是最近機緣巧合之中又接觸到了這個包,恰逢《灌籃高手》上映,滿腔熱血無處釋放,遂決定與這個磨人的包一教高下。
直言結論,仍然可以使用,並且可以針對本地模型與本地資料集進行客製化,以下列舉除錯過程中的一些重點:
-
首先確保環境中的
Transformers==3.3.1
,其次,請pip install umap-learn
而不是pip install umap
,並在dodrio-data-gen.py
的開頭使用import umap.umap_ as umap
代替import umap
-
程式碼中存在大量的從checkpoint中匯入模型,請根據實際需求註釋掉或修改路徑。
-
在執行
dodrio-data-gen.py
前,要先在其同級目錄下建立outputs資料夾,同時,在outputs資料夾下建立你的模型名-attention-data
資料夾(用來儲存attention權重) -
在執行
dodrio-data-gen.py
時,可能會遇到各種各樣的報錯,對此,耐心尋找原因,都不難改。 -
成功執行完
dodrio-data-gen.py
後,會在目錄下生成如下所示的這些檔案:
-
最重要的是!!!!!!!專案從json檔案中抽取資料時,在多個svelte檔案中預設選擇第1562個元素,但大多數情況下你的資料集中不一定有第1562項,因此你需要去多個檔案中手動修改(當然也可以透過寫config檔案修改,但我是java小白,所以煩請大佬指導)
處理完以上這些步驟,就可以生成基於你自己模型與資料集的炫酷視覺化影像了,效果如下:
## 好了,說了那麼多,如果還是看不懂怎麼辦,這裡附上我自己的傻瓜式教程:
Step 1. 下載專案(或者直接使用遠端伺服器也可以)
git clone git@github.com:poloclub/dodrio.git
Step 2. 安裝依賴
npm install
Step 3. 檢查你的環境
首先,要保證Python版本最好不大於3.7,以便安裝Transformers==3.3.1
,然後,安裝一些必要的Python包,缺啥補啥,這個沒什麼好說的,注意要安裝umap-learn
而不是umap
Step 4. 進入dodrio資料夾修改data-generation/dodorio-data-gen.py
檔案:
首先,line65、line66、line71,line73分別修改你的標籤數量、標籤名、資料集名、要載入的Tokenizer;其次,line876左右,修改你的資料集地址,最好按照原資料集格式對你的資料集進行處理,我是這樣做的:
點選檢視程式碼
dataset_test = load_dataset('seamew/ChnSentiCorp', split='train[:20%]')
dataset_test = dataset_test.rename_columns({"text": "sentence"})
idx = range(len(dataset_test))
dataset_test = dataset_test.add_column("idx", idx)
其次,在dodorio-data-gen.py
中,有許多:
點選檢視程式碼
checkpoint = torch.load('./outputs/saved-bert-' + dataset_name + '.pt')
my_model.load_state_dict(checkpoint['model'])
如果你本地有checkpoint,那麼就改成你自己的地址,如果沒有,就直接註釋掉,程式碼中有較多處,建議直接搜尋並修改。
Step 5. 在執行dodrio-data-gen.py
前,要先在其同級目錄下建立outputs資料夾,同時,在outputs資料夾下建立你的模型名-attention-data
資料夾(用來儲存attention權重)。到這裡為止,你應該已經成功執行完了dodrio-data-gen.py
檔案,那麼你會發現其同級目錄下多出了這些檔案:
然後,將生成的所有檔案以及所有資料夾移到dodrio/public/data
下。
Step 6. 然後,最重要的一步,開啟dodrio/Main.svelte
,修改檔案中的檔案路徑(與你上一步中生成的檔名稱對應):
Step 7. 恭喜你到了這一步,接下來,要修改這個粗心作者犯下的錯誤。在專案中,作者將示例檔案的ID固定成了1562,但往往我們使用的樣本並沒有1562這個樣本,於是請你點選進入longest-300-id.json
檔案中,檢視你的資料集包含哪些樣本,及其ID為多少,選擇一個你想測試的句子,記住它的ID。這裡我假設想要測試的句子ID為1。、
去github中搜尋所有存在Instence以及1562的欄位,然後將所有的1562替換成1即可。