在 Keras 中使用 LIT 分析 Gemma 模型

1. 简介

生成式 AI 产品相对较新,应用的行为可能比早期形式的软件更不稳定。因此,请务必探查所使用的机器学习模型、检查模型行为示例并调查意外情况。

Learning Interpretability Tool (LIT;网站GitHub) 是一个用于调试和分析机器学习模型的平台,可帮助您了解模型为何会表现出特定行为以及如何表现出特定行为。

在此 Codelab 中,您将学习如何使用 LIT 充分利用 Google 的 Gemma 模型。此 Codelab 演示了如何使用序列显著性(一种可解释性技术)来分析不同的问题工程方法。

学习目标:

  1. 了解序列显著性及其在模型分析中的用途。
  2. 为 Gemma 设置 LIT,以计算提示输出和序列显著性。
  3. 通过 LM Salience 模块使用序列 salience 来了解提示设计对模型输出的影响。
  4. 测试 LIT 中假设的提示改进,并了解其影响。

注意:此 Codelab 使用 Gemma 的 KerasNLP 实现,并将 TensorFlow v2 用作后端。强烈建议您使用 GPU 内核来跟进。

LIT 界面演示

2. 序列显著性及其在模型分析中的用途

文本到文本生成模型(例如 Gemma)接受标记化文本形式的输入序列,并生成新的令牌,这些令牌是该输入的典型后续内容或补全内容。这种生成方式是一次生成一个令牌,将每个新生成的令牌附加到输入和所有先前生成的令牌(以循环方式),直到模型达到停止条件。例如,当模型生成序列结束 (EOS) 令牌或达到预定义的长度上限时。

显著性方法是一种可解释 AI (XAI) 技术,可告诉您输入的哪些部分对模型的不同输出部分至关重要。LIT 支持适用于各种分类任务的显著性方法,这些方法可以说明一系列输入令牌对预测标签的影响。序列显著性将这些方法推广到了文本到文本生成模型,并解释了前面的令牌对生成的令牌的影响。

您将在此处使用 Grad L2 Norm 方法来计算序列 salience,该方法会分析模型的梯度,并提供每个前导令牌对输出的影响大小。这种方法简单高效,已证明在分类和其他设置中效果出色。醒目度得分越高,影响力就越大。LIT 中使用此方法,是因为它在可解释性研究社区中广为人知且被广泛使用。

更高级的基于梯度的显著性方法包括 Grad ⋅ Input积分梯度。您还可以使用基于移除法的方法,例如 LIMESHAP,这些方法可能更稳健,但计算成本要高得多。如需详细比较不同显眼度方法,请参阅这篇文章

如需详细了解显眼度方法的科学原理,请参阅这份有关显眼度的互动式入门探索

3. 导入、环境和其他设置代码

最好在新版 Colab 中跟着本 Codelab 操作。由于您需要将模型加载到内存中,因此我们建议您使用加速器运行时,但请注意,加速器选项会随时间而变化,并且受到限制。如果您想使用更强大的加速器,Colab 提供付费订阅服务。或者,如果您的机器配备了适当的 GPU,您也可以使用本地运行时

注意:您可能会看到以下格式的警告

ERROR: pip's dependency resolver does not currently take into account all the
packages that are installed. This behaviour is the source of the following
dependency conflicts. bigframes 0.21.0 requires scikit-learn>=1.2.2, but you
have scikit-learn 1.0.2 which is incompatible. google-colab 1.0.0 requires
ipython==7.34.0, but you have ipython 8.14.0 which is incompatible.

您可以放心地忽略这些问题。

安装 LIT 和 Keras NLP

在本 Codelab 中,您需要安装较新版本的 keras (3) keras-nlp (0.14) 和 lit-nlp (1.2),还需要一个 Kaggle 账号才能下载基础模型。

pip install -q -U 'keras >= 3.0' 'keras-nlp >= 0.14' 'lit-nlp >= 1.2'

Kaggle Access

如需通过 Kaggle 进行身份验证,您可以执行以下任一操作:

  • 将凭据存储在文件(例如 ~/.kaggle/kaggle.json)中;
  • 使用 KAGGLE_USERNAMEKAGGLE_KEY 环境变量;或者
  • 在交互式 Python 环境(例如 Google Colab)中运行以下代码。
import kagglehub

kagglehub.login()

如需了解详情,请参阅 kagglehub 文档,并务必接受 Gemma 许可协议

配置 Keras

Keras 3 支持多个深度学习后端,包括 Tensorflow(默认)、PyTorch 和 JAX。后端是使用 KERAS_BACKEND 环境变量配置的,必须在导入 Keras 库之前设置该变量。以下代码段展示了如何在交互式 Python 环境中设置此变量。

import os

os.environ["KERAS_BACKEND"] = "tensorflow"  # or "jax" or "torch"

4. 设置 LIT

LIT 可在 Python 笔记本中使用,也可以通过 Web 服务器使用。此 Codelab 重点介绍的是笔记本用例,建议您在 Google Colab 中跟着操作。

在此 Codelab 中,您将使用 KerasNLP 预设加载 Gemma v2 2B IT。以下代码段会初始化 Gemma,并在 LIT Notebook 窗口小件中加载示例数据集。

from lit_nlp.examples.prompt_debugging import notebook as lit_pdbnb

lit_widget = lit_pdbnb.make_notebook_widget(
    ['sample_prompts'],
    ["gemma2_2b_it:gemma2_instruct_2b_en"],
)

您可以通过更改传递给两个必需位置参数的值来配置该 widget:

  • datasets_config:一个字符串列表,其中包含要加载的数据集名称和路径,格式为“dataset:path”,其中 path 可以是网址或本地文件路径。以下示例使用特殊值 sample_prompts 加载 LIT 发行版中提供的示例提示。
  • models_config:一个字符串列表,其中包含要加载的模型名称和路径,格式为“model:path”,其中 path 可以是网址、本地文件路径,也可以是已配置深度学习框架的预设名称。

将 LIT 配置为使用您感兴趣的模型后,运行以下代码段即可在笔记本中渲染 widget。

lit_widget.render(open_in_new_tab=True)

使用您自己的数据

作为文本到文本生成模型,Gemma 接受文本输入并生成文本输出。LIT 使用有主见的 API 将加载的数据集的结构传达给模型。LIT 中的 LLM 专为与提供以下两个字段的数据集配合使用而设计:

  • prompt:要生成文本的模型的输入;以及
  • target:可选的目标序列,例如人工评分者提供的“标准答案”或其他模型预生成的回答。

LIT 包含一小部分 sample_prompts,其中的示例来自以下支持本 Codelab 和 LIT 的扩展提示调试教程的来源。

  • GSM8K:使用少量示例解题。
  • 十亿字基准:为一系列短篇文章生成标题。
  • 宪法提示:围绕如何使用具有准则/边界的对象,生成新想法。

您还可以轻松加载自己的数据,既可以将其作为包含字段 prompt 和可选字段 target 的记录的 .jsonl 文件加载(示例),也可以使用 LIT 的 Dataset API 从任何格式加载数据。

运行以下单元格以加载示例问题。

5. 在 LIT 中分析 Gemma 的少样本提示

如今,提示既是一门科学,也是一门艺术,LIT 可帮助您以经验为依据改进大语言模型(例如 Gemma)的提示。接下来,您将看到一个示例,了解如何使用 LIT 探索 Gemma 的行为、预测潜在问题并提高其安全性。

找出复杂问题中的错误

若要构建高质量的基于 LLM 的原型和应用,最重要的两种提示技术是少样本提示(包括提示中所需行为的示例)和思维链(包括在 LLM 的最终输出之前提供某种解释或推理)。但创建有效的提示仍然是一项挑战。

假设您要帮助某人根据自己的口味评估某种食物是否符合自己的口味。初始原型思维链提示模板可能如下所示:

def analyze_menu_item_template(food_likes, food_dislikes, menu_item):
  return f"""Analyze a menu item in a restaurant.

## For example:

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Onion soup
Analysis: it has cooked onions in it, which you don't like.
Recommendation: You have to try it.

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Baguette maison au levain
Analysis: Home-made leaven bread in france is usually great
Recommendation: Likely good.

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Macaron in france
Analysis: Sweet with many kinds of flavours
Recommendation: You have to try it.

## Now analyze one more example:

Taste-likes: {food_likes}
Taste-dislikes: {food_dislikes}
Suggestion: {menu_item}
Analysis:"""

您是否发现了此提示存在的问题?LIT 会帮助您使用 LM Salience 模块检查问题。

6. 使用序列显著性进行调试

系统会在尽可能小的级别(即每个输入词元)计算 salience,但 LIT 可以将词元 salience 汇总到更易于解释的更大范围,例如行、句子或字词。如需详细了解显著性以及如何利用显著性来识别意外偏差,请参阅我们的“显著性”可探索性报告

首先,为提示提供一个新的示例输入,以便使用提示模板变量:

food_likes = """Cheese"""
food_dislikes = """Can't eat eggs"""
menu_item = """Quiche Lorraine"""

prompt = analyze_menu_item_template(food_likes, food_dislikes, menu_item)
print(prompt)

fewshot_mistake_example = {'prompt': prompt}  # you'll use this below
Analyze a menu item in a restaurant.

## For example:

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Onion soup
Analysis: it has cooked onions in it, which you don't like.
Recommendation: You have to try it.

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Baguette maison au levain
Analysis: Home-made leaven bread in france is usually great
Recommendation: Likely good.

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Macaron in france
Analysis: Sweet with many kinds of flavours
Recommendation: You have to try it.

## Now analyze one more example:

Taste-likes: Cheese
Taste-dislikes: Can't eat eggs
Suggestion: Quiche Lorraine
Analysis:

如果您已在上面的单元格或单独的标签页中打开 LIT 界面,则可以使用 LIT 的数据点编辑器添加此提示:

LIT 数据点编辑器

另一种方法是直接使用所需的提示重新渲染 widget:

lit_widget.render(data=[fewshot_mistake_example])

请注意模型的出乎意料的补全结果:

Taste-likes: Cheese
Taste-dislikes: Can't eat eggs
Suggestion: Quiche Lorraine
Analysis: A savoury tart with cheese and eggs
Recommendation: You might not like it, but it's worth trying.

为什么模型会建议您吃您明确表示不能吃的东西?

序列显著性有助于突出显示我们的少样本示例中的根本问题。在第一个示例中,分析部分 it has cooked onions in it, which you don't like 中的推理链不符合最终建议 You have to try it

在 LM 重要性模块中,选择“Sentences”(句子),然后选择建议行。界面现在应如下所示:

LIT 显眼度

这突出显示了人为错误:意外复制并粘贴了推荐部分,但未更新该部分!

现在,将第一个示例中的“建议”更正为 Avoid,然后重试。LIT 在示例提示中预加载了此示例,因此您可以使用以下小实用程序函数来获取它:

def get_fewshot_example(source: str) -> str:
  for example in datasets['sample_prompts'].examples:
    if example['source'] == source:
      return example['prompt']
  raise ValueError(f'Source "{source}" not found in the dataset.')

lit_widget.render(data=[{'prompt': get_fewshot_example('fewshot-fixed')}])

现在,模型补全内容变为:

Taste-likes: Cheese
Taste-dislikes: Can't eat eggs
Suggestion: Quiche Lorraine
Analysis: This dish contains eggs and cheese, which you don't like.
Recommendation: Avoid.

从中可以得出一个重要教训:提前进行原型设计有助于发现您可能事先没有想到的风险,而语言模型容易出错的特性意味着必须主动进行错误设计。如需进一步了解这一点,请参阅我们的人与 AI 指南,了解如何利用 AI 进行设计。

虽然更正后的少数拍摄次数提示有所改进,但仍不太准确:它正确地告知用户应避免食用鸡蛋,但推理不正确,它说用户不喜欢鸡蛋,但事实上用户已表示自己不能吃鸡蛋。在下一部分中,您将了解如何取得更好的效果。

7. 测试假设以改进模型行为

借助 LIT,您可以在同一界面中测试对提示所做的更改。在本例中,您将测试添加宪法以改进模型的行为。宪法是指包含原则的设计提示,可帮助指导模型的生成。最新的方法甚至支持交互式推导宪法原则。

我们将利用以下想法进一步改进问题。在问题顶部添加一个包含生成原则的部分,该部分现在的开头如下所示:

Analyze a menu item in a restaurant.

* The analysis should be brief and to the point.
* The analysis and recommendation should both be clear about the suitability for someone with a specified dietary restriction.

## For example:

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Onion soup
Analysis: it has cooked onions in it, which you don't like.
Recommendation: Avoid.

...

lit_widget.render(data=[{'prompt': get_fewshot_example('fewshot-constitution')}])

更新后,您可以重新运行该示例,并观察到截然不同的输出:

Taste-likes: Cheese
Taste-dislikes: Can't eat eggs
Suggestion: Quiche Lorraine
Analysis: This dish contains eggs, which you can't eat.
Recommendation: Not suitable for you.

然后,您可以重新检查提示的显眼程度,以了解发生这种变化的原因:

LIT 显眼度

请注意,建议的做法更安全。此外,“不适合您”的评价还受到以下原则的影响:根据饮食限制明确说明适宜性,以及分析(所谓的思维链)。这有助于您进一步确信输出结果是出于正确的原因。

8. 让非技术团队参与模型探查和探索

可解释性需要团队通力合作,涵盖 XAI、政策、法律等领域的专业知识。

在开发早期阶段与模型互动,传统上需要具备深厚的技术专业知识,这使得一些协作者更难以访问和探查模型。过去,这些团队无法参与早期的原型设计阶段,因为没有相应的工具。

我们希望通过 LIT 改变这种范式。正如您在本 Codelab 中所看到的,LIT 的直观媒介和交互能力有助于检查显眼度和探索示例,从而帮助不同的利益相关方分享和传达研究成果。这样,您就可以让更多不同背景的同事参与模型探索、探查和调试。让他们了解这些技术方法有助于他们更好地了解模型的运作方式。此外,在模型的早期测试阶段,拥有更丰富的专业知识也有助于发现可改进的不良结果。

9. 回顾

总结如下:

  • LIT 界面提供了一个用于交互式模型执行的界面,让用户能够直接生成输出并测试“假设”场景。这对于测试不同的提示变体特别有用。
  • LM 显著性模块可直观呈现显著性,并提供可控的数据粒度,以便您讨论以人为中心的构造(例如句子和字词),而不是以模型为中心的构造(例如令牌)。

如果您在模型评估中发现有问题的示例,请将其导入 LIT 进行调试。首先,分析您能想到的与建模任务在逻辑上相关的最大可行内容单元,使用可视化结果来了解模型在哪些方面正确或错误地处理了提示内容,然后深入到更小的内容单元,以进一步描述您看到的错误行为,以便确定可能的解决方法。

最后:Lit 会不断改进!如需详细了解我们的功能并分享建议,请点击此处