【學習筆記】2.2 Encoder-Decoder

參考資料:https://github.com/datawhalechina/happy-llm?

在 Transformer 中,使用注意力機制的是其兩個核心組件——Encoder(編碼器)和 Decoder(解碼器)。

2.2.1 Seq2Seq 模型

Seq2Seq(序列到序列) 是一種經典的自然語言處理(NLP)任務,其目標是將一個自然語言序列 input = (x_1, x_2, x_3...x_n)映射到另一個可能不等長的自然語言序列 output?=?(y_1,?y_2,?y_3...y_m)。Seq2Seq 是 NLP 中最通用的任務形式,幾乎所有 NLP 任務都可以視為 Seq2Seq 的特例,例如:

  • 文本分類:輸出長度為 1 的目標序列(m=1)。

  • 詞性標注:輸出與輸入序列等長的目標序列(m=n)。

  • 機器翻譯:輸入和輸出序列長度可能不同,例如將中文句子“今天天氣真好”翻譯為英文句子“Today is a good day.”。

Seq2Seq 的一般思路:
  1. 編碼(Encoding)

    • 將輸入的自然語言序列通過隱藏層編碼成能夠表征語義的向量(或矩陣),可以理解為更復雜的詞向量表示。

  2. 解碼(Decoding)

    • 將編碼得到的向量或矩陣通過隱藏層輸出,再解碼成對應的自然語言目標序列。

Transformer 模型:

Transformer 是一個經典的 Seq2Seq 模型,最初被應用于機器翻譯任務。它由 Encoder(編碼器)Decoder(解碼器) 組成,具體結構如下:

  • Encoder

    • 包含多個(通常是 6 個)Encoder Layer。

    • 輸入源序列進入 Encoder 進行編碼,編碼結果輸出給 Decoder。

  • Decoder

    • 包含多個(通常是 6 個)Decoder Layer。

    • 接收 Encoder 的編碼結果,并逐步解碼生成目標序列。

Encoder 和 Decoder 內部傳統神經網絡的經典結構有:前饋神經網絡(FNN)、層歸一化(Layer Norm)和殘差連接(Residual Connection)。

2.2.2 前饋神經網絡

前饋神經網絡(Feed Forward Neural Network,FFN)?是一種簡單的全連接網絡結構,用于對輸入數據進行非線性變換。

FFN 的結構:
  1. 兩個線性層

    • 輸入經過第一個線性層(全連接層)進行變換。

    • 輸出再經過第二個線性層進行進一步變換。

  2. ReLU 激活函數

    • 在兩個線性層之間加入 ReLU 激活函數,引入非線性。

    • ReLU 激活函數的公式為:ReLU(x)=max(0,x)。

  3. Dropout 層

    • 在 FFN 的輸出后加入 Dropout 層,用于防止過擬合。

    • Dropout 通過隨機丟棄一部分神經元的輸出,增強模型的泛化能力。

class MLP(nn.Module):'''前饋神經網絡'''def __init__(self, dim: int, hidden_dim: int, dropout: float):super().__init__()# 定義第一層線性變換,從輸入維度到隱藏維度self.w1 = nn.Linear(dim, hidden_dim, bias=False)# 定義第二層線性變換,從隱藏維度到輸入維度self.w2 = nn.Linear(hidden_dim, dim, bias=False)# 定義dropout層,用于防止過擬合self.dropout = nn.Dropout(dropout)def forward(self, x):# 前向傳播函數# 首先,輸入x通過第一層線性變換和RELU激活函數# 然后,結果乘以輸入x通過第三層線性變換的結果# 最后,通過第二層線性變換和dropout層return self.dropout(self.w2(F.relu(self.w1(x))))

2.2.3 層歸一化

層歸一化(Layer Norm) 是一種深度學習中的歸一化操作,目的是讓不同層的輸入分布更加一致,從而穩定訓練過程并提高模型性能。它與批歸一化(Batch Norm)的主要區別在于統計量的計算方式。

歸一化的必要性
  1. 梯度爆炸/消失問題

    • 深度神經網絡中,每一層的輸入是上一層的輸出,隨著層數增加,輸入分布可能因參數變化而發生較大改變。

    • 這種分布變化會導致梯度不穩定,影響模型的收斂速度和性能。

  2. 預測誤差

    • 預測的條件分布始終相同,但各層輸出分布不同,導致預測誤差增大。

批歸一化(Batch Norm)的局限性
  1. 小批量(mini-batch)問題

    • 當 mini-batch 較小時,計算的均值和方差不能反映全局統計分布,導致效果變差。

  2. 時間維度問題

    • 對于 RNN,不同句子的同一時間步分布可能不同,Batch Norm 的歸一化失去意義。

  3. 訓練與測試不一致

    • 訓練時需要保存每個 step 的統計信息,測試時可能出現比訓練集更長的句子,導致統計量缺失。

  4. 計算開銷

    • 每個 step 都需要保存和計算 batch 統計量,耗時且耗力。

代碼實現:

class LayerNorm(nn.Module):''' Layer Norm 層'''def __init__(self, features, eps=1e-6):super(LayerNorm, self).__init__()# 線性矩陣做映射self.a_2 = nn.Parameter(torch.ones(features))self.b_2 = nn.Parameter(torch.zeros(features))self.eps = epsdef forward(self, x):# 在統計每個樣本所有維度的值,求均值和方差mean = x.mean(-1, keepdim=True) # mean: [bsz, max_len, 1]std = x.std(-1, keepdim=True) # std: [bsz, max_len, 1]# 注意這里也在最后一個維度發生了廣播return self.a_2 * (x - mean) / (std + self.eps) + self.b_2

2.2.4 殘差連接

在 Transformer 模型中,殘差連接被廣泛應用于每個子層(如多頭自注意力層和前饋神經網絡層)。其主要作用是:

  1. 避免梯度消失:允許梯度直接回傳到更深層,減少梯度消失問題。

  2. 增強信息流動:讓高層專注于學習輸入與輸出之間的殘差,而不是直接學習輸出。

  3. 提高訓練效率:通過直接傳遞輸入,減少深層網絡的訓練難度。

Transformer 中的實現

在 Transformer 的 Encoder 和 Decoder 中,每個子層的輸出不僅包括上一層的輸出,還包括上一層的輸入。具體公式如下:

  1. 多頭自注意力層

    x = x + MultiHeadSelfAttention(LayerNorm(x))
    • 輸入 x 首先經過層歸一化(LayerNorm)。

    • 然后通過多頭自注意力層(MultiHeadSelfAttention)。

    • 最后將注意力層的輸出與原始輸入 x 相加,形成殘差連接。

  2. 前饋神經網絡層

    output = x + FNN(LayerNorm(x))
    • 輸入 x 首先經過層歸一化(LayerNorm)。

    • 然后通過前饋神經網絡(FNN)。

    • 最后將 FNN 的輸出與原始輸入 x 相加,形成殘差連接。

代碼實現
# 注意力計算
h = x + self.attention.forward(self.attention_norm(x))
# 經過前饋神經網絡
out = h + self.feed_forward.forward(self.fnn_norm(h))

2.2.5 Encoder

Transformer 的 Encoder 是由多個 Encoder Layer 組成的模塊,每個 Encoder Layer 包含兩個主要部分:

  1. 多頭自注意力層(Multi-Head Attention)

    • 用于捕捉輸入序列內部的依賴關系。

  2. 前饋神經網絡(Feed Forward Network,FFN)

    • 用于對自注意力層的輸出進行非線性變換。

每個子層(多頭自注意力層和前饋神經網絡層)都使用 殘差連接層歸一化(Layer Norm)

Encoder Layer 的實現
class EncoderLayer(nn.Module):'''Encoder層'''def __init__(self, args):super().__init__()# 一個 Layer 中有兩個 LayerNorm,分別在 Attention 之前和 MLP 之前self.attention_norm = LayerNorm(args.n_embd)# Encoder 不需要掩碼,傳入 is_causal=Falseself.attention = MultiHeadAttention(args, is_causal=False)self.fnn_norm = LayerNorm(args.n_embd)self.feed_forward = MLP(args)def forward(self, x):# Layer Normnorm_x = self.attention_norm(x)# 自注意力h = x + self.attention.forward(norm_x, norm_x, norm_x)# 經過前饋神經網絡out = h + self.feed_forward.forward(self.fnn_norm(h))return out
  • 輸入x 是輸入序列的嵌入表示。

  • 層歸一化:在多頭自注意力層和前饋神經網絡之前分別應用層歸一化。

  • 殘差連接:每個子層的輸出加上原始輸入,形成殘差連接。

  • 多頭自注意力self.attention 對歸一化后的輸入進行自注意力計算。

  • 前饋神經網絡self.feed_forward 對歸一化后的輸入進行非線性變換。

Encoder 的實現

整個 Encoder 由多個 Encoder Layer 組成,并在最后加入一個 Layer Norm 實現規范化:

class Encoder(nn.Module):'''Encoder 塊'''def __init__(self, args):super(Encoder, self).__init__() # 一個 Encoder 由 N 個 Encoder Layer 組成self.layers = nn.ModuleList([EncoderLayer(args) for _ in range(args.n_layer)])self.norm = LayerNorm(args.n_embd)def forward(self, x):"分別通過 N 層 Encoder Layer"for layer in self.layers:x = layer(x)return self.norm(x)
  • 輸入x 是輸入序列的嵌入表示。

  • 多層 Encoder Layer:輸入依次通過每個 Encoder Layer。

  • 最終層歸一化:在所有 Encoder Layer 之后,對輸出進行一次層歸一化。

輸出

通過 Encoder 的輸出是輸入序列編碼后的結果,可以用于后續的解碼器(Decoder)或其他任務。

2.2.6 Decoder

Transformer 的 Decoder 由多個 Decoder Layer 組成,每個 Decoder Layer 包含三個主要部分:

  1. 掩碼自注意力層(Masked Multi-Head Attention)

    • 使用掩碼(Mask)確保每個 token 只能使用該 token 之前的注意力分數。

  2. 多頭注意力層(Multi-Head Attention)

    • 使用 Encoder 的輸出作為 Key 和 Value,當前 Decoder 的輸出作為 Query,計算注意力分數。

  3. 前饋神經網絡(Feed Forward Network,FFN)

    • 對多頭注意力層的輸出進行非線性變換。

每個子層(掩碼自注意力層、多頭注意力層和前饋神經網絡層)都使用 殘差連接層歸一化(Layer Norm)

Decoder Layer 的實現
class DecoderLayer(nn.Module):'''解碼層'''def __init__(self, args):super().__init__()# 一個 Layer 中有三個 LayerNorm,分別在 Mask Attention 之前、Self Attention 之前和 MLP 之前self.attention_norm_1 = LayerNorm(args.n_embd)# Decoder 的第一個部分是 Mask Attention,傳入 is_causal=Trueself.mask_attention = MultiHeadAttention(args, is_causal=True)self.attention_norm_2 = LayerNorm(args.n_embd)# Decoder 的第二個部分是 類似于 Encoder 的 Attention,傳入 is_causal=Falseself.attention = MultiHeadAttention(args, is_causal=False)self.ffn_norm = LayerNorm(args.n_embd)# 第三個部分是 MLPself.feed_forward = MLP(args)def forward(self, x, enc_out):# Layer Normnorm_x = self.attention_norm_1(x)# 掩碼自注意力x = x + self.mask_attention.forward(norm_x, norm_x, norm_x)# 多頭注意力norm_x = self.attention_norm_2(x)h = x + self.attention.forward(norm_x, enc_out, enc_out)# 經過前饋神經網絡out = h + self.feed_forward.forward(self.fnn_norm(h))return out
  • 輸入

    • x 是 Decoder 的輸入序列的嵌入表示。

    • enc_out 是 Encoder 的輸出。

  • 多層 Decoder Layer:輸入依次通過每個 Decoder Layer。

  • 最終層歸一化:在所有 Decoder Layer 之后,對輸出進行一次層歸一化。

完整的 Transformer 模型

將 Encoder 和 Decoder 拼接起來,再加入 Embedding 層,就可以搭建出完整的 Transformer 模型:

class Decoder(nn.Module):'''解碼器'''def __init__(self, args):super(Decoder, self).__init__() # 一個 Decoder 由 N 個 Decoder Layer 組成self.layers = nn.ModuleList([DecoderLayer(args) for _ in range(args.n_layer)])self.norm = LayerNorm(args.n_embd)def forward(self, x, enc_out):"Pass the input (and mask) through each layer in turn."for layer in self.layers:x = layer(x, enc_out)return self.norm(x)

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

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

相關文章

# 材料力學押題

材料力學押題 文章目錄 材料力學押題第一題第二題組合變形彎曲變形 第一題 Q 求力作用的銷釘位置的豎直偏移距離。 S 方法一:能量方法 材料應變能計算為: U ∫ 內力 2 2 剛度 d A U\int \frac{\text{內力}^2}{2\times 剛度}\text{d}A U∫2剛度內力2?dA 克拉珀龍原理&…

uniapp項目之小兔鮮兒小程序商城(一) 項目介紹,技術棧,小程序的基礎架構,封裝攔截器和請求函數

文章目錄 一.項目介紹和前置內容1.重要鏈接2.技術棧 二.創建uniapp項目1.使用HBuilderX創建2.使用命令行創建3.如何使用vscode開發uniapp項目?step1:把項目拉入vscode,開始下相關插件step2:ts類型校驗step3:設置json文件可以允許注釋 4.pages.json文件的作用是什么?5.示例:在…

Uniapp H5端SEO優化全攻略:提升搜索引擎排名與流量

在移動互聯網時代,H5頁面因其跨平臺、低成本、易傳播的特性,成為許多企業的首選。Uniapp作為一款優秀的前端跨端開發框架,能夠快速開發H5、小程序、App等多端應用。然而,由于Uniapp默認采用SPA(單頁應用)架…

一[3.3]、ubuntu18.04環境 利用 yolov8 實現列車軌道檢測,并提取正確的軌道線【全網最詳細】

一、參考文獻 https://blog.csdn.net/u010117029/category_12977729.html 一[3.2]、ubuntu18.04環境 利用 yolov8 訓練開源列車數據集,并實現列車軌道檢測【全網最詳細】-CSDN博客 火車軌道鐵路軌道檢測識別(附帶Python源碼+詳細解析)_軌道點云提取鐵軌代碼-CSDN博客

pp-ocrv5中的改進-跨階段特征融合(CSP-PAN)以及在 Neck 部分引入 CSP-PAN后為何就能解決小文本漏檢問題?

好的,我們來詳細解析一下 PP-OCRv5 中的**跨階段特征融合(CSP-PAN)**改進,以及它如何有效解決小文本漏檢問題。 背景:PP-OCR 的 Neck 部分與 PAN 在 PP-OCRv3 及之前的版本中,Neck 部分使用的是標準的 **…

【數據分析四:Data Preprocessing】數據預處理

一、數據預處理 直接收集的數據通常是“臟的”: 不完整、不準確、不一致 數據預處理是進行大數據的分析和挖掘的工作中占工作量最大的一個步驟(80%) 二、處理缺失值 處理缺失數據的方法:首先確認缺失數據的影響 數據刪除&#x…

一起來入門深度學習知識體系

前言 什么是深度學習?它有什么魔力? 想象一個機器人能識別人臉、寫詩、翻譯語言、甚至和你聊天。它是怎么學會這些能力的?答案正是——深度學習(Deep Learning)。 簡單來說,深度學習就像是教會一臺計算機…

Prompt+Agent+LLM:半導體爐管設備健康評估的落地實戰

引言 在高端制造業的核心場景中,設備健康管理正面臨前所未有的挑戰。以半導體制造為例,一臺價值數百萬美元的爐管設備意外停機,可能導致整條產線癱瘓、晶圓批次報廢,單日損失可達千萬級。傳統基于閾值規則的監控系統難以捕捉早期…

PostgreSQL的擴展bloom

PostgreSQL的擴展bloom 一、擴展概述 bloom 是 PostgreSQL 提供的一個基于**布隆過濾器(Bloom Filter)**的索引擴展,特別適合多列任意組合查詢的優化場景。 二、核心特性 特性描述優勢多列索引單索引支持多列組合減少索引數量模糊匹配高效處理和IN查詢優于B-tre…

算法與數據結構學習之旅:從入門到進階

在計算機科學的浩瀚宇宙中,算法與數據結構如同閃耀的恒星,驅動著整個程序世界的運轉。無論是手機上流暢運行的 APP,還是搜索引擎瞬間返回的海量結果,背后都離不開算法與數據結構的精妙設計。對于想要深入探索計算機領域的開發者和…

C++map和set類(簡介)

文章目錄 一、關聯式容器二、鍵值對三、樹形結構的關聯式容器3.1 set類的簡介3.2 set的接口3.2.1 set的模版參數列表3.2.2 set的構造3.2.3 set的迭代器3.2.4 set的容量3.2.5 set的修改操作 3.3 set的使用案例3.4 multiset類的介紹3.5 multiset的使用案例3.6 map類的簡介3.7 map…

圓柱電池自動化升級:面墊機如何破解生產痛點?

在圓柱電池的生產流程中,面墊(絕緣墊片)的安裝是保障電池安全與性能的關鍵環節。傳統手工操作不僅效率低,還容易出現面墊偏移、漏貼等問題,影響產品一致性。圓柱電池自動面墊機的出現,通過自動化技術解決了…

【AI Study】第四天,Pandas(1)- 基礎知識

文章概要 本文詳細介紹 Pandas 庫的基礎知識,包括: Pandas 的基本概念和特點安裝和配置方法核心數據結構(Series 和 DataFrame)各種數據類型的處理方法實際應用示例 什么是 Pandas Pandas 是 Python 中最流行的數據分析庫之一…

重構氣血經絡的數學模型:氣血經絡級聯控制系統核心方程

從融智學視域,重構氣血經絡的數學模型 摘要: 融智學視域,通過三元耦合框架,重構氣血經絡模型,建立跨學科認知體系。五大分支協同運作:數學融智學構建纖維叢模型,邏輯融智學建立防歧義語義網&…

python爬蟲:某網站價格數字加密破解

文章目錄 前言一、案例二、破解流程1.原理2.找到woff文件3.分析woff文件4.代碼實現1.轉化woff文件2.繪圖并ocr識別3.映射數據 三、總結 前言 有時我們在進行網頁抓取采集數據時,有些重要的數據比如說價格,數量等信息會進行加密,通過復制或者簡單的采集是…

DigitalOcean 攜手 AMD 推出 AMD Instinct? MI300X GPU Droplet,加速 AI 創新

近日,DigitalOcean(NYS:DOCN)作為全球最簡單易用的可擴展云平臺,宣布與 AMD 建立合作,為 DigitalOcean 客戶提供 AMD Instinct? GPU,以 AMD Instinct? MI300X GPU Droplet 的形式支持其 AI 工作負載。此舉…

小白暢通Linux之旅-----DNS項目實戰配置

目錄 一、項目要求 1、正反向解析配置 2、主從配置 二、腳本編寫配置 1、主服務器腳本編寫 2、從服務器腳本編寫 三、項目檢測 1、正反向解析檢測 (1)主服務器腳本啟動 (2)測試主機配置 (3)正反…

Codigger:探索數字工作新架構

在軟件開發與數字工作領域,技術迭代的腳步從未停歇,開發者和系統管理員都在尋找更高效的工具和平臺。Codigger 作為一項創新技術成果,憑借其獨特的定位和架構,在行業內逐漸嶄露頭角。 Codigger “分布式操作系統”,它…

微信中 qrcode 生成二維碼長按無效果的解決方案

引言 我們先來看這樣一段代碼 <divid"qrcode"ref"qrcode"class"bind-code-img"style"height: 180px;width: 180px;margin-top: 22px;display: none; "></div> new QRCode("qrcode", {width: 210,height: 210,t…

《網絡安全與防護》作業復習

填空題 1. 網絡數據庫與數據安全專項作業 填空題解析&#xff1a; 數據庫安全的“三大核心目標”是 完整性&#xff1b;保密性&#xff1b;可用性 解釋&#xff1a;數據庫安全的三個核心目標是確保數據的完整性、保密性以及可用性&#xff0c;即保護數據不被篡改、未經授權訪…