火遍全球的ChatGPT技术简介与主干网络代码

news2024/11/16 13:37:11

如果说当下最火的AI技术和话题是什么,恐怕很难绕开ChatGPT。各大厂商都在表示未来要跟进ChatGPT技术,开发在自然语言处理智能系统,可见其影响力。本篇博客追个热度,来简单的介绍下ChatGPT到底是一项什么技术,究竟如何完成复杂的语言处理任务的。

ChatGPT到底是一项什么技术

如果想要了解ChatGPT是一项什么技术,不如直接问问他:

可以看到ChatGPT是一项基于Transformer模型实现的NLP软件。关于Transformer模型,我们已经在之前文章《注意力机制原理概述》介绍过。这里提到的LM技术,其实就是Transformer。

ChatGPT背后的Transformer架构

那么,ChatGPT的Transformer架构是什么样?我让chatgpt打印了他自己的主干网络代码,如下:

完整的代码分为四个模块:GPT框架,GPT层,多头注意力模块代码和位置编码。

GPT框架:

import torch
import torch.nn as nn
import torch.nn.functional as F

class GPT(nn.Module):

def init(self, vocab_size, embed_dim, n_layers, n_heads, dropout):
    super(GPT, self).init()
    self.vocab_size = vocab_size
    self.embed_dim = embed_dim
    self.n_layers = n_layers
    self.n_heads = n_heads
    self.dropout = dropout    
    self.embedding = nn.Embedding(vocab_size, embed_dim)
    self.pos_encoding = nn.Embedding(vocab_size, embed_dim)
    self.layers = nn.ModuleList([GPTLayer(embed_dim, n_heads, dropout) for _ in range(n_layers)])
    self.fc = nn.Linear(embed_dim, vocab_size)
    
def forward(self, x):
    # Embedding
    x = self.embedding(x)
    # Position Encoding
    x = self.pos_encoding(x)
    # GPT Layers
    for layer in self.layers:
        x = layer(x)
    # Output
    x = self.fc(x)
    return x

GPT层代码:

class GPTLayer(nn.Module):
def init(self, embed_dim, n_heads, dropout):
    super(GPTLayer, self).init()
    self.embed_dim = embed_dim
    self.n_heads = n_heads
    self.dropout = dropout
    self.attention = MultiHeadAttention(embed_dim, n_heads, dropout)
    self.feed_forward = PositionwiseFeedForward(embed_dim, dropout)
    
def forward(self, x):
    # Attention
    x = self.attention(x)
    # Feed Forward
    x = self.feed_forward(x)
    return x

多头注意力模块代码:

class MultiHeadAttention(nn.Module):
def init(self, embed_dim, n_heads, dropout):
    super(MultiHeadAttention, self).init()
    self.embed_dim = embed_dim
    self.n_heads = n_heads
    self.dropout = dropout

    self.query_linear = nn.Linear(embed_dim, embed_dim)
    self.key_linear = nn.Linear(embed_dim, embed_dim)
    self.value_linear = nn.Linear(embed_dim, embed_dim)
    self.output_linear = nn.Linear(embed_dim, embed_dim)
    
def forward(self, x):
    # Query, Key, Value
    query = self.query_linear(x)
    key = self.key_linear(x)
    value = self.value_linear(x)
    # Attention
    scores = torch.matmul(query, key.transpose(-2, -1)) / math.sqrt(query.size(-1))
    scores = F.softmax(scores, dim=-1)
    scores = self.dropout(scores)
    # Output
    output = torch.matmul(scores, value)
    output = self.output_linear(output)
    return output

位置编码:

class PositionwiseFeedForward(nn.Module):
def init(self, embed_dim, dropout):
    super(PositionwiseFeedForward, self).init()
    self.embed_dim = embed_dim
    self.dropout = dropout
    self.fc1 = nn.Linear(embed_dim, embed_dim)
    self.fc2 = nn.Linear(embed_dim, embed_dim)
    
def forward(self, x):
    # Feed Forward
    x = self.fc1(x)
    x = F.relu(x)
    x = self.dropout(x)
    x = self.fc2(x)
    x = self.dropout(x)
    return x


GPT主体框架主要由GPT层叠加构成。GPT层也比较容易理解,基本就是由多头注意力处理模块构建的。按照注意力机制原理,多头注意力处理首先将输入按照查询、键、值做对应的线性变换,之后输入一个多分枝的注意力结构,建立一个具有关联关系的评分结果。按照评分结果,实现对查询的值预测,实现NLP任务。这个模型基本就是2017年Vaswani工作 [1] 的复现。这让我们真正理解了多头注意力的强大之处。

总结

chatgpt是一个有趣且有用的AI工具,对于泛NLP任务,具有目前最优秀的处理分析能力。我认为其在客户问答,信息查询,文字编辑等任务中,将产生深远的影响。其背后基于多头注意力机制的Transformer模型,已被验证在逻辑关系学习领域,具有惊人的技术优势。相信在该技术路线上,未来还会有更加优秀的工作被不断提出。

Reference

[1] A. Vaswani, N. Shazeer, N. Parmar, et al. Attention is all you need. Advances in neural information processing systems, 2017,5998‒6008.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/339853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解innodb存储格式,双写机制,buffer pool底层结构和淘汰策略

MySql系列整体栏目 内容链接地址【一】深入理解mysql索引本质https://blog.csdn.net/zhenghuishengq/article/details/121027025【二】深入理解mysql索引优化以及explain关键字https://blog.csdn.net/zhenghuishengq/article/details/124552080【三】深入理解mysql的索引分类&a…

【网络编程】Java中的Socket

文章目录前言socket是什么?Java中的SocketJava实现网络上传文件前言 所谓Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用…

kafka入门篇

文章目录前言介绍概念与说明安装启动配置命令操作创建topic查看topic列表发送消息(启动一个生产者)消费消息(启动一个消费者)查询topic信息删除topic集群关机使用报错java连接示例前言 作为入门篇,主要是了解Kafka的概…

在windows下载安装netcat(nc)命令

参考文章 一、netcat(nc)下载 网盘下载 netcat(nc)下载地址:netcat 1.11 for Win32/Win64 二、配置环境变量 在Path里添加netcat的存放路径 参数 说明 -C 类似-L选项,一直不断连接[1.13版本新加的功能] -d 后台执行 -e prog 程序重定向&am…

能取代90%人工作的ChatGPT到底牛在哪?

📣📣📣📣📣📣📣 🎍大家好,我是慕枫 🎍前阿里巴巴高级工程师,InfoQ签约作者、阿里云专家博主,一直致力于用大白话讲解技术知识 &#x…

Web 框架 Flask 快速入门(二)表单

课程地址:Python Web 框架 Flask 快速入门 文章目录🌴 表单1、表单介绍2、表单的简单实现1. 代码2. 代码的执行逻辑3、使用wtf扩展实现4、bug记录:表单验证总是失败🌴 表单 1、表单介绍 当我们在网页上填写账号密码进行登录的时…

Spring 面试题(一):Spring 如何处理全局异常?

❤️ 博客首页:水滴技术 🚀 支持水滴:点赞👍 收藏⭐ 留言💬 🌸 订阅专栏:Spring 教程:从入门到精通 文章目录1、如何处理全局异常2、代码示例2.1、定义统一的“响应结果对象”2.2、…

Leetcode 回溯详解

回溯法 回溯法有“通用解题法”之称,用它可以系统地搜索问题的所有解。回溯法是一个既带有系统性又带有跳跃性的搜索算法。 在包含问题的所有解的解空间树中,按照深度优先搜索(DFS))的策略,从根结点出发深度探索解空间树。当探索…

MWORKS--同元软控MWORKS介绍、安装与使用

MWORKS--同元软控MWORKS介绍、安装与使用1 同元软控介绍1.1 同元软控简介1.2 同元软控发展历史2 MWORKS介绍2.1 MWORKS简介2.2 MWORKS产品描述3 装备数字化3.1 发展3.2 内涵3.3 系统模型发展成为产品的一部分3.4 MWORKS系统模型数据管理3.4 MWORKS为装备数字化提供的套件参考1 …

springcloud集成seata(AT)分布式事务

目录 一、 下载seata server和seata源码 二、配置启动seata 2.1 在nacos控制台,新建一个seata的名称空间,用于存放seata的专用配置 2.2 创建seata server的mysql库 2.3 在nacos上配置seata相关配置 (seata名称空间) 2.4 启动…

家政服务小程序实战教程08-宫格导航

小程序一般会在首页显示商品的分类,这类需求我们在微搭中是使用宫格导航组件来实现。 01 组件说明 宫格导航组件可以在导航配置里设置菜单,可以手动添加,也可以变量绑定 因为我们一般的分类是动态变化的,品类会不断的调整&#…

阿里代码规范插件中,Apache Beanutils为什么被禁止使用?

在实际的项目开发中,对象间赋值普遍存在,随着双十一、秒杀等电商过程愈加复杂,数据量也在不断攀升,效率问题,浮出水面。 问:如果是你来写对象间赋值的代码,你会怎么做? 答&#xf…

[Java 进阶面试题] CAS 和 Synchronized 优化过程

最有用的东西,是你手里的钱,有钱就有底气,还不快去挣钱~ 文章目录CAS 和 Synchronized 优化过程1. CAS1.1 CAS的原理1.2 CAS实现自增自减的原子性1.3 CAS实现自旋锁1.4 CAS针对ABA问题的优化2. synchronized2.1 synchronized加锁阶段分析2.2 synchronized优化CAS 和 Synchroniz…

nodejs+vue大学生在线选课系统vscode - Visual Studio Code

3、数据库进行设计,建立约束和联系。 4、创建程序框架,代码分成三层结构:接口层、业务层、表示层,设计窗口和主窗口,主窗口菜单项依照系统模块图设计。 5、设计数据访问的接口,供各模块调用。完成登录功能…

【JavaWeb项目】简单搭建一个前端的博客系统

博客系统项目 本项目主要分成四个页面: 博客列表页博客详情页登录页面博客编辑页 该系统公共的CSS样式 common.css /* 放置一些各个页面都会用到的公共样式 */* {margin: 0;padding: 0;box-sizing: 0; }/* 给整个页面加上背景 */ html, body{height: 100%; }body {backgrou…

printf的返回值

参考资料 点击下面的链接https://legacy.cplusplus.com/reference/cstdio/printf/?kwprintf, 返回值的理解 如果返回成功后,将返回写入的字符总数。 如果发生写入错误,则设置错误指示器(ferror)并返回负数。 如果在写入宽字符…

微信中如何接入chatgpt机器人才比较安全(不会收到警告或者f号)之第一步登录微信

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 前言 为什么会有这个话题?大家都知道最近有个AI机器人很火,那就是chatgpt,关于它的介绍,大家可以自行百度去,我这边就不多介绍了。 好多人嫌网页版玩的不过瘾,就把这个机器人接入到了QQ上,接入到了钉钉上,TG 上…

设计模式:原型模式解决对象创建成本大问题

一、问题场景 现在有一只猫tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和tom猫属性完全相同的10只猫。 二、传统解决方案 public class Cat {private String name;private int age;private String color;…

JMeter 接口测试/并发测试/性能测试

Jmter工具设计之初是用于做性能测试的,它在实现对各种接口的调用方面已经做的比较成熟,因此,本次直接使用Jmeter工具来完成对Http接口的测试。因为再做接口测试时可以设置线程组,所以也可做接口性能测试。本篇使用JMeter完成了一个…

TrueNas篇-trueNas Scale安装

安装TrueNAS Scale 在尝试trueNas core时发下可以成功安装,但是一直无法成功启动,而且国内对我遇见的错误几乎没有案例,所以舍弃掉了,而且trueNas core是基于Linux的,对Linux的生态好了很多,还可以可以在t…