微调预训练LLM的所有层仍然是适应新目标任务的黄金准则 。但是,诸如基于特征的方法、上下文学习和参数高效微调技术等方法,可以在最小化计算成本和资源的同时,有效地将LLM应用到新任务中 。在快速发展的AI/ target=_blank class=infotextkey>人工智能领域中,有效地利用大型语言模型(LLM)变得越来越重要 。然而,有许多不同的方式可以使用大型语言模型,这可能会让我们感到困惑 。实际上,可以使用预训练的大型语言模型进行新任务的上下文学习并进行微调 。
那么,什么是上下文学习?又如何对大模型进行微调呢?
1. 上下文学习与索引自从GPT-2和GPT-3出现以来,可以发现在预训练的通用文本语料库上的生成式大型语言模型(LLM)具备了上下文学习的能力,这意味着如果我们想要执行LLM没有明确训练的特定或新任务,不需要进一步训练或微调预训练的LLM 。同时,我们可以通过输入提示直接提供一些目标任务的示例 。
In Context Learning(ICL)的关键思想是从类比中学习 。下图给出了一个描述语言模型如何使用 ICL 进行决策的例子 。首先,ICL 需要一些示例来形成一个演示上下文 。这些示例通常是用自然语言模板编写的 。然后 ICL 将查询的问题(即需要预测标签的 input)和一个上下文演示(一些相关的 cases)连接在一起,形成带有提示的输入,并将其输入到语言模型中进行预测 。
文章插图
如果无法直接访问模型,例如通过 API 使用模型,上下文学习非常有用 。与上下文学习相关的是“硬提示微调”的概念,可以通过修改输入来期望改善输出 。将直接修改输入的单词或标记的微调称为“硬”提示微调,另一种微调方式称为“软”提示微调或通常称为“提示微调” 。这种提示微调方法提供了一种更为节省资源的参数微调替代方案 。然而,由于它不会更新模型参数以适应特定任务的微小差异,因此可能会限制其适应能力 。此外,由于通常需要手动比较不同提示的质量,提示微调可能需要耗费大量人力 。
另一种利用纯粹的上下文学习方法的方法是索引 。在LLM的范围内,索引可以被视为一个上下文学习的解决方法,它使得LLM可以转换为信息检索系统,用于从外部资源和网站中提取数据 。在此过程中,索引模块将文档或网站分解为较小的段落,并将它们转换为可以存储在向量数据库中的向量 。然后,当用户提交查询时,索引模块计算嵌入式查询与数据库中每个向量之间的向量相似度 。最终,索引模块获取前k个最相似的嵌入式向量以生成响应 。索引的示意图如下:
文章插图
2. 基于三种特征的微调方法上下文学习是一种有价值且用户友好的方法,适用于直接访问大型语言模型受限的情况,例如通过API或用户界面与LLM进行交互 。然而,如果可以访问LLM,则使用来自目标领域的数据对其进行适应和微调通常会导致更好的结果 。那么,我们如何将模型适应到目标任务?下图概述了三种常规的基于特征的微调方法 。
文章插图
除了微调编码器风格的LLM之外,相同的方法也适用于GPT般的解码器风格LLM 。此外,还可以微调解码器风格的LLM生成多句话的答案,而不仅仅是分类文本 。
2.1 基于特征的方法在基于特征的方法中,需要加载预训练的LLM,并将其应用于目标数据集 。在这里,需要特别关注生成训练集的输出嵌入,这些嵌入可以用作训练分类模型的输入特征 。虽然这种方法在以嵌入为重点的模型(如BERT)中特别常见,但也可以从生成式GPT-style模型中提取嵌入 。
分类模型可以是逻辑回归模型、随机森林或XGBoost,也可以任何我们想要的模型 。一般地,在这里线性分类器如逻辑回归表现最佳 。
文章插图
从概念上讲,可以用以下代码说明基于特征的方法:
model = AutoModel.from_pretrained("distilbert-base-uncased")# ...# tokenize dataset# ...# generate embeddings@torch.inference_mode()def get_output_embeddings(batch):output = model(batch["input_ids"],attention_mask=batch["attention_mask"]).last_hidden_state[:, 0]return {"features": output}dataset_features = dataset_tokenized.map(get_output_embeddings, batched=True, batch_size=10)X_train = np.array(imdb_features["train"]["features"])y_train = np.array(imdb_features["train"]["label"])X_val = np.array(imdb_features["validation"]["features"])y_val = np.array(imdb_features["validation"]["label"])X_test = np.array(imdb_features["test"]["features"])y_test = np.array(imdb_features["test"]["label"])# train classifierfrom sklearn.linear_model import LogisticRegressionclf = LogisticRegression()clf.fit(X_train, y_train)print("Training accuracy", clf.score(X_train, y_train))print("Validation accuracy", clf.score(X_val, y_val))print("test accuracy", clf.score(X_test, y_test))
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 计算机网络和计算机通信网络之间的本质区别是什么?
- 曾经风靡一时的ghost系统,为什么销声匿迹了?
- 一文看懂显卡的显存容量/频率/位宽/带宽
- 戴上2万5的苹果头显,我只看到了库克的焦虑
- 编程的未来 - 还有未来么?
- 陈俊生|柳州蓝澜什么家底什么身份,素颜照判若两人,梁局的父母很着急
- 蜂王浆|蜂王浆的价格,它的价值和价格是否对等
- 苏芒|不可一世的苏芒,也走到了今天
- 求职|北大教授建议:暂时找不到工作的年轻人,可先结婚生子,你同意吗
- |不走寻常路!十种反常规的特色和田玉!