从照片中制作嵌入。图片由 ChatGPT 供应。提示“制作人工智能从照片中嵌入的图像”。ChatGPT,4,OpenAI,2024 年 2 月 18 日。https ://chat.openai.com。
先容本文的动机是,从数据中创建良好的嵌入对付大多数人工智能系统至关主要,因此这是您常常必须做的事情,使更好的嵌入成为改进所有未来人工智能系统的好方法。创建嵌入的用例是聚类、相似性搜索和非常检测等任务,所有这些都可以从更好的嵌入中受益匪浅。本文将磋商打算嵌入的两种紧张方法;利用在线模型或演习您自己的模型,这两者都将在本文的后续部分中谈论。
用于创建嵌入的管道。首先检索您的数据,例如图像、文本或音频数据。将数据输入嵌入模型,该模型输出生成的嵌入。图片由作者利用Whimsical.com制作。
目录·简介·目录·动机和用例·利用 PyTorch 模型创建嵌入·利用 HuggingFace 模型创建嵌入∘方法 1∘方法 2·利用 GitHub 创建嵌入·利用付费模型创建嵌入·创建您自己的嵌入∘自动编码器∘演习您的嵌入不才游任务上利用自己的模型·创建嵌入时的范例缺点∘忘却利用预先演习的模型∘容许证·结论
创建嵌入的一种更大略的方法是利用PyTorch 模型库中的嵌入模型。该库使您可以轻松访问一系列预先演习的模型,这些模型可以立即利用。这意味着您可以在自己的数据上利用模型,而无需演习模型。
如果您想得到图像的嵌入,您可以利用2015 年引入的ResNet 模型。确保您安装了 PyTorch(您可以在PyTorch 网站上实行此操作),然后您可以运行以下代码(部分来自PyTorch 模型库教程。
from torchvision.models import resnet50, ResNet50_Weights from PIL import Image as PILImage # 初始化权重变换resnet50(weights=ResNet50_Weights.DEFAULT) img = PILImage. open ( "image1.jpg" ) # 初始化权重变换weights = ResNet50_Weights.DEFAULT preprocess = Weights.transforms() # 将其运用到输入图像img_transformed = preprocess(img) # 初始化模型weights = ResNet50_Weights.DEFAULT model = resnet50( weights=weights) # 将模型设置为评估模式model. eval () model(img_transformed.unsqueeze( 0 )).detach().numpy()
个中 image1.jpg 可以是您想要的任何图像。我利用Unsplash 中的这张图像作为输入模型的图像,如下图所示。
詹姆斯·哈里森 (James Harrison)在Unsplash上拍摄的照片
运行代码后的结果是形状为 (1,1000) 的张量,如下所示:
嵌入利用 ResNet 50 模型对上述图像进行编码的输出。假设您利用相同的模型,您可以期望看到类似的结果。图片由作者供应。
您可以在 PyTorch 的模型库网站上找到其他模型,您可以在个中找到有关图像分类、工具检测和视频分类等下贱任务的模型。
PyTorch 模型库的优点是它非常易于利用。假设您已经在利用 PyTorch 框架,只需一行代码即可利用许多强大的模型。只管预演习模型不一定会天生最佳嵌入,但它们仍旧可以在许多机器学习任务上实现高性能,而且我也体验过旧模型(例如 ResNet),在创建图像嵌入等大略任务上仍旧表现良好。因此,我建议不要低估这些模型的力量。
ResNet 18 模型架构。图片由作者供应。
利用 HuggingFace 模型创建嵌入如果您想要更前辈和最新的模型,我建议您查看HuggingFace 网站。 HuggingFace是一个网站,里面上传了很多最新的机器学习模型,供大家利用。在 HuggingFace 上,您可以得到用于各种下贱任务的不同模型。您可以从 HuggingFace 得到的紧张模型类型有:
多式联运模型打算机视觉自然措辞处理声音的表格强化学习模型类型取自HuggingFace 模型网站,您还可以在个中查看每种模型类型的进一步下贱任务。
要从 HuggingFace 模型中提取嵌入,您该当理解模型常日如何上传。作者常日上传 2 种类型的模型。
根本型号。这些是嵌入式模型,没有经由演习来实行句子分类等下贱任务的终极层。基本模型常日位于标题<模型名称> 模型下。因此,如果您想要 RoBERTa 基本模型,您可以探求RobertaModel。下图左侧显示了一个示例基本模型。微调模型。这些是基本模型,加上一些经由演习以实行下贱任务的终极层。如果要从这些模型中提取嵌入,则必须从模型的隐蔽状态中提取嵌入,而忽略模型的终极层。常日有几个微调模型,它们以<模型名称> <下贱任务>命名。因此,如果您想要 RoBERTa 进行序列分类下贱任务,您可以探求RobertaForSequenceClassification。下图右侧显示了一个微调模型示例。该图显示了根本模型(左)和下贱任务的微调模型(右)之间的差异。基本模型是一个嵌入模型,它输出一维嵌入,在本例中是一个表示图像的 784 长数组。微调模型输出终极预测,在本例中可能是预测图像是猫的模型。如果要利用微调模型来创建嵌入,则只需利用右侧模型的前 2 层,因此输出是一维向量。图片由作者利用Whimsical.com和Draw.io制作。
根据我利用 HuggingFace 模型的履历,这两种类型的模型都可以事情,因此我建议测试这两种模型。如果您仅在嵌入之后,听起来基本模型可能是绝瞄准确的选择,但有时在对终极层进行微调后,嵌入会变得更好,特殊是当微调任务与您正在利用的内容干系时你的嵌入。因此,建议测试这两种类型的模型,并且考虑到 HuggingFace 模型的易用性,这常日不是一项须要花费大量精力的任务。因此,花额外的韶光测试这两个模型可以非常有效地利用您的韶光。
举个例子,如果我想得到文本嵌入,我会实行以下操作:
方法一访问HuggingFace transformer网站找到左侧的文本模型(如果向下滚动),然后按个中一个模型在您按下选择的下贱任务后,我会按右上角的“最多下载”或“趋势”进行排序这将使您对您选择的模型有一个完全的概述。您还可以利用下面的其他方法找到一些模型,但请把稳,您常日会看到有关每个模型的较少信息,并且您会看到来自社区成员(不一定是模型的原始作者)的更多模型
方法2前往HuggingFace model网站找到左侧的文本模型(如果向下滚动),然后按得当的下贱任务。对付文本嵌入,我会考试测验任务文本分类和句子相似度在您按下选择的下贱任务后,我会按右上角的“最多下载”或“趋势”进行排序例如,您可以利用基本 Roberta 模型创建文本嵌入,对付利用 Roberta 模型的句子嵌入,代码如下:
# 嵌入基本 roberta 模型from Transformers import AutoTokenizer, RobertaModel import torch tent = "Embedding using the Roberta model" tokenizer = AutoTokenizer.from_pretrained( "roberta-base" ) model = RobertaModel.from_pretrained( "roberta-base" , add_pooling_layer= True )输入 = tokenizer(sentence, return_tensors= "pt" )输出 = 模型(输入)嵌入 =outputs.pooler_output
输出形状为 (1x768) 的张量
如果要利用针对序列分类进行微调的 Roberta 模型创建文本嵌入,可以利用以下代码:
# 从微调的 roberta 模型嵌入用于序列分类import torch from Transformers import AutoTokenizer, RobertaForSequenceClassification Sentence = "Embedding using the Roberta model" tokenizer = AutoTokenizer.from_pretrained( "cardiffnlp/twitter-roberta-base-emotion" ) model = RobertaForSequenceClassification. from_pretrained(“cardiffnlp / twitter-roberta-base-emotion”,output_hidden_states = True)输入= tokenizer(句子,return_tensors = “pt”)与torch.no_grad(): 输出=模型(输入)嵌入= torch.mean (outputs[ "hidden_states" ][- 1 ], dim= 1 ) #抓取末了一个隐蔽层,并运用均值池化来得到嵌入
它还输出形状 (1x768) 的张量。
您可以在HuggingFace 网站上阅读有关 Roberta 模型的更多信息。
HuggingFace 是一个有用的网站,由于研究论文的作者常常会在 HuggingFace 上发布他们的模型,这对付进一步的研究非常主要,既可以验证论文中取得的结果,也可以在当前研究的根本上进行进一步的研究。因此,HuggingFace 是人工智能研究发展的紧张贡献者,也是一个您可以利用自己的网站来查找可供公众年夜众利用的最新模型的网站。
HuggingFace 的另一个有用特色是与最新型号保持同步。这是我把稳到 PyTorch 模型库和 HuggingFace 模型之间最大的差异。这是由于 HuggingFace 会更定期地更新公开的最新机器学习模型。
利用 GitHub 创建嵌入探求可以为 AI 系统创建良好嵌入的模型的另一种方法是利用 GitHub。许多作者会上传演习模型的代码,还会上传 GitHub 高下载模型权重的链接。如果模型权重可以从 GitHub 上得到,那么它们常日位于 HuggingFace 上,在这种情形下您自然可以利用上面的方法,但不幸的是有时情形并非如此。利用 GitHub 中的模型常日比利用 HuggingFace 中的模型须要更多的努力,但如果您在 GitHub 上找到特殊有用的模型,那么这可能值得投入韶光。
然而,在 GitHub 上找到好的模型可能很困难。查找模型的常见方法是大略地在 Google 上搜索您要查找的任务,然后 GitHub 存储库就会涌如今搜索中。另一种方法是搜索科学文章数据库,例如Google Scholar或ArchiveX,以查找具有良好模型的科学论文。这些论文常日会包含一个 GitHub 存储库及其代码和模型权重。
然而,在 GitHub 上找到好的模型的最佳方法是利用 Meta 的PapersWithCode网站。 PapersWithCode 重点先容了包含代码以及已揭橥的科学文章的不同科学研究。因此,在 PapersWithCode 上,您可以找到适宜您的特定用例的良好模型,然后找到该模型的代码。我还建议选择“浏览最前辈的”选项卡来查看当前适宜您选择的任务的最佳模型。利用这种方法,您可以找到一些特殊好的模型,可用于为数据集创建嵌入。我用于利用PapersWithCode中的模型创建嵌入的管道是:
从 PapersWithCode 中查找最佳嵌入模型的管道。图片由作者利用Whimsical.com制作
利用付费模型创建嵌入如果您想要最好的嵌入,利用付费在线 API 常日是最佳选择。有几家公司供应这种类型的 API,例如Microsoft Azure、Google Cloud或OpenAI。这些嵌入的本钱自然取决于您利用的模型以及要嵌入的数据量。如果您只是从奇迹余爱好项目,并确保没有过度利用嵌入 API,我认为本钱可能相称合理。例如,OpenAI 供应了带有text-embedding-3-small模型的文本嵌入 API,每美元可为您供应大约 37 500 000 个单词!
(这是利用OpenAI 网站的定价打算的,每美元取 62500 个页面,假设每页 800 个代币,即每页 8000.75 = 600 个单词,即每美元 62500600 = 37 500 000 个单词)。相称便宜,除非您嵌入大量文本。
利用付费 API 嵌入做事有几个优点:
它们利用起来很大略。您必须得到 API 密钥,然后可以利用所选公司网站上给出的示例代码,并且您拥有嵌入这里的嵌入模型经由专门演习,可以为您供应故意义的嵌入。与许多其他经由演习以实行下贱任务的模型相反。这常日会供应更高质量的嵌入您将可以访问最前辈的模型,这些模型常日无法在 HuggingFace 等网站上免费得到。这意味着付费 API 的嵌入质量常日会尽可能好。我在这里还想在利用付费 API 时发出警告。首先,很随意马虎失落去对 API 利用情形的跟踪,如果不加以掌握,可能会产生巨大的本钱。因此,我强烈建议您在利用 API 时保持高度当心,由于每次利用都会产生用度。此外,完备节制定价模型可能很困难。例如,您常日不知道要发送到 API 的确切字数,这可能会使 API 的本钱与您的预期不同。因此,我建议您提前打算您的 API 利用用度,以确保您不会碰着任何意外用度。末了,您还必须始终担保 API 密钥的安全,并确保它不会落入坏人之手,否则可能会产生高昂的本钱。
创建您自己的嵌入我要谈论的末了一种创建嵌入的方法是从头开始创建您自己的嵌入。利用这种方法可能很困难,并且由于创建良好的嵌入模型须要大量的打算能力,因此您可能无法复制以前方法的嵌入质量。然而,制作自己的嵌入仍旧是一个主要的学习课程,可以充分理解嵌入的事情事理以及它们的用场,这便是为什么我也推举这种方法。下面,我展示了两种创建您自己的嵌入的方法。
自动编码器自动编码器是一种模型,它接管输入(例如图像),将其缩小到较低的维度,然后考试测验从较低的维度重新创建输入数据。GeeksForGeeks 创建了一篇高质量的文章,先容其事情事理以及如何创建自己的自动编码器,我建议您阅读该文章。作为演习您自己的自动编码器的示例,您必须获取大量图像,例如 MNIST 数据集,您可以在此处下载。然后,您可以演习模型,利用线性层(编码器)将每个图像缩小到较低的尺寸,然后利用另一组线性层(解码器)重新创建同一图像。演习后,您只能利用缩小尺寸的线性层(编码器)作为图像的嵌入。
自动编码器架构。前两层是编码器,后两层是解码器。图片由作者供应。
不才游任务上演习您自己的模型创建自己的嵌入的另一种方法是不才游任务(例如图像分类)上演习模型。同样,您可以下载MNIST 数据集,并创建一个图像分类器网络,您可以在本 PyTorch 教程中理解该网络。演习完成后,您可以忽略图像分类模型中的终极分类层,以得到嵌入。
为了更好地理解这一点,我将向您展示一个包含 Python 代码的示例。首先,定义一个模型架构,如下例所示,我采取 (28x28) 图像并输出 10 个类别的预测,类似于 MNIST 问题。
import torchimport torch.nn as nnimport torch.nn.functional as Fclass SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1) self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1) self.pool = nn.MaxPool2d(2, 2) self.fc1 = nn.Linear(64 7 7, 128) self.fc2 = nn.Linear(128, 10) def forward(self, x): x = F.relu(self.conv1(x)) x = self.pool(x) x = F.relu(self.conv2(x)) x = self.pool(x) x = x.view(-1, 64 7 7) x = F.relu(self.fc1(x)) x = self.fc2(x) return x def predict(self, x): #return class that is predicted return torch.argmax(self.forward(x), dim=1) def get_embedding(self, x): with torch.no_grad(): #we don't need gradients for the embedding x = F.relu(self.conv1(x)) x = self.pool(x) x = F.relu(self.conv2(x)) x = self.pool(x) x = x.view(-1, 64 7 7) x = F.relu(self.fc1(x)) return x
在这里您可以看到如何利用微调模型来检索嵌入。要得到模型的类预测,您可以利用Predict方法,该方法输出 0-9 之间的数字。但是,如果您只想要图像的嵌入,则可以利用get_embedding方法,该方法与前向方法(用于演习模型)类似,利用大量模型层,但get_embedding方法完备忽略终极的层连接层self.fc2,因此get_embedding方法不是输出 0-9 之间的数字,而是输出形状 (1x128) 的向量,该向量可用作输入图像的嵌入。
因此,要利用上面定义的模型,您须要利用前向函数来演习模型,例如利用此 PyTorch 教程。演习后,您可以利用 get_embedding 函数来获取图像的故意义的嵌入。
创建嵌入时的范例缺点我还想提及创建嵌入时可能犯的一些范例缺点。这些是我在为数据集创建嵌入时犯下的缺点。
忘却利用预先演习的模型这听起来可能很明显,但例如,当利用 PyTorch 或 HuggingFace 模型时,很随意马虎犯检索非预演习模型的缺点,该模型实质上只是一个具有一组随机启动权重的模型架构。因此,每次您得到模型时,请确保它是该模型的预演习版本
容许证如果您将模型用于非商业案例,这很少会成为问题,并且公开可用的模型在大多数情形下至少拥有个人或学术容许。但是,如果您在公司事情,或者想要将嵌入用于商业用场,则必须理解您正在利用的模型的容许证。具有非商业容许证的模型不能以任何办法用于商业用场,因此在利用模型之前应谨慎检讨模型的容许证。探求许可商业用场的容许证,例如MIT 容许证或Apache 2.0容许证。
结论在本文中,您理解了可用于获取数据嵌入的不同方法。嵌入对付您将利用的任何 AI 模型都很有用,并且嵌入可以由所有数据类型(例如图像、文本和音频)制成。我提到的打算嵌入的不同方法是:
PyTorch 模型Huggingface模型GitHub 模型付费 API,例如 Google、Microsoft 或 OpenAI创建您自己的嵌入这些方法中的任何一种都可以用于将数据转换为嵌入,然后可以将其用于聚类、相似性搜索或分类等任务。