強化学習

実際のところ良く分かってないので、半分想像で。


強化学習は、複数の選択肢があるときに、最も利益の高い選択肢を学習する手法である。予め答えを与えなくても学習が進んでいくことが特徴。


ここで、次のようなゲームを考える。A,Bがいて、5つのカードを持つ。1ターンごとに手札を1枚見せ、その得点を得る(手札は捨てない)。カードは10点、20点,30点,40点,50点。合計100点得たら勝ちとする。


もちろん、50点だけ出し続ければ良いのだが、学習していないAIには価値が分からない。


まず、AIは全てのカードを等価値だと仮定する。そこからランダムにカードを出す。そのうち、A,Bどちらかが勝つので、勝った方の真似をする。つまり、勝った方が出したカードを出す確率を少し上げ、他を下げる。


これを続けていくと、最も強いカードを覚えることができる。問題自体は多腕バンディット問題に近いイメージで。

; 得点 選択確率
(defvar hand '((10 20) (20 20) (30 20) (40 20) (50 20)))
; 選択確率は1未満にはならない。

; 手 得点 選択手
(defun make-ins ()
  (list hand 0 nil))
(setq o (make-ins))

(defun action (this)
  (let* ((p (random 100))
     (h (car this))
     (act (car h)))
    (dolist (i h)
      (decf p (cadr i))
      (if (minusp p)
      (return (setq act i))))
    (incf (cadr this) (car act))
    (push act (caddr this))))

(defun win-p (this)
  (<= 100 (cadr this)))

(defun learn (this)
  (dolist (a (caddr this))
    (incf (cadr a)))
  (let ((n (length (caddr this)))
    (m (length (car this))))
    (while (plusp n)
      (let ((p (elt (car this) (random m))))
    (when (< 1 (cadr p))
      (decf (cadr p))
      (decf n))))))

(let ((hand '((10 20) (20 20) (30 20) (40 20) (50 20))))
  (dotimes (i 100)
    (let ((a (make-ins))
      (b (make-ins)))
      (while (not (or (win-p a) (win-p b)))
    (action a)
    (action b))
      (if (win-p a)
      (learn a)
    (learn b))
      (format t "~a~%" hand) ; 現在の選択確率を表示
      hand)))
((10 19) (20 19) (30 20) (40 21) (50 21))
((10 19) (20 19) (30 20) (40 20) (50 22))
((10 19) (20 18) (30 21) (40 20) (50 22))
((10 19) (20 18) (30 22) (40 19) (50 22))
.
.
.
.
((10 1) (20 1) (30 6) (40 1) (50 91))
((10 1) (20 1) (30 5) (40 1) (50 92))
((10 1) (20 1) (30 4) (40 1) (50 93))
((10 1) (20 1) (30 3) (40 1) (50 94))
((10 1) (20 1) (30 2) (40 1) (50 95))

この方法は、勝った方を生かすという、淘汰法に近い行程が入る。そのため、最終的な評価結果だけで学習が行えるのだろう。一方で、これだけ単純な問題でも学習に時間がかかるとか、行動を覚えていないと学習できないという問題がある。選択肢の取り方は人為的なので、問題を構造化する役にも立っていない。複雑な問題へ応用するにはどうしたらよいだろうか。