使用 Q 学习解决出租车环境——教程
原文:
towardsdatascience.com/solving-the-taxi-environment-with-q-learning-a-tutorial-c76c22fc5d8f
在动画 Jupyter Notebook 中实现 Q 学习,以解决 OpenAI Gym 的 Taxi-v3 环境
·发表于 Towards Data Science ·阅读时长 8 分钟·2023 年 3 月 20 日
–
图片由 Alexander Redl 提供,来源于 Unsplash
OpenAI Gym 中出租车环境的目标——是的,来自于 ChatGPT 背后的公司 和 Dall⋅E——是简单直接的,为强化学习(RL)领域提供了一个很好的入门介绍。
本文提供了一个逐步指南,介绍如何实现环境、使用表格 Q 学习学习策略,并通过动画可视化学习到的行为。如果你想在 RL 中迈出第一步,这个教程可能正适合你。
问题设置
在出租车环境中,一辆出租车需要接载乘客并将他们送到一个小停车场的目的地,尽可能地走最短路径。使用强化学习(RL)学习这样一个任务有多难呢?让我们来看看。
在深入实现之前,最好先将设置表述为 马尔可夫决策过程(MDP),以掌握问题的数学结构。
状态空间
一个 MDP 状态包含以下信息:(i)确定动作,(ii)计算动作奖励,(iii)计算过渡到下一个状态。
最明显的状态属性是出租车的位置;5*5 的网格给我们 25 个选项。此外,等待接送的乘客可以在 1 或 4 个点(标记为 Y、R、G、B)等待,或者他们可以在出租车内,总共提供了(4+1)个选项。最后,目的地也可以是 Y、R、G 或 B。我们用以下向量表示状态:
State = [x_pos_taxi, y_pos_taxi, pos_passenger, dest_passenger]
尽管这是一个非常简单的问题设置,但我们已经处理了 55(4+1)*4=500 个状态!将问题规模扩大到数千个位置,就很容易看出 MDP 的规模如何迅速膨胀(所谓的维度诅咒)。
可达的状态数量稍微小于 500,例如,乘客不会有相同的接送点和目的地。由于建模复杂性,我们通常关注完整的状态空间,代表最坏情况。
动作空间
状态空间可能比你一开始预期的要大,但动作空间仅包含六个决策:
-
下
-
上
-
左
-
右
-
接送乘客
-
接送乘客
如果动作不被允许(例如,尝试穿越墙壁,或在当前地点没有客户时尝试接客),代理将保持不动。
action_mask(在env.action_mask(state)
中找到)告诉我们哪些动作是可行的,但这个可行性检查并不会自动强制执行。
奖励函数
在这个环境中可以区分三种类型的奖励:
-
移动:-1。 每次移动都会带来小惩罚,以鼓励从起点到终点沿最短路径行驶。
-
失败的接送:-10。 当乘客被放置在错误的位置时,自然会感到不满,因此应该给予较大的惩罚。
-
成功的接送:20。 为了鼓励期望的行为,给予较大的奖励。
设计奖励的方式以鼓励期望的行为称为奖励塑形。例如,我们可以在成功接送后简单地结束游戏而不给予奖励(从而结束成本流),但明确的奖励信号通常大大简化学习。
转移函数
与大多数现实环境不同,出租车环境没有随机性。这个特性大大简化了学习,因为下一个状态完全由我们的动作决定。如果选择了不可行的动作——比如尝试穿越墙壁或接一个不存在的乘客——代理将会停在原地。
从抽象的角度来看,我们可以如下表示转移函数:
new_state = f(state,action)
明确的定义会考虑所有网格移动,(不)可行的接送和(不)可行的接客,这并不是特别困难,但需要一些专注。
游戏在成功将乘客送到目的地时结束,表示终止状态。
初始化
在数学上定义了问题(尽管不是非常详细)之后,我们将转向实现。
首先,我们安装必要的库,并随后导入它们。显然,我们需要安装gym
环境。除此之外,我们只需要一些视觉相关的内容和你典型的数据科学库。
假设所有导入都正确,现在是时候进行一下基本检查了。让我们创建并渲染一个 Taxi-v3 环境。
我们应该看到一个介于 0 到 5 之间的动作,一个介于 0 到 499 之间的状态,以及一个阻止不可行动作的动作掩码。最重要的是,我们应该渲染一个静态画面,以确认我们确实已经启动并运行!
初始化输出的截图[图片由作者提供,使用OpenAI Gym]
最后,让我们设置两个函数:一个用于控制台输出和动画,另一个用于存储 GIF。请注意,动画只是 RGB 帧的重复绘图。它也非常耗时,因此不建议在训练期间运行。
测试随机代理
在确认环境按预期工作后,现在是时候让一个随机代理“肆意行动”了。正如你所猜测的,这个代理在每一个时刻都会采取随机行动。这本质上就是学习代理开始时的状况,因为它没有可靠的 Q 值可以使用。
你会看到代理尝试穿墙、在荒凉的地方接乘客,或者在错误的地点放下乘客。在极少数情况下,代理可能需要几千个动作——纯粹是偶然——才会将乘客放到正确的位置。
正如你可以想象的那样,随机代理让乘客感到无比沮丧:
未训练代理的动画。出租车在每个时间步选择随机动作,包括不可行的动作,直到最终偶然将乘客放到正确的站点[图片由作者提供,使用OpenAI Gym]
为什么要观看这么长的动画?好吧,这真的能给你一个未训练的 RL 代理是如何行为的印象,以及获取有意义的奖励信号需要多长时间。
注意:通过应用动作掩码——一个布尔向量,它实质上将不可行的动作的选择概率分配为 0——我们将自己限制在仅有的合理动作中,通常会大大缩短剧集的长度。
训练代理
现在是学习一些有用的东西的时候了。
我们将部署一个基础 Q 学习算法,采用ϵ-贪婪探索,选择ϵ概率的随机动作,其余时间使用 Q 值来选择动作。
Q 值在观察后使用以下公式更新。请注意,随着 500 个状态和 6 个动作的增加,我们必须填充一个大小为 500*6=3000 的 Q 表,每个状态-动作对需要多个观察来以任何程度的准确性学习其值。
在 Q 学习中,我们在每次观察后更新状态-动作对的值,使用脱离策略的学习。
代码如下。你可以调整超参数;根据我的经验,这个问题对它们的敏感性较低。
训练的收敛情况如下图所示。经过 2000 个回合后,我们似乎学会了一个相当好的、稳定的策略。
起初,代理需要许多步骤才能成功完成一个回合。最终,正向奖励会被识别,代理开始采取越来越高效的动作,最终实现最短路径解决方案 [作者图片]
注意:代码忽略了动作掩码,并在出现平局时选择第一个 Q 值。虽然提供了两种问题的替代方案,但它们大大增加了每个回合的计算工作量,并且在此设置下没有明显的性能提升。
测试策略
让我们看看我们学到了什么。根据我们所在的状态,我们在 Q 表中查找相应的 Q 值(即每个状态的六个值,对应于动作),并选择 Q 值最高的动作。
实质上,Q 值捕捉了与动作相关的预期累计奖励。注意,我们不再以概率ϵ选择随机动作——这一机制仅用于学习。
如果你进行了足够多的迭代,你应该会看到出租车总是直接驶向乘客,选择最短路径到达目的地,并成功接送乘客。的确,自从随意驾驶以来,我们已经取得了长足的进步。
成功学习到的策略动画。出租车将沿着最短路径接送乘客,最大化奖励 [作者图片,使用 OpenAI Gym]
尽管在一个看似简单的环境中需要大量观察来学习这一策略,但如果你意识到算法在完全不了解其操作环境的情况下学会了这些,你可能会更欣赏这个结果!
总结
Taxi 环境是一个很好的强化学习入门选择。问题设置简单直观,但可以很容易地扩展到更现实的场景(例如现实的城市网络、管理出租车队、不可预测的旅行时间)。它在计算上易于管理,但也展示了即使在微不足道的问题设置下学习策略所需的计算工作量。
如果你是强化学习的新手,强烈建议你在设计和解决自己的问题之前,先在 OpenAI Gym 环境中进行尝试。
完整的 Jupyter Notebook 可以在我的 GitHub 上找到:
github.com/woutervanheeswijk/taxi_environment
由 Lexi Anderson 拍摄,来源于 Unsplash
进一步阅读
Q-learning 和 SARSA 简介:
对非策略和策略强化学习的深入比较
towardsdatascience.com
构建马尔可夫决策过程:
通过掌握马尔可夫决策的基础原则来定义和沟通你的强化学习模型……
towardsdatascience.com
实现 Deep Q-learning 的教程:
## TensorFlow 2.0 中的深度 Q 学习的最小工作示例
多臂老虎机示例用于训练 Q 网络。更新过程使用 TensorFlow 仅需几行代码
towardsdatascience.com
参考文献
本文中详细介绍的笔记本部分基于以下来源并改编了代码:
[1] OpenAI Gym. Taxi-v3 环境。OpenAI Gym 环境在MIT 许可证下提供。
[2] LearnDataSci. 从头开始在 Python 中实现强化 Q-learning 与 OpenAI Gym。Taxi-v2 实现。
[3] Botforge. 保存 OpenAI Gym 渲染为 GIFS。公开 GitHub Gist。
使用深度强化学习解决 Unity 环境
深度强化学习代理的 PyTorch 实现的端到端项目
·
查看 发表在 Towards Data Science ·6 min read·2023 年 2 月 20 日
–
图片由 Arseny Togulev 提供,来源于 Unsplash
Unity 是一个流行的游戏开发引擎,允许开发者创建具有惊人图形和沉浸式游戏玩法的游戏。它被广泛用于开发各种平台上的游戏,包括移动设备、PC 和控制台。然而,创建智能且具有挑战性的游戏环境对游戏开发者来说是一项艰巨的任务。这就是深度强化学习(DRL)的作用所在。
DRL 是一种机器学习的子集,结合了深度学习和强化学习。它是一种强大的技术,已被用于解决各种领域中的复杂任务,包括机器人技术、金融和游戏。近年来,DRL 已成为构建智能游戏代理的流行方法,这些代理可以从经验中学习并适应新情况。
在这篇文章中,我们将探讨如何使用 DRL 解决 Unity 游戏环境中的问题。我们将通过在 Unity 环境中实现 DRL 来收集香蕉。我们还将探讨使用 DRL 进行游戏开发的一些挑战,以及如何克服这些挑战。
这是 Udacity 深度强化学习专业课程中的一个项目。完整项目和代码可以在这个Github 仓库中找到。
目标
该项目的目标是使用深度 Q 学习训练一个代理。代理将被训练以收集黄色香蕉,同时避免 Unity 的香蕉收集器环境中的蓝色香蕉。
有关 Unix 环境的更多信息可以在这里找到。代理使用深度 Q 学习算法进行了训练,并在 775 个回合中成功解决了环境。
环境与任务
该环境由一个方形世界组成,其中有黄色和蓝色香蕉。代理的目标是尽可能多地收集黄色香蕉,同时避免蓝色香蕉。代理有 4 个可能的动作:向前移动、向后移动、左转和右转。
状态空间具有 37 维,包括代理的速度以及基于射线的周围对象感知。收集一个黄色香蕉会获得 +1 奖励,收集一个蓝色香蕉会获得 -1 奖励。
任务是阶段性的,为了解决环境,代理必须在 100 个连续的回合中获得平均 +13 的分数。
环境如下所示:
作者提供的图片
代理
为了解决环境所给出的问题,实现了一种深度 Q 学习算法。该算法基于 DeepMind 的论文通过深度强化学习实现人类水平的控制。
该算法通过使用神经网络来近似 Q-函数。神经网络接收状态作为输入,并为每个动作输出 Q-值。然后它使用 Q-值来选择代理需要采取的最佳动作。该算法通过使用 Q-Learning 算法来训练神经网络。简单实现算法时还存在两个问题:相关经验和相关目标。该算法使用了两种技术来解决这些问题:经验回放和固定 Q-目标。
相关经验
相关经验是指代理的经验(或转移)彼此之间相关,即它们不是独立同分布的。这可能导致对特定状态或动作的期望奖励的高估,从而导致性能差或收敛到次优策略。
为了解决这个问题,使用了一种叫做 经验回放 的技术。该技术包括将代理的经验存储在回放缓冲区中,并从中随机抽样以训练神经网络。
相关目标
相关目标是指用于更新策略的目标值彼此之间不是独立的,导致学习信号的相关性。这可能会减慢或阻止收敛到最佳策略。
为了解决这个问题,使用了一种叫做 固定 Q-目标 的技术。该技术包括使用两个神经网络:本地网络和目标网络。本地网络用于选择代理需要采取的最佳动作,而目标网络用于计算 Q-Learning 算法的目标值。目标网络每 4 步更新一次,与本地网络的权重同步。
这是 Python 中的实现:
神经网络架构
算法中使用的神经网络架构是一个简单的全连接神经网络,具有 2 层隐藏层。输入层有 37 个神经元,输出层有 4 个神经元,隐藏层每层有 64 个神经元。隐藏层使用的激活函数是 ReLU,输出层使用的激活函数是恒等函数。
此实现中使用的优化器是 Adam,学习率为 0.0005。
实现神经网络所使用的库是 PyTorch。
这是神经网络的实现:
训练任务
为了训练代理,我们使用了一个循环与环境交互,收集并从经验中学习。训练任务中使用的超参数之一是回合数。第一个超参数是手动调整的,目的是优化训练时间和代理的性能。最终实现中使用的回合数为 1200,但环境在 775 回合中被解决。
训练任务中使用的第二个超参数是每集的步数。这个超参数也通过手动调整来优化训练时间和智能体的性能。步数越多,智能体可以越多地探索环境,但训练时间也会大幅增加。最终实现中每集的步数是 1000。
其他一些使用的超参数:
-
回放缓冲区大小:1000
-
批量大小:32
-
更新频率:4
-
Gamma:0.99
-
Tau:1e-3
-
学习率:0.0005
通过这些措施,我们能够在 775 集内解决环境问题。下面的图表显示了智能体在获得更高奖励方面的进展。
作者提供的图片
在这里,我们可以看到随着智能体的改进,奖励增加。在图中也可以看到探索与开发之间的权衡,智能体在前 200 集时更多地进行探索,然后开始开发环境并获得更高的奖励。
完整的实现可以在这个GitHub 仓库中找到。
尽管我们能够解决环境问题,但仍有一些改进可以应用,以加快解决速度。
未来改进
算法可以通过以下技术进行改进:
另一个可能的改进是使用环境中的像素数据。这些改进可能会成为新文章的主题,我打算深入探讨核心概念并用 TensorFlow 实现神经网络。
感谢阅读!
这里有一些你可能感兴趣的其他文章:
## 对象检测与 Tensorflow 模型和 OpenCV
使用训练好的模型识别静态图像和实时视频中的对象
## 如何为 GCP 专业机器学习工程师考试做好准备 ## 对象检测与 Tensorflow 模型和 OpenCV
课程评审、学习技巧以及我的实践经历
LLM 提示中的思维链:结构化 LLM 推理概述
思维链(CoT)、思维树(ToT)、思维图(GoT)以及其他相关概念,这些思维究竟是什么?
·
关注 发表在 Towards Data Science ·9 分钟阅读·2023 年 9 月 16 日
–
“思维树”,由 Midjourney 生成
在智能手机和智能家居的时代,想象一个不仅仅按照指令执行的 AI,而是像我们一样进行复杂逻辑思考。这听起来像是科幻小说,对吗?然而,如果你玩过 ChatGPT,你可能已经亲眼目睹了这种惊人的能力。即使是著名的 AI 推理专家 Hector Levesque 也曾对此感到惊讶,并曾对 AI 传奇人物 Geoffrey Hinton 评论道:“这种愚蠢的方法(指神经网络)怎么能进行推理?”
虽然这个故事突出了人工智能的巨大进步,但这些进步的真正精髓在于大型语言模型(LLMs)与推理的复杂互动。进入这种互动的入口是提示工程——优化提供给 LLM 的文本输入以引出期望输出的艺术与科学。从本质上讲,它涉及理解像 ChatGPT、Bard、Claude、LLama 等语言模型如何响应不同提示的复杂性,然后利用这些知识来实现特定结果。
把大型语言模型(LLMs)看作是庞大的知识库。你提问或陈述的方式(提示)决定了如何挖掘这个知识库。就像人类根据问题的表述可能会给出不同的答案一样,LLMs 也可能根据输入给出不同的回应。
在这篇文章中,你将获得关于各种提示工程框架的简要概述,这些框架旨在提升 LLM 推理能力,包括:
-
Chain-of-Thought
-
Chain-of-Thought-Self-Consistency
-
Tree-of-Thoughts
-
Graph-of-Thoughts
-
Algorithm-of-Thoughts
-
Skeleton-of-Thought
-
Program-of-Thoughts
Chain-of-Thought (CoT)
不是直接给出答案,而是为语言模型提供中间推理示例,以引导其回答。
Chain-of-Thought (CoT) 提示已被认可为开创性和最具影响力的提示工程技术之一,增强了大型语言模型的决策过程。不同于强调直接输入输出交互的传统提示方法,CoT 强制模型将其推理分解为中间步骤。这种方法与人类认知过程类似,其中复杂的挑战被分解为更小、更易管理的组成部分。
举个例子,考虑一个数学问题:“Roger 拥有 5 个网球,然后购买了 2 罐网球,每罐包含 3 个球。他现在拥有多少个网球?”。与其直接推导出答案是 11,一个人可能会推理:“最初,Roger 有 5 个球。2 罐球的总数,每罐包含 3 个球,总计 6 个球。将这些值相加,5 + 6,得到 11。”将这种逐步分析推理整合到输入提示中,不仅提高了模型响应的准确性,还可以在不需要额外训练数据集或改变基本模型配置的情况下完成。
思维链提示,来源: Wei et al. (2022)
思维链自一致性 (CoT-SC)
构建多个思维链,评估每一个链,最终选择最有效且连贯的链。
从思维链框架发展而来的一个进步是 CoT 自一致性。该方法在响应查询时发起多个并行的推理路径,并在最终确定答案之前应用加权机制。这种方法类似于传统机器学习中观察到的集成技术,但它被应用于大语言模型中的思维序列。
思维树 (ToT)
扩展思维链以树形结构呈现。这允许回溯,探索从一个根思想衍生出的多个推理分支。
思维树 (ToT) 提供了一个更结构化的 LLM 推理框架,通过将复杂问题分解为更可管理的部分来进行思考。与通过链条链接进行推理的 CoT 不同,ToT 将其问题解决策略组织为树形结构。每个节点,被称为“思维”,是一个连贯的语言序列,作为通向最终答案的步骤。通过将问题分解为这些离散的“思维”单元——从填字游戏中的简短词组到数学方程的一个组件——ToT 确保问题的每个阶段都得到系统性地解决。
ToT 在 24 点游戏中的推理,来源: Yao et al. (2023)
ToT 的操作优势在于其系统化的组织。首先,系统将问题分解,并从当前状态生成一系列潜在的推理步骤或“思维”候选。然后对这些思维进行评估,系统会评估每个思维引导到期望解决方案的可能性。标准搜索算法,如宽度优先搜索(BFS)和深度优先搜索(DFS),用于遍历这棵树,帮助模型识别最有效的思维序列。
ToT 的重要性源于其整体设计、适应性和效率。链式思维提示可以被视为 ToT 框架中的一个具体实例。其模块化特性表明,从问题的初步分解到所使用的搜索算法,单独的组件可以独立运行。
思维图谱(GoT)
将树结构演变为有向无环图。这引入了自环,可以巩固特定的思路或将多个思路汇聚成一个连贯的想法。
思维图谱 (GoT) 框架代表了从 CoT 和 ToT 方法的先进进展。GoT 框架的核心是将想法概念化为有向无环图(DAG)中的顶点。在这种情况下,每个顶点对应于一个特定的思路或解决方案——无论是初步的、中间的还是最终的——由输入刺激引发。图中的有向边描绘了这些思路之间的相互依赖性。具体来说,如果一条边从思路 t1 延伸到 t2,则表示 t2 是基于 t1 形成的。这种系统化允许多种思路,因为节点可以被分类为“计划”或“结果”等不同类别。
思维图谱,来源:Besta 等 (2023)
GoT 的新颖性在于其对这些思路应用变换,从而进一步精炼推理过程。主要的变换包括聚合,允许将几个思路融合为一个统一的想法;精炼,通过对单一思路进行不断迭代以提高其准确性;以及生成,促进从现有思路中产生新想法。这些变换,强调推理路径的融合,相较于以前的模型如 CoT 或 ToT,提供了更复杂的观点。
此外,GoT 通过评分和排名引入了评估维度。每个个体思路,由一个顶点表示,都根据其相关性和质量进行评估,由指定的评分函数辅助。重要的是,这个函数考虑了整个推理链,分配的分数可能会与图中的其他顶点相关联。该框架还为系统提供了根据各自分数对这些思路进行分层的能力,这一特性在判断哪些想法值得优先考虑或实施时非常有用。
思维算法(AoT)
保持一个不断发展的上下文链,消除了像思维树那样的冗余查询。它探索了一条可变的推理路径。
尽管 ToT 和 GoT 通过基于搜索的机制解决 LLM 推理挑战,产生大量图形形式的推理路径。然而,它们对众多 LLM 查询的高度依赖,有时对于单个问题需要数百次查询,导致计算效率低下。
思维算法(AoT)提供了一种创新的方法,具有动态和可变的推理路径。通过维持单一的不断演变的思想上下文链,AoT 整合了思想探索,提高了效率,减少了计算开销。
思维算法。每个框表示一个独特的思想。绿色代表有前景的思想,红色代表较少有前景的思想。注意:ToT 有多个查询,而 AoT 保持单一上下文,来源:Sel 等(2023)
AoT 的独创性来自于观察到 LLM 尽管强大,但在面对新而熟悉的问题时,有时会回到之前的解决方案。为了克服这一点,AoT 吸收了上下文示例,借鉴了深度优先搜索(DFS)和广度优先搜索(BFS)等经过时间考验的搜索算法。通过模拟算法行为,AoT 强调了实现成功结果和从失败尝试中汲取见解的重要性。
AoT 的基石在于其四个主要组成部分:1) 将复杂问题分解为易于处理的子问题,考虑它们之间的相互关系以及单独处理的难易程度;2) 对这些子问题提出连贯的解决方案,保持连续和不间断的方式;3) 直观地评估每个解决方案或子问题的可行性,无需依赖明确的外部提示;4) 根据上下文示例和算法指南,确定最有前景的探索路径或回溯路径。
思维骨架(SoT)
首先生成答案蓝图,然后平行展开细节,从而减少生成完整响应的时间。
思维骨架(SoT)范式独特地设计,并非主要为了增强大型语言模型(LLM)的推理能力,而是解决最关键的挑战——最小化端到端生成延迟。该方法基于双阶段方法,首先生成初步答案蓝图,然后进行全面扩展。
思维骨架,来源:宁等(2023)
在初始的“骨架阶段”,模型不是生成一个全面的响应,而是生成一个简洁的答案骨架。这个通过精心设计的骨架模板生成的简略表示,捕捉了潜在答案的核心要素,从而为后续阶段奠定基础。
在随后的“扩展点阶段”,LLM 系统地扩展答案骨架中每个组件。利用扩展点提示模板,模型同时对骨架的每个部分进行详细说明。这种将生成过程分为初步骨架制定和并行详细扩展的二分法方法,不仅加速了响应生成,还努力保持输出的连贯性和精确性。
思维程序(PoT)
将问题回答的推理形成一个可执行程序,将程序解释器的输出作为最终答案的一部分。
思维程序(PoT)是一种独特的 LLM 推理方法,它不仅仅是生成自然语言的答案,PoT 要求创建一个可执行程序,这意味着它可以在程序解释器(如 Python)上运行,从而产生实际结果。这种方法与更直接的模型形成对比,强调其将推理分解为顺序步骤并将语义与变量关联的能力。因此,PoT 提供了一个更清晰、更具表现力且有实据的答案生成模型,提高了准确性和理解,特别适用于需要数字计算的数学类型逻辑问题。
需要注意的是,PoT 的程序执行不一定以最终答案为目标,而可能是最终答案的一个中间步骤。
CoT 与 PoT 的比较,来源:Chen et al. (2022)
在不断发展的 AI 领域中,结构化推理框架如链式思维(Chain-of-Thought)极大地改变了我们对大型语言模型(LLM)能力的认知和利用方式。它们象征着一种转变,向着不仅仅是信息重复的模型迈进,同时也进行复杂的推理,这与人类认知过程非常相似。展望未来,潜在的前景似乎无穷无尽。设想一个 AI,能够生成不仅准确的答案,还能提供强大、可编程的解决方案,或具备可视化其思维过程的能力,使 AI 与人类的合作更加无缝。这些进步建立在本文探索的基础框架上,预示着一个 LLM 成为问题解决、创造力和决策不可或缺的伴侣的未来,推动我们与技术的共生关系发生范式转变。
如何按多个列在 R 中对数据框进行排序
在 R 编程语言中对数据框进行排序
·发布于 Towards Data Science ·4 分钟阅读·2023 年 4 月 27 日
–
Andre Taissin 拍摄的照片,来源于 Unsplash
R 是一种被统计学家和机器学习科学家广泛使用的编程语言。数据框是强大的 R 构造体,能够有效且强大地进行数据处理、操作和分析。
在今天的简短教程中,我们将演示如何在一个或多个列上对 R 数据框进行排序,无论是降序还是升序。
首先,让我们在 R 中创建一个数据框,我们将在本教程中引用它,以演示一些有关排序的有用概念。
df <- data.frame(
id = c(1:8),
value = c(123, 86, 234, 235, 212, 121, 123, 899),
colC = c("A", "C", "B", "B", "A", "B", "C", "C"),
colD = c(TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE)
)
df
id value colC colD
1 1 123 A TRUE
2 2 86 C TRUE
3 3 234 B FALSE
4 4 235 B FALSE
5 5 212 A FALSE
6 6 121 B FALSE
7 7 123 C TRUE
8 8 899 C FALSE
按单列对 R 数据框进行排序(升序或降序)
现在假设我们想按照特定列对数据框进行排序。为此,我们可以利用 [order()](https://stat.ethz.ch/R-manual/R-devel/library/base/html/order.html)
函数,并相应地切片数据框。在 order
函数中,我们可以指定在排序数据框时 R 需要考虑的列。
升序
现在假设我们想按照 value
列的升序对数据框进行排序。默认情况下,order()
函数将以升序对数据框进行排序。
df[with(df, order(value)), ]
id value colC colD
2 2 86 C TRUE
6 6 121 B FALSE
1 1 123 A TRUE
7 7 123 C TRUE
5 5 212 A FALSE
3 3 234 B FALSE
4 4 235 B FALSE
8 8 899 C FALSE
降序
如果你想指定降序,只需在列值前加上负号,这样就会表示我们想要反转升序。
df[with(df, order(-value)), ]
id value colC colD
8 8 899 C FALSE
4 4 235 B FALSE
3 3 234 B FALSE
5 5 212 A FALSE
1 1 123 A TRUE
7 7 123 C TRUE
6 6 121 B FALSE
2 2 86 C TRUE
按多个列对数据框进行排序
order()
函数可以接受任意数量的列名。这意味着我们可以指示语言对数据框进行多列排序。同时,也可以对不同的列使用不同的排序策略(即降序与升序)。
我们在 order()
函数中提供的列名顺序将决定该函数对输入数据框进行排序的实际顺序。
现在假设我们想要根据 value
和 id
列来排序我们的数据框,分别按降序和升序排序。我们可以使用以下代码片段来实现。
df[with(df, order(-value, id)), ]
id value colC colD
8 8 899 C FALSE
4 4 235 B FALSE
3 3 234 B FALSE
5 5 212 A FALSE
1 1 123 A TRUE
7 7 123 C TRUE
6 6 121 B FALSE
2 2 86 C TRUE
注意 id=1
和 id=7
的条目是如何按照升序排序的,这些条目是基于 value
列的降序排序的。
现在假设我们想要按照相同的列对数据框进行排序,不过这次我们将对两个列都使用降序排序。
df[with(df, order(-value, -id)), ]
id value colC colD
8 8 899 C FALSE
4 4 235 B FALSE
3 3 234 B FALSE
5 5 212 A FALSE
7 7 123 C TRUE
1 1 123 A TRUE
6 6 121 B FALSE
2 2 86 C TRUE
如前所述,请确保提供列的顺序,以便函数在排序输入数据框时考虑这些列。注意,当 order()
函数的输入列发生变化时,输出结果将如何改变:
df[with(df, order(-id, -value)), ]
id value colC colD
8 8 899 C FALSE
7 7 123 C TRUE
6 6 121 B FALSE
5 5 212 A FALSE
4 4 235 B FALSE
3 3 234 B FALSE
2 2 86 C TRUE
1 1 123 A TRUE
最终思考
在今天的简短教程中,我们演示了如何根据某些列对 R 中的数据框进行排序,无论是升序还是降序。数据框是强大的结构,让 R 程序员和统计学家能够分析数据并提取有意义的见解。
数据框排序是分析数据时最基本的方面之一。我希望这篇文章能帮助您了解如何根据特定要求快速排序数据框。
👉 成为会员 并阅读 Medium 上的每一个故事。您的会员费直接支持我和其他您阅读的作者。您还将获得对 Medium 上每个故事的完全访问权限。
gmyrianthous.medium.com/membership?source=post_page-----7fe3b0a1fbbd--------------------------------
[## 通过我的推荐链接加入 Medium — Giorgos Myrianthous
作为 Medium 会员,您的会员费的一部分将分配给您阅读的作者,并且您可以完全访问每一个故事……
👇相关的文章你可能也喜欢 👇
gmyrianthous.medium.com/membership?source=post_page-----7fe3b0a1fbbd--------------------------------
## ETL 与 ELT:有什么区别?
关于数据工程中 ETL 和 ELT 的比较
[towardsdatascience.com ## 创建本地 dbt 项目
如何使用 Docker 创建一个包含虚拟数据的本地 dbt 项目用于测试
[towardsdatascience.com
使用 Typescript 进行空间数据工程
原文:
towardsdatascience.com/spatial-data-engineering-with-typescript-fb5f59af8bb0
建立自动化空间数据科学的数据管道
·发表于 Towards Data Science ·9 分钟阅读·2023 年 9 月 5 日
–
介绍
我们可以把数据看作水,把公司看作城镇。就像一个城镇随着人口增长而需要更多的水来服务其居民一样,一家公司在成长时也需要现成的数据来支持其运营。这类公司需要一个数据管道系统,类似于将水送到城镇家庭的管道和基础设施。在我们的数据类比中,数据工程师就是那些建立和维护这些数据管道的人。对于常规的数组或表格数据来说,这很简单,但对于空间数据来说,就会复杂一些。
空间数据与常规数据略有不同;它包含空间属性。这些属性使我们能够建立空间关系,也称为 地理空间拓扑。即使两个表没有主键和外键,只要它们都有空间属性,我们仍然可以将它们连接起来。如果我们可视化空间属性,就会得到一张地图!
如果表格之间有空间关系,则将它们连接起来。附加说明:我正在使用 Ms. Excel 进行操作
towardsdatascience.com
构建空间数据管道与创建普通数据管道有所不同。在这种情况下,我们主要使用空间 SQL 处理空间数据属性,这是数据科学家社区中较少见的技能。一旦数据管道建立,数据分析师可以继续分析来自数据管道的空间数据。这意味着数据分析师可以专注于生成空间洞察,而无需担心数据的可用性。这也意味着可以使用最新的空间数据自动生成地图。
本文
本文讨论了如何使用 TypeScript 和 NodeJS 构建空间数据管道。我们可以将其称为ETL(提取、转换、加载)过程,但处理的是空间数据。首先,我们将演示如何使用 TypeScript 从源头获取数据(提取)。接下来,我们将把这些数据转换成适合存储的结构(转换)。最后,我们将操作空间 SQL 来管理和存储数据到我们的数据库中(加载)。
开发使用 TypeScript 和 Node.js 完成,主要使用了node-postgres库。演示代码可在以下链接中找到。
[## GitHub - sutanmufti/spatial-data-engineering-typescript: 使用 TypeScript 进行空间数据工程…
使用 TypeScript 和 Node.js 进行空间数据工程。贡献者为 sutanmufti/spatial-data-engineering-typescript…
github.com](https://github.com/sutanmufti/spatial-data-engineering-typescript?source=post_page-----fb5f59af8bb0--------------------------------)
先决条件
有三个先决条件:你需要有 Node.JS 和 TypeScript,以及一个按需的 PostGIS 服务器。我在这篇文章中使用的是 Mac OS(UNIX),但这篇文章适用于任何 Linux 或类似 UNIX 的服务器操作系统。
Node.JS
Node.js 是一个在服务器上执行 JavaScript 代码的 JavaScript 运行时。它的功能类似于 Python,充当 JavaScript 代码的解释器。对于本文,基本理解 JavaScript 语法即可。
Node.js® 是一个基于 Chrome 的 V8 JavaScript 引擎构建的 JavaScript 运行时。
nodejs.org](https://nodejs.org/en/download?source=post_page-----fb5f59af8bb0--------------------------------)
TypeScript
TypeScript 是 JavaScript 的超集,为 JavaScript 添加了类型检查功能。这种“类型检查功能”限制了 JavaScript 编码,从而降低了出错的风险。我们在 TypeScript 中开发的代码会被编译成 JavaScript 代码,然后由 Node.JS 执行。虽然 TypeScript 是可选的,但我喜欢在我的项目中使用类型检查。
[## 如何设置 TypeScript
将 TypeScript 添加到你的项目中,或者全局安装 TypeScript
Postgis 服务器
你必须运行 PostgreSQL 服务器,并安装 Postgis。Postgis 是一个 PostgreSQL 扩展,允许我们处理和存储地理空间数据。这就是我们如何进行空间 SQL 查询的方式。当然,你必须了解基本的 SQL 才能操作 PostgreSQL。
用 SQL 回答每一个“在哪里”的问题;带有示例
你可以通过 Docker 拥有自己的 Postgis 服务器,或者直接在你的 PC 上安装它。另一种选择是部署一个云实例,例如使用 Amazon RDS、Google Cloud SQL,或一个安装了 PostgreSQL 的普通虚拟机。
[## Docker
编辑描述
理念
我们可以将这项工作分解为几个任务:
-
提取:从数据源获取数据。对于本文,数据源可以是任何东西,只要我们接收的是 GeoJSON 格式 (RFC7946)!在这个演示中,我们将采用 Stuart Grange 的数据,该数据源自伦敦政府的 数据存储。我们也可以检索其他地理空间格式如 shapefile,但那意味着我们必须使用其他库来处理。为了简便起见,我们就使用 GeoJSON。
-
转换:验证数据(再次说明,这不是本文的重点)并处理无效数据。然后,我们将原始数据转换成数据分析师使用的结构;或者说我们如何设计我们的数据环境。
-
加载:将数据插入到表中。这使用空间 SQL。
在文章的最后,我们可以看到我们的数据存储在 Postgis 服务器中。让我们进入代码部分。
构建数据管道
主要代码可以在以下链接中找到。让我们分解任务并逐步分析代码。
GitHub - sutanmufti/spatial-data-engineering-typescript: 使用 TypeScript 进行空间数据工程…
使用 TypeScript 和 Node 进行空间数据工程。贡献于 sutanmufti/spatial-data-engineering-typescript…
GitHub - sutanmufti/spatial-data-engineering-typescript
主要功能是以下代码。如你所见,它主要包含了 2 个函数:ExtractData
和transformAndLoad
。此外,还有一个名为pool
的常量变量,用于处理 PostGIS 服务器的认证。
async function main(){
// this creates the pool connection to the postgis server
const pool = new Pool({
user: process.env.POSTGRES_USER,
host: process.env.POSTGRES_HOST,
database: process.env.POSTGRES_DB,
password: process.env.POSTGRES_PASSWORD,
port: Number(process.env.POSTGRES_PORT),
});
// this fetches the data
const data = await ExtractData()
// this transforms and load the data based on the Pool connection
await transformAndLoad(data.features,pool)
}
提取数据
这个任务是由ExtractData()
函数完成的。我们期望这个函数能返回类似 GeoJSON 的数据。
// located in /src/lib/functions.ts
export async function ExtractData() {
// link used in demo is https://skgrange.github.io/www/data/london_low_emission_zones.json
const res = await fetch('https://<linktodata>/')
const data = <GeoData> await res.json()
// add validation function to handle error here.
return data
}
在这个函数中,我们有一个名为ExtractData
的异步函数。export
语句表明这个函数可以在另一个 TypeScript 文件中导入,这使得项目模块化。async
语法表示这是一个异步函数。这使我们可以同时运行多个函数,主要因为我们将使用 fetch API 来执行 HTTP GET 请求。
Fetch API 是一个异步函数,更容易嵌套在异步函数中。因此,我们有await
语句来等待 HTTP Get 请求完成。我们将以GeoJSON
格式获得data
。
我发现 fetch API 和异步函数对初学者来说比较混乱。此外,异步函数如何与 Fetch API 互补的内容在我的另一篇文章中有介绍。
如何在 Javascript 中使用 Fetch?为什么 Fetch 返回一个 Promise?介绍异步函数和 Promises
insight.sutan.co.uk](https://insight.sutan.co.uk/using-fetch-api-faa44d4d9a12?source=post_page-----fb5f59af8bb0--------------------------------)
转换和加载数据
在获取数据后,我们可以将其转换并加载到 PostGIS 中。我们将使用node-postgres
作为客户端来用 nodeJS 执行 SQL。我偏爱node-postgres
因为我喜欢编写原始 SQL 代码。此外,我们对空间 SQL 有更细粒度的控制。缺点是我们的代码可能会显得复杂,因为我们可能会编写多行 SQL 查询。
node-postgres 是一个用于与 PostgreSQL 数据库接口的 node.js 模块集合。
node-postgres.com](https://node-postgres.com/?source=post_page-----fb5f59af8bb0--------------------------------)
这部分稍微长一点。我将突出重点,主要是空间 SQL 部分。
// This function transforms and loads the data into postgis
export async function transformAndLoad(geojsonFeatures: Feature[], pool: pg.Pool) {
const client = await pool.connect();
try {
await client.query('BEGIN'); // Start a new transaction
for (const geojsonPolygon of geojsonFeatures) {
const geometryType = geojsonPolygon.geometry.type;
const coordinates = geojsonPolygon.geometry.coordinates;
const insertQuery = `
INSERT INTO public.data (geometry, name, type,id)
VALUES (ST_setsrid(ST_GeomFromGeoJSON($1),4326), $2, $3,$4)
`;
const values = [
JSON.stringify({ type: geometryType, coordinates }),
geojsonPolygon.properties.name,
geojsonPolygon.properties.type,
getISOstring()
];
await client.query(insertQuery, values); // Insert the GeoJSON data
}
await client.query('COMMIT'); // Commit the transaction if successful
// await client.query('ROLLBACK');
console.log('Bulk insert of POLYGON features successful');
} catch (error) {
await client.query('ROLLBACK'); // Roll back the transaction on error
console.error('Bulk insert failed:', error);
} finally {
client.release(); // Release the database connection\
pool.end()
}
}
使用 Node-postgres 进行安全数据事务
在 PostgreSQL 中插入批量行的基本代码如下:
await client.query('BEGIN');
try {
// ... start inserting data...
await client.query('COMMIT');
} catch {
// this code runs when we can't insert the data somehow. handle the error.
// cancels the data transactions as a whole, avoiding duplicates.
await client.query('ROLLBACK');
}
client.query("BEGIN")
允许我们为每条数据记录进行插入过程的分阶段处理。这意味着如果在插入过程中出现问题(例如,第 n 行的数据无效,导致 PostgreSQL 抛出错误),我们可以取消整个数据事务。这个取消操作通过 client.query('ROLLBACK')
完成。如果所有行都正确插入且没有错误,我们可以将其声明为安全插入,并调用 client.query("COMMIT")
来提交数据事务。
如果我们不以 client.query("BEGIN")
开始,那么在插入过程中发生的任何错误都会导致数据被插入到数据库中。在大多数情况下,我们不希望这样。
参数化查询
让我们看看在调用 client.query("COMMIT")
后我们会做什么。这是我们转换并插入空间数据的地方。转换的部分不多,因为我只是提取了一些属性。
// transformation
const geometryType = geojsonPolygon.geometry.type;
const coordinates = geojsonPolygon.geometry.coordinates;
最重要的一点是如何使用参数化查询。一个常见的 SQL 漏洞是 SQL 注入。参数化查询通过不将原始 SQL 插入到我们的数据事务中来缓解这个漏洞。看看下面的 SQL 命令。
// Correct way
const insertQuery = `
INSERT INTO public.data (geometry, name, type,id)
VALUES (ST_setsrid(ST_GeomFromGeoJSON($1),4326), $2, $3,$4)
`;
请注意字符串 $1
、 $2
、 $3
和 $4
。这些是我们插入的实际值的占位符。我们不应该使用 模板字面量 来格式化我们的字符串。在 JavaScript Node-postgres 中,你不应该这样做。
// DON'T DO THIS
let value: string;
const insertQuery = `
INSERT INTO public.data (name)
VALUES ("${value}")
`;
你可能会让数据库面临恶意查询。例如,如果${value}
的值是DROP TABLE
命令,那么函数将执行DROP TABLE
命令!如果我们使用$1
参数化查询,这种情况是不会发生的。
使用空间 SQL 插入
现在让我们来看一下插入语句以及我如何处理空间数据。
-- inserting spatial data
INSERT INTO public.data (geometry, name, type,id)
VALUES (ST_setsrid(ST_GeomFromGeoJSON($1),4326), $2, $3,$4)
ST_GeomFromGeoJSON
是一个 postgis 函数,它接受一个字符串化的几何体并将其转换为几何对象。例如,
ST_GeomFromGeoJSON('{"type":"Point","coordinates":[-48.23456,20.12345]}')
然后我们将其包装在ST_SetSRID
函数中以声明其投影。我在这里使用 EPSG 代码4326
来表示这是经纬度值。你可能会收到不同投影的数据。例如,在英国,数据通常会投影到 British National Grid,其代码为27700
;北坐标和东坐标。这对于这个演示不适用。
释放连接
最后,我们释放客户端,以便服务器可以处理其他客户端。
client.release();
pool.end();
运行代码
运行代码使用npm run start
,这会运行npx tsc
(这将 TypeScript 代码编译成 JavaScript)和node build
(这实际上执行运行 ETL 过程的 JavaScript 代码)。日志显示操作成功。
执行代码(来源:作者,2023)
让我们通过选择数据在 PgAdmin 或普通的 psql 中查看数据。类似于,
SELECT name, type, id, geometry FROM data
使用 PgAdmin,我们可以看到数据在地图上是合理的!这意味着数据分析师现在可以开始分析数据了。
查看数据(来源:作者,2023)
我们还可以在 QGIS 中开始玩转数据,QGIS 是一个开源的 GIS 软件,我们可以用来分析地理空间数据。
使用 QGIS 查看数据(来源:作者,2023)
结论
空间数据工程的主要思想是创建一个数据管道,从一个来源提取原始数据,对其进行处理,并将其存储以供使用。这使得空间数据分析师可以专注于数据分析,而不必担心数据的可用性;这由空间数据工程师负责处理。空间数据工程的特殊之处在于我们如何处理空间数据,即使用空间 SQL。使用 TypeScript 和 Node.JS,借助 node-postgres
,我们可以构建一个简单的数据管道。数据管道获取 geojson 数据,对其进行转换,并将其存储在启用了 Postgis 的 PostgreSQL 数据库服务器中。这些存储的数据随后可以使用 GIS 软件进行分析。
对我说话:一个模型阅读了多少个词
原文:
towardsdatascience.com/speak-to-me-how-many-words-a-model-is-reading-331e3af86d27
| 人工智能 | LLM | 自然语言处理 |
| — | — | — |
为什么以及如何克服大型语言模型的内在限制
·发表于 Towards Data Science ·阅读时间 20 分钟·2023 年 7 月 14 日
–
大语言模型(LLMs)在最近几个月展示了它们的技能,证明它们在各种任务中都很熟练。所有这些都通过一种交互模式:提示。
最近几个月,扩展语言模型的上下文成为了一种潮流。但这对语言模型有何影响?
本文分为不同的部分,每一部分我们将回答这些问题:
-
什么是提示,如何构建一个好的提示?
-
什么是上下文窗口?它能有多长?是什么限制了模型输入序列的长度?为什么这很重要?
-
我们如何克服这些限制?
-
模型是否使用了长上下文窗口?
如何与模型对话?
图片由 Jamie Templeton 提供,来源于 Unsplash
什么是提示?什么是好的提示?
简而言之,提示就是与大型语言模型(LLM)交互的方式。给定一个LLM,我们可以通过提供文本形式的指令来进行交互。这种文本提示包含了模型处理响应所需的信息。提示可以包含问题、任务描述、内容及其他许多信息。基本上,通过提示我们向模型提供了我们的意图以及我们期望它回应的内容。
提示可以显著改变模型的行为。例如,要求模型“描述法国的历史”与要求它“用三句话描述法国的历史”或“用说唱形式描述法国的历史”是不同的。
为了从模型中获取足够的信息,建议编写一个好的提示。通常,一个好的提示应该包含一个问题或一组指令。此外,还可以有上下文(问题 + 上下文)。例如,我们可以要求模型在一篇文章(上下文)中告诉我们主要人物是什么(问题)。
一般来说,编写提示时需要考虑一些元素:
-
简洁性,由于这是一个迭代过程,最好从简单的问题开始,然后逐渐要求更多信息。此外,如果将模板减少为子任务的形式,模板效果最佳:简单任务而不是复杂任务。
-
关于任务的指令。 使用能够明确指令的动词有助于模型更好地理解当前任务。此外,一些动词对于某些任务效果更佳,建议在提示的开头提供指令。
-
具体性。 在提示中具体而注重细节有助于任务的执行。此外,可以提供示例来更好地解释所需内容(少量示例提示)。然而,由于提示的长度不是无限的,因此应避免提供过多的示例或过多的细节(在许多 LLM 中,提示在超过某一长度后会被截断)。
此外,还有其他技术可以用来改进提示,例如 chain-of-thought(强制模型回溯中间步骤)、自我反思(允许模型评估其响应)、思维树 等等。
LLM 如何解决大学考试以及为什么这很重要
一般来说,尽管其中一些技术很简单,但它们并不总是能产生良好的结果。还有更复杂的技术,提示工程仍然是一个开放的领域。这些技术的原则是让模型对问题进行推理或充分利用其在训练中学到的内容。
无论如何,所有这些技术都必须面临一个问题:提示中可以插入的 tokens (子词)的最大数量。
提示可以有多长,为什么?
提示的长度可以有多长:上下文的长度
patricia serna 在 Unsplash 的照片
提示可以迅速增长,尤其是当上下文包含大量信息(使用上下文中的文章、过去的对话、添加外部信息等)。这意味着模型必须处理长序列作为输入。
基本上,LLM 是一种 变换器,而变换器在序列长度上扩展不良。这是因为 变换器 建立在重复的 自注意力 模块上,这些模块在长度方面具有 二次成本。
当然,以前已经有很多工作尝试通过各种策略减少这个成本。然而,线性替代的自注意力被发现表现不佳。
Hyena 模型展示了卷积如何比自注意力更快
levelup.gitconnected.com](https://levelup.gitconnected.com/welcome-back-80s-transformers-could-be-blown-away-by-convolution-21ff15f6d1cc?source=post_page-----331e3af86d27--------------------------------)
自回归变换器在短序列上表现出色,但在处理长序列如高分辨率图像、播客、代码或书籍时表现不佳。 (source)
通常,上下文窗口 相对较小(512–1024 tokens)。然而,近年来我们已经看到有些模型甚至有成千上万个令牌用于 上下文窗口。
例如,GPT-4 的上下文长度为 32k。除了这个数字令人印象深刻之外,这不仅仅是一个营销问题。实际上,上下文长度越长,模型能够关联的信息就越多。此外,更长的 上下文长度 可以提高准确性、流畅性,并被认为能激发模型的创造力。
从理论上讲,一个使用上下文长度为 1k tokens 训练的变换器确实可以在推断时生成 100k 的序列。但由于它是在不同的训练数据分布下训练的(远少于 100k 的序列),因此生成的结果将毫无意义。
事实上,已经证明,在ChatGPT中请求对超过 1000 个单词的文本进行拼写检查会导致模型幻觉。
自注意力的二次成本意味着增加上下文长度等于训练成本的相应增加。LLaMA 的成本估计为 300 万美元(仅为 GPU 训练),将上下文长度增加 50 倍(从 2K 到 100K)也意味着成本增加 50 倍。
图片来源: 这里
自注意力是否是扩展上下文长度的唯一限制?
不是的。经过tokenization后,模型接受 tokens 序列,第一步是嵌入。对于一个长度为 n 的 tokens 序列,我们有一个大小为 d 的嵌入。显然,如果 n >> d,会有信息丢失的风险,而将 n 增加得远超过 d 则会带来显著的挑战。
此外,正弦位置编码器与某些扩展上下文长度的解决方案不兼容,需要重新考虑。
此外,训练是并行化的,但推断时计算是顺序进行的。事实上,一个 token 依赖于序列中生成的 tokens。因此,推断也必须优化以扩展上下文长度。
如何实现数万甚至数十万 tokens 的上下文窗口?
扩展 LLM 的上下文窗口
照片由Nagara Oyodo拍摄,来源于Unsplash
让你的上下文更大
尽管过去几个月的结果令人印象深刻,但早在 2019 年就已经有尝试增加上下文窗口的长度。事实上,Transformer-XL能够生成连贯的文本,长度可达数千个标记。
作者利用了递归神经网络的理念,其中隐藏状态被重复使用,以便将更多信息提供给变换器。换句话说,在处理一个序列段后,在处理下一个段时,会重复使用之前获得的隐藏状态。从模型描述来看,与RNNs的相似性是显而易见的。
图片来源:这里
短期训练,长期推断
尽管 TransformerXL 是一个有趣的解决方案,但最近几个月也在测试其他策略。这些策略旨在解决原始变换器固有的局限性,并利用了今天的硬件进步。
减少训练成本的一个想法是用上下文长度为 2K 的模型进行训练,然后在更长的序列(例如,65K)上进行微调。理论上,这也可以奏效(模型在第一次训练中学习语言的一般表示,然后在后续任务中专门化处理更长的序列)。
实际上,使用原始变换器的这一策略注定会失败,2021 年的一篇论文中已对此进行了说明。正如作者所解释的那样,推断中更长的上下文长度的能力称为“外推”。
我们将外推定义为模型在验证过程中,输入标记数量超过模型训练时标记数量的情况下,继续表现良好的能力。我们发现使用正弦位置嵌入的变换器语言模型(LMs)具有非常弱的外推能力。(来源)
图片来源:这里
对于作者来说,位置编码是缺乏原始变换器外推能力的罪魁祸首。位置编码,作为模型开始时的一步,被包含在内,作为一个巧妙的技巧,使模型能够考虑序列中每个标记的位置。
作者建议用带有线性偏置(ALiBI)的注意力替代它。简单来说,就是在注意力的查询和键的乘积中添加一个惩罚,这个惩罚与它们的距离成正比:
图片来源:这里
“在计算每个头的注意力得分时,我们的线性偏置注意力方法 ALiBi 会对每个注意力得分(qi · kj,左)添加一个常数偏置(右)。与未修改的注意力子层一样,然后将 softmax 函数应用于这些得分,其余计算保持不变。m 是一个特定于头的标量,在训练过程中设置且不进行学习。” 图片来源:这里
这个技巧很巧妙,因为它不会增加学习的参数,也不会显著增加计算成本。
你需要所有这些标记吗?
扩展上下文窗口到超过 100k 个标记无疑非常有吸引力。另一方面,并非序列中的所有标记实际上都很有趣。那么,我们是否有必要计算这些标记之间的关系(注意力得分)呢?
因此,这个想法是利用稀疏性来计算注意力得分,这样我们就不会计算那些我们不感兴趣的标记之间的关系。正如谷歌所解释的,尽管如此,这并不是完全简单的:
两个自然的问题出现了:1) 我们是否可以使用计算和内存需求与输入序列长度线性相关的稀疏模型来实现二次全变换器的经验性收益?2) 是否可以理论上证明这些线性变换器保留了二次全变换器的表达能力和灵活性?(source)
谷歌尝试通过一个有趣的观察来回答这些问题,即注意力层可以被理解为一个图。事实上,当计算序列中所有位置(节点)的注意力时,我们计算的是成对的相似度(边)。因此,从视觉上看,我们可以将注意力视为一个有向图。
注意力作为一个完全图,图像由作者提供。
基于这一概念,可以看到,相对于经典的注意力,可以考虑使用图形,这些图形不是完全连接的。
谷歌通过首先利用全球和局部(或窗口)注意力的组合来利用这一概念,在这篇论文中进行,然后通过BigBird对这一想法进行了改进。
图片来源:这里
BigBird 基本上结合了三个概念:全球标记以覆盖整个序列,局部注意力以覆盖每个标记的周围区域,并且每个标记都有随机抽样的标记。
BigBird 成功地近似了注意力。同时,它是稀疏的(因此计算复杂度较低),但不会中断信息流(一个标记影响其他标记的能力)。
作者们证明了这种稀疏注意力不仅与原始注意力具有同样的表现力,而且可以用于从本质上较长的序列中提取上下文信息,例如基因组序列。
在任何情况下,稀疏性概念都非常强大,许多研究人员正在尝试将其应用于其他模型,例如视觉变换器。
简单性使得人工智能能够达到惊人的性能和惊人的速度
towardsdatascience.com
快速变换器的条件计算
基于并非所有令牌都重要的想法,还有另一种方法可以在训练过程中不将所有模型权重应用于所有令牌。
CoLT5利用这一概念来增加输入长度。简单来说,条件计算确保将更多资源分配给那些被认为重要的令牌。
作者构建了一个系统,其中注意力和前馈网络计算被分成两个分支(重型和轻型)。轻型层应用于所有令牌,而重型 MLP 仅应用于重要令牌。这些令牌由一个路由模块选择,决定哪些令牌是重要的。
图片来源: 这里
多查询注意力以节省计算
在推理过程中,每个令牌的键和值都会被缓存(以避免在生成文本时重复相同的操作)。这在节省计算的同时增加了GPU的内存使用。
为了避免这种情况,多查询注意力(MQA)建议在键和值的线性投影步骤中对所有注意力头共享权重。
这在处理长序列时尤其有优势,减少了不仅仅是内存使用,还减少了生成时间。谷歌已展示了 MQA 的优势,在使用 PaLM 时。
图片来源: 这里
闪光注意力,新一代 LLM 的亮点
之前看到的模型和思想旨在以减少其成本的方式修改注意力。闪光注意力使用了不同的方法,今天几乎所有模型都在使用它。
从基础上讲,GPU的利用更为高效。实际上,GPU有自己独特的内存层次结构。当GPU执行操作时,数据必须存在于快速内存(SRAM 内存)中。数据从 HBM 内存复制到这块内存中,一旦计算完成,输出结果会被复制回 HBM。
如你所见,SRAM 内存不仅速度更快,而且体积更小。随着时间的推移,计算变得越来越快,而 HBM 已经成为瓶颈。
图片来源: 这里
这是因为在注意力过程中,进行了一些操作(查询和键的乘法,softmax,将这个结果与值进行乘法)。这些操作生成的中间数据被复制到 HBM 和 SRAM(来回传输)。这种数据复制操作是导致操作变慢的原因。
SRAM 有内存限制,因此闪存注意力解决方案是将各种数组(查询、键、值)划分为块。因此,所有操作都在一个 GPU 内核中完成,然后将结果写入 HBM。此外,softmax 也随时间减少,因为它仅在块上计算,而不是整个 NxN 矩阵上。
图像来源:这里
不仅META 的 LLaMA使用 FlashAttention,今天virtually 所有模型都在使用它。
META 开源模型将帮助我们理解语言模型偏见的产生
medium.com](https://medium.com/mlearning-ai/metas-llama-a-small-language-model-beating-giants-5065948e0b7f?source=post_page-----331e3af86d27--------------------------------)
最新发展
最近在GPU方面的进展也使得令牌和它们的上下文增加成为可能。例如,现在有 80 GB 的 GPU。
此外,除了我们上面看到的技术改进,还有对变换器为何不具备外推能力的更好理解。例如,在这篇论文中,他们展示了经典注意力如何漂移到序列的后面位置(这一行为作者输入到正弦位置编码中)。因此,我们看到位置编码如何在 ALiBI 中被替代(其他人提出可以用随机版本、随机位置编码来替代)。
其他作者指出,如链式思维等技术有助于模型进行推断,因为模型必须专注于推理的中间步骤。此外,少量示例可以比微调更好地提高模型的推断能力(无论如何,这不是灵丹妙药)。实际上,使用一些技巧进行微调可以带来非常好的结果,例如 LLaMA 7B 在这项研究中引入了窗口注意机制,将上下文窗口从 2K 扩展到 32K。
然而,如果以前Claude的 100K 上下文长度看起来令人难以置信。META 的 Megabyte 声称支持 1M tokens(其技巧是,“Megabyte 将序列分割成补丁,并在补丁内使用局部子模型,在补丁之间使用全局模型”)。
图片来源:这里
一篇最近发表的论文甚至声称可以处理 1G 的 token。这些都表明,仍有大量的活跃研究,以及许多团队正在寻找扩展上下文长度的方法。
考虑到所有这些研究和替代方案,一个问题浮现:模型如何使用这些长上下文?它能否充分利用这些上下文?
在中间迷失:语言模型如何利用长上下文
图片由Ethan Sykes提供,来自Unsplash
最新的大型语言模型(LLM)的进展使得上下文窗口得以扩展,这引发了一个问题:模型是否真的从中受益?本月发表的一篇文章探讨了这一问题。
这项研究的作者能够利用这样一个事实,即不仅像Claude或GPT-4这样的专有模型具有长上下文窗口。实际上,MPT-30B和LongChat-7B的上下文窗口分别为 8K 和 16K tokens。因此,作者决定使用这两种模型以及一些封闭模型(GPT-3.5和Claude)。
选择模型后,还必须选择那些需要模型具备长上下文窗口的任务。例如,在多文档问答中,需要模型对一组不同的文档进行推理,以找到回答所需的信息。这是一个重要的任务,因为它模拟了在文档语料库(例如互联网)中进行搜索的事实(我们可以想象一个AI 搜索引擎需要搜索多个网站以找到答案)。
对于一个问题 x,有一组文档,其中只有一个文档包含回答问题所需的信息。如示例所示:
图片来源:这里
作者利用了注释问题的数据集(谷歌搜索)。他们随后添加了与主题相关但不包含答案的维基百科片段(小心确保正确的文档不总是位于相同的位置,因为LLM可能学会了启发式技巧)。
图片来源:这里
作者指出三个特别有趣的结果:
-
他们注意到 U 形响应,取决于相关文档的位置。换句话说,当模型必须访问位于上下文窗口中心的信息时,模型表现会下降。因此,模型在识别相关信息时,如果信息位于输入序列的开头或结尾,表现会更好。
-
性能低于闭卷设置。当相关文档位于输入上下文的中心时,模型的表现比没有提供文档时更差。在闭卷设置中,模型必须仅依赖于其参数的记忆。
-
一般来说,如果向模型提供更多文档,性能会下降。
图片来源:这里
图片来源:这里
此外,作者指出,单纯来说,具有较长上下文窗口的模型并不优于其具有较短上下文序列的对应模型。
由于模型在使用位于上下文窗口中心的信息时表现不佳,作者想知道模型是否至少能够重新找到信息。换句话说,使用由键值对组成的简单文件(JSON),模型是否能够找到信息?
作者们决定使用尽可能简单的任务来深入研究模型的行为。这是一项基本技能,其中模型需要找到一条信息,而无需复杂的技能。使用模拟数据,作者们创建了包含键值对的JSON,其中只有一个是感兴趣的。
我们的合成键值检索任务旨在提供一个最小的测试平台,以测试从输入上下文中检索匹配标记的基本能力。[…]我们明确旨在通过尽可能移除自然语言语义(改用随机 UUID)来提炼和简化任务,因为语言特征可能会带来潜在的混淆因素 (source)
图片来源: here
结果显示,并非所有模型都能胜任,Claude在这项任务中表现成功,但其他模型在键值对达到 140 个或更多时性能会下降。
图片来源: here
此外,作者们观察到一个有趣的事实:
在 140 个键值对的设置中,LongChat-13B (16K)是一个显著的异常值;当相关信息位于输入上下文的开始部分时,它倾向于生成代码来检索键,而不是直接输出值。 (source)
为什么 LLM 不能充分利用较长的上下文窗口?
本研究的作者们想知道这是否与架构有关。目前,主要使用两种架构:仅解码器 和 编码器-解码器语言模型。尽管它们在许多文章中被使用,但其行为差异仍存在模糊点。
因此,作者们决定另外使用两个模型:Flan-T5-XXL 和 Flan-UL2。这两个模型在相关信息位于上下文窗口中间时表现出更强的鲁棒性。
图片来源: here
这很有趣,因为作为双向模型,编码器-解码器可能在处理较长的上下文窗口中的信息时更为鲁棒,因此在处理多个文档时可能更为高效。
长上下文窗口有用吗?
如果模型无论如何都无法充分利用它,那么拥有如此长的上下文窗口是否真的有意义?毕竟,拥有更长的上下文窗口无论如何都会有代价:模型必须处理所有输入信息。换句话说,如果模型能处理 100K 个 tokens,那么提供 100K 个信息点是有意义的。
作者决定使用检索系统进行测试,该系统接受一个输入查询(来自问题数据集的一个问题),并从维基百科中找到 k 个文档。然后,他们将这些文档添加到提示中,测试模型在这些附加文档下的表现。
使用超过 20 份检索文档仅能略微改善读者表现(GPT-3.5-Turbo 约 1.5%,Claude 约 1%),同时显著增加输入上下文长度(从而增加延迟和成本)。 (source)
图片来源:这里
换句话说,模型达到了饱和。如前所述,这证实了模型在上下文窗口的开头使用信息的效率更高。
结语
摄影师:Saif71.com 在Unsplash
提示是我们与模型互动的方式。它越精准和详细,模型的回应就越好。
然而,我们可以放入提示中的信息量是有限的。这个限制就是上下文窗口,它来源于我们之前看到的众多因素。自从第一个 transformer 发布以来,人们一直在尝试通过利用各种解决方案来扩大这个上下文窗口。
尽管如此,我们仍然不知道模型能够多好地利用这个上下文窗口。今天的研究显示,模型并未充分利用它们。
自从扩展法则发布以来,一直在追逐参数,不断增加模型的规模以寻找短暂的突现属性。如今我们知道,所有这些参数并非必要,GPT-4 实际上并不像想象中那么庞大,而是由八个模型组成。上下文窗口似乎是另一个前沿领域,人们试图达到更大的数量,不是为了实际效用,而是为了展示他们模型的优越性。
开源、数据和注意力:LLMs 的未来将如何改变
towardsdatascience.com
尽管已经有大量的结果和发布的模型,但仍有一些问题需要研究。如何使用较长的上下文窗口就是其中一个需要进一步分析的点。因为尽管技术解决方案很优雅,但有时较长的上下文窗口的成本并不值得。
你怎么看?在评论中告诉我。
如果你觉得这很有趣:
你可以查看我的其他文章,也可以 订阅 以在我发布文章时获得通知,也可以 成为 Medium 会员 以访问所有故事(这是我通过平台获得的少量收入的附属链接,对你没有费用),还可以通过LinkedIn与我联系或找到我。
这里是我 GitHub 仓库的链接,我计划在这里收集与机器学习、人工智能等相关的代码和许多资源。
[## GitHub - SalvatoreRa/tutorial: Tutorials on machine learning, artificial intelligence, data science…
提供有关机器学习、人工智能、数据科学的教程,包括数学解释和可重用代码(使用 Python…)。
或者你可能对我最近的文章感兴趣:
[## CodeGen2: a new open-source model for coding
Salesforce 如何影响高效编码模型的设计
临床 GPT:LLM 临床医生 [## ClinicalGPT: the LLM clinician
今天的 LLM 已经被应用于各种任务。另一方面,通用模型在微调方面表现不佳…
临床 GPT:LLM 临床医生 ## 归纳偏差的神奇故事
我们需要归纳偏差吗?简单模型如何达到复杂模型的性能
towardsdatascience.com [## AI 大学生重返实验室
大型语言模型如何解决大学考试及其重要性
levelup.gitconnected.com](https://levelup.gitconnected.com/the-ai-college-student-goes-back-to-the-bench-daa6d9bdfb14?source=post_page-----331e3af86d27--------------------------------)
参考
这里是我撰写本文所参考的主要文献列表,只引用了文章的第一个名字。如果你想深入了解这个话题,我也建议你阅读这些文献。
-
Prompt Engineering Guide, 链接
-
Wang, 2023, 医疗保健中的提示工程:方法和应用, 链接
-
White, 2023, 用于增强 ChatGPT 提示工程的提示模式目录, 链接
-
Liu, 2021, 预训练、提示和预测:自然语言处理提示方法的系统调查, 链接
-
Liu, 2022, 生成知识提示用于常识推理, 链接
-
Sascha Heyer, 生成性 AI——LLM 提示工程的最佳实践, 链接
-
Jacob Ferus, GPT-4 已经到来——这是你需要知道的, 链接
-
Simon Attard, 为大型语言模型提供上下文, 博客文章, 链接
-
Rickard, 大型语言模型商品化:第三部分
-
Vaswani, 2017, 注意力机制是你所需的一切, 链接
-
Press, 2021, 短训练,长测试:线性偏差的注意力实现输入长度外推, 链接
-
Zaheer, 2021, Big Bird: Transformers for Longer Sequences, 链接
-
Ainslie, 2020, ETC: 在 Transformer 中编码长而结构化的输入, 链接
-
Google 博客, 使用稀疏注意力方法构建用于更长序列的 Transformer, 2021, 链接
-
Shazeer, 2019, 快速 Transformer 解码:一个写头足矣,link
-
Pope, 2022, 高效扩展 Transformer 推理,link
-
Ahmed Taha,FlashAttention:快速且内存高效的精确注意力与 IO 关注,link,medium 文章
-
Angelina Yang,什么是深度学习中的全局注意力?博客文章,link
-
Dao, 2022, FlashAttention:快速且内存高效的精确注意力与 IO 关注,link
-
关于 FlashAttention 的深入分析 here
-
Medium 上关于 LLaMA 的文章,META 的 LLaMA:一个击败巨头的小型语言模型
-
Ainslie, 2023, CoLT5:具有条件计算的更快长范围 Transformers,link
-
Yu, 2023, MEGABYTE:使用多尺度 Transformers 预测百万字节序列,link
-
一篇关于扩展上下文长度的最新进展的博客文章,link
-
Andrew Lukyanenko,论文综述:将 Transformer 扩展到 1M tokens 及以上的 RMT,博客文章,link
-
Liu, 2023, 迷失在中间:语言模型如何使用长上下文,link
说话探针:自解释模型?
语言模型能帮助解释自己吗?
·
关注 发表在 Towards Data Science ·16 分钟阅读·2023 年 1 月 16 日
–
照片由 Kane Reinholdtsen 提供,来源于 Unsplash
在这篇文章中,我尝试了一个想法,即语言模型可以被引导解释来自其参数的向量。结果比你预期的要好,但仍然需要做很多工作。
与科学论文中的惯例一样,我使用“我们”而不是“我”(部分原因是因为这样可以让文本听起来不那么以自我为中心…)。
这实际上不是一项完整的工作,而更像是一个初步报告,关于我认为可能有用的一个想法,应该共享。因此,我只进行了基本实验以检验方法的合理性。我希望其他研究人员能从我开始的地方继续工作,看看我建议的方法的局限性是否可以克服。这项工作面向专业人士,但任何具有良好变换器知识的人都应该能轻松阅读。
介绍
近年来,许多可解释性方法在自然语言处理领域得到了发展 [Kadar et al., 2017; Na et al., 2019; Geva et al., 2020; Dar et al., 2022]。与此同时,强大的语言模型在该领域引起了轰动。有人可能会想知道强大的语言技能是否使语言模型能够对其内在状态进行交流。这项工作是对这一猜测的简要报告。在这项工作中,我们将设计自然语言提示,并将模型参数作为虚拟标记注入输入中。提示的目的是指示模型解释单词——但不是一个真实的单词,而是一个表示模型参数的虚拟标记。然后,模型生成一个继续提示的序列。我们将观察该技术解释模型参数的能力,我们已有现有解释。我们称这种新技术为*“发言探针”*。我们还将在高层次上讨论为什么可能期望这种方法有效的理由。
图示:发言探针的插图
鼓励可解释性研究人员使用发言探针作为指导分析的工具。我们并不 建议 不加区分地依赖其回答,因为它们并不完全可靠。然而,它们具有自然语言的表达能力这一重要优势。我们的查询在零样本情况下对模型来说是超出分布的,因为它仅用真实的标记进行训练。然而,我们假设它在操作其表示方面的固有技能将使其容易学习新任务。
我们为有兴趣自己探索这一技术的研究人员提供以下两个资源:
[## GitHub - guyd1995/speaking-probes
目前无法执行该操作。您在其他标签页或窗口中登录。您在其他标签页中退出了登录…
- 演示 (🤗 HuggingFace):
huggingface.co/spaces/guy-tau/speaking-probes
— 这可能会很慢,因此除了基本实验外,最好在 Colab 上打开存储库中的一个笔记本
背景:残差流
这在我之前的帖子中的背景部分已更详细地解释: 在嵌入空间中分析 Transformers — 解释
我们依赖于通过其残差连接对变换器的有用视图,这一视图最初由 nostalgebraist [2020] 提出。具体而言,每一层将隐藏状态作为输入,并通过其残差连接向隐藏状态添加信息。在这种视图下,隐藏状态是沿层传递的残差流,从中读取信息,并在每一层写入信息。Elhage 等人 [2021] 和 Geva 等人 [2022b] 观察到残差流在最后几层通常几乎没有更新,因此最终预测是在早期层中确定的,隐藏状态大多在后续层中传递。残差流视图的一个令人兴奋的结果是,我们可以通过将隐藏状态与嵌入矩阵 E 相乘,将每层的隐藏状态投影到嵌入空间,将隐藏状态视为最后一层的输出。Geva 等人 [2022a] 使用这种方法来解释基于变换器的语言模型的预测,我们也采取了类似的方法。
图:残差流视图——可视化
展示说话探测
概述
我们的直觉基于残差流视图。在残差流视图中,模型的参数与 token 嵌入在隐藏状态上以或多或少平等的方式相加。更一般地,残差视图暗示考虑参数向量、隐藏状态和 token 嵌入使用相同“语言”的理由。*从“句法上”*来看,我们可以使用任何连续表示——无论是参数向量还是隐藏状态——作为虚拟 token。我们将“神经元”与“虚拟 token”交替使用。
本文将重点讨论参数,因为隐藏状态似乎更复杂——这很有道理,因为它们是参数的混合。我们展示了参数向量可以与 token 嵌入一起在输入提示中使用,并产生有意义的响应。我们假设神经元最终会崩溃成与其编码概念相关的 token。
我们的目标是利用语言模型具备的强大沟通技能来表达其潜在知识。我们建议几个提示,要求模型解释一个词。模型不会直接接收到一个词,而是一个代表参数向量的虚拟 token。我们用标签 在提示中表示虚拟 token(在运行模型时,其 token 嵌入会被我们想要解释的神经元替换)。然后,我们生成提示的继续部分,这就是语言模型的响应。
提示
The term "<neuron>" means
- Synonyms of small: small, little, tiny, not big
- Synonyms of clever: clever, smart, intelligent, wise
- Synonyms of USA: USA, US, United States
- Synonyms of Paris: Paris, city of lights, city of love, capital of
France
- Synonyms of error: error, mistake, fallacy, wrong
- Synonyms of <neuron>:
The term <neuron> is a broad term related to
From Wikipedia: "<neuron> is
更多示例可以在 prompts/ 仓库中找到
方法
我们将一个提示输入模型,并生成文本的延续,其中 的“token embedding” 是我们想要解释的神经元。为了产生多样化的输出,我们使用采样而不仅仅是贪婪解码。我们将看到下面的一些示例。
在这项工作中,我们将重点关注前馈(FF)键(前馈子层的第一层),因为它们似乎比 FF 值(第二层)更容易解释。每一层 l 都有一个矩阵 K_l(不要与 attention 键混淆)——它的每一列都可以被视为单独解释的。
为了测试我们的方法,我们使用了我们已经对其在嵌入空间中的意义有较好了解的模型。显然,这些是我们可以考虑的最简单的情况——所以这些实验只是为了基本检查。作为语法糖,我们使用 <paramij> 来表示 i 层中第 j 个 FF 键的神经元。下面的所有示例都来自 GPT-2 medium。我们使用的生成超参数是:
temperature=0.5
repetition_penalty=2.
do_sample=True
max_new_tokens=50
min_length=1
示例:与嵌入空间投影的比较
日本名字
*当投影到嵌入空间时,<param_10_8> 似乎与日本名字以及通常与日本相关的术语相关(就我所知):
'Miy', '#imaru', 'Gong', 'Jinn', 'Xia', 'Makoto', 'Kuro',
'Shin', '#Tai', 'Yamato', 'Tai', 'Ichigo', '#Shin', '#atsu',
'Haku', 'Chun','#ku', 'Qing', 'Tsuk', 'Hua', 'Jiang', 'Nanto',
'manga', 'Yosh', 'yen', 'Osaka', 'Qian', '#uku', '#iku', 'Yue',
'Choi', '#iru', 'Hai', '#uchi', '#Japan', 'Kyoto', '#kun',
'#ikan', '#ugu', 'Tsu'
让我们看看新方法给我们带来了什么:
The term "<param_10_8>" means
generate: The term " <param_10_8>" means the god of light.
It is said that a man named Kamiyama was born in this world, and thus
he became known as Kaname (風). The name for him comes from his
appearance while wearing an animal's skin
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generate: The term " <param_10_8>" means the spirit of a person, and
it is used to describe something like emotion.
In other words there are two types: 「Hō」 (Emotion) or 「Ikuoi''(Spirit).
The first type can be described as
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generate: The term " <param_10_8>" means a person of Japanese descent.
In the original, this is said to be an English word
meaning 'a man with red hair'. However in later versions it's used as
a derogatory reference towards people who speak poorly or do not
understand their own language
讨论:虽然它没有给出明确的答案,但从以上示例中不难推测,该术语确实与日本和日本人相关。正如你所看到的,即使不涉及神经元,该模型也不太真实,像最后一个示例那样提出奇怪的断言。
进步
<param_11_2> 似乎与进步的概念相关。如果我们在嵌入空间中查看它,我们得到:
'progressing', '#Progress', '#progress', '#osponsors', '#oppable',
'advancement', 'progress', 'Progress', '#senal', '#venge', 'queue',
'#pun', 'progression', '#wagon', 'advancing', '#cknowled', '#Goal',
'momentum', '#zag', '#hop', 'pursuits', '#encing', '#Improve',
'STEP', '#chini', 'standings'
让我们看看新方法是否能得到这些:
The term "<param_11_2>" means
generate: The term " <param_11_2>" means to move forward.
If you're doing it right, your goal is not necessarily the same
as yours or others' goals. You may be able for a while (say 7-10
years) at least achieve some of what they are achieving in
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generate: The term " <param_11_2>" means to move forward into
the future. If you want a list of possible things that could
happen in your life, this is what it looks like:
I have no idea how much I've learned or accomplished
since then (but if anything has changed for
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generate: The term " <param_11_2>" means to make a substantial
advance towards attaining the object of an undertaking.
<!--end--> _______________________________________________
Sent through by email, sent from archive@gmane-online:...
讨论:我们可以认为这项结果相当不错。由于模型是基于互联网数据进行训练的,因此一些答案可能会复制网页讨论的格式。总的来说,这个参数似乎对说话探针易于解释。
以 G 开头的词汇
<param_0_0> 似乎与以字母“g”开头的词汇有关。在嵌入空间中,我们看到:
'#gd', '#GF', '#G', 'GN', '#GR', '#gat', 'Goff',
'#GW', 'g', '#GV', 'GS', 'Gw', '#GS', '#GBT',
'#gm', '#gp', 'Gork', 'Gow', '#GD', '#GP', '#gal',
'Gad', '#GC', '#g', 'GD', 'G', 'GA', '#gel', '#GG',
'Gemini', 'Gard', 'GR', '#Gs', '#gom', '#gran', 'gad',
'#gr', '#GM', '#GA', '#ga'
让我们看看使用说话探针会发生什么:
The term "<param_0_0>" means
generate: The term " <param_0_0>" means a character from the series.
(I'm not sure if this is an actual word, or just some sort of
translation error.)
A lot has been written about how much we love Doctor Who:
The Next Generation and what makes it such
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generate: The term " <param_0_0>" means a person who is not of
Greek origin.
In the United States, there are many people with names that
begin in G and end at g (such as: John Doe). The name was
originally spelled 'John' but it became common to spell
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generate: The term " <param_0_0>" means a small (6.5mm) hole in
the glass, which is formed when water flows through it and
enters into an open space inside the lens of your camera. The
image on this page was taken with my Olympus OM-D E M 50
- synonyms of small: small, little, tiny, not big
- synonyms of USA: USA, US, United States
- synonyms of Paris: Paris, city of lights, city of love, capital of France
- synonyms of error: error, mistake, fallacy, wrong
- synonyms of clever: clever, smart, intelligent, wise
- synonyms of <param_0_0>:
generate: - synonyms of small: small, little, tiny, not big
- synonyms of USA: USA, US, United States
- synonyms of Paris: Paris, city of lights, city of love, capital of France
- synonyms of error: error, mistake, fallacy, wrong
- synonyms of clever: clever, smart, intelligent, wise
- synonyms of <param_0_0>: G, man (male), woman(female)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generate: - synonyms of small: small, little, tiny, not big
- synonyms of USA: USA, US, United States
- synonyms of Paris: Paris, city of lights, city of love, capital of France
- synonyms of error: error, mistake, fallacy, wrong
- synonyms of clever: clever, smart, intelligent, wise
- synonyms of <param_0_0>: Gagarin rocket/rocket scientist
(from the Russian "Gigafar")
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generate: - synonyms of small: small, little, tiny, not big
- synonyms of USA: USA, US, United States
- synonyms of Paris: Paris, city of lights, city of love, capital of France
- synonyms of error: error, mistake, fallacy, wrong
- synonyms of clever: clever, smart, intelligent, wise
- synonyms of <param_0_0>: gg, go
讨论:使用第一个提示时,探针似乎与参数的嵌入空间解释无关。我们在正确方向上的唯一线索是来自第二个示例的“在美国,有许多人名字以 G 开头,以 g 结尾…”。然而,这种说法是间接的,并不是对问题的直接回答。
这是展示说话探针灵活性的好地方,因为它们允许你重新表述问题,并可能获得更好的结果。可以说第二个提示更适合问题。虽然它不完全真实,但对响应的概述可以暗示正确的方向——一个样本回应“G”然后给出几个无关的词。另一个则回复“gg, go”。虽然不明确,但它可以帮助开始探索。通常建议使用更多样本。
合成示例
也可以创建我们知道它们“应该”意味着什么的神经元。例如,我们取两个令牌嵌入的平均值,看看模型能否通过适当的提示重建它们。这有助于我们调试方法。我们可以根据不同变体的反应来评估其反应,并基于这些改进我们关心的实际神经元的提示。
在下面的示例中,我们将“children”和“dog”的令牌嵌入加在一起。然后我们对其应用一个说话探针。
我们可以用这个神经元作为探针处理多义神经元的玩具示例。不过要记住,行为可能会根据词汇的不同而有所不同。
generate: The term " <neuron>" means a person under the age of 18 years.
The terms are used in this chapter as follows:
(1) A child shall be considered to have attained legal maturity when he
or she has reached an understanding with his parent, guardian and other
persons that
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generate: The term " <neuron>" means any animal that is capable of
walking on two legs, but not a dog.
The phrase 'the children' refers to those who were born before
the adoption law was changed in 1996 and are now considered as age 18
or 19 years old
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generate: The term " <neuron>" means any member of the genus
Canis familiarus, but does not include chimpanzees or gorillas.
(2) (a)(i), in paragraph 1, is used to mean a dog that has been
domesticated by human beings and whose natural
探针对神经元的模糊性处理得相当好。样本似乎指向一个令牌,但然后可能会混淆并讨论另一个。
让我们看看当我们结合一些更具挑战性的令牌时会发生什么:“google”和“show”。这次我们使用一个不同的提示:
The invented word ' <neuron>' is a combination of the words
generate: The invented word'<neuron>' is a combination of the words
google and gmail. This term was coined in 2006 by Google's Senior
Vice President, Eric Schmidt to describe how people use their email
accounts (Google+).
I have spent many hours trying on different web sites with Gmail for
various reasons: I
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generate: The invented word'<neuron>' is a combination of the words
google and gopher, which mean both internet search engines. There are
two main types: Google-based sites that can be visited on your computer
(e.g., http://www!google) or from other web browsers like Firefox &
Opera
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generate: The invented word'<neuron>' is a combination of the words
google and gmail. The first example I found was from 2002, but it has
been used since then by many people on various websites to describe
their web pages (see for instance this article).
If you like what we do, please consider supporting
看起来我们在这里运气用尽了。词语“show”似乎已经被“google”吸收了。我们来试着通过将“google”的令牌嵌入系数设置为更小的值来缓解这个问题——我们将其乘以 0.9,得到:
The invented word ' <neuron>' is a combination of the words
generate: The invented word'<neuron>' is a combination of the words
show and giggle. A gag was coined in 1971 by British writer John Updike,
who wrote it to describe an episode where TV presenter Peter Jennings
tries his hardest not laugh at something he's seen before (see below).
Gag
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generate: The invented word'<neuron>' is a combination of the words
show, tell and lie ('tell'). This can be used to describe several types:
It's not just for kids. It also applies here at Wikipedia!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
generate: The invented word'<neuron>' is a combination of the words
show and giggle. In all probability, this was used to describe something
that had no physical connection with comedy at first sight:
Gretchen Rubin's new book The Giggling Brain has just been published
by Oxford University Press; it looks
似乎它可以将“*show”和“giggle”恢复为“google”*的扭曲版本。
讨论
方法的潜力
我们希望利用此方法的独特特征是:
-
自然语言输出:既是优点也是缺点,它使得输出更难评估,但比其他方法提供了更大的灵活性。
-
操作潜在表征的固有能力:我们使用模型自身操作其潜在表征的能力。我们假设它们与模型参数共享相同的潜在空间,因为残差流视图。其他技术需要经过训练或以其他方式调整到模型的潜在空间以“理解”它。模型能够自然解码自身状态,这对解释是有用的。
一般来说,关于将连续向量作为变换器中的一等公民的研究不多。虽然像提示调优 [Lester et al., 2021] 这样的想法,以及像 Hao et al. [2022] 这样的令人兴奋的想法将连续输入传递给模型,但它们需要训练才能工作,且不能零样本使用。这项工作中的核心主题是研究是否可以在不进一步训练的情况下将某些连续向量用作自然标记——假设它们使用与模型相同的“语言”。
这种技术的另一个有用特性是,它或多或少将模型视为黑箱,而不涉及太多技术工作。它易于实现和理解。将解释视为生成问题,我们可以利用主流 NLP 的生成文献来进行未来的工作。类似地,幻觉是发言探针中的一个主要问题,但我们可以希望未来将主流研究方法应用于这种方法。
总体而言,这可能是 最模块化 的可解释性方法——它不依赖于特定的算法,并且可以采用 NLP 其他领域的见解进行改进,而不会丧失效率。此外,它易于实验(即使是对学术不太感兴趣的从业者),并且搜索空间的格局与其他方法大相径庭。
可能的未来方向
-
雄辩。过于雄辩:语言模型被训练以产生雄辩的解释。事实性对它们来说较少令人担忧。这些雄辩的解释不应被字面理解。
-
层同质性:在本文中,我们隐含地假设我们可以从不同的层获取参数,它们会对我们的提示做出类似的反应。可能有些层比其他层更适合与发言探针一起使用。我们称之为 层同质性。我们需要谨慎地假设所有层在我们的方法中可以被相同对待。
-
神经元多义性:尤其是在面对词汇崩溃时,似乎携带多个无关解释的神经元需要多次采样,以涵盖所有不同的含义。我们希望能够更真实地提取这些不同的含义,并“一次性”完成。
-
更好的提示:这不是我们工作的主要部分,但许多论文展示了使用精心设计的提示的好处 [例如,Liu et al., 2021]。
-
其他类型的概念:我们主要讨论了表示自然语言中的类别或概念的神经元。我们知道语言模型可以处理代码,但我们在这篇文章中没有考虑这类知识。此外,使用发言探针来定位模型参数中的事实也很有趣。事实可能需要多个参数协同工作——因此,定位这些事实并找到能够提取这些事实的提示将会很有趣。
如果你进行后续工作,请引用如下:
@misc{speaking_probes,
url = {https://towardsdatascience.com/speaking-probes-self-interpreting-models-7a3dc6cb33d6},
note = {\url{https://towardsdatascience.com/speaking-probes-self-interpreting-models-7a3dc6cb33d6}},
title = {Speaking Probes: Self-interpreting Models?},
publisher = {Towards Data Science},
author = {Guy, Dar},
year = 2023
}
你也可以在 Twitter 上关注我:
[## Guy Dar (guy__dar) / Twitter
Twitter](https://mobile.twitter.com/guy__dar?source=post_page-----7a3dc6cb33d6--------------------------------)
这不是直接的后续,但你可能还对我与合作者合作的相关论文的另一篇博客帖子感兴趣:
## Analyzing Transformers in Embedding Space — Explained
在这篇文章中,我介绍了 Guy Dar、Mor Geva、Ankit Gupta 等人于 2022 年发表的论文《分析嵌入空间中的转换器》。
towardsdatascience.com
References
Dai D, Dong L, Hao Y, Sui Z, Chang B, 以及 Wei F. 预训练转换器中的知识神经元,2021. URL arxiv.org/abs/2104.08696
。
Dar G, Geva M, Gupta A, 以及 Berant J.《在嵌入空间中分析转换器》,2022. URL arxiv.org/abs/2209.02535
。
Elhage N, Nanda N, Olsson C, Henighan T, Joseph N, Mann B, Askell A, Bai Y, Chen A, Conerly T, DasSarma N, Drain D, Ganguli D, Hatfield-Dodds Z, Hernandez D, Jones A, Kernion J, Lovitt L, Ndousse K, Amodei D, Brown T, Clark J, Kaplan J, McCandlish S, 以及 Olah C. 转换器电路的数学框架,2021. URL transformer-circuits.pub/2021/framework/index.html
。
Geva M, Schuster R, Berant J, 以及 Levy O. 转换器前馈层是键-值存储器,2020. URL arxiv.org/abs/2012.14913
。
Geva M, Caciularu A, Dar G, Roit P, Sadde S, Shlain M, Tamir B, 以及 Goldberg Y.《Lm-debugger: 一个交互式工具,用于检查和干预基于转换器的语言模型》[Lm-debugger: An interactive tool for inspection and intervention in transformer-based language models]. arXiv preprint arXiv:2204.12130, 2022a。
Geva M, Caciularu A, Wang K R, 以及 Goldberg Y.《转换器前馈层通过推动词汇空间中的概念来构建预测*,2022b。URL arxiv.org/abs/2203.14680
.
Hao Y, Song H, Dong L, Huang S, Chi Z, Wang W, Ma S, 以及 Wei F. 语言模型是通用接口,2022. URL arxiv.org/abs/2206.06336
。
Kadar A, Chrupala G, 以及 Alishahi A. 在递归神经网络中表示语言形式和函数。计算语言学, 43(4):761–780, 2017。ISSN 0891–2017. doi: 10.1162/COLI a 00300. URL doi.org/10.1162/COLI_a_00300
。
B. Lester, R. Al-Rfou 和 N. Constant. 参数高效提示调整的规模力量,2021. 网址 arxiv.org/abs/2104.08691
。
J. Liu, D. Shen, Y. Zhang, B. Dolan, L. Carin 和 W. Chen. 什么构成了 GPT-3 的优秀上下文示例?CoRR, abs/2101.06804, 2021. 网址 arxiv.org/abs/2101.06804
。
S. Na, Y. J. Choe, D.-H. Lee 和 G. Kim. 发现 CNN 单元中的自然语言概念,2019. 网址 arxiv.org/abs/1902.07249
。
nostalgebraist. 解释 GPT:logit 视角,2020. 网址 www.lesswrong.com/posts/AcKRB8wDpdaN6v6ru/interpreting-gpt-the-logit-lens
。
我们正在变化的全球村
TDS 特色专栏
扩张的城市与缩小的乡村
·
关注发表于Towards Data Science · 阅读时间:8 分钟 · 日期:2023 年 3 月 15 日
–
图片来自 Unsplash,创作者:Louis Reed
你是一个城市居民吗?你并不孤单!我们的全球城市人口已达56%,并预计到 2050 年将飙升至所有人口的70%。¹ 到那时,世界上的人类总人口将达到97 亿,² 这一我们居住地的变化将对我们生活的方式产生深远的影响。我们已经看到智能城市、机器学习模型以及地理空间监测正在为可持续性和充满活力、宜居的社区带来令人兴奋的新想法。
如果你从事数据科学、机器学习或 AI 工作,并希望了解你的技能如何帮助塑造讨论,或者如果你想寻找加入这一努力的灵感但不确定从何开始,你来对地方了。
借助 TDS 深厚的档案,我们收集了30 篇文章,以提供对数据科学和人口相关问题的全面视角。我们分享了地理空间分析师、建筑师和在城市规划、供应链优化以及野生动物保护等专业领域工作的作者的经验和实用解决方案。
我们大致将这些文章组织成呈现数据科学家正在解决的全球和本地挑战的主题。浏览标题并挑选你感兴趣的内容,或深入探讨单一主题。不管你如何使用这个资源,你一定能学到一些新东西。
当你准备好迈出第一步,撰写关于你自己的人口问题相关分析或解决方案时,你会在本指南的最后找到9 个有用的演练和数据集。
我们鼓励你在阅读的文章上留下评论,并尽可能广泛地分享这些文章和本课程。
让我们开始吧!
1. 人口分析
我们从使用人口分析和可视化的全球鸟瞰图开始。这是一个重要的第一步,因为了解我们的人口如何分布,特别是与资源的比较,是找到量身定制解决方案的关键,这些解决方案能够带来最大的影响。
这些文章中有许多集中于地理空间分析,而其他则提供了图形或 3D 方法。每篇文章都提供了详尽的演练和良好的数据集来帮助你入门。
-
用 Python 可视化全球人口数据集 by Parvathy Krishnan(8 分钟)
高分辨率的栅格和矢量数据可以提供详细的局部人口分析。
-
用 Python 创建美丽的人口密度地图 by Adam Symington(7 分钟)
大规模数据可视化可能具有挑战性!仔细选择数据和 Python 绘图参数可以创建出色的人口密度地图。
-
网格化:估算地球上任意地点的人口密度 by Nick Jones(9 分钟)
网格化数据集用于关注局部人口密度,这是城市规划和政策中的关键指标。
-
通过人口可视化进行数据讲述 由 艾米莉·A·哈尔福德 撰写(12 分钟)
通过 3D 方法可视化人口增长,作为一种有效的讲故事技术。
-
利用美国人口普查局数据为任何国家创建人口金字塔 由 兰迪·伦奇 撰写(9 分钟)
使用人口普查数据的动态人口金字塔,深入挖掘人口随时间变化的具体情况。
2. 城市规划
接下来,我们将重点关注在人口分析成为规划中心的城市,从住房和交通到商业服务和公用事业。我们将分享涉及城市规划问题、智慧城市和创新建筑方法的文章。
-
计算创意 由 凯伦·阿斯马尔 撰写(14 分钟)
一种对生成对抗网络(GAN)在建筑中的有趣应用,可能揭示出未来城市的“不可思议建筑”。
-
如何创建和使用轮廓线 由 海伦·麦肯齐 撰写(8 分钟)
轮廓线的使用可以确定服务可达性,这是成功城市发展的一个重要因素。
-
预测长期每日市政水需求 由 布莱克·范伯洛 撰写(13 分钟)
深入了解加拿大伦敦市如何使用机器学习预测模型来预测水需求。
-
利用表观时间非侵入式负载监测进行能源管理 由 林多·圣安吉尔 撰写(15 分钟)
该深度学习模型的重点是实现“可持续和可扩展的电网”在消费者层面的非侵入式负载监测的可行性。
-
能源优化水平的比较分析 由 克里斯蒂安·埃尔扬德 撰写(7 分钟)
智能能源控制优化有可能显著降低家庭能源费用,包括与电动车充电相关的费用。
-
人工智能如何助力智慧城市倡议 由 Tirthajyoti Sarkar 撰写(8 分钟)
深入探讨人工智能在处理与智慧城市倡议相关的大量数据中的角色,这些数据有助于规划者设计从交通管理到水资源的所有内容。
-
使用开源数据估算太阳能面板输出 由 Ang Li-Lian 撰写(9 分钟)
LiDAR 可以作为估算太阳能面板输出的有效方法,如本全面指南的作者所述。
3. 可持续农业
每个国家在确保可靠食品供应方面面临着独特的挑战,许多国家依赖于从其他国家进口的农产品。我们确实是一个全球村!由于气候变化,农业实践已经开始发生变化,随着我们追求超高效和可持续的食品生产,还会看到更多变化。不要只听我们的说法——这些作者提供了关于现代农业未来的深刻文章。
-
农业经济学优化与可持续发展 由 Bonny Nichol 撰写(7 分钟)
预测土壤、降雨、播种和施肥如何影响产量,提供了一种数据驱动的最佳实践,这可能帮助农民提高作物产量。
-
使用 Google Earth Engine 和 FAO WaPOR 数据监测非洲水资源短缺(SDG 6.4) 由 Iman Tantawy 撰写(5 分钟)
地理空间监测以衡量有效的水资源使用,以满足农业需求。
-
一种更易获取和可复制的加州卫星基础的手工采摘作物映射方法 由 Madeline Lisaius 撰写(12 分钟)
劳动力短缺对手工采摘的水果和蔬菜作物的影响,通过卫星图像找出种植模式的变化。
-
通过数据策略应对全球食品挑战——约翰·迪尔的故事 由 Ekhtiar Syed 撰写(6 分钟)
智能农业结合 AI、AR 和远程监控的未来标准。
-
使用深度学习帮助非洲农民提高产量 由 Patrick Kalkman 撰写(12 分钟)
一种深度集成学习模型,用于从图像中检测植物疾病,从而改善作物健康。
-
神经网络会梦想飘落的雪吗? 由 Fraser King 撰写(13 分钟)
关于使用机器学习预测降雪的新研究,这是农业区域淡水的重要来源。
我们不断扩展的自然环境
随着我们占用更多土地以容纳和养活不断增长的人口,我们的自然环境受到影响。我们是一个复杂而脆弱的生态系统的一部分,需要精心维护,以造福所有人。这些作者提出了创新的野生动植物管理和监测策略,并详细探讨了土地使用变化对大气碳水平的影响。
-
利用卫星影像弥合碳排放清单中的土地使用差距 由 Guilherme M. Iablonovski 撰写(9 分钟)
GIS 技术用于捕捉土地使用变化对城市树木、森林和土壤从大气中移除碳的影响。
-
使用 Google Earth Engine 监测植被 由 Sixing Huang 撰写(10 分钟)
卫星影像如何用于评估和监测生态系统健康。
-
AI 地理空间野火风险预测 由 Theo Jaquenoud 撰写(16 分钟)
一个利用栅格数据进行野火风险预测的模型,旨在最小化火灾的危害及其相关成本。
-
人口动态的形态 由 Francesco Palma 撰写(7 分钟)
通过拓扑数据分析识别和管理面临风险的野生动物种群。
-
利用地理空间技术揭示对海洋巨型动物的捕鱼活动风险由 Bryan R. Vallejo 撰写(7 分钟)
空间数据分析作为保护和保存海洋资源的有效工具,因为扩张的捕鱼活动与海洋生命竞争。
-
构建一个简单的 AI 驱动的、在环系统以管理野生动物相机捕获的图像和注释由 Abhay Kashyap 撰写(19 分钟)
计算机视觉作为一种成本效益高的解决方案,替代昂贵且劳动密集的人工标注大量野生动物相机捕获的照片,这是野生动物自然栖息地变化的重要第一步。
交通
最后,我们探讨人们和商品在本地和全球范围内的流动。随着我们人口的增长,车辆、船只和飞机的环境成本必须考虑,但随着道路交通量的增加,安全也成为问题。这些文章的作者分析了当前情况,并提出了解决方案,如共享单车、公共交通、智能道路和供应链优化。
-
通过可视化公共航空数据审查航空公司效率由 Aine Fairbrother-Browne 撰写(10 分钟)
对比 COVID 前后航空公司航班数据,以识别“幽灵”航班(低于 10%容量),这类航班具有较高的环境成本。
-
使用 Python 进行供应链优化由 Samir Saci 撰写(10 分钟)
最小化公司碳足迹,同时满足需求和降低运输成本,是这一优化策略的重点。
-
空间数据科学:交通规划的网络分析由 Sutan Mufti 撰写(6 分钟)
使用图论方法优化运输路线并模拟新/变化路线对可达性的影响。
-
通过大数据分析支持非洲的辅助交通流动性 作者Marco Brambilla(6 分钟)
大数据可能在解决交通贫困问题中发挥作用,通过提供可靠、负担得起的交通服务。
-
智能道路:人工智能如何在交通中保护司机的安全 作者Andrey Koptelov(6 分钟)
人工智能能否在车辆数量随着人口增长而增加的情况下提供安全的智能道路?
-
利用广义加性模型(GAMs)生成洞察 作者Alvaro Peña(10 分钟)
介绍如何使用广义加性模型促进“零排放交通”,使自行车共享成为一种简单且便利的选择。
想开始撰写自己的文章吗?
我们希望这篇特别特辑中的文章能激发你尝试自己的分析。如果你不确定从哪里或如何开始,我们可以帮助你!
首先,我们分享了两个精彩的与人口相关的数据集供你探索:
接下来,我们收集了一些来自我们作者的文章,他们分享了找到的数据集或提供了逐步指南,帮助你入门特定主题。这些都是启动你的文章的绝佳选择——也许会在我们的下期通讯中被提到!
-
我建立了一个包含 2,500 个数据集的公共世界地图集供探索 作者Dan Baker
-
开源 CityGML 3D 语义建筑模型 作者Joe T. Santhanavanich
-
启动供应链数据科学之旅的 4 个有影响力的项目 萨米尔·萨奇
-
图表 101:航空运输网络 布鲁诺·贡萨尔维斯
我们希望你已经在我们的阅读列表中找到了一些感兴趣的文章,并且受到启发去研究一个或两个话题。当你准备好与我们的社区分享你对与人口相关挑战的数据科学分析时,我们鼓励你提交你的文章。
我们非常期待在我们不断变化的全球村庄中看到你对未来的展望!
参考资料
-
世界银行,城市发展,最后更新于 2022 年 10 月 6 日。
-
联合国,全球问题:人口,访问日期:2023 年 3 月 13 日。
专门化的 LLM:ChatGPT、LaMDA、Galactica、Codex、Sparrow 等
原文:
towardsdatascience.com/specialized-llms-chatgpt-lamda-galactica-codex-sparrow-and-more-ccccdd9f666f
创建更好领域特定 LLM 的简单技巧
·发表于Towards Data Science ·阅读时间 30 分钟·2023 年 1 月 13 日
–
大型语言模型(LLM)是非常有用的任务无关的基础模型。但是,我们实际上能用一个通用模型完成多少任务? 这些模型擅长解决我们在深度学习文献中看到的常见自然语言基准。然而,实际使用 LLM 通常需要教给模型与特定应用相关的新行为。在这个概述中,我们将探讨针对各种使用案例专门化和改进 LLM 的方法。
我们可以通过使用领域特定的预训练、模型对齐和监督微调等技术来修改 LLM 的行为。这些方法可以用来消除 LLM 已知的限制(例如,生成不正确/有偏见的信息),调整 LLM 的行为以更好地满足我们的需求,甚至将专业知识注入 LLM,使其成为领域专家。
最近的文献中对为特定应用创建专门的 LLM(大型语言模型)的概念进行了深入探讨。尽管存在许多不同的方法,但它们都有一个共同的主题:使 LLM 在实际应用中更具可行性和实用性。尽管“实用”的定义在不同应用和用户中差异很大,但我们将看到,存在几种技术可以用来调整和修改现有的预训练 LLM,从而在各种应用中显著提升其性能和易用性。
(来自[6]和[12])
背景
我们在最近的帖子中讨论了语言模型(LMs)和大语言模型(LLMs)的主题。有关这些概述,请参见以下参考文献:
我们将在这个概述中简要总结这些观点。但我们主要将关注于基本语言建模单独难以胜任的应用领域。
仅仅教一个模型预测序列中的下一个词,我们能实现的有限。为了引发特定行为,我们需要采用一些新的训练语言模型的方法,这些方法更具针对性。除了在提高语言模型质量方面非常有效外,我们将看到,这些替代的方法相比从头开始进行预训练要便宜很多。
什么是语言模型?
自监督的语言模型预训练(由作者创建)
基本设置。 我们将讨论的大多数现代语言模型采用仅解码器的 Transformer 架构[1]。这些模型被训练来执行一个简单的任务:预测序列中的下一个词(或标记)。为了让模型做到这一点,我们从互联网上收集大量未标记的文本数据,并使用自监督的语言建模目标来训练模型。简单来说,这意味着我们:
-
从我们的数据集中抽取一些文本
-
尝试用我们的模型预测下一个词
-
根据正确的下一个词更新我们的模型
如果我们不断重复这个过程,使用足够大和多样化的数据集,我们将得到一个高质量的语言模型,具有相对细致和有用的语言理解。
这有什么用? 虽然语言模型在生成文本方面显然很出色,但我们可能会怀疑它们是否对其他方面也有用。我们究竟能通过仅仅预测序列中最可能的下一个词来完成什么?
实际上,我们可以用语言模型解决许多不同的任务。这是因为它们的输入-输出结构(即,以文本为输入,产生文本为输出)非常通用,许多任务可以通过提示技术重新制定以适应这种结构。例如,考虑以下输入。
-
“识别这个句子的情感是积极的还是消极的:”
-
“将以下句子从英文翻译成法文:”
-
“总结以下文章:
”
使用这样的输入提示,我们可以将常见的语言理解任务转化为 LM 友好的、文本到文本的结构——LM 最可能的输出应该解决我们期望的问题。通过这种方法,我们可以解决从选择题回答到文档总结等广泛的问题,正如 GPT-3 所示 [2]。
(来自 [2])
为了提高性能,我们可以在提示中包含正确输出的示例(即,一次/少量示例学习方法),或者对 LM 进行微调以解决特定任务。然而,微调会强迫 LM 专注于解决单一任务,这需要为每个新任务微调一个单独的模型;见上文。
规模化。 早期的 LM 如 GPT 和 GPT-2 展现了很大的潜力 [3,4],但它们的零样本/少样本表现较差。然而,后来的研究表明 LM 的表现应该随着规模的增加而平稳提升 [5]——更大的 LLM 更好!这在 GPT-3 [2] 中得到了确认,这是一个具有 1750 亿参数的模型(即,比任何以前的模型都大得多),在少量示例学习方面表现非常好。这一成功的秘密在于:
-
获得一个大而多样化的未标记文本数据集
-
使用语言建模目标在这个数据集上预训练一个更大的模型
-
使用提示通过少量示例学习解决任务
使用这些简单的要素,我们可以训练出在许多任务中表现出色的大型语言模型(LLMs)。这些 LLM 是强大的、与任务无关的 基础模型。
鉴于更大的 LLM 表现良好,后续的研究探索了更大的模型。结果(可以说)并没有突破性的进展。但是,如果我们将更大的模型与更好的预训练数据集结合起来,LLM 的质量会显著提高!通过获得更好的预训练语料库(例如,Massive Text)并在更多数据上预训练 LLM,我们可以获得如 Chinchilla 这样既更小又更高效的模型,相对于 GPT-3 更具性能。
通用 LLM 有哪些不足之处?
这种预训练 LLM 并用它们解决各种下游问题的通用范式非常好。但在尝试完成比一般语言理解更具体的任务时,我们会遇到问题。为了这篇文章的目的,我们将重点关注两个主要领域,这些领域中对更专业 LLM 行为的需求会出现:
-
对齐
-
领域专业化
将语言模型对齐到人类价值观(由作者创建)
对齐。 许多时候,通用 LLM 会生成对与模型互动的人不期望的输出。例如,我们可能想要:
-
防止我们的 LLM 存在种族歧视
-
教会模型遵循和执行人类指令
-
避免生成事实错误的输出
换句话说,我们可能希望将 LLM 对齐到使用模型的人类的特定目标或价值观;见上文。
在像 GPT-3 这样的强大 LLM 基础模型创建之后,LLM 研究的重点迅速转向对齐问题。虽然描述起来有些模糊(即,我们如何定义我们对齐 LLM 行为的规则?),但对齐的想法非常强大。我们可以简单地教我们的 LLM 以对我们人类更安全和有用的方式进行行为。
许多最近大型语言模型使用的语言建模目标——从互联网网页上预测下一个词——与“帮助和安全地遵循用户指令”的目标不同——来自 [6]
领域特定模型。 除了对齐之外,我们可以考虑在专业领域中部署 LLMs。像 GPT-3 这样的通用 LLM 无法成功生成法律文件或总结医学信息——像法律或医学这样的专业领域包含大量复杂的领域知识,这些知识在通用预训练语料库中并不存在。对于这种应用,我们需要以某种方式创建一个对我们感兴趣的特定领域有更深知识的 LLM。
精细化 LLM 行为
(来自 [13])
鉴于我们可能希望将我们的 LLM 对齐到特定目标或实现更专业的行为,可能会立即想到两个主要问题:
-
我们如何做到这一点?
-
这将花费多少?
第一个问题有点复杂,因为有几种可行的答案。
领域特定预训练。 如果我们希望我们的 LLM 对某一特定领域有很好的理解,最简单的做法是*(i)* 收集大量与该领域相关的原始数据,并*(ii)* 使用语言建模目标对这些数据进行训练。这样的过程与通用 LLM 预训练非常相似,但我们现在使用的是领域特定的语料库。
通过学习更具体的语料库,我们可以开始在模型中捕捉到更多相关的信息,从而实现更专业的行为。这可能包括“提示预训练”等内容,如上图所示,我们会在与实际使用场景匹配的特定提示示例上进一步预训练 LLMs。
在进行领域特定预训练时,我们有两个基本选项:
-
用通用预训练初始化 LLM,然后在领域特定数据上进行进一步预训练。
-
从领域特定数据开始从零预训练 LLM。
根据应用情况,这些方法中的任何一种可能效果最好,尽管用预训练 LLM 参数初始化通常会导致更快的收敛(有时表现更好)。
从人类反馈中学习的强化学习。 仅仅使用语言建模目标,我们无法明确地做诸如教 LLM 遵循指令或避免错误陈述等事情。为了实现这些更微妙(且可能模糊)的目标,最近的研究采用了强化学习(RL)方法。
对于那些不熟悉 RL 的人,可以查看链接 这里 以了解该概念的基本概述。对于 LLM 应用,模型的参数对应于我们的策略。人类将向 LLM 提供输入提示,LLM 将生成响应输出,奖励由 LLM 的输出是否符合人类期望来决定。
尽管 RL 并不是必须的(即,若干研究专注于不使用 RL 的 LLM 对齐),但它非常有用,因为我们可以将“期望”的定义更改为几乎任何东西。例如,我们可以奖励 LLM 生成事实正确的陈述、避免种族主义行为、遵循指令或产生有趣的输出。这些目标通过可以用梯度下降优化的可区分损失函数很难捕捉。然而,使用 RL 时,我们只是奖励模型我们喜欢的行为,这提供了极大的灵活性。
(来源 [6])
大多数研究使用一种称为从人类反馈中学习的强化学习(RLHF)的方法来调整 LLM;见上文。RLHF 的基本思想是利用人类提供反馈,通过 RL 使模型学习。更具体地说,模型使用 近端策略优化(PPO) 进行训练,这是一种最近的、有效的 RL 方法。
监督微调。 我们还可以直接微调 LLM 来完成特定任务。这在如 GPT [3] 的语言模型中很常见,这些模型采用预训练和微调的方法,我们对预训练的语言模型进行微调以解决每个下游任务。最近,我们看到监督微调被用来修改 LLM 行为,而不是专门用于特定任务。
例如,如果我们想创建一个非常好的 LLM 聊天机器人呢?一个潜在的方法是获取一个通用的、预训练的 LLM,然后向这个模型展示一堆高质量的对话示例。然后,可以在这些对话示例上训练 LLM,从而使模型学习到更专业的行为,这些行为特定于这个应用,并使其成为更好的聊天机器人!
对齐成本很低! 大多数修改 LLM 行为的方法在计算上并不昂贵,尤其是相比从头训练一个 LLM。对齐的低开销可以说是这个话题在现代 LLM 研究中如此受欢迎的主要原因。与其承担完全重新训练 LLM 的成本,为什么不使用成本更低的方法来改进一个预训练的 LLM 呢?
“我们的结果表明,RLHF 在使语言模型对用户更有帮助方面非常有效,比增加 100 倍的模型规模更为显著。这表明,现在在现有语言模型的对齐投资上投入更多资金,比训练更大的模型更具成本效益。” — 来自 [6]
发表文献
我们将概述各种将通用大型语言模型扩展到更专业场景的出版物。虽然有多种不同的方法用于修改和改进大型语言模型,但总体概念是相同的。我们希望修改一个通用的语言模型,使其行为更适合所需的应用。
评估训练在代码上的大型语言模型 [7]
现在,我们已经知道大型语言模型在各种问题上非常有效。但我们还没有看到很多自然语言以外的应用。当我们在代码上训练一个大型语言模型时会发生什么?
与自然语言类似,互联网上有大量的代码(例如,通过 GitHub)。既然我们知道大型语言模型在对大量原始未标记数据进行预训练时表现良好,那么它们在对大量代码进行预训练时也应表现良好。这个想法在 [7] 中提出的 Codex 模型中得到了探讨。
(来自 [7])
Codex 是一个在 GitHub 上公开的 Python 代码上进行微调的大型语言模型。给定一个 Python 文档字符串,Codex 的任务是生成一个有效的 Python 函数,该函数执行文档字符串中概述的任务;见上面的例子。该模型的发展受到 GPT-3 能够相对较好地生成 Python 程序这一简单观察的启发。
Codex 比 GPT-3 小很多,包含总共 120 亿个参数。该模型首先在自然语言语料库上进行预训练(即,按照正常的语言模型预训练程序),然后在包含 159Gb 从 GitHub 上抓取的 Python 文件的语料库上进一步预训练。作者声称,这一初始语言模型预训练程序并不会改善 Codex 的最终性能,但它确实允许模型在对代码进行预训练时更快地收敛。
(来自 [7])
为了评估 Codex 的质量,[7] 中的作者创建了 HumanEval 数据集,这是一组包含 164 个编程问题及其相关单元测试的问题集;见上面的例子。该模型根据在一定次数的尝试下生成通过测试的程序的能力进行评估——这称为 pass@k
。
当对 Codex 进行评估时,我们发现该模型的行为与普通语言模型类似。例如,其损失值遵循 幂律 与模型大小相关,如下所示。
(来自 [7])
此外,随着模型大小的增加,模型在 HumanEval 数据集上解决问题的能力也有所提升。相比之下,GPT-3 无法解决任何编程问题,显示出在特定代码数据集上进行微调可以大大提高性能。执行简单的技巧,如生成一堆潜在脚本,然后选择概率最高的一个作为你的解决方案(即,“均值对数 p 重排序”)也有助于提高性能;见下文。
(来自 [7])
如果我们不仅允许 Codex 对每个问题进行一次尝试,我们可以得到一些非常惊人的结果。例如,给每个问题 100 次尝试(即,Codex 生成 100 个函数,然后我们检查是否有任何一个正确解决了编程问题),Codex 在 HumanEval 数据集上的通过率达到了 70.2%!
(来自 [7])
与以前提出的代码生成模型相比,Codex 的性能要好得多;请见下文。
(来自 [7])
为了进一步提升这种性能,我们可以*(i)* 收集一个带有正确实现函数的 Python docstrings 的监督数据集,并*(ii)* 在这个数据集上进一步微调 Codex。这种模型变体,称为 Codex-S,在每个问题 100 次尝试下达到了约 80%的通过率。
(来自 [7])
总体而言,Codex 向我们展示了 LLMs 不仅仅适用于自然语言——我们可以将其应用于遵循这种结构的各种问题。在这种情况下,我们使用对代码数据集进行进一步的语言模型预训练,将 GPT 风格的模型适配到新的领域。创建这种领域特定的模型相对简单——主要问题是正确处理代码中相比于普通英文文本更多的空白字符。
Copilot. Codex 被用来为GitHub Copilot提供支持,这是一个与 VS Code 集成的代码补全功能。我个人不使用它,但在看到 Andrej Karpathy 在 Lex Fridman 播客中的积极推荐(请参见“最佳 IDE”时间戳)和论文中的惊人结果后,我有动力去了解它,并思考像 Codex 这样的更实际有用的 LLM 应用。
LaMDA: Language Modeling for Dialog Applications [8]
在[8]中,DeepMind 的作者提出了一种名为 LaMDA(对话应用的语言模型)的 LLM 驱动对话模型。所研究的最大模型包含 137B 参数——略小于 GPT-3。对话模型(即,用于参与或生成连贯对话的专业语言模型)是 LLMs 最受欢迎的应用之一。
与对语言模型的一般研究类似,我们在先前的研究中看到,对话模型的性能随着规模的扩大而提高 [9]。然而,故事并未止步于此。模型的扩大在一定程度上提高了对话质量,但无法改善如基础性或安全性等指标。为了捕捉或对齐这些替代目标,我们必须超越语言模型的预训练;见下文。
(摘自 [8])
在开发 LaMDA 时,作者定义了 LLM 行为的三个重要对齐领域:
-
质量: 是对合理性(模型是否有意义并且不与早期对话相矛盾?)、特异性(模型的回应是否针对给定的上下文?)和趣味性(模型的回应是否能吸引读者的注意力或激发好奇心?)的平均评估。
-
安全性: 避免产生与Google AI 原则中目标相矛盾的意外或有害结果的能力。
-
基础性: 生成的回应必须事实正确,并能与权威的外部来源相关联。
这个最终目标尤其重要,因为 LLM 经常产生看似合理但实际上不正确的回应。我们希望避免信任的用户被“全知”聊天机器人提供错误信息的情况!
(摘自 [8])
与其他 LLM 类似,LaMDA 首先通过对大规模未标注的常规文档和对话数据集进行语言建模目标的预训练。用于预训练 LaMDA 的数据集非常庞大,超出了以往对话模型的预训练数据集的40 倍
[9]。在对这一数据集进行预训练后,LaMDA 还在原始预训练集的更对话特定部分上进一步预训练——这模拟了我们之前了解的领域特定预训练方法。
(摘自 [8])
为了提高 LaMDA 的质量、安全性和基础性,作者使用人工劳动力收集并注释违反期望指南(例如,做出有害或不正确评论)的模型行为示例。收集到的人类注释数据集汇总在上表中。
这些数据集被转换成与 LLM 兼容的文本到文本结构,并用于以监督方式微调 LaMDA。在此过程中,LaMDA 学习准确预测生成内容的质量、安全性和基础性。LaMDA 随后可以利用这种学习能力来过滤其自身的输出(例如,通过选择更有趣或更少有害的回应)。
(摘自 [8])
当应用这种微调方法时,我们观察到模型在质量、安全性和扎实性方面取得了显著的改进;见上文。使用更大的模型可以提高模型质量,但除了扩大模型规模外,还需要微调,以在其他度量标准中看到改进。
总体而言,我们在[8]中看到,大规模预训练 LLM 可能并不是使 LLM 尽可能有用的所有要求,特别是在将其调整到更具体的领域如对话生成时。收集较小的、注释的数据集以进行微调,捕捉诸如安全性或扎实性等特定目标,是将通用 LLM 调整到更具体应用的真正有效方法。
“收集微调数据集带来了从细致的人类判断中学习的好处,但这是一个昂贵、耗时且复杂的过程。我们预计随着更大规模的微调数据集、更长的上下文和更多的度量标准,结果将继续改进,这些度量标准涵盖了进行安全、扎实和高质量对话所需的广度。” — 引自[8]
实际上,将通用预训练与针对特定目标的人类注释监督微调相结合可能有点过于有效。LaMDA 语言模型真实到使得一位 Google 工程师相信它是有意识的!
训练语言模型以遵循人类反馈指令 [6]
在[6]中,我们继续根据人类反馈对 LLM 行为进行对齐。然而,采用了一种与监督微调截然不同的基于强化学习的方法。[6]中的对齐过程旨在生成一个避免有害行为且更好地遵循人类指令的 LLM。结果模型称为 InstructGPT,发现它在各种人类试验中显著比通用 LLM 更有帮助。
(引自[6])
从一个预训练的 GPT-3 模型开始(即测试了三种不同大小的 13 亿、60 亿和 175 亿参数),InstructGPT 的对齐过程受到先前工作[10,11]的启发,分为三个阶段。首先,我们为一组可能的输入提示构建一个期望模型行为的数据集,并将其用于监督微调;见上文。
(引自[6])
用于构建此数据集的提示集合,包括从普通文本提示到少量示例和基于指令的提示(有关使用案例的分布,请参见上文),是通过人工注释者手动收集的,也通过用户在OpenAI API上的活动收集,这些用户使用了 GPT-3 及早期版本的 InstructGPT。这些提示被提供给人工注释者,后者对这些提示展示了正确的模型行为。
(来自 [6])
然后,我们使用微调后的 LLM 为数据集中每个提示生成多个潜在输出。在这些潜在输出中,我们可以请人工标注者进行质量排名(即哪个输出是“最佳”的)。使用这个已排名模型输出的数据集,我们可以训练一个经过监督微调的小型 LLM(60 亿参数),使其在给定提示和潜在响应时输出一个标量奖励;见上文。
更具体地说,这个奖励模型是在模型响应对中进行训练的,其中一对“更好”于另一对。利用这些对,我们可以推导出一个损失函数,(i) 最大化优选响应的奖励,(ii) 最小化较差响应的奖励。然后我们可以使用结果模型的输出作为标量奖励,并通过 PPO 算法优化 LLM 以最大化这个奖励!见下文的插图。
(来自 [6])
为了进一步提高模型的能力,可以重复进行 InstructGPT 对齐过程中的第二步和第三步(即训练奖励模型和 PPO)。这个过程是一种 RLHF 类型,我们在帖子中已经简要讨论过。
现在我们了解了 InstructGPT 的对齐过程,我们可能会有一个主要问题:这个过程如何促进对齐? 这个问题的基本答案是,人类提供的对话和排名可以以鼓励与个人偏好对齐的方式进行创建。再次强调,对齐的定义是高度可变的,但我们可以使用这个 RLHF 过程优化各种 LLM 属性。
(来自 [6])
通过使用理解所需对齐原则的人力构建数据集,我们看到模型在遵循指令、遵守约束或避免“虚构”错误事实等能力上有所改进;见上文。模型隐性地对齐了创建用于微调和 RLHF 的数据的人类的价值观。
当评估 InstructGPT 时,人类标注者强烈偏爱这个模型,而不是那些更通用或仅使用提议方法的特定部分(例如,仅监督微调)的模型;见下文。
(来自 [6])
模型还在公共数据集上进行评估,以查看通过对齐启用更好的人本、基于指令的行为是否会导致标准语言理解性能的退化。最初,模型在对齐后在这些任务上的表现确实出现了退化,但作者展示了通过在对齐过程中混入标准语言模型预训练更新可以将这种退化最小化。
尽管 InstructGPT 仍然会犯一些简单错误,但[6]中的发现显示出很大潜力。相较于通用的 LLM,生成的 InstructGPT 模型在与人类合作和匹配意图方面表现得更好。适当地,InstructGPT 在遵循人类指令的能力上有了大幅提升。
对齐的好处。 我们应该记住,相比于从零开始预训练一个 LLM,对齐的成本要便宜得多。虽然通过调整预训练过程可能会产生一些好处,但更具成本效益的方法是使用预训练的 LLM 作为基础模型,可以根据具体使用案例或需求进行持续的再利用或对齐。
ChatGPT 的爆炸式增长。 最近,OpenAI 发布了另一个基于指令的聊天机器人,称为 ChatGPT,与 InstructGPT 非常相似。然而,与 InstructGPT 不同的是,ChatGPT 经历了一个旨在生成对话聊天机器人的对齐过程,该聊天机器人能够回答一系列问题,承认自己的错误,甚至拒绝它认为不合适的提示。
ChatGPT 提供有意义的解决方案和解释人类问题/指令的能力相当令人惊叹,这使得该模型迅速流行。实际上,ChatGPT API 在不到一周的时间里获得了 100 万用户。该模型能够进行调试代码或解释复杂的数学主题(尽管它可能产生错误信息,需小心!);见上文。
ChatGPT 的应用几乎无穷无尽,该模型也相当有趣。请参见下面的链接,了解自发布以来研究界与 ChatGPT 相关的一些有趣的工作。
通过有针对性的人类评判改进对话代理的对齐 [12]
(来自 [12])
正如 InstructGPT [6] 和 ChatGPT 所展示的,许多通用的、以提示为基础的 LLM 问题可以通过 RLHF 缓解。在[12]中,作者创建了一个专门的 LLM,称为 Sparrow,它可以参与与人类的信息寻求对话(即以回答和跟进问题为重点的对话),甚至可以通过互联网的信息支持其事实主张;见上文。
Sparrow 使用 70 亿参数的 Chinchilla 模型(称为对话提示 Chinchilla 或 DPC)初始化——这是一个在大量文本语料库上预训练的通用 LLM。由于很难精确定义成功对话的特性,作者使用 RLHF 将 LLM 调整到他们期望的行为。
(来自 [12])
鉴于 Sparrow 专注于信息获取对话,作者使模型能够在互联网上搜索事实声明的证据。更具体地说,这是通过引入额外的“参与者”来完成的,称为“搜索查询”和“搜索结果”。为了在线查找证据,Sparrow 学会输出“搜索查询:”字符串,后跟文本搜索查询。然后,通过从 Google 检索和过滤对该查询的响应来获得搜索结果。Sparrow 使用这些检索到的信息来构建其对用户的响应;见上文。
值得注意的是,Sparrow 并没有做什么特别的事情来生成搜索查询。“搜索查询:<query>
”只是 LLM 可以输出的另一个序列,这会触发一些特殊的搜索行为。显然,原始的 DPC 从未被教会利用这个附加功能。我们必须教会模型生成这样的搜索查询,以支持其在对齐过程中的声明。
(来自 [12])
Sparrow 使用 RLHF 进行对齐。为了引导人类反馈,作者定义了一组详细的规则,根据其对齐原则(有帮助、正确和无害)来描述期望的模型行为。这些规则使人类标注者能够更好地描述模型的失败并提供针对特定问题的反馈;有关示例,请参见上表。
人类反馈是通过以下方式收集的:
-
每轮响应偏好
-
对抗性探测
每轮响应偏好为人类提供了不完整的对话和多个可能完成对话的响应。类似于 InstructGPT [6] 采用的程序,人类随后被要求识别他们更喜欢的响应。对抗性探测是一种新型反馈收集形式,其中人类被要求:
-
专注于单一规则
-
尝试引发模型对这一规则的违反
-
确定规则是否被违反
为了确保 Sparrow 学会搜索相关信息,响应偏好总是通过四个选项收集。两个选项在响应中没有包含证据,而另两个选项必须 (i) 生成搜索查询,(ii) 基于搜索结果进行条件判断,然后 (iii) 生成最终响应。
(来自 [12])
针对每轮响应和规则违反数据分别训练奖励模型。然后,这些奖励模型联合使用,通过多目标 RLHF 对 Sparrow 进行微调。这可能听起来很复杂,但这里的想法与之前并没有太大不同——我们只是使用独立的奖励模型来捕捉人类偏好和规则违反,然后基于这两个奖励模型使用 RL 对模型进行微调。请参见上文的描述。
有趣的是,作者通过利用一种自我对弈的形式,观察到了性能的提升,这种形式在对齐过程中后期重新利用并继续生成的对话。我们可以通过迭代地重复 RLHF 过程进一步提升模型性能;见下文。
(摘自 [12])
我们还可以重新利用这两个奖励模型来对 Sparrow 生成的潜在回应进行排序。为此,我们只需生成多个回应,并选择从我们的偏好奖励模型中获得的*(i)* 最高偏好分数和*(ii)* 基于我们的规则奖励模型的最低违规可能性的回应。然而,以这种方式排序输出确实会使推断变得计算上更加昂贵。
(摘自 [12])
当评估结果模型时,我们发现用户相较于多个基准模型(包括 DPC 和在对话特定数据集上进行监督微调(SFT)的 LLMs),更倾向于这个模型的输出;见上文。此外,Sparrow 遵守规则的可能性也远低于下图所示。
(摘自 [12])
Sparrow 是一个高质量的信息获取对话代理,能够生成与外部信息相关且准确的参考。该模型在 78% 的情况下生成有支持证据的合理答案。这一结果提供了有力证据表明 RLHF 是一种有用的对齐工具,可以用于以多种方式改进 LLM 行为,甚至包括生成和使用互联网搜索查询等复杂行为。
Sparrow 对敌对对话也相当稳健。用户只能在 8%的情况下使模型违反指定的规则集;见下文。
(摘自 [12])
Galactica: A Large Language Model for Science [13]
任何研究人员都知道,每天在互联网上发布的科学知识量是令人望而生畏的。因此,我们可能开始问自己,我们如何更好地总结和解析这些信息?
“信息过载是科学进步的主要障碍” — 摘自 [13]
在 [13] 中,作者提出了一种 LLM,称为 Galactica,能够存储、组合和推理来自多个领域的科学知识。Galactica 是在大量科学内容(包括 4800 万篇论文、教科书、讲义和更多专业数据库(例如已知的化合物和蛋白质、科学网站、百科全书等))上进行预训练的,使用语言建模目标。
(摘自 [13])
与大多数 LLM 不同,Galactica 使用一个较小的高质量语料库进行预训练。数据经过策划,以确保模型学习的信息既多样又准确。见上表了解预训练语料库的详细信息。
(来自 [13])
值得注意的是,科学内容包含许多正常文本中不存在的概念和实体,如 Latex 代码、计算机代码、化学化合物,甚至蛋白质或 DNA 序列。对于这些潜在的模式,Galactica 采用了特殊的标记程序,以确保模型吸收的数据仍然是文本格式;见上文。
此外,特殊标记用于识别科学引文以及模型输入或输出中的部分需要逐步推理的内容。通过利用特殊标记并将每种数据模式转换为文本,底层的 LLM 可以利用科学文献中出现的不同概念和推理策略。
(来自 [13])
作者训练了多个 Galactica 模型,参数数量从 1.25 亿到 1200 亿不等。模型首先在提议的语料库上进行预训练。有趣的是,可以在该语料库上进行几个时期的预训练而不会发生过拟合,这表明如果数据质量高,可以避免在较小的预训练语料库上的过拟合;见上图。
(来自 [13])
在预训练之后,模型在提示数据集上进行微调。为了创建这个数据集,作者将现有的机器学习训练数据集转换为文本数据集,将提示与正确答案配对;见上表。
通过在基于提示的数据上训练 Galactica,我们观察到模型性能的一般性提升,尤其是对于较小的模型。这一过程类似于我们在本概述中遇到的几次监督微调方法。
(来自 [13])
当对 Galactica 进行评估时,我们发现它在 BIG-bench benchmark 中的非科学任务上表现相当好。当对模型在众多主题上的知识进行探测时,我们发现 Galactica 在回忆方程式和不同科学领域的专门知识方面往往优于许多基准模型;见上文。
与几个基准模型相比,Galactica 在推理任务上的能力更强,并且在各种下游应用(包括科学和非科学应用)中也表现出实用性。有趣的是,Galactica 能够准确生成引文,其覆盖相关工作的能力随着模型规模的增大而提高;见下文。
(来自 [13])
作为模型有效性的证明,作者甚至提到 Galactica 被用来撰写自己的论文!
“Galactica 被用来帮助撰写这篇论文,包括推荐缺失的引用、引言和相关工作的讨论主题、推荐进一步的研究工作,以及帮助撰写摘要和结论。” — 来源于[13]
戏剧。 Galactica 最初由 Meta 发布了一个公开演示。发布后不久,演示遭遇了来自研究社区的大量反对,并最终被下架。反对的基本理由是 Galactica 能够生成听起来合理但可能不正确的科学信息。因此,该模型可能被用于生成科学错误信息。抛开个人意见不谈,Galactica 模型及其后续反对意见引发了关于 LLM 对科学研究影响的极具趣味性的讨论。
PubMedGPT。 PubMedGPT是由MosaicML和斯坦福基础模型研究中心的研究人员联合创建的 LLM,采用了类似于 Galactica 的方法。该模型使用与 GPT 相同的架构(拥有 27 亿个参数),并通过对领域特定数据集(即,PubMed 摘要和来自 Pile 数据集的 PubMed Central)进行预训练,专注于生物医学领域。
这是一个相对较小的数据集,仅包含 50 亿个标记(即,Chinchilla [15]的训练使用了超过 1 万亿个标记作为参考)。在这个数据集上经过多轮训练后,PubMedGPT 在各种问答任务中表现出色。事实上,它甚至在美国医学执照考试中达到了最新的研究水平。
其他值得注意的 LLM
概述每一篇 LLM 论文是不可能的——这个话题很受欢迎,并且每天都在发展。为了使这篇综述更加全面,我在下面提供了我最近遇到的其他值得注意的 LLM 应用和研究方向的参考文献。
dramatron [16]。 Dramatron 是一个专注于与人类共同编写剧本和电影剧本的 LLM。它采用分层生成连贯故事的过程,并在与 15 位戏剧/电影专业人士的用户研究中被认为对创作过程有用。
LLMs 在理解蛋白质方面的应用 [17]。 在对大规模蛋白质序列进行 LLM 训练后(使用ESM2 蛋白质语言模型),我们可以从这个 LLM 中采样多样的蛋白质结构,以生成新颖的蛋白质序列。这项工作表明,LLM 生成的蛋白质结构是可行的,并且超出了自然界中序列的范围。
OPT-IML [18]。 这是对OPT-175B 模型的扩展,OPT-175B 是 Meta 创建的 GPT-3 开源版本。然而,OPT-IML 经过了指令微调(即,采用类似于 InstructGPT [6]的方法),在 2,000 多个源自 NLP 基准的任务上进行微调。或多或少,这项工作是一个开源版本的 LLMs,具有像 InstructGPT 一样的指令微调,但用于微调的任务集合不同。
DePlot [19]。 DePlot 的作者通过推导一种将视觉图表和图形转换为文本数据的方法来进行视觉推理,然后使用这些视觉数据的文本版本作为 LLM 的提示,该 LLM 能够进行推理。与先前的基准相比,这个模型在视觉推理任务中取得了显著的改进。
用于机器人学的 RLHF [20]。 RLHF 最近被用来提升视频游戏中 AI 驱动的代理的质量。特别地,视频游戏代理通过询问人类对代理在游戏中表现的反馈来使用 RLHF 进行训练。人类可以创造任务并自己判断模型的进展,然后 RLHF 被用来结合这些反馈,从而产生一个更好的视频游戏代理。尽管这与 LLM 无直接关联,我认为这是 RLHF 的一个相当有趣的应用。
关键要点
尽管通用 LLMs 是令人惊叹的任务无关基础模型,但仅凭语言模型预训练我们只能走到这么远。在这次概述中,我们探索了超越语言模型预训练的技术(例如,特定领域的预训练、监督微调和模型对齐),这些技术可以用来大幅提升 LLMs 的实用性。我们可以从这些技术中学到的基本概念如下。
纠正简单错误。 LLMs 倾向于表现出各种不良行为,例如发表种族主义或不正确的评论。模型对齐(例如,通过 RLHF 或监督微调)可以用来纠正这些行为,允许模型从人类演示的正确或期望行为中学习。结果的 LLM 被认为与提供反馈的人类的价值观一致。
特定领域的 LLMs 非常棒。 像 Galactica 和 PubMedGPT 这样的模型清楚地表明,特定领域的 LLMs 非常有用。通过在一个较小的、经过策划的专门领域的语料库(例如,科学文献)上训练 LLM,我们可以轻松获得一个在该领域表现出色的模型。此外,我们可以用相对较少的领域特定数据取得良好的结果。展望未来,我们可以很容易地想象出可以提出的不同领域特定的 LLMs,例如解析餐馆评论或生成法律文档框架。
用最少的计算资源实现更好的 LLM。 我们可以通过增加模型规模或获得更好的预训练语料库来尝试创建更好的 LLM 基础模型。但是,LLM 的预训练过程计算成本极高。在这次概述中,我们已经看到,通过对齐或微调方法可以显著改进 LLM,这些方法相比从头开始预训练 LLM 在计算上更为廉价。
多阶段预训练。 在对通用语言语料库进行预训练后,我们在本概述中看到的大多数模型会在更小的领域特定或精心策划的数据集上进行进一步的预训练(例如,在 Galactica [13]上对提示数据进行预训练,或在 LaMDA [8]上对对话数据进行预训练)。通常,我们发现采用多阶段预训练过程相当有用,无论是在收敛速度还是模型性能方面。然后,在这些预训练模型上应用对齐或监督微调技术会带来进一步的好处。
结束语
非常感谢阅读这篇文章。我是Cameron R. Wolfe,一名在Alegion工作的研究科学家,同时也是莱斯大学的博士生,专注于深度学习的经验和理论基础。你还可以查看我在 medium 上的其他著作!如果你喜欢这篇文章,请在twitter上关注我,或订阅我的深度(学习)关注通讯,我会选择一个深度学习研究的主题,每两周提供相关背景信息,然后概述该主题的几篇热门论文。我的通讯页面上还有几个相关的概述。
本通讯由 Alegion 支持。在 Alegion,我处理从在线学习到扩散等一系列问题……
本通讯由 Alegion 支持。在 Alegion,我处理从在线学习到扩散等一系列问题……
现代 LLMs:MT-NLG、Chinchilla、Gopher 及更多
本通讯由 Alegion 支持。在 Alegion,我处理从在线学习到扩散等一系列问题……
参考文献
[1] Vaswani, Ashish, 等. “注意力机制是你所需要的一切。” 神经信息处理系统的进展 30 (2017)。
[2] Brown, Tom, 等. “语言模型是少量样本学习者。” 神经信息处理系统的进展 33 (2020): 1877–1901。
[3] Radford, Alec, 等. “通过生成预训练提高语言理解。” (2018)。
[4] Radford, Alec, 等. “语言模型是无监督的多任务学习者。”
[5] Kaplan, Jared, 等. “神经语言模型的扩展规律。” arXiv 预印本 arXiv:2001.08361 (2020)。
[6] Ouyang, Long, 等. “通过人类反馈训练语言模型以跟随指令。” arXiv 预印本 arXiv:2203.02155 (2022)。
[7] Chen, Mark, 等. “评估训练在代码上的大型语言模型。” arXiv 预印本 arXiv:2107.03374 (2021)。
[8] Thoppilan, Romal, 等. “Lamda: 对话应用的语言模型。” arXiv 预印本 arXiv:2201.08239 (2022)。
[9] Adiwardana, Daniel, 等. “迈向类人开放域聊天机器人。” arXiv 预印本 arXiv:2001.09977 (2020)。
[10] Ziegler, Daniel M., 等. “从人类偏好中微调语言模型。” arXiv 预印本 arXiv:1909.08593 (2019)。
[11] Stiennon, Nisan, 等. “通过人类反馈学习总结。” 神经信息处理系统的进展 33 (2020): 3008–3021。
[12] Glaese, Amelia, 等. “通过有针对性的人类判断提高对话代理的对齐。” arXiv 预印本 arXiv:2209.14375 (2022)。
[13] Taylor, Ross, 等. “Galactica: 一个大型科学语言模型。” arXiv 预印本 arXiv:2211.09085 (2022)。
[14] Gao, Leo, 等. “The pile: 一个 800GB 的多样化文本数据集用于语言建模。” arXiv 预印本 arXiv:2101.00027 (2020)。
[15] Hoffmann, Jordan, 等. “训练计算最优的大型语言模型。” arXiv 预印本 arXiv:2203.15556 (2022)。
[16] Mirowski, Piotr, 等. “与语言模型共同创作剧本和戏剧脚本:由行业专业人士评估。” arXiv 预印本 arXiv:2209.14958 (2022)。
[17] Verkuil, Robert, 等. “语言模型超越自然蛋白质的泛化能力。” bioRxiv (2022)。
[18] Iyer, Srinivasan, 等. “OPT-IML: 从泛化的视角扩展语言模型指令元学习。” arXiv 预印本 arXiv:2212.12017 (2022)。
[19] Liu, Fangyu, 等. “DePlot: 通过情节到表格翻译进行一次性视觉语言推理。” arXiv 预印本 arXiv:2212.10505 (2022)。
[20] Abramson, Josh, 等. “通过从人类反馈中强化学习改进多模态交互代理。” arXiv 预印本 arXiv:2211.11602 (2022)。