天天看點

基線提升至96.45%:2022 司法杯犯罪事實實體識别資料蒸餾主動學習

作者:汀丶人工智能

本項目給出本次法研杯詳細的技術方案,從UIE-base開始到UIE資料蒸餾以及主動學習的建議,歡迎大家嘗試,ps:主動學習标注需要自行實作,參考項目,樓主就不标注了。

項目連結:https://aistudio.baidu.com/aistudio/projectdetail/4911042?contributionType=1

0.法研杯 LAIC2022 司法人工智能挑戰賽犯罪事實實體識别

0.1比賽簡介

任務介紹

本賽道由中國司法大資料研究院承辦。

犯罪事實實體識别是司法NLP應用中的一項核心基礎任務,能為多種下遊場景所複用,是案件特征提取、類案推薦等衆多NLP任務的重要基礎工具。本賽題要求選手使用模型抽取出犯罪事實中相關預定義實體。

與傳統的實體抽取不同,犯罪事實中的實體具有領域性強、分布不均衡等特性。

官網:http://data.court.gov.cn/pages/laic.html

資料介紹

  • (1) 本賽題資料來源于危險駕駛罪的犯罪事實,分為有标注樣本和無标注樣本,供選手選擇使用;
  • (2) 資料格式:訓練集資料每一行表示為一個樣本,context表示犯罪事實,entities表示實體對應的标簽(label)及其位置資訊(span);entities_text表示每個标簽label對應的實體内容;
  • (3) 兩條标注樣本之間以換行符為分割;
  • (4) 訓練集:有标注訓練樣本:200條(分初賽、複賽兩次提供,資料集包括驗證集,不再單獨提供驗證集,由選手自己切分);無标注樣本10000條;
  • (5) 标注樣本示例:
{"datasetid": "2552", "id": "813087", "context": "經審理查明,2014年4月12日下午,被告人鄭某某酒後駕駛二輪機車由永定縣鳳城鎮往仙師鄉方向行駛過程中,與鄭某甲駕駛的小轎車相碰刮,造成交通事故。經福建南方司法鑒定中心司法鑒定,事發時被告人鄭某某血樣中檢出乙醇,乙醇含量為193.27mg/100ml血。經永定縣警察局交通管理大隊責任認定,被告人鄭某某及被害人鄭某甲均負事故的同等責任。案發後,被告人鄭某某與被害人鄭某甲已達成民事賠償協定并已履行,被告人鄭某某的行為已得到被害人鄭某甲的諒解。另查明,被告人鄭某某的機動車駕駛證E證已于2014年2月6日到期,且未在合理期限内辦理相應續期手續。", "entities": [{"label": "11341", "span": ["25;27"]}, {"label": "11339", "span": ["29;34"]}, {"label": "11344", "span": ["54;57", "156;159", "183;186", "215;218"]}, {"label": "11345", "span": ["60;63"]}, {"label": "11342", "span": ["34;47"]}, {"label": "11348", "span": ["164;168"]}], "entities_text": {"11341": ["酒後"], "11339": ["二輪機車"], "11344": ["鄭某甲", "鄭某甲", "鄭某甲", "鄭某甲"], "11345": ["小轎車"], "11342": ["由永定縣鳳城鎮往仙師鄉方向"], "11348": ["同等責任"]}}
           

評價方式:

$F_1=\frac{2 \times \text { 準确率 }(\text { precision }) \times \text { 召回率 }(\text { recall })}{\text { 準确率 }(\text { precision })+\text { 召回率 }(\text { recall })}$

其中:精确率(precision):識别出正确的實體數/識别出的實體數,召回率(recall):識别出正确的實體數 / 樣本的實體數

相關要求及送出說明

初賽階段采用上傳預測答案的方式進行測評,複賽需上傳模型,請選手嚴格按照以下說明規範送出:

1. 本賽題不允許通過增加額外有監督樣本數量提升模型的預測效果。

2. 隻允許産出一個模型,複賽前需要列印模型結構進行驗證。主模型不允許多個模型串行或者并行,比如bert+bert;主模型以外允許适當的結構串行,比如bert+crf。模型結構随壓縮包提供。

3. 模型存儲空間 ≤2.0G。

4. 法研基線模型請前往LAIC2022GitHub網站;請務必按照README中的相關說明組織檔案,并制成ZIP壓縮包上傳。
           

賽程安排

1. 初賽階段(2022年9月21日-2022年12月09日)

釋放初賽資料集,開放初賽排名榜。選手所送出答案的得分超過初賽基線模型分數,自動晉級複賽。

2. 複賽階段(2022年10月31日-2022年12月09日)

釋放複賽資料集,開放複賽排名榜;選手于複賽結束前選擇三個模型和所選模型對應的源代碼等審查材料[注]進入封測評審階段。

3. 封測評審階段(2022年12月10日-12月25日)

模型将在封閉資料集上進行測試,獲得模型的封測成績。

4. 技術交流會(2022年12月下旬)

邀請成績優異的選手進行模型分享,并和專家觀衆進行論證和讨論。

5. 釋出成績(2022年12月底)

公布最終成績,參賽者的最終成績為模型的封測成績和複賽成績按7:3權重取得的分數的最高分。

注:請提前準備,若未在規定時間内送出,視為放棄。

若選手所提供的源代碼無法複現初複賽結果,或被判為成績無效,最終解釋權歸中國司法大資料研究院所有。
           

結果預覽:

| 模型 |Precision |Recall| F1 | | --------| -------- | -------- | -------- | | Base | 88.96 |95.37 | 92.06 | | Base+全量 | 93.86 (+4.9) |99.2 (+3.83) | 96.45 (+4.39) | | UIE Slim | 98.632 (+9.67) | 98.736 (+3.37) | 98.684(+6.62) |

基線提升至96.45%:2022 司法杯犯罪事實實體識别資料蒸餾主動學習

0.2 資料集預覽:

無标注:

{"fullText": "經審理查明,2016年6月4日0時57分許,被告人張偉飲酒後駕駛号跨界高爾夫牌小型轎車由北向南行駛至濱河東路南中環橋向西轉匝道路段時,遇張某駕駛的無号牌東風-福龍馬牌中型載貨專項作業車逆向行駛後準備向南右轉時橫在濱河東路中間,二車發生相撞,造成同乘人曹某當場死亡、同乘人楊某經醫院搶救無效死亡、張偉本人受傷及兩車損壞的交通事故。經鑒定,從張偉送檢的血樣中檢出乙醇成分,含量為140.97mg/100ml。從張某送檢的血樣中未檢出乙醇成分,經交警部門依法認定,張偉、張某承擔事故的同等責任,楊某、曹某無責任。2016年6月13日,張某所屬的太原市高新技術産業開發區環境衛生管理中心向曹某、楊某家屬進行了民事賠償。被害人曹某的家屬對被告人張偉的行為表示諒解。", "id": "dfe98005-0491-4015-94ff-a7f50185aa70"}
           

有标注:

{"id": "813046", "context": "經審理查明,2016年9月24日19時20分許,被告人陳某某酒後駕駛蒙L80783号比亞迪牌小型轎車由東向西行駛至内蒙古自治區鄂爾多斯市準格爾旗薛家灣鎮鑫凱盛小區“金娃娃拉面館”門前道路處時,與由西向東行駛至此處的駕駛人範某某駕駛的蒙ANB577号豐田牌小型越野客車相撞,造成兩車不同程度受損的道路交通事故。被告人陳某某在該起事故中承擔同等責任。經某政府1鑒定,被告人陳某某血液酒精含量檢驗結果為259.598mg/100ml,屬醉酒狀态。被告人陳某某明知他人報警而在現場等候。2016年9月29日被告人陳某某的妻子馮某某與駕駛人範某某就車損賠償達成了私了協定書。", "entities": [{"label": "11341", "span": ["30;32"]}, {"label": "11339", "span": ["46;50"]}, {"label": "11340", "span": ["50;56"]}, {"label": "11342", "span": ["57;94"]}, {"label": "11346", "span": ["97;106"]}, {"label": "11344", "span": ["110;113", "265;268"]}, {"label": "11345", "span": ["127;133"]}, {"label": "11348", "span": ["168;172"]}, {"label": "11350", "span": ["215;219"]}], "entities_text": {"11341": ["酒後"], "11339": ["小型轎車"], "11340": ["由東向西行駛"], "11342": ["内蒙古自治區鄂爾多斯市準格爾旗薛家灣鎮鑫凱盛小區“金娃娃拉面館”門前道路處"], "11346": ["由西向東行駛至此處"], "11344": ["範某某", "範某某"], "11345": ["小型越野客車"], "11348": ["同等責任"], "11350": ["醉酒狀态"]}}
           

實體類型:

'11339': '被告人交通工具',
    '11340': '被告人行駛情況',
    '11341': '被告人違規情況',
    '11342': '行為地點',
    '11343': '搭載人姓名',
    '11344': '其他事件參與人',
    '11345': '參與人交通工具',
    '11346': '參與人行駛情況',
    '11347': '參與人違規情況',
    '11348': '被告人責任認定',
    '11349': '參與人責任認定',
    '11350': '被告人行為總結',
           

1.baseline——模型訓練預測(UIE model)

UIE模型使用情況參考下面連結,寫的很詳細了要考慮了工業部署情況方案

參考連結:

UIE Slim滿足工業應用場景,解決推理部署耗時問題,提升效能!

PaddleNLP之UIE資訊抽取小樣本進階(二)[含doccano詳解]

Paddlenlp之UIE模型實戰實體抽取任務【打車資料、快遞單】

1.1 資料處理

#資料轉化
import json

span={'11339': '被告人交通工具',
    '11340': '被告人行駛情況',
    '11341': '被告人違規情況',
    '11342': '行為地點',
    '11343': '搭載人姓名',
    '11344': '其他事件參與人',
    '11345': '參與人交通工具',
    '11346': '參與人行駛情況',
    '11347': '參與人違規情況',
    '11348': '被告人責任認定',
    '11349': '參與人責任認定',
    '11350': '被告人行為總結',
    }

def convert_record(source):
    target = {}
    target["id"] = int(source["id"])
    target["text"] = source["context"]
    target["relations"] = []
    target["entities"] = []
    id = 0
    for item in source["entities"]:
        for i in range(len((item['span']))):
            tmp = {}
            tmp['id'] = id        
            id = id + 1
            tmp['start_offset'] = int(item['span'][i].split(';')[0])
            tmp['end_offset'] = int(item['span'][i].split(';')[1])
            tmp['label'] = span[item['label']]
            target["entities"].append(tmp)
    return target


if __name__ == '__main__':
    train_file = 'data/train.json'
    json_data = []
    content_len=[]
    for line in open(train_file, 'r',encoding='utf-8'):
        json_data.append(json.loads(line))
        content_len.append(len(json.loads(line)["context"]))
    ff = open('data/train_new.txt', 'w')
    for item in json_data:
        target = convert_record(item)
        ff.write(json.dumps(target, ensure_ascii=False ) + '\n')
    ff.close()
    print(content_len)
           

1.2 模型訓練驗證

#模型訓練
!python finetune.py \
    --train_path "./data/train.txt" \
    --dev_path "./data/dev.txt" \
    --save_dir "./checkpoint_base" \
    --learning_rate 5e-6  \
    --batch_size 32 \
    --max_seq_len 512 \
    --num_epochs 30 \
    --model "uie-base" \
    --seed 1000 \
    --logging_steps 10 \
    --valid_steps 100 \
    --device "gpu"
           

訓練結果預覽:

[2022-10-31 10:25:43,181] [    INFO] - global step 510, epoch: 8, loss: 0.00172, speed: 2.33 step/s
[2022-10-31 10:25:45,959] [    INFO] - global step 520, epoch: 8, loss: 0.00171, speed: 3.60 step/s
[2022-10-31 10:25:51,260] [    INFO] - global step 530, epoch: 9, loss: 0.00169, speed: 1.89 step/s
[2022-10-31 10:25:55,512] [    INFO] - global step 540, epoch: 9, loss: 0.00167, speed: 2.35 step/s
[2022-10-31 10:25:59,746] [    INFO] - global step 550, epoch: 9, loss: 0.00166, speed: 2.36 step/s
[2022-10-31 10:26:04,010] [    INFO] - global step 560, epoch: 9, loss: 0.00164, speed: 2.35 step/s
[2022-10-31 10:26:08,215] [    INFO] - global step 570, epoch: 9, loss: 0.00162, speed: 2.38 step/s
[2022-10-31 10:26:12,343] [    INFO] - global step 580, epoch: 9, loss: 0.00160, speed: 2.42 step/s
[2022-10-31 10:26:16,597] [    INFO] - global step 590, epoch: 10, loss: 0.00159, speed: 2.35 step/s
[2022-10-31 10:26:20,881] [    INFO] - global step 600, epoch: 10, loss: 0.00157, speed: 2.33 step/s
[2022-10-31 10:26:26,571] [    INFO] - Evaluation precision: 0.90678, recall: 0.89727, F1: 0.90200
[2022-10-31 10:26:26,571] [    INFO] - best F1 performence has been updated: 0.87898 --> 0.90200
best模型已儲存
           
基線提升至96.45%:2022 司法杯犯罪事實實體識别資料蒸餾主動學習
基線提升至96.45%:2022 司法杯犯罪事實實體識别資料蒸餾主動學習
基線提升至96.45%:2022 司法杯犯罪事實實體識别資料蒸餾主動學習
#模型評估
!python evaluate.py \
    --model_path ./checkpoint_base/model_best \
    --test_path ./data/dev.txt \
    --batch_size 16 \
    --max_seq_len 512
           
[2022-10-31 10:31:33,982] [    INFO] - -----------------------------
[2022-10-31 10:31:33,983] [    INFO] - Class Name: all_classes
[2022-10-31 10:31:33,983] [    INFO] - Evaluation Precision: 0.90678 | Recall: 0.89727 | F1: 0.90200
           
!python evaluate.py \
    --model_path ./checkpoint_base/model_best \
    --test_path ./data/dev.txt \
    --debug
           
[2022-10-31 10:31:43,857] [    INFO] - -----------------------------
[2022-10-31 10:31:43,857] [    INFO] - Class Name: 被告人交通工具
[2022-10-31 10:31:43,857] [    INFO] - Evaluation Precision: 0.97500 | Recall: 0.95122 | F1: 0.96296
[2022-10-31 10:31:44,297] [    INFO] - -----------------------------
[2022-10-31 10:31:44,297] [    INFO] - Class Name: 行為地點
[2022-10-31 10:31:44,297] [    INFO] - Evaluation Precision: 1.00000 | Recall: 0.94872 | F1: 0.97368
[2022-10-31 10:31:44,780] [    INFO] - -----------------------------
[2022-10-31 10:31:44,781] [    INFO] - Class Name: 其他事件參與人
[2022-10-31 10:31:44,781] [    INFO] - Evaluation Precision: 0.90604 | Recall: 0.95745 | F1: 0.93103
[2022-10-31 10:31:44,898] [    INFO] - -----------------------------
[2022-10-31 10:31:44,898] [    INFO] - Class Name: 被告人行為總結
[2022-10-31 10:31:44,898] [    INFO] - Evaluation Precision: 1.00000 | Recall: 0.70000 | F1: 0.82353
[2022-10-31 10:31:45,324] [    INFO] - -----------------------------
[2022-10-31 10:31:45,324] [    INFO] - Class Name: 被告人責任認定
[2022-10-31 10:31:45,325] [    INFO] - Evaluation Precision: 0.89474 | Recall: 0.91892 | F1: 0.90667
[2022-10-31 10:31:45,775] [    INFO] - -----------------------------
[2022-10-31 10:31:45,775] [    INFO] - Class Name: 被告人違規情況
[2022-10-31 10:31:45,776] [    INFO] - Evaluation Precision: 0.90909 | Recall: 0.87719 | F1: 0.89286
[2022-10-31 10:31:46,124] [    INFO] - -----------------------------
[2022-10-31 10:31:46,124] [    INFO] - Class Name: 被告人行駛情況
[2022-10-31 10:31:46,124] [    INFO] - Evaluation Precision: 0.94286 | Recall: 0.86842 | F1: 0.90411
[2022-10-31 10:31:46,574] [    INFO] - -----------------------------
[2022-10-31 10:31:46,574] [    INFO] - Class Name: 參與人交通工具
[2022-10-31 10:31:46,574] [    INFO] - Evaluation Precision: 0.93617 | Recall: 0.93617 | F1: 0.93617
[2022-10-31 10:31:46,924] [    INFO] - -----------------------------
[2022-10-31 10:31:46,924] [    INFO] - Class Name: 參與人行駛情況
[2022-10-31 10:31:46,924] [    INFO] - Evaluation Precision: 0.82353 | Recall: 0.77778 | F1: 0.80000
[2022-10-31 10:31:47,137] [    INFO] - -----------------------------
[2022-10-31 10:31:47,137] [    INFO] - Class Name: 參與人責任認定
[2022-10-31 10:31:47,137] [    INFO] - Evaluation Precision: 0.86667 | Recall: 0.76471 | F1: 0.81250
[2022-10-31 10:31:47,191] [    INFO] - -----------------------------
[2022-10-31 10:31:47,191] [    INFO] - Class Name: 搭載人姓名
[2022-10-31 10:31:47,191] [    INFO] - Evaluation Precision: 1.00000 | Recall: 0.85714 | F1: 0.92308
[2022-10-31 10:31:47,246] [    INFO] - -----------------------------
[2022-10-31 10:31:47,246] [    INFO] - Class Name: 參與人違規情況
[2022-10-31 10:31:47,246] [    INFO] - Evaluation Precision: 1.00000 | Recall: 0.28571 | F1: 0.44444
           

1.3模型預測

# 預測
import json
from paddlenlp import Taskflow

def predict(ie, result_item):
    result = ie(result_item['context'])[0]
    # print(result)
    sub_list = []
    for item in result:
        sub_tmp = {}
        sub_tmp["label"] = str(keys[values.index(str(item))])

        all_search=str_all_index(result_item['context'], result[item][0]["text"])
        txt_list=[]
        sub_span=[]
        if len(result[item])==1:
            for i in range(len(all_search)):            
                txt_list.append(result[item][0]["text"])            
                sub_span.append([all_search[i], all_search[i] +len(result[item][0]["text"])])    
        else:
            for i in range(len(result[item])):                
                txt_list.append(result[item][i]["text"])            
                sub_span.append([result[item][i]["start"], result[item][i]["end"]])   
        sub_tmp["text"]=txt_list
        sub_tmp["span"]=sub_span
        sub_list.append(sub_tmp)
    result_item["entities"] = sub_list    
    return result_item

if __name__ == '__main__':
    test_file = 'data/test.json'
    span={'11339': '被告人交通工具',
        '11340': '被告人行駛情況',
        '11341': '被告人違規情況',
        '11342': '行為地點',
        '11343': '搭載人姓名',
        '11344': '其他事件參與人',
        '11345': '參與人交通工具',
        '11346': '參與人行駛情況',
        '11347': '參與人違規情況',
        '11348': '被告人責任認定',
        '11349': '參與人責任認定',
        '11350': '被告人行為總結',
        }
    values = list(span.values())
    keys=list(span.keys())
    # idx = values.index("被告人交通工具")
    # print(idx)
    # print(keys)
    # key = keys[idx]
    # print(key)
    schema = span.values()

    # 設定抽取目标和定制化模型權重路徑
    ie = Taskflow("information_extraction", schema=schema,batch_size=32,precision='fp32',use_faster=True, task_path='./checkpoint_base/model_best')

    ff = open('output/result_base.txt', 'w')
    for line in open(test_file, 'r',encoding='utf-8'):
        result_item=json.loads(line)
        target = predict(ie, result_item)
        ff.write(json.dumps(target, ensure_ascii=False) + '\n')
    ff.close()
    print("資料結果已導出")
           

部分結果預覽:

{"id": "812546", "context": "經審理查明,2016年3月12日15時50分許,被告人王某酒後駕駛無牌普通兩輪機車由東向西行駛至本市涼州區黃羊鎮二壩國小路段時,與同向行駛的被害人蔣某某駕駛的甘HB0622小轎車發生碰撞,緻王某受傷、車輛受損的一般交通事故。2016年3月15日,甘肅申證司法醫學鑒定是以甘申司法毒物鑒字(2016)第179号關于王某酒精含量司法鑒定檢驗報告書鑒定:送檢的王某字樣試管血液樣中檢測出酒精成份,含量為118.18mg/100m1。2016年4月11日,某政府以武公交涼認字第622301XXXXXXXXXX号道路交通事故責任認定書認定:王某負此次事故的全部責任,蔣某某在事故中無責任。案發後,被告人王某與受害人蔣某某就民事賠償已某某了和解協定,雙方已履行了協定。", "entities": [{"label": "11339", "text": ["普通兩輪機車"], "span": [[35, 42]]}, {"label": "11340", "text": ["無牌", "由東向西行駛"], "span": [[33, 35], [42, 48]]}, {"label": "11341", "text": ["酒後"], "span": [[29, 31]]}, {"label": "11342", "text": ["本市涼州區黃羊鎮二壩國小路段"], "span": [[49, 63]]}, {"label": "11344", "text": ["蔣某某", "蔣某某", "蔣某某"], "span": [[74, 77], [304, 307], [280, 283]]}, {"label": "11345", "text": ["小轎車"], "span": [[87, 90]]}, {"label": "11346", "text": ["同向行駛"], "span": [[66, 70]]}, {"label": "11348", "text": ["全部責任"], "span": [[275, 279]]}, {"label": "11349", "text": ["無責任"], "span": [[287, 290]]}]}
{"id": "812531", "context": "經審理查明:2015年10月4日20時21分許,被告人王某某在未取得機車動車駕駛證的情況下醉酒駕駛雲F98XXX号小型普通客車沿紅塔大道西向東行駛,當行駛至紅塔大道32号門前處時追尾同向行駛的王某駕駛的雲AKOXXX号豐田轎車,造成兩車受損的道路交通事故。經鑒定,被告人王某某血液中乙醇含量為180.64mg/100ml血。經道路交通事故認定書認定,王某某承擔事故的全部責任。被告人王某某在事故發生後明知對方報了警而在現場等候處理,案發後,其賠償了王某車輛損失費共計14000元。", "entities": [{"label": "11339", "text": ["小型普通客車"], "span": [[57, 63]]}, {"label": "11340", "text": ["沿紅塔大道西向東行駛"], "span": [[63, 73]]}, {"label": "11341", "text": ["未取得機車動車駕駛證", "醉酒"], "span": [[31, 41], [45, 47]]}, {"label": "11342", "text": ["紅塔大道32号門前處"], "span": [[78, 88]]}, {"label": "11344", "text": ["王某", "王某"], "span": [[224, 226], [96, 98]]}, {"label": "11345", "text": ["豐田轎車"], "span": [[109, 113]]}, {"label": "11346", "text": ["同向行駛"], "span": [[91, 95]]}, {"label": "11348", "text": ["全部責任"], "span": [[183, 187]]}]}
           

base比賽結果

基線提升至96.45%:2022 司法杯犯罪事實實體識别資料蒸餾主動學習

2.全量訓練

項目連結:https://aistudio.baidu.com/aistudio/projectdetail/4911042?contributionType=1

[2022-10-31 11:02:25,276] [    INFO] - global step 2010, epoch: 8, loss: 0.00076, speed: 2.36 step/s
[2022-10-31 11:02:29,618] [    INFO] - global step 2020, epoch: 8, loss: 0.00075, speed: 2.30 step/s
[2022-10-31 11:02:33,167] [    INFO] - global step 2030, epoch: 8, loss: 0.00075, speed: 2.82 step/s
[2022-10-31 11:02:37,961] [    INFO] - global step 2040, epoch: 9, loss: 0.00075, speed: 2.09 step/s
[2022-10-31 11:02:42,213] [    INFO] - global step 2050, epoch: 9, loss: 0.00074, speed: 2.35 step/s
[2022-10-31 11:02:46,600] [    INFO] - global step 2060, epoch: 9, loss: 0.00074, speed: 2.28 step/s
[2022-10-31 11:02:50,923] [    INFO] - global step 2070, epoch: 9, loss: 0.00074, speed: 2.31 step/s
[2022-10-31 11:02:55,188] [    INFO] - global step 2080, epoch: 9, loss: 0.00074, speed: 2.34 step/s
[2022-10-31 11:02:59,528] [    INFO] - global step 2090, epoch: 9, loss: 0.00073, speed: 2.30 step/s
[2022-10-31 11:03:03,827] [    INFO] - global step 2100, epoch: 9, loss: 0.00073, speed: 2.33 step/s
[2022-10-31 11:03:27,192] [    INFO] - Evaluation precision: 0.98632, recall: 0.98736, F1: 0.98684
[2022-10-31 11:03:27,193] [    INFO] - best F1 performence has been updated: 0.98193 --> 0.98684
best模型已儲存
           
基線提升至96.45%:2022 司法杯犯罪事實實體識别資料蒸餾主動學習
基線提升至96.45%:2022 司法杯犯罪事實實體識别資料蒸餾主動學習
基線提升至96.45%:2022 司法杯犯罪事實實體識别資料蒸餾主動學習

3.UIE Slim 資料蒸餾

上面方法隻關注了标注資料集,下面通過訓練好的UIE定制模型預測無監督資料的标簽。 項目連結:https://aistudio.baidu.com/aistudio/projectdetail/4911042?contributionType=1

4.主動學習方案:

參考項目:主動學習(Active Learning)綜述以及在文本分類和序列标注應用

1.主動學習簡介

  1. 主動學習是指對需要标記的資料進行優先排序的過程,這樣可以确定哪些資料對訓練監督模型産生最大的影響。
  2. 主動學習是一種學習算法可以互動式查詢使用者(teacher 或 oracle),用真實标簽标注新資料點的政策。主動學習的過程也被稱為優化實驗設計。
  3. 主動學習的動機在于認識到并非所有标有标簽的樣本都同等重要。
主動學習是一種政策/算法,是對現有模型的增強。而不是新模型架構。主動學習背後的關鍵思想是,如果允許機器學習算法選擇它學習的資料,這樣就可以用更少的訓練标簽實作更高的準确性。——Active Learning Literature Survey, Burr Settles。通過為專家的标記工作進行優先級排序可以大大減少訓練模型所需的标記資料量。降低成本,同時提高準确性。

主動學習不是一次為所有的資料收集所有的标簽,而是對模型了解最困難的資料進行優先級排序,并僅對那些資料要求标注标簽。然後模型對少量已标記的資料進行訓練,訓練完成後再次要求對最不确定資料進行更多的标記。

通過對不确定的樣本進行優先排序,模型可以讓專家(人工)集中精力提供最有用的資訊。這有助于模型更快地學習,并讓專家跳過對模型沒有太大幫助的資料。這樣在某些情況下,可以大大減少需要從專家那裡收集的标簽數量,并且仍然可以得到一個很好的模型。這樣可以為機器學習項目節省時間和金錢!

4.1 active learning的基本思想

主動學習的模型如下:

A=(C,Q,S,L,U),

其中 C 為一組或者一個分類器,L是用于訓練已标注的樣本。Q 是查詢函數,用于從未标注樣本池U中查詢資訊量大的資訊,S是督導者,可以為U中樣本标注正确的标簽。學習者通過少量初始标記樣本L開始學習,通過一定的查詢函數Q選擇出一個或一批最有用的樣本,并向督導者詢問标簽,然後利用獲得的新知識來訓練分類器和進行下一輪查詢。主動學習是一個循環的過程,直至達到某一停止準則為止。 這個準則可以是疊代次數,也可以是準确率等名額達到設定值

基線提升至96.45%:2022 司法杯犯罪事實實體識别資料蒸餾主動學習

在各種主動學習方法中,查詢函數的設計最常用的政策是:不确定性準則(uncertainty)和差異性準則(diversity)。 不确定性越大代表資訊熵越大,包含的資訊越豐富;而差異性越大代表選擇的樣本能夠更全面地代表整個資料集。

對于不确定性,我們可以借助資訊熵的概念來進行了解。我們知道資訊熵是衡量資訊量的概念,也是衡量不确定性的概念。資訊熵越大,就代表不确定性越大,包含的資訊量也就越豐富。事實上,有些基于不确定性的主動學習查詢函數就是使用了資訊熵來設計的,比如熵值裝袋查詢(Entropy query-by-bagging)。是以,不确定性政策就是要想方設法地找出不确定性高的樣本,因為這些樣本所包含的豐富資訊量,對我們訓練模型來說就是有用的。

那麼差異性怎麼來了解呢?之前說到或查詢函數每次疊代中查詢一個或者一批樣本。我們當然希望所查詢的樣本提供的資訊是全面的,各個樣本提供的資訊不重複不備援,即樣本之間具有一定的差異性。在每輪疊代抽取單個資訊量最大的樣本加入訓練集的情況下,每一輪疊代中模型都被重新訓練,以新獲得的知識去參與對樣本不确定性的評估可以有效地避免資料備援。但是如果每次疊代查詢一批樣本,那麼就應該想辦法來保證樣本的差異性,避免資料備援。

基線提升至96.45%:2022 司法杯犯罪事實實體識别資料蒸餾主動學習

從上圖也可以看出來,在相同數目的标注資料中,主動學習算法比監督學習算法的分類誤差要低。這裡注意橫軸是标注資料的數目,對于主動學習而言,相同的标注資料下,主動學習的樣本數>監督學習,這個對比主要是為了說明兩者對于訓練樣本的使用效率不同:主動學習訓練使用的樣本都是經過算法篩選出來對于模型訓練有幫助的資料,是以效率高。但是如果是相同樣本的數量下去對比兩者的誤差,那肯定是監督學習占優,這是毋庸置疑的。

4.2active learning與半監督學習的不同

  很多人認為主動學習也屬于半監督學習的範疇了,但實際上是不一樣的,半監督學習和直推學習(transductive learning)以及主動學習,都屬于利用未标記資料的學習技術,但基本思想還是有差別的。

  如上所述,主動學習的“主動”,指的是主動提出标注請求,也就是說,還是需要一個外在的能夠對其請求進行标注的實體(通常就是相關領域人員),即主動學習是互動進行的。

  而半監督學習,特指的是學習算法不需要人工的幹預,基于自身對未标記資料加以利用。

4.3.主動學習基礎政策(小試牛刀)

常見主動學習政策

在未标記的資料集上使用主動學習的步驟是:

  • 首先需要做的是需要手動标記該資料的一個非常小的子樣本。
  • 一旦有少量的标記資料,就需要對其進行訓練。該模型當然不會很棒,但是将幫助我們了解參數空間的哪些領域需要首标記。
  • 訓練模型後,該模型用于預測每個剩餘的未标記資料點的類别。
  • 根據模型的預測,在每個未标記的資料點上選擇分數
  • 一旦選擇了對标簽進行優先排序的最佳方法,這個過程就可以進行疊代重複:在基于優先級分數進行标記的新标簽資料集上訓練新模型。一旦在資料子集上訓練完新模型,未标記的資料點就可以在模型中運作并更新優先級分值,繼續标記。
  • 通過這種方式,随着模型變得越來越好,我們可以不斷優化标簽政策。
基線提升至96.45%:2022 司法杯犯罪事實實體識别資料蒸餾主動學習

參考項目:主動學習(Active Learning)綜述以及在文本分類和序列标注應用

5.總結

| 模型 |Precision |Recall| F1 | | --------| -------- | -------- | -------- | | Base | 88.96 |95.37 | 92.06 | | Base+全量 | 93.86 (+4.9) |99.2 (+3.83) | 96.45 (+4.39) | | UIE Slim | 98.632 (+9.67) | 98.736 (+3.37) | 98.684(+6.62) |

簡單歸納一下:增加标注量是關鍵

  1. 資料标注占比很重要,未利用的1w資料需要利用起來,而且小樣本資料下資料覆寫面需要用一定方法維持,目前得分高的應該都是額外增加标注量了
  2. 提升預測速度,UIE資料蒸餾方案推薦使用(GlobalPointer),并可以在這個基礎上優化,用mini等更小的模型
  3. 主動學習用起來,篩選出困難樣本,争取達到30%标注量實作全樣本效果!通過多輪疊代實作在這個任務的智能标注

繼續閱讀