在ChatGPT的API中,"embedding"通常被翻译为"嵌入"。这是一种将词汇、句子或更大的文本块转化为数值向量的方法,这些向量可以被机器学习模型理解和处理。"嵌入"这个词在此上下文中的含义是,文本信息被"嵌入"到高维空间中,每个维度都代表文本的某种特性。
那怎么理解被嵌入到高维空间中,每个维度都代表文本的某种特性呢?
"嵌入到高维空间"是一种表示方式,它意味着文本信息被转化为具有多个维度的数值向量。每个维度都代表文本的某种潜在特性。这些特性并不是预定义的或可解释的(例如,“这个维度代表语气”,“那个维度代表情感”等),而是在训练嵌入模型的过程中通过机器学习自动学习的。
举个例子,如果我们有一个词嵌入模型,我们可能会将单词“猫”嵌入为一个300维的向量。这个向量中的每个数字(或"维度")都代表了单词"猫"的某种抽象特性。这些特性是在模型学习过程中自动发现的,它们可能与语义相似性、语法关系、共现模式等有关,但我们通常不能精确地知道每个特定维度的含义。
然后,这些向量可以被用于各种NLP任务,如文本分类、命名实体识别、情感分析等。模型可以通过比较两个或更多词向量之间的距离或角度,来理解词之间的关系。例如,词嵌入模型可能会学习到"猫"和"狗"的向量在空间中相对接近,因为它们在很多上下文中都有相似的用法(都是宠物、都是动物等)。而"猫"和"微积分"的向量可能会相对远离,因为它们在语义上差别较大。
openai提供openai.embeddings_utils给用户做embedding的相关操作。
具体的例子大家可以学习
openai/cookbook/examples/Customizing_embeddings.ipynb
这个例子演示了如何将 OpenAI 嵌入定制到特定任务。
输入是以 [text_1, text_2, label] 形式的训练数据,其中 label 是 +1 表示配对相似,-1 表示配对不相似。
输出是一个可以用来矩阵乘法的嵌入矩阵。这个乘积是一个"定制嵌入",它将更好地强调与用例相关的文本方面。在二元分类的用例中,可以看到错误率降低了高达 50%。
在示例中,使用了从 SNLI 语料库中挑选的 1000 对句子对。每对句子都是逻辑上的蕴含关系(即,一个暗示着另一个)。正面例子(label = 1)。我们通过组合来自不同配对的句子生成合成的负面例子,这些句子被假设为不是逻辑上的蕴含关系(label = -1)。
对于一个聚类用例,你可以通过从同一聚类中的文本创建配对来生成正面例子,通过从不同聚类中的句子创建配对来生成负面例子。
对于其他数据集,我们看到即使只有大约 100 个训练样本也有了不错的改进。当然,有更多的例子,性能会更好。
训练数据是data/snli_1.0_train_2k.csv,这个数据集的样子如下:
,annotator_labels,captionID,gold_label,pairID,sentence1,sentence1_binary_parse,sentence1_parse,sentence2,sentence2_binary_parse,sentence2_parse 0,['neutral'],3416050480.jpg#4,neutral,3416050480.jpg#4r1n,A person on a horse jumps over a broken down airplane.,( ( ( A person ) ( on ( a horse ) ) ) ( ( jumps ( over ( a ( broken ( down airplane ) ) ) ) ) . ) ),(ROOT (S (NP (NP (DT A) (NN person)) (PP (IN on) (NP (DT a) (NN horse)))) (VP (VBZ jumps) (PP (IN over) (NP (DT a) (JJ broken) (JJ down) (NN airplane)))) (. .))),A person is training his horse for a competition.,( ( A person ) ( ( is ( ( training ( his horse ) ) ( for ( a competition ) ) ) ) . ) ),(ROOT (S (NP (DT A) (NN person)) (VP (VBZ is) (VP (VBG training) (NP (PRP$ his) (NN horse)) (PP (IN for) (NP (DT a) (NN competition))))) (. .))) 1,['contradiction'],3416050480.jpg#4,contradiction,3416050480.jpg#4r1c,A person on a horse jumps over a broken down airplane.,( ( ( A person ) ( on ( a horse ) ) ) ( ( jumps ( over ( a ( broken ( down airplane ) ) ) ) ) . ) ),(ROOT (S (NP (NP (DT A) (NN person)) (PP (IN on) (NP (DT a) (NN horse)))) (VP (VBZ jumps) (PP (IN over) (NP (DT a) (JJ broken) (JJ down) (NN airplane)))) (. .))),"A person is at a diner, ordering an omelette.","( ( A person ) ( ( ( ( is ( at ( a diner ) ) ) , ) ( ordering ( an omelette ) ) ) . ) )","(ROOT (S (NP (DT A) (NN person)) (VP (VBZ is) (PP (IN at) (NP (DT a) (NN diner))) (, ,) (S (VP (VBG ordering) (NP (DT an) (NN omelette))))) (. .)))" 2,['entailment'],3416050480.jpg#4,entailment,3416050480.jpg#4r1e,A person on a horse jumps over a broken down airplane.,( ( ( A person ) ( on ( a horse ) ) ) ( ( jumps ( over ( a ( broken ( down airplane ) ) ) ) ) . ) ),(ROOT (S (NP (NP (DT A) (NN person)) (PP (IN on) (NP (DT a) (NN horse)))) (VP (VBZ jumps) (PP (IN over) (NP (DT a) (JJ broken) (JJ down) (NN airplane)))) (. .))),"A person is outdoors, on a horse.","( ( A person ) ( ( ( ( is outdoors ) , ) ( on ( a horse ) ) ) . ) )","(ROOT (S (NP (DT A) (NN person)) (VP (VBZ is) (ADVP (RB outdoors)) (, ,) (PP (IN on) (NP (DT a) (NN horse)))) (. .)))"
是一种用于自然语言处理(NLP)任务的数据集,特别是用于文本蕴含任务(Textual Entailment)。文本蕴含任务是一种NLP任务,目标是确定一个给定的语句(前提)是否蕴含或冲突于另一个语句(假设)。
在这个数据集中,每个条目都包含了两个句子(sentence1和sentence2)和一个标签(gold_label)。标签有三种可能的值:"entailment","contradiction",或者 "neutral":
- "entailment":表示sentence1蕴含了sentence2,即根据sentence1,我们可以推断出sentence2是正确的。
- "contradiction":表示sentence1与sentence2是矛盾的,即根据sentence1,我们可以推断出sentence2是错误的。
- "neutral":表示sentence1既不蕴含也不矛盾于sentence2,即sentence1没有提供足够的信息来确定sentence2是正确还是错误。
这种数据集被用于训练一个机器学习模型,让它学会理解和推断语句之间的这种关系。在训练过程中,模型会尝试根据输入的两个句子预测正确的标签。然后,模型的预测结果会与真实的标签进行比较,如果预测正确,模型就会得到积极的反馈;如果预测错误,模型就会得到负面的反馈,然后进行调整以改进未来的预测。
代码例子主要是以下几个步骤。
0.加载类库
1.定义输入
2.加载和处理数据
3.把数据拆成训练数据集
4.生成-合成负样本
5.计算嵌入向量和余弦相似度:创建了一个缓存来保存嵌入向量。如果再次运行代码,就不必再次计算嵌入向量。
6.绘制余弦相似度的分布:在这里使用余弦相似度来衡量文本的相似度。根据经验,大部分的距离函数(L1, L2, 余弦相似度)的工作效果大致相同。注意,嵌入向量已经被归一化到长度1,所以余弦相似度等同于点积。
这些图表展示了相似对和不相似对的余弦相似度分布之间的重叠程度。如果重叠程度很高,那就意味着有一些不相似的对具有比一些相似的对更大的余弦相似度。
计算的准确率是一个简单规则的准确率,该规则预测'相似(1)',如果余弦相似度高于某个阈值X,否则预测'不相似(0)'。
7.使用提供的训练数据优化矩阵:这段代码的目的是将训练得到的优化矩阵(matrix)应用到嵌入向量上,从而得到优化后的嵌入向量,然后计算这些优化后的嵌入向量之间的相似度。
8.绘制训练前后的图像,展示在训练过程中找到的最佳矩阵的结果 矩阵越好,它将相似和不相似的对分离得就越干净。