Embedding技术学习

可能很多人并没有关注Embedding技术,但实际上它是GPT非常重要的基础,准备的说,它是GPT模型中理解语言/语义的基础。

【解释什么是Embedding】

对于客观世界,人类通过各种文化产品来表达,比如:语言,艺术品,图书,手机,电脑等……

我们可以用语言表达,通过人的意识,比如问题,猜想,理论,反驳 来进一步表达。

对于脑科学家,一直在研究人的意识从何而来,但截止目前,并没有什么突破。人的大脑是怎么回事,我们并没有搞明白。但OpenAI的工程师说,他们现在就是在模仿人的意识的生成来进行AI的研发(一种说法)。

对于计算机,是如何记录或进一步理解客观世界呢?所有人都知道的答案,就是使用 0 和1了。

具体的来看一下:

灰度的图像:会使用0,1生成灰度的矩阵。

彩色的图像:将RGB拆出三个通道 

西文的表示:这个很简单,一一对应就好了。

中文如何表示的呢?

        Unicode, UTF-8(包含全世界的所有语言进行表达)(可变长度,1-4个字节,按需扩展)

但这些只表达了单个元素的存储,并没有有语义,没有理解。

在机器学习中,为了学习这些,我们进一步采用了 One-hot 编码,你可以理解按单词来进行记录。比如:OpenAI ,利用了 10万个编码。

那如何表达单词之间的关系呢?和其它一样,也是使用特征维度,比如gpt-4的embedding-data2采用了1536维的向量。也就是说,每个单词和其它单词,可以在1536个维度上进行比较。

        这就是我们所说的语言模型了:

        为了表达词语的语义,我们必须能计算和存储词与词之间的关联关系,也就是需要有一个多维的向量空间来理解语义。而这个多维的向量空间与每个词都有对应关系。我们认为单词映射到这个高维空间就是词嵌入(Embedding),通过这个高维空间可以捕捉到词的语义信息。

        不知道绕了这么大一圈,有没有说清楚词嵌入是个什么概念,可能是中文翻译的原因,感觉这个嵌入的说法并不准确。

        在进一步介绍Embedding之前,我们不得不说一下表示学习。

什么是表示学习?

      我们通过算法,通过机器学习,从原始数据中学习到表示形式和特征,最终可理解数据的含义,学会一些知识。这叫做表示学习。

        嵌入,然后通过降维,保留高维空间的含义,它是表示学习的重要表达方式。

        在表示学习的表达时,为了人可以看懂,需要通过Embeding 进行降维,变成人可以理解的信息。

        我们拿大语言模型为例 ,为了表达语义,会使用嵌入将学习的特征存储起来。因为这些存储值都是实数,它们之间实际上是可以进行运算的。而运算的关系,会表达出语义(后面会举例)

Embedding的作用

其实讲了它的定义,它的作用就显而易见了。

看下图的输出,通过数据降维,可以通过颜色,位置就可表达学习的结果。

比如:我们认为图中在三维坐标离得近的,一定有相似的语义。而颜色可能是我们想比较的另外一个特征,我们通过颜色与位置的比较,可以得出一些结论。

再看这个,可以得出向量运算得到如下的关系,是不是有一定的道理。提取出了语义。

我们认为 King 和 Queern的差距 雷同于 Man 和 Woman的差距,这显然是符合语义的。

背后的原理是什么?

        下面这张图,可以很是确的表达出Embedding技术在LLM中的重要性。

        它的原理也很简单,就是一个提取文字特征的一种方式。而它们的语义的相似性,实际上也是我们通过现实世界中的一些存在的文本训练出来的(因为训练的过程会根据词之间的出现频率来进行推导,最终得到相互间的多维空间的关系值)

        所以,可能训练出来的结果会存在偏见,但这种偏见一定是你给的语料里面存在的。

        而因为我们对于训料语义的一视同仁,也可能在某些领域,得出的语义并不是真实的,只能说是大多数人的理解。(真理有时会掌握在少数人手里),碰到这种情况,就只能通过后期的微调来改善了。

如何使用Embedding

        那我们可以直接使用它吗?其实OpenAI的API里面,对这个模型也可以付费使用的。

我们目前可用到的模型是:

注意这里的1536维度,说明单词可以在1536维的空间中比较它们的相似度,这个其实很难用人的思维来理解了(为什么是1536,这应该是大量训练得出的经验值 ,实际上最新的版本已经扩展到3072维,不知道这种维度会带来什么惊喜)

如果我们单独使用,可以完成 文本的搜索,评论聚类等功能:

下面有三个例子来说明使用方法:

数据:对于羡食平台的评论,我们将评论的标题 和评论的主体内容放到一起来分析。

对于评论的评分做为一个相关因素来考察。

下面给了三个例子。

# 设置调用的API
embedding_model = "text-embedding-ada-002"
embedding_encoding = "cl100k_base"
from openai import OpenAI
client = OpenAI()# 调用embedding,获得1536维的向量
def embedding_text(text, model="text-embedding-ada-002"):res = client.embeddings.create(input=text, model=model)return res.data[0].embedding
df["embedding"] = df.combined.apply(embedding_text)# 示例一:评分和评论的相似度关系图
# 可以使用 t-SNE对结果进行降维显示,下面降为2维
# 可以得到 聚类后的图,查看效果
import numpy as np
import matplotlib.pyplot as plt
import matplotlibfrom sklearn.manifold import TSNE
matrix = np.vstack(df_embedded['embedding_vec'].values)
tsne = TSNE(n_components=2, perplexity=15, random_state=42, init='random', learning_rate=200)
vis_dims = tsne.fit_transform(matrix)
colors = ["red", "darkorange", "gold", "turquoise", "darkgreen"]
x = [x for x,y in vis_dims]
y = [y for x,y in vis_dims]color_indices = df_embedded.Score.values - 1
colormap = matplotlib.colors.ListedColormap(colors)
plt.scatter(x, y, c=color_indices, cmap=colormap, alpha=0.3)
plt.title("Amazon ratings visualized in language using t-SNE")
plt.show()# 示例二:评论的聚类 与评论的文本相似度的关系
import numpy as np
from sklearn.cluster import KMeans
n_clusters = 4
kmeans = KMeans(n_clusters = n_clusters, init='k-means++', random_state=42, n_init=10)
kmeans.fit(matrix)
df_embedded['Cluster'] = kmeans.labels_
colors = ["red", "green", "blue", "purple"]tsne_model = TSNE(n_components=2, random_state=42)
vis_data = tsne_model.fit_transform(matrix)
x = vis_data[:, 0]
y = vis_data[:, 1]
color_indices = df_embedded['Cluster'].values
colormap = matplotlib.colors.ListedColormap(colors)
plt.scatter(x, y, c=color_indices, cmap=colormap)
plt.title("Clustering visualized in 2D using t-SNE")
plt.show()# 示例三:文本检索,输入关键字,查找相似的评论
# cosine_similarity 函数计算两个嵌入向量之间的余弦相似度。
def cosine_similarity(a, b):return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))# 定义一个名为 search_reviews 的函数,
def search_reviews(df, product_description, n=3, pprint=True):product_embedding = embedding_text(product_description)df["similarity"] = df.embedding_vec.apply(lambda x: cosine_similarity(x, product_embedding))results = (df.sort_values("similarity", ascending=False).head(n).combined.str.replace("Title: ", "").str.replace("; Content:", ": "))if pprint:for r in results:print(r[:200])print()return resultsres = search_reviews(df_embedded, 'delicious beans', n=3)

例子一的输出:

上图可以看出,评论分成了几大块,分别有正面,负面,狗粮相关评论(通过实际数据可以看出,这个分类没有问题)。

        但是,评分与评论的关系好像并不明显?

        其实这也很好解释:因为网络评价就是这样,高分有可能是个负面评论,正面评论可能是个高分,没有直接相关性。下面例子进一步说明。

例子二:

        我们通过聚类,用聚类的值替代评分,发现了KMeans的聚类 和 评论相似度的计算是一致的,仔细查看四个色块的评论,确实是四种不同的评论。分别是:两个正面,一个狗粮评论,一个负面评论)

例子三的输出:

Good Buy:  I liked the beans. They were vacuum sealed, plump and moist. Would recommend them for any use. I personally split and stuck them in some vodka to make vanilla extract. Yum!

Jamaican Blue beans:  Excellent coffee bean for roasting. Our family just purchased another 5 pounds for more roasting. Plenty of flavor and mild on acidity when roasted to a dark brown bean and befor

Delicious!:  I enjoy this white beans seasoning, it gives a rich flavor to the beans I just love it, my mother in law didn't know about this Zatarain's brand and now she is traying different seasoning

可以看出,搜索的效果非常不错,

对了,RAG的向量知识库的检索,背后的技术原理应该就是使用Embedding来完成的。

好了,差不多就这些内容了,Embedding技术了解这么多就足够了。

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

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

相关文章

如何快速提取出一个文件里面全部指定类型的文件的全部路径

首先,需要用到的这个工具: 度娘网盘 提取码:qwu2 蓝奏云 提取码:2r1z 打开工具,切换到第五个模块,文件批量复制模块(快捷键:Ctrl5) 点击右边的“搜索添加”按钮&#…

unordered系列关联式容器底层哈希结构的介绍,哈希表的模拟实现(哈希冲突的解决方法采用闭散列线性探测)

目录 前言 unordered系列关联式容器之所以处理数据的效率比较高,是因为底层使用了哈希结构,哈希结构的优点是:不经过任何比较,一次直接从表中得到要搜索的元素,通过某种函数(hashFunc)使元素的存储位置与它的关键码之…

mapreduce | 自定义Partition分区(案例2)

1.需求 统计每个手机号消费总金额,按照消费金额降序排序,最终联通、电信、移动分别写入不同的文件。 130、131、132(联通) 133(电信) 135、136、137、138、139 (移动) 手机号,消费记…

sql-行转列2(转置)

行转列的常规做法是,group bysum(if())【或count(if())】 例题: 表table如下: DDateshengfu2015-05-09胜2015-05-09胜2015-05-09负2015-05-09负2015-05-10胜2015-05-10负2015-05-10负 如果要生成下列结果, 该如何写sql语句? DDate胜负20…

【计算机网络】-性能指标(速率、带宽和吞吐量)

速率、带宽和吞吐量 信道(channel): 表示向某个方向传输信息的通道,一条通信线路在逻辑上往往对应着一条发送信道和接收线道 速率(speed): 指的是连接到网络上的节点在信道上传输的速率。也…

全局变量在函数中的使用:Python 编程技巧解析

在Python编程中,全局变量是一种在程序的多个部分中共享数据的机制。全局变量在函数中使用时,需要特别注意其作用域和访问方式。本文将详细讲解如何在函数中使用全局变量,并提供示例代码,帮助初学者深入理解这一概念。 基本原理 …

web3.js的使用

前端开发web3一共常用的库有4个,分别是: web3.js [核心库]ethereumjs-tx1.3.7 (这个包已经被弃用,只有1.3.7可用,如果采用ts开发则可以使用另一个包ethereumjs/tx) bip39 [助记词库]ethereumjs-wallet [钱包库] 注意&#xff1a…

AI作画涉及的深度学习算法

AI作画中使用的深度学习算法多种多样,这些算法主要基于神经网络的结构和训练方式,以生成和改进艺术作品。以下是一些在AI作画中常用的深度学习算法: 生成对抗网络(GANs, Generative Adversarial Networks)&#xff1a…

Linux —— 线程

Linux —— 线程 什么是线程Linux如何实现线程Winodws如何实现线程使用一下线程pthread_create函数原型参数说明返回值 如何解决 ps -aL 查看线程线程为什么轻量 我们今天进入线程的学习: 什么是线程 我们先来了解一个笼统的概念:简单来说,…

负载均衡技术

负载均衡技术 1. MapReduce MapReduce 是一种编程模型,旨在处理大规模数据集的并行计算任务,通常针对大于 1TB 的数据。该模型借鉴了函数式编程语言的概念,如 “Map” 和 “Reduce”,以及矢量编程语言的特性,使得编程…

计算机发展史故事【12】

芯片计算机 众所周知,所谓286、386、486 个人电脑等名称的起源,在于它们采用了英特尔公司研制的微处理器X86 系列芯片286、386 和486。然而,这种以数字为电脑命名的奇特现象,却来源于霍夫博士等人发明的世界上第一个微处理器芯片…

MySQL变量定义与使用

1 set userName小可爱; set userName:玛卡巴卡; select userName as名称; 2 set x5,y7,dx3.1425,dy6.678; selectxy as 四则运算; selectx-y as 四则运算; selectx*y as 四则运算; selectx/y as 四则运算; selectx%y as 四则运算; 3 set result1dxdy as 四则运算; set res…

动态路由-链路状态路由协议ospf案例

实验拓扑和要求如图 ospf实验 1.设置各个接口地址 2.测试ar5到ar6的连通性 3.配置ospf协议,routerid,area, 详细的网络信息,等待网络收敛后, 查看ospf信息,路由表信息,再次测试连通性 注意区域…

防火墙技术基础篇:网络地址转换(NAT):防火墙技术的核心机制

防火墙技术基础篇:网络地址转换(NAT):防火墙技术的核心机制 网络地址转换(NAT)是现代网络架构中不可或缺的一个组成部分,尤其在防火墙技术的实现中扮演着重要角色。本文旨在全面解读NAT的工作机…

AI算法-高数5.1-线性代数-向量定义、表示和向量间的关系

看线性代数这篇文章(AI算法-高数5-线性代数1-基本概念、向量-CSDN博客)理解有些吃力的朋友们,可以先学下宋浩老师的这些课程。 宋浩老师: 3.1 n维向量及其运算_哔哩哔哩_bilibili 3.2 向量间的线性关系(一&#xff…

【Python】深度学习中随机数种子seed的种类和设置方式

在机器学习和深度学习的实验中,确保实验的可重复性是非常重要的。下面定义的set_random_seed(seed) 函数的主要目的是设置随机种子以确保代码的随机性操作(如参数初始化、数据集分割、随机数据增强等)在不同运行之间是可重复的。这使得其他研…

MFC编程之设计美丽的对话框

目录 写在前面: Part 1:美美的设计一下计算器的布局 1.描述文字: ​编辑 2.ID: Part 2:美美熟悉一下计算器的工作流程 Part 3:美美设计一下控件功能 1.edit control: 2.相关变量初始化&…

go语言中io操作中的 io.Reader 和 io.Writer的获取方法 总结

我们在对文件进行io操作的时候,经常看到需要我们传递一个 io.Reader 或者 io.Writer 对象作为读写的入参, 那么我们该如何或者这些个RW对象呢? 其实很简单,你只需要查找一下哪些对象实现了 Read或者 Writer方法,那么你…

ajax的请求解密

$.ajax({url: i,dataType: "json",success: function(e) {r.decompressAndDeobfuscateData(e, w).then((e>{if (!(e JSON.parse(e))[0].series[0].serie.data[0])return t(!0);e r.transformData(e),I && console.log("result:", e);解释每一…

uniapp 百度地图 拖动获取经纬度级搜索连用

import loadBMap from /utils/loadBMap.js// 百度聚合具体代码 // 拖动 initMapc() {let that thisloadBMap(百度key).then(() > {map new BMap.Map(mapContainer)const centerPoint new BMap.Point(this.longitude, this.latitude)map.centerAndZoom(centerPoint, this.…