重磅 | Facebook 开源人工智能环境CommAI-env,目标是实现人机之间的语言交流(附论文)

Facebook 今天开源重磅项目 CommAI-env,这是一个开发基于通信的人工智能系统的平台,本文整合了该项目的 README.md 文件和相关论文的摘要。

 


 

  • 开源地址:https://github.com/facebookresearch/CommAI-env

 

CommAI-env(基于通信的人工智能环境(Environment for Communication-based AI))是一个用于训练和评估人工智能的平台,该平台已经在论文《A Roadmap towards Machine Intelligence》中进行过了描述。

 


 

介绍 

 

CommAI-env 是一个用于训练和测试人工智能系统(Learner(学习器,可以系统开发者所选择的任意语言编程))的平台,其使用了一个基于通信(communication)的设置,其中它可以通过一个 bit 层面的接口与 Environment(环境)进行交互。该 Environment 会要求 Learner 去解决一些基于通信的 Task(任务),并为其已经成功完成的每一个任务实例分配一个 Reward(奖励)。

 

该 Learner 会以随机的顺序处理所有任务中的多个实例,而且其必须尽可能多地解决它们以获得最大的奖励。目前可以实现的任务包括计数问题、Learner 必须学习记忆项的列表并回答有关问题的任务、或通过基于文本的引导方案按引导指令执行任务(任务的详情描述请参阅该文档:https://github.com/facebookresearch/CommAI-env/blob/master/TASKS.md)。其任务范围现已开放:我们正在扩展任务范围,我们也邀请其他人能够参与进来。

 

CommAI-env 的最终目标是提供一个可用于从头开始训练 Learner 的环境,从而使其能够实现通过语言的与人类的真正交互。尽管这样的任务可能看起来微不足道(但你可以试试在我们所支持的混杂的模式中解决它们——你的英语知识根本没用!),但我们认为其中大部分任务都超出了现有的基于学习的算法的能力;而要让一个 Learner 能够解决所有这些任务,就必须要在与人类交互所需的通信智能(communicative intelligence)上取得重大的进展,并且还要能从人类老师那里获得进一步的学习。注:我们并不是说 CommAI-env 中的任务覆盖了一个智能通信代理所应该处理的所有技能。我们是说:为了解决 CommAI-env,智能代理必须要有非常宽泛的学习能力,这样它应该才可以通过与人类交互和其它方式获得它快速所需的所有进一步的任务。

 

以下是 CommAI-env 有别于其它目前用于训练和测试人工智能系统的环境和数据集(比如,OpenAI Gym、Allen AI Science Challenge、MazeBase 或 bAbI)的一些基本特征,这些特征被设计出来的目的是为了鼓励开发者开发快速的、通用的、基于通信的 Learner。

 

  • CommAI-env 的关注重点完全是基于通信的任务,其中所有的通信都是通过 Learner 和 Environment 之间的一个共同的 bit 层面的接口实现的。

  • 在单个 CommAI-env 会话(session)中,Learner 会被暴露在许多种任务中,所以它必须学会识别不同的任务,并将不同的技能合适地应用到这些任务上。

  • 许多任务都是渐进的,在这个意义上,解决其中一个或多个任务应该能让其它任务的解决更简单,只要 Learner 有对数据和算法的长期记忆(例如,一旦一个 Learner 解决了基本的计数任务以及如何将物体和属性关联起来,那么计数一个物体的属性就会更容易)。

  • 训练和测试阶段并没有明显的区分:

 

  • 一方面,Learner 应该不只是记忆一个固定任务集合的解决方案,而且还要学习如何将其泛化到其所遇到的新任务上。

  • 另一方面,就和人类一样,Learner 应该只需要少数几次遭遇后就能解决基本的问题:因此,学习的速度应该被考虑在评估之中。

  • 我们计划当该平台足够成熟时开展一个基于 CommAI-env 的比赛。为此,CommAI-env 的评估配置的任务集合将不同于开发版本中所包含的任务。这些任务不同的方面可能包括:它们可能基于不同的(自然和人工)语言、它们可以需要学习 Learner 周围的新物体和新位置、它们可能需要重新组合在开发过程中所学到的技能、等等。

 

运行该环境有以下两步:

 

# Creating a configuration file (for instance, by copying the full training set)
cp task_config.sample.json tasks_config.json
# Running the environment, in the simplest case, just providing the configuration file as an argument
python run.py tasks_config.json

 

默认情况下,该环境会在人类模式下运行(见下方)。如果你想用一个给定的算法来运行该环境,请见下方相应的部分。

 

配置

 

首先,你应该创建一个配置文件标明要投给 Learner 的任务和命令。你可以从复制对应全部训练集的文件开始,如下:

 

cp tasks_config.sample.json tasks_config.json

 

人类模式

 

为了在控制台接口上运行这个系统,在这个系统中你可以冒充该 Learner ,运行如下:

 

python run.py tasks_config.json

 

这会为你提供一个基于控制台的用户界面,与一下运作的环境互动。每次当该环境看上去静了下来并期待 Learner 回答时,控制就转换到能输入字符串返回环境的用户手中。

 

这两者之间的沟通,当下的时间和积累的奖励都会显示在屏幕上。

 

为了更好地理解该学习算法面对的问题的种类,你可以使用该 scrambled flag 运行该环境,它会用随机的伪词(pseudo-word)替换所观察到的词汇中的每一个词。

 

警示:注意人类模式关于输入有两个来自教授者的假设。第一个假设是关于字符编码。虽然输入事实上达到了位(bit)级别,但是对于人类用户来说,阅读一长串 bit,还是会不舒服,所以我们在将它们投放到屏幕上之前将它转换成了字符串。第二个假设是话轮转换机制(turn-taking convention),在这个假设下,当环境已经产生了两个连续的空间后,我们将控制交给人类。学习算法不能安全地假设这些机制(convention),因为它们可以在后续的任务迭代中被修改。

 

指定学习算法

 

用一个给定的学习算法来运行该环境,你可以使用学习器 class 的完全限定名称 -l 或 –learner flag。例如,你可以使用任何一个样本学习器:

  • learners.sample_learners.SampleRepeatingLearner
  • learners.sample_learners.SampleMemorizingLearner

限定一个学习算法需要定义两个功能:next 和 reward.next 从该环境中接收一个 bit,并且应该回到 Learner 说出的下一个 bit。reward 告知 Learner 一个给定的接收奖励。在 Python 中,你可以从下面的代码片断开始创建一个 Learner

 

from learners.base import BaseLearner
class MySmartLearner(BaseLearner):
def reward(self, reward):
# record receiving a rewarddef next(self, input_bit):
# figure out what should be# the next bit to be spikenreturn next_bit

 

用编程语言 X 定义一个 Learner

 

也可以用其他任何一种编程语言俩定义学习算法。为此,我们要包含一个learner.base.Remotelearner,它在一个任意的 Learner 二进制与该环境之间建立一个 zeromq socket 接口。该环境作为一个服务器。为了方便,该用户能指定命令来发布这个学习者,所以它是在同一个过程中与环境一起发布的。

 

当该 Session 创建后,该环境和学习器就被初始化了:

 

  • 该学习器通过向环境发送一个招呼「hello」来开始。

  • 循环:接受奖励,接受环境 bit,发送回复 bit

 

例子:

 

#include <string.h>
#include “zmq.h”int main()
{
// This is an example of a silly learner that always replies with ‘.’char reply[1];
int n = 0;
const char* response = “00101110”;  // ‘.’ utf-8 code// connectvoid *context = zmq_ctx_new();
void *to_env = zmq_socket(context, ZMQ_PAIR);
int rc = zmq_connect(to_env, “tcp://localhost:5556”);

// handshakezmq_send(to_env, “hello”, 5, 0);

// talkwhile (true)
{
// receive rewardzmq_recv(to_env, reply, 1, 0);

// receive teacher/env bitzmq_recv(to_env, reply, 1, 0);

// reply
reply[0] = response[n % strlen(response)];
zmq_send(to_env, reply, 1, 0);
n += 1;
}

zmq_close(to_env);
zmq_ctx_destroy(context);

return 0;
}

 

用 Learner Binary Run Session:

 

python run.py tasks_config.json -l learners.base.RemoteLearner
–learner-cmd “/my/learner/binary”

 

控制台视角

 

鉴于人类模式,默认视角展示了一个控制台界面,你能观察正在进行的两部分之间的通信,当运行一个自动学习算法时,该视角默认为一个更简单的存在,从而让算法更快的运行。然而,仍然有可能通过参数 -v ConsoleView,或等效的 –view ConsoleView 来返回到控制台视角。例如:

 

python run.py -l learners.sample_learners.SampleRepeatingLearner -v ConsoleView tasks_config.json

 

要求:

 

  • Python 2.6+

  • zeromq (for remote learners)

 

  • 论文标题:通向机器智能的路线图

 

摘要:智能机器的发展是计算机科学领域中面临的最大挑战之一。在这篇论文中,我们提出了这些机器应该有的一些基本性质,尤其是沟通和学习上。我们探讨了一个用于逐步教一台机器学习基于自然语言的交流的环境,将它作为与人类用户实现更加复杂的互动前提。我们也提出一些猜想,是关于该机器应该支持的算法,以便于能便捷地从该环境中学习。

 

 

未经允许不得转载:人工智能 » 重磅 | Facebook 开源人工智能环境CommAI-env,目标是实现人机之间的语言交流(附论文)

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址