僅僅使用pytorch來手撕transformer架構(3):編碼器模塊和編碼器類的實現和向前傳播

僅僅使用pytorch來手撕transformer架構(2):編碼器模塊和編碼器類的實現和向前傳播

往期文章:
僅僅使用pytorch來手撕transformer架構(1):位置編碼的類的實現和向前傳播

最適合小白入門的Transformer介紹

僅僅使用pytorch來手撕transformer架構(2):多頭注意力MultiHeadAttention類的實現和向前傳播

# Transformer 編碼器模塊
class TransformerBlock(nn.Module):def __init__(self, embed_size, heads, dropout, forward_expansion):super(TransformerBlock, self).__init__()self.attention = MultiHeadAttention(embed_size, heads)self.norm1 = nn.LayerNorm(embed_size)self.norm2 = nn.LayerNorm(embed_size)self.feed_forward = nn.Sequential(nn.Linear(embed_size, forward_expansion * embed_size),nn.ReLU(),nn.Linear(forward_expansion * embed_size, embed_size),)self.dropout = nn.Dropout(dropout)def forward(self, value, key, query, mask):attention = self.attention(value, key, query, mask)x = self.dropout(self.norm1(attention + query))forward = self.feed_forward(x)out = self.dropout(self.norm2(forward + x))return out# 編碼器
class Encoder(nn.Module):def __init__(self, src_vocab_size, embed_size, num_layers, heads, device, forward_expansion, dropout, max_length):super(Encoder, self).__init__()self.embed_size = embed_sizeself.device = deviceself.word_embedding = nn.Embedding(src_vocab_size, embed_size)self.position_embedding = PositionalEncoding(embed_size, dropout, max_length)self.layers = nn.ModuleList([TransformerBlock(embed_size,heads,dropout=dropout,forward_expansion=forward_expansion,)for _ in range(num_layers)])self.dropout = nn.Dropout(dropout)def forward(self, x, mask):N, seq_length = x.shapex = self.dropout(self.position_embedding(self.word_embedding(x)))for layer in self.layers:x = layer(x, x, x, mask)return x

1.編碼器模塊的實現

這段代碼實現了一個Transformer編碼器模塊(Transformer Block),它是Transformer架構的核心組件之一。Transformer架構是一種基于自注意力機制(Self-Attention)的深度學習模型,廣泛應用于自然語言處理(NLP)任務,如機器翻譯、文本生成等。以下是對代碼的詳細解釋:


1.1 類定義

class TransformerBlock(nn.Module):

TransformerBlock 是一個繼承自 PyTorch 的 nn.Module 的類,表示一個Transformer編碼器模塊。nn.Module 是 PyTorch 中所有神經網絡模塊的基類,用于定義和管理神經網絡的結構。


2.2 初始化方法

def __init__(self, embed_size, heads, dropout, forward_expansion):super(TransformerBlock, self).__init__()self.attention = MultiHeadAttention(embed_size, heads)self.norm1 = nn.LayerNorm(embed_size)self.norm2 = nn.LayerNorm(embed_size)self.feed_forward = nn.Sequential(nn.Linear(embed_size, forward_expansion * embed_size),nn.ReLU(),nn.Linear(forward_expansion * embed_size, embed_size),)self.dropout = nn.Dropout(dropout)
參數解釋
  • embed_size: 嵌入向量的維度,表示每個詞或標記(token)的特征維度。
  • heads: 多頭注意力機制中的頭數(Multi-Head Attention)。
  • dropout: Dropout比率,用于防止過擬合。
  • forward_expansion: 前饋網絡(Feed-Forward Network, FFN)中隱藏層的擴展因子。
組件解釋
  1. 多頭注意力機制(MultiHeadAttention

    self.attention = MultiHeadAttention(embed_size, heads)
    

    這是Transformer的核心部分,實現了多頭注意力機制。它允許模型在不同的表示子空間中學習信息。MultiHeadAttention 的具體實現沒有在這段代碼中給出,但通常它會將輸入分為多個“頭”,分別計算注意力權重,然后將結果拼接起來。

  2. 層歸一化(LayerNorm

    self.norm1 = nn.LayerNorm(embed_size)
    self.norm2 = nn.LayerNorm(embed_size)
    

    層歸一化(Layer Normalization)是一種歸一化方法,用于穩定訓練過程并加速收斂。它對每個樣本的特征進行歸一化,而不是像批量歸一化(Batch Normalization)那樣對整個批次進行歸一化。

  3. 前饋網絡(Feed-Forward Network

    self.feed_forward = nn.Sequential(nn.Linear(embed_size, forward_expansion * embed_size),nn.ReLU(),nn.Linear(forward_expansion * embed_size, embed_size),
    )
    

    前饋網絡是一個簡單的兩層全連接網絡。它的作用是進一步處理多頭注意力機制的輸出。forward_expansion 參數控制隱藏層的大小,通常設置為一個較大的值(如4),表示隱藏層的維度是輸入維度的4倍。

  4. Dropout

    self.dropout = nn.Dropout(dropout)
    

    Dropout 是一種正則化技術,通過隨機丟棄一部分神經元的輸出來防止過擬合。dropout 參數表示丟棄的概率。


3. 前向傳播方法

def forward(self, value, key, query, mask):attention = self.attention(value, key, query, mask)x = self.dropout(self.norm1(attention + query))forward = self.feed_forward(x)out = self.dropout(self.norm2(forward + x))return out
參數解釋
  • value: 值向量,用于計算注意力權重后的加權求和。
  • key: 鍵向量,用于計算注意力權重。
  • query: 查詢向量,用于計算注意力權重。
  • mask: 掩碼,用于防止某些位置的信息泄露(如在自注意力中屏蔽未來信息)。
流程解釋
  1. 多頭注意力

    attention = self.attention(value, key, query, mask)
    

    首先,使用多頭注意力機制計算注意力輸出。valuekeyquery 是輸入的三個部分,mask 用于控制哪些位置的信息可以被關注。

  2. 殘差連接與層歸一化

    x = self.dropout(self.norm1(attention + query))
    

    將注意力輸出與輸入的 query 進行殘差連接(attention + query),然后通過層歸一化(LayerNorm)。最后,應用 Dropout 防止過擬合。

  3. 前饋網絡

    forward = self.feed_forward(x)
    

    將經過歸一化的輸出傳遞到前饋網絡中進行進一步處理。

  4. 第二次殘差連接與層歸一化

    out = self.dropout(self.norm2(forward + x))
    

    將前饋網絡的輸出與之前的輸出 x 進行殘差連接,再次通過層歸一化和 Dropout。

  5. 返回結果

    return out
    

    最終返回處理后的輸出。


4. 總結

Transformer編碼器模塊,其核心包括:

  • 多頭注意力機制(MultiHeadAttention)。
  • 殘差連接(Residual Connection)。
  • 層歸一化(LayerNorm)。
  • 前饋網絡(Feed-Forward Network)。
  • Dropout 正則化。

這些組件共同作用,使得Transformer能夠高效地處理序列數據,并在許多NLP任務中取得了優異的性能。

2.編碼器的實現

這段代碼定義了一個完整的 Transformer 編碼器(Encoder),它是 Transformer 架構中的一個重要組成部分。編碼器的作用是將輸入序列(如源語言文本)轉換為上下文表示,這些表示可以被解碼器(Decoder)用于生成目標序列(如目標語言文本)。以下是對代碼的詳細解釋:


1. 類定義

class Encoder(nn.Module):

Encoder 是一個繼承自 PyTorch 的 nn.Module 的類,用于定義 Transformer 編碼器的結構。nn.Module 是 PyTorch 中所有神經網絡模塊的基類,用于定義和管理神經網絡的結構。


2. 初始化方法

def __init__(self, src_vocab_size, embed_size, num_layers, heads, device, forward_expansion, dropout, max_length):super(Encoder, self).__init__()self.embed_size = embed_sizeself.device = deviceself.word_embedding = nn.Embedding(src_vocab_size, embed_size)self.position_embedding = PositionalEncoding(embed_size, dropout, max_length)self.layers = nn.ModuleList([TransformerBlock(embed_size,heads,dropout=dropout,forward_expansion=forward_expansion,)for _ in range(num_layers)])self.dropout = nn.Dropout(dropout)
參數解釋
  • src_vocab_size: 源語言詞匯表的大小,即輸入序列中可能的標記(token)數量。
  • embed_size: 嵌入向量的維度,表示每個詞或標記的特征維度。
  • num_layers: 編碼器中 Transformer 塊(TransformerBlock)的數量。
  • heads: 多頭注意力機制中的頭數。
  • device: 運行設備(如 CPU 或 GPU)。
  • forward_expansion: 前饋網絡(FFN)中隱藏層的擴展因子。
  • dropout: Dropout 比率,用于防止過擬合。
  • max_length: 輸入序列的最大長度,用于位置編碼。
組件解釋
  1. 詞嵌入(word_embedding

    self.word_embedding = nn.Embedding(src_vocab_size, embed_size)
    

    詞嵌入層將輸入的標記(token)索引映射為固定維度的嵌入向量。src_vocab_size 是詞匯表的大小,embed_size 是嵌入向量的維度。

  2. 位置編碼(position_embedding

    self.position_embedding = PositionalEncoding(embed_size, dropout, max_length)
    

    位置編碼層用于為每個標記添加位置信息,使得模型能夠捕捉序列中的順序關系。PositionalEncoding 的具體實現沒有在這段代碼中給出,但通常它會根據標記的位置生成一個固定維度的向量,并將其與詞嵌入相加。

  3. Transformer 塊(TransformerBlock

    self.layers = nn.ModuleList([TransformerBlock(embed_size,heads,dropout=dropout,forward_expansion=forward_expansion,)for _ in range(num_layers)]
    )
    

    編碼器由多個 Transformer 塊組成。每個 Transformer 塊包含多頭注意力機制和前饋網絡。num_layers 表示 Transformer 塊的數量。

  4. Dropout

    self.dropout = nn.Dropout(dropout)
    

    Dropout 是一種正則化技術,通過隨機丟棄一部分神經元的輸出來防止過擬合。dropout 參數表示丟棄的概率。


3. 前向傳播方法

def forward(self, x, mask):N, seq_length = x.shapex = self.dropout(self.position_embedding(self.word_embedding(x)))for layer in self.layers:x = layer(x, x, x, mask)return x
參數解釋
  • x: 輸入序列,形狀為 (N, seq_length),其中 N 是批次大小,seq_length 是序列長度。
  • mask: 掩碼,用于防止某些位置的信息泄露(如在自注意力中屏蔽未來信息)。
流程解釋
  1. 詞嵌入與位置編碼

    x = self.dropout(self.position_embedding(self.word_embedding(x)))
    
    • 首先,將輸入序列 x 通過詞嵌入層(word_embedding)得到嵌入向量。
    • 然后,將嵌入向量與位置編碼(position_embedding)相加,為每個標記添加位置信息。
    • 最后,應用 Dropout 防止過擬合。
  2. 逐層傳遞

    for layer in self.layers:x = layer(x, x, x, mask)
    
    • 輸入序列 x 逐層傳遞到每個 Transformer 塊中。在每個塊中:
      • valuekeyquery 都是 x,因為這是自注意力機制(Self-Attention)。
      • mask 用于控制哪些位置的信息可以被關注。
    • 每個 Transformer 塊的輸出會作為下一層的輸入。
  3. 返回結果

    return x
    
    • 最終返回編碼器的輸出,形狀為 (N, seq_length, embed_size),表示每個位置的上下文表示。

4. 總結

Transformer 編碼器,其主要功能包括:

  1. 詞嵌入與位置編碼:將輸入標記轉換為嵌入向量,并添加位置信息。
  2. 多層 Transformer 塊:通過多頭注意力機制和前饋網絡逐層處理輸入序列。
  3. 掩碼機制:通過掩碼控制注意力的范圍,避免信息泄露。
  4. Dropout 正則化:防止過擬合。

編碼器的輸出是一個上下文表示,可以被解碼器用于生成目標序列。這種架構在機器翻譯、文本生成等任務中表現出色。

作者碼字不易,覺得有用的話不妨點個贊吧,關注我,持續為您更新AI的優質內容。

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

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

相關文章

《OpenCV》—— dlib(換臉操作)

文章目錄 dlib換臉介紹仿射變換在 dlib 換臉中的應用 換臉操作 dlib換臉介紹 dlib 換臉是基于 dlib 庫實現的一種人臉替換技術,以下是關于它的詳細介紹: 原理 人臉檢測:dlib 庫中包含先進的人臉檢測器,如基于 HOG(方向…

機器學習中的梯度下降是什么意思?

梯度下降(Gradient Descent)是機器學習中一種常用的優化算法,用于最小化損失函數(Loss Function)。通過迭代調整模型參數,梯度下降幫助模型逐步逼近最優解,從而提升模型的性能。 1.核心思想 梯…

三、Docker 集群管理與應用

(一)項目案例 1、準備主機 (1)關閉防火墻,或者開放TCP端口2377(用于集群管理通信)、TCP/UPD端口7946(用于節點之間的通信)、UDP端口4789(用于overlay網絡流…

網絡DNS怎么更改?

訪問速度慢或某些網站無法打開?改變網絡DNS設置可能會幫助解決這些問題。本文將詳細介紹如何更改網絡DNS,包括更改的原因、具體步驟。 一、為什么要更改DNS? 更改DNS的原因有很多,以下是一些主要的考慮因素:某些公共DNS服務器的響應速度比…

江科大51單片機筆記【12】DS18B20溫度傳感器(上)

寫在前言 此為博主自學江科大51單片機(B站)的筆記,方便后續重溫知識 在后面的章節中,為了防止篇幅過長和易于查找,我把一個小節分成兩部分來發,上章節主要是關于本節課的硬件介紹、電路圖、原理圖等理論…

基于springboot+vue的佳途旅行分享預約平臺

一、系統架構 前端:vue2 | element-ui | html 后端:springboot | mybatis-plus 環境:jdk1.8 | mysql | maven | node 二、代碼及數據庫 三、功能介紹 01. web端-注冊 02. web端-登錄 03. web端-系統主頁1 04. web端-系統主頁2 05. we…

【數據結構】2算法及分析

0 章節 1.4到1.5小節。 掌握算法概念、特性、描述、算法性能時間復雜度和空間復雜度; 理解遞歸含義? 掌握實現遞歸的條件和時機; 應用簡單遞歸問題的算法設計; 重點 算法…

【一起學Rust | Tauri2.0框架】基于 Rust 與 Tauri 2.0 框架實現軟件開機自啟

文章目錄 前言 一、準備工作1.1 環境搭建1.2 創建 Tauri 項目1.3 添加依賴 二、實現開機自啟的基本原理2.1 開機自啟的基本概念2.2 Tauri 應用的生命周期 三、Windows 平臺實現3.1 Windows 注冊表機制3.2 實現步驟3.3 注意事項 四、Linux 平臺實現4.1 Linux systemd 服務4.2 實…

一周熱點-OpenAI 推出了 GPT-4.5,這可能是其最后一個非推理模型

在人工智能領域,大型語言模型一直是研究的熱點。OpenAI 的 GPT 系列模型在自然語言處理方面取得了顯著成就。GPT-4.5 是 OpenAI 在這一領域的又一力作,它在多個方面進行了升級和優化。 1 新模型的出現 GPT-4.5 目前作為研究預覽版發布。與 OpenAI 最近的 o1 和 o3 模型不同,…

css中的浮動

在 CSS 中,浮動(float)是一種定位元素的方式,它允許元素脫離正常的文檔流,并向左或向右移動,直到其邊緣碰到包含塊或者另一個浮動元素的邊緣。下面從多個方面詳細介紹 CSS 浮動: 一&#xff0c…

element-plus中form表單組件的使用

1.如何讓每個表單項對齊? 問題描述:如下圖,每個表單項的輸入框/下拉框/日期選擇器是沒有對齊的,我們希望它們縱向是對齊的。 解決方案:給el-form標簽,加上label-width"100px"即可。意思就是給每個…

線性搜索算法

何時使用線性搜索算法? 當處理一個小數據集時。當搜索存儲在連續內存中的數據集時。 線性搜索算法在什么情況下優于其他搜索算法? 當列表或數組未排序時,或者當輸入的大小相對較小時,首選線性搜索算法。它易于實現,并…

踩坑記錄:yolov5環境版本要求比較嚴苛?

在安裝yolov5環境時,numpy安裝失敗報錯metadata-generation-failed 報錯如下: Collecting numpy1.18.5 (from -r /*****/yolov5-5.0/requirements.txt (line 5))Using cached https://pypi.tuna.tsinghua.edu.cn/packages/01/1b/d3ddcabd5817be02df0e6…

Java設計模式系列:單例模式的7種實現與適用場景

一、單例模式核心價值與實現原則 1. 使用場景 全局配置類(如數據庫連接池)日志記錄器Spring默認Bean作用域硬件設備訪問(如打印機)2. 設計三原則 私有構造器:禁止外部實例化靜態實例持有:全局唯一訪問點延遲加載(可選):避免資源浪費二、七種單例實現方式深度解析 1.…

OpenManus-通過源碼方式本地運行OpenManus,含踩坑及處理方案,chrome.exe位置修改

前言:最近 Manus 火得一塌糊涂啊,OpenManus 也一夜之間爆火,那么作為程序員應該來嘗嘗鮮 1、前期準備 FastGithub:如果有科學上網且能正常訪問 github 則不需要下載此軟件,此軟件是提供國內直接訪問 githubGit&#…

【最新】DeepSeek 實用集成工具有那些?

deepseek 系列github倉庫地址 【主頁】deepseek-aiDeepSeek-R1DeepSeek-V3DeepSeek-VL2【本文重點介紹】awesome-deepseek-integration 注意:以下內容來自awesome-deepseek-integration DeepSeek 實用集成(awesome-deepseek-integration) 將…

開源!速度100Kb/s的有線和無線雙模ESP32S3芯片的DAP-Link調試器

開源!速度100Kb/s的有線和無線雙模ESP32S3芯片的DAP-Link調試器 目錄 開源!速度100Kb/s的有線和無線雙模ESP32S3芯片的DAP-Link調試器本項目未經授權,禁止商用!本項目未經授權,禁止商用!本項目未經授權&…

Flink測試環境Standalone模式部署實踐

1.JDK環境 參考官方文檔: https://nightlies.apache.org/flink/flink-docs-release-1.20/release-notes/flink-1.18/ 2.下載Flink:https://flink.apache.org/downloads/ 本次驗證用的是:https://www.apache.org/dyn/closer.lua/flink/flink…

在16卡服務器上使用最新版的CUDA和驅動訓練`llama - 2 - 7b`和`llama - 2 - 70b`模型,并生成訓練指標數據

要在16卡服務器上使用最新版的CUDA和驅動訓練llama - 2 - 7b和llama - 2 - 70b模型,并生成訓練指標數據,你可以按照以下步驟進行: 1. 環境準備 確保你的服務器已經安裝了最新版的CUDA和驅動,并且安裝了必要的Python庫&#xff0…

macOS 終端優化

macOS 安裝、優化、還原、升級 Oh My Zsh 完全指南 🚀 Oh My Zsh 是 macOS 終端增強的利器,它能提供強大的自動補全、主題定制和插件支持,讓你的終端更高效、更炫酷。本文將全面介紹 如何安裝、優化、還原、重新安裝和升級 Oh My Zsh&#x…