一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于GPT-2進(jìn)行文本生成

深度學(xué)習(xí)自然語(yǔ)言處理 ? 來(lái)源:ChallengeHub ? 作者:致Great ? 2022-04-13 08:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


	

來(lái)自:ChallengeHub

作者:致Great

fromutilsimport* setup_chapter()
Using transformers v4.11.3
Using datasets v1.13.0
Using accelerate v0.5.1

文本生成

文本生成是自然語(yǔ)言處理中一個(gè)重要的研究領(lǐng)域,具有廣闊的應(yīng)用前景。國(guó)內(nèi)外已經(jīng)有諸如Automated Insights、Narrative Science以及“小南”機(jī)器人和“小明”機(jī)器人等文本生成系統(tǒng)投入使用。這些系統(tǒng)根據(jù)格式化數(shù)據(jù)或自然語(yǔ)言文本生成新聞、財(cái)報(bào)或者其他解釋性文本。例如,Automated Insights的WordSmith技術(shù)已經(jīng)被美聯(lián)社等機(jī)構(gòu)使用,幫助美聯(lián)社報(bào)道大學(xué)橄欖球賽事、公司財(cái)報(bào)等新聞。這使得美聯(lián)社不僅新聞更新速度更快,而且在人力資源不變的情況下擴(kuò)大了其在公司財(cái)報(bào)方面報(bào)道的覆蓋面。

任務(wù)定義

接受非語(yǔ)言形式的信息作為輸入,生成可讀的文字表述。數(shù)據(jù)到文本的生成適用于這個(gè)定義,后續(xù)研究人員將這個(gè)概念拓展為包括了文本到文本的生成、數(shù)據(jù)到文本的生成以及圖像到文本的生成的文本生成技術(shù)。

任務(wù)分類(lèi)

按照輸入數(shù)據(jù)的區(qū)別,可以將文本生成任務(wù)大致分為以下三類(lèi):

  • 1)文本到文本的生成;

  • 2)數(shù)據(jù)到文本的生成;

  • 3)圖像到文本的生成。

1)文本到文本的生成又可根據(jù)不同的任務(wù)分為(包括但不限于):文本摘要、 古詩(shī)生成、文本復(fù)述等。文本摘要又可以分為抽取式摘要和生成式摘要。抽取式摘要通常包含信息抽取和規(guī)劃等主要步驟。近期,在這方面有許多有趣的工作:

  • 在為論文自動(dòng)生成相關(guān)工作部分文本的任務(wù)上使用主題模型PLSA將句子按照主題進(jìn)行聚類(lèi),使用SVR(Support Vector Regression)計(jì)算句子的相似度,最后使用線性規(guī)劃生成相關(guān)工作文本。

  • 在基于短語(yǔ)級(jí)別為學(xué)術(shù)論文生成演示文件的研究中采用了四個(gè)步驟。首先從論文中抽取名詞短語(yǔ)、動(dòng)詞短語(yǔ)作為候選短語(yǔ), 利用人工設(shè)計(jì)的特征和基于隨機(jī)森林的分類(lèi)器決定短語(yǔ)是否應(yīng)出現(xiàn)在演示文件中,再訓(xùn)練一個(gè)基于隨機(jī)森林的分類(lèi)器判斷兩個(gè)短語(yǔ)是否存在一級(jí)、二級(jí)標(biāo)題的關(guān)系,最后使用貪心策略選擇句子構(gòu)成一個(gè)演示文件。Zhang[5]在根據(jù)體育賽事直播文字生成賽事報(bào)道的任務(wù)上,主要采用了Learning to Rank的方法結(jié)合人工設(shè)計(jì)的特征模版對(duì)句子進(jìn)行打分,進(jìn)而采用行列式點(diǎn)過(guò)程(DPP, Determinantal Point Process)進(jìn)行句子選擇。

  • 最近ACL 2017上發(fā)表了多篇生成式摘要的論文。

  • 如See等人提出了解決生成事實(shí)性錯(cuò)誤文本和重復(fù)性文本問(wèn)題的方法[6],Zhou等人加入選擇門(mén)網(wǎng)絡(luò)(selective gate network)進(jìn)行摘要生成[7]。

  • 古詩(shī)生成方面,Zhang等人[8]使用循環(huán)神經(jīng)網(wǎng)絡(luò)進(jìn)行生成,Wang等人[9]將古詩(shī)生成劃分為規(guī)劃模型和生成模型兩部份。

  • Zhang等人[10]在Seq2Seq模型的基礎(chǔ)上加入記憶模塊。文本復(fù)述方面,Quirk等人[11]使用機(jī)器翻譯的方法生成復(fù)述文本,Max等人

  • [12]采用基于樞軸(pivot)的復(fù)述生成方法,以另一種語(yǔ)言作為中間媒介,將源語(yǔ)言翻譯成另一種語(yǔ)言后再翻譯為原來(lái)的語(yǔ)言。

2)結(jié)構(gòu)化數(shù)據(jù)生成文本的任務(wù)上,Reiter等人[13]將數(shù)據(jù)到文本的系統(tǒng)分為了信號(hào)處理(視輸入數(shù)據(jù)類(lèi)型可選)、數(shù)據(jù)分析、文檔規(guī)劃和文本實(shí)現(xiàn)四個(gè)步驟。Mei等人[14]基于encoder-decoder模型加入了aligner選擇重要信息,基于深度學(xué)習(xí)提出了一個(gè)端到端的根據(jù)數(shù)據(jù)生成文本的模型。比如 語(yǔ)義解析 (Text-to-SQL)

3)圖像到文本的生成方面也有不同的任務(wù),如image-caption、故事生成、基于圖像的問(wèn)答等。在為圖像生成解釋性文本(image-caption)的任務(wù)上,Vinyals等人[15]使用類(lèi)似encoder-decoder的模型進(jìn)行生成。Xu等人[16]則進(jìn)一步加入Attention機(jī)制。Huang等人[17]提出針對(duì)圖片序列生成故事的任務(wù),并且提供了單張圖片的描述性文本、單張圖片的故事以及圖片序列的故事三個(gè)層級(jí)的數(shù)據(jù)集。在第三個(gè)數(shù)據(jù)集上,他們拓展之前的模型并加入一些技巧提供了該任務(wù)的一些baseline。并通過(guò)對(duì)自動(dòng)化評(píng)價(jià)指標(biāo)以及人工評(píng)價(jià)相關(guān)度的衡量,確定使用METEOR作為自動(dòng)化評(píng)價(jià)指標(biāo)?;趫D像的問(wèn)答任務(wù)上,Shih等人[18]提出了使用基于Attention機(jī)制的模型用VGGnet編碼圖片,用詞向量求均值表示問(wèn)題,最后經(jīng)過(guò)兩層網(wǎng)絡(luò)生成答案 、Wu等人[19]提出了整合image-caption模型和外部知識(shí)庫(kù)等生成答案。

文本生成方法

1 基于語(yǔ)言模型的自然語(yǔ)言生成

基于馬爾可夫的語(yǔ)言模型在數(shù)據(jù)驅(qū)動(dòng)的自然語(yǔ)言生成中有著重要的應(yīng)用。它利用數(shù)據(jù)和文字間的對(duì)齊語(yǔ)料,主要采用兩個(gè)步驟:內(nèi)容規(guī)劃和內(nèi)容實(shí)現(xiàn)為數(shù)據(jù)生成對(duì)應(yīng)的文本。Oh等人[21]在搭建面向旅行領(lǐng)域的對(duì)話系統(tǒng)時(shí),在內(nèi)容規(guī)劃部分使用bigram作特征根據(jù)近期的對(duì)話歷史,選取待生成文本中需要出現(xiàn)的屬性,內(nèi)容實(shí)現(xiàn)部分使用n-gram語(yǔ)言模型生成對(duì)話。Ratnaparkhi等人[22]經(jīng)過(guò)實(shí)驗(yàn)對(duì)比發(fā)現(xiàn)在語(yǔ)言模型上加入依存語(yǔ)法關(guān)系有助于改善生成效果。Angeli等人[23]則將文本生成的過(guò)程分為三種決策(以生成天氣報(bào)道為例):1)宏觀的內(nèi)容選擇,如選擇溫度等方面進(jìn)行報(bào)道。2)微觀內(nèi)容選擇,如選擇最低溫度或者最高溫度進(jìn)行報(bào)道。3)模版選擇。這三個(gè)決策步驟交替進(jìn)行。每次決策的時(shí)候會(huì)考慮到歷史決策信息,這有助于處理需要考慮長(zhǎng)距離的依賴關(guān)系的情況,如語(yǔ)義連貫性。

2 使用深度學(xué)習(xí)方法的自然語(yǔ)言生成

  • 在文本到文本的生成方面,Zhang等人[8]使用RNN進(jìn)行中文古詩(shī)生成,用戶輸入關(guān)鍵詞后首先拓展為短語(yǔ),并用來(lái)生成詩(shī)的第一行。接下來(lái)的每一行結(jié)合當(dāng)時(shí)所有已生成的詩(shī)句進(jìn)行生成。Wang[9]則將古詩(shī)生成分為規(guī)劃模型和生成模型兩部份。規(guī)劃模型部分得到用戶的輸入,在使用TextRank進(jìn)行關(guān)鍵詞抽取和使用RNN語(yǔ)言模型和基于知識(shí)庫(kù)的方法進(jìn)行拓展后,獲得一個(gè)主題詞序列,作為寫(xiě)作大綱,每一個(gè)主題詞在下一個(gè)部分生成一行詩(shī)。生成模型部分基于encoder-decoder模型,增加一個(gè)encoder為主題詞獲得一個(gè)向量表示。

  • 另一 個(gè)encoder編碼已經(jīng)生成的句子。使用attention-based的模型,decoder綜合主題詞和已經(jīng)生成的句子,生成下一句的內(nèi)容。通過(guò)這兩個(gè)模型,在更好的控制每一行詩(shī)的主題的同時(shí)保持詩(shī)詞的流暢性。最近,在ACL 2017上發(fā)表了多篇生成式摘要的論文。如See等人[6]為了解決生成一些與事實(shí)不符的內(nèi)容,在標(biāo)準(zhǔn)的基于attention的Seq2Seq模型上結(jié)合Pointer Network,使其既可以生成詞,也可以從原文中直接把一些詞放入生成的文本中。為了解決重復(fù)的問(wèn)題,加入coverage模型。Zhou等人[7]則通過(guò)在encoder和decoder之間加入一個(gè)選擇門(mén)網(wǎng)絡(luò)(selective gate network)作為輸入句子的第二層表示,提高編碼的有效性,降低decoder的負(fù)擔(dān)。

  • 在數(shù)據(jù)到文本的生成方面,Mei[14]提出了encoder-aligner-decoder的端到端模型。主要特點(diǎn)是在標(biāo)準(zhǔn)的encoder和進(jìn)行了改進(jìn)的decoder之間加入用于選擇將要描述的重要信息的aligner。它對(duì)每條記錄生成的權(quán)重分為兩個(gè)部分。第一部分是針對(duì)每條記錄的向量表示單獨(dú)計(jì)算一個(gè)權(quán)重。第二部分是在decoder的第t步時(shí),根據(jù)decoder已經(jīng)生成的內(nèi)容及對(duì)應(yīng)記錄的向量表示計(jì)算權(quán)重。在兩個(gè)數(shù)據(jù)集上取得比較好的效果提升。它的優(yōu)勢(shì)在于同步訓(xùn)練內(nèi)容選擇和生成部分且不需要針對(duì)任務(wù)人工設(shè)置特征,普適性較好。

  • 在圖像到文本的生成方面,Vinyals[15]使用Seq2Seq的模型,首先利用深層卷積神經(jīng)網(wǎng)絡(luò)DCNN 對(duì)圖像建模,然后由一個(gè)LSTM網(wǎng)絡(luò)進(jìn)行解碼生成最終的文本。與傳統(tǒng)的機(jī)器學(xué)習(xí)方法相比,無(wú)需進(jìn)行圖像和文本中詞的對(duì)齊、調(diào)整順序等步驟。Xu[16]則進(jìn)一步提出利用Attention機(jī)制來(lái)加強(qiáng)詞語(yǔ)和圖像塊之間的對(duì)齊,在生成文字的時(shí)候,模擬人看東西時(shí)關(guān)注點(diǎn)逐漸轉(zhuǎn)移的過(guò)程,以生成更符合人習(xí)慣的文本。

推薦資料:

seq2seq結(jié)構(gòu):nmt_with_attention

【深度學(xué)習(xí)和自然語(yǔ)言處理】Seq2seq 中文文本生成

模型評(píng)價(jià)

No evaluation, no research。如何對(duì)生成的文本進(jìn)行評(píng)價(jià)也是文本生成研究中重要的一環(huán)。Gkatzia[24]總結(jié)2005年到2014年間的常用的針對(duì)文本生成的評(píng)價(jià)方法,將其分為內(nèi)在評(píng)價(jià)和外在評(píng)價(jià)方法。其中內(nèi)在評(píng)價(jià)關(guān)注文本的正確性、流暢度和易理解性。常見(jiàn)的內(nèi)在評(píng)價(jià)方法又可分為兩類(lèi):

  • 1)采用BLEU、NIST和ROUGE等進(jìn)行自動(dòng)化評(píng)價(jià),評(píng)估生成文本和參考文本間相似度來(lái)衡量生成質(zhì)量。
  • 2)通過(guò)人工評(píng)價(jià),從有用性等對(duì)文本進(jìn)行打分。外在評(píng)價(jià)則關(guān)注生成文本在實(shí)際應(yīng)用中的可用性。

根據(jù)他們的分析,內(nèi)在評(píng)價(jià)方法是最為流行的評(píng)價(jià)方法。2012-2015年間發(fā)表的論文超半數(shù)使用自動(dòng)化評(píng)價(jià)指標(biāo)進(jìn)行評(píng)價(jià),但由于它需要有大量的對(duì)齊語(yǔ)料,且對(duì)于對(duì)齊語(yǔ)料的質(zhì)量很敏感,所以在使用自動(dòng)化評(píng)價(jià)指標(biāo)的同時(shí),研究者常常還會(huì)同時(shí)使用其它的評(píng)價(jià)方法,如直觀且易于操作(與外在評(píng)價(jià)方法相比)的人工評(píng)價(jià)生成文本的正確性、流暢性方法。

基于Seq2Seq的文本生成評(píng)價(jià)指標(biāo)解析

基于GPT-2進(jìn)行文本生成

基于Transformers的語(yǔ)言模型最不可思議的特點(diǎn)之一是它們能夠生成與人類(lèi)所寫(xiě)的文本幾乎沒(méi)有區(qū)別的文本。一個(gè)著名的例子是OpenAI的GPT-2,它在給出以下提示時(shí):

Inashockingfinding,scientistdiscoveredaherdofunicornslivinginaremote,previouslyunexploredvalley,intheAndesMountains.EvenmoresurprisingtotheresearcherswasthefactthattheunicornsspokeperfectEnglish.

能夠生成一篇關(guān)于獨(dú)角獸的新聞:

Thescientistnamedthepopulation,aftertheirdistinctivehorn,Ovid’sUnicorn.Thesefour-horned,silver-whiteunicornswerepreviouslyunknowntoscience.Now,afteralmosttwocenturies,themysteryofwhatsparkedthisoddphenomenonisfinallysolved.Dr.JorgePérez,anevolutionarybiologistfromtheUniversityofLaPaz,andseveralcompanions,wereexploringtheAndesMountainswhentheyfoundasmallvalley,withnootheranimalsorhumans.Péreznoticedthatthevalleyhadwhatappearedtobeanaturalfountain,surroundedbytwopeaksofrockandsilversnow.Pérezandtheothersthenventuredfurtherintothevalley.“Bythetimewereachedthetopofonepeak,thewaterlookedblue,withsomecrystalsontop,”saidPérez.Pérezandhisfriendswereastonishedtoseetheunicornherd.Thesecreaturescouldbeseenfromtheairwithouthavingtomovetoomuchtoseethem—theyweresoclosetheycouldtouchtheirhorns.WhileexaminingthesebizarrecreaturesthescientistsdiscoveredthatthecreaturesalsospokesomefairlyregularEnglish...

這個(gè)例子之前是非常有名的,是因?yàn)樗窃跊](méi)有任何明確監(jiān)督的情況下產(chǎn)生的! 通過(guò)簡(jiǎn)單地學(xué)習(xí)預(yù)測(cè)數(shù)以百萬(wàn)計(jì)的網(wǎng)頁(yè)文本中的下一個(gè)詞,GPT-2和它更強(qiáng)大的改進(jìn)版,如GPT-3,能夠獲得文本學(xué)習(xí)和模式識(shí)別能力,以及能被不同類(lèi)型的輸入提示獲得比較不錯(cuò)效果。語(yǔ)言模型在預(yù)訓(xùn)練期間有時(shí)會(huì)接觸到一些任務(wù)序列,在這些任務(wù)中,它們需要僅僅根據(jù)上下文來(lái)預(yù)測(cè)下面的標(biāo)記,如加法、解詞和翻譯。這使得它們?cè)谖⒄{(diào)期間或(如果模型足夠大)在推理時(shí)間有效地轉(zhuǎn)移這些知識(shí)。這些任務(wù)不是提前選擇的,而是在用于訓(xùn)練十億參數(shù)語(yǔ)言模型的巨大語(yǔ)料庫(kù)中自然出現(xiàn)的。

Transformers生成現(xiàn)實(shí)文本的能力導(dǎo)致了多樣化的應(yīng)用,如InferKit、Write With Transformer、AI Dungeon,以及像谷歌的Meena這樣的對(duì)話代理,它甚至可以講出老套的笑話,如圖5-2所示!

在之前教程里,我們一直專(zhuān)注于通過(guò)預(yù)訓(xùn)練和監(jiān)督微調(diào)的組合來(lái)處理NLP任務(wù)。正如我們所看到的,對(duì)于像序列或標(biāo)記分類(lèi)這樣的特定任務(wù),產(chǎn)生預(yù)測(cè)是相當(dāng)直接的,比如預(yù)測(cè)一個(gè)文本的情感類(lèi)別;模型產(chǎn)生一些分?jǐn)?shù)(可以理解為logits),然后我們?nèi)∽畲笾祦?lái)獲得預(yù)測(cè)的類(lèi)別,或者應(yīng)用softmax函數(shù)來(lái)獲得每個(gè)類(lèi)別的預(yù)測(cè)概率。相比之下,將模型的概率輸出轉(zhuǎn)換為文本需要一種解碼方法,這就引入了一些文本生成所特有的挑戰(zhàn):

  • 解碼是反復(fù)進(jìn)行的,因此比簡(jiǎn)單地將輸入通過(guò)模型的前向傳遞一次涉及到更多的計(jì)算。
  • 生成文本的質(zhì)量和多樣性取決于解碼方法和相關(guān)超參數(shù)的選擇。

為了理解這個(gè)解碼過(guò)程是如何進(jìn)行的,讓我們先來(lái)看看GPT-2是如何進(jìn)行預(yù)訓(xùn)練并隨后應(yīng)用于生成文本的。

像其他自回歸或因果語(yǔ)言模型一樣,給定一些初始提示或語(yǔ)境序列x = x1, x2, ... xk,GPT-2被預(yù)訓(xùn)練來(lái)估計(jì)文本中出現(xiàn)的文本序列y = y1, y2, ... yt的概率P(y|x)。由于訓(xùn)練數(shù)據(jù)比較大,來(lái)直接估計(jì)P(y|x)是不切實(shí)際的,所以通常使用概率鏈規(guī)則來(lái)將其分解為條件概率的乘積。

基于GPT-2進(jìn)行文本生成

其中y是序列y1,>

現(xiàn)在你可能已經(jīng)猜到我們?nèi)绾握{(diào)整這個(gè)下一個(gè)標(biāo)記的預(yù)測(cè)任務(wù),以生成任意長(zhǎng)度的文本序列。如圖5-3所示,我們從 "transformers "這樣的流程開(kāi)始,用模型來(lái)預(yù)測(cè)下一個(gè)標(biāo)記。一旦我們確定了下一個(gè)標(biāo)記,我們就把它附加到提示上,然后用新的輸入序列來(lái)生成另一個(gè)標(biāo)記。重復(fù)這個(gè)過(guò)程,直到我們達(dá)到一個(gè)特殊的序列結(jié)束符號(hào)或預(yù)先定義的最大長(zhǎng)度。

基于GPT-2進(jìn)行文本生成

文本生成挑戰(zhàn)

解碼方式1:貪婪搜索(Greedy Search)

從模型的連續(xù)輸出中獲得離散標(biāo)記的最簡(jiǎn)單的解碼方法是貪婪地選擇每個(gè)時(shí)間點(diǎn)上概率最大的標(biāo)記:

基于GPT-2進(jìn)行文本生成

為了了解貪婪搜索是如何工作的,讓我們先用語(yǔ)言建模頭加載15億參數(shù)版本的GPT-2:

#導(dǎo)入包
importtorch
fromtransformersimportAutoTokenizer,AutoModelForCausalLM

device="cuda"iftorch.cuda.is_available()else"cpu"
model_name="gpt2-xl"
tokenizer=AutoTokenizer.from_pretrained(model_name)
model=AutoModelForCausalLM.from_pretrained(model_name).to(device)
Downloading:  0%|     | 0.00/689 [00:00

現(xiàn)在讓我們來(lái)生成一些文本! 盡管Transformers為GPT-2這樣的自回歸模型提供了一個(gè)generate()函數(shù),加載預(yù)訓(xùn)練模型就可以直接進(jìn)行解碼

但我們將自己實(shí)現(xiàn)這個(gè)解碼方法,看看內(nèi)部具體流程是什么操作。為了方便理解,我們采取圖5-3所示的相同的迭代方法:我們將使用 "transformers "作為輸入提示,并進(jìn)行8步的解碼。在每個(gè)時(shí)間步驟中,我們?yōu)樘崾局械淖詈笠粋€(gè)字符計(jì)算出模型的對(duì)數(shù),并用softmax計(jì)算一下,得到一個(gè)概率分布。然后,我們挑選出概率最高的下一個(gè)符號(hào),將其添加到輸入序列中,并再次運(yùn)行該過(guò)程。

下面的代碼完成了這項(xiàng)工作,并且還在每個(gè)時(shí)間段存儲(chǔ)了五個(gè)最有可能的標(biāo)記,這樣我們就可以直觀地看到備選方案:


importpandasaspd

input_txt="Transformersarethe"
input_ids=tokenizer(input_txt,return_tensors="pt")["input_ids"].to(device)
iterations=[]
n_steps=8#進(jìn)行8步解碼
choices_per_step=5#每一步候選數(shù)量

withtorch.no_grad():#eval模式
for_inrange(n_steps):#每步解碼
iteration=dict()
iteration["Input"]=tokenizer.decode(input_ids[0])#提示文本
output=model(input_ids=input_ids)#將提示文本輸入到模型進(jìn)行解碼
#Selectlogitsofthefirstbatchandthelasttokenandapplysoftmax
next_token_logits=output.logits[0,-1,:]
next_token_probs=torch.softmax(next_token_logits,dim=-1)
sorted_ids=torch.argsort(next_token_probs,dim=-1,descending=True)
#Storetokenswithhighestprobabilities
forchoice_idxinrange(choices_per_step):#概率最大的五個(gè)token
token_id=sorted_ids[choice_idx]
token_prob=next_token_probs[token_id].cpu().numpy()
token_choice=(
f"{tokenizer.decode(token_id)}({100*token_prob:.2f}%)"#取百分號(hào)兩位數(shù)
)
iteration[f"Choice{choice_idx+1}"]=token_choice
#Appendpredictednexttokentoinput
input_ids=torch.cat([input_ids,sorted_ids[None,0,None]],dim=-1)#將概率最大的字符拼接到提示文本
iterations.append(iteration)

pd.DataFrame(iterations)
Input Choice 1 Choice 2 Choice 3 Choice 4 Choice 5
0 Transformers are the most (8.54%) only (4.96%) best (4.65%) Transformers (4.37%) ultimate (2.16%)
1 Transformers are the most popular (16.77%) powerful (5.37%) common (4.96%) famous (3.72%) successful (3.19%)
2 Transformers are the most popular toy (10.62%) toys (7.23%) Transformers (6.60%) of (5.46%) and (3.76%)
3 Transformers are the most popular toy line (34.37%) in (18.21%) of (11.71%) brand (6.09%) line (2.69%)
4 Transformers are the most popular toy line in (46.26%) of (15.09%) , (4.94%) on (4.39%) ever (2.72%)
5 Transformers are the most popular toy line in the (66.00%) history (12.40%) America (6.91%) Japan (2.44%) North (1.40%)
6 Transformers are the most popular toy line in the world (69.24%) United (4.55%) history (4.29%) US (4.23%) U (2.30%)
7 Transformers are the most popular toy line in ... , (39.73%) . (30.64%) and (9.88%) with (2.32%) today (1.74%)

實(shí)現(xiàn)貪婪搜索并不難,但我們要使用Transformers內(nèi)置的generate()函數(shù)來(lái)探索更復(fù)雜的解碼方法。為了重現(xiàn)我們的簡(jiǎn)單例子,讓我們 確保采樣被關(guān)閉(默認(rèn)情況下是關(guān)閉的,除非你加載檢查點(diǎn)的模型的具體配置另有規(guī)定),并為新生成的標(biāo)記數(shù)量指定max_new_tokens:


input_ids=tokenizer(input_txt,return_tensors="pt")["input_ids"].to(device)
output=model.generate(input_ids,max_new_tokens=n_steps,do_sample=False)
print(tokenizer.decode(output[0]))

Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.


Transformers are the most popular toy line in the world,

現(xiàn)在讓我們嘗試一些更有趣的東西:我們能重現(xiàn)OpenAI的獨(dú)角獸故事嗎?正如我們之前所做的,我們將用標(biāo)記器對(duì)提示進(jìn)行編碼,并且我們將為max_length指定一個(gè)較大的值,以生成一個(gè)較長(zhǎng)的文本序列:


max_length=128
input_txt="""Inashockingfinding,scientistdiscovered
aherdofunicornslivinginaremote,previouslyunexplored
valley,intheAndesMountains.Evenmoresurprisingtothe
researcherswasthefactthattheunicornsspokeperfectEnglish.


"""
input_ids=tokenizer(input_txt,return_tensors="pt")["input_ids"].to(device)
output_greedy=model.generate(input_ids,max_length=max_length,
do_sample=False)
print(tokenizer.decode(output_greedy[0]))

Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.


In a shocking finding, scientist discovered a herd of unicorns living in a remote, previously unexplored valley, in the Andes Mountains. Even more surprising to the researchers was the fact that the unicorns spoke perfect English.


The researchers, from the University of California, Davis, and the University of Colorado, Boulder, were conducting a study on the Andean cloud forest, which is home to the rare species of cloud forest trees.


The researchers were surprised to find that the unicorns were able to communicate with each other, and even with humans.


The researchers were surprised to find that the unicorns were able

我們還可以看到貪婪搜索解碼的一個(gè)主要缺點(diǎn):它傾向于產(chǎn)生重復(fù)的輸出序列,這在新聞文章場(chǎng)景中當(dāng)然是不合適的,新聞講究言簡(jiǎn)意賅。這是貪婪搜索算法的一個(gè)常見(jiàn)問(wèn)題,它可能無(wú)法給你提供最佳解決方案;在解碼的背景下,它們可能會(huì)錯(cuò)過(guò)整體概率較高的單詞序列,只是因?yàn)楦吒怕实膯卧~剛好在低概率的單詞之前。

幸運(yùn)的是,我們可以做得更好--讓我們研究一種被稱為集束搜索(eam search decoding)的解碼方法。

解碼方式2:集束搜索(beam search decoding)

集束搜索不是在每一步解碼概率最高的標(biāo)記,而是記錄前b個(gè)最有可能的下一個(gè)標(biāo)記,其中b被稱為波束或路徑個(gè)數(shù)。下一組集束的選擇是考慮現(xiàn)有集束的所有可能的下一個(gè)標(biāo)記的擴(kuò)展,并選擇b個(gè)最可能的擴(kuò)展。這個(gè)過(guò)程重復(fù)進(jìn)行,直到我們達(dá)到最大長(zhǎng)度或EOS標(biāo)記,然后根據(jù)對(duì)數(shù)概率對(duì)b個(gè)波束進(jìn)行排序,選擇最可能的序列。圖5-4中顯示了一個(gè)束搜索的例子。

基于GPT-2進(jìn)行文本生成

為什么我們要用對(duì)數(shù)概率而不是概率本身對(duì)序列進(jìn)行評(píng)分?計(jì)算一個(gè)序列的總體概率P(y1,y2,...,yt|x)涉及計(jì)算條件概率P(yt|y,x)的乘積是一個(gè)原因。由于每個(gè)條件概率通常是[0,1]范圍內(nèi)的一個(gè)小數(shù)字,取它們的乘積會(huì)導(dǎo)致總的概率很容易出現(xiàn)下溢。這意味著計(jì)算機(jī)不能再精確地表示計(jì)算的結(jié)果。例如,假設(shè)我們有一個(gè)由t>


0.5**1024

5.562684646268003e-309

導(dǎo)致數(shù)值不穩(wěn)定,因?yàn)槲覀冇龅搅讼乱?。我們可以通過(guò)計(jì)算一個(gè)相關(guān)項(xiàng),即對(duì)數(shù)概率來(lái)避免這種情況。如果我們將對(duì)數(shù)應(yīng)用于聯(lián)合概率和條件概率,那么在對(duì)數(shù)的乘積規(guī)則的幫助下,我們可以得到:

基于GPT-2進(jìn)行文本生成

importnumpyasnp

sum([np.log(0.5)]*1024)

-709.7827128933695

這是一個(gè)我們可以輕松處理的數(shù)字,而且這種方法對(duì)更小的數(shù)字仍然有效。由于我們只想比較相對(duì)概率,我們可以直接用對(duì)數(shù)概率來(lái)做。

讓我們計(jì)算并比較貪婪和束搜索產(chǎn)生的文本的對(duì)數(shù)概率,看看束搜索是否能提高整體概率。由于變形金剛模型返回的是給定輸入標(biāo)記的下一個(gè)標(biāo)記的未歸一化對(duì)數(shù),我們首先需要將對(duì)數(shù)歸一化,以便為序列中的每個(gè)標(biāo)記創(chuàng)建整個(gè)詞匯的概率分布。然后,我們需要只選擇序列中存在的標(biāo)記概率。下面的函數(shù)實(shí)現(xiàn)了這些步驟。


importtorch.nn.functionalasF

deflog_probs_from_logits(logits,labels):
logp=F.log_softmax(logits,dim=-1)
logp_label=torch.gather(logp,2,labels.unsqueeze(2)).squeeze(-1)
returnlogp_label

這給我們提供了單個(gè)標(biāo)記的對(duì)數(shù)概率,所以要得到一個(gè)序列的總對(duì)數(shù)概率,我們只需要將每個(gè)標(biāo)記的對(duì)數(shù)概率相加:


defsequence_logprob(model,labels,input_len=0):
withtorch.no_grad():
output=model(labels)
log_probs=log_probs_from_logits(
output.logits[:,:-1,:],labels[:,1:])
seq_log_prob=torch.sum(log_probs[:,input_len:])
returnseq_log_prob.cpu().numpy()

注意,我們忽略了輸入序列的對(duì)數(shù)概率,因?yàn)樗鼈儾皇怯赡P蜕傻?。我們還可以看到,將對(duì)數(shù)和標(biāo)簽對(duì)齊是很重要的;因?yàn)槟P皖A(yù)測(cè)了下一個(gè)標(biāo)記,所以我們沒(méi)有得到第一個(gè)標(biāo)簽的對(duì)數(shù),我們也不需要最后一個(gè)對(duì)數(shù),因?yàn)槲覀儧](méi)有它的地面真相標(biāo)記。

讓我們用這些函數(shù)來(lái)首先計(jì)算OpenAI提示上的貪婪解碼器的序列對(duì)數(shù)概率。


logp=sequence_logprob(model,output_greedy,input_len=len(input_ids[0]))
print(tokenizer.decode(output_greedy[0]))
print(f"
log-prob:{logp:.2f}")

In a shocking finding, scientist discovered a herd of unicorns living in a remote, previously unexplored valley, in the Andes Mountains. Even more surprising to the researchers was the fact that the unicorns spoke perfect English.


The researchers, from the University of California, Davis, and the University of Colorado, Boulder, were conducting a study on the Andean cloud forest, which is home to the rare species of cloud forest trees.


The researchers were surprised to find that the unicorns were able to communicate with each other, and even with humans.


The researchers were surprised to find that the unicorns were able


log-prob: -87.43

現(xiàn)在讓我們把它與用束搜索生成的序列進(jìn)行比較。要用generate()函數(shù)激活束搜索,我們只需要用num_beams參數(shù)指定波束的數(shù)量。我們選擇的波束越多,可能得到的結(jié)果就越好;然而,生成過(guò)程會(huì)變得更慢,因?yàn)槲覀優(yōu)槊總€(gè)波束生成平行序列:


output_beam=model.generate(input_ids,max_length=max_length,num_beams=5,
do_sample=False)
logp=sequence_logprob(model,output_beam,input_len=len(input_ids[0]))
print(tokenizer.decode(output_beam[0]))
print(f"
log-prob:{logp:.2f}")

Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.


In a shocking finding, scientist discovered a herd of unicorns living in a remote, previously unexplored valley, in the Andes Mountains. Even more surprising to the researchers was the fact that the unicorns spoke perfect English.


The discovery of the unicorns was made by a team of scientists from the University of California, Santa Cruz, and the National Geographic Society.


The scientists were conducting a study of the Andes Mountains when they discovered a herd of unicorns living in a remote, previously unexplored valley, in the Andes Mountains. Even more surprising to the researchers was the fact that the unicorns spoke perfect English


log-prob: -55.22

我們可以看到,我們用束搜索得到的對(duì)數(shù)概率(越高越好)比用簡(jiǎn)單的貪婪解碼得到的要好。然而,我們可以看到,束搜索也受到重復(fù)文本的影響。解決這個(gè)問(wèn)題的一個(gè)方法是用no_repeat_ngram_size參數(shù)施加一個(gè)n-gram懲罰,跟蹤哪些n-gram已經(jīng)被看到,并將下一個(gè)token的概率設(shè)置為零,如果它將產(chǎn)生一個(gè)以前看到的n-gram:

output_beam = model.generate(input_ids, max_length=max_length, num_beams=5,do_sample=False, no_repeat_ngram_size=2)logp = sequence_logprob(model, output_beam, input_len=len(input_ids[0]))print(tokenizer.decode(output_beam[0]))print(f" log-prob: {logp:.2f}")

這還不算太糟!我們已經(jīng)設(shè)法停止了重復(fù),而且我們可以看到,盡管產(chǎn)生了較低的分?jǐn)?shù),但文本仍然是連貫的。帶n-gram懲罰的束搜索是一種很好的方法,可以在關(guān)注高概率的標(biāo)記(用束搜索)和減少重復(fù)(用n-gram懲罰)之間找到一個(gè)平衡點(diǎn),它通常用于總結(jié)或機(jī)器翻譯等事實(shí)正確性很重要的應(yīng)用中。當(dāng)事實(shí)的正確性不如生成的輸出的多樣性重要時(shí),例如在開(kāi)放領(lǐng)域的閑聊或故事生成中,另一種減少重復(fù)同時(shí)提高多樣性的方法是使用抽樣。讓我們通過(guò)研究幾種最常見(jiàn)的抽樣方法來(lái)完成我們對(duì)文本生成的探索。

解碼方式3:溫度采樣方法(Temperature Sampling Methods)

基于GPT-2進(jìn)行文本生成

其中|V|表示詞匯的cardinality。我們可以通過(guò)添加一個(gè)溫度參數(shù)T來(lái)輕松控制輸出的多樣性,該參數(shù)在采取softmax之前重新調(diào)整對(duì)數(shù):

基于GPT-2進(jìn)行文本生成

通過(guò)調(diào)整T,我們可以控制概率分布的形狀。當(dāng)T?1時(shí),分布在原點(diǎn)周?chē)兊眉怃J,罕見(jiàn)的標(biāo)記被壓制。另一方面,當(dāng)T?1時(shí),分布變得平緩,每個(gè)令牌的可能性相同。溫度對(duì)標(biāo)記概率的影響見(jiàn)圖5-5。

當(dāng)temperature→0,就變成greedy search;當(dāng)temperature→∞,就變成均勻采樣(uniform sampling)。詳見(jiàn)論文:The Curious Case of Neural Text Degeneration

基于GPT-2進(jìn)行文本生成

為了看看我們?nèi)绾卫脺囟葋?lái)影響生成的文本,讓我們通過(guò)在generate()函數(shù)中設(shè)置溫度參數(shù),以T=2為例進(jìn)行采樣(我們將在下一節(jié)解釋top_k參數(shù)的含義):


#hide_input

#idtemperature
#altTokenprobabilitiesasafunctionoftemperature
#captionDistributionofrandomlygeneratedtokenprobabilitiesforthreeselectedtemperatures
importmatplotlib.pyplotasplt
importnumpyasnp

defsoftmax(logits,T=1):
e_x=np.exp(logits/T)
returne_x/e_x.sum()

logits=np.exp(np.random.random(1000))
sorted_logits=np.sort(logits)[::-1]
x=np.arange(1000)

forTin[0.5,1.0,2.0]:
plt.step(x,softmax(sorted_logits,T),label=f"T={T}")
plt.legend(loc="best")
plt.xlabel("Sortedtokenprobabilities")
plt.ylabel("Probability")
plt.show()

基于GPT-2進(jìn)行文本生成


#hide
torch.manual_seed(42);

為了看看我們?nèi)绾卫脺囟葋?lái)影響生成的文本,讓我們通過(guò)在generate()函數(shù)中設(shè)置溫度參數(shù),以T=2為例進(jìn)行采樣(我們將在下一節(jié)解釋top_k參數(shù)的含義):


output_temp=model.generate(input_ids,max_length=max_length,do_sample=True,
temperature=2.0,top_k=0)
print(tokenizer.decode(output_temp[0]))

Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.


In a shocking finding, scientist discovered a herd of unicorns living in a remote, previously unexplored valley, in the Andes Mountains. Even more surprising to the researchers was the fact that the unicorns spoke perfect English.


While the station aren protagonist receive Pengala nostalgiates tidbitRegarding Jenny loclonju AgreementCON irrational ?rite Continent seaf A jer Turner Dorbecue WILL Pumpkin mere Thatvernuildagain YoAniamond disse * Runewitingkusstemprop});b zo coachinginventorymodules deflation press Vaticanpres Wrestling chargesThingsctureddong Ty physician PET KimBi66 graz Oz at aff da temporou MD6 radi iter

我們可以清楚地看到,高溫產(chǎn)生了大部分的胡言亂語(yǔ);通過(guò)調(diào)大罕見(jiàn)詞匯出現(xiàn)的概率,我們使模型產(chǎn)生了奇怪的語(yǔ)法和相當(dāng)多的生造詞!讓我們看看如果我們把溫度降下來(lái)會(huì)發(fā)生什么:


#hide
torch.manual_seed(42);

output_temp=model.generate(input_ids,max_length=max_length,do_sample=True,
temperature=0.5,top_k=0)
print(tokenizer.decode(output_temp[0]))

Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.


In a shocking finding, scientist discovered a herd of unicorns living in a remote, previously unexplored valley, in the Andes Mountains. Even more surprising to the researchers was the fact that the unicorns spoke perfect English.


The scientists were searching for the source of the mysterious sound, which was making the animals laugh and cry.


The unicorns were living in a remote valley in the Andes mountains


'When we first heard the noise of the animals, we thought it was a lion or a tiger,' said Luis Guzman, a researcher from the University of Buenos Aires, Argentina.


'But when

這明顯更有連貫性,甚至還包括了另一所大學(xué)因這一發(fā)現(xiàn)而被引用的一段話 我們可以從溫度中得出的主要經(jīng)驗(yàn)是,它允許我們控制樣本的質(zhì)量,但在一致性(低溫)和多樣性(高溫)之間總有一個(gè)權(quán)衡,我們需要根據(jù)根據(jù)手頭的使用情況進(jìn)行調(diào)整。

調(diào)整一致性和多樣性之間權(quán)衡的另一種方法是截?cái)嘣~匯的分布。這使我們能夠隨著溫度自由地調(diào)整多樣性,但在一個(gè)更有限的范圍內(nèi),排除那些在語(yǔ)境中過(guò)于奇怪的詞(即低概率詞)。有兩種主要的方法:top-k和nucleus(或top-p)采樣。我們來(lái)看看

在大多數(shù)研究中, tempreature的選擇,往往呈現(xiàn)如下規(guī)律:

  • 當(dāng) temperature 設(shè)置為較小或者0的值時(shí), Temperature Sampling 等同于 每次選擇最大概率的 Greedy Search。

  • 小的temperature 會(huì)引發(fā)極大的 repetitive 和predictable文本,但是文本內(nèi)容往往更貼合語(yǔ)料(highly realistic),基本所有的詞都來(lái)自與語(yǔ)料庫(kù)。

  • 當(dāng)temperatures較大時(shí), 生成的文本更具有隨機(jī)性( random)、趣味性( interesting),甚至創(chuàng)造性( creative); 甚至有些時(shí)候能發(fā)現(xiàn)一些新詞(misspelled words) 。

  • 當(dāng) 設(shè)置高 temperature時(shí),文本局部結(jié)構(gòu)往往會(huì)被破壞,大多數(shù)詞可能會(huì)時(shí)semi-random strings 的形式。

  • 實(shí)際應(yīng)用中,往往experiment with multiple temperature values! 當(dāng)保持了一定的隨機(jī)性又能不破壞結(jié)構(gòu)時(shí),往往會(huì)得到有意思的生成文本。

Top-k和核采樣(Top-k and Nucleus Sampling)

Top-k和nucleus(top-p)抽樣是兩種流行的替代方法或使用溫度的擴(kuò)展。在這兩種情況下,其基本思想是限制我們?cè)诿總€(gè)時(shí)間步長(zhǎng)中可以取樣的可能標(biāo)記的數(shù)量。為了了解這一點(diǎn),首先讓我們把模型在T=1時(shí)的累積概率分布可視化,如圖5-6所示。

讓我們把這些圖分開(kāi),因?yàn)樗鼈儼舜罅康男畔?。在上面的圖中,我們可以看到令牌概率的柱狀圖。它在10-8左右有一個(gè)峰值,在10-4左右有一個(gè)較小的峰值,然后是急劇下降,只有少數(shù)幾個(gè)概率在10-2和10-1之間的標(biāo)記出現(xiàn)。看這張圖,我們可以看到,挑選概率最高的字符(10-1處的孤立條)的概率是1/10。

基于GPT-2進(jìn)行文本生成

在下圖中,我們按概率降序排列標(biāo)記,并計(jì)算前10,000個(gè)標(biāo)記的累積總和(GPT-2的詞匯中總共有50,257個(gè)標(biāo)記)?;【€代表挑選前面任何一個(gè)標(biāo)記的概率。例如,在概率最高的1,000個(gè)標(biāo)記中,大約有96%的機(jī)會(huì)挑選任何一個(gè)標(biāo)記。我們看到,該概率迅速上升到90%以上,但在幾千個(gè)標(biāo)記之后才飽和,接近100%。該圖 顯示,有1/100的概率沒(méi)有選到任何甚至不在前2000名的標(biāo)記。

雖然這些數(shù)字乍看之下可能很小,但它們變得很重要,因?yàn)樵谏晌谋緯r(shí),我們對(duì)每個(gè)標(biāo)記取樣一次。因此,即使只有1/100或1/1000的機(jī)會(huì),如果我們?nèi)訑?shù)百次,就有很大的機(jī)會(huì)在某一時(shí)刻選到一個(gè)不可能的標(biāo)記,而且在取樣時(shí)選到這樣的標(biāo)記會(huì)嚴(yán)重影響生成文本的質(zhì)量。出于這個(gè)原因,我們通常希望避免這些非常不可能的標(biāo)記。這就是top-k和top-p采樣發(fā)揮作用的地方。


#hide
torch.manual_seed(42);

#hide
input_txt="""Inashockingfinding,scientistdiscovered
aherdofunicornslivinginaremote,previouslyunexplored
valley,intheAndesMountains.Evenmoresurprisingtothe
researcherswasthefactthattheunicornsspokeperfectEnglish.


"""
input_ids=tokenizer(input_txt,return_tensors="pt")["input_ids"].to(device)

#hide
importtorch.nn.functionalasF

withtorch.no_grad():
output=model(input_ids=input_ids)
next_token_logits=output.logits[:,-1,:]
probs=F.softmax(next_token_logits,dim=-1).detach().cpu().numpy()

#hide_input

#iddistribution
#altProbabilitydistributionofnexttokenprediction.
#captionProbabilitydistributionofnexttokenprediction(left)andcumulativedistributionofdescendingtokenprobabilities

importmatplotlib.pyplotasplt
importnumpyasnp

fig,axes=plt.subplots(1,2,figsize=(10,3.5))

axes[0].hist(probs[0],bins=np.logspace(-10,-1,100),color="C0",edgecolor="C0")
axes[0].set_xscale("log")
axes[0].set_yscale("log")
axes[0].set_title("Probabilitydistribution")
axes[0].set_xlabel("Probability")
axes[0].set_ylabel("Count")
#axes[0].grid(which="major")

axes[1].plot(np.cumsum(np.sort(probs[0])[::-1]),color="black")
axes[1].set_xlim([0,10000])
axes[1].set_ylim([0.75,1.01])
axes[1].set_title("Cumulativeprobability")
axes[1].set_ylabel("Probability")
axes[1].set_xlabel("Token(descendingprobability)")
#axes[1].grid(which="major")
axes[1].minorticks_on()
#axes[1].grid(which='minor',linewidth='0.5')
top_k_label='top-kthreshold(k=2000)'
top_p_label='nucleusthreshold(p=0.95)'
axes[1].vlines(x=2000,ymin=0,ymax=2,color='C0',label=top_k_label)
axes[1].hlines(y=0.95,xmin=0,xmax=10000,color='C1',label=top_p_label,linestyle='--')
axes[1].legend(loc='lowerright')
plt.tight_layout()
基于GPT-2進(jìn)行文本生成


#hide
torch.manual_seed(42);
  • top-k抽樣

在Top-K Sampling中,將挑選出K個(gè)最有可能的下一個(gè)單詞,并且僅在這K個(gè)下一個(gè)單詞之間重新為它們分配概率。GPT2就是采用了這種采樣方案,這也是其生成故事效果不錯(cuò)的原因之一。

我們將上面示例中兩個(gè)采樣步中使用的單詞范圍從3個(gè)擴(kuò)展到10個(gè),以更好地說(shuō)明Top-K采樣。

基于GPT-2進(jìn)行文本生成

上述設(shè)置K = 6 K=6K=6,將采樣最有可能的6個(gè)單詞,記為V top-K .在第一步采樣中,V top-K top-K 包含了整體的2/3,第二步采樣則包含了幾乎全部,但是有效地去除了一些奇奇怪怪的單詞。

top-k抽樣背后的想法是通過(guò)只從概率最高的k個(gè)標(biāo)記中抽樣來(lái)避免低概率的選擇。這就在分布的長(zhǎng)尾上設(shè)置了一個(gè)固定的切口,確保我們只從可能的選擇中取樣?;氐綀D5-6,top-k抽樣相當(dāng)于定義一條垂直線并從左邊的標(biāo)記中抽樣。同樣,generate()函數(shù)通過(guò)top_k參數(shù)提供了一個(gè)簡(jiǎn)單的方法來(lái)實(shí)現(xiàn)這一點(diǎn):


output_topk=model.generate(input_ids,max_length=max_length,do_sample=True,
top_k=50)
print(tokenizer.decode(output_topk[0]))

Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.


In a shocking finding, scientist discovered a herd of unicorns living in a remote, previously unexplored valley, in the Andes Mountains. Even more surprising to the researchers was the fact that the unicorns spoke perfect English.


The wild unicorns roam the Andes Mountains in the region of Cajamarca, on the border with Argentina (Picture: Alamy/Ecole Nationale Supérieure d'Histoire Naturelle)


The researchers came across about 50 of the animals in the valley. They had lived in such a remote and isolated area at that location for nearly a thousand years that

這可以說(shuō)是我們迄今為止生成的最像人類(lèi)的文本。但是我們?nèi)绾芜x擇k呢?k的值是手動(dòng)選擇的,對(duì)序列中的每個(gè)選擇都是一樣的,與實(shí)際的輸出分布無(wú)關(guān)。序列中的每個(gè)選擇都是一樣的,與實(shí)際的輸出分布無(wú)關(guān)。我們可以通過(guò)查看一些文本質(zhì)量指標(biāo)來(lái)找到一個(gè)好的k值,我們將在下一章探討這個(gè)問(wèn)題--但這個(gè)固定的截止值可能并不十分令人滿意。

另一種方法是使用動(dòng)態(tài)截?cái)唷T诤顺闃踊蝽敵闃又?,我們不是選擇一個(gè)固定的截?cái)嘀担窃O(shè)定一個(gè)截?cái)嗟臅r(shí)間條件。這個(gè)條件就是在選擇中達(dá)到一定的概率質(zhì)量時(shí)。比方說(shuō),我們把這個(gè)值設(shè)定為95%。然后我們按概率降序排列所有標(biāo)記,并從列表的頂部開(kāi)始一個(gè)接一個(gè)地添加標(biāo)記,直到所選標(biāo)記的概率之和達(dá)到95%?;氐綀D5-6,p的值在概率累積總和圖上定義了一條水平線,我們只從該線以下的標(biāo)記中取樣。根據(jù)輸出分布,這可能只是一個(gè)(非常可能的)標(biāo)記,也可能是一百個(gè)(同樣可能的)標(biāo)記。在這一點(diǎn)上,你可能對(duì)generate()函數(shù)也提供了一個(gè)激活top-p抽樣的參數(shù)而不感到驚訝。讓我們來(lái)試試吧:

  • top-p采樣

在Top-p采樣中,不是從僅最可能的K個(gè)單詞中采樣,而是從其累積概率超過(guò)一個(gè)閾值p的最小可能單詞集合中進(jìn)行選擇,然后將這組單詞重新分配概率。這樣,單詞集合的大?。ㄒ簿褪羌现袉卧~的數(shù)量)可以根據(jù)下一個(gè)單詞的概率分布動(dòng)態(tài)地增加或減少。

基于GPT-2進(jìn)行文本生成

上圖示例設(shè)置p = 0.92 p = 0.92p=0.92,定義為V top-p ,所有單詞累計(jì)概率超過(guò)0.92的最小單詞子集。在第一步采樣中,包括了9個(gè)最有可能的單詞,而在第二步采樣中,只需選擇前3個(gè)單詞即可超過(guò)92%。其實(shí)很簡(jiǎn)單!上述過(guò)程可以看成,當(dāng)下一個(gè)單詞的可預(yù)測(cè)性不確定時(shí),保留了較多的單詞,例如 P ( w ∣ ′ ′ The ′ ′ ) );而當(dāng)下一個(gè)單詞看起來(lái)比較可預(yù)測(cè)時(shí),只保留幾個(gè)單詞,例如P,P(w∣" The ", “car”)。


#hide
torch.manual_seed(42);

output_topp=model.generate(input_ids,max_length=max_length,do_sample=True,
top_p=0.90)
print(tokenizer.decode(output_topp[0]))

Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.


In a shocking finding, scientist discovered a herd of unicorns living in a remote, previously unexplored valley, in the Andes Mountains. Even more surprising to the researchers was the fact that the unicorns spoke perfect English.


The scientists studied the DNA of the animals and came to the conclusion that the herd are descendants of a prehistoric herd that lived in Argentina about 50,000 years ago.


According to the scientific analysis, the first humans who migrated to South America migrated into the Andes Mountains from South Africa and Australia, after the last ice age had ended.


Since their migration, the animals have been adapting to

Top-p采樣也產(chǎn)生了一個(gè)連貫的故事,而且這次有一個(gè)新的轉(zhuǎn)折點(diǎn),關(guān)于從澳大利亞到南美洲的移民。你甚至可以把這兩種抽樣方法結(jié)合起來(lái),以獲得兩個(gè)世界的最佳效果。設(shè)置top_k=50和top_p=0.9,相當(dāng)于從最多50個(gè)標(biāo)記的池子里選擇概率質(zhì)量為90%的標(biāo)記的規(guī)則。

注意事項(xiàng)

當(dāng)我們使用抽樣時(shí),我們也可以應(yīng)用束搜索。與其貪婪地選擇下一批候選標(biāo)記,我們可以對(duì)它們進(jìn)行抽樣,并以同樣的方式建立起波束。

哪種解碼方法是最好的?

不幸的是,沒(méi)有一個(gè)普遍的 "最佳 "解碼方法。哪種方法最好,取決于你生成文本的任務(wù)的性質(zhì)。如果你想讓你的模型執(zhí)行一個(gè)精確的任務(wù),如進(jìn)行算術(shù)運(yùn)算或提供一個(gè)特定問(wèn)題的答案,那么你應(yīng)該降低溫度或使用確定性的方法,如貪婪搜索與束搜索相結(jié)合,以保證得到最可能的答案。如果你想讓模型生成更長(zhǎng)的文本,甚至有點(diǎn)創(chuàng)造性,那么你應(yīng)該改用抽樣方法,并提高溫度,或者使用top-k和核抽樣的混合方法。

結(jié)論

在這一章中,我們研究了文本生成,這是一項(xiàng)與我們之前遇到的NLU任務(wù)截然不同的任務(wù)。生成文本需要對(duì)每個(gè)生成的標(biāo)記進(jìn)行至少一次前向傳遞,如果我們使用束搜索,則需要更多。這使得文本生成對(duì)計(jì)算的要求很高,人們需要合適的基礎(chǔ)設(shè)施來(lái)大規(guī)模地運(yùn)行文本生成模型。此外,一個(gè)好的解碼策略,將模型的輸出概率轉(zhuǎn)化為離散的標(biāo)記,可以提高文本質(zhì)量。找到 最好的解碼策略需要進(jìn)行一些實(shí)驗(yàn)和對(duì)生成的文本進(jìn)行主觀評(píng)價(jià)。然而,在實(shí)踐中,我們不希望僅憑直覺(jué)來(lái)做這些決定。和其他NLP任務(wù)一樣,我們應(yīng)該選擇一個(gè)能反映我們想要解決的問(wèn)題的模型性能指標(biāo)。不出所料,選擇的范圍很廣,我們將在下一章中遇到最常見(jiàn)的選擇,在這一章中我們將看看如何訓(xùn)練和評(píng)估文本總結(jié)的模型?;蛘撸绻闫炔患按叵雽W(xué)習(xí)如何從頭開(kāi)始訓(xùn)練一個(gè)GPT類(lèi)型的模型,你可以直接跳到第10章,在那里我們收集一個(gè)大型的代碼數(shù)據(jù)集,然后在上面訓(xùn)練一個(gè)自回歸語(yǔ)言模型。

原文標(biāo)題:Transformers實(shí)戰(zhàn)系列 之 文本生成

文章出處:【微信公眾號(hào):深度學(xué)習(xí)自然語(yǔ)言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 生成
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    13739
  • 語(yǔ)言模型
    +關(guān)注

    關(guān)注

    0

    文章

    561

    瀏覽量

    10788
  • 自然語(yǔ)言處理
    +關(guān)注

    關(guān)注

    1

    文章

    628

    瀏覽量

    14157

原文標(biāo)題:Transformers實(shí)戰(zhàn)系列 之 文本生成

文章出處:【微信號(hào):zenRRan,微信公眾號(hào):深度學(xué)習(xí)自然語(yǔ)言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何構(gòu)建文本生成器?如何實(shí)現(xiàn)馬爾可夫鏈以實(shí)現(xiàn)更快的預(yù)測(cè)模型

    準(zhǔn)確的,內(nèi)存少(只存儲(chǔ)1個(gè)以前的狀態(tài))并且執(zhí)行速度快。文本生成的實(shí)現(xiàn)這里將通過(guò)6個(gè)步驟完成文本生成器:1、生成查找表:創(chuàng)建表來(lái)記錄詞頻2、將頻率轉(zhuǎn)換為概率:將我們的發(fā)現(xiàn)轉(zhuǎn)換為可用的形式
    發(fā)表于 11-22 15:06

    OpenAI發(fā)布一款令人印象深刻的語(yǔ)言模型GPT-2

    今年2月,OpenAI發(fā)布了一款令人印象深刻的語(yǔ)言模型GPT-2,它可以寫(xiě)短篇小說(shuō)、詩(shī)歌,甚至輕松辨別《哈利波特》和《指環(huán)王》中的角色。最近,一位加拿大工程師用它創(chuàng)建了一個(gè)向公眾開(kāi)放的文本生成器,只需提供一個(gè)句子,機(jī)器便能自動(dòng)
    的頭像 發(fā)表于 05-17 18:48 ?4802次閱讀

    人工智能在文本創(chuàng)作上的發(fā)展分析

    AI在文本創(chuàng)作上的能力正在加強(qiáng)。人們對(duì)于人工智能的創(chuàng)作能力賦予了更大的想象力,尤其是在OpenAI 推出文本生成模型 GPT-2 后。
    發(fā)表于 07-08 09:53 ?1656次閱讀

    OpenAI宣布,發(fā)布了7.74億參數(shù)GPT-2語(yǔ)言模型

    就在本周,OpenAI宣布,發(fā)布了7.74億參數(shù)GPT-2語(yǔ)言模型,15.58億的完整模型也有望于幾個(gè)月內(nèi)發(fā)布,并將GPT-2這6個(gè)月的進(jìn)展情況在博客上和大家做了介紹,本文將為大家梳理。
    的頭像 發(fā)表于 09-01 09:10 ?3235次閱讀

    基于生成對(duì)抗網(wǎng)絡(luò)GAN模型的陸空通話文本生成系統(tǒng)設(shè)計(jì)

    可以及時(shí)發(fā)現(xiàn)飛行員錯(cuò)誤的復(fù)誦內(nèi)容。考慮到訓(xùn)練一個(gè)有效的差錯(cuò)校驗(yàn)網(wǎng)絡(luò)模型需要大量的文本數(shù)據(jù),本文提出一種基于生成對(duì)抗網(wǎng)絡(luò)GAN的陸空通話文本生成方法。首先對(duì)現(xiàn)有真實(shí)的陸空通話文本
    發(fā)表于 03-26 09:22 ?34次下載
    基于<b class='flag-5'>生成</b>對(duì)抗網(wǎng)絡(luò)GAN模型的陸空通話<b class='flag-5'>文本生成</b>系統(tǒng)設(shè)計(jì)

    文本生成任務(wù)中引入編輯方法的文本生成

    4. FELIX FELIX是Google Research在“FELIX: Flexible Text Editing Through Tagging and Insertion”一文中提出的文本生成
    的頭像 發(fā)表于 07-23 16:56 ?1979次閱讀
    <b class='flag-5'>文本生成</b>任務(wù)中引入編輯方法的<b class='flag-5'>文本生成</b>

    受控文本生成模型的一般架構(gòu)及故事生成任務(wù)等方面的具體應(yīng)用

    來(lái)自:哈工大訊飛聯(lián)合實(shí)驗(yàn)室 本期導(dǎo)讀:本文是對(duì)受控文本生成任務(wù)的一個(gè)簡(jiǎn)單的介紹。首先,本文介紹了受控文本生成模型的一般架構(gòu),點(diǎn)明了受控文本生成模型的特點(diǎn)。然后,本文介紹了受控文本生成
    的頭像 發(fā)表于 10-13 09:46 ?3867次閱讀
    受控<b class='flag-5'>文本生成</b>模型的一般架構(gòu)及故事<b class='flag-5'>生成</b>任務(wù)等方面的具體應(yīng)用

    使用NVIDIA TensorRT優(yōu)化T5和GPT-2

    在這篇文章中,我們向您介紹了如何將擁抱臉 PyTorch T5 和 GPT-2 模型轉(zhuǎn)換為優(yōu)化的 TensorRT 推理引擎。 TensorRT 推理機(jī)用作原始 HuggingFace T5
    的頭像 發(fā)表于 03-31 17:25 ?4167次閱讀
    使用NVIDIA TensorRT優(yōu)化T5和<b class='flag-5'>GPT-2</b>

    基于OpenAI的GPT-2的語(yǔ)言模型ProtGPT2生成新的蛋白質(zhì)序列

    人類(lèi)語(yǔ)言與蛋白質(zhì)有很多共同點(diǎn),至少在計(jì)算建模方面。這使得研究團(tuán)隊(duì)將自然語(yǔ)言處理(NLP)的新方法應(yīng)用于蛋白質(zhì)設(shè)計(jì)。其中,德國(guó)Bayreuth大學(xué)Birte H?cker的蛋白質(zhì)設(shè)計(jì)實(shí)驗(yàn)室,描述了基于OpenAI的GPT-2的語(yǔ)言模型ProtGPT2,以基于自然序列的原理
    的頭像 發(fā)表于 09-08 16:24 ?2509次閱讀

    基于VQVAE的長(zhǎng)文本生成 利用離散code來(lái)建模文本篇章結(jié)構(gòu)的方法

    寫(xiě)在前面 近年來(lái),多個(gè)大規(guī)模預(yù)訓(xùn)練語(yǔ)言模型 GPT、BART、T5 等被提出,這些預(yù)訓(xùn)練模型在自動(dòng)文摘等多個(gè)文本生成任務(wù)上顯著優(yōu)于非預(yù)訓(xùn)練語(yǔ)言模型。但對(duì)于開(kāi)放式生成任務(wù),如故事生成、新
    的頭像 發(fā)表于 12-01 17:07 ?2146次閱讀

    ELMER: 高效強(qiáng)大的非自回歸預(yù)訓(xùn)練文本生成模型

    每個(gè)單詞都依賴于輸入文本與之前生成的單詞。自回歸生成模型只建模了前向的單詞依賴關(guān)系,依次生成的結(jié)構(gòu)也使得自回歸模型難以并行化。目前大部分預(yù)訓(xùn)練生成
    的頭像 發(fā)表于 03-13 10:39 ?1809次閱讀

    ETH提出RecurrentGPT實(shí)現(xiàn)交互式超長(zhǎng)文本生成

    RecurrentGPT 則另辟蹊徑,是利用大語(yǔ)言模型進(jìn)行交互式長(zhǎng)文本生成的首個(gè)成功實(shí)踐。它利用 ChatGPT 等大語(yǔ)言模型理解自然語(yǔ)言指令的能力,通過(guò)自然語(yǔ)言模擬了循環(huán)神經(jīng)網(wǎng)絡(luò)(RNNs)的循環(huán)計(jì)算機(jī)制。
    的頭像 發(fā)表于 05-29 14:34 ?1179次閱讀
    ETH提出RecurrentGPT實(shí)現(xiàn)交互式超長(zhǎng)<b class='flag-5'>文本生成</b>

    微軟提出Control-GPT:用GPT-4實(shí)現(xiàn)可控文本到圖像生成!

    該研究提出了一個(gè)簡(jiǎn)單而有效的框架 Control-GPT,它利用 LLM 的強(qiáng)大功能根據(jù)文本 prompt 生成草圖。Control-GPT 的工作原理是首先使用
    的頭像 發(fā)表于 06-05 15:31 ?1256次閱讀
    微軟提出Control-<b class='flag-5'>GPT</b>:用<b class='flag-5'>GPT</b>-4實(shí)現(xiàn)可控<b class='flag-5'>文本</b>到圖像<b class='flag-5'>生成</b>!

    面向結(jié)構(gòu)化數(shù)據(jù)的文本生成技術(shù)研究

    今天我們要講的文本生成是現(xiàn)在最流行的研究領(lǐng)域之一。文本生成的目標(biāo)是讓計(jì)算機(jī)像人類(lèi)一樣學(xué)會(huì)表達(dá),目前看基本上接近實(shí)現(xiàn)。這些突然的技術(shù)涌現(xiàn),使得計(jì)算機(jī)能夠撰寫(xiě)出高質(zhì)量的自然文本,滿足特定的需求。
    的頭像 發(fā)表于 06-26 14:39 ?967次閱讀
    面向結(jié)構(gòu)化數(shù)據(jù)的<b class='flag-5'>文本生成</b>技術(shù)研究

    如何使用 Llama 3 進(jìn)行文本生成

    使用LLaMA 3(Large Language Model Family of AI Alignment)進(jìn)行文本生成,可以通過(guò)以下幾種方式實(shí)現(xiàn),取決于你是否愿意在本地運(yùn)行模型或者使用現(xiàn)成的API
    的頭像 發(fā)表于 10-27 14:21 ?1086次閱讀