GPT-3 vs Bert vs GloVe vs Word2vec 文本嵌入技术的性能对比测试

b9ed8824b342822e75eb80f38d85d1c3.png

来源:DeepHub IMBA
本文约3000字,建议阅读6分钟
随着NLP(自然语言处理)的最新进展,OpenAI的GPT-3已经成为市场上最强大的语言模型之一。

2022年1月25日,OpenAI公布了一个embedding endpoint(Neelakantan et al., 2022)。该神经网络模型将文本和代码转换为向量表示,将它们嵌入到高维空间中。这些模型可以捕获文本的语义相似性,并且在某些用例中似乎实现了最先进的性能。

46e43b9e827e4bf414e6ce645aa7d0b3.png

由于chatgpt的大火,GPT-3又进入到了人们的视野中,本文将通过使用text-embedding-ada-002(GPT-3的一个Embeddings,选择该模型是因为它价格适中且使用简单),与三种传统文本嵌入技术生成的嵌入的性能进行比较;GloVe(Pennington、Socher  Manning,2014 年)、Word2vec(Mikolov ,2013 年)和 MPNet(Song ,2020 年)。这些嵌入将用于训练多个机器学习模型,使用Amazon美食评论数据集中的食品评论评分进行分类。每种嵌入技术的性能将通过比较它们的准确性指标来评估。

数据准备

本文中使用的数据集是来自Amazon美食评论数据集的1000个数据集的子集。这个子集包含了使用GPT-3的“text- embedded -ada-002”模型已经生成的嵌入。嵌入是由标题(摘要)和文本的组合生成的。如图1所示,每个评论还具有ProductId、UserId、Score和从组合文本生成的令牌数量。

# Librariesfrom sentence_transformers import SentenceTransformerfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LogisticRegressionfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import classification_reportfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.preprocessing import RobustScalerfrom sklearn.pipeline import Pipelineimport gensim.downloader as apifrom sklearn.svm import SVCimport pandas as pdimport numpy as npimport openaiimport re# import datadf1 = pd.read_csv('https://raw.githubusercontent.com/openai/openai-cookbook/main/examples/data/fine_food_reviews_with_embeddings_1k.csv',index_col=0)# view first three rowsdf1.head(3)

d43cbf055e4e0c443d4850784c60994d.png

对于换行符和空格会影响我们将嵌入表示为数组。所以需要一个函数来删除不必要的字符并将嵌入转换为适当的数组格式。GPT-3嵌入变量的名称也将更改为' gpt_3 ',这样可以区别本文后面生成的其他嵌入。

# clean openai embeddingsdef clean_emb(text):# remove line breaktext = re.sub(r'\n', '', text)# remove square bracketstext = re.sub(r'\[|\]', "", text)# remove leading and trailing white spacestext = text.strip()# convert string into arraytext = np.fromstring(text, dtype=float, sep=',')return text# Rename column to gpt_3df1.rename(columns={'embedding': 'gpt_3'}, inplace=True)# Apply clean_emb functiondf1['gpt_3'] = df1['gpt_3'].apply(lambda x: clean_emb(x))

GPT-3嵌入

数据集包含预先生成的基于gpt -3的嵌入。但是我们为了生成最新的嵌入,还需要一个API密钥来访问模型。该密钥可以通过注册OpenAI API来获得。然后就是创建一个函数,指定要使用的模型(在本例中为text-embedding-ada-002)。

api_key = 'api key'# set api key as default api key for openaiopenai.api_key = api_keydef get_embedding(text, model="text-embedding-ada-002"):# replace new lines with spacestext = text.replace("\n", " ")# openai.Embedding.create to convert text into embedding arrayreturn openai.Embedding.create(input = [text], model=model)['data'][0]['embedding']

因为都是获取API的返回结果,所以这个过程非常简单。

GloVe嵌入

GloVe(用于词表示的全局向量)是一种文本嵌入技术,它根据词在大量文本中的共现统计来构建词的向量表示。GloVe 的想法是,在可比较的情况下出现的词在语义上是相关的,并且可以使用通过共现矩阵统计它们的共现来推断这些词之间的联系。

使用 spaCy 库可以轻松的生成基于 GloVe 的嵌入。这里我们使用“en_core_web_lg”英语管道。该管道对给定的文本输入执行一系列步骤,例如标记化、标记和词形还原,以将其转换为合适的格式。该管道包含 514,000 个向量,对于当前的用例来说已经足够大了。

GloVe是14年发布的,虽然到现在都快10年了,但是在transformers出现之前GloVe可以说是最成功的词嵌入方法,所以这里我们还是要拿他来进行以下对比。

import spacy# load pipelinenlp = spacy.load("en_core_web_lg")

这里我们也需要进行文本清理。如上图 2 所示,在第一个文本输入中连续出现了一些句号。这种模式必须加以纠正。

df1.combined[0]

28f2b4adbd16b28031c0a32ec6bdeeb9.png

我们创建一个函数,用单个句号替换连续的句号,并删除句子末尾的空格。

def replace_multiple_fullstops(text):# replace 2 or more consecutive fullstops with 1text = re.sub(r'\.{2,}', '.', text)# strip white spaces from ends of sentencetext= text.strip()return text# Apply functiondf1['clean_text'] = df1['combined'].apply(lambda x: replace_multiple_fullstops(x))

然后就可以在清理过程之后生成嵌入。

df1['glove'] = df1['clean_text'].apply(lambda text: nlp(text).vector)

Word2vec嵌入

word2vec技术是基于一个经过大量文本训练的神经网络模型,从其周围的上下文单词中预测目标单词。Word2vec的工作原理是用一个连续向量来表示词汇表中的每个单词,该向量捕获了使用该单词的含义和上下文。这些向量是通过无监督学习过程生成的,神经网络模型尝试预测给定上下的单词。

Gensim库可用于加载在word2vec技术上训练的模型。Gensim库中的“word2vic - Google - News -300”模型是在谷歌News数据集上训练的,该数据集约有1000亿个单词,能够表示数据集中的大部分单词。

import gensim.downloader as api# Load word2vec-google-news-300 modelwv = api.load("word2vec-google-news-300")

因为Gensim库提供的是模型而不是管道,所以在使用word2vec模型生成向量表示之前,还需要使用spaCy库对文本输入进行标记化、清理和lemm化。

def wv_preprocess_and_vectorize(text):# Process the input text using a natural language processing librarydoc = nlp(text)# Initialize a list to store the filtered tokensfiltered_tokens = []# Loop through each token in the docfor token in doc:# If the token is a stop word or punctuation, skip itif token.is_stop or token.is_punct:continue# Otherwise, add the lemma of the token to the filtered_tokens listfiltered_tokens.append(token.lemma_)# If there are no filtered tokens, return np.nanif not filtered_tokens:return np.nanelse:# Otherwise, return the mean vector representation of the filtered tokensreturn wv.get_mean_vector(filtered_tokens)# Apply functiondf1['word2vec'] = df1['clean_text'].apply(lambda text: wv_preprocess_and_vectorize(text))

MPNet嵌入(BERT)

MPNet(Masked and Permuted Language Model Pre-training)是一种用于NLP的基于transformer的语言模型预训练技术。MPNet提供了BERT模型的变体。BERT在预训练期间屏蔽一部分输入令牌,并训练模型根据未屏蔽令牌的上下文预测已屏蔽令牌。这个过程被称为掩码语言建模,它对于捕获文本语料库中单词的含义和上下文是有效的。

除了屏蔽语言建模之外,MPNet还采用了一种随机排列输入标记顺序的排列机制。这种排列有助于模型学习输入序列中单词之间的全局上下文和关系。

我们这里使用hug Face的句子转换模型“all-mpnet-base-v2”来获取基于mpnet的嵌入。该模型建立在MPNet基础模型的基础上,并对10亿句对数据集进行微调。

model_sent = SentenceTransformer('all-mpnet-base-v2')df1['mpnet'] = df1['clean_text'].apply(lambda text: model_sent.encode(text))

fec52e4542c30f0f3f708774f283fc3f.png


维度比较

下图3显示了每种嵌入的不同维度。GPT-3的最大维度为1536。然后是MPNet、Word2vec和GloVe,分别为768、300和300维。

# assign data of lists.  data = {'Name': ['gpt_3', 'mpnet', 'word2vec', 'glove'],'Dimension': [len(df1.gpt_3[0]), len(df1.mpnet[0]),len(df1.word2vec[0]), len(df1.glove[0])]}  # Create DataFrame  df_emb_len = pd.DataFrame(data)  # Set background styledf_emb_len.style.background_gradient()

评估使用的模型

为了评估文本嵌入的性能,我们使用了四个分类器;随机森林、支持向量机、逻辑回归和决策树对Score变量进行预测。数据集将被分成75:25的训练与测试集来评估准确性。由于嵌入是二维的,因此在训练之前将使用numpy函数将它们转换为单个三维数组。

# Define a list of embedding methods to evaluateembedding_var= ['gpt_3', 'mpnet', 'word2vec', 'glove']# Define a list of classifier models to useclassifiers = [('rf', RandomForestClassifier(random_state=76)),('svm', SVC(random_state=76)),('lr', LogisticRegression(random_state=76, max_iter=400)),('dt', DecisionTreeClassifier(random_state=76))]# Define a dictionary to store accuracy results for each classifieraccuracy_lists = {'rf': [],'svm': [],'lr': [],'dt': []}# Loop through each embedding methodfor emb in embedding_var:# Split the data into training and testing sets using the 'train_test_split' functionX_train, X_test, y_train, y_test = train_test_split(df1[emb].values,df1.Score,test_size=0.25,random_state=76)# Stack the training and testing sets into 3D arraysX_train_stacked = np.stack(X_train)X_test_stacked = np.stack(X_test)# Loop through each classifier modelfor classifier_name, classifier in classifiers:# Create a pipeline that scales the data and fits the classifierpipe = Pipeline([('scaler', RobustScaler()), (classifier_name, classifier)])pipe.fit(X_train_stacked, y_train)# Use the pipeline to make predictions on the test datay_pred = pipe.predict(X_test_stacked)# Evaluate the accuracy of the predictionsreport = classification_report(y_test, y_pred ,output_dict=True)acc = report['accuracy']# Store the accuracy results for each classifieraccuracy_lists[classifier_name].append(acc)

结果

下图4所示,模型呈现了一些有趣的结果。GPT-3嵌入在所有模型中获得了最高的精度。


MPNet嵌入在使用逻辑回归和支持向量机时表现次之,但在随机森林算法中被word2vec嵌入超越,在决策树算法中表现最差。关于维数对模型性能的影响,还不能得出明确的结论,但是从结果中可以明显看出,GPT-3嵌入始终优于所有其他嵌入,显示了其在文本分类方面的优势。

# Add a new key 'embeddings' to the dictionary 'accuracy_lists' and assign the list 'embedding_var' to itaccuracy_lists['embeddings'] = embedding_var# Create a list of tuples using the values from the dictionariesdf_zip = list(zip(accuracy_lists['embeddings'], accuracy_lists['lr'], accuracy_lists['svm'], accuracy_lists['rf'], accuracy_lists['dt']))# Create a DataFrame 'df_accuracy' from the list 'df_zip' and specify the column namesdf_accuracy = pd.DataFrame(df_zip, columns = ['Embedding','Logistic_Regression','Support_Vector_Machine', 'Random_Forest','Decision_Tree'])# Add a background gradient to the DataFrame for visual representationdf_accuracy.style.background_gradient()

0d581acbfa302267359e63dd34bc895e.png

所以还是那句话"别问,问就是GPT3"😏

如果你想自行测试,本文的代码在这里:

https://github.com/Derrick015/Python/blob/main/Natural_Language_Processing_(NLP)/GPT3_vs_other_embeddings_text_classification.ipynb

编辑:于腾凯

校对:林亦霖

91428bb079d86ddcb767865a6b4ce176.png

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

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

相关文章

人大李崇轩:我的生成模型修炼之路丨智源大会嘉宾风采

导读 AIGC的飞速发展离不开生成模型、深度学习以及多模态学习等领域研究的不断累积,其中生成模型的原理与算法发展是不可或缺的一部分,如:生成对抗网络 GAN 及其一系列变体、变分自编码器 VAE 及其一系列变体、自回归模型 AR、流模型 FLOW &a…

一篇文章教会你用Python抓取抖音app热点数据

今天给大家分享一篇简单的安卓app数据分析及抓取方法。以抖音为例,我们想要抓取抖音的热点榜数据。 要知道,这个数据是没有网页版的,只能从手机端下手。 首先我们要安装charles抓包APP数据,它是一款收费的抓包修改工具&#xf…

22.网络爬虫—APP数据抓取详讲

网络爬虫—APP数据抓取详讲 Fiddler工作原理安装完成Fiddler后的配置前提条件工具配置 手机数据抓取Fiddler手机端配置手机端操作 实战演示后记 前言: 🏘️🏘️个人简介:以山河作礼。 🎖️🎖️:Python领域新…

29 - Excel 图表与数据分析

Day 29 一、Excel的图表 1.图表的作用 数据图表可直观展示统计信息属性(时间性、数量性等),对知识挖掘和信息直观生动感受起关键作用的图形结构,是一种很好的将对象属性数据直观、形象地"可视化"的手段。 数据图表可…

48种数据分析可视化图表

可视化对于数据分析师来说可能不是最重要的,重要的是你分析或挖掘出来的结果是否有效。在这基础之上就需要通过可视化恰当完整的表达见解。这里又有区别了:实用性和美观性哪个更重要?要我说实用性是第一位的,能用一个元素表达最好…

我们做了一款AI口语外教,寻找测试用户

因为自己学雅思,做了一个AI口语外教,用来练习口语 有两种模式:1.自由对话2.雅思练习与模拟考试 优点如下:1.语音合成真实,聊起来有趣2.参考提示,解决你不会的问题3.雅思模式严格按照话题进行,…

使用new bing来阅读文献

1.下载安装Microsoft Edge Dev版本 Microsoft Edge 预览体验成员 (microsoftedgeinsider.com) 2.打开设置中的discover 3.打开必应 (bing.com) 改地区为美国,账号新建时地区也要改为美国 节点也需要改为美国 4.使用聊天机器人来问一些学术问题 5.打开pdf&…

VueHub:我用 ChatGPT 开发的第一个项目,送给所有 Vue 爱好者

大家好,我是DOM哥。 我用 ChatGPT 开发了一个 Vue 的资源导航网站。 不管你是资深 Vue 用户,还是刚入门想学习 Vue 的小白,这个网站都能帮助到你。 网站地址:VueHub 纯净模式:VueHub 项目托管在 GitHub&#xff0c…

腾讯又一款知名APP宣布下线!已运营8年

上一篇:阿里,似乎又有了新的可能 7月5日,腾讯旗下音频平台企鹅 FM 发布下线公告,公告称,由于业务调整 ,企鹅FM很遗憾要和大家说再见了。即日起,企鹅FM将关闭用户注册及充值功能,并在…

微信:有零钱的微信号不会被系统注销;拼多多旗下 Temu 在美起诉 Shein;Rust 1.71.0 发布|极客头条

「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews) 一分钟速览新闻点&…

互联网惊现 AI 鬼城:人类不得入内;阿里云史上最大规模降价,最高降幅达 50%;可致微信闪退的二维码Bug已找到|极客头条

「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews) 一分钟速览新闻点&…

基于蜂群对花蜜需求所做的数量模型构建及分析

问题重述: 背景:蜜蜂对人类在地球上的生存具有极其重要的作用。除去蜂蜜生产, 蜜蜂还可以通过传粉为我们间接提供食物。自 2007 年以来,由于病毒、杀 虫剂、捕食者和栖息地破坏等因素,世界各地蜜蜂数量显著下降。本文建立 在…

蜜罐技术-威胁狩猎

简介 基于欺骗伪装技术通过在攻击者入侵的关键路径上部署诱饵陷阱诱导攻击者进入与真实网络隔离的蜜网。主动识别攻击痕迹完整记录攻击者行为可以进行追踪溯源 蜜罐分为几下几类: 1.低交互式:低交互式模拟常规的服务,服务存在漏…

沙箱、蜜罐原理浅析

目录 一、沙箱(网络编程虚拟执行环境)1.1 概述1.2 重定向技术1.3 虚拟机和沙箱的区别 二、蜜罐2.1 概述2.2 蜜罐诱捕关键能力2.3 反蜜罐技术2.4 蜜罐的思考 三、网络欺骗(Cyber Deception) 一、沙箱(网络编程虚拟执行环境) 1.1 概…

当 ChatGPT 遇上开源容器安全工具集「问脉」

前言 看到最近铺天盖地的 ChatGPT 相关文章👀,作为一位爱刺激&爱冒险&好奇心强烈&动手能力强的安全技术爱好者(bushi)🤭,按捺不住躁动的灵魂,决定做一个简单的容器安全风险分析工具…

利用蜜罐捕捉攻击实验(31)

预备知识 1、蜜罐的含义和作用 蜜罐(Honeypot)是一种在互联网上运行的计算机系统。它是专门为吸引并诱骗那些试图非法闯入他人计算机系统的人(如电脑黑客)而设计的,蜜罐系统是一个包含漏洞的诱骗系统,它通过模拟一个或多个易受攻击的主机&#xff…

关于网络安全里蜜罐的详细介绍

蜜罐的定义 蜜罐的一个定义来自间谍世界,玛塔哈里 (Mata Hari) 式的间谍将恋爱关系用作窃取秘密的方式,被描述为设置“美人计”或“蜜罐”。经常会有敌方间谍中了美人计,然后被迫交待他/她所知道的一切。 在计算机安全方面,网络…

【网络安全之——蜜罐】

网络安全之蜜罐 1.什么是蜜罐?2.原理是什么?3.蜜罐的分类4.研究现状5.蜜罐的缺点6.Hfish蜜罐的使用介绍 1.什么是蜜罐? 蜜罐是一种主动防御技术,通过主动的暴露一些漏洞、设置一些诱饵来引诱攻击者进行攻击,从而可以对…

ChatGPT 的知识策略,构建低成本的认知助手

ChatGPT 风靡全球!它无处不在。我的朋友不断向我发送 ChatGPT 所做的奇妙和意想不到的事情的例子。ChatGPT 在短短五天内就吸引了超过 100 万用户。 我对 ChatGPT 变得如此出色并不感到惊讶。但令我惊讶的是,在过去两个月中,人们对这些工具的认识有了惊人的增长。这鼓励我帮…

40岁高中老师开源的数据集LAION,改变了生成式AI的未来丨智源大会嘉宾风采

导读 如今,拥有超过50亿个图文对的 LAION数据集已经成为生成式AI未来的中心ーー而随之而来的关于如何监管人工智能的争论也日益激烈。 在德国北部城市汉堡郊区的一栋房屋前,一个信箱上用铅笔潦草地写着一个单词——“ LAION”。这唯一的记号表明&#xf…