Scallop Tutorial Download Documentation Resources Blog

Events

SSNP'24NEW Github 使用 Scallop 进行神经符号编程 Install Tutorial

语言

Scallop 是一种声明式语言,旨在支持 AI 应用中丰富的符号推理。它基于 Datalog,一种用于关系数据库的基于逻辑规则的查询语言。

Solver

Scallop 是一个可扩展的 Datalog solver,配备了对离散、概率和可微推理模式的支持。这些模式可配置以满足不同 AI 应用的需求。

框架

Scallop 提供了绑定,以支持 Python 程序中的逻辑推理模块。 因此,Scallop 可以与现有的 PyTorch 机器学习管道深度集成。

广泛的应用

Scallop 可用于开发各种涉及符号推理的视觉和 NLP 应用。推理组件通过逻辑规则指定,然后可以与机器学习模型(例如卷积神经网络和 transformers)深度集成。

CLEVR, 组合语言与基础视觉推理

此任务涉及推理给定图像中简单的 3D 对象,以便回答诸如“有多少个对象是蓝色的?”之类的问题。 为了在 Scallop 中表达此任务,我们使用神经组件来生成图像的符号表示,形式为场景图,以及表示问题的程序化查询。 另一方面,推理组件指定各种操作,例如选择、比较和计数具有指定属性的对象。 Scallop 能够在一个通用框架中集成所有这些组件,并以端到端的方式执行训练。

type Color = RED | GREEN | BLUE
type Size = LARGE | SMALL
type Expr = Scene() | Color(Color, Expr) | Size(Size, Expr) | Count(Expr)
// Programmatic query evaluator
rel eval(e, output_obj) = case e is Scene(), input_obj_ids(output_obj)
rel eval(e, output_obj) = case e is Color(c, e1), eval(e1, output_obj), input_obj_color(output_obj, c)
rel eval(e, output_obj) = case e is Size(s, e1), eval(e1, output_obj), input_obj_size(output_obj, s)
rel eval_num(e, n) = n := count(o: eval(e1, o) where e1: case e is Count(e1))
rel result(n) = root(e) and eval_num(e, n)
// Scene Graph
rel input_obj_ids = {0, 1}
rel input_obj_color = {(0, RED), (1, GREEN)}
rel input_obj_size = {(0, LARGE), (1, SMALL)}
// Count how many large red objects
const MY_QUERY = Count(Color(RED, Size(LARGE, Scene())))
rel root(MY_QUERY)

Pathfinder, 远距离连通性推理

在此任务中,我们获得了包含两个点和虚线的黑白图像。 目标是确定两个点是否通过虚线连接。 可以使用 Scallop 中的几行代码对该任务进行编程,方法是使用非常简单的神经体系结构来检测点和虚线,以及下面的逻辑规则,并且性能优于最新的 transformers。

rel path(x, y) = dash(x, y)
rel path(x, y) = path(x, z), dash(z, y)
rel is_connected() = dot(x), dot(y), path(x, y), x != y

评估手写公式

在此任务中,我们获得了一系列手写符号,包括 0 到 9 和简单的算术运算。 目标是识别公式并评估表达式。 在相邻的示例中,输入表示公式 1 + 3 / 5,其评估结果为 1.6。 可以在 Scallop 中制作一个完整的上下文无关语法解析器,该解析器可以解析概率输入。 上述公式的解析器和评估器可以用下面显示的仅 5 行 Scallop 代码编写。 可以使用用于识别单个符号的神经模型以端到端的方式训练此程序。 训练完成后,生成的程序将自动找到最可能的公式并返回评估结果。

type symbol(index: usize, symbol: String)
type length(n: usize)
rel digit = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
rel factor(x as f32, b, b + 1) = symbol(b, x) and digit(x)
rel mult_div(x, b, r) = factor(x, b, r)
rel mult_div(x * y, b, e) = mult_div(x, b, m) and symbol(m, "*") and factor(y, m + 1, e)
rel mult_div(x / y, b, e) = mult_div(x, b, m) and symbol(m, "/") and factor(y, m + 1, e)
rel add_minus(x, b, r) = mult_div(x, b, r)
rel add_minus(x + y, b, e) = add_minus(x, b, m) and symbol(m, "+") and mult_div(y, m + 1, e)
rel add_minus(x - y, b, e) = add_minus(x, b, m) and symbol(m, "-") and mult_div(y, m + 1, e)
rel result(y) = add_minus(y, 0, l) and length(l)

© 2024 Scallop Development Team, University of Pennsylvani