日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【NLP】NLP模型BERT和经典数据集!

發(fā)布時間:2025/3/12 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【NLP】NLP模型BERT和经典数据集! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

作者:陳安東,中央民族大學,Datawhale成員

對于剛入門NLP的伙伴來說,看到NLP任務很容易覺得眼花繚亂,找不到切入點。總的來說,NLP分為五大類無數(shù)小類,雖然種類繁多,卻環(huán)環(huán)相扣。無論我們一開始學習的是什么方向,當做過的東西越來越多,學習范圍越來越大的時候,總可以形成閉環(huán)。

這一次,我們從教機器做閱讀理解題起航,介紹用火到“出圈”的Bert和常見數(shù)據(jù)集入手NLP的整體流程。

NLP五大類別

從機器閱讀理解起步

什么是機器閱讀理解?形式就像下圖:

答案是機器做出的

怎么樣,是不是感覺很酷!讓我們的模型來做閱讀理解題目,好似機器有了人類理解的能力。當然,也不能太樂觀,現(xiàn)在機器閱讀理解任務還在逐步探索階段。在訓練方式上,對于不同機器閱讀理解數(shù)據(jù)集,就會有對這個任務的不同解法。對于機器閱讀理解任務,我們將其分為三個類型。難度逐步上升:

  • 簡單問題:對答案的簡單匹配和抽取

  • 復雜問題:加入推理

  • 基于對話的問答系統(tǒng):自由問答和特定任務場景的問答

可以看出,如果答案在文章內可以清晰的找到,那么模型就不需要生成答案,只需要將答案抽取出來就好了,這樣的任務是簡單的,可以使用SQuAD 1.0學習。

更近一步,有些閱讀理解的問題中是沒有答案的,正確的答案就是不回答,這種行為更接近智能,任務也變的更困難,需要用SQuAD 2.0學習。

此外還有對話系統(tǒng),它的答案要和實時場景相匹配所以難度更高,這里主要討論前兩種。

繞不開的SQuAD數(shù)據(jù)集

上面關于機器閱讀理解描述中,我們反復提及用SQuAD數(shù)據(jù)集進行訓練。對于想要從事相關方向的同學來說,這個數(shù)據(jù)集幾乎是繞不過的。

SQuAD(Stanford Question Answering Dataset)是斯坦福大學通過眾包的方式來構建的一個機器閱讀理解數(shù)據(jù)集。本質上,這就是一個大規(guī)模的英文閱讀理解數(shù)據(jù)集,現(xiàn)在做和英文的閱讀理解相關所有任務,都用它。

數(shù)據(jù)開源地址:https://gas.graviti.cn/dataset/hello-dataset/SQuAD_v2?utm_medium=0725datawhale

數(shù)據(jù)集現(xiàn)在有SQuAD1.0 和 SQuAD2.0兩個版本,適用于不同的研究場景:

SQuAD1.0

1.0版本的數(shù)據(jù)集中包含107,785的問題以及對應的536篇文章。文章源自維基百科上的一系列文章。

與之前其他數(shù)據(jù)集的區(qū)別:相較于以前的閱讀理解數(shù)據(jù)集,SQuAD更大,包含的文章內容也更多。其具體的形式是,SQuAD的答案是短語或者一段話,而不再是一個單詞。答案里面包含的信息增多了,所以任務的難度也增加了。

特點:閱讀理解的所有答案,都可以在文章中完全可以找到(答案可以從文章中完全copy過來)。并且文中的答案是不能是跨行的。也就是說答案是文章指定的一個區(qū)間。所以,SQuAD的答案生成是抽取式的。

數(shù)據(jù)集示例如下:

SQuAD2.0

在閱讀理解中,遇到有些問題無法通過閱讀現(xiàn)有文章的內容來回答,該怎么辦?

有些信息我們無法通過文章找到,在使用1.0版本的數(shù)據(jù)集中,模型遇到了那些無法回答的問題,也會強制給出一個回答,這樣的情況顯然不夠智能。所以在2.0版本的數(shù)據(jù)集中,增加了50,000條沒有答案的問題,通過這個數(shù)據(jù)集中,希望模型可以學會對于沒有答案的問題不作回答。也就是說希望我們的模型要有“知道自己不知道”的能力

2.0版的數(shù)據(jù)集形式就如上面圖片所示,上面的圖片中展示的兩個問題都是沒有答案的,沒有答案的問題不回答才是正確的。

總結來說,SQuAD是一個主流的抽取式的英語閱讀理解數(shù)據(jù)集。現(xiàn)在大家都在SQuAD2.0上刷榜。

通過上面的榜單可以看到,在SQuAD2.0這個數(shù)據(jù)集中,前五名的模型獲得的效果已經(jīng)遠超人類。如果將這些模型做一個分析,可以說每個模型里面都裝著一個Bert。

淺說BERT

Bert這個預訓練模型,在2021年的今天應該是當之無愧的”網(wǎng)紅“。作為一個入門的介紹,這里先講Bert在原論文中是如何被訓練的。之后介紹SQUAD數(shù)據(jù)集是如何與Bert結合的。

從結構角度來說,Bert是由Transformer的Encoder(編碼器)構成的。通過強大的編碼能力,可以將語言映射在一個向量空間中,將單詞表示為向量,也就是大家常說的Embedding(詞向量)。Bert的所做的就是,輸入一個句子,基于任務然后吐出來一個基于訓練任務的詞向量(embedding)。

知道Bert是什么,那么下面就介紹一下Bert在原論文中的兩種訓練方式。

兩個訓練方法

① Masked LM

將一句話輸入之后,隨機mask掉一個單詞,具體mask的方式就是將那個詞替換為[MASK]這個符號,然后再mask位置的輸出接到一個簡單的線性分類器當中。我們希望的是一個簡單的線性分類器可以得到正確的答案。如果簡單的分類器可以輸出正確的答案,就說明這個embedding(詞向量)的效果相當?shù)暮?/p>

② Next Sentence Prediction

預測輸入的兩個句子是不是一句話

輸入兩句話,然后Bert輸出的是單詞的embedding(詞向量)。這時從圖中可以看出,有兩個特殊的輸入單詞———SEP和CLS。SEP這個單詞的意思就是告訴Bert,左右的兩個句子是分開的。CLS這個單詞的意思就是告訴Bert,這里是要做一個分類任務。然后將這個CLS輸出的embedding放入一個簡單的分類器中(simple linear)來預測兩個句子是不是一句話。如何可以分辨的很好,說明了Bert對于語句相似性有很好的的表示效果。

在Bert的完整訓練過程中,這兩個訓練任務是都要有。這樣可以訓練出性能優(yōu)秀的Bert。

在Bert里為了完成不同的任務,設計了不同的特殊單詞。這里順便做一下總結:

  • [CLS]:告訴模型要做分類任務,其中最后一層的第一個embedding作為分類任務的presention。

  • [SEP]:告訴Bert左右兩邊的輸入是不同的。

  • [UNK]:沒出現(xiàn)在Bert字典里的字會被這個單詞替代。

  • [PAD]:zero padding,將長度不同的序列補充為固定長度,方便做batch運算。

  • [MASK]:未知遮罩

用Bert做機器閱讀理解

現(xiàn)在我們已經(jīng)知道了SQuAD這個數(shù)據(jù)集以及模型Bert。現(xiàn)在就可以通過Bert和SQuAD來做機器閱讀理解了。

接下來詳細說一說在Bert中,如何在SQuAD上解決閱讀理解這個問題的。

在原始的Bert任務中,就已經(jīng)利用SQuAD來做閱讀理解任務了。它使用了SEP的這個特殊單詞,將Qury(問題)和Document(文章)一起作為輸入。然后在Bert中獲取良好的embedding(詞向量),然后將這個embedding(詞向量)的結果接入一個分類器,分別得到答案在文章中位置的id和結束位置的id。因為SQuAD數(shù)據(jù)集中的答案是可以直接在文章中抽取出來,所以得到答案起始位置的id和結束位置的id可以直接抽取出正確的答案。

我們使用文章一開始那個例子給大家舉例。當我將文章和問題輸入給Bert之后,將Bert輸出的Embedding(詞向量)接入到一個閱讀理解任務的模型中(這個模型可以先忽略,對于Bert來說,不同的任務會不同的模型來輔助)。我們發(fā)現(xiàn),輸出的結果是'雪'和‘藻’在文本中的位置65和67。然后我們將65-67這三個字抽取出來就得到了答案“雪衣藻”。

對于英文的SQuAD數(shù)據(jù)集,我們的做法和上面一模一樣。

那么對于SQuAD2.0數(shù)據(jù)集來說,這個數(shù)據(jù)集中有一些沒有答案的問題。我們對于這樣的問題解法其實和上面沒有任何區(qū)別,如果我們獲得起始位置id比結束位置id大的情況,那么這種不合理的輸出,我們就認為這個問題沒有答案。

實踐一下用Bert的效果:

#?https://gas.graviti.cn/dataset/hello-dataset/SQuAD_v2?下載數(shù)據(jù)集#?載入文本 with?open('SQuAD_v2_dev-v2.json','r',encoding='utf-8')?as?reader:input_data?=?json.load(reader)#?看看這個json格式 input_data.keys()squad_data?=?input_data['data'] print('有',len(squad_data),'個類別',)#?看一篇文章的細節(jié) squad_data[1].keys()print('一個類有',len(squad_data[1]['paragraphs']),'篇文章')squad_data[1]['paragraphs'][1].keys()context?=?squad_data[1]['paragraphs'][1]['context']context#?拿到一個問題squad_data[1]['paragraphs'][1]['qas'][1]question?=?squad_data[1]['paragraphs'][1]['qas'][1]['question']#?得到這個題目的答案 answer?=?squad_data[1]['paragraphs'][1]['qas'][1]['answers']answer#?調用Hugging?Face?的API#?使用Hugging Face 的API。Hugging Face已經(jīng)幫大家訓練好了Bert模型,大家可以直接用來做推理(記得注冊Hugging Face) #?推理API的調用指南:https://huggingface.co/docs/hub/inferenceimport?json import?requestsheaders?=?{"Authorization":?f"Bearer?{'此處用自己的API賬號'}"} ?API_URL?=?"https://api-inference.huggingface.co/models/deepset/roberta-base-squad2"def?query(payload):data?=?json.dumps(payload)response?=?requests.request("POST",?API_URL,?headers=headers,?data=data)return?json.loads(response.content.decode("utf-8"))data?=?query({"inputs":?{"question":?question,"context":?context,}} )data['answer']#?看看推理結果,和上邊的答案是不是完全一樣?

最后

這篇文章中,先是介紹了NLP的基本任務。然后以SQuAD數(shù)據(jù)集為中心,介紹了機器閱讀理解任務的一些分類,知道抽取式任務是簡單的,而問答任務是困難的。最后以Bert為例,介紹SQuAD數(shù)據(jù)集在Bert模型上是怎么解的。

本文為經(jīng)典開源數(shù)據(jù)集介紹系列,數(shù)據(jù)集已上傳在開源數(shù)據(jù)平臺Graviti,閱讀原文可下載。

閱讀原文可獲取數(shù)據(jù)集

往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統(tǒng)計學習方法》的代碼復現(xiàn)專輯 AI基礎下載機器學習的數(shù)學基礎專輯黃海廣老師《機器學習課程》課件合集 本站qq群851320808,加入微信群請掃碼:

總結

以上是生活随笔為你收集整理的【NLP】NLP模型BERT和经典数据集!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。