Skip to main content

知识增强神经网络

项目描述

KENN:知识增强神经网络

KENN2(知识增强神经网络 2.0)是一个构建在 TensorFlow 2 之上的 Python 3 库,它允许您通过以一组普遍量化的 FOL 子句的形式提供逻辑知识来修改神经网络模型。它通过在现有的神经网络中添加一个名为Knowledge Enhancer (KE)的新最后一层来实现这一点。KE 改变了标准神经网络的原始预测,以增强知识的满意度。此外,它还包含子句权重、可学习的参数,代表每个子句的强度。

注意: KENN 1.0 版针对 Python 2.7 和 TensorFlow 1.x 发布,可在KENN v1.0中获得。请注意,此版本不向后兼容。此外,KENN 的这种实现可以与关系域一起使用,这意味着人们也可以使用二进制谓词来表达涉及两个对象之间关系的逻辑规则。

这是我们论文中提出的模型的实现: 知识增强神经网络

如果您将此软件用于学术研究,请使用以下 BibTeX 引用我们的工作:

@InProceedings{10.1007/978-3-030-29908-8_43,
author="Daniele, Alessandro
and Serafini, Luciano",
editor="Nayak, Abhaya C.
and Sharma, Alok",
title="Knowledge Enhanced Neural Networks",
booktitle="PRICAI 2019: Trends in Artificial Intelligence",
year="2019",
publisher="Springer International Publishing",
address="Cham",
pages="542--554",
isbn="978-3-030-29908-8"
}

安装

可以使用 pip 安装 KENN:

pip install KENN2

入门:使用 Keras 和 KENN 的简单模型

KENN 2.0 允许您轻松地将 KENN 层添加到 Keras 模型中。要将知识添加到 keras 模型中,添加一个新层就足够了:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

# Import parser for the knowledge file
from KENN2.parsers import unary_parser

model = keras.Sequential([
    Dense(100, activation="relu", name="layer1"), Dense(50, activation="relu", name="layer2"), # Last NN layer
    Dense(5, activation="linear", name="layer3"), # Added the Knowledge Enhancer
    unary_parser(knowledge file path,
            activation=tf.nn.sigmoid)
    ])
# Compile the model
model.compile(optimizer=adam, loss=mean squared error)

示例说明

在前面的示例中,我们仅对标准 TensorFlow 代码应用了两个更改。下面,详细介绍。

1. 为知识库导入解析器。

第一个更改是微不足道的:我们需要导入知识的解析器:

from KENN2.parsers import unary_parser

2.添加KENN层

unary_parser(knowledge file path,activation=tf.nn.sigmoid)

unary_parser函数将包含逻辑约束和要使用的激活函数的文件的路径作为输入。它返回一个可以堆叠在 Keras 模型之上的 Keras 层。该层根据知识库文件的内容更新预测。

以下是知识库文件的示例:

Dog,Cat,Animal,Car,Truck,Chair

1.5:nDog,Animal
_:nCat,Animal
2.0:nDog,nCat
_:nCar,Animal
_:nAnimal,Dog,Cat

第一行包含一个谓词列表,用逗号分隔,没有空格。每个谓词必须以大写字母开头。第二行必须为空。其他行包含子句。每个子句都在单独的行中,并且必须根据以下属性编写:

  • 逻辑析取用逗号表示;
  • 如果一个文字被否定,它必须以小写'n'开头;
  • 它们必须只包含第一行中指定的谓词;
  • 不应该有空格。

此外,每个子句前面必须有一个表示该子句强度的正权重。更准确地说,权重可以是数值下划线:在第一种情况下,权重是固定的并由指定的值确定,在第二种情况下,权重是在训练期间学习的。例如,第三行代表从句 ,它告诉我们狗也应该是动物。在这种情况下,子句权重固定为值 1.5。一个更有趣的子句是最后一个子句,它告诉我们在我们的领域中只有猫和狗是动物。此外,学习相应的权重,如果在训练集中不满足约束,KENN 学会忽略它。

使用关系数据

KENN 2.0 提供了处理关系数据的额外功能,这意味着它还支持包含二元谓词的子句。关系数据的典型案例可以是科学出版物的引文网络或社交网络:在这些示例中,二元谓词将分别是Cite(x,y)Friend(x,y),它们表示图的边缘。下面,对关系数据的 KENN 进行非常简单的介绍。如需更深入的解释,请查看我们关于 CiteSeer 数据集的教程。

与前一种情况类似,第一步是导入解析器。这次解析器需要读取一个包含二进制谓词的知识文件:

from KENN2.parsers import relational_parser

和以前一样,它relational_parser是一个函数,它返回一个将逻辑注入模型的层。

注意:目前,KENN 与 Keras Sequential 模型不兼容。使用标准 Tensorflow 代码仍然可以毫无问题地使用它。

知识文件的内容与上一个案例类似,但有一些显着变化:在上一个案例中,第一行是谓词列表。现在,有两行:第一行包含一元谓词列表,第二行包含二元谓词。这些子句也分为两组:第一组仅包含一元谓词,第二组包含一元和二元谓词。>这两个组由包含该符号的行分隔。

一元谓词定义在单个变量上(例如Dog(x)),二元谓词定义在由点分隔的两个变量上(例如Friends(xy))。以关系知识文件为例:

Smoker,Cancer
Friends

_:nSmoker(x),Cancer(x)
>
_:nFriends(x.y),nSmoker(x),Smoker(y)

第一行指定有两个一元谓词:Smoker 和 Cancer。第二行指定二元谓词,在本例中为一个:Friends。第一个子句编码吸烟者也患有癌症的事实(请注意,规则并不代表硬约束),第二个子句也包含二元谓词,表达了朋友倾向于具有相似吸烟习惯的想法。

执照

版权所有 (c) 2019,Daniele Alessandro、Mazzieri Riccardo、Serafini Luciano 保留所有权利。

根据 BSD 3-Clause 许可证获得许可。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

KENN2-0.5.tar.gz (12.6 kB 查看哈希

已上传 source

内置分布

KENN2-0.5-py3-none-any.whl (13.3 kB 查看哈希

已上传 py3