自己动手做chatgpt:解析gpt底层模型transformer的输入处理

前面我们完成了一些基本概念,如果你对深度学习的基本原理还不了解,你可以通过这里获得更多信息,由于深度学习的教程汗牛充栋,因此我在这里不会重复,而是集中精力到chatgpt模型原理的分析,实现和实践上。ChatGPT基于一种叫transformer的深度学习模型,它又由一系列组件组合而成,对称我们将逐个剖析。首先我们看看transformer模型的基本结构:
请添加图片描述

不知你是否感觉这个图有种赛博朋克的科幻感。两个大方块左边那个叫encoder,也叫编码器,在深度学习中一种很常见的模式是,将输入数据经过一系列运算后转换成一种特定向量,用术语说叫lantent vector,这个向量往往记录了输入数据的特定属性,右边方块叫decoder,它的作用是解析encoder生成的中间向量,然后生成某种特定的输出。举个具体例子,警察在侦查案件时,往往会让目击者描述嫌疑人的长相特征,此时目击者就相当于encoder,他描述的特征比如“圆脸,卷发,高额头”等就相当于上面encoder的输出向量,然后公安部分有特定的刑侦人员通过这些特征把嫌疑人的相貌绘制出来,通常绘制的画像跟真实嫌疑人相貌有不小差距,但是由于它能捕捉特定特征,因此这种画像对警方追查嫌疑人也有很大帮助。

首先我们看第一步请添加图片描述
inputs是模型的输入数据,对chatgpt来说输入就是一个单词或者句子,input embedding是对输入的一种预处理,它把输入的单词或句子转换成一个向量,这一步是NLP算法中一个重要的课题,前面我们描述过任何难以用传统数据结构描述的对象都可以用向量来表示,当一个词被转换成多维空间的向量时,我们就能通过研究向量在空间中的分布来了解它在语言中的特性,同时如果两个单词分别转换成向量后,如果他们对应的向量在空间上距离越接近,我们就认为他们之间的关系越紧密。

首先我们看看如何将单词转换为向量,这里我们使用BERT模型,它是谷歌大脑早期基础模型之一,通过它我们就能够直接将单词转换为向量。首先我们看一个句子:

The man is king and he loves dog, the woman is queen and she loves cat

在句子中有几个关键词,(man,woman), (king, queen), (dog, cat),可以看到每一组的两个词,它们在含义上互相接近,因此有理由预计如果将他们转换为向量,那么括号对里单词对应的向量在空间上的距离会相互接近,我们用代码检验一下:

from transformers import AutoTokenizer, AutoModel
import torch
from sklearn.metrics.pairwise import cosine_similarity# Load the BERT tokenizer and model
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
model = AutoModel.from_pretrained('bert-base-uncased')words = ["man", "woman", "king", "queen", "cat", "dog"]
#embeddings = np.array([word2Vector(word).detach().numpy().reshape(1, -1).flatten() for word in words])
sentence = "The man is king and he loves dog, the woman is queen and she loves cat"
word1 = "man"
word2 = "woman"
word3 = "king"
word4 = "queen"
word5 = "cat"
word6 = "dog"# Tokenize the sentence and words
tokens = tokenizer(sentence, return_tensors='pt')
word1_tokens = tokenizer(word1, return_tensors='pt')
word2_tokens = tokenizer(word2, return_tensors='pt')
word3_tokens = tokenizer(word3, return_tensors='pt')
word4_tokens = tokenizer(word4, return_tensors='pt')
word5_tokens = tokenizer(word5, return_tensors='pt')
word6_tokens = tokenizer(word6, return_tensors='pt')# Get the embeddings for the sentence and words
sentence_embedding = model(**tokens).last_hidden_state.mean(dim=1).squeeze()
word1_embedding = model(**word1_tokens).last_hidden_state.mean(dim=1).squeeze()
word2_embedding = model(**word2_tokens).last_hidden_state.mean(dim=1).squeeze()
word3_embedding = model(**word3_tokens).last_hidden_state.mean(dim=1).squeeze()
word4_embedding = model(**word4_tokens).last_hidden_state.mean(dim=1).squeeze()
word5_embedding = model(**word5_tokens).last_hidden_state.mean(dim=1).squeeze()
word6_embedding = model(**word6_tokens).last_hidden_state.mean(dim=1).squeeze()embeddings = [word1_embedding.detach().numpy().reshape(1, -1).flatten(), word2_embedding.detach().numpy().reshape(1, -1).flatten(),word3_embedding.detach().numpy().reshape(1, -1).flatten(), word4_embedding.detach().numpy().reshape(1, -1).flatten(),word5_embedding.detach().numpy().reshape(1, -1).flatten(), word6_embedding.detach().numpy().reshape(1, -1).flatten()]

上面代码通过下载已经训练好的BERT模型,然后将给定句子进行分词,每个单词在模型训练的语料中都有对应编号,我们找到其编号也就是上面对应的word1_tokens等输入到模型中获得其对应向量word1_embedding,我们不用关心上面代码的逻辑,只需要知道代码把单词转换为向量即可,然后我们把向量打印出来看看:

import numpy as np
print(np.shape(word1_embedding.detach().numpy().reshape(1, -1).flatten()))
print(f"word embedding : {word1_embedding}")

上面代码运行后所得结果如下:
请添加图片描述
可以看到单词转换为向量后,对应的是一个包含有768个元素的一维向量,接下来我们把六个单词向量绘制出来看看其对应关系:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCApca = PCA(n_components=2)
embeddings_2d = pca.fit_transform(embeddings)
fig, ax = plt.subplots()
ax.scatter(embeddings_2d[:, 0], embeddings_2d[:, 1])
for i, word in enumerate(words):ax.annotate(word, (embeddings_2d[i, 0], embeddings_2d[i, 1]))
plt.show()

上面代码运行后所得结果如下:
在这里插入图片描述
可以看到上面提到的每个括号里面的单词,相互之间距离接近,也就是说这些单词在语义上相互之间的关联性比较强,此外单词向量化后我们还能计算他们在语义上的相似性,从上图也可以看到,(man, women)在语义上相近,(queen, king)在语义上相近,(cat,dog)在语义上相近,在算法上我们通过计算两个向量夹角的余弦值来判断两个向量指向对象的相似度,我们看看相应代码实现:

man_king_sim = torch.cosine_similarity(word1_embedding, word3_embedding, dim=0)
print(f"sim for man and king: {man_king_sim}")

上面代码输出结果为:
sim for man and king: 0.861815869808197

woman_queen_sim = torch.cosine_similarity(word2_embedding, word4_embedding, dim=0)
print(f'sim for woman and queen: {woman_queen_sim}')

代码输出结果为:
sim for woman and queen: 0.8941507935523987

man_woman_sim = torch.cosine_similarity(word1_embedding, word2_embedding, dim=0)
print(f'sim for man and woman: {man_woman_sim}')

输出结果为:
im for man and woman: 0.9260298013687134

man_dog_sim = torch.cosine_similarity(word1_embedding, word6_embedding, dim=0)
print(f'sim for man and dog: {man_dog_sim}')woman_dog_sim = torch.cosine_similarity(word2_embedding, word5_embedding, dim=0)
print(f'sim for woman and cat : {woman_dog_sim}')dog_cat_sim = torch.cosine_similarity(word6_embedding, word5_embedding, dim=0)
print(f'sim for dog and cat: {dog_cat_sim}')

上面代码输出结果为:

sim for man and dog: 0.8304506540298462
sim for woman and cat : 0.876427948474884
sim for dog and cat: 0.900851309299469

从输出结果我们看到,dog和cat在语义上接近,man和woman在语义上接近。在具体的文本中,影响两个词意思相近性的因素还有他们在文本中的距离,假设man和women在一个句子中距离很近,那么就有可能他们指向的是一对夫妇或者情侣,但如果距离很远,那有可能文章的意思就是在说两个不相干的人,因此单词在文本中的距离也会影响他们在语义上的成分,因此chatgpt在识别文本时,也会把单词的距离纳入考量。

回到上面架构图,我们会看到在输入部分还有一个叫positional encoding的东西,如下图所示:
请添加图片描述
这个positional encoding 本质就是对单词在句子中的距离进行编码,这里位置的编码结果也是一维向量,而且向量的长度跟单词对应向量要一致,因为他们要进行加法运算后,其结果才能输入给chatgpt进行下一步处理,那么chatgpt是怎么去”编码“单词位置的呢,它用了如下方式进行计算:
请添加图片描述

公式中pos表示单词在句子中的位置,i表示向量中分量的下标,当i=0时PE(pos, 0)就是第0个分量的取值,PE(pos, 2*0+1) 就是第1个分量的取值,d_model表示的是向量的长度,由于上面我们对单词的编码向量长度是768,因此它这里的取值也是768,我们看看实现代码:

import numpy as npdef positional_encoding(max_len, d_model):"""Generates positional encoding for a given sequence length and model dimension.Args:max_len (int): Maximum sequence length.d_model (int): Model dimension.Returns:np.array: Positional encoding matrix of shape (max_len, d_model)."""pos_enc = np.zeros((max_len, d_model))for pos in range(max_len):for i in range(0, d_model, 2):# Compute positional encoding valuesdiv_term = np.power(10000, (2 * i) / d_model)pos_enc[pos, i] = np.sin(pos / div_term)pos_enc[pos, i + 1] = np.cos(pos / div_term)return pos_encmax_len = len(sentence)
d_model = 768
pos_enc = positional_encoding(max_len, d_model)
print("Positional Encoding:\n", pos_enc)

上面代码执行后输出如下:

Positional Encoding:[[ 0.00000000e+00  1.00000000e+00  0.00000000e+00 ...  1.00000000e+000.00000000e+00  1.00000000e+00][ 8.41470985e-01  5.40302306e-01  8.15250650e-01 ...  1.00000000e+001.04913973e-08  1.00000000e+00][ 9.09297427e-01 -4.16146837e-01  9.44236772e-01 ...  1.00000000e+002.09827946e-08  1.00000000e+00]...[-8.55519979e-01 -5.17769800e-01  8.57295439e-01 ...  1.00000000e+007.02923619e-07  1.00000000e+00][-8.97927681e-01  4.40143022e-01  9.16178088e-01 ...  1.00000000e+007.13415016e-07  1.00000000e+00][-1.14784814e-01  9.93390380e-01  2.03837160e-01 ...  1.00000000e+007.23906413e-07  1.00000000e+00]]

接下来我们按照上图把位置编码对应的向量跟单词向量相加:

pe_tensor = []
for tensor in pos_enc:pe_tensor.append(torch.from_numpy(tensor))man_index = sentence.index("man")
man_pe_tensor = word1_embedding + pe_tensor[man_index]woman_index = sentence.index("woman")
woman_pe_tensor = word2_embedding + pe_tensor[woman_index]dog_index = sentence.index("dog")
dog_pe_tensor = word6_embedding + pe_tensor[dog_index]cat_index = sentence.index("cat")
cat_pe_tensor = word5_embedding + pe_tensor[cat_index]

现在所得的最终向量不但包含了单词的语义,同时还包含了单词在句子中的位置信息,于是chatgpt就得综合这两种信息来对单词进行识别,那么单词向量加上位置信息后会有什么影响呢,一个可见的影响是,如果两个单词在位置中的距离越远,那么他们的语义相似度就会降低,也就是单词向量加上它对应的位置向量后,所得结果进行余弦计算时其对应的结果应该会有相应的降低,我们实验看看:

man_woman_pe = torch.cosine_similarity(man_pe_tensor, woman_pe_tensor, dim = 0)
print(f'man woman sim with pe: {man_woman_pe}')  #0.9260298013687134man_dog_pe = torch.cosine_similarity(man_pe_tensor, dog_pe_tensor, dim = 0)
print(f'man dog sim with pe: {man_dog_pe}')  #0.8304506540298462woman_cat_pe = torch.cosine_similarity(woman_pe_tensor, cat_pe_tensor, dim = 0)
print(f'woman cat sim with pe: {woman_cat_pe}') #0.876427948474884dog_cat_pe = torch.cosine_similarity(dog_pe_tensor, cat_pe_tensor, dim = 0)
print(f'dog cat sim with pe: {dog_cat_pe}') #0.900851309299469

上面代码运行结果如下;

man woman sim with pe: 0.8062191669897198
man dog sim with pe: 0.8047418505220771
woman cat sim with pe: 0.7858729168616464
dog cat sim with pe: 0.7830654688550558

通过结果我们能看到,在考虑到距离因素后,对应两个词在语义上的相似度确实有相应的降低。至此我们就完成了chatgpt模型输入处理部分的分析,想一节我们分析开启大模型算法的理论基石:multi-attention,正是因为这个机制或算法的引进,chatgpt这种基于transfomer架构的语言生成能力才会如此强悍。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

成功获取QQ音乐的MV视频(内含视频接口)

1.跨域接口 webpack.base.conf.js文件: const devWebpackConfig merge(baseWebpackConfig, { ...devServer: {clientLogLevel: warning,...watchOptions: {poll: config.dev.poll,},before(app) {app.get(/api/getPlaySongVkey, function (req, res) {var url h…

音乐 组件 (音频, 视频)

目的功能: axios 请求获取歌曲的 url 以及 封面照片切换歌曲歌单的展示 演示: 网易云音乐接口 github地址 https://github.com/Binaryify/NeteaseCloudMusicApi安装 git clone gitgithub.com:Binaryify/NeteaseCloudMusicApi.git在他的目录下 npm install运行 node ap…

音乐聊天室小程序

真正的大师,永远都怀着一颗学徒的心! 一、项目简介 今天推荐的这个项目是音乐聊天室,有小程序版,uniapp版和pc版,前后端均开源了,并且有详细的api和部署文档,可以学习了! 二、实现功能 普通文字…

实验探索: ChatGPT是好的推荐系统吗?

TLDR: 之前我们简单测试了下ChatGPT作为推荐器在序列推荐和可解释推荐上的能力,即如何利用ChatGPT实现推荐模型的能力?今天再跟大家分享一篇通过实验来探究ChatGPT通用推荐能力的文章,其在评分预测、序列推荐、直接推荐、解释生成…

好货推荐——好用的ChatGPT

成果图如下: 这个是Microsoft Edge浏览器的一个扩展插件,然后我们下面来操作一下怎么获取并使用这个插件 然后回到管理扩展界面打开webtab 然后他就会自己弹出webtab界面如下图: 然后点击Chat AI即可使用了,不过现在要登录账号才能…

[Unity] 使用 Visual Effect Graph 制作射击枪焰特效

全程照抄油管视频 https://www.youtube.com/watch?vsgBbnF3r60U&ab_channelGabrielAguiarProd. 1. Mesh 制作 打开 Blender 新建一个圆环 进入编辑模式,全选,沿法向挤出,向内挤出 得到一个环 环的内径很小 选中一个面 选择光照贴图拼…

影视特效合成140多种枪火炸弹爆炸破视频素材 BigVFX Starter Pack

素材简介 这是一套特效合成视频素材,包含类别爆炸物,爆照冲击波,闪电,巨大的爆炸,流星坠落,破坏,光剑,光柱,闪电、倒塌,地面塌陷,爆炸&#xff0c…

如何给视频添加特效?快速制作特效视频

如何给视频添加特效?现如今几乎我们人人每天都在与短视频打交道,有些人在日常的生活中也会剪辑一些短视频。其实剪辑短视频并没有你想象中的那么困难。只是需要找到一款合适的软件就可以很快完成。在短视频剪辑中就有需要给短视频添加特效的操作&#xf…

免费开源剪辑软件Shotcut推荐和使用教程

shotcut是一个免费、开源、跨平台的视频编辑软件,功能丰富强大,能够满足绝大多数情况下对视频编辑的需求,下面看看它如何使用吧。 下载软件 去官网下载软件,支持Linux、MacOS和Windows平台。 下载地址 打开软件 不同的平台有不…

Mac精品应用推荐:专业的后期特效制作软件

什么是影视后期?影视后期具体指什么? 影视后期制作就是对拍摄完的影片或者软件制作的动画,做后期的处理,使其形成完整的影片,包括加特效,加文字,并且为影片制作声音等。后期软件具体可以分为平…

chatgpt赋能Python-python自动化办公真的有用吗_知乎

简介 如今,Python作为一种必学的编程语言,已经走进了各行各业的办公场景。Python自动化办公也逐渐成为了一个热门话题,很多人开始使用Python来进行一些机械化、重复性的办公工作,例如数据清洗、文本处理、文件管理、自动发送邮件…

ChatGPT能否取代程序员?仍然是一个需要认真探讨的问题,对此你怎么看?

导言 ChatGPT能否取代程序员?作为一个AI语言处理程序,ChatGPT已经取得了重大的进展,它可以与人类进行流畅的对话,并能够接受和解释自然语言输入,并输出人类可理解、有意义的回复。然而,它是否能够取代程序…

chatgpt赋能python:Python自动操作Excel:提高工作效率的利器

Python自动操作Excel: 提高工作效率的利器 在当前数字化时代,电子表格已经成为了我们生产和工作中的重要工具。对于那些常常需要大量处理数据的人来说,快速而准确地操作电子表格是至关重要的。而Python提供了一种强大而又易于使用的方式来自动化Excel操…

用 ChatGPT 尝试 JavaScript 交互式学习体验,有用但不完美

很好,但还不能取代专家导师,有时还会犯错! ChatGPT 教小狗编程( Midjourney 创作) GPT-4刚刚发布,相较于GPT-3.5,它有显著的增强功能。其中之一是它在更长时间的交互和更大的提示下,…

chatgpt赋能python:Python代码自动生成工具–简介

Python代码自动生成工具 – 简介 Python是一个广泛使用的开源动态编程语言,其流行程度越来越高,许多企业和组织也在使用Python来实现其业务需求。为了提高生产力和代码的质量,Python代码自动生成工具被越来越多地采用。这些工具可以自动编写…

ChatGPT到底是赛博做题家还是科研颠覆者?

来源:中科院物理所 作者:Sidney Pertowitz 翻译:*0 审校:云开叶落 原文链接:What Does ChatGPT Know About Science? 除非最近彻底断网了,否则大家应该听说或体验过了目前非常流行的聊天机器人&#xff0c…

AI杂谈04 与Chat AI沟通代码的提词

BING AI:“与AI交流应该像与人交流一样,尊重对方的感受和权力。” 图源:文心一言 | 提词:少女机器人 漫画风格 作为小白,在使用AI生成代码的时候,耗过不少时间,栽过不少跟头,因此总…

打工人的尽头,是 “超级个体”

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 农业时代“创业”做买卖,怎么着也得几十匹骡马、上百亩良田打底,你才有胆子折腾;工业时代创业,一条生产流水线、十几个工人、几百平厂房,算是…

Midjourney 端午海报制作

不废话直接上干货 我用的国内Midjourney: AIGC研究院-midjourney,ChatGPTAI绘画,AI画画A绘图AI作画,GPT4.0,GPT3.5,midjourney共享-让更多人体验AI作画的乐趣 咒语: portrait photography from Disney Pixar Studios,Dragon Boat Festival&#xff0…

midjourney AI画图注册使用详细教程

第一步:在 discord 官网用邮箱注册 discord 账号 地址 第二步,在 midjourney官网绑定刚才注册的 discord 账号 进入 midjourney官网 ,点击Join the Bate 然后会进入这个主页,点击左侧箭头的加号,创建自己的频道服务器 …