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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

详细分解Transformer各部件总结

發(fā)布時間:2025/4/5 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 详细分解Transformer各部件总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Transformer的介紹

  • Transformer的優(yōu)勢

    • # 1. Transformer能夠利用分布式GPU進行并行訓(xùn)練,提升模型訓(xùn)練效率 # 2. 在分析預(yù)測更長文本時,捕捉間隔較長的語義關(guān)聯(lián)效果更好, 作用:基于seq2seq架構(gòu)的transformer模型可以完成NLP領(lǐng)域研究的典型任務(wù),如機器翻譯,文本生成等,同時又可以構(gòu)建預(yù)訓(xùn)練語言模型,用于其他任務(wù)
  • Transformer架構(gòu)

    • 輸入部分

      • 源文本嵌入層及其位置編碼器
        • 文本嵌入(Embedding)作用:無論源文本嵌入還是目標(biāo)文本嵌入,都是為了將文本中詞匯的數(shù)字表示轉(zhuǎn)變?yōu)橄蛄勘硎?#xff0c;希望在這樣的高維空間捕捉詞匯之間的關(guān)系
        • 位置編碼器的作用:在編碼器結(jié)構(gòu)中,并沒有對詞匯位置信息進行處理,因此需要在Embdeding層后加入位置編碼器,將詞匯位置不同可能會產(chǎn)生不同語義的信息加入到詞嵌入張量中,以彌補位置信息的缺失
      • 目標(biāo)文本嵌入層及其位置編碼器
    • 輸出部分

      • 線性層
      • softmax層
    • 編碼器部分

      • N個編碼器層堆疊而成
      • 每個編碼器由兩個子層連接結(jié)構(gòu)組成
      • 第一個子層鏈接包含一個多頭自注意力層和規(guī)范化層及一個殘差連接
      • 第二個子層連接結(jié)構(gòu)包含一個前饋全連接子層和規(guī)范化層及一個殘差連接
    • 解碼器部分

      • N個解碼器層堆疊而成
      • 每個解碼器由三個子層連接結(jié)構(gòu)組成
      • 第一個子層鏈接包含一個多頭自注意力層和規(guī)范化層及一個殘差連接
      • 第二個子層鏈接包含一個多頭自注意力層和規(guī)范化層及一個殘差連接
      • 第三個子層連接結(jié)構(gòu)包含一個前饋全連接子層和規(guī)范化層及一個殘差連接

1. 輸入部分

  • 文本詞嵌入

    • 作用:對輸入文本數(shù)值化以方便擬合算法

    • import math import torch import torch.nn as nn class Embeddings(nn.Module):def __init(self, d_model, vocab):"""d_model: 詞嵌入的維度vocab: 詞表的大小"""super(Emdedings,self).__init()self.lut = nn.Embedding(vocab, d_model)self.d_model = d_modeldef forward(self, x):return self.lut(x) * math.sqrt(self.d_model)
  • 位置編碼器

    • 作用:因為在transformer的編碼器結(jié)構(gòu)中,并沒有對詞匯位置信息的處理,所以需要在embedding層后加入位置編碼器,將詞匯位置不同可能會產(chǎn)生不同語義的信息加入到詞嵌入張量中,以彌補位置信息的缺失

      • class PositionalEncoding(nn.Module):"""d_model: 詞嵌入的維度dropout: 置0比率max_len: 句子最大長度"""def __init__(self, d_model, dropout, max_len=5000):super(PositionalEncoding, self).__init__()self.dropout = nn.Dropout(p=dropout)# 初始化一個位置編碼矩陣,它是0陣,大小維max_len * d_modelpe = torch.zeros(max_len, d_model)# 絕對位置矩陣,詞匯的絕對位置就是用它的索引去表示position = torch.arange(0, max_len).unsqueeze(1)# 將位置信息加入到位置編碼矩陣中,將絕對位置矩陣有max_len*1變成max_len*d_model, 覆蓋原來的初始化位置編碼矩陣# 先需要一個1*d_model的變換矩陣div_term,其實div_term是一個1*d_model/2的矩陣div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(10000.)/d_model))# 位置編碼數(shù)值控制在-1,1之間有助于梯度下降pe[:, 0::2] = torch.sin(position*div_term)pe[:, 1::2] = torch.cos(position*div_term)# 現(xiàn)在pe是一個二維矩陣,embedded之前要擴展一個維度pe = pe.unsqueeze(0)# 將位置編碼矩陣注冊成模型的buffer,對模型效果有幫助,卻不是模型結(jié)構(gòu)中的超參數(shù),不需要隨著優(yōu)化步驟進行更新的增益對象# 注冊之后我們可以在模型保存后重加載時和模型結(jié)構(gòu)與參數(shù)一同加載self.register_buffer('pe', pe)def forward(self, x):# x.size(1),根據(jù)輸入句子的長度,截取pe的范圍print("位置編碼:", Variable(self.pe[:, :x.size(1)]).size())x = x + Variable(self.pe[:, :x.size(1)], requires_grad=False)return self.dropout(x)

2. 編碼器部分

  • 多頭注意力機制

    • 作用:多頭的本質(zhì)是多個獨立的attention計算,作為一個集成的作用,防止過擬合

      • # 注意力機制 def attention(query, key, value, mask=None, dropout=None):# 詞嵌入維度大小d_k = query.size(-1)# 計算注意力矩陣scorescores = torch.matmul(query, key.transpose(-2, -1)) / math.sqrt(d_k)# 判斷是否使用掩碼張量if mask:scores = scores.masked_fill(mask == 0, -1e9)# 對scores進行最后一維進行softmaxp_atten = F.softmax(scores, dim=-1)if dropout:p_atten = dropout(p_atten)return torch.matmul(p_atten, value), p_attendef clone(module, N):"""實現(xiàn)模型深拷貝:param module:要拷貝的目標(biāo)網(wǎng)絡(luò)層:param N: 拷貝數(shù)量"""return nn.ModuleList([copy.deepcopy(module) for _ in range(N)])class MultiHeadedAttention(nn.Module):"""多頭注意力機制head:頭數(shù)embedding_dim: 詞嵌入維度dropout: 置零率"""def __init__(self, head, embedding_dim, dropout=0.1):super(MultiHeadedAttention, self).__init__()self.head = headself.attn = Noneself.dropout = nn.Dropout(p=dropout)# 判斷head能否整除詞嵌入維度assert embedding_dim % head == 0self.d_k = embedding_dim // head# 4表示多頭注意力中Q,K,V各需要一個,最后拼接的矩陣還需要一個self.linears = clone(nn.Linear(embedding_dim, embedding_dim), 4)def forward(self, query, key, value, mask=None):if mask:mask = mask.unsqueeze(1)# 獲取batch size大小batch_size = query.size(0)# 多頭處理環(huán)節(jié), 將embedding.size變?yōu)閔ead.size * d_k.size# 對二、三維進行轉(zhuǎn)置操作,讓句子長度維度和詞向量維度能夠相鄰,這樣注意力機制才能找到詞義與句子的位置關(guān)系query, key, value = [model(x).view(batch_size, -1, self.head, self.d_k).transpose(1, 2) for model, x in zip(self.linears, (query, key, value))]# 接下來傳入attentionx, self.attn = attention(query, key, value, mask=mask, dropout=self.dropout)# 獲得每個頭計算結(jié)果組成的4維張量x = x.transpose(1, 2).contiguous().view(batch_size, -1, self.head*self.d_k)return self.linears[-1](x)
  • 前饋全連接層

    • 作用:考慮注意力機制擬合程度不夠,故意增加兩層網(wǎng)絡(luò)來增強模型的能力

      • class PositionWiseFeedForward(nn.Module):"""前饋全連接層d_model: 詞嵌入的維度d_ff: 全連接層維度"""def __init__(self, d_model, d_ff, dropout=0.1):super(PositionWiseFeedForward, self).__init__()self.fc1 = nn.Linear(d_model, d_ff)self.fc2 = nn.Linear(d_ff, d_model)self.dropout = nn.Dropout(p=dropout)def forward(self, x):return self.fc2(self.dropout(F.relu(self.fc1(x))))
  • 規(guī)范化層

    • 作用:有助于模型收斂,防止過擬合

      • class LayerNorm(nn.Module):"""數(shù)據(jù)規(guī)范化features: 詞嵌入的維度"""def __init__(self, features, eps=1e-6):super(LayerNorm, self).__init__()# nn.parameter代表模型參數(shù)self.a = nn.Parameter(torch.ones(features))self.b = nn.Parameter(torch.zeros(features))self.eps = epsdef forward(self, x):mean = x.mean(-1, keepdim=True)std = x.std(-1, keepdim=True)return self.a*(x-mean) / (std+self.eps) + self.b
  • 殘差連接

    • 作用:很好解決深度模型退化問題,同時使模型收斂更快,前后向傳播更加順暢

      • class sublayerConnection(nn.Module):"""子層殘差連接結(jié)構(gòu)size: 詞嵌入的維度"""def __init__(self, size, dropout=0.1):super(SublayerConnection, self).__init__()# 規(guī)范化層self.norm = LayerNorm(size)self.dropout = nn.Dropout(p=dropout)def forward(self, x, sublayer):return x + self.dropout(sublayer(self.norm(x)))
  • 編碼器層

    • 作用:作為編碼器組成部分,完成對輸入的特征提取

      • class EncoderLayer(nn.Module):"""編碼器size: 詞嵌入維度self_attn: 多頭自注意力機制feed_forward: 前饋全連接層dropout: 置零比例"""def __init__(self, size, self_attn, feed_forward, dropout):super(EncoderLayer, self).__init__()self.self_attn = self_attnself.feed_forward = feed_forwardself.size = size# 編碼器層有兩個殘差連接結(jié)構(gòu)self.sublayer = clone(SublayerConnection(size, dropout), 2)def forward(self, x, mask):x = self.sublayer[0](x, lambda x: self.self_attn(x, x, x, mask))return self.sublayer[1](x, self.feed_forward)
  • 編碼器

    • 作用:對輸入的特征提取,由若干個編碼層組成

      • class Encoder(nn.Module):"""實現(xiàn)編碼器encoder_layer: 編碼器層num_layer: 編碼器層的個數(shù)"""def __init__(self, encoder_layer, num_layer):super(Encoder, self).__init__()self.layers = clone(encoder_layer, num_layer)self.norm = LayerNorm(encoder_layer.size)def forward(self, x, mask):for layer in self.layers:x = layer(x, mask)return self.norm(x)

3. 解碼器部分

  • 解碼器層

    • 作用:根據(jù)給定的輸入向目標(biāo)進行特征提取

      • class DecoderLayer(nn.Module):"""解碼器層size: 詞嵌入的維度大小self_attn: 多頭自注意力機制src_attn: 多頭注意力機制feed_forward: 前饋神經(jīng)網(wǎng)絡(luò)"""def __init__(self, size, self_attn, src_attn, feed_forward, dropout):super(DecoderLayer, self).__init__()self.size = sizeself.self_attn = self_attnself.src_attn = src_attnself.feed_forward = feed_forwardself.dropout = dropoutself.sublayer = clone(SublayerConnection(size, dropout), 3)def forward(self, x, memory, source_mask, target_mask):"""x: 上一層輸出memory: 編碼器語義存儲變量source_mask: 源數(shù)據(jù)掩碼張量, 遮掩住對結(jié)果沒有意義的字符target_mask: 目標(biāo)數(shù)據(jù)掩碼張量,不希望模型利用后續(xù)信息"""m = memoryx = self.sublayer[0](x, lambda x: self.self_attn(x, x, x, target_mask))x = self.sublayer[1](x, lambda x: self.src_attn(x, m, m, source_mask))return self.sublayer[3](x, self.feed_forward)
  • 編碼器

    • 作用:提取encoder輸出的特征

      • class Decoder(nn.Module):"""解碼器decoder_layer: 解碼器層num_layer: 解碼器層個數(shù)"""def __init__(self, decoder_layer, num_layer):super(Decoder, self).__init__()self.layers = clone(decoder_layer, num_layer)self.norm = LayerNorm(decoder_layer.size)def forward(self, x, memory, source_mask, target_mask):for layer in self.layers:x = layer(x, memory, source_mask, target_mask)return self.norm(x)

4. 輸出部分

  • 輸出結(jié)構(gòu)

    • class Generator(nn.Module):"""輸出層結(jié)構(gòu)d_model: 詞嵌入維度vocab_size: 詞表大小"""def __init__(self, d_model, vocab_size):super(Generator, self).__init__()self.project = nn.Linear(d_model, vocab_size)def forward(self, x):return F.log_softmax(self.project(x), dim=-1)

總結(jié)

以上是生活随笔為你收集整理的详细分解Transformer各部件总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 激情网站视频 | 色人综合 | 午夜激情网站 | 亚洲精品字幕 | 男人久久天堂 | 天堂最新资源在线 | 精品一区二区三区四区五区 | 国内成人精品视频 | 国产99色| 新国产视频 | 日韩一区二区三区三四区视频在线观看 | 一区二区在线观看免费 | 人人看超碰 | 永久免费精品影视网站 | 红色假期黑色婚礼2 | 99在线观看免费视频 | 日韩欧美精品在线 | 99精品人妻少妇一区二区 | 国产av成人一区二区三区高清 | 精品无码一区二区三区 | 日韩欧美色图 | 国产精品手机在线 | 波多野结衣 一区 | 偷拍视频久久 | 伊人久久精品 | 校园春色 亚洲色图 | 日韩无套 | 亚洲乱妇老熟女爽到高潮的片 | 亚洲第一页av | 黄色大片一级片 | 亚洲国语| 老司机在线免费视频 | 日本综合久久 | 欧美日本综合 | www九色 | 国产三级视频网站 | 亚洲一区二区在线播放 | www,日韩 | 欧美精品系列 | 欧美另类videossexo高潮 | 国产一区导航 | 欧美一级淫片免费视频魅影视频 | 性视频免费看 | 中文字幕在线字幕中文 | 午夜一区二区三区在线 | 亚洲午夜av在线 | 成人av入口| 日韩第一色 | 免费动漫av | 在线尤物 | 日韩a级片在线观看 | 爱情岛论坛自拍亚洲品质极速最新章 | 香港三级日本三级韩国三级 | 91深夜福利| 欧美视频在线观看视频 | 免费激情网站 | 欧美成在线视频 | 国产成人午夜高潮毛片 | 肉肉av福利一精品导航 | 37p粉嫩大胆色噜噜噜 | 天天夜碰日日摸日日澡性色av | 国产伦精品一区二区三区高清版禁 | 华人永久免费 | 久久小草| 一区影视| 国产日韩欧美亚洲 | 精品自拍第一页 | 91免费看大片 | 三年中文在线观看中文版 | 国产三级按摩推拿按摩 | 日韩精品免费一区二区三区 | 熟妇高潮一区二区三区 | 亚洲不卡一区二区三区 | 夜色在线影院 | 日韩av高清在线观看 | h片在线观看视频 | 国产一线天粉嫩馒头极品av | 日本美女三级 | 三浦理惠子av在线播放 | www男人天堂 | 国产精品久久在线观看 | 成人av国产| 日韩亚洲精品在线 | 日韩乱淫 | 欧美成人综合在线 | 正在播放老肥熟妇露脸 | 夜间福利在线 | 亚洲影院av | 干美女视频 | 久久精品久久久精品美女 | 天天综合天天 | 日韩av在线免费观看 | 亚洲.www | 美女张开双腿让男人捅 | 探花一区 | 青青在线视频 | 久久久久国 | 亚洲一区在线观看视频 | 真人抽搐一进一出视频 |