【人工智能】第四部分:ChatGPT的技術實現

人不走空

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

??????🌈個人主頁:人不走空??????

💖系列專欄:算法專題

?詩詞歌賦:斯是陋室,惟吾德馨

目錄

??????🌈個人主頁:人不走空??????

💖系列專欄:算法專題

?詩詞歌賦:斯是陋室,惟吾德馨

4.1 算法與架構

4.1.1 Transformer解碼器

4.1.2 自注意力機制的實現

4.1.3 多頭注意力機制的實現

4.2 訓練方法

4.2.1 預訓練

4.2.2 微調

4.3 優化技巧

4.3.1 學習率調度

4.3.2 梯度裁剪

4.3.3 混合精度訓練

4.4 模型評估

作者其他作品:



4.1 算法與架構

ChatGPT的核心技術基于Transformer架構,尤其是其解碼器部分。為了更深入地理解其技術實現,我們需要詳細了解以下幾個關鍵組件和步驟:

4.1.1 Transformer解碼器

Transformer解碼器由多個解碼器層組成,每個層包括以下主要組件:

  • 自注意力機制(Self-Attention Mechanism):用于捕捉輸入序列中各個單詞之間的關系。
  • 前饋神經網絡(Feedforward Neural Network):對每個位置的表示進行非線性變換。
  • 殘差連接(Residual Connection)層歸一化(Layer Normalization):提高訓練的穩定性和速度。

每個解碼器層的輸出將作為下一層的輸入,經過多次堆疊,模型可以捕捉到復雜的語言模式和上下文信息。

4.1.2 自注意力機制的實現

自注意力機制的實現涉及三個步驟:生成查詢、鍵和值向量,計算注意力權重,并加權求和值。

import torch
import torch.nn.functional as F# 輸入矩陣 X,形狀為 (batch_size, seq_length, d_model)
X = torch.rand(2, 10, 512)  # 例如,batch_size=2, seq_length=10, d_model=512# 生成查詢、鍵和值向量
W_Q = torch.rand(512, 64)
W_K = torch.rand(512, 64)
W_V = torch.rand(512, 64)Q = torch.matmul(X, W_Q)
K = torch.matmul(X, W_K)
V = torch.matmul(X, W_V)# 計算注意力權重
d_k = Q.size(-1)
scores = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.tensor(d_k, dtype=torch.float32))
attention_weights = F.softmax(scores, dim=-1)# 計算加權和
attention_output = torch.matmul(attention_weights, V)

這個簡單的實現展示了自注意力機制的核心步驟。多頭注意力機制可以通過將查詢、鍵和值向量分割成多個頭并分別計算注意力來實現。

4.1.3 多頭注意力機制的實現

多頭注意力機制將輸入向量分成多個子空間,并在每個子空間內獨立計算注意力。

# 生成多頭查詢、鍵和值向量
num_heads = 8
d_k = 64 // num_heads  # 假設每個頭的維度相同Q_heads = Q.view(2, 10, num_heads, d_k).transpose(1, 2)
K_heads = K.view(2, 10, num_heads, d_k).transpose(1, 2)
V_heads = V.view(2, 10, num_heads, d_k).transpose(1, 2)# 分別計算每個頭的注意力
attention_heads = []
for i in range(num_heads):scores = torch.matmul(Q_heads[:, i], K_heads[:, i].transpose(-2, -1)) / torch.sqrt(torch.tensor(d_k, dtype=torch.float32))attention_weights = F.softmax(scores, dim=-1)head_output = torch.matmul(attention_weights, V_heads[:, i])attention_heads.append(head_output)# 將多頭注意力的輸出拼接并線性變換
multi_head_output = torch.cat(attention_heads, dim=-1)
W_O = torch.rand(512, 512)
output = torch.matmul(multi_head_output.transpose(1, 2).contiguous().view(2, 10, -1), W_O)

4.2 訓練方法

ChatGPT的訓練方法分為預訓練和微調兩個階段。下面詳細介紹這兩個階段。

4.2.1 預訓練

預訓練階段,模型在大規模的無監督文本數據上進行訓練。訓練的目標是預測給定上下文條件下的下一個單詞。預訓練采用自回歸(Autoregressive)方法,即每次預測一個單詞,然后將其作為輸入用于下一次預測。

預訓練過程通常使用交叉熵損失函數:

# 偽代碼示例
for epoch in range(num_epochs):for batch in data_loader:inputs, targets = batch  # inputs 和 targets 是輸入序列和目標序列optimizer.zero_grad()outputs = model(inputs)loss = F.cross_entropy(outputs.view(-1, vocab_size), targets.view(-1))loss.backward()optimizer.step()

4.2.2 微調

微調階段,模型在特定任務或領域的數據上進一步訓練。微調可以通過監督學習和強化學習兩種方式進行。

  1. 監督學習微調:使用帶標注的數據進行訓練,優化特定任務的性能。例如,在對話生成任務中,使用對話數據對模型進行微調。

  2. 強化學習微調:通過與環境的交互,優化特定的獎勵函數。強化學習微調通常使用策略梯度方法,例如Proximal Policy Optimization (PPO)。

 
# 偽代碼示例
for epoch in range(num_epochs):for batch in data_loader:inputs, targets = batchoptimizer.zero_grad()outputs = model(inputs)rewards = compute_rewards(outputs, targets)loss = -torch.mean(torch.sum(torch.log(outputs) * rewards, dim=1))loss.backward()optimizer.step()

4.3 優化技巧

為了提高ChatGPT的性能和效率,通常會采用一些優化技巧:

4.3.1 學習率調度

學習率調度器(Learning Rate Scheduler)可以根據訓練進度動態調整學習率,從而提高模型的收斂速度和性能。

from torch.optim.lr_scheduler import StepLRoptimizer = torch.optim.Adam(model.parameters(), lr=0.001)
scheduler = StepLR(optimizer, step_size=10, gamma=0.1)for epoch in range(num_epochs):for batch in data_loader:inputs, targets = batchoptimizer.zero_grad()outputs = model(inputs)loss = F.cross_entropy(outputs.view(-1, vocab_size), targets.view(-1))loss.backward()optimizer.step()scheduler.step()

4.3.2 梯度裁剪

梯度裁剪(Gradient Clipping)用于防止梯度爆炸,尤其是在訓練深層神經網絡時。

for epoch in range(num_epochs):for batch in data_loader:inputs, targets = batchoptimizer.zero_grad()outputs = model(inputs)loss = F.cross_entropy(outputs.view(-1, vocab_size), targets.view(-1))loss.backward()torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)optimizer.step()

4.3.3 混合精度訓練

混合精度訓練(Mixed Precision Training)使用半精度浮點數進行計算,可以顯著減少計算資源和內存使用,同時保持模型性能。

from torch.cuda.amp import GradScaler, autocastscaler = GradScaler()for epoch in range(num_epochs):for batch in data_loader:inputs, targets = batchoptimizer.zero_grad()with autocast():outputs = model(inputs)loss = F.cross_entropy(outputs.view(-1, vocab_size), targets.view(-1))scaler.scale(loss).backward()scaler.step(optimizer)scaler.update()

4.4 模型評估

在訓練和微調過程中,對模型進行評估是確保其性能和質量的關鍵步驟。常用的評估指標包括困惑度(Perplexity)、準確率(Accuracy)、BLEU分數(BLEU Score)等。

# 偽代碼示例
model.eval()
total_loss = 0.0with torch.no_grad():for batch in eval_data_loader:inputs, targets = batchoutputs = model(inputs)loss = F.cross_entropy(outputs.view(-1, vocab_size), targets.view(-1))total_loss += loss.item()perplexity = torch.exp(torch.tensor(total_loss / len(eval_data_loader)))
print(f"Perplexity: {perplexity}")

下一部分將探討ChatGPT在不同應用場景中的實際案例和未來發展方向。


作者其他作品:

【Java】Spring循環依賴:原因與解決方法

OpenAI Sora來了,視頻生成領域的GPT-4時代來了

[Java·算法·簡單] LeetCode 14. 最長公共前綴 詳細解讀

【Java】深入理解Java中的static關鍵字

[Java·算法·簡單] LeetCode 28. 找出字a符串中第一個匹配項的下標 詳細解讀

了解 Java 中的 AtomicInteger 類

算法題 — 整數轉二進制,查找其中1的數量

深入理解MySQL事務特性:保證數據完整性與一致性

Java企業應用軟件系統架構演變史?

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

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

相關文章

dnf手游版游玩感悟

dnf手游于5月21號正式上線,作為一個dnf端游老玩家,并且偶爾上線ppk,自然下載了手游版,且玩了幾天。 不得不說dnf手游的優化做到了極好的程度。 就玩法系統這塊,因為dnf屬于城鎮地下城模式,相比…

前端工程化工具系列(三)—— Stylelint(v16.6.1):CSS/SCSS 代碼質量工具

Stylelint 是 CSS/SCSS 的靜態分析工具,用于檢查其中的違規和錯誤。 1. 環境要求 v16 以上的 Stylelint,支持 Node.js 的版本為 v18.12.0。 在命令行工具中輸入以下內容后回車,來查看當前系統中 Node.js 的版本。 node -vNode.js 推薦使用…

Shell腳本快速入門

為什么要學shell?能做什么? 答:CI/CD 持續集成,自動化部署作業方式,需要將一系列linux命令程序化,shell 就能做到。

13. 《C語言》——【strlen函數的使用和模擬實現】

文章目錄 前言strlen函數strlen函數的使用strlen函數的3種方法實現方法1方法2方法3 總結 前言 各位老板好~ , 今天我們講解strlen函數如何去使用以及如何去模擬實現strlen函數。希望各位老板能夠給一個點贊和一個大大的關注,感謝各位老板!str…

塑料焊接機熔深對激光焊接質量有什么影響

塑料焊接機的熔深對焊接質量具有直接且顯著的影響。以下是熔深對焊接質量影響的詳細解釋: 1. 焊接強度:熔深直接決定了焊縫的截面積,從而影響焊接接頭的強度。較深的熔深意味著焊縫的截面積更大,可以提供更強的結合力,…

OpenStreetMap部署(OSM)

參考:https://github.com/openstreetmap/openstreetmap-website/blob/master/DOCKER.md OpenStreeMap 部署 操作系統建議使用 Ubuntu 22 版本 安裝 Docker # 更新軟件包索引: sudo apt-get update # 允許APT使用HTTPS: sudo apt-get inst…

【計算機組成原理】詳談計算機發展歷程

計算機發展歷程 導讀一、計算機的誕生1.1 歷史背景1.2 計算機的發明 二、計算機硬件的發展1.1 計算機的四代變化1.1.1 第一代計算機bug的由來 1.1.2 第二代計算機1.1.3 第三代計算機半導體存儲器的發展 1.1.4 第四代計算機 1.2 個人計算機的發展1.2.1 微處理器的發展1.2.2 個人…

AIGC之Stable Diffusion Web Ui 初體驗

前言 Stable Diffusion辣么火,同學你確定不嘗試一下嘛? 純代碼學習版本搞啦,Web Ui 也得試試咧 網上有很多安裝Stable Diffusion Web Ui 的介紹了,我在這說一下我的踩坑記錄 想安裝的同學,看這個鏈接 萬字長文&#x…

U-Net: Convolutional Networks for Biomedical Image Segmentation--論文筆記

U-Net: Convolutional Networks for Biomedical Image Segmentation 資料 1.代碼地址 2.論文地址 https://arxiv.org/pdf/1505.04597 3.數據集地址 論文摘要的翻譯 人們普遍認為,深度網絡的成功訓練需要數千個帶注釋的訓練樣本。在本文中,我們提出…

44-5 waf繞過 - SQL注入繞WAF方法

環境準備: 43-5 waf繞過 - 安全狗簡介及安裝-CSDN博客然后安裝sqlilabs靶場:構建完善的安全滲透測試環境:推薦工具、資源和下載鏈接_滲透測試靶機下載-CSDN博客 一、雙寫繞過 打開sql靶場的第一關:http://127.0.0.1/sqli-labs-master/Less-1/?id=1 驗證一下waf是否開啟防…

C\C++內存管理(未完結)

文章目錄 一.C\C內存分布二.C語言中動態內存管理方式:malloc/calloc/realloc/free三.C內存管理方式3.1.new/delete操作內置類型3.2.new和delete操作自定義類型 四.operator new與operator delete函數(重要點進行講解)4.1. operator new與oper…

npm install 出錯,‘proxy‘ config is set properly. See: ‘npm help config‘

背景 從遠程clone下項目之后,使用命令 npm install 安裝依賴,報錯如下 意為: 報錯: npm犯錯!network與網絡連通性有關的問題。 npm犯錯!網絡在大多數情況下,你背后的代理或有壞的網絡設置。 npm犯錯!網絡 npm犯錯…

spring-kafka-生產者服務搭建測試(SpringBoot整合Kafka)

文章目錄 1、生產者服務搭建1.1、引入spring-kafka依賴1.2、使用Java代碼創建主題分區副本1.3、發送消息 1、生產者服務搭建 1.1、引入spring-kafka依賴 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/…

KOL營銷新篇章:互動式內容與線上活動如何助力品牌增長

在當今數字化時代&#xff0c;KOL營銷已成為品牌推廣的重點策略之一。然而&#xff0c;隨著市場競爭的加劇&#xff0c;單純依靠KOL的曝光已經不再足夠&#xff0c;更多的是需要與用戶進行互動&#xff0c;幫助品牌與受眾建立更緊密的聯系。本文將探討KOL營銷如何通過互動式內容…

《企業應用架構模式》學習指南

導讀&#xff1a;企業應用包括哪些&#xff1f;它們又分別有哪些架構模式&#xff1f; 世界著名軟件開發大師Martin Fowler給你答案 01什么是企業應用 我的職業生涯專注于企業應用&#xff0c;因此&#xff0c;這里所談及的模式也都是關于企業應用的。&#xff08;企業應用還有…

怎么用NodeJS腳本實現遠程控制空調

怎么用NodeJS腳本實現遠程控制空調呢&#xff1f; 本文描述了使用NodeJS腳本調用HTTP接口&#xff0c;實現控制空調&#xff0c;通過不同規格的通斷器&#xff0c;來控制不同功率的空調的電源。 可選用產品&#xff1a;可根據實際場景需求&#xff0c;選擇對應的規格 序號設備…

MySQL從入門到高級 --- 12.事務 13.鎖機制 14.日志

文章目錄 第十二章 && 第十三章 && 第十四章&#xff1a;12.事務12.1 特性12.2 隔離級別 13.鎖機制13.1 各存儲引擎對鎖的支持狀況&#xff1a;13.2 鎖特性13.3 MyISAM表鎖13.3.1 加表鎖 13.4 InnoDB行鎖13.4.1 行鎖特點13.4.2 行鎖模式 14.日志14.1 錯誤日志1…

深入理解計算機系統 第三版 中文版 圖5-27 p371 錯漏

中文版 英文版 對照 可以看出錯漏 這本書中文版很多錯漏,可以配合英文版查正,不過英文版也很多錯漏,所以不用太相信書本.要根據自己的理解來.

微軟云計算Windows Azure(一)

目錄 一、微軟云計算平臺二、微軟云操作系統Windows Azure&#xff08;一&#xff09;Windows Azure概述&#xff08;二&#xff09;Windows Azure計算服務&#xff08;三&#xff09;Windows Azure存儲服務&#xff08;四&#xff09;Windows Azure Connect&#xff08;五&…

Win 11官宣取消硬件限制,微軟這次徹底服軟了

上市近 3 年&#xff0c;微軟寄予厚望的 Win 11 終究落了個被上代 Win 10 光環狠狠掩埋的結局。 有小伙伴兒認為是 Win 11 本身做的太爛&#xff0c;更新頻繁、BUG 一堆&#xff0c;讓人失去興趣。 也有人認為&#xff0c;系統本身體驗沒啥大毛病&#xff0c;嚴苛的硬件限制才…