深度學(xué)習(xí):Attention機(jī)制:自注意力機(jī)制(Self-Attention)詳解_第1頁(yè)
深度學(xué)習(xí):Attention機(jī)制:自注意力機(jī)制(Self-Attention)詳解_第2頁(yè)
深度學(xué)習(xí):Attention機(jī)制:自注意力機(jī)制(Self-Attention)詳解_第3頁(yè)
深度學(xué)習(xí):Attention機(jī)制:自注意力機(jī)制(Self-Attention)詳解_第4頁(yè)
深度學(xué)習(xí):Attention機(jī)制:自注意力機(jī)制(Self-Attention)詳解_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

深度學(xué)習(xí):Attention機(jī)制:自注意力機(jī)制(Self-Attention)詳解1引言1.1注意力機(jī)制的重要性在深度學(xué)習(xí)領(lǐng)域,注意力機(jī)制(AttentionMechanism)的引入極大地提升了模型處理序列數(shù)據(jù)和理解復(fù)雜輸入的能力。傳統(tǒng)的序列模型,如循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)和長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM),在處理長(zhǎng)序列時(shí)面臨梯度消失或梯度爆炸的問(wèn)題,導(dǎo)致模型難以學(xué)習(xí)到序列中長(zhǎng)距離的依賴關(guān)系。注意力機(jī)制通過(guò)允許模型在處理序列時(shí)關(guān)注輸入序列中的關(guān)鍵部分,有效地解決了這一問(wèn)題,提高了模型的性能和效率。1.1.1自注意力機(jī)制的起源與應(yīng)用自注意力機(jī)制(Self-Attention)最初在2017年被Vaswani等人在論文《AttentionisAllYouNeed》中提出,作為T(mén)ransformer模型的核心組成部分。與傳統(tǒng)的注意力機(jī)制不同,自注意力機(jī)制允許模型中的每個(gè)位置直接關(guān)注序列中的所有位置,而不僅僅是前一個(gè)或幾個(gè)位置。這種機(jī)制不僅加速了訓(xùn)練過(guò)程,還增強(qiáng)了模型對(duì)輸入序列中長(zhǎng)距離依賴關(guān)系的捕捉能力。自注意力機(jī)制的應(yīng)用廣泛,包括但不限于:-自然語(yǔ)言處理(NLP):在機(jī)器翻譯、文本分類(lèi)、情感分析等任務(wù)中,自注意力機(jī)制幫助模型理解句子結(jié)構(gòu)和語(yǔ)義。-計(jì)算機(jī)視覺(jué)(CV):在圖像識(shí)別和生成任務(wù)中,自注意力機(jī)制可以捕捉圖像中不同區(qū)域之間的關(guān)系。-語(yǔ)音識(shí)別:自注意力機(jī)制在處理語(yǔ)音信號(hào)時(shí),能夠識(shí)別和理解語(yǔ)音中的重要特征。1.2自注意力機(jī)制詳解1.2.1原理自注意力機(jī)制基于查詢(Query)、鍵(Key)和值(Value)的概念。在Transformer模型中,輸入序列的每個(gè)位置都會(huì)生成對(duì)應(yīng)的查詢、鍵和值向量。查詢向量用于尋找輸入序列中與當(dāng)前位置相關(guān)聯(lián)的鍵向量,而鍵向量則用于衡量其他位置與當(dāng)前位置的相關(guān)性。值向量包含了輸入序列中每個(gè)位置的信息,當(dāng)查詢與鍵匹配時(shí),模型會(huì)根據(jù)匹配程度加權(quán)組合值向量,生成注意力加權(quán)的表示。具體步驟查詢、鍵、值的生成:對(duì)于輸入序列中的每個(gè)位置,通過(guò)線性變換生成查詢、鍵和值向量。計(jì)算注意力權(quán)重:使用查詢向量和鍵向量計(jì)算注意力權(quán)重,通常通過(guò)點(diǎn)積操作實(shí)現(xiàn)。加權(quán)求和:根據(jù)計(jì)算出的注意力權(quán)重,對(duì)值向量進(jìn)行加權(quán)求和,生成注意力加權(quán)的表示。輸出:將注意力加權(quán)的表示與輸入序列的原始表示結(jié)合,作為模型的輸出。1.2.2代碼示例以下是一個(gè)使用PyTorch實(shí)現(xiàn)的自注意力機(jī)制的簡(jiǎn)單示例:importtorch

importtorch.nnasnn

classSelfAttention(nn.Module):

def__init__(self,embed_size,heads):

super(SelfAttention,self).__init__()

self.embed_size=embed_size

self.heads=heads

self.head_dim=embed_size//heads

assert(self.head_dim*heads==embed_size),"Embedsizeneedstobedivisiblebyheads"

self.values=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.keys=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.queries=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.fc_out=nn.Linear(heads*self.head_dim,embed_size)

defforward(self,values,keys,query,mask):

N=query.shape[0]

value_len,key_len,query_len=values.shape[1],keys.shape[1],query.shape[1]

#Splittheembeddingintoself.headsdifferentpieces

values=values.reshape(N,value_len,self.heads,self.head_dim)

keys=keys.reshape(N,key_len,self.heads,self.head_dim)

queries=query.reshape(N,query_len,self.heads,self.head_dim)

energy=torch.einsum("nqhd,nkhd->nhqk",[queries,keys])

#queriesshape:(N,query_len,heads,heads_dim),

#keysshape:(N,key_len,heads,heads_dim)

#energy:(N,heads,query_len,key_len)

ifmaskisnotNone:

energy=energy.masked_fill(mask==0,float("-1e20"))

attention=torch.softmax(energy/(self.embed_size**(1/2)),dim=3)

out=torch.einsum("nhql,nlhd->nqhd",[attention,values]).reshape(

N,query_len,self.heads*self.head_dim

)

#valuesshape:(N,value_len,heads,heads_dim)

#outaftereinsum:(N,query_len,heads,head_dim),then

#outshape:(N,query_len,heads*head_dim)

out=self.fc_out(out)

returnout代碼解釋初始化:定義了查詢、鍵、值的線性變換層,以及一個(gè)輸出層用于將多頭注意力的結(jié)果合并回原始的嵌入維度。前向傳播:首先將輸入的嵌入向量分割成多個(gè)頭,每個(gè)頭的維度為embed_size//heads。然后計(jì)算查詢向量和鍵向量之間的點(diǎn)積,得到能量矩陣。如果存在mask,則應(yīng)用mask以屏蔽不需要關(guān)注的部分。最后,使用softmax函數(shù)計(jì)算注意力權(quán)重,并對(duì)值向量進(jìn)行加權(quán)求和,生成注意力加權(quán)的表示。1.2.3結(jié)論自注意力機(jī)制通過(guò)允許模型關(guān)注輸入序列中的關(guān)鍵部分,顯著提高了模型處理長(zhǎng)序列數(shù)據(jù)的能力。在深度學(xué)習(xí)的多個(gè)領(lǐng)域,自注意力機(jī)制已經(jīng)成為構(gòu)建高效、強(qiáng)大模型的關(guān)鍵技術(shù)之一。通過(guò)上述代碼示例,我們可以更深入地理解自注意力機(jī)制的工作原理,并在實(shí)際項(xiàng)目中應(yīng)用這一機(jī)制。2自注意力機(jī)制基礎(chǔ)2.1自注意力機(jī)制的概念自注意力機(jī)制(Self-Attention)是深度學(xué)習(xí)中的一種機(jī)制,主要用于處理序列數(shù)據(jù),如自然語(yǔ)言文本。它允許模型在處理序列中的每個(gè)元素時(shí),考慮整個(gè)序列的信息,而不僅僅是其直接的前后文。自注意力機(jī)制的核心思想是讓序列中的每個(gè)位置的元素能夠“關(guān)注”到序列中的其他元素,從而捕捉到更長(zhǎng)距離的依賴關(guān)系。2.1.1例子假設(shè)我們有一個(gè)英文句子“Johnreadsabookintheclassroom”,我們想要模型理解“reads”這個(gè)動(dòng)作是由“John”執(zhí)行的,而不是“book”或“classroom”。在自注意力機(jī)制中,每個(gè)詞都會(huì)計(jì)算與其他詞之間的注意力權(quán)重,這些權(quán)重會(huì)幫助模型更好地理解詞與詞之間的關(guān)系。2.2自注意力與傳統(tǒng)注意力的區(qū)別傳統(tǒng)注意力機(jī)制通常用于序列到序列(Seq2Seq)模型中,如機(jī)器翻譯。在這種機(jī)制下,解碼器在生成每個(gè)輸出詞時(shí),會(huì)根據(jù)當(dāng)前的解碼狀態(tài),從編碼器的輸出中選擇一部分信息作為參考。然而,這種機(jī)制在處理長(zhǎng)序列時(shí)效率較低,因?yàn)槊看谓獯a都需要遍歷整個(gè)編碼器的輸出。自注意力機(jī)制則不同,它在處理序列中的每個(gè)元素時(shí),都會(huì)同時(shí)考慮序列中所有其他元素的信息,而不僅僅是其直接的前后文。這種機(jī)制不僅能夠捕捉到更長(zhǎng)距離的依賴關(guān)系,而且在處理長(zhǎng)序列時(shí),計(jì)算效率也更高。2.2.1代碼示例下面是一個(gè)使用PyTorch實(shí)現(xiàn)的自注意力機(jī)制的簡(jiǎn)單示例:importtorch

importtorch.nnasnn

classSelfAttention(nn.Module):

def__init__(self,embed_size,heads):

super(SelfAttention,self).__init__()

self.embed_size=embed_size

self.heads=heads

self.head_dim=embed_size//heads

assert(self.head_dim*heads==embed_size),"Embedsizeneedstobedivisiblebyheads"

self.values=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.keys=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.queries=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.fc_out=nn.Linear(heads*self.head_dim,embed_size)

defforward(self,values,keys,query,mask):

N=query.shape[0]

value_len,key_len,query_len=values.shape[1],keys.shape[1],query.shape[1]

#Splittheembeddingintoself.headsdifferentpieces

values=values.reshape(N,value_len,self.heads,self.head_dim)

keys=keys.reshape(N,key_len,self.heads,self.head_dim)

queries=query.reshape(N,query_len,self.heads,self.head_dim)

values=self.values(values)

keys=self.keys(keys)

queries=self.queries(queries)

energy=torch.einsum("nqhd,nkhd->nhqk",[queries,keys])

#queriesshape:(N,query_len,heads,heads_dim),

#keysshape:(N,key_len,heads,heads_dim)

#energy:(N,heads,query_len,key_len)

ifmaskisnotNone:

energy=energy.masked_fill(mask==0,float("-1e20"))

attention=torch.softmax(energy/(self.embed_size**(1/2)),dim=3)

out=torch.einsum("nhql,nlhd->nqhd",[attention,values]).reshape(

N,query_len,self.heads*self.head_dim

)

out=self.fc_out(out)

returnout在這個(gè)例子中,我們定義了一個(gè)SelfAttention類(lèi),它包含了一個(gè)前向傳播函數(shù)forward。這個(gè)函數(shù)接收values、keys、query和mask作為輸入,然后計(jì)算自注意力權(quán)重,并使用這些權(quán)重對(duì)values進(jìn)行加權(quán)求和,得到輸出。2.3自注意力機(jī)制的關(guān)鍵組件自注意力機(jī)制的關(guān)鍵組件包括:查詢(Query):用于尋找信息的向量。鍵(Key):用于與查詢進(jìn)行匹配,確定注意力權(quán)重的向量。值(Value):根據(jù)注意力權(quán)重進(jìn)行加權(quán)求和的向量。注意力權(quán)重(AttentionWeights):查詢與鍵之間的匹配程度,通常通過(guò)點(diǎn)積或相似度計(jì)算得到。多頭注意力(Multi-HeadAttention):將自注意力機(jī)制分成多個(gè)頭,每個(gè)頭獨(dú)立計(jì)算注意力,然后將結(jié)果拼接起來(lái),通過(guò)一個(gè)全連接層輸出。這樣可以捕捉到不同類(lèi)型的依賴關(guān)系。2.3.1例子在自注意力機(jī)制中,查詢、鍵和值通常是從輸入序列的嵌入向量中線性變換得到的。例如,對(duì)于一個(gè)詞嵌入向量x,我們可以使用三個(gè)不同的線性變換W^Q、W^K和W^V來(lái)得到查詢Q、鍵K和值V:Q=x@W^Q

K=x@W^K

V=x@W^V然后,我們可以通過(guò)點(diǎn)積計(jì)算查詢與鍵之間的注意力權(quán)重:attention_weights=softmax(Q@K.T/sqrt(d_k))其中d_k是鍵向量的維度。最后,我們使用注意力權(quán)重對(duì)值向量進(jìn)行加權(quán)求和,得到輸出:output=attention_weights@V2.3.2多頭注意力示例多頭注意力機(jī)制可以進(jìn)一步增強(qiáng)自注意力機(jī)制的能力,通過(guò)并行計(jì)算多個(gè)注意力頭,然后將結(jié)果拼接起來(lái)。下面是一個(gè)使用PyTorch實(shí)現(xiàn)的多頭注意力機(jī)制的示例:classMultiHeadAttention(nn.Module):

def__init__(self,embed_size,heads):

super(MultiHeadAttention,self).__init__()

self.heads=heads

self.head_dim=embed_size//heads

assert(self.head_dim*heads==embed_size),"Embedsizeneedstobedivisiblebyheads"

self.values=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.keys=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.queries=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.fc_out=nn.Linear(heads*self.head_dim,embed_size)

defforward(self,values,keys,query,mask):

N=query.shape[0]

value_len,key_len,query_len=values.shape[1],keys.shape[1],query.shape[1]

#Splittheembeddingintoself.headsdifferentpieces

values=values.reshape(N,value_len,self.heads,self.head_dim)

keys=keys.reshape(N,key_len,self.heads,self.head_dim)

queries=query.reshape(N,query_len,self.heads,self.head_dim)

values=self.values(values)

keys=self.keys(keys)

queries=self.queries(queries)

energy=torch.einsum("nqhd,nkhd->nhqk",[queries,keys])

#queriesshape:(N,query_len,heads,heads_dim),

#keysshape:(N,key_len,heads,heads_dim)

#energy:(N,heads,query_len,key_len)

ifmaskisnotNone:

energy=energy.masked_fill(mask==0,float("-1e20"))

attention=torch.softmax(energy/(self.head_dim**(1/2)),dim=3)

out=torch.einsum("nhql,nlhd->nqhd",[attention,values]).reshape(

N,query_len,self.heads*self.head_dim

)

out=self.fc_out(out)

returnout在這個(gè)例子中,我們定義了一個(gè)MultiHeadAttention類(lèi),它包含了一個(gè)前向傳播函數(shù)forward。這個(gè)函數(shù)接收values、keys、query和mask作為輸入,然后計(jì)算多頭自注意力權(quán)重,并使用這些權(quán)重對(duì)values進(jìn)行加權(quán)求和,得到輸出。每個(gè)頭獨(dú)立計(jì)算注意力,然后將結(jié)果拼接起來(lái),通過(guò)一個(gè)全連接層輸出。通過(guò)上述示例和解釋?zhuān)覀兛梢钥吹阶宰⒁饬C(jī)制如何在深度學(xué)習(xí)模型中工作,以及它如何通過(guò)多頭注意力機(jī)制增強(qiáng)模型捕捉不同類(lèi)型依賴關(guān)系的能力。3自注意力機(jī)制的數(shù)學(xué)基礎(chǔ)3.1向量和矩陣的復(fù)習(xí)在深度學(xué)習(xí)中,向量和矩陣是構(gòu)建自注意力機(jī)制的基礎(chǔ)。向量可以視為一個(gè)一維數(shù)組,而矩陣則是一個(gè)二維數(shù)組。在自注意力機(jī)制中,我們經(jīng)常需要對(duì)向量和矩陣進(jìn)行操作,如點(diǎn)積、矩陣乘法和轉(zhuǎn)置等。3.1.1點(diǎn)積點(diǎn)積是兩個(gè)向量的線性組合,其結(jié)果是一個(gè)標(biāo)量。如果兩個(gè)向量分別為a=a1,a3.1.2矩陣乘法矩陣乘法是兩個(gè)矩陣相乘的操作,其結(jié)果是一個(gè)新的矩陣。如果矩陣A的尺寸為m×n,矩陣B的尺寸為n×p,那么它們的乘積C=AB的尺寸為mc3.1.3轉(zhuǎn)置矩陣的轉(zhuǎn)置是將矩陣的行和列互換的操作。如果矩陣A的尺寸為m×n,那么它的轉(zhuǎn)置AT的尺寸為3.2自注意力的計(jì)算過(guò)程自注意力機(jī)制允許模型在處理序列數(shù)據(jù)時(shí),關(guān)注序列中的不同部分。這一機(jī)制通過(guò)計(jì)算查詢(Query)、鍵(Key)和值(Value)之間的注意力權(quán)重來(lái)實(shí)現(xiàn)。3.2.1計(jì)算注意力權(quán)重假設(shè)我們有查詢向量q,鍵向量k,值向量v,其中k和v是序列中每個(gè)元素的表示。自注意力機(jī)制首先計(jì)算查詢向量和所有鍵向量之間的點(diǎn)積,然后通過(guò)softmax函數(shù)將這些點(diǎn)積轉(zhuǎn)換為注意力權(quán)重。3.2.2縮放點(diǎn)積注意力縮放點(diǎn)積注意力是自注意力機(jī)制的一種變體,它在計(jì)算點(diǎn)積之前,先將點(diǎn)積結(jié)果除以鍵向量的維度的平方根,以避免點(diǎn)積結(jié)果過(guò)大導(dǎo)致softmax函數(shù)飽和。3.3縮放點(diǎn)積注意力縮放點(diǎn)積注意力(ScaledDot-ProductAttention)是自注意力機(jī)制的核心部分。它通過(guò)計(jì)算查詢向量和鍵向量之間的點(diǎn)積,然后除以鍵向量維度的平方根,最后通過(guò)softmax函數(shù)將點(diǎn)積結(jié)果轉(zhuǎn)換為注意力權(quán)重。3.3.1代碼示例importtorch

importtorch.nn.functionalasF

defscaled_dot_product_attention(query,key,value,mask=None):

"""

計(jì)算縮放點(diǎn)積注意力

:paramquery:查詢向量,尺寸為(batch_size,num_heads,seq_len,d_k)

:paramkey:鍵向量,尺寸為(batch_size,num_heads,seq_len,d_k)

:paramvalue:值向量,尺寸為(batch_size,num_heads,seq_len,d_v)

:parammask:掩碼矩陣,尺寸為(batch_size,num_heads,seq_len,seq_len)

:return:注意力加權(quán)的值向量,尺寸為(batch_size,num_heads,seq_len,d_v)

"""

d_k=query.size(-1)

scores=torch.matmul(query,key.transpose(-2,-1))/torch.sqrt(torch.tensor(d_k,dtype=torch.float))

ifmaskisnotNone:

scores=scores.masked_fill(mask==0,-1e9)

attention_weights=F.softmax(scores,dim=-1)

returntorch.matmul(attention_weights,value)3.3.2數(shù)據(jù)樣例假設(shè)我們有一個(gè)序列,其中包含三個(gè)元素,每個(gè)元素的鍵向量和值向量如下:鍵向量:k值向量:v查詢向量:q3.3.3示例描述在這個(gè)例子中,我們使用縮放點(diǎn)積注意力計(jì)算查詢向量和鍵向量之間的注意力權(quán)重,然后使用這些權(quán)重對(duì)值向量進(jìn)行加權(quán)求和。query=torch.tensor([[1,1]],dtype=torch.float)

key=torch.tensor([[1,0],[0,1],[1,1]],dtype=torch.float)

value=torch.tensor([[10,0],[0,10],[5,5]],dtype=torch.float)

#計(jì)算縮放點(diǎn)積注意力

output=scaled_dot_product_attention(query.unsqueeze(0).unsqueeze(0),key.unsqueeze(0).unsqueeze(0),value.unsqueeze(0).unsqueeze(0))

print(output)輸出結(jié)果將是一個(gè)加權(quán)求和后的值向量,表示模型在處理序列數(shù)據(jù)時(shí),對(duì)序列中不同部分的注意力程度。通過(guò)上述的數(shù)學(xué)基礎(chǔ)復(fù)習(xí)和縮放點(diǎn)積注意力的代碼示例,我們深入了解了自注意力機(jī)制的計(jì)算過(guò)程。自注意力機(jī)制通過(guò)計(jì)算查詢、鍵和值之間的注意力權(quán)重,使模型能夠關(guān)注序列中的不同部分,從而提高模型在處理序列數(shù)據(jù)時(shí)的性能。4自注意力在序列建模中的應(yīng)用4.1自注意力在自然語(yǔ)言處理中的應(yīng)用4.1.1原理與內(nèi)容自注意力機(jī)制(Self-Attention)在自然語(yǔ)言處理(NLP)中的應(yīng)用主要體現(xiàn)在它能夠處理序列數(shù)據(jù),如文本,而無(wú)需依賴于遞歸或卷積操作。自注意力機(jī)制通過(guò)計(jì)算序列中每個(gè)位置的詞與所有其他位置的詞之間的關(guān)系,從而捕捉到全局的上下文信息。這種機(jī)制特別適合處理長(zhǎng)距離依賴問(wèn)題,因?yàn)樗挠?jì)算復(fù)雜度與序列長(zhǎng)度線性相關(guān),而不是遞歸或卷積的二次或更高次復(fù)雜度。示例:Transformer模型中的自注意力在Transformer模型中,自注意力機(jī)制是其核心組成部分。下面是一個(gè)簡(jiǎn)化版的自注意力機(jī)制的實(shí)現(xiàn)代碼,使用了PyTorch庫(kù)。importtorch

importtorch.nnasnn

classSelfAttention(nn.Module):

def__init__(self,embed_size,heads):

super(SelfAttention,self).__init__()

self.embed_size=embed_size

self.heads=heads

self.head_dim=embed_size//heads

assert(self.head_dim*heads==embed_size),"Embedsizeneedstobedivisiblebyheads"

self.values=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.keys=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.queries=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.fc_out=nn.Linear(heads*self.head_dim,embed_size)

defforward(self,values,keys,query,mask):

N=query.shape[0]

value_len,key_len,query_len=values.shape[1],keys.shape[1],query.shape[1]

#Splittheembeddingintoself.headsdifferentpieces

values=values.reshape(N,value_len,self.heads,self.head_dim)

keys=keys.reshape(N,key_len,self.heads,self.head_dim)

queries=query.reshape(N,query_len,self.heads,self.head_dim)

values=self.values(values)

keys=self.keys(keys)

queries=self.queries(queries)

energy=torch.einsum("nqhd,nkhd->nhqk",[queries,keys])

#queriesshape:(N,query_len,heads,heads_dim),

#keysshape:(N,key_len,heads,heads_dim)

#energy:(N,heads,query_len,key_len)

ifmaskisnotNone:

energy=energy.masked_fill(mask==0,float("-1e20"))

attention=torch.softmax(energy/(self.embed_size**(1/2)),dim=3)

#attentionshape:(N,heads,query_len,key_len)

out=torch.einsum("nhql,nlhd->nqhd",[attention,values]).reshape(

N,query_len,self.heads*self.head_dim)

#valuesshape:(N,value_len,heads,heads_dim)

#outaftereinsum:(N,query_len,heads,head_dim),then

#outshape:(N,query_len,heads*head_dim)

out=self.fc_out(out)

#outshape:(N,query_len,embed_size)

returnout4.1.2解釋上述代碼定義了一個(gè)自注意力層,它接受values、keys和query作為輸入,這些輸入通常是從詞嵌入層得到的。mask參數(shù)用于處理序列中不同長(zhǎng)度的問(wèn)題,確保在計(jì)算注意力時(shí)不會(huì)考慮填充的詞。在forward函數(shù)中,首先將輸入的嵌入向量分割成多個(gè)頭(heads),每個(gè)頭的維度為head_dim。然后,通過(guò)線性變換得到values、keys和queries。接下來(lái),使用torch.einsum計(jì)算queries和keys之間的點(diǎn)積,得到能量矩陣,這反映了序列中詞之間的相關(guān)性。如果提供了mask,則會(huì)將不相關(guān)的詞的能量值設(shè)為一個(gè)非常小的數(shù),確保在softmax操作中這些詞的注意力權(quán)重接近于零。最后,將注意力權(quán)重與values相乘,得到加權(quán)后的values,然后將這些加權(quán)值重新組合并通過(guò)一個(gè)線性層,得到最終的輸出。4.2自注意力在計(jì)算機(jī)視覺(jué)中的應(yīng)用4.2.1原理與內(nèi)容在計(jì)算機(jī)視覺(jué)中,自注意力機(jī)制被用于處理圖像或視頻等數(shù)據(jù),以捕捉圖像中不同部分之間的關(guān)系。與NLP中的自注意力不同,計(jì)算機(jī)視覺(jué)中的自注意力通常是在特征圖上進(jìn)行的,這些特征圖可以是卷積神經(jīng)網(wǎng)絡(luò)的輸出。自注意力機(jī)制能夠幫助模型關(guān)注圖像中的重要區(qū)域,而忽略不相關(guān)的背景信息。示例:Squeeze-and-ExcitationNetworks中的自注意力Squeeze-and-ExcitationNetworks(SENet)是一種在卷積神經(jīng)網(wǎng)絡(luò)中使用自注意力機(jī)制的模型。下面是一個(gè)SENet中自注意力模塊的簡(jiǎn)化實(shí)現(xiàn)。importtorch

importtorch.nnasnn

classSELayer(nn.Module):

def__init__(self,channel,reduction=16):

super(SELayer,self).__init__()

self.avg_pool=nn.AdaptiveAvgPool2d(1)

self.fc=nn.Sequential(

nn.Linear(channel,channel//reduction,bias=False),

nn.ReLU(inplace=True),

nn.Linear(channel//reduction,channel,bias=False),

nn.Sigmoid()

)

defforward(self,x):

b,c,_,_=x.size()

y=self.avg_pool(x).view(b,c)

y=self.fc(y).view(b,c,1,1)

returnx*y.expand_as(x)4.2.2解釋SELayer首先使用全局平均池化層(globalaveragepooling)對(duì)輸入特征圖進(jìn)行壓縮,得到一個(gè)通道維度的向量。然后,通過(guò)兩個(gè)全連接層進(jìn)行特征的“擠壓”和“激勵(lì)”,其中第一個(gè)全連接層的輸出維度是輸入維度的reduction倍,這有助于減少計(jì)算量。ReLU激活函數(shù)用于引入非線性,而Sigmoid函數(shù)則用于生成每個(gè)通道的權(quán)重,這些權(quán)重在0到1之間。最后,將生成的權(quán)重與原始輸入特征圖相乘,得到加權(quán)后的特征圖,這有助于模型關(guān)注重要的特征通道。4.3自注意力在語(yǔ)音識(shí)別中的應(yīng)用4.3.1原理與內(nèi)容在語(yǔ)音識(shí)別中,自注意力機(jī)制被用于處理音頻信號(hào)的特征表示,以捕捉語(yǔ)音中的長(zhǎng)距離依賴關(guān)系。與NLP和計(jì)算機(jī)視覺(jué)不同,語(yǔ)音信號(hào)通常具有更高的時(shí)間分辨率,因此自注意力機(jī)制在處理這種高分辨率數(shù)據(jù)時(shí)特別有用。示例:Conformer模型中的自注意力Conformer是一種結(jié)合了卷積和自注意力機(jī)制的語(yǔ)音識(shí)別模型。下面是一個(gè)簡(jiǎn)化版的Conformer中自注意力模塊的實(shí)現(xiàn)。importtorch

importtorch.nnasnn

classConformerAttention(nn.Module):

def__init__(self,d_model,num_heads,dropout=0.1):

super(ConformerAttention,self).__init__()

self.self_attn=nn.MultiheadAttention(d_model,num_heads,dropout=dropout)

self.conv_module=nn.Sequential(

nn.Conv1d(d_model,d_model*2,kernel_size=31,padding=15,groups=2),

nn.GLU(dim=1),

nn.Conv1d(d_model,d_model,kernel_size=15,padding=7,groups=2),

nn.SiLU(),

nn.LayerNorm(d_model),

nn.Dropout(dropout)

)

defforward(self,x,mask=None):

x=self.self_attn(x,x,x,attn_mask=mask)[0]

x=x.transpose(0,1)

x=self.conv_module(x)

x=x.transpose(0,1)

returnx4.3.2解釋ConformerAttention模塊結(jié)合了多頭自注意力和卷積模塊。self_attn使用PyTorch的MultiheadAttention層來(lái)計(jì)算自注意力,這與NLP中的自注意力機(jī)制類(lèi)似。然后,通過(guò)一個(gè)卷積模塊來(lái)捕捉局部特征,該模塊使用了門(mén)控線性單元(GLU)和SiLU激活函數(shù),以引入非線性和局部依賴性。最后,通過(guò)LayerNorm和Dropout層來(lái)規(guī)范化和防止過(guò)擬合,得到最終的輸出。通過(guò)上述示例,我們可以看到自注意力機(jī)制在不同領(lǐng)域的應(yīng)用,以及它是如何被集成到更復(fù)雜的模型中的。自注意力機(jī)制通過(guò)計(jì)算序列或特征圖中元素之間的關(guān)系,幫助模型更好地理解輸入數(shù)據(jù)的結(jié)構(gòu),從而在各種任務(wù)中提高性能。5Transformer模型中的自注意力5.1Transformer模型概述Transformer模型是深度學(xué)習(xí)領(lǐng)域中用于處理序列數(shù)據(jù)的一種創(chuàng)新架構(gòu),由Vaswani等人在2017年的論文《AttentionisAllYouNeed》中提出。與傳統(tǒng)的循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)和長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)不同,Transformer模型完全依賴于自注意力機(jī)制(Self-Attention)來(lái)處理輸入序列,這使得模型在并行計(jì)算上更加高效,同時(shí)也能夠捕捉到序列中的長(zhǎng)距離依賴關(guān)系。5.1.1關(guān)鍵特性自注意力機(jī)制:允許模型在處理序列時(shí),關(guān)注序列中的所有位置,而不僅僅是前一個(gè)位置。位置編碼:由于模型沒(méi)有循環(huán)結(jié)構(gòu),因此需要位置編碼來(lái)提供序列中元素的順序信息。多頭注意力:通過(guò)并行使用多個(gè)注意力頭,模型可以同時(shí)關(guān)注不同位置的多個(gè)信息,增強(qiáng)了模型的表達(dá)能力。5.2編碼器中的自注意力層編碼器是Transformer模型的一部分,負(fù)責(zé)將輸入序列轉(zhuǎn)換為中間表示。編碼器由多個(gè)相同的層堆疊而成,每個(gè)層包含兩個(gè)子層:自注意力層和前饋神經(jīng)網(wǎng)絡(luò)層。自注意力層允許模型在編碼階段關(guān)注輸入序列中的所有單詞,以捕捉它們之間的關(guān)系。5.2.1自注意力機(jī)制原理自注意力機(jī)制通過(guò)計(jì)算查詢(Query)、鍵(Key)和值(Value)的點(diǎn)積來(lái)實(shí)現(xiàn)。查詢、鍵和值都是從輸入序列的嵌入向量中線性變換得到的。具體步驟如下:線性變換:輸入序列的每個(gè)嵌入向量通過(guò)三個(gè)不同的線性變換,分別得到查詢、鍵和值向量。點(diǎn)積計(jì)算:查詢向量與所有鍵向量進(jìn)行點(diǎn)積計(jì)算,得到的分?jǐn)?shù)經(jīng)過(guò)softmax函數(shù)歸一化,生成注意力權(quán)重。加權(quán)求和:將注意力權(quán)重與所有值向量相乘,然后求和,得到加權(quán)后的表示向量。輸出變換:加權(quán)后的表示向量再經(jīng)過(guò)一個(gè)線性變換,得到最終的輸出向量。5.2.2代碼示例importtorch

importtorch.nnasnn

classSelfAttention(nn.Module):

def__init__(self,embed_size,heads):

super(SelfAttention,self).__init__()

self.embed_size=embed_size

self.heads=heads

self.head_dim=embed_size//heads

assert(self.head_dim*heads==embed_size),"Embedsizeneedstobedivisiblebyheads"

self.values=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.keys=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.queries=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.fc_out=nn.Linear(heads*self.head_dim,embed_size)

defforward(self,values,keys,query,mask):

N=query.shape[0]

value_len,key_len,query_len=values.shape[1],keys.shape[1],query.shape[1]

#Splitembeddingintoself.headspieces

values=values.reshape(N,value_len,self.heads,self.head_dim)

keys=keys.reshape(N,key_len,self.heads,self.head_dim)

queries=query.reshape(N,query_len,self.heads,self.head_dim)

energy=torch.einsum("nqhd,nkhd->nhqk",[queries,keys])

#queriesshape:(N,query_len,heads,heads_dim)

#keysshape:(N,key_len,heads,heads_dim)

#energy:(N,heads,query_len,key_len)

ifmaskisnotNone:

energy=energy.masked_fill(mask==0,float("-1e20"))

attention=torch.softmax(energy/(self.embed_size**(1/2)),dim=3)

out=torch.einsum("nhql,nlhd->nqhd",[attention,values]).reshape(

N,query_len,self.heads*self.head_dim

)

#valuesshape:(N,value_len,heads,heads_dim)

#outaftersplit:(N,query_len,heads,head_dim)

#outshape:(N,query_len,embed_size)

out=self.fc_out(out)

returnout5.3解碼器中的自注意力層解碼器也是由多個(gè)相同的層堆疊而成,每個(gè)層包含三個(gè)子層:自注意力層、編碼器-解碼器注意力層和前饋神經(jīng)網(wǎng)絡(luò)層。解碼器中的自注意力層與編碼器中的自注意力層類(lèi)似,但增加了掩碼(Mask)機(jī)制,以確保在生成序列時(shí),模型只能關(guān)注到當(dāng)前時(shí)刻及之前的輸入。5.3.1掩碼自注意力機(jī)制在解碼器中,為了生成序列的下一個(gè)詞,模型不能提前“看到”序列中未生成的部分。因此,掩碼自注意力機(jī)制通過(guò)在注意力權(quán)重矩陣中設(shè)置掩碼,將未來(lái)位置的權(quán)重設(shè)為負(fù)無(wú)窮,經(jīng)過(guò)softmax函數(shù)后,這些位置的權(quán)重將為0,從而確保模型只能關(guān)注到當(dāng)前時(shí)刻及之前的輸入。5.3.2代碼示例classMaskedSelfAttention(nn.Module):

def__init__(self,embed_size,heads):

super(MaskedSelfAttention,self).__init__()

self.self_attention=SelfAttention(embed_size,heads)

defforward(self,values,keys,query,mask):

#Createamaskforfuturetokens

future_mask=torch.tril(torch.ones(query_len,query_len)).to(device)

#Applythemask

masked_attention=self.self_attention(values,keys,query,future_mask*mask)

returnmasked_attention5.4多頭自注意力機(jī)制多頭自注意力機(jī)制是Transformer模型中的一個(gè)重要組成部分,它允許模型在不同的表示子空間中并行地執(zhí)行自注意力計(jì)算。通過(guò)并行使用多個(gè)注意力頭,模型可以同時(shí)關(guān)注不同位置的多個(gè)信息,增強(qiáng)了模型的表達(dá)能力。5.4.1多頭自注意力原理在多頭自注意力中,輸入序列的嵌入向量被分成多個(gè)頭,每個(gè)頭獨(dú)立地進(jìn)行自注意力計(jì)算。計(jì)算完成后,所有頭的輸出被拼接在一起,然后通過(guò)一個(gè)線性層進(jìn)行變換,得到最終的輸出向量。5.4.2代碼示例classMultiHeadAttention(nn.Module):

def__init__(self,embed_size,heads):

super(MultiHeadAttention,self).__init__()

self.heads=heads

self.head_dim=embed_size//heads

assert(self.head_dim*heads==embed_size),"Embedsizeneedstobedivisiblebyheads"

self.values=nn.Linear(embed_size,embed_size)

self.keys=nn.Linear(embed_size,embed_size)

self.queries=nn.Linear(embed_size,embed_size)

self.fc_out=nn.Linear(embed_size,embed_size)

defforward(self,values,keys,query,mask):

N=query.shape[0]

value_len,key_len,query_len=values.shape[1],keys.shape[1],query.shape[1]

values=self.values(values)

keys=self.keys(keys)

queries=self.queries(query)

values=values.reshape(N,value_len,self.heads,self.head_dim)

keys=keys.reshape(N,key_len,self.heads,self.head_dim)

queries=queries.reshape(N,query_len,self.heads,self.head_dim)

energy=torch.einsum("nqhd,nkhd->nhqk",[queries,keys])

ifmaskisnotNone:

energy=energy.masked_fill(mask==0,float("-1e20"))

attention=torch.softmax(energy/(self.embed_size**(1/2)),dim=3)

out=torch.einsum("nhql,nlhd->nqhd",[attention,values]).reshape(

N,query_len,self.heads*self.head_dim

)

out=self.fc_out(out)

returnout通過(guò)上述代碼示例和原理介紹,我們可以看到Transformer模型如何利用自注意力機(jī)制和多頭注意力機(jī)制來(lái)處理序列數(shù)據(jù),捕捉長(zhǎng)距離依賴關(guān)系,同時(shí)保持計(jì)算的高效性。6自注意力機(jī)制的優(yōu)化與變體6.1自注意力機(jī)制的局限性自注意力機(jī)制在處理序列數(shù)據(jù)時(shí)展現(xiàn)出了強(qiáng)大的能力,但并非沒(méi)有局限性。主要的局限包括:計(jì)算復(fù)雜度:自注意力機(jī)制的計(jì)算復(fù)雜度為O(n^2),其中n是序列長(zhǎng)度。對(duì)于非常長(zhǎng)的序列,這可能導(dǎo)致計(jì)算效率低下。局部信息處理:雖然自注意力機(jī)制能夠處理長(zhǎng)距離依賴,但在某些任務(wù)中,局部信息的處理仍然非常重要,自注意力可能在處理局部信息時(shí)不如卷積神經(jīng)網(wǎng)絡(luò)(CNN)有效。并行化限制:在訓(xùn)練過(guò)程中,自注意力機(jī)制的計(jì)算可以并行化,但在生成序列時(shí),如在自然語(yǔ)言生成任務(wù)中,自注意力機(jī)制需要逐個(gè)生成詞,這限制了其并行化能力。參數(shù)量:自注意力機(jī)制的參數(shù)量相對(duì)較大,特別是在多頭注意力和深層模型中,這可能導(dǎo)致過(guò)擬合問(wèn)題。6.2優(yōu)化自注意力的策略為了解決上述局限,研究者們提出了多種優(yōu)化策略:6.2.1局部自注意力局部自注意力機(jī)制通過(guò)限制注意力計(jì)算的范圍,只考慮序列中的一部分元素,從而減少計(jì)算復(fù)雜度。例如,在處理文本時(shí),可以只考慮每個(gè)詞的前后幾個(gè)詞,而不是整個(gè)序列。6.2.2稀疏注意力稀疏注意力機(jī)制通過(guò)在注意力矩陣中引入稀疏性,減少不必要的計(jì)算。這通常通過(guò)設(shè)計(jì)特定的稀疏模式來(lái)實(shí)現(xiàn),如blocksparseattention,其中注意力只在特定的block之間計(jì)算。6.2.3可變形自注意力可變形自注意力機(jī)制通過(guò)引入可學(xué)習(xí)的偏移量,使得模型能夠關(guān)注到序列中更靈活的位置,從而增強(qiáng)模型的局部信息處理能力。6.2.4自注意力的并行化在生成序列時(shí),通過(guò)預(yù)測(cè)整個(gè)序列的輸出,而不是逐個(gè)生成,可以實(shí)現(xiàn)自注意力機(jī)制的并行化。例如,Transformer-XL和Reformer等模型通過(guò)引入循環(huán)機(jī)制或局部敏感哈希(LSH)來(lái)實(shí)現(xiàn)這一點(diǎn)。6.2.5參數(shù)效率優(yōu)化通過(guò)使用低秩近似、因子分解等技術(shù),可以減少自注意力機(jī)制的參數(shù)量,從而降低過(guò)擬合的風(fēng)險(xiǎn)。例如,Linformer模型通過(guò)將注意力矩陣投影到低維空間來(lái)實(shí)現(xiàn)這一點(diǎn)。6.3自注意力機(jī)制的變體自注意力機(jī)制的多種變體已經(jīng)被提出,以適應(yīng)不同的任務(wù)和場(chǎng)景:6.3.1多頭注意力(Multi-HeadAttention)多頭注意力機(jī)制通過(guò)將自注意力機(jī)制分解為多個(gè)“頭”,每個(gè)頭獨(dú)立計(jì)算注意力,然后將結(jié)果合并,從而增強(qiáng)模型的表達(dá)能力。這允許模型在不同的注意力空間中捕捉到不同的信息。#多頭注意力的實(shí)現(xiàn)示例

importtorch

importtorch.nnasnn

classMultiHeadAttention(nn.Module):

def__init__(self,embed_dim,num_heads):

super(MultiHeadAttention,self).__init__()

self.embed_dim=embed_dim

self.num_heads=num_heads

self.head_dim=embed_dim//num_heads

assertself.head_dim*num_heads==self.embed_dim,"Embeddingdimensionmustbedivisiblebynumberofheads"

self.q_linear=nn.Linear(embed_dim,embed_dim)

self.k_linear=nn.Linear(embed_dim,embed_dim)

self.v_linear=nn.Linear(embed_dim,embed_dim)

self.out_linear=nn.Linear(embed_dim,embed_dim)

defforward(self,query,key,value,mask=None):

batch_size=query.size(0)

#線性變換

query=self.q_linear(query)

key=self.k_linear(key)

value=self.v_linear(value)

#分割成多個(gè)頭

query=query.view(batch_size,-1,self.num_heads,self.head_dim).transpose(1,2)

key=key.view(batch_size,-1,self.num_heads,self.head_dim).transpose(1,2)

value=value.view(batch_size,-1,self.num_heads,self.head_dim).transpose(1,2)

#計(jì)算注意力

scores=torch.matmul(query,key.transpose(-2,-1))/math.sqrt(self.head_dim)

ifmaskisnotNone:

scores=scores.masked_fill(mask==0,-1e9)

attention=torch.softmax(scores,dim=-1)

#加權(quán)求和

out=torch.matmul(attention,value)

out=out.transpose(1,2).contiguous().view(batch_size,-1,self.embed_dim)

#輸出線性變換

out=self.out_linear(out)

returnout6.3.2軸注意力(AxialAttention)軸注意力機(jī)制通過(guò)將序列分解為多個(gè)軸,然后在每個(gè)軸上獨(dú)立計(jì)算注意力,從而減少計(jì)算復(fù)雜度。這在處理高維數(shù)據(jù),如圖像和視頻時(shí)特別有效。6.3.3因果注意力(CausalAttention)因果注意力機(jī)制在生成序列時(shí)使用,它通過(guò)屏蔽未來(lái)的信息,確保模型在生成當(dāng)前元素時(shí)只考慮過(guò)去的信息。這是在自然語(yǔ)言生成和語(yǔ)音合成等任務(wù)中常用的策略。6.3.4相對(duì)位置編碼(RelativePositionalEncoding)相對(duì)位置編碼通過(guò)引入相對(duì)位置信息,增強(qiáng)自注意力機(jī)制對(duì)位置信息的敏感度。這在處理具有明確位置依賴性的任務(wù)時(shí)特別有用,如自然語(yǔ)言理解和機(jī)器翻譯。6.3.5自注意力與卷積的結(jié)合一些模型,如ConvolutionalSelf-Attention,通過(guò)結(jié)合自注意力和卷積操作,既保留了自注意力的全局依賴捕捉能力,又增強(qiáng)了局部信息處理能力。通過(guò)這些優(yōu)化策略和變體,自注意力機(jī)制在深度學(xué)習(xí)中的應(yīng)用變得更加廣泛和高效。7自注意力機(jī)制的實(shí)現(xiàn)與案例分析7.1自注意力機(jī)制的PyTorch實(shí)現(xiàn)在深度學(xué)習(xí)中,自注意力機(jī)制(Self-Attention)是一種允許模型在處理序列數(shù)據(jù)時(shí)關(guān)注輸入序列中不同部分的重要性的技術(shù)。它在自然語(yǔ)言處理、圖像識(shí)別等多個(gè)領(lǐng)域都有廣泛應(yīng)用。下面,我們將使用PyTorch框架來(lái)實(shí)現(xiàn)一個(gè)基本的自注意力機(jī)制。7.1.1實(shí)現(xiàn)代碼importtorch

importtorch.nnasnn

importtorch.nn.functionalasF

classSelfAttention(nn.Module):

def__init__(self,embed_size,heads):

super(SelfAttention,self).__init__()

self.embed_size=embed_size

self.heads=heads

self.head_dim=embed_size//heads

assert(self.head_dim*heads==embed_size),"Embedsizeneedstobedivisiblebyheads"

self.values=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.keys=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.queries=nn.Linear(self.head_dim,self.head_dim,bias=False)

self.fc_out=nn.Linear(heads*self.head_dim,embed_size)

defforward(self,values,keys,query,mask):

N=query.shape[0]

value_len,key_len,query_len=values.shape[1],keys.shape[1],query.shape[1]

#Splittheembeddingintoself.headsdifferentpieces

values=values.reshape(N,value_len,self.heads,self.head_dim)

keys=keys.reshape(N,key_len,self.heads,self.head_dim)

queries=query.reshape(N,query_len,self.heads,self.head_dim)

values=self.values(values)

keys=self.keys(keys)

queries=self.queries(queries)

energy=torch.einsum("nqhd,nkhd->nhqk",[queries,keys])

#queriesshape:(N,query_len,heads,heads_dim),

#keysshape:(N,key_len,heads,heads_dim)

#energy:(N,heads,query_len,key_len)

ifmaskisnotNone:

energy=energy.masked_fill(mask==0,float("-1e20"))

attention=torch.softmax(energy/(self.embed_size**(1/2)),dim=3)

out=torch.einsum("nhql,nlhd->nqhd",[attention,values]).reshape(

N,query_len,self.heads*self.head_dim

)

out=self.fc_out(out)

returnout7.1.2代碼解釋初始化:我們定義了SelfAttention類(lèi),它包含embed_size和heads兩個(gè)參數(shù),分別表示嵌入向量的維度和注意力頭的數(shù)量。head_dim是每個(gè)注意力頭的維度,確保embed_size可以被heads整除。前向傳播:在forward函數(shù)中,我們首先將輸入的values、keys和query張量按照heads分割,然后通過(guò)線性層轉(zhuǎn)換它們。接下來(lái),我們使用torch.einsum計(jì)算查詢和鍵之間的點(diǎn)積,得到能量矩陣。如果提供了mask,我們將其應(yīng)用到能量矩陣上,以屏蔽不需要關(guān)注的部分。最后,我們計(jì)算注意力權(quán)重,將其與values相乘,然后通過(guò)另一個(gè)線性層得到輸出。7.2自注意力在文本分類(lèi)中的案例自注意力機(jī)制在文本分類(lèi)任務(wù)中可以顯著提高模型的性能。下面是一個(gè)使用自注意力機(jī)制進(jìn)行文本分類(lèi)的簡(jiǎn)單示例。7.2.1數(shù)據(jù)樣例假設(shè)我們有以下文本數(shù)據(jù):texts=["我喜歡這個(gè)電影","這個(gè)電影很糟糕","這家餐廳的食物很好吃"]

labels=[1,0,1]#1表示正面評(píng)價(jià),0表示負(fù)面評(píng)價(jià)7.2.2模型實(shí)現(xiàn)importtorchtext

#Tokenizeandbuildvocabulary

tokenizer=lambdax:x.split()

TEXT=torchtext.data.Field(sequential=True,tokenize=tokenizer,lower=True)

LABEL=torchtext.data.LabelField(dtype=torch.float)

#Loaddata

train_data,test_data=torchtext.datasets.TextClassification.splits(TEXT,LABEL,texts,labels)

#Buildvocabulary

TEXT.build_vocab(train_data,max_size=10000)

LABEL.build_vocab(train_data)

#Definemodel

classTextClassifier(nn.Module):

def__init__(self,vocab_size,embed_size,heads,num_classes):

super(TextClassifier,self).__init__()

self.embedding=nn.Embedding(vocab_size,embed_size)

self.self_attention=SelfAttention(embed_size,heads)

self.fc=nn.Linear(embed_size,num_clas

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論