昇思25天學習打卡營第16天|文本解碼原理——以MindNLP為例

在大模型中,文本解碼通常是指在自然語言處理(NLP)任務中使用的大型神經網絡模型(如Transformer架構的模型)將編碼后的文本數據轉換回可讀的原始文本的過程。這些模型在處理自然語言時,首先將輸入文本(如一段話或一個句子)編碼成高維空間中的向量表示,這些向量能夠捕捉到文本的語義和上下文信息。

在編碼過程中,模型通過多層神經網絡將文本的每個字符、單詞或標記(token)轉換成對應的向量。這些向量隨后在模型的解碼階段被處理,以生成或選擇最合適的序列來表示原始文本的含義。例如,在機器翻譯任務中,解碼階段會生成目標語言的文本;在文本摘要任務中,解碼階段會生成原文的摘要;在問答系統中,解碼階段會生成問題的答案。

?一、自回歸語言模型:

1、根據前文預測下一個單詞:

2、一個文本序列的概率分布可以分解為每個詞基于其上文的條件概率的乘積?:

  • w_0:初始上下文單詞序列
  • T:時間步
  • 當生存ESO標簽時停止生成?

3、MindNLP/huggingface Transformers提供的文本生成方法:

?二、環境準備:

首先還是需要下載MindSpore,相關教程可以參考我昇思25天學習打卡營第1天|快速入門這篇博客,之后就需要使用pip命令在終端卸載mindvision和mindinsight包之后,下載mindnlp:

pip uninstall mindvision -y
pip uninstall mindinsight -ypip install mindnlp

相關依賴下載完成之后,就可以開始我們下面的實驗了!

三、Greedy Search:

在每個時間步𝑡都簡單地選擇概率最高的詞作為當前輸出詞:

wt = argmax_w P(w|w(1:t-1))

按照貪心搜索輸出序列("The","nice","woman")?的條件概率為:0.5 x 0.4 = 0.2

缺點: 錯過了隱藏在低概率詞后面的高概率詞,如:dog=0.5, has=0.9 ![image.png](attachment:image.png =600x600)

from mindnlp.transformers import GPT2Tokenizer, GPT2LMHeadModeltokenizer = GPT2Tokenizer.from_pretrained("iiBcai/gpt2", mirror='modelscope')# add the EOS token as PAD token to avoid warnings
model = GPT2LMHeadModel.from_pretrained("iiBcai/gpt2", pad_token_id=tokenizer.eos_token_id, mirror='modelscope')# encode context the generation is conditioned on
input_ids = tokenizer.encode('I enjoy walking with my cute dog', return_tensors='ms')# generate text until the output length (which includes the context length) reaches 50
greedy_output = model.generate(input_ids, max_length=50)print("Output:\n" + 100 * '-')
print(tokenizer.decode(greedy_output[0], skip_special_tokens=True))

四、Beam Search:

Beam search通過在每個時間步保留最可能的?num_beams?個詞,并從中最終選擇出概率最高的序列來降低丟失潛在的高概率序列的風險。如圖以?num_beams=2?為例:

("The","dog","has") : 0.4 * 0.9 = 0.36

("The","nice","woman") : 0.5 * 0.4 = 0.20

優點:一定程度保留最優路徑

缺點:1. 無法解決重復問題;2. 開放域生成效果差

from mindnlp.transformers import GPT2Tokenizer, GPT2LMHeadModeltokenizer = GPT2Tokenizer.from_pretrained("iiBcai/gpt2", mirror='modelscope')# add the EOS token as PAD token to avoid warnings
model = GPT2LMHeadModel.from_pretrained("iiBcai/gpt2", pad_token_id=tokenizer.eos_token_id, mirror='modelscope')# encode context the generation is conditioned on
input_ids = tokenizer.encode('I enjoy walking with my cute dog', return_tensors='ms')# activate beam search and early_stopping
beam_output = model.generate(input_ids, max_length=50, num_beams=5, early_stopping=True
)print("Output:\n" + 100 * '-')
print(tokenizer.decode(beam_output[0], skip_special_tokens=True))
print(100 * '-')# set no_repeat_ngram_size to 2
beam_output = model.generate(input_ids, max_length=50, num_beams=5, no_repeat_ngram_size=2, early_stopping=True
)print("Beam search with ngram, Output:\n" + 100 * '-')
print(tokenizer.decode(beam_output[0], skip_special_tokens=True))
print(100 * '-')# set return_num_sequences > 1
beam_outputs = model.generate(input_ids, max_length=50, num_beams=5, no_repeat_ngram_size=2, num_return_sequences=5, early_stopping=True
)# now we have 3 output sequences
print("return_num_sequences, Output:\n" + 100 * '-')
for i, beam_output in enumerate(beam_outputs):print("{}: {}".format(i, tokenizer.decode(beam_output, skip_special_tokens=True)))
print(100 * '-')

?

缺點的具體表現:

重復性高,這個看我生成的例子就可以很清楚的看到,著幾句話幾乎一模一樣,還有就是開放域的問題,可以看下圖:

?

五、超參數:

由于普通的默認索引均存在著難以克服的問題,人們通常會使用各種超參數來減小索引缺陷的影響。

1、n_gram懲罰:

將出現過的候選詞的概率設置為 0

設置no_repeat_ngram_size=2?,任意?2-gram?不會出現兩次

Notice: 實際文本生成需要重復出現

?2、Sample:

根據當前條件概率分布隨機選擇輸出詞w_t

優點:文本生成多樣性高

缺點:生成文本不連續

import mindspore
from mindnlp.transformers import GPT2Tokenizer, GPT2LMHeadModeltokenizer = GPT2Tokenizer.from_pretrained("iiBcai/gpt2", mirror='modelscope')# add the EOS token as PAD token to avoid warnings
model = GPT2LMHeadModel.from_pretrained("iiBcai/gpt2", pad_token_id=tokenizer.eos_token_id, mirror='modelscope')# encode context the generation is conditioned on
input_ids = tokenizer.encode('I enjoy walking with my cute dog', return_tensors='ms')mindspore.set_seed(0)
# activate sampling and deactivate top_k by setting top_k sampling to 0
sample_output = model.generate(input_ids, do_sample=True, max_length=50, top_k=0
)print("Output:\n" + 100 * '-')
print(tokenizer.decode(sample_output[0], skip_special_tokens=True))

?

3、Temperature:

降低softmax?的temperature使 P(w∣w1:t?1?)分布更陡峭,以增加高概率單詞的似然并降低低概率單詞的似然。

?

import mindspore
from mindnlp.transformers import GPT2Tokenizer, GPT2LMHeadModeltokenizer = GPT2Tokenizer.from_pretrained("iiBcai/gpt2", mirror='modelscope')# add the EOS token as PAD token to avoid warnings
model = GPT2LMHeadModel.from_pretrained("iiBcai/gpt2", pad_token_id=tokenizer.eos_token_id, mirror='modelscope')# encode context the generation is conditioned on
input_ids = tokenizer.encode('I enjoy walking with my cute dog', return_tensors='ms')mindspore.set_seed(1234)
# activate sampling and deactivate top_k by setting top_k sampling to 0
sample_output = model.generate(input_ids, do_sample=True, max_length=50, top_k=0,temperature=0.7
)print("Output:\n" + 100 * '-')
print(tokenizer.decode(sample_output[0], skip_special_tokens=True))

?

4、Topk Sample:

選出概率最大的?K?個詞,重新歸一化,最后在歸一化后的?K?個詞中采樣,確定就是:將采樣池限制為固定大小?K 導致在分布比較尖銳的時候產生胡言亂語和在分布比較平坦的時候限制模型的創造力。

?

import mindspore
from mindnlp.transformers import GPT2Tokenizer, GPT2LMHeadModeltokenizer = GPT2Tokenizer.from_pretrained("iiBcai/gpt2", mirror='modelscope')# add the EOS token as PAD token to avoid warnings
model = GPT2LMHeadModel.from_pretrained("iiBcai/gpt2", pad_token_id=tokenizer.eos_token_id, mirror='modelscope')# encode context the generation is conditioned on
input_ids = tokenizer.encode('I enjoy walking with my cute dog', return_tensors='ms')mindspore.set_seed(0)
# activate sampling and deactivate top_k by setting top_k sampling to 0
sample_output = model.generate(input_ids, do_sample=True, max_length=50, top_k=50
)print("Output:\n" + 100 * '-')
print(tokenizer.decode(sample_output[0], skip_special_tokens=True))

5、Top_P Sample:

在累積概率超過概率?p?的最小單詞集中進行采樣,重新歸一化,缺點就是:采樣池可以根據下一個詞的概率分布動態增加和減少。

import mindspore
from mindnlp.transformers import GPT2Tokenizer, GPT2LMHeadModeltokenizer = GPT2Tokenizer.from_pretrained("iiBcai/gpt2", mirror='modelscope')# add the EOS token as PAD token to avoid warnings
model = GPT2LMHeadModel.from_pretrained("iiBcai/gpt2", pad_token_id=tokenizer.eos_token_id, mirror='modelscope')# encode context the generation is conditioned on
input_ids = tokenizer.encode('I enjoy walking with my cute dog', return_tensors='ms')mindspore.set_seed(0)# deactivate top_k sampling and sample only from 92% most likely words
sample_output = model.generate(input_ids, do_sample=True, max_length=50, top_p=0.92, top_k=0
)print("Output:\n" + 100 * '-')
print(tokenizer.decode(sample_output[0], skip_special_tokens=True))

?6、Top_k_Top_p:

import mindspore
from mindnlp.transformers import GPT2Tokenizer, GPT2LMHeadModeltokenizer = GPT2Tokenizer.from_pretrained("iiBcai/gpt2", mirror='modelscope')# add the EOS token as PAD token to avoid warnings
model = GPT2LMHeadModel.from_pretrained("iiBcai/gpt2", pad_token_id=tokenizer.eos_token_id, mirror='modelscope')# encode context the generation is conditioned on
input_ids = tokenizer.encode('I enjoy walking with my cute dog', return_tensors='ms')mindspore.set_seed(0)
# set top_k = 50 and set top_p = 0.95 and num_return_sequences = 3
sample_outputs = model.generate(input_ids,do_sample=True,max_length=50,top_k=5,top_p=0.95,num_return_sequences=3
)print("Output:\n" + 100 * '-')
for i, sample_output in enumerate(sample_outputs):print("{}: {}".format(i, tokenizer.decode(sample_output, skip_special_tokens=True)))

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40768.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40768.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40768.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Unix/Linux】Unix/Linux如何查看系統版本

Unix和Linux查看系統版本的指令有些區別,下面分別介紹: 一.Unix查看系統版本 在Unix系統中,查看系統版本的方法可能會根據具體的Unix操作系統而有所不同。以下是一些通用的方法,適用于多種Unix系統,包括但不限于Solaris、AIX、H…

vienna整流器過零畸變原因分析

Vienna整流器是一種常見的三電平功率因數校正(PFC)整流器,廣泛應用于電源和電能質量控制領域。由于其高效率、高功率密度和低諧波失真的特點,Vienna整流器在工業和電力電子應用中具有重要地位。然而,在實際應用中&…

ssh:(xshell)遠程連接失敗

項目場景: 提示:這里簡述項目相關背景: 云服務器遠程連接失敗 xshell 遠程連接失敗 xshell (ssh客戶端) ---------------------------------------------安全組----------防火墻-------黑白名單-----SSH服務 問題排查 1. 安全…

Playwright之錄制腳本轉Page Object類

Playwright之錄制腳本轉Page Object類 設計思路 : 我們今天UI自動化設計的時候,通常會遵循一些設計模式,例如Page Object模式。但是自己找元素再去填寫有一些麻煩,所以我們可以通過拆解錄制的腳本,將其中的元素提取出來…

DALL-E、Stable Diffusion 等 20+ 圖像生成模型綜述

二、任務場景 2.1. 無條件生成 無條件生成是指生成模型在生成圖像時不受任何額外條件或約束的影響。模型從學習的數據分布中生成圖像,而不需要關注輸入條件。 2.2. 有條件生成 有條件生成是指生成模型在生成圖像時受到額外條件或上下文的影響。這些條件可以是類別…

Vscode 保存代碼,代碼自動格式化

我這里使用的插件是Prettier-Code formatter:自動縮進整理代碼的格式,使用方法如下: 先在vscode商店找到插件并安裝:安裝插件之后,隨便找到一個項目文件,右鍵選擇格式化文檔:選中我們安裝的插件…

掌握Vim的會話之道:深度解析會話管理功能

掌握Vim的會話之道:深度解析會話管理功能 在高效的文本編輯工作流中,能夠保存和恢復編輯會話是極其重要的。Vim,作為一個功能強大的文本編輯器,提供了會話管理功能,允許用戶保存當前的工作狀態,并在之后重…

spring6框架解析(by尚硅谷)

文章目錄 spring61. 一些基本的概念、優勢2. 入門案例實現maven聚合工程創建步驟分析實現過程 3. IoC(Inversion of Control)基于xml的bean環境搭建獲取bean獲取接口創建實現類依賴注入 setter注入 和 構造器注入原生方式的setter注入原生方式的構造器注…

Java 多線程stream流按行讀取文件

stream并行流快&#xff08;文件11g&#xff09; try (Stream<String> lines Files.lines(filePath)) {lines.parallel().forEach(str -> operatePartData(str, allDataList)); } catch (IOException e) {throw new RuntimeException(e); }線程池慢&#xff08;文件…

PyPDF2合并PDF文件的高級應用:指定合并方式

本文目錄 前言一、合并PDF的高級應用1、邏輯講解2、合并效果圖3、完整代碼二、異常校驗1、合并過程中的錯誤校驗前言 本文我們主要來講解一下PyPDF2合并PDF文件的高級應用,就是指定合并方式進行合并,構建函數支持模式選擇,主要不管咋折騰,其實就是不想去付費買那個PDF編輯…

PDF怎么分割成一頁一頁的?原來可以這么輕松

PDF怎么分割成一頁一頁的&#xff1f;PDF文檔因其跨平臺兼容性和可打印性而被廣泛使用&#xff0c;但有時為了便于發送電子郵件、管理文檔或保護敏感信息&#xff0c;我們需要將一個大型的PDF文件分割成多個小文件。幸運的是&#xff0c;分割PDF文件并不復雜。下文中就介紹了三…

webp2jpg網頁在線圖片格式轉換源碼

源碼介紹 webp2jpg-免費在線圖片格式轉化器, 可將jpeg、jpg、png、gif、 webp、svg、ico、bmp文件轉化為jpeg、png、webp、webp動畫、gif文件。 無需上傳文件&#xff0c;本地即可完成轉換! 源碼特點&#xff1a; 無需上傳&#xff0c;使用瀏覽器自身進行轉換批量轉換輸出we…

easyexcel使用小結-未完待續

官網&#xff1a;https://easyexcel.opensource.alibaba.com/docs/current/ <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.1</version></dependency>一、讀 1.1簡單讀 Getter…

系統安全體系架構規劃框架

安全技術體系架構是對組織機構信息技術系統的安全體系結構的整體描述。安全技術體系架構框架是擁有信息技術系統的組織機構根據其策略的要求和風險評估的結果&#xff0c;參考相關技術體系構架的標準和最佳實踐&#xff0c;結合組織機構信息技術系統的具體現狀和需求&#xff0…

鴻蒙小案例-自定義鍵盤

一個自定義鍵盤 效果 完成簡單的26鍵中英文輸入 使用&#xff1a; Entry Component struct IndexInput {State text: string inputController: TextInputController new TextInputController()//自定義鍵盤關閉事件hideClick(){this.inputController.stopEditing()}//自定義…

軟件測評機構:關于軟件驗收測試作用與實施步驟全解析

軟件驗收測試是指在軟件項目交付給用戶之前進行的一系列測試活動&#xff0c;其主要目的是驗證軟件是否符合用戶需求和設計規范&#xff0c;以確保軟件的質量和穩定性。 軟件驗收測試在軟件開發生命周期的最后階段進行&#xff0c;起到了至關重要的作用。它能夠幫助客戶確認軟…

c++:動態內存變量

典型的C面向對象編程 元素 (1)頭文件hpp中類的定義 (2)源文件cpp中類的實現&#xff08;構造函數、析構函數、方法&#xff09; (3)主程序 案例 (1)用C來編程“人一天的生活” (2)“人”的屬性&#xff1a;name、age、male (3)“人”的方法&#xff1a;eat、work(coding/shop…

【網絡安全學習】漏洞利用:BurpSuite的使用-03-枚舉攻擊案例

如何使用BurpSuite進行枚舉攻擊 1.靶場選擇 BurpSuite官方也是有滲透的教學與靶場的&#xff0c;這次就使用BurpSuite的靶場進行練習。 靶場地址&#xff1a;https://portswigger.net/web-security 登錄后如下圖所示&#xff0c;選擇**【VIEW ALL PATHS】**&#xff1a; 找…

PHP基礎教程——總結W3school

1、<?php ?> 2、$ 聲明變量 3、變量大小寫敏感 關鍵字&#xff08;if、else、echo&#xff09;和用戶定義的類、函數大小寫不敏感 4、三種注釋 // # /* */ 5、echo "<br>"; 換行 6、global(關鍵字) 函數內訪問全局變量 $GLOBALS[index] …

經典鏈表算法題:找到環的入口。清晰圖示推導出來

Leetcode題目鏈接 原理 重畫鏈表如下所示&#xff0c;線上有若干個節點。記藍色慢指針為 slow&#xff0c;紅色快指針為 fast。初始時 slow 和 fast 均在頭節點處。 使 slow 和 fast 同時前進&#xff0c;fast 的速度是 slow 的兩倍。當 slow 抵達環的入口處時&#xff0c;如…