Lean4 half dabei, einen kleinen Fehler in einer aktuellen Arbeit von Terence Tao zu entdecken
(mathstodon.xyz/@tao)- Terence Tao entdeckte während seines Lean4-Formalisierungsprojekts einen kleinen, aber nicht belanglosen Fehler in einer Arbeit
- Der Fehler zeigte sich in der Argumentation auf Seite 6 des arXiv-Papers
2310.05328, wobei1/2 log((n - 1)/(n - k - 1))fürn = 3, k = 2divergiert - Das Problem ist auf kleine
n-Werte beschränkt; fürn >= 8funktioniert die bisherige Argumentation, und kleinenkönnen direkt mit einer gröberen Methode behandelt werden - Lean verlangte einen Beweis für
0 < n - 3, aber als Annahme lag nurn > 2vor, sodass die Taktiklinarithden nötigen Widerspruch nicht herleiten konnte - Tao will einige numerische Konstanten anpassen, um die Argumentation zu korrigieren, und in der neuen Version eine Fußnote ergänzen, dass die Ungenauigkeit der früheren Argumentation beim Versuch der Lean-Formalisierung entdeckt wurde
Ein durch die Lean4-Formalisierung aufgedeckter Fehler
- Terence Tao entdeckte im Zuge seines Lean4-Formalisierungsprojekts, dass seine Arbeit einen kleinen, aber nicht belanglosen Bug enthält
- Formalisiert werden sollte die Argumentation auf Seite 6 des arXiv-Papers
2310.05328 - Der problematische Ausdruck hat die folgende Form
1/2 log((n - 1)/(n - k - 1))
- Für
n = 3, k = 2divergiert dieser Ausdruck
Umfang des Fehlers und Art der Korrektur
- Dieses Problem tritt nur bei kleinen
n-Werten auf- Für
n >= 8funktioniert die betreffende Argumentation weiterhin - Kleine
nlassen sich direkt mit einer gröberen Methode behandeln, allerdings mit schlechteren Konstanten
- Für
- Tao geht davon aus, dass sich die Argumentation durch Anpassung einiger numerischer Konstanten auf der betreffenden Seite korrigieren lässt
- In die neue Version der Arbeit will er eine Fußnote aufnehmen, dass die frühere Argumentation leicht ungenau war und dies beim Versuch entdeckt wurde, sie in Lean zu formalisieren
Die konkrete Stelle, an der Lean stockte
- An der Stelle, an der die Formalisierung scheiterte, verlangte Lean den Beweis von
0 < n - 3- Die einzige verfügbare Annahme war
n > 2 - Die Taktik
linarithkonnte aus der Negation von0 < n - 3keinen Widerspruch ableiten
- Die einzige verfügbare Annahme war
1 Kommentare
Hacker-News-Kommentare
Er hat Anfang dieses Monats begonnen, Lean4 mithilfe von GPT-4 zu lernen: https://mathstodon.xyz/@tao/111208692505811257
Viele seiner Mastodon-Beiträge in diesem Monat drehten sich um seinen Lernfortschritt, und es ist ein interessantes Beispiel dafür, wie sehr Large Language Models sogar die Arbeit von Spitzenleuten beschleunigen können
Interessanterweise könnten solche Tools die Ungleichheit sogar vergrößern, wenn nur Hochqualifizierte sie effektiv nutzen
Wenn man einen einfachen Einstieg in Lean4 sucht, ist das Natural Number Game gut: https://adam.math.hhu.de/#/g/hhu-adam/NNG4
Wenn man ohne Spiel nur lesen möchte, dann hier: https://lean-lang.org/theorem_proving_in_lean4/introduction.html
Anfangs hatte ich Alloy als Allow geschrieben
Vor einigen Jahren suchte ich nach Möglichkeiten, Fehler in den Programmen zu reduzieren, die ich schreibe, und stieß auf Lamports TLA+. Ich lernte, formale Spezifikationen zu schreiben, indem ich das Verhalten von Programmen als Zustandsmaschinen betrachtete
TLA+ hat mir geholfen, Abstraktionen klar zu verstehen, und später entdeckte ich auch die Reihe Software Foundations, in der man mit dem Coq-Proof-Assistant formal korrekte Software erstellt. Die Übungen waren wie kleine Spiele aufgebaut, daher hat es ziemlich Spaß gemacht, sie zu lösen: https://softwarefoundations.cis.upenn.edu/
Formale Spezifikationen als High-Level-Abstraktion konzentrieren sich auf eine eigene Sprache zur Beschreibung von Code, während Code Contracts als Low-Level-Abstraktion eher darauf hinauslaufen, Verifikationslogik durch ein besseres Modell zu ersetzen. In C# gab es einmal Code Contracts[1], ein einfacher, aber mächtiger Ansatz, bei dem Verträge zur Compile-Zeit mit dem Z3-SMT-Solver[2] geprüft wurden. Einige Jahre später wurde es jedoch eingestellt[3], und mit der Entfernung aus der .NET Runtime war es praktisch vorbei. Das Nächstliegende in C# ist derzeit vermutlich Dafny[4], und die C#-Entwicklung überlegt weiterhin, wie man so etwas direkt in die Sprache aufnehmen könnte[5]
[1] https://www.microsoft.com/en-us/research/project/code-contracts/
[2] https://github.com/Z3Prover/z3
[3] https://github.com/microsoft/CodeContracts
[4] https://github.com/dafny-lang/dafny
[5] https://github.com/dotnet/csharplang/issues/105
Idris2 scheint eine Allzwecksprache anzustreben und zugleich ein weiterentwickeltes Typsystem für Theorem Proving zu bieten: https://github.com/idris-lang/Idris2
Es gibt auch ein gewissermaßen davon abgeleitetes Buch, das statt Coq Agda verwendet: https://plfa.github.io/
Ich habe es noch nicht gelesen, aber es steht auf meiner Liste, und ich denke, Agda oder Idris dürften sich eher wie Programmiersprachen anfühlen als Coq
Abhängige Typen finde ich wirklich vielversprechend. Allerdings dürfte es vorerst schwierig sein, sie zu bekommen
Dependent Haskell ist in Arbeit, aber es heißt, dass es schwierig ist, so etwas nachträglich in eine bestehende Sprache einzubauen. Auch der Idris-Entwickler sagte, er hoffe, dass Idris als Modell für andere Sprachen dient; eine Mainstream-Adoption scheint aber schwierig. Coq, Agda und F* sind ebenfalls nicht als Allzwecksprachen entworfen. Die Compiler-Implementierung ist komplex, und die Syntax kann ausführlich werden, aber was ich möchte, ist Einfachheit. Ich will alles, was ich über Eingaben und Ausgaben weiß, kodieren können. In heutigen Mainstream-Sprachen weiß man über Argumente oder Ausgaben oft mehr, als das Typsystem ausdrücken lässt
Schön wäre ein gradueller Ansatz wie bei TypeScript, bei dem man an beliebigen Stellen Informationen über Werteinschränkungen auf Typebene hinzufügen kann, ohne überall alles beweisen zu müssen
Wenn man zum Beispiel eine Liste von Zahlen und zugleich ihre Länge kennt, kann man mit abhängigen Typen einen Listentyp erstellen, der die Länge explizit enthält, und zur Compile-Zeit garantieren, dass Operationen diese Länge einhalten. Wenn eine Funktion so spezifiziert ist, dass sie nur Listen der Länge 3 annimmt, und man ihr eine Liste der Länge 4 übergibt, kompiliert das nicht, sodass der Fehler vor der Ausführung abgefangen wird. Es fühlt sich an wie eine zusätzliche Sicherheitsschicht, die Typen ausdrucksstärker macht und sogar komplexe Beziehungen zwischen Variablen kodiert
Wenn einer der brillantesten Köpfe unserer Generation seine Arbeitsbreite durch die Kombination aus Large Language Models und automatischem Beweisen erweitern kann, sieht die Zukunft dieser Technologiekombination sehr vielversprechend aus.
Am Anfang steht das Beheben von Bugs, dann hilft sie bei der Verifikation, und am Ende dürfte sie neue Entdeckungen vorantreiben und Grenzen verschieben. Wir brauchen einen Begriff für das Phänomen, dass eine Dynamik wie das Mooresche Gesetz Bereiche „infiziert“, die ursprünglich keine solche kumulative Eigenschaft hatten. Als zusätzlicher Kontext: Terence Tao nutzt Copilot, um Lean zu lernen: https://mathstodon.xyz/@tao/111271244206606941
Ohne Copilot hätte er es wohl auch gekonnt, aber vielleicht hätte ihn die Reibung beim Annehmen eines neuen Werkzeugs gar nicht erst anfangen lassen. Large Language Models haben in solchen Situationen als „Fahrrad für den Geist“ großes Potenzial.
Vor ein paar Jahren habe ich auch einmal in einem Beitrag auf Terence Taos Mathe-Blog einen Bug gefunden. Ich habe ihn darauf hingewiesen, er hat ihn behoben und sich bedankt.
Auf die Titelseite von Hacker News hat es das natürlich nicht geschafft.
Ich war besorgt, weil ich dachte, Lean4 sei noch ein weiteres Large Language Model, tatsächlich ist es aber ein ziemlich robustes und zuverlässiges Werkzeug.
Ich frage mich, ob man formale Beweisprüfer wie den Lean-Beweisprüfer mit Sprachmodellen kombinieren kann, die synthetische Vermutungs-Beweis-Paare in einer formalen Sprache wie Lean erzeugen.
Mit dem Lean-Beweisprüfer ließen sich die von einem Sprachmodell geschriebenen synthetischen Beweise automatisch auf Korrektheit prüfen, und diese Information könnte als Reward-Signal für Reinforcement Learning dienen, das auf das ursprüngliche Sprachmodell angewendet wird, damit es bessere Beweise schreibt. Alternativ könnte man die korrekten synthetischen Beweise aus früheren Runden als Trainingsdaten verwenden, um ein neues Modell zu trainieren. Man könnte das Ganze auch adversarialer gestalten: Aufteilung in ein Modell zur Erzeugung von Vermutungen und ein Modell für Beweise/Gegenbeweise, plus ein weiteres Modell, das vorhersagt, ob ein synthetischer Beweis vom Lean-Beweisprüfer verifiziert wird. Je niedriger die vorhergesagte Wahrscheinlichkeit für die richtige Antwort ist, desto größer wäre die Belohnung für das beweiserzeugende Modell, wenn es tatsächlich einen korrekten Beweis liefert. Fügt man schließlich ein Modell hinzu, das die Belohnung vorhersagt, die das beweiserzeugende Modell für eine bestimmte synthetische Vermutung erhalten würde, wird das Modell zur Erzeugung von Vermutungen dafür belohnt, Vermutungen mit hoher erwarteter Belohnung zu erstellen, die für das beweiserzeugende Modell weder zu schwer noch zu leicht sind. Das Gesamtsystem könnte immer schwierigere synthetische Beweise hervorbringen, was zu besserem Selbsttraining des beweiserzeugenden Modells führen kann. Im Prinzip ließe sich das bis zu übermenschlichen Fähigkeiten bei der Beweiserzeugung skalieren, ähnlich wie GANs oder Self-Play bei AlphaGo Zero. Der schwierige Teil ist das anfängliche Bootstrapping: Für das erste Training des generativen Modells braucht man von Menschen bereitgestellte Lean-Beweisdaten. Sobald die synthetischen Beweise aber gut genug sind, könnte das System sein Selbsttraining automatisch fortsetzen
Am Ende könnte man ein Modell erhalten, das alle Theoreme und alle korrekten Beweise der mathematischen Literatur kennt
Als frühe Ansätze, die mit Supervised Learning auf bestehenden Beweisen starten und neue Beweise finden, gibt es unter anderem TacticToe (https://arxiv.org/abs/1804.00596), Tactician (https://arxiv.org/pdf/2008.00120.pdf), CoqGym/ASTactic (https://arxiv.org/abs/1905.09381), Proverbot9001 (https://arxiv.org/abs/1907.07794) und Diva (https://dl.acm.org/doi/10.1145/3510003.3510138#sec-terms). Die meisten davon enthalten intern in irgendeiner Form ein Sprachmodell; wenn man aber nach großen Sprachmodellen sucht, die zuletzt viel Aufmerksamkeit bekommen haben, wären das GPT-f (https://arxiv.org/abs/2009.03393), Baldur (https://arxiv.org/abs/2303.04910) und COPRA (https://arxiv.org/abs/2310.04353). Derzeit scheinen solche Modelle allerdings nicht so effektiv zu sein wie spezialisierte Tools, die keine Large Language Models sind. Für Ansätze, die über von Menschen geschriebene Beweise hinaus per Reinforcement Learning lernen, gibt es TacticZero (https://openreview.net/forum?id=edmYVRkYZv), das OpenAI-Paper (https://arxiv.org/pdf/2202.01344.pdf), rlCoP (https://arxiv.org/abs/1805.07563), Arbeiten aus der HOList-Reihe (https://arxiv.org/pdf/1905.10006.pdf), HyperTree Proof Search (https://arxiv.org/abs/2205.11491) sowie laufende Arbeiten eines Teams der University of Massachusetts und von mir
Frühere Hintergründe dazu, wie Tao auf diesem Weg Tools auf Basis großer Sprachmodelle, darunter GPT-4, eingesetzt hat, finden sich hier: https://mathstodon.xyz/@tao/111233986893287137
Seinen Fortschritt kann man auch auf GitHub verfolgen: https://github.com/teorth/symmetric_project/