Perché Lisp è un linguaggio così buono per l'IA?


30

Ho sentito prima dagli informatici e dai ricercatori nel campo dell'intelligenza artificiale che Lisp è un buon linguaggio per la ricerca e lo sviluppo dell'intelligenza artificiale. Questo vale ancora, con la proliferazione di reti neurali e l'apprendimento profondo? Qual era il loro ragionamento per questo? In quali lingue sono attualmente integrati i sistemi di apprendimento profondo?

Risposte:


30

Innanzitutto, suppongo che intendi Common Lisp (che è una specifica del linguaggio standard, vedi HyperSpec ) con implementazioni efficienti (à la SBCL ). Ma potrebbero essere rilevanti anche alcune recenti implementazioni di Scheme (con buone implementazioni come Bigloo o Chicken / Scheme ). Sia Common Lisp che Scheme (e persino Clojure ) appartengono alla stessa famiglia Lisp. E come linguaggio di scripting che guida applicazioni di big data o machine learning, Guile potrebbe essere un utile sostituto di Python ed è anche un dialetto Lisp. A proposito, raccomando di leggere SICP, un'eccellente introduzione alla programmazione mediante Scheme.

Quindi, Common Lisp (e altri dialetti di Lisp) è ottimo per l'IA simbolica. Tuttavia, molte librerie di apprendimento automatico recenti sono codificate in più lingue tradizionali, ad esempio TensorFlow è codificato in C ++ e Python. Le librerie di deep learning sono per lo più codificate in C ++ o Python o C (e talvolta usano OpenCL o Cuda per le parti di elaborazione GPU).

Common Lisp è ottimo per l'intelligenza artificiale simbolica perché:

  • ha implementazioni molto buone (es. SBCL , che compila al codice macchina ogni espressione data al REPL )
  • è omoiconico , quindi è facile trattare i programmi come dati, in particolare è facile generare [sotto-] programmi, cioè usare tecniche di meta-programmazione .
  • ha un ciclo Read-Eval-Print per facilitare la programmazione interattiva
  • fornisce un macchinario macro molto potente (essenzialmente, si definisce la propria sublanguage specifica del proprio dominio per il proprio problema), molto più potente che in altre lingue come C.
  • impone un garbage collector (anche il codice può essere garbage collection)
  • fornisce molti tipi di dati astratti del contenitore e può gestire facilmente i simboli.
  • puoi codificare sia il codice di alto livello (digitato dinamicamente) sia quello di basso livello (più o meno inizializzato), tramite annotazioni appropriate.

Tuttavia, la maggior parte delle librerie di rete di apprendimento automatico e rete neurale non sono codificate in CL. Si noti che né la rete neurale né l'apprendimento profondo si trovano nel campo simbolico dell'intelligenza artificiale. Vedi anche questa domanda .

Diversi sistemi simbolici di intelligenza artificiale come Eurisko o CyC sono stati sviluppati in CL (in realtà, in alcuni DSL costruiti sopra CL).

Si noti che il linguaggio di programmazione potrebbe non essere molto importante. Nella Artificial Intelligence Generale tema di ricerca, alcune persone lavorano sull'idea di un sistema di intelligenza artificiale che genererebbe tutto il suo proprio codice (così sono la progettazione con un bootstrap approccio). Quindi, il codice generato da un tale sistema può anche essere generato in linguaggi di programmazione di basso livello come C. Vedi il blog di J.Pitrat


1
Vorrei aggiungere qui che tensorflow e theano sono basati su grafici computazionali, che sono in realtà una programmazione simbolica, ma all'interno di un linguaggio imperativo.
Massimo

@Basile: condividi il tutorial o il riferimento LISP comune
Ved Prakash,

@VedPrakash: vorrei contattarti via email. Il mio è basile@starynkevitch.net; Sono troppo vecchio per usare twitter
Basile Starynkevitch il

15

David Nolen (collaboratore di Clojure e ClojureScript ; creatore di Core Logic una porta di miniKanren) in un discorso chiamato LISP in quanto troppo potente affermava che ai suoi tempi LISP era decenni avanti rispetto ad altri linguaggi di programmazione. Esistono diversi motivi per cui la lingua non è stata in grado di mantenere il suo nome.

Questo articolo mette in evidenza alcuni punti chiave per cui LISP è buono per l'IA

  • Facile definire una nuova lingua e manipolare informazioni complesse.
  • Massima flessibilità nella definizione e manipolazione di programmi e dati.
  • Veloce, poiché il programma è conciso con dettagli di basso livello.
  • Buon ambiente di programmazione (debug, compilatori incrementali, editor).

La maggior parte dei miei amici in questo campo di solito usa Matlab per reti neurali artificiali e machine learning. Nasconde però i dettagli di basso livello. Se stai solo cercando risultati e non come ci arrivi, allora Matlab sarà buono. Ma se vuoi imparare anche cose dettagliate di basso livello, ti suggerirò di passare almeno una volta a LISP.
Il linguaggio potrebbe non essere così importante se hai la comprensione di vari algoritmi e tecniche di intelligenza artificiale. Ti suggerirò di leggere "Intelligenza artificiale: un approccio moderno (di Stuard J. Russell e Peter Norvig" . Attualmente sto leggendo questo libro, ed è un ottimo libro.


4

L'intelligenza artificiale è un campo ampio che va ben oltre l'apprendimento automatico, l'apprendimento profondo, le reti neurali, ecc. In alcuni di questi campi, il linguaggio di programmazione non ha alcuna importanza (tranne che per i problemi di velocità), quindi LISP non sarebbe certamente un argomento lì .

Nella ricerca o nella pianificazione dell'IA, ad esempio, i linguaggi standard come C ++ e Java sono spesso la prima scelta, perché sono veloci (in particolare C ++) e perché molti progetti software come i sistemi di pianificazione sono open source, quindi è importante utilizzare un linguaggio standard ( o almeno saggio nel caso in cui si apprezzino feedback o estensioni). Sono a conoscenza di un solo pianificatore scritto in LISP. Giusto per dare una certa impressione sul ruolo della scelta del linguaggio di programmazione in questo campo dell'IA, fornirò un elenco di alcuni dei pianificatori più noti e quindi più importanti:

Fast-Downward:
descrizione: l'
URL del sistema di pianificazione classica probabilmente più noto : http://www.fast-downward.org/
lingua: C ++, parti (preelaborazione) sono in Python

FF:
descrizione: insieme a Fast-Downward il classico sistema di pianificazione che tutti conoscono
URL: https://fai.cs.uni-saarland.de/hoffmann/ff.html
lingua: C

VHPOP:
descrizione: uno dei più noti sistemi di pianificazione dei collegamenti causali di ordine parziale (POCL)
URL: http://www.tempastic.org/vhpop/
language: C ++

SHOP e SHOP2:
descrizione: l'
URL del sistema di pianificazione HTN (gerarchico) più noto : https://www.cs.umd.edu/projects/shop/
lingua: esistono due versioni di SHOP e SHOP2. Le versioni originali sono state scritte in LISP. Le versioni più recenti (chiamate JSHOP e JSHOP2) sono state scritte in Java. Pyshop è un'ulteriore variante di SHOP scritta in Python.

PANDA:
descrizione: un altro noto
URL del sistema di pianificazione HTN (e ibrido) : http://www.uni-ulm.de/en/in/ki/research/software/panda/panda-planning-system/
lingua: lì sono diverse versioni del planner: PANDA1 e PANDA2 sono scritti in Java, PANDA3 è scritto principalmente in Java con alcune parti in Scala.

Questi erano solo alcuni dei sistemi di pianificazione più noti che mi sono venuti in mente. Quelli più recenti possono essere recuperati dalle competizioni internazionali di pianificazione (IPC, http://www.icaps-conference.org/index.php/Main/Competitions ), che si svolgono ogni due anni. I codici dei pianificatori concorrenti sono pubblicati open source (per alcuni anni).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.