全解析:數(shù)據(jù)構(gòu)建、教師變體與閱讀理解實(shí)驗(yàn)實(shí)踐)
NLP人工智能深度學(xué)習(xí)【免費(fèi)下載鏈接】ParlAIA framework for training and evaluating AI models on a variety of openly available dialogue datasets.項(xiàng)目地址https://gitcode.com/gh_mirrors/pa/ParlAI點(diǎn)擊查看免費(fèi)下載導(dǎo)讀本文圍繞 ParlAI 框架內(nèi)對(duì) SQuADStanford Question Answering Dataset數(shù)據(jù)集的官方實(shí)現(xiàn)展開系統(tǒng)講解該任務(wù)在倉庫中的注冊(cè)方式、數(shù)據(jù)下載與校驗(yàn)流程、DefaultTeacher/IndexTeacher/SentenceTeacher等八種教師Teacher變體的設(shè)計(jì)動(dòng)機(jī)與底層實(shí)現(xiàn)并結(jié)合倉庫中的測(cè)試樣例與 YAML 快照給出可復(fù)現(xiàn)的驗(yàn)證方法。讀完本文你將掌握如何在 ParlAI 中加載 SQuAD、理解每種教師變體輸出的消息字段差異并能為抽取式問答 / 閱讀理解實(shí)驗(yàn)選擇合適的任務(wù)入口。SQuAD 任務(wù)在 ParlAI 中的定位SQuADStanford Question Answering Dataset是由 Rajpurkar 等人于 2016 年提出的開放域問答數(shù)據(jù)集給定一段來自 Wikipedia 的段落paragraph模型需要回答針對(duì)該段落提出的問題答案是從段落中抽取的連續(xù)文本片段。在 任務(wù) README 中官方將其描述為Open-domain QA dataset answerable from a given paragraph from Wikipedia, from Rajpurkar et al. 16.該任務(wù)在倉庫中被標(biāo)記為#SQuAD、#All、#QA三個(gè)標(biāo)簽并收錄在parlai/tasks任務(wù)體系內(nèi)因此可以通過 ParlAI 統(tǒng)一的任務(wù)命令行參數(shù)直接加載無需額外編寫數(shù)據(jù)加載代碼。從倉庫結(jié)構(gòu)看SQuAD 任務(wù)由以下文件構(gòu)成parlai/tasks/squad/agents.py全部教師變體的核心實(shí)現(xiàn)parlai/tasks/squad/build.py數(shù)據(jù)下載、校驗(yàn)與構(gòu)建parlai/tasks/squad/test.py教師自動(dòng)測(cè)試parlai/tasks/squad/test/每個(gè)教師變體對(duì)應(yīng)的 YAML 數(shù)據(jù)快照與統(tǒng)計(jì)信息。數(shù)據(jù)下載與構(gòu)建流程SQuAD 任務(wù)的數(shù)據(jù)獲取由 build.py 負(fù)責(zé)其核心是一個(gè)RESOURCES資源列表包含三個(gè)可下載文件資源用途是否壓縮train-v1.1.jsonSQuAD v1.1 訓(xùn)練集官方 SQuAD-explorer 發(fā)布否dev-v1.1.jsonSQuAD v1.1 開發(fā)集否squad_fulldocs.tgzFulldoc 變體所需的整篇文檔數(shù)據(jù)由 ParlAI 下載服務(wù)器托管是構(gòu)建函數(shù)build(opt)的邏輯值得注意在opt[datapath]下創(chuàng)建SQuAD目錄先下載前兩個(gè) JSON 文件RESOURCES[:2]每個(gè)文件都帶有 SHA-256 校驗(yàn)值用于保證下載完整性若opt[task]字符串中包含fulldoc則額外在SQuAD-fulldoc目錄下載并解壓squad_fulldocs.tgz通過build_data.built()/mark_done()機(jī)制記錄構(gòu)建狀態(tài)避免重復(fù)下載。也就是說默認(rèn)的squad任務(wù)只依賴約 87K 訓(xùn)練樣例的 JSON 文件只有當(dāng)你使用squad:fulldoc或squad:fulldocsentence變體時(shí)才會(huì)觸發(fā)整篇文檔數(shù)據(jù)的下載。數(shù)據(jù)目錄由 ParlAI 全局的--datapath參數(shù)控制默認(rèn)在用戶數(shù)據(jù)目錄下??焖偕鲜植榭?SQuAD 數(shù)據(jù)ParlAI 提供了統(tǒng)一的display_data腳本用于預(yù)覽任何任務(wù)的數(shù)據(jù)。加載默認(rèn) SQuAD 教師python -m parlai.scripts.display_data -t squad在parlai/tasks/squad/test/squad_train.yml中可以看到真實(shí)的首批樣例默認(rèn)教師的每條消息形如- episode_done: true id: squad labels: - Saint Bernadette Soubirous text: Architecturally, the school has a Catholic character. ... To whom did the Virgin Mary allegedly appear in 1858 in Lourdes France?即text字段為段落文本 換行 問題labels為從段落中抽取的答案字符串。該 YAML 快照同時(shí)記錄了num_episodes: 87599、num_examples: 87599即默認(rèn) SQuAD 教師將每個(gè)段落 問題視作一個(gè)獨(dú)立 episode訓(xùn)練集共 87599 個(gè)樣例。教師Teacher變體全景agents.py中為 SQuAD 提供了八種教師分別繼承自 ParlAI 核心的FixedDialogTeacher、DialogTeacher、ParlAIDialogTeacher與AbstractWrapperTeacher。任務(wù)名與教師類的對(duì)應(yīng)關(guān)系如下任務(wù)參數(shù)教師類基類文本格式核心特性squadDefaultTeacherDialogTeacher段落\n問題標(biāo)準(zhǔn)抽取式 QA 格式squad:indexIndexTeacherFixedDialogTeacher段落\n問題附帶answer_starts答案起始索引squad:opensquadOpensquadTeacherDialogTeacher僅問題去掉上下文段落的開放問答squad:titleTitleTeacherDefaultTeacher標(biāo)題\n段落\n問題額外注入 Wikipedia 文章標(biāo)題squad:fulldocFulldocTeacherParlAIDialogTeacher整篇文檔 問題基于整篇文檔而非單個(gè)段落squad:sentenceSentenceTeacherIndexTeacher段落\n問題或分離字段標(biāo)簽改為包含答案的句子squad:fulldocsentenceFulldocsentenceTeacherFulldocTeacher整篇文檔 問題句子級(jí)標(biāo)簽 整篇文檔squad:squadqaSquadQATeacherAbstractWrapperTeacher僅段落只保留段落、去掉問題下面逐一展開每種變體的實(shí)現(xiàn)細(xì)節(jié)。默認(rèn)教師DefaultTeacherDefaultTeacher繼承自核心的DialogTeacheragents.py 中其實(shí)現(xiàn)非常精簡只需實(shí)現(xiàn)setup_data(path)迭代器即可自動(dòng)獲得act()、基礎(chǔ)指標(biāo)等能力。其關(guān)鍵邏輯def setup_data(self, path): with PathManager.open(path) as data_file: self.squad json.load(data_file)[data] for article in self.squad: for paragraph in article[paragraphs]: for qa in paragraph[qas]: question qa[question] answers tuple(a[text] for a in qa[answers]) context paragraph[context] yield (context \n question, answers), True數(shù)據(jù)結(jié)構(gòu)按 SQuAD 原始 JSON 的三層嵌套遍歷data → articles → paragraphs → qas每個(gè)樣例產(chǎn)出(text, labels)二元組episode_done恒為True單輪 QA無多輪對(duì)話answers使用元組承載因?yàn)?SQuAD 中一個(gè)問題通常有多個(gè)標(biāo)注答案。類注釋中明確指出默認(rèn)教師does not efficiently store the paragraphs in memory不將段落常駐內(nèi)存即采用流式生成方式以節(jié)省內(nèi)存為優(yōu)先。數(shù)據(jù)文件路徑通過opt[datafile]指向SQuAD/train-v1.1.json或SQuAD/dev-v1.1.json取決于datatype是否以train開頭。手寫 act() 的范例IndexTeacherIndexTeacher繼承自FixedDialogTeacher是倉庫注釋中明確標(biāo)注的手寫 SQuAD 教師范例——它不依賴核心DialogTeacher而是自行實(shí)現(xiàn)act()與數(shù)據(jù)索引并額外暴露答案在上下文中的起始位置action { id: squad, text: context \n question, labels: answers, episode_done: True, answer_starts: answer_starts, }其數(shù)據(jù)準(zhǔn)備在_setup_data()中完成一次性讀取全部 JSON預(yù)先構(gòu)建(article_idx, paragraph_idx, qa_idx)的三元組索引列表get(episode_idx)再據(jù)此定位具體樣例。answer_starts字段直接取自原始 JSON 中每個(gè)答案的answer_start字符偏移為需要答案定位監(jiān)督信號(hào)的模型例如抽取式 span 預(yù)測(cè)提供了便利。此外num_examples()與num_episodes()均返回樣例總數(shù)。開放問答變體OpensquadTeacherOpensquadTeacher同樣繼承DialogTeacher唯一區(qū)別是省略了上下文段落每條消息只保留問題文本yield (question, answers), True對(duì)應(yīng)數(shù)據(jù)快照 squad_opensquad_train.yml 中可以看到text字段退化為純粹的提問如 To whom did the Virgin Mary allegedly appear in 1858 in Lourdes France?。這適合驗(yàn)證沒有段落時(shí)模型能否作答的消融實(shí)驗(yàn)或用于開放式問答場(chǎng)景。帶標(biāo)題的變體TitleTeacherTitleTeacher繼承DefaultTeacher僅修改text的拼接方式將 Wikipedia 文章標(biāo)題置于段落之前yield (\n.join([title, context, question]), answers), True代碼注釋提醒標(biāo)題直接取自原始數(shù)據(jù)包含下劃線作為 Wikipedia 鏈接的一部分即文章實(shí)際位于https://en.wikipedia.org/wiki/{TITLE}使用方可根據(jù)需要決定是否去除下劃線。該教師將id設(shè)為squad_title便于在日志與指標(biāo)中區(qū)分來源。整篇文檔變體FulldocTeacherFulldocTeacher繼承自ParlAIDialogTeacher數(shù)據(jù)不再來自官方 JSON而是來自 build.py 中下載的squad_fulldocs.tgz。它通過parlaidialogteacher_datafile指向SQuAD-fulldoc/squad_fulldocs.{train|valid}:ordered文件。從 squad_fulldoc_train.yml 快照可見其text字段包含以\n\n分隔的整篇文章多個(gè)段落隨后是問題——即文檔級(jí)閱讀理解模型必須在跨越多個(gè)段落的整篇文檔中定位答案難度顯著高于單段落版本。句子級(jí)標(biāo)簽變體SentenceTeacher 與 FulldocsentenceTeacher這兩個(gè)變體將監(jiān)督信號(hào)從答案片段升級(jí)為包含答案的句子是 SQuAD 中最具特色的設(shè)計(jì)SentenceTeacher繼承IndexTeacher基于官方 JSON 的段落級(jí)數(shù)據(jù)FulldocsentenceTeacher繼承FulldocTeacher基于整篇文檔數(shù)據(jù)。兩者共享一套處理管線以SentenceTeacher為例加載 NLTK 的 punkt 英文句子切分器get_sentence_tokenizer()若本地缺失會(huì)自動(dòng)nltk.download(punkt)為避免切分干擾先將答案中的.、?、!去除并同步替換回上下文對(duì)上下文切句后找出包含任一答案的句子作為labels全部句子作為label_candidatesanswer_starts記錄每個(gè)標(biāo)簽句子在上下文中的起始字符位置。兩者均支持--include-context命令行參數(shù)默認(rèn)Falseagent.add_argument( --include-context, typebool, defaultFalse, helpinclude context within text instead of as a separate field, )默認(rèn)情況下action 字典包含獨(dú)立的context字段text僅為問題label_candidates為全部句子便于做從候選中選擇正確句子的分類式任務(wù)開啟后context合并進(jìn)textcontext \n question并從字典中移除回歸抽取式任務(wù)的輸入形態(tài)。從 squad_sentence_train.yml 快照可以看到該格式的實(shí)際效果label_candidates列出段落的全部句子labels只含包含答案的那一句answer_starts給出句子起點(diǎn)偏移。段落抽取變體SquadQATeacherSquadQATeacher是最后一個(gè)變體繼承AbstractWrapperTeacher通過_edit_action()對(duì)默認(rèn)教師的輸出做后處理——將text中換行之前的第一行即段落抽取出來丟棄問題部分def _edit_action(self, act: Message) - Message: passage act[text].split(\n)[0] act.force_set(text, passage) return act該變體適用于只關(guān)心段落本身的任務(wù)例如段落檢索、表示學(xué)習(xí)等其類注釋明確說明only the passage, and ignore the question。消息字段與數(shù)據(jù)格式總結(jié)綜合各變體SQuAD 教師產(chǎn)出的 action 字典字段可歸納為字段含義出現(xiàn)于id任務(wù)標(biāo)識(shí)squad/squad_title/squad-fulldoc全部text模型輸入文本段落/標(biāo)題 問題或僅問題全部labels標(biāo)注答案字符串列表全部label_candidates候選句子列表句子級(jí)變體為全部句子sentence/fulldocsentenceanswer_starts答案/標(biāo)簽句子在上下文中的起始字符偏移index/sentence系列context獨(dú)立上下文字段默認(rèn)模式sentence系列episode_done恒為True單輪樣例全部測(cè)試與質(zhì)量保障任務(wù)自帶完整的自動(dòng)化測(cè)試 parlai/tasks/squad/test.py基于 ParlAI 的AutoTeacherTest工具類為六種教師squad、squad:index、squad:opensquad、squad:fulldoc、squad:sentence、squad:fulldocsentence分別注冊(cè)測(cè)試類。測(cè)試會(huì)加載parlai/tasks/squad/test/下的 YAML 快照train/valid/test 三套齊全如squad_train.yml、squad_index_valid.yml、squad_sentence_test.yml等校驗(yàn)教師產(chǎn)出的消息格式與快照一致、樣例數(shù)量正確。這套機(jī)制保證了后續(xù)任何對(duì)agents.py的修改都不會(huì)破壞數(shù)據(jù)格式兼容性也為你自定義教師時(shí)提供了可參照的測(cè)試范式。訓(xùn)練與評(píng)估實(shí)踐在 ParlAI 中SQuAD 與其他任務(wù)共用同一套訓(xùn)練/評(píng)估入口只需將任務(wù)名傳給-t參數(shù)# 訓(xùn)練以通用 seq2seq 模型為例具體超參請(qǐng)按實(shí)驗(yàn)調(diào)整 python -m parlai.scripts.train_model -t squad -m seq2seq -bs 32 -lr 1e-3 --train-predict true # 評(píng)估已有模型 python -m parlai.scripts.eval_model -t squad -mf /path/to/model_file # 交互式對(duì)話將問題作為輸入觀察模型在給定段落上作答 python -m parlai.scripts.interactive -t squad -mf /path/to/model_file實(shí)踐要點(diǎn)選擇教師變體即選擇任務(wù)形態(tài)默認(rèn)squad適合標(biāo)準(zhǔn)的抽取式問答squad:index為需要答案位置監(jiān)督的模型提供answer_startssquad:sentence將問題轉(zhuǎn)化為句子選擇squad:fulldoc則面向文檔級(jí)閱讀理解數(shù)據(jù)劃分datatype以train開頭時(shí)加載訓(xùn)練集 JSON否則加載開發(fā)集測(cè)試時(shí)同樣遵循 ParlAI 的train/valid/test約定依賴提醒sentence系列教師依賴 NLTK 的 punkt 分詞器首次運(yùn)行需要聯(lián)網(wǎng)下載fulldoc系列會(huì)額外下載整篇文檔數(shù)據(jù)包。小結(jié)SQuAD 任務(wù)是 ParlAI 任務(wù)生態(tài)中極具代表性的 QA 任務(wù)一方面它演示了如何用DialogTeacher的最小實(shí)現(xiàn)接入真實(shí)數(shù)據(jù)集另一方面通過IndexTeacher展示了不依賴?yán)^承、手寫act()的教師寫法而SentenceTeacher系列則展示了如何將原始答案重構(gòu)成句子級(jí)監(jiān)督信號(hào)。理解這八種變體的數(shù)據(jù)流你就能在閱讀理解、開放問答、句子選擇等不同實(shí)驗(yàn)設(shè)定間自由切換并以此為模板接入自己的 QA 數(shù)據(jù)。贊分享NLP人工智能深度學(xué)習(xí)【免費(fèi)下載鏈接】ParlAIA framework for training and evaluating AI models on a variety of openly available dialogue datasets.項(xiàng)目地址https://gitcode.com/gh_mirrors/pa/ParlAI點(diǎn)擊查看免費(fèi)下載相關(guān)推薦快速解決Windows內(nèi)存不足問題Mem Reduct終極優(yōu)化指南快速解決Windows內(nèi)存不足問題Mem Reduct終極優(yōu)化指南 你是否曾經(jīng)遇到過電腦越用越慢打開程序要等好幾秒多任務(wù)切換卡頓的情況這很可能是WindNLP人工智能深度學(xué)習(xí)ParlAI 中的 HotpotQA 任務(wù)多跳閱讀理解數(shù)據(jù)集的加載、構(gòu)建與評(píng)測(cè)實(shí)戰(zhàn)指南ParlAI 中的 HotpotQA 任務(wù)多跳閱讀理解數(shù)據(jù)集的加載、構(gòu)建與評(píng)測(cè)實(shí)戰(zhàn)指南 HotpotQA 是 ParlAI 內(nèi)置的多跳問答Multi hopNLP人工智能深度學(xué)習(xí)lm-evaluation-harness 中的 squad_completion 任務(wù)基于 SQuAD 變體的零樣本閱讀理解評(píng)測(cè)指南lm evaluation harness 中的 squad_completion 任務(wù)基于 SQuAD 變體的零樣本閱讀理解評(píng)測(cè)指南 導(dǎo)讀 squad_co人工智能模型評(píng)測(cè)AI 評(píng)測(cè)上一篇OpenCore Configurator終極指南3步完成黑蘋果系統(tǒng)引導(dǎo)配置下一篇3分鐘上手免費(fèi)壓縮包密碼恢復(fù)工具完全指南創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考