PyTorch深度學(xué)習(xí)項(xiàng)目教程課件:文本翻譯_第1頁
PyTorch深度學(xué)習(xí)項(xiàng)目教程課件:文本翻譯_第2頁
PyTorch深度學(xué)習(xí)項(xiàng)目教程課件:文本翻譯_第3頁
PyTorch深度學(xué)習(xí)項(xiàng)目教程課件:文本翻譯_第4頁
PyTorch深度學(xué)習(xí)項(xiàng)目教程課件:文本翻譯_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

PyTorch深度學(xué)習(xí)項(xiàng)目教程

文本翻譯TEXTTRANSLATION要點(diǎn):Transformer、自注意力機(jī)制、自然語言處理、中文分詞、詞向量化、位置編碼

項(xiàng)目背景ProjectBackground問題:文本翻譯是自然語言處理的任務(wù)之一。相對(duì)于視覺而言,語言表達(dá)多變。受詞匯量、語法結(jié)構(gòu)、表達(dá)語境、專業(yè)術(shù)語等影響,傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)對(duì)于文本翻譯表現(xiàn)較差。解決:Transformer是一種用于自然語言處理任務(wù)的深度學(xué)習(xí)模型,其性能基于自注意力機(jī)制。自注意力機(jī)制允許模型動(dòng)態(tài)地為輸入序列的每個(gè)位置分配不同的權(quán)重,以便更好地捕捉其內(nèi)部的關(guān)系和依賴。Transformer是當(dāng)前大模型的技術(shù)基礎(chǔ)。知識(shí)目標(biāo)KnowledgeObjectives理解自然語言處理(NLP)的基本概念及其在人工智能中的應(yīng)用熟悉圖靈測(cè)試的基本原理,了解其對(duì)人工智能發(fā)展的意義學(xué)習(xí)并掌握中文分詞、向量化、位置編碼等技術(shù),理解它們?cè)贜LP中的重要性深入了解Transformer編碼器和解碼器的結(jié)構(gòu),以及它們?cè)谔幚硇蛄袛?shù)據(jù)中的作用掌握Transformer的多頭注意力機(jī)制,理解其如何提高模型的表征能力學(xué)習(xí)Transformer中的掩碼機(jī)制,并了解其在解碼過程中的應(yīng)用能力目標(biāo)AbilityGoals能夠獨(dú)立構(gòu)建NLP相關(guān)的數(shù)據(jù)集,并對(duì)其進(jìn)行預(yù)處理具備比較和選擇不同分詞方法的能力,并能構(gòu)建相應(yīng)的數(shù)據(jù)詞典熟練使用PyTorch框架,調(diào)用Transformer相關(guān)API,構(gòu)建和訓(xùn)練模型能夠根據(jù)項(xiàng)目需求合理設(shè)置網(wǎng)絡(luò)參數(shù),進(jìn)行模型的調(diào)優(yōu)素養(yǎng)目標(biāo)ProfessionalAttainments培養(yǎng)對(duì)項(xiàng)目需求的理解能力,能夠快速把握項(xiàng)目的核心提升根據(jù)項(xiàng)目需求快速收集相關(guān)素材的能力,包括數(shù)據(jù)集、工具和文獻(xiàn)資源加強(qiáng)快速查閱資料的能力,培養(yǎng)在面對(duì)問題時(shí)能夠快速定位和解決問題的素養(yǎng)目錄任務(wù)1認(rèn)知自然語言處理技術(shù)任務(wù)2構(gòu)建中英文翻譯數(shù)據(jù)集任務(wù)3搭建Transformer神經(jīng)網(wǎng)絡(luò)任務(wù)4訓(xùn)練Transformer網(wǎng)絡(luò)任務(wù)5完成文本翻譯推理任務(wù)6理解Transformer網(wǎng)絡(luò)模型01任務(wù)1認(rèn)知自然語言處理及相關(guān)技術(shù)1.1自然語言處理的概念自然語言處理(NaturalLanguageProcessing,NLP)是一門融合了計(jì)算機(jī)科學(xué)、人工智能及語言學(xué)的交叉學(xué)科,它研究能實(shí)現(xiàn)人與計(jì)算機(jī)之間用自然語言進(jìn)行有效通信的各種理論和方法1.1自然語言處理的概念自然語言NaturalLanguage自然語言是指漢語、英語、法語等人們?nèi)粘J褂玫恼Z言,是人類社會(huì)發(fā)展演變而來的語言,而不是人造的語言,它是人類學(xué)習(xí)生活的重要工具。概括說來,自然語言是指人類社會(huì)約定俗成的,區(qū)別于如程序設(shè)計(jì)的語言的人工語言。在整個(gè)人類歷史上以語言文字形式記載和流傳的知識(shí)占到知識(shí)總量的80%以上。編程語言也是語言的一種,相對(duì)而言,自然語言更難處理。特點(diǎn)比較不同點(diǎn)詞匯量自然語言中的詞匯比編程語言中的關(guān)鍵詞豐富,隨時(shí)創(chuàng)造各種類型的新詞結(jié)構(gòu)化自然語言非結(jié)構(gòu)化,而編程語言是結(jié)構(gòu)化的歧義性自然語言含有大量歧義,而編程語言是確定的容錯(cuò)性自然語言的錯(cuò)誤隨處可見,而編程語言錯(cuò)誤會(huì)導(dǎo)致編譯不通過易變性自然語言變化相對(duì)迅速嘈雜一些,而編程語言的變化要緩慢得多簡(jiǎn)略性自然語言往往簡(jiǎn)潔、干練,而編程語言就要明確定義自然語言與編程語言的比較1.1自然語言處理的概念處理包含理解、轉(zhuǎn)化、生成等過程。自然語言處理,是指用計(jì)算機(jī)對(duì)自然語言的形、音、義等信息進(jìn)行處理,即利用計(jì)算機(jī)實(shí)現(xiàn)對(duì)字、詞、句、段、章、篇等的輸出、識(shí)別、分析、理解和生成。自然語言處理的具體表現(xiàn)形式包括機(jī)器翻譯、文本摘要、文本分類、文本校對(duì)、信息抽取、語音合成、語音識(shí)別等。自然語言處理就是要計(jì)算機(jī)理解自然語言,自然語言處理機(jī)制涉及兩個(gè)流程,包括:自然語言理解(NaturalLanguageUnderstanding,NLU):計(jì)算機(jī)能夠理解自然語言文本的意義自然語言生成(NaturalLanguageGeneration,NLG):以自然語言文本來表達(dá)給定的意圖。1.1自然語言處理的概念自然語言的理解和分析是一個(gè)層次化的過程:語音分析詞法分析句法分析語義分析語用分析語音分析:要根據(jù)音位規(guī)則,從語音流中區(qū)分出一個(gè)個(gè)獨(dú)立的音素,再根據(jù)音位形態(tài)規(guī)則找出音節(jié)及其對(duì)應(yīng)的詞素或詞。詞法分析:找出詞匯的各個(gè)詞素,從中獲得語言學(xué)的信息。句法分析:對(duì)句子和短語的結(jié)構(gòu)進(jìn)行分析,目的是要找出詞、短語等的相互關(guān)系以及各自在句中的作用。語義分析:找出詞義、結(jié)構(gòu)意義及其結(jié)合意義,從而確定語言所表達(dá)的真正含義或概念。語用分析:研究語言所存在的外界環(huán)境對(duì)語言使用者所產(chǎn)生的影響。1.2圖靈測(cè)試在人工智能領(lǐng)域或者是語音信息處理領(lǐng)域中,學(xué)者們普遍認(rèn)為采用圖靈測(cè)試可以判斷計(jì)算機(jī)是否理解了某種自然語言,具體的判別標(biāo)準(zhǔn)有以下幾條:?jiǎn)柎穑簷C(jī)器人能正確回答輸入文本中的有關(guān)問題。文摘生成:機(jī)器有能力生成輸入文本的摘要。釋義:機(jī)器能用不同的詞語和句型來復(fù)述其輸入的文本。翻譯:機(jī)器具有把一種語言翻譯成另一種語言的能力。1.3自然語言處理技術(shù)的發(fā)展02任務(wù)2構(gòu)建中英文翻譯數(shù)據(jù)集2.1數(shù)據(jù)集格式中英文翻譯需要建立兩者之前的對(duì)應(yīng)關(guān)系,常見的幾種格式有:①json格式,類似如下:{"english":<english>,"chinese":<chinese>}例如:{"english":"It'sabeautifulday","chinese":"今天是個(gè)好日子"}②csv格式,中間以逗號(hào)分隔:<english>,<chinese>例如:"It'sabeautifulday","今天是個(gè)好日子""artificialintelligence","人工智能"③或者以空格/制表符分割:<english> <chinese>例如:"It'sabeautifulday" "今天是個(gè)好日子"2.2數(shù)據(jù)集獲取

數(shù)據(jù)結(jié)構(gòu)為“英文+TAB+中文+TAB+其他說明”Becalm. 冷靜點(diǎn)。 CC-BY2.0(France)Attribution:…Befair. 公平點(diǎn)。 CC-BY2.0(France)Attribution:…Bekind. 友善點(diǎn)。 CC-BY2.0(France)Attribution:…2.3數(shù)據(jù)集處理classTranslationDataset(Dataset):

def__init__(self,filepath,use_cache=True):

#句子數(shù)量

self.row_count=self.get_row_count(filepath)

#分詞器

self.tokenizer=get_tokenizer('basic_english')

#是否需要緩存

self.use_cache=use_cache

#加載英文詞典

self.en_vocab=self.get_en_vocab(filepath)

#加載中文詞典

self.zh_vocab=self.get_zh_vocab(filepath)

#加載英文tokens

self.en_tokens=self.load_tokens(filepath,self.en_tokenizer,self.en_vocab,"構(gòu)建英文tokens",'en')

#加載中文tokens

self.zh_tokens=self.load_tokens(filepath,self.zh_tokenizer,self.zh_vocab,"構(gòu)建中文tokens",'zh')

def__getitem__(self,index):

returnself.en_tokens[index],self.zh_tokens[index]

def__len__(self):

returnself.row_count…

我們需要做的工作是將中文、英文均數(shù)字化。即:Becalm.→['be','calm','.']→查字典→[41,1442,4]冷靜點(diǎn)?!鶾'冷靜','點(diǎn)','。']→查字典→[2584,182,4]以上過程可以概括為:①根據(jù)文章構(gòu)建詞典,例如根據(jù)cmn.txt構(gòu)建所有詞的中文詞典和英文詞典。②將句子轉(zhuǎn)換為詞組片段,該過程簡(jiǎn)稱為分詞,分詞的格式有多種方法:基于空格的分詞方法,基于字母的分詞方法,基于子詞(subword)的分詞方法等。子詞的分詞方法示例如下:“unfortunately”=“un”+“for”+“tun”+“ate”+“l(fā)y”③基于詞典查找分詞后的單詞在詞典中的索引序號(hào)。④完成分詞到索引序號(hào)的轉(zhuǎn)換。建立了英文和中文每個(gè)翻譯語句對(duì)應(yīng)的索引序列,就可以利用深度學(xué)習(xí)方法來完成神經(jīng)模型設(shè)計(jì)及訓(xùn)練。03任務(wù)3搭建Transformer神經(jīng)網(wǎng)絡(luò)3.1Transformer網(wǎng)絡(luò)結(jié)構(gòu)Transformer網(wǎng)絡(luò)結(jié)構(gòu)模塊化解釋Transformer網(wǎng)絡(luò)結(jié)構(gòu)包括輸入序列向量化、位置編碼、編碼器、解碼器和輸出序列化等幾個(gè)組成部分3.2.1輸入序列向量化使用數(shù)學(xué)模型處理文本語料的第一步就是把文本轉(zhuǎn)換成數(shù)學(xué)表示①One-Hot矩陣

問題1:矩陣的每一維長(zhǎng)度都是字典的長(zhǎng)度,比如字典包含10000個(gè)單詞,那么每個(gè)單詞對(duì)應(yīng)的One-Hot向量就是1×10000的向量,而這個(gè)向量只有一個(gè)位置為1,其余都是0,浪費(fèi)空間,不利于計(jì)算。問題2,One-Hot矩陣相當(dāng)于簡(jiǎn)單地給每個(gè)單詞編了個(gè)號(hào),但是單詞和單詞之間的關(guān)系則完全體現(xiàn)不出來。②輸入序列向量化(WordEmbedding)WordEmbedding矩陣給每個(gè)單詞分配一個(gè)固定長(zhǎng)度的向量表示,這個(gè)長(zhǎng)度可以自行設(shè)定,比如300,實(shí)際上會(huì)遠(yuǎn)遠(yuǎn)小于字典長(zhǎng)度(比如10000)。兩個(gè)單詞向量之間的夾角值可以作為他們之間關(guān)系的一個(gè)衡量:

單詞之間的關(guān)系也可以進(jìn)行計(jì)算,例如:

隱含了馬德里和巴黎均為首都的意義。3.2.1輸入序列向量化因?yàn)閃ordEmbedding節(jié)省空間和便于計(jì)算的特點(diǎn),使得它廣泛應(yīng)用于NLP領(lǐng)域。PyTorch提供了WordEmbedding算法,代碼如下:self.src_embedding=nn.Embedding(len(src_vocab),d_model,padding_idx=2)第一個(gè)參數(shù)為字典長(zhǎng)度第二個(gè)參數(shù)為序列轉(zhuǎn)為向量矩陣的維度第三個(gè)參數(shù)指出填充索引,例如我們自定義的“<pad>”,索引值為2:{0:'<s>',1:'</s>',2:'<pad>',3:'<unk>',…}第四個(gè)參數(shù)padding_idx標(biāo)識(shí)了該位置的參數(shù)不參與神經(jīng)網(wǎng)絡(luò)梯度傳播,即網(wǎng)絡(luò)在訓(xùn)練時(shí)忽略該位置的參數(shù)更新3.2.2位置編碼位置編碼是一種將位置信息添加到序列數(shù)據(jù)的技術(shù),特別用于Transformer等模型中。位置編碼的目標(biāo)是為了在序列數(shù)據(jù)的嵌入向量中引入位置信息。classPositionalEncoding(nn.Module):

"ImplementthePEfunction."

def__init__(self,d_model,dropout,device,max_len=5000):

super(PositionalEncoding,self).__init__()

self.dropout=nn.Dropout(p=dropout)

#初始化Shape為(max_len,d_model)的PE(positionalencoding)

pe=torch.zeros(max_len,d_model).to(device)

#初始化一個(gè)tensor[[0,1,2,3,...]]

position=torch.arange(0,max_len).unsqueeze(1)

#這里就是sin和cos括號(hào)中的內(nèi)容,通過e和ln進(jìn)行了變換

div_term=torch.exp(

torch.arange(0,d_model,2)*-(math.log(10000.0)/d_model)

)

#計(jì)算PE(pos,2i)

pe[:,0::2]=torch.sin(position*div_term)

#計(jì)算PE(pos,2i+1)

pe[:,1::2]=torch.cos(position*div_term)

#為了方便計(jì)算,在最外面在unsqueeze出一個(gè)batch

pe=pe.unsqueeze(0)

#如果一個(gè)參數(shù)不參與梯度下降,但又希望保存model的時(shí)候?qū)⑵浔4嫦聛?/p>

#這個(gè)時(shí)候就可以用register_buffer

self.register_buffer("pe",pe)

defforward(self,x):

"""

x為embedding后的inputs,例如(1,7,128),batchsize為1,7個(gè)單詞,單詞維度為128

"""

#將x和positionalencoding相加。

x=x+self.pe[:,:x.size(1)].requires_grad_(False)

returnself.dropout(x)在Transformer中,位置編碼采用了一種特殊的編碼方式,通常使用正弦和余弦函數(shù)來生成位置編碼矩陣,使得每個(gè)單詞在句子中的位置編號(hào)位于[-1,1]之間。位置編碼矩陣的維度與詞嵌入或字符嵌入的維度相同,但其中的每個(gè)元素都對(duì)應(yīng)于不同位置和不同維度的位置信息。位置編碼矩陣與輸入的詞嵌入或字符嵌入相加,以在模型的輸入中保留位置信息。這樣,在經(jīng)過一系列的自注意力機(jī)制和前饋神經(jīng)網(wǎng)絡(luò)層后,模型能夠更好地理解序列數(shù)據(jù)的上下文和順序信息。3.2.3編碼器、解碼器和輸出序列化classTranslationModel(nn.Module):

def__init__(self,d_model,src_vocab,tgt_vocab,max_seq_length,device,dropout=0.1):

super(TranslationModel,self).__init__()

self.device=device

#定義原句子的embedding

self.src_embedding=nn.Embedding(len(src_vocab),d_model,padding_idx=2)

#定義目標(biāo)句子的embedding

self.tgt_embedding=nn.Embedding(len(tgt_vocab),d_model,padding_idx=2)

#定義posintionalencoding

self.positional_encoding=PositionalEncoding(d_model,dropout,device,max_len=max_seq_length)

#定義Transformer

self.transformer=nn.Transformer(d_model,dropout=dropout,batch_first=True)

#定義最后的預(yù)測(cè)層,這里并沒有定義Softmax,而是把他放在了模型外。

self.predictor=nn.Linear(d_model,len(tgt_vocab))

defforward(self,src,tgt):

"""

進(jìn)行前向傳遞,輸出為Decoder的輸出。注意,這里并沒有使用self.predictor進(jìn)行預(yù)測(cè),

因?yàn)橛?xùn)練和推理行為不太一樣,所以放在了模型外面。

:paramsrc:原batch后的句子,例如[[0,12,34,..,1,2,2,...],...]

:paramtgt:目標(biāo)batch后的句子,例如[[0,74,56,..,1,2,2,...],...]

:return:Transformer的輸出,或者說是TransformerDecoder的輸出。

"""

"""

生成tgt_mask,即階梯型的mask,例如:

[[0.,-inf,-inf,-inf,-inf],

[0.,0.,-inf,-inf,-inf],

[0.,0.,0.,-inf,-inf],

[0.,0.,0.,0.,-inf],

[0.,0.,0.,0.,0.]]

tgt.size()[-1]為目標(biāo)句子的長(zhǎng)度。

"""

3.2.3編碼器、解碼器和輸出序列化

tgt_mask=nn.Transformer.generate_square_subsequent_mask(tgt.size()[-1]).to(self.device)

#掩蓋住原句子中<pad>的部分,例如[[False,False,False,...,True,True,...],...]

src_key_padding_mask=TranslationModel.get_key_padding_mask(src)

#掩蓋住目標(biāo)句子中<pad>的部分

tgt_key_padding_mask=TranslationModel.get_key_padding_mask(tgt)

#對(duì)src和tgt進(jìn)行編碼

src=self.src_embedding(src)

tgt=self.tgt_embedding(tgt)

#給src和tgt的token增加位置信息

src=self.positional_encoding(src)

tgt=self.positional_encoding(tgt)

#將準(zhǔn)備好的數(shù)據(jù)送給transformer

out=self.transformer(src,tgt,

tgt_mask=tgt_mask,

src_key_padding_mask=src_key_padding_mask,

tgt_key_padding_mask=tgt_key_padding_mask)

3.2.3編碼器、解碼器和輸出序列化"""

這里直接返回transformer的結(jié)果。因?yàn)橛?xùn)練和推理時(shí)的行為不一樣,

所以在該模型外再進(jìn)行線性層的預(yù)測(cè)。

"""

returnout

@staticmethod

defget_key_padding_mask(tokens,pad_idx=2):

"""

用于key_padding_mask

"""

returntokens==pad_idx

#測(cè)試網(wǎng)絡(luò)模型device=torch.device('cuda:0'iftorch.cuda.is_available()else'cpu')

fromdataset.cmn_engimportTranslationDataset

dataset=TranslationDataset("../data/cmn-eng/cmn.txt")

model=TranslationModel(512,dataset.en_vocab,dataset.zh_vocab,50,device).to(device)

en="helloworld"

input=torch.tensor([0]+dataset.en_vocab(dataset.en_tokenizer(en))+[1]).unsqueeze(0).to(device)

zh="你"

output=torch.tensor([0]+dataset.zh_vocab(dataset.zh_tokenizer(zh))).unsqueeze(0).to(device)

result=model(input,output)

print(result)

predict=model.predictor(result[:,-1])

print(predict)

#找出最大值的index

y=torch.argmax(predict,dim=1).cpu().item()

print(dataset.zh_vocab.lookup_tokens([y]))對(duì)應(yīng)的輸出04任務(wù)4訓(xùn)練Transformer網(wǎng)絡(luò)4網(wǎng)絡(luò)訓(xùn)練及評(píng)估中英文語料數(shù)據(jù)Transformer模型KLDiv損失函數(shù)Adam優(yōu)化器損失函數(shù)Loss給到模型Autograd反向傳播計(jì)算梯度,并輸入到優(yōu)化器更新模型參數(shù)Dataloader按照BatchSize加載數(shù)據(jù)迭代訓(xùn)練

4網(wǎng)絡(luò)訓(xùn)練及評(píng)估優(yōu)化器選擇了Adam優(yōu)化器,Adam優(yōu)化器能夠快速、準(zhǔn)確地最小化損失函數(shù),提高深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練效果和泛化能力:自適應(yīng)調(diào)整學(xué)習(xí)率:Adam優(yōu)化器可以根據(jù)歷史梯度信息來自適應(yīng)地調(diào)節(jié)學(xué)習(xí)率,使得在訓(xùn)練初期使用較大的學(xué)習(xí)率,能夠快速收斂,在訓(xùn)練后期使用較小的學(xué)習(xí)率,能夠更加準(zhǔn)確地找到損失函數(shù)的最小值調(diào)整動(dòng)量:Adam優(yōu)化器能夠調(diào)整動(dòng)量參數(shù),以平衡上一次梯度和當(dāng)前梯度對(duì)參數(shù)更新的影響,從而避免過早陷入局部極小值歸一化處理:Adam優(yōu)化器對(duì)參數(shù)的更新進(jìn)行了歸一化處理,使得每個(gè)參數(shù)的更新都有一個(gè)相似的量級(jí),從而提高訓(xùn)練效果防止過擬合:Adam優(yōu)化器結(jié)合了L2正則化的思想,在更新時(shí)對(duì)參數(shù)進(jìn)行正則化,從而防止神經(jīng)網(wǎng)絡(luò)過度擬合訓(xùn)練數(shù)據(jù)4網(wǎng)絡(luò)訓(xùn)練及評(píng)估利用TensorBoard觀測(cè)運(yùn)行過程損失函數(shù)變化界面可以通過TensorBoard觀測(cè)訓(xùn)練過程:05任務(wù)5完成文本翻譯推理5完成文本翻譯推理deftranslate(src:str):

"""

:paramsrc:英文句子,例如"Ilikemachinelearning."

:return:翻譯后的句子,例如:”我喜歡機(jī)器學(xué)習(xí)“

"""

model=torch.load(model_dir/f'model_10000.pt')

model.to(device)

model=model.eval()

#將與原句子分詞后,通過詞典轉(zhuǎn)為index,然后增加<bos>和<eos>

src=torch.tensor([0]+dataset.en_vocab(dataset.en_tokenizer(src))+[1]).unsqueeze(0).to(device)

#首次tgt為<bos>

tgt=torch.tensor([[0]]).to(device)

#一個(gè)一個(gè)詞預(yù)測(cè),直到預(yù)測(cè)為<eos>,或者達(dá)到句子最大長(zhǎng)度

foriinrange(max_seq_length):

#進(jìn)行transformer計(jì)算

out=model(src,tgt)

#預(yù)測(cè)結(jié)果,因?yàn)橹恍枰醋詈笠粋€(gè)詞,所以取`out[:,-1]`

predict=model.predictor(out[:,-1])

#找出最大值的index

y=torch.argmax(predict,dim=1)

#和之前的預(yù)測(cè)結(jié)果拼接到一起

tgt=torch.concat([tgt,y.unsqueeze(0)],dim=1)

#如果為<eos>,說明預(yù)測(cè)結(jié)束,跳出循環(huán)

ify==1:

break

#將預(yù)測(cè)tokens拼起來

tgt=''.join(dataset.zh_vocab.lookup_tokens(tgt.squeeze().tolist())).replace("<s>","").replace("</s>","")

returntgt

print(translate("Thetrainwillprobablyarriveatthestationbeforenoon."))

print(translate("Ilikeapple."))加載模型加載詞典分詞序列化預(yù)測(cè)06任務(wù)6理解Transformer網(wǎng)絡(luò)模型6.1Transformer模型結(jié)構(gòu)nn.Transformer模塊并沒有實(shí)現(xiàn)Embedding、PositionalEncoding以及最后的Linear+Softmax部分,這幾部分的作用總結(jié)如下:1.EmbeddingEmbedding負(fù)責(zé)將token映射成高維向量。例如將123映射成[0.34,0.45,0.123,...,0.33]。通常使用nn.Embedding來實(shí)現(xiàn)。但nn.Embedding的參數(shù)并不是一成不變的,也是會(huì)參與梯度下降。關(guān)于nn.Embedding可參考Python文檔或相關(guān)文章,進(jìn)一步查看Pytorchnn.Embedding的基本使用。2.PositionalEncodingPositionalEncoding即位置編碼。用于為token編碼增加位置信息,例如Ilikeapple.這三個(gè)tokenEmbedding后的向量并不包含其位置信息(like左邊是I,右邊是you這個(gè)信息),需要和位置編碼結(jié)果進(jìn)行相加。位置信息對(duì)于輸出結(jié)果的影響巨大,可以自行進(jìn)行實(shí)驗(yàn),取消PositionalEncoding模塊,比較訓(xùn)練結(jié)果。3.Linear+SoftmaxLinear+Softmax為一個(gè)線性層加一個(gè)Softmax,用于對(duì)nn.Transformer輸出的結(jié)果進(jìn)行token預(yù)測(cè)。如果把Transformer比作CNN,那么nn.Transformer實(shí)現(xiàn)的就是卷積層,而Linear+Softmax就是卷積層后面的線性層。6.2Transformer的輸入和輸出Transformer輸入輸出框圖以文本翻譯為例:輸入1:原句子對(duì)應(yīng)的tokens,且是完整句子。一般0表示句子開始(<s>),1表示句子結(jié)束(</s>),2為填充(<pad>)。填充的目的是為了讓不同長(zhǎng)度的句子變?yōu)橥粋€(gè)長(zhǎng)度,這樣才可以組成一個(gè)batch。在項(xiàng)目代碼中,該變量一般取名src。輸入2:輸出(shiftedright),上一個(gè)階段的輸出。雖然名字叫outputs,但是它是輸入。最開始為0(<bos>),然后本次預(yù)測(cè)出“我”后,下次調(diào)用Transformer的該輸入就變成“<s>我”。在代碼中,該變量一般取名tgt。輸出:當(dāng)前階段的輸出。這里為經(jīng)過全連接nn.Linear后的輸出。輸出長(zhǎng)度為中文詞典長(zhǎng)度,輸出值為屬于詞典中某個(gè)取值的概率分布。我們?nèi)∽畲蟾怕饰恢玫乃饕鳛檩敵觥?.3Transformer的推理過程迭代調(diào)用Transformer模型,直到輸出</s>或達(dá)到句子最大長(zhǎng)度為止:第一次輸出序列為“<s>”,第二次序列為“<s>我”,對(duì)應(yīng)輸出為“愛”6.4Transformer的訓(xùn)練過程Transformer推理時(shí):一個(gè)詞一個(gè)詞輸出Transformer訓(xùn)練時(shí):target一次性給到Transformer訓(xùn)練過程,一次性輸入GrouthTruth進(jìn)行訓(xùn)練6.4nn.Transformer的構(gòu)造參數(shù)

6.4nn.Transformer的構(gòu)造參數(shù)多頭注意力:多個(gè)頭連接然后線性變換6.4nn.Transformer的構(gòu)造參數(shù)注意力的計(jì)算:6.4nn.Transformer的構(gòu)造參數(shù)6.5nn.Transformer的forward參數(shù)Transformer的forward參數(shù)如下:

src:Encoder的輸入。也就是將token進(jìn)行Embedding并PositionalEncoding之后的tensor。必填參數(shù)。Shape為(batch_size,詞數(shù),詞向量維度)tgt:與src同理,Decoder的輸入。必填參數(shù)。Shape為(詞數(shù),詞向量維度)src_mask:對(duì)src進(jìn)行mask。不常用。Shape為(詞數(shù),詞數(shù))tgt_mask:對(duì)tgt進(jìn)行mask。常用。Shape為(詞數(shù),詞數(shù))memory_mask–對(duì)Encoder的輸出memory進(jìn)行mask。

不常用。Shape為(batch_size,詞數(shù),詞數(shù))src_key_padding_mask:對(duì)src的token進(jìn)行mask.常用。Shape為(batch_size,詞數(shù))tgt_key_padding_mask:對(duì)tgt的token進(jìn)行mask。常用。Shape為(batch_size,詞數(shù))memory_key_padding_mask:對(duì)tgt的token進(jìn)行mask。不常用。Shape為(batch_size,詞數(shù))6.5nn.Transformer的forward參數(shù)1.src和tgtsrc參數(shù)和tgt參數(shù)分別為Encoder和Decoder的輸入?yún)?shù)。它們是對(duì)token進(jìn)行編碼后,再經(jīng)過PositionalEncoding之后的結(jié)果。例如:我們一開始的輸入為:[[0,3,4,5,6,7,8,1,2,2]],Shape為(1,10),表示batch_size為1,每句10個(gè)詞。在經(jīng)過Embedding后,Shape就變成了(1,10,128),表示batch_size為1,每句10個(gè)詞,每個(gè)詞被編碼為了128維的向量。src就是這個(gè)(1,10,128)的向量。tgt同理。6.5nn.Transformer的forward參數(shù)2.src_mask、tgt

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論