Scallop:一种用于神经符号编程的语言
Scallop Tutorial Download Documentation Resources
Blog
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