【人工智能】第四部分: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 微调
微调阶段,模型在特定任务或领域的数据上进一步训练。微调可以通过监督学习和强化学习两种方式进行。
-
监督学习微调:使用带标注的数据进行训练,优化特定任务的性能。例如,在对话生成任务中,使用对话数据对模型进行微调。
-
强化学习微调:通过与环境的交互,优化特定的奖励函数。强化学习微调通常使用策略梯度方法,例如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企业应用软件系统架构演变史
相关文章:
【人工智能】第四部分:ChatGPT的技术实现
人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…...
小程序配置自定义tabBar及异形tabBar配置操作
什么是tabBar? 小程序的tabbar是指小程序底部的一组固定导航按钮,通常包含2-5个按钮,用于快速切换小程序的不同页面。每个按钮都有一个图标和文本标签,点击按钮可以切换到对应的页面。tabbar通常放置在小程序的底部,以…...
解析《动物园规则怪谈》【逻辑】
鉴赏《动物园规则怪谈》【逻辑】 前言版权推荐鉴赏《动物园规则怪谈》推理游客正方“它”方其他物品 不同规则或纸条的对比联系出现的地方及联系游客入园历程:被“它”污染的过程鉴赏升华 最后 前言 2024-5-31 13:05:38 以下内容源自《【逻辑】》 仅供学习交流使用…...
上传RKP 证书签名请求息上传到 Google 的后端服务器
上传证书签名请求 1.准备环境:OK pip3 install google-auth2.13.0 requests2.28下载 device_info_uploader.py 。 没找到先跳过 选项 1:通过 GCP 帐户使用 device_info_uploader.py 运行脚本。 ./device_info_uploader.py --credentials /secure/s…...
Debian和ubuntu 嵌入式的系统的 区别
随着开源操作系统的日益流行,Debian和Ubuntu这两个基于Linux的发行版本成为了众多开发者和系统管理员的首选。它们各自拥有独特的优势和特点,那么,在选择时,哪一个更适合你呢?接下来,我们将深入探讨两者的关…...
HTML旋转照片盒子
效果图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible" content…...
【UE5 刺客信条动态地面复刻】实现无界地面01:动态生成
2024.6.4更新 昨天半夜意识到生成Cube的方案不合适,又开始到处找动态地面的方法,发现了我想要的效果直接可以用nigara实现!!!! 于是这个部分就暂时告一段落,今季开始新的方向的学习。 为了快速…...
AI产品经理系列-如何使用kimi快速撰写用户故事(含提示词)
在AI时代,可能人人都可成为产品经理。 之前我们聊过如何使用kimi协助完成产品需求文档,如何写竞品分析报告,这一篇我们聊聊用户故事,如何使用kimi协助撰写产品需求文档中的用户故事。 在此之前我们先了解下什么是用户故事&#…...
MySQL索引与事务
前言👀~ 紧接着数据库的相关知识,今天讲解MySQL面试中频繁被问到的知识点,索引与事务!!! 如果各位对文章的内容感兴趣的话,请点点小赞,关注一手不迷路,如果内容有什么问题的话,欢迎各位评论纠正…...
『大模型笔记』从基础原理出发提升深度学习性能
从基础原理出发提升深度学习性能 文章目录 一. 从基础原理出发提升深度学习性能1.1. 计算(compute)1.2. 带宽(Bandwidth)1.2.1 关于内存带宽成本的推理(Reasoning about Memory-Bandwidth Costs)1.3. 开销(Overhead)二. 总结三. 参考文献Making Deep Learning Go Brrrr F…...
【二叉树】Leetcode 222. 完全二叉树的节点个数【简单】
完全二叉树的节点个数 你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最…...
golang界面设计器,全网少见
今天登录govcl的网站,无意中看到有个简易UI设计器。 对于golang的UI专用设计器,还没在网上真正见过。 之前也用govcl来做过两三个桌面应用,好用是好用,不过要安装Lazarus的IDE来拖动设计UI,还要配置很多东西࿰…...
如何在GlobalMapper中加载高清卫星影像?
GlobalMapper在GIS行业几乎无人不知,无人不晓,但它可以直接加载卫星影像也许就不是每个人都知道的了。 这里就来分享一下如何在GlobalMapper中加载高清卫星影像,并可以在文末查看领取软件安装包和图源的方法。 如何加载高清图源 首先&…...
【机器学习】解锁AI密码:神经网络算法详解与前沿探索
👀传送门👀 🔍引言🍀神经网络的基本原理🚀神经网络的结构📕神经网络的训练过程🚆神经网络的应用实例💖未来发展趋势💖结语 🔍引言 随着人工智能技术的飞速发…...
Java如何实现pdf转base64以及怎么反转?
问题需求 今天在做发送邮件功能的时候,发现邮件的附件部分,比如pdf文档,要求先把pdf转为base64,邮件才会发送。那接下来就先看看Java 如何把 pdf文档转为base64。 两种方式,一种是通过插件 jar 包的方式引入…...
动态规划5:62. 不同路径
动态规划解题步骤: 1.确定状态表示:dp[i]是什么 2.确定状态转移方程:dp[i]等于什么 3.初始化:确保状态转移方程不越界 4.确定填表顺序:根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接:62. …...
Python编程学习第一篇——Python零基础快速入门(五)-列表(List)
今天我们来一起学习Python的列表(list),Python中的列表(List)是一种有序、可变的数据结构,可以用来存储多个值。列表可以包含不同类型的数据,例如整数、浮点数、字符串等。以下是关于Python列表…...
c# - 运算符 << 不能应用于 long 和 long 类型的操作数
Compiler Error CS0019 c# - 运算符 << 不能应用于 long 和 long 类型的操作数 处理方法 特此记录 anlog 2024年5月30日...
问题排查|记录一次基于mymuduo库开发的服务器错误排查(回响服务器无法正常工作)
问题背景: 服务器程序如下: #include <mymuduo/TcpServer.h> #include <mymuduo/Logger.h>#include <string> #include <functional>class EchoServer { public:EchoServer(EventLoop *loop,const InetAddress &addr, con…...
中介模式实现聊天室
中介者模式的核心逻辑就是解耦对象‘多对多’的相互依赖关系。当遇到一大堆混乱的对象呈现“网状结构”,利用通过中介者模式解耦对象之间的通讯。 代码案例 抽象中介类 public abstract class AbstractChatRoom {public abstract void notice(String message , Us…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
