You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

README.md 9.9 kB

1 year ago
1 year ago
1 year ago
1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. <div align="center">
  2. <p align="center">
  3. <img src="https://raw.githubusercontent.com/AbductiveLearning/ABLkit/main/docs/_static/img/logo.png" alt="ABLkit logo" style="width: 25%;"/>
  4. </p>
  5. [![PyPI - Python Version](https://img.shields.io/pypi/pyversions/ablkit)](https://pypi.org/project/ablkit/) [![PyPI version](https://badgen.net/pypi/v/ablkit)](https://pypi.org/project/ablkit/) [![Documentation Status](https://readthedocs.org/projects/ablkit/badge/?version=latest)](https://ablkit.readthedocs.io/en/latest/?badge=latest) [![license](https://img.shields.io/github/license/mashape/apistatus.svg?maxAge=2592000)](https://github.com/AbductiveLearning/ABLkit/blob/main/LICENSE) [![flake8 Lint](https://github.com/AbductiveLearning/ABLkit/actions/workflows/lint.yaml/badge.svg)](https://github.com/AbductiveLearning/ABLkit/actions/workflows/lint.yaml) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![ABLkit-CI](https://github.com/AbductiveLearning/ABLkit/actions/workflows/build-and-test.yaml/badge.svg)](https://github.com/AbductiveLearning/ABLkit/actions/workflows/build-and-test.yaml)
  6. [📘Documentation](https://ablkit.readthedocs.io/en/latest/index.html) | [📚Examples](https://github.com/AbductiveLearning/ABLkit/tree/main/examples) | [💬Reporting Issues](https://github.com/AbductiveLearning/ABLkit/issues/new)
  7. </div>
  8. ## ABLkit: A Python Toolkit for Abductive Learning
  9. **ABLkit** is an efficient Python toolkit for [**Abductive Learning (ABL)**](https://www.lamda.nju.edu.cn/publication/chap_ABL.pdf). ABL is a novel paradigm that integrates machine learning and logical reasoning in a unified framework. It is suitable for tasks where both data and (logical) domain knowledge are available.
  10. <p align="center">
  11. <img src="https://raw.githubusercontent.com/AbductiveLearning/ABLkit/main/docs/_static/img/ABL.png" alt="Abductive Learning" style="width: 80%;"/>
  12. </p>
  13. Key Features of ABLkit:
  14. - **Great Flexibility**: Adaptable to various machine learning modules and logical reasoning components.
  15. - **User-Friendly**: Provide data, model, and KB, and get started with just a few lines of code.
  16. - **High-Performance**: Optimization for high accuracy and fast training speed.
  17. ABLkit encapsulates advanced ABL techniques, providing users with an efficient and convenient toolkit to develop dual-driven ABL systems, which leverage the power of both data and knowledge.
  18. <p align="center">
  19. <img src="https://raw.githubusercontent.com/AbductiveLearning/ABLkit/main/docs/_static/img/ABLkit.png" alt="ABLkit" style="width: 80%;"/>
  20. </p>
  21. ### Installation
  22. #### Install from PyPI
  23. The easiest way to install ABLkit is using ``pip``:
  24. ```bash
  25. pip install ablkit
  26. ```
  27. #### Install from Source
  28. Alternatively, to install from source code, sequentially run following commands in your terminal/command line.
  29. ```bash
  30. git clone https://github.com/AbductiveLearning/ABLkit.git
  31. cd ABLkit
  32. pip install -v -e .
  33. ```
  34. #### (Optional) Install SWI-Prolog
  35. If the use of a [Prolog-based knowledge base](https://ablkit.readthedocs.io/en/latest/Intro/Reasoning.html#prolog) is necessary, please also install [SWI-Prolog](https://www.swi-prolog.org/):
  36. For Linux users:
  37. ```bash
  38. sudo apt-get install swi-prolog
  39. ```
  40. For Windows and Mac users, please refer to the [SWI-Prolog Install Guide](https://github.com/yuce/pyswip/blob/master/INSTALL.md).
  41. ### Quick Start
  42. We use the MNIST Addition task as a quick start example. In this task, pairs of MNIST handwritten images and their sums are given, alongwith a domain knowledge base which contains information on how to perform addition operations. Our objective is to input a pair of handwritten images and accurately determine their sum.
  43. <details>
  44. <summary>Working with Data</summary>
  45. <br>
  46. ABLkit requires data in the format of `(X, gt_pseudo_label, Y)` where `X` is a list of input examples containing instances, `gt_pseudo_label` is the ground-truth label of each example in `X` and `Y` is the ground-truth reasoning result of each example in `X`. Note that `gt_pseudo_label` is only used to evaluate the machine learning model's performance but not to train it.
  47. In the MNIST Addition task, the data loading looks like:
  48. ```python
  49. # The 'datasets' module below is located in 'examples/mnist_add/'
  50. from datasets import get_dataset
  51. # train_data and test_data are tuples in the format of (X, gt_pseudo_label, Y)
  52. train_data = get_dataset(train=True)
  53. test_data = get_dataset(train=False)
  54. ```
  55. </details>
  56. <details>
  57. <summary>Building the Learning Part</summary>
  58. <br>
  59. Learning part is constructed by first defining a base model for machine learning. ABLkit offers considerable flexibility, supporting any base model that conforms to the scikit-learn style (which requires the implementation of `fit` and `predict` methods), or a PyTorch-based neural network (which has defined the architecture and implemented `forward` method). In this example, we build a simple LeNet5 network as the base model.
  60. ```python
  61. # The 'models' module below is located in 'examples/mnist_add/'
  62. from models.nn import LeNet5
  63. cls = LeNet5(num_classes=10)
  64. ```
  65. To facilitate uniform processing, ABLkit provides the `BasicNN` class to convert a PyTorch-based neural network into a format compatible with scikit-learn models. To construct a `BasicNN` instance, aside from the network itself, we also need to define a loss function, an optimizer, and the computing device.
  66. ```python
  67. ​import torch
  68. ​from ablkit.learning import BasicNN
  69. ​loss_fn = torch.nn.CrossEntropyLoss()
  70. ​optimizer = torch.optim.RMSprop(cls.parameters(), lr=0.001, alpha=0.9)
  71. ​device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
  72. ​base_model = BasicNN(model=cls, loss_fn=loss_fn, optimizer=optimizer, device=device)
  73. ```
  74. The base model built above is trained to make predictions on instance-level data (e.g., a single image), while ABL deals with example-level data. To bridge this gap, we wrap the `base_model` into an instance of `ABLModel`. This class serves as a unified wrapper for base models, facilitating the learning part to train, test, and predict on example-level data, (e.g., images that comprise an equation).
  75. ```python
  76. from ablkit.learning import ABLModel
  77. ​model = ABLModel(base_model)
  78. ```
  79. </details>
  80. <details>
  81. <summary>Building the Reasoning Part</summary>
  82. <br>
  83. To build the reasoning part, we first define a knowledge base by creating a subclass of `KBBase`. In the subclass, we initialize the `pseudo_label_list` parameter and override the `logic_forward` method, which specifies how to perform (deductive) reasoning that processes pseudo-labels of an example to the corresponding reasoning result. Specifically, for the MNIST Addition task, this `logic_forward` method is tailored to execute the sum operation.
  84. ```python
  85. from ablkit.reasoning import KBBase
  86. class AddKB(KBBase):
  87. def __init__(self, pseudo_label_list=list(range(10))):
  88. super().__init__(pseudo_label_list)
  89. ​ def logic_forward(self, nums):
  90. return sum(nums)
  91. kb = AddKB()
  92. ```
  93. Next, we create a reasoner by instantiating the class `Reasoner`, passing the knowledge base as a parameter. Due to the indeterminism of abductive reasoning, there could be multiple candidate pseudo-labels compatible to the knowledge base. In such scenarios, the reasoner can minimize inconsistency and return the pseudo-label with the highest consistency.
  94. ```python
  95. from ablkit.reasoning import Reasoner
  96. reasoner = Reasoner(kb)
  97. ```
  98. </details>
  99. <details>
  100. <summary>Building Evaluation Metrics</summary>
  101. <br>
  102. ABLkit provides two basic metrics, namely `SymbolAccuracy` and `ReasoningMetric`, which are used to evaluate the accuracy of the machine learning model's predictions and the accuracy of the `logic_forward` results, respectively.
  103. ```python
  104. from ablkit.data.evaluation import ReasoningMetric, SymbolAccuracy
  105. metric_list = [SymbolAccuracy(), ReasoningMetric(kb=kb)]
  106. ```
  107. </details>
  108. <details>
  109. <summary>Bridging Learning and Reasoning</summary>
  110. <br>
  111. Now, we use `SimpleBridge` to combine learning and reasoning in a
  112. unified ABL framework.
  113. ```python
  114. from ablkit.bridge import SimpleBridge
  115. bridge = SimpleBridge(model, reasoner, metric_list)
  116. ```
  117. Finally, we proceed with training and testing.
  118. ```python
  119. ​bridge.train(train_data, loops=1, segment_size=0.01)
  120. bridge.test(test_data)
  121. ```
  122. </details>
  123. To explore detailed tutorials and information, please refer to - [document](https://ablkit.readthedocs.io/en/latest/index.html).
  124. ### Examples
  125. We provide several examples in `examples/`. Each example is stored in a separate folder containing a README file.
  126. + [MNIST Addition](https://github.com/AbductiveLearning/ABLkit/tree/main/examples/mnist_add)
  127. + [Handwritten Formula (HWF)](https://github.com/AbductiveLearning/ABLkit/tree/main/examples/hwf)
  128. + [Handwritten Equation Decipherment](https://github.com/AbductiveLearning/ABLkit/tree/main/examples/hed)
  129. + [Zoo](https://github.com/AbductiveLearning/ABLkit/tree/main/examples/zoo)
  130. ### References
  131. For more information about ABL, please refer to: [Zhou, 2019](http://scis.scichina.com/en/2019/076101.pdf) and [Zhou and Huang, 2022](https://www.lamda.nju.edu.cn/publication/chap_ABL.pdf).
  132. ```
  133. @article{zhou2019abductive,
  134. title = {Abductive learning: towards bridging machine learning and logical reasoning},
  135. author = {Zhou, Zhi-Hua},
  136. journal = {Science China Information Sciences},
  137. volume = {62},
  138. number = {7},
  139. pages = {76101},
  140. year = {2019}
  141. }
  142. @incollection{zhou2022abductive,
  143. title = {Abductive Learning},
  144. author = {Zhou, Zhi-Hua and Huang, Yu-Xuan},
  145. booktitle = {Neuro-Symbolic Artificial Intelligence: The State of the Art},
  146. editor = {Pascal Hitzler and Md. Kamruzzaman Sarker},
  147. publisher = {{IOS} Press},
  148. pages = {353--369},
  149. address = {Amsterdam},
  150. year = {2022}
  151. }
  152. ```

An efficient Python toolkit for Abductive Learning (ABL), a novel paradigm that integrates machine learning and logical reasoning in a unified framework.