ccf-bdci 互聯網金融新實體發現9st 賽題基礎收穫總結

寫在前面

這場比賽真的是曠日持久,從8月25開始,直接幹到11月下旬。當然我是從國慶纔開始參賽。由於主辦方延長比賽時間,我甚至付出了專業課涼涼的代價(當然,不是掛科hhh),每天基本深更半夜不睡覺(有的時候打擾到舍友了,對不起┭┮﹏┭┮)。但是這次比賽真的收穫頗豐,經驗值估計比我大二一整年漲的都多。還有,真的,真的很感謝我的隊友,人真的超級nice nice nice,在我剛進比賽還是個小白的時候沒有嫌棄我,把自己攢的賽題經驗仔仔細細全給我講了一遍,工作忙的時候也在堅持着打比賽,每天都能和我交流一下,最終我們倆人兩套方案互補,算是衝進了前十。這個比賽是我真正意義上第二次參賽,也是我第一個拿到前十的比賽。


賽題描述:

提取出每篇文章中所有的金融新實體,
例如某篇文章的文本如下(此處只做示例,實際每篇文章文本長度遠遠大於以下示例):
度小滿金融在首次發佈的《科創板基金》中提到,今年前5月,京東金融的股票迅速升值。
那麼該篇文章對應的金融新實體列表爲:度小滿金融;科創板基金。
由於京東金融是知名的(金融)實體,所以“京東金融”並不算新實體。

個人理解:

結合出題方是“國家互聯網應急響應中心”來看,這個賽題的目的實際上是找那種類似校園貸的實體(其實就是不知名的金融實體)。
整個賽題要把握住的重點是:
①這個賽題實際上偏向於“領域詞抽取”(主要針對的是金融領域),但實際上卻又不失關鍵詞抽取的要素。
②注意把握賽題要求中“新實體發現”的“新”,題目中說明了:持有金融牌照的銀行、證券、保險、基金等機構、知名的互聯網企業如騰訊、淘寶、京東等認爲是已知實體(即不能讓這些已知實體出現在最終預測結果中)。


方案細節

我的方案具體邏輯思路和代碼已經放到我github上了,歡迎star
https://github.com/gaozhanfire/CCF-BDCI2019_Entity_Discovery
在這裏我只說一下本方案的重點、思考與可以改進的地方。

由本次比賽得到的一些基礎知識

數據清洗方面:

  • 不要,不要,不要洗的太乾淨!!
    這點在我做情感那個賽題的時候深有體會:
    我記得我當時清洗非常細節,細節到啥程度呢,有的標點是英語裏的標點,如“,”(還有其他的一些漢語符號),我把這些英語標點都統一歸一到了漢語的標點。我把什麼特殊符號啊、html標籤啥的都去掉了,還有停用詞也去掉了!!這些操作竟然讓我掉了3個千分點。個人覺得是bert已經足夠強大了,他可以分辨出那些網頁標籤、特殊符號之類的,並且能夠在其中提取出一些信息。(我最一開始實際上是把所有標點符號直接暴力去掉了,這樣效果更懶)

BIO和BIOES

如我github中寫的一樣,BIO標註,預測結果裏有好多好多斷開的詞(小米錢包被標成BOII),要不就是預測多了(小米錢包被標成“小米錢包的”),聽了隊友的推薦,我把bio換成了BIOES,真的提升了一些,我把這個歸結於BIOES的標註字符更多,模型對分類邊界的劃分更加清晰明確。(和crf轉移矩陣是不是有關係我還正在研究)

bert預訓練與fine-tune

這兩個過程是不一樣的!!!!
就拿普通的word2vec舉例,我們打比賽的時候常常先用gensim來訓練一個word2vec,然後用訓練好的embedding去接一個全連接層之類的,反向傳播,如果不固定embedding權重的話,在反向傳播的過程中,不僅會更新全連接層參數,還會更新embedding的權重!!!。
這實際上是分有兩個過程的
①訓練一個word2vec,這實際上稱爲“預訓練”過程
②使用訓練好的word2vec,接全連接做分類任務訓練,更新word2vec,這個過程纔是“fine-tune”

我看到有人說,反正有已經訓練好的bert權重,直接拿過來,只用下游任務做finetune就可以了,不用費時間去用新數據再練一下bert(預訓練),這實際上是錯誤的!!!
預訓練不僅可以用來使原來預訓練好的模型更加適應你的場景,更是因爲在預訓練的時候你不僅可以用訓練集的數據,還可以用測試集的數據!!而你用下游任務更新embedding,只能用訓練集來更新。

預訓練是非常非常重要的,好的預訓練方式以及預訓練時設置的參數能在embedding重新加入到模型後讓模型效果變得更加穩定。

bert的下游模型選擇以及是否要finetune

這個真的沒辦法憑經驗來說,比如初賽的時候我隊友的簡單全連接就是要比我的bilstm要好,因爲bert這個語言模型本來就非常強了,有的時候下游設計的更復雜甚至會帶來反效果。所以,像這種允許用bert的比賽,我們只能不斷的去測試不同的下游模型!!!

關於特徵work不work的問題

本次比賽初期,我設計了一個lgb模型,
模型輸入的負樣本是{京東、阿里、騰訊、百度……}這樣的知名實體集在文本中提取出來的特徵。
一開始的時候,我提取了很多特徵,比如“京東”在文本中的tfidf、在文本中的位置平均位置、詞的長度、文章的主題特徵(lsi)等等,然後上了一個百分位,效果非常好。
後來有一天我突然想去掉一些特徵,把詞在文本中的位置、詞的長度、lsi都去掉了,只留下了tfidf、tfidf在文章中所有詞的排名特徵,發現效果比原來更好了。這說明那些平均位置、文章主題等特徵都是沒用的。
我想去掉這些特徵的原因,是:我做這個模型的目的,是爲了去去掉這些知名實體(肯定不是金融新實體的實體),像‘京東’這個實體在文中的各個地方都有可能出現,且我的知名實體集裏也就 京東、騰訊、阿里、百度、AI……這麼幾種固定的實體,他們的詞長固定也就這麼幾種。數據的種類非常少,且造出來的特徵和我們的任務目標不符合(專業一些來說就是特徵與目標分佈相關性較小),這在一定程度上限制了特徵的發揮。所以,決定特徵能否發揮作用的不只有特徵的意義,還有數據的多樣性,數據分佈都會決定特徵是否能夠發揮作用。

關於“規則”的方法:

記住:大多數的規則都可以轉化成對應的特徵!
比如這次比賽裏,隊友寫的一條規則:去掉一篇文章預測出來的實體中,在文章中出現頻次最低的詞比頻次最高的詞 頻次差出10以上的。
這個就可以寫成我github中寫的“組特徵”

但是,如果把規則單獨拿出來寫腳本,由於規則是獨立、固定的,所以他和模型比可能會有很大的差異性,常常可以用規則來預測,之後和模型的結果做融合。

關於模型的參數:

這真的是我這次比賽收穫最深的一點:
有參數 lstm的維度,根據高校賽的經驗,最一開始我設置了512,比較大,後來偶然改成了256,發現線上有三個千分點的提升,後來改成了128,又來了三個千分點的提升。這說明不是神經元越多越好,而是要根據數據規模‘因地制宜’
同時,epoch、batch_size都會影響模型的效果:比賽後期,我將原本訓練輪次爲40,調整到了10,便有了幾個千分點的提升,後來把10改成1(即只訓練1輪),竟然又有了幾個千分點的提升,說明在小數據量下,一定要注意訓練輪次的控制!
同時 batchsize從512一直調至32,也獲得了很大的提升。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章