從零開始大模型之實現GPT模型

從零開始大模型之從頭實現GPT模型

  • 1.大語言模型整體架構
  • 2 大語言的Transformer模塊
    • 2.1 層歸一化
    • 2.2 GELU激活函數
    • 2.3 前饋神經網絡
    • 2.4 快捷連接
  • 3 附錄
    • 3.1 anaconda+python環境搭建

在這里插入圖片描述
1.數據預處理:原始數據進行詞元化,以及通過,依據詞匯表生成ID編號,對ID編號隨機生成嵌入向量,特別注意的是嵌入向量事實上也是一個權重,通過反向傳播進行更新。

2.掩碼多頭注意力機制:增加掩碼多頭注意力機制,其中增加掩碼機制是為了確定序列的輸出的因果關系,多頭注意力機制是為了對不同路徑的來源數據進行上下文聯系。

3.LLM架構transform塊:進行層歸一化,GELU激活函數,前饋神經網絡,快捷連接。

1.大語言模型整體架構

在這里插入圖片描述
數據預處理,掩碼多頭注意力機制已經學過了,接下來進行最重要的LLM架構的transform塊的學習。
#1 Transform塊總體概述
整個transform塊包含以下內容,層歸一化,GELU激活函數,前饋神經網絡,快捷連接等等。
在這里插入圖片描述

2 大語言的Transformer模塊

2.1 層歸一化

層歸一化是為了調整神經網絡的輸出,讓其均值為0,方差為1。目的是為了神經網絡更加穩定。具體做法是依據以下的數學公式,對emb_dim維度上進行μ=x?μσ\mu=\frac{x-\mu}{\sigma}μ=σx?μ?,最終能夠對該維度嵌入向量進行歸一化,最后再加上動態可訓練參數縮放和平移。

#%% 層歸一化
import torch #導入torch包 類似于一個目錄,包含了__init__.py以及其他模塊的py文件或者其他子包
import torch.nn as nn # 導入torch包中的nn模塊 一個模塊就是一個.py文件,一個py文件下有函數以及類
torch.manual_seed(123) #固定隨機種子
batch_example = torch.randn(2,5) #隨機生成兩行五列的張量,然后每行是均值為0,方差為1的正態分布
print("batch_example,隨機生成的輸入為:",batch_example)
layer = nn.Sequential(nn.Linear(5,6),nn.ReLU()) # 容器類裝有神經網絡類,并通過序列連接,輸入連輸出,輸出也是一個神經網絡模塊
out = layer(batch_example)
print("自定義的神經網絡結構的輸出為:",out)
mean = out.mean(dim=-1,keepdim=True) #按照列的方向進行求均值,同時保持維度不變
var = out.var(dim=-1,keepdim=True) #按照行的方向進行求均值,同時保持維度不變
print("未歸一化的輸出的均值為:",mean,"未歸一化的輸出的方差為:",var)
#接下來進行歸一化
out_norm = (out- mean)/torch.sqrt(var)
torch.set_printoptions(sci_mode=False)
print("歸一化后的均值為:",out_norm.mean(dim=-1,keepdim=True))
print("歸一化后的方差為:",out_norm.var(dim=-1,keepdim=True))

在這里插入圖片描述
將上述歸一化代碼進行整合在一個類中:

class LayerNorm(nn.Module):def __init__(self, emb_dim):super().__init__()self.eps = 1e-5self.scale = nn.Parameter(torch.ones(emb_dim))self.shift = nn.Parameter(torch.zeros(emb_dim))def forward(self, x):mean = x.mean(dim=-1, keepdim=True)var = x.var(dim=-1, keepdim=True, unbiased=False)norm_x = (x - mean) / torch.sqrt(var + self.eps)return self.scale * norm_x + self.shift

最后測試用例:

#%% 歸一化測試用例
import torch #導入torch包 類似于一個目錄,包含了__init__.py以及其他模塊的py文件或者其他子包
import torch.nn as nn # 導入torch包中的nn模塊 一個模塊就是一個.py文件,一個py文件下有函數以及類
torch.manual_seed(123) #固定隨機種子
batch_example = torch.randn(2,5) #隨機生成兩行五列的張量,然后每行是均值為0,方差為1的正態分布
print("batch_example,隨機生成的輸入為:",batch_example)
class LayerNorm(nn.Module):def __init__(self, emb_dim):super().__init__()self.eps = 1e-5self.scale = nn.Parameter(torch.ones(emb_dim))self.shift = nn.Parameter(torch.zeros(emb_dim))def forward(self, x):mean = x.mean(dim=-1, keepdim=True)var = x.var(dim=-1, keepdim=True, unbiased=False)norm_x = (x - mean) / torch.sqrt(var + self.eps)return self.scale * norm_x + self.shift
ln = LayerNorm(emb_dim=5)
out_ln = ln(batch_example)
mean = out_ln.mean(dim=-1, keepdim=True)
var = out_ln.var(dim=-1, unbiased=False, keepdim=True)print("Mean:\n", mean)
print("Variance:\n", var)

2.2 GELU激活函數

精確的定義GELU(x)=x??(x)GELU(x)=x \cdot \phi{(x)}GELU(x)=x??(x),其中?(x)\phi{(x)}?(x)是標準高斯分布的累積分布函數,但是在實際操作中,我們會使用一種計算量較小的近似實現,可通過曲線擬合的方法近似得到,GELU(x)≈0.5?x?{1+tanh?[π2?(x+0.044715?x3)]}GELU(x) \approx 0.5 \cdot x \cdot \{1+\tanh[\sqrt{\frac{\pi}{2}} \cdot (x+0.044715 \cdot x^{3})]\}GELU(x)0.5?x?{1+tanh[2π???(x+0.044715?x3)]}

#%% GELU激活函數的前饋神經網絡
#GELU激活類
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
class GELU(nn.Module):def __init__(self):# 參數初始化super().__init__()def forward(self,x): #輸入與輸出return 0.5*x*(1+torch.tanh((torch.sqrt(torch.tensor(2/torch.pi)))*(x+0.044715 * torch.power(x,3))))
# GELU激活類與ReLU激活類的對比
gelu,relu = GELU(),nn.ReLU() #神經網絡初始化
x = torch.linspace(-3,3,100)#生成-3到3之間的100個數
y_gelu = GELU(x)#前向傳播
y_relu= nn.ReLU(x)#前向傳播
plt.figure(figsize=(8,3))
for i,(label,y) in enumerate(zip(["ReLU","GELU"],[y_relu,y_gelu]),1):plt.subplot(1,2,i)plt.plot(x,y)plt.title(f"{label} activation function")plt.xlabel("x")plt.ylabel("{label}(x)")plt.grid(True)
plt.tight_layout()
plt.show()

在這里插入圖片描述
RELU激活函數存在兩個問題,第一個問題是當x=0的梯度不存在,第二個問題,輸入小于零的輸出部分直接被置為0,沒有后續神經元的運算。從GELU激活函數與ReLU激活函數對比圖可以看出,GELU在小于零部分梯度存在,同時在輸入小于0的部分,輸出接近于0,并沒有置零,還能參與后續的運算。

2.3 前饋神經網絡

前饋神經網絡先放大輸入的節點數,經過GELU激活函數,然后再縮小節點數到與原來的輸入的節點數相同,通過這樣一個過程,相當于去粗取精。
在這里插入圖片描述

#%% 前饋神經網絡
import torch
import torch.nn as nn
class FeedForward(nn.Module):#通過大模型進行層數的放大,然后再將層數縮小def __init__(self,cfg):#參數初始化,以及神經網絡結構的定義super().__init__()self.layers = nn.Sequential(nn.Linear(cfg['emb_dim'],4*cfg['emb_dim']),nn.GELU(),nn.Linear(4*cfg['emb_dim'],cfg['emb_dim']))#用容器來裝載神經網絡結構def forward(self,x):#定義輸入與輸出的關系return self.layers(x)

2.4 快捷連接

殘差連接實際上就是建立一個輸入直接連接到輸出,這樣的話,下一層輸入就變成了上一層的輸出和上一層的輸入的疊加。建立殘差連接能夠緩解梯度消失問題。
在這里插入圖片描述

#%% 殘差連接 shortcut
import torch
import torch.nn as nn
class ShortCutNn(nn.Module):def __init__(self,layer_sizes,use_shortcut):#參數初始化以及網絡結構的定義super().__init__()self.use_shortcut = use_shortcutself.layers = nn.ModuleList([nn.Sequential(nn.Linear(layer_sizes[0],layer_sizes[1]),nn.GELU())#定義網絡列表,nn.Sequential(nn.Linear(layer_sizes[1],layer_sizes[2]),nn.GELU()),nn.Sequential(nn.Linear(layer_sizes[2],layer_sizes[3]),nn.GELU()),nn.Sequential(nn.Linear(layer_sizes[3],layer_sizes[4]),nn.GELU()),nn.Sequential(nn.Linear(layer_sizes[4],layer_sizes[5]),nn.GELU())])def forward(self,x):for layer in self.layers:layer_out = layer(x)if self.use_shortcut and x.shape == layer_out.shape:x = x + layer_outelse:x = layer_outreturn x

3 附錄

3.1 anaconda+python環境搭建

接下來進行代碼準備,首先下載所有的requirements.txt中的所有依賴庫,本次實驗是在conda+pycharm環境下,推薦大家在conda+pycharm下進行:
首先創建conda下的環境LLM

conda create --p D:/.conda/envs/LLM 

在這里插入圖片描述
然后激活conda下的LLM環境:

conda activate  D:/.conda/envs/LLM 
conda install requirements.txt

在這里插入圖片描述

#%% 1 初始化信息查看
from importlib.metadata import version
print("matplotlib version:", version("matplotlib"))
print("torch version:", version("torch"))
print("tiktoken version:", version("tiktoken"))
#%% 2 配置GPT模型參數配置
GPT_CONFIG_124M = {"vocab_size": 50257,    # Vocabulary size 表示會被BPE分詞器使用的由50257個單詞的詞匯表"context_length": 1024, # Context length  能夠處理最大詞元token的個數"emb_dim": 768,         # Embedding dimension 嵌入向量的緯度"n_heads": 12,          # Number of attention heads 多頭的頭數"n_layers": 12,         # Number of layers 神經網絡的層數"drop_rate": 0.1,       # Dropout rate 丟棄率,為了防止過擬合,會隨機丟棄10%的隱藏單元"qkv_bias": False       # Query-Key-Value bias qkv的偏置項開啟與否,默認是關閉
}
nn用法
Embedding
Dropout
Sequential
Linear

在這里插入圖片描述

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

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

相關文章

[1Prompt1Story] 滑動窗口機制 | 圖像生成管線 | VAE變分自編碼器 | UNet去噪神經網絡

鏈接:https://github.com/byliutao/1Prompt1Story 這個項目是一個基于單個提示生成一致文本到圖像的模型。它在ICLR 2025會議上獲得了聚焦論文的地位。該項目提供了生成一致圖像的代碼、Gradio演示代碼以及基準測試代碼。 主要功能點: 使用單個提示生成一致的文本…

【GitHub開源AI精選】Sitcom-Crafter:北航聯合港中文等高校打造的劇情驅動3D動作生成系統

系列篇章💥 No.文章1【GitHub開源AI精選】LLM 驅動的影視解說工具:Narrato AI 一站式高效創作實踐2【GitHub開源AI精選】德國比勒費爾德大學TryOffDiff——高保真服裝重建的虛擬試穿技術新突破3【GitHub開源AI精選】哈工大(深圳)…

智和信通全棧式運維平臺落地深圳某學院,賦能運維管理提質提效

深圳某學院校園內信息化設備眾多,網絡環境復雜,使得網絡管理工作面臨著諸多難題與挑戰。為保障校園網絡能夠穩定、高效地運行,學院亟須構建一套集高效、智能、協同于一體的網絡運維平臺。 對運維平臺的期望包括: 實現校園內教學…

開疆智能Ethernet轉ModbusTCP網關連接測聯無紙記錄儀配置案例

本案例是通過Ethernet轉ModbusTCP網關將記錄儀數據傳送到歐姆龍PLC,具體操作過程如下。歐姆龍PLC配置首先打開主站組態軟件“Sysmac Studio”并新建項目。設置PLC的IP地址點擊工具-Ethernet/IP連接設置,在彈出的選個框內選擇顯示EDS庫添加網關eds文件開始…

Eureka故障處理大匯總

#作者:Unstopabler 文章目錄1. Eureka 服務啟動故障處理1.1 端口占用導致啟動失敗1.2 配置文件錯誤導致啟動失敗1.3 依賴沖突與類加載錯誤2. 服務注冊與發現異常2.1 服務無法注冊到 Eureka2.2 Eureka 控制臺看不到注冊的服務2.3 服務注冊后立即被剔除3. Eureka 集群…

基于Transformer的機器翻譯——模型篇

1.模型結構 本案例整體采用transformer論文中提出的結構,部分設置做了調整。transformer網絡結構介紹可參考博客——入門級別的Transformer模型介紹,這里著重介紹其代碼實現。 模型的整體結構,包括詞嵌入層,位置編碼,…

上位機TCP/IP通信協議層常見問題匯總

以太網 TCP 通信是上位機開發中常用的通信方式,西門子 S7 通信、三菱 MC 通信以及 MQTT、OPC UA、Modbus TCP 等都是其典型應用。為幫助大家更好地理解 TCP 通信,我整理了一套常見問題匯總。一、OSI參考模型與TCP/IP參考模型基于TCP/IP的參考模型將協議分…

搭建ktg-mes

項目地址 該安裝事項,基于當前最新版 2025年8月16日 之前的版本 下載地址: 后端JAVA 前端VUE 后端安裝: 還原數據表 路徑:根目錄/sql/ry_20210908.sql、根目錄/sql/quartz.sql、根目錄/doc/實施文檔/ktgmes-202505180846.sql.g…

uniapp純前端繪制商品分享圖

效果如圖// useMpCustomShareImage.ts interface MpCustomShareImageData {canvasId: stringprice: stringlinePrice: stringgoodsSpecFirmName: stringimage: string }const CANVAS_WIDTH 500 const CANVAS_HEIGHT 400 const BG_IMAGE https://public-scjuchuang.oss-cn-ch…

醋酸鑭:看不見的科技助力

雖然我們每天都在使用各種科技產品,但有些關鍵的化學物質卻鮮為人知。醋酸鑭,就是這樣一種默默為科技進步貢獻力量的“幕后英雄”。它不僅是稀土元素鑭的一種化合物,還在許多高科技領域中發揮著重要作用。今天,讓我們一起來了解這…

蒼穹外賣日記

day 1 windows系統啟動nginx報錯: The system cannot find the path specified 在啟動nginx的時候報錯: /temp/client_body_temp" failed (3: The system cannot find the path specified) 解決辦法: 1.檢查nginx的目錄是否存在中文 ,路…

樓宇自控系統賦能建筑全維度管理,實現環境、安全與能耗全面監管

隨著城市化進程加速和綠色建筑理念普及,現代樓宇管理正經歷從粗放式運營向精細化管控的轉型。樓宇自控系統(BAS)作為建筑智能化的核心載體,通過物聯網、大數據和人工智能技術的深度融合,正在重構建筑管理的全維度框架&…

【HarmonyOS】Window11家庭中文版開啟鴻蒙模擬器失敗提示未開啟Hyoer-V

【HarmonyOS】Window11家庭中文版開啟鴻蒙模擬器失敗提示未開啟Hyoer-V一、問題背景 當鴻蒙模擬器啟動時,提示如下圖所示:因為Hyper-V 僅在 Windows 11 專業版、企業版和教育版中作為預裝功能提供,而家庭版(包括中文版&#xff09…

vscode遠程服務器出現一直卡在正在打開遠程和連接超時解決辦法

項目場景: 使用ssh命令或者各種軟件進行遠程服務器之后,結果等到幾分鐘之后自動斷開連接問題解決。vscode遠程服務器一直卡在正在打開遠程狀態問題解決。問題描述 1.連接超時 2.vscode遠程一直卡在正在打開遠程...原因分析:需要修改設置超時斷…

Maven下載和配置-IDEA使用

目錄 一 MAVEN 二 三個倉庫 1. 本地倉庫(Local Repository) 2. 私有倉庫(Private Repository,公司內部倉庫) 3. 遠程倉庫(Remote Repository) 依賴查找流程(優先級&#xff09…

Dify實戰應用指南(上傳需求稿生成測試用例)

一、Dify平臺簡介 Dify是一款開源的大語言模型(LLM)應用開發平臺,融合了“Define(定義) Modify(修改)”的設計理念,通過低代碼/無代碼的可視化界面降低技術門檻。其核心價值在于幫助…

學習日志35 python

1 Python 列表切片一、切片完整語法列表切片的基本格式: 列表[start:end:step]start:起始索引(包含該位置元素,可省略)end:結束索引(不包含該位置元素,可省略)step&#…

Linux -- 文件【下】

目錄 一、EXT2文件系統 1、宏觀認識 2、塊組內部構成 2.1 Data Block 2.2 i節點表(Inode Table) 2.3 塊位圖(Block Bitmap) 2.4 inode位圖(Inode Bitmap) 2.5 GDT(Group Descriptor Table) 2.6 超…

谷歌手機刷機和面具ROOT保姆級別教程

#比較常用的谷歌輸入root面具教程,逆向工程師必修課程# 所需工具與材料清單 真機設備 推薦使用 Google Pixel 4 或其他兼容設備,確保硬件支持刷機操作。 ADB 環境配置 通過安裝 Android Studio 自動配置 ADB 和 Fastboot 工具。安裝完成后,需在系統環境…

平衡二叉搜索樹 - 紅黑樹詳解

文章目錄一、紅黑樹概念引申問題二、紅黑樹操作一、紅黑樹概念 紅黑樹是一棵二叉搜索樹,它在每個節點上增加了一個存儲位用來表示節點顏色(紅色或者黑色),紅黑樹通過約束顏色,可以保證最長路徑不超過最短路徑的兩倍,因而近似平衡…