nabla-xp: improvements, + test

This commit is contained in:
Helmut Merz 2025-05-28 08:35:14 +02:00
parent 11e8ff59e4
commit 4b20e4ef0c
2 changed files with 17 additions and 6 deletions

View file

@ -72,6 +72,15 @@
(lambda (theta) (lambda (theta)
(nabla-xp obj theta)))) (nabla-xp obj theta))))
;;;; optimization by revision (= gradient descent)
(defvar *revisions* 10)
(defvar *alpha* 0.01)
;;;; experimental differentiation
(defvar *diff-variation* 0.01)
(defun nabla-xp (fn args) (defun nabla-xp (fn args)
"Determine gradients by experiment: vary args and record changes." "Determine gradients by experiment: vary args and record changes."
(let ((base (funcall fn args)) (let ((base (funcall fn args))
@ -82,12 +91,13 @@
(reverse res))) (reverse res)))
(defun diff (fn vargs ix base) (defun diff (fn vargs ix base)
(let* ((vx 0.01) argsx r+ r-) (let* ((vdiff *diff-variation*)
(setf argsx (copy-seq vargs)) (val (svref vargs ix))
(setf (svref argsx ix) (+ (svref vargs ix) vx)) (argsx (copy-seq vargs)) r+ r-)
(setf r+ (/ (- (funcall fn (map 'list #'identity argsx)) base) vx)) (setf (svref argsx ix) (+ val vdiff))
(setf (svref argsx ix) (- (svref vargs ix) vx)) (setf r+ (/ (- (funcall fn (map 'list #'identity argsx)) base) vdiff))
(setf r- (/ (- base (funcall fn (map 'list #'identity argsx))) vx)) (setf (svref argsx ix) (- val vdiff))
(setf r- (/ (- base (funcall fn (map 'list #'identity argsx))) vdiff))
;(util:lgi base r+ r-) ;(util:lgi base r+ r-)
(/ (+ r+ r-) 2))) (/ (+ r+ r-) 2)))

View file

@ -71,4 +71,5 @@
(setf decons:*trials* nil) (setf decons:*trials* nil)
(decons:try objective '(0.0 0.0)) (decons:try objective '(0.0 0.0))
(decons:try objective '(0.0099 0.0)) (decons:try objective '(0.0099 0.0))
(== (decons:nabla-xp objective '(0.0 0.0)) '(-62.999725 -21.0001))
)) ))