メモ
機械学習とは?
簡単にいえば、プログラムがインプットされた情報を解析して、その結果に応じて内部状態を変える事。
結果として、対処すべき問題があたらられた場合に、巧妙に回答できるようになる。
機械学習技術は従来より存在していた。そこに深層学習技術を活用することで、様々なことが実現可能となった。
機械学習の分類
教師あり学習
教師なし学習
強化学習
→最終結果のみ与えられる環境で学習する方法。問題のルールは知る必要なし。
強化学習について
最終結果を判定して、成功した手法に"報酬"を与える。
想定できる多数のパターンを実行し、その中で最も報酬を多く得た手法を正とする。
Q学習とは?
機械学習の一つの手法
効率的に学習する手法
機械学習の為、基本的にはあらゆるパターンを実行する。その中で以下の処理をすることで効率的な学習を実現している。
処理完了までに選択するアクションにQ値を付与する。
成功した場合、選択したアクションに対してQ値を加算(報酬)する。逆に失敗した場合、選択したアクションのQ値を減算する。
アクションの選択をする場合、Q値が高いアクションを選ぶ傾向を付与する。
※必ずQ値が高いアクションを選ぶわけではない。ランダムに選択される判定処理は残しつつ、部分的にQ値が高いアクションを選ぶ処理を組み込む。
これにより、あらゆる選択が可能となり、最もよい回答を選ぶ事ができる。
何回も実行することで、Q値が高いアクション=よい解答となる。
サンプルプログラム
参考にした書籍の「強化学習(Q学習)の例題プログラム 迷路探索」をPythonで書いたもの
# coding: utf-8 import random from collections import OrderedDict SEED = 32767 GENMAX = 1000 NODENO = 15 ALPHA = 0.1 GAMMA = 0.9 EPSILON = 0.3 def main(): # Q値を格納する順番保持型辞書 qvalue = list() # 各ノードのQ値をランダムにセット for i in range(NODENO): qvalue.append(random.randint(0, 101)) printqvalue(qvalue) for i in range(GENMAX): # 状態 どのQにいるか。 # 0は迷路の入り口。 s = 0 # 3段処理 for t in range(3): # 行動の選択 s = selecta(s, qvalue) # Q値の更新 qvalue[s] = updateq(s, qvalue) printqvalue(qvalue) def printqvalue(qvalue): for v in qvalue[1:]: print '{0:4}'.format(v), print("") def selecta(olds, qvalue): # 次のステップを選択 # sはステップの位置を示す番号 s = int() # 0 - 1迄のランダムな実数を得る。例) 0.2 r = float(random.randint(0, 10)) / 10.0 # 選択可能な次のステップの位置番号は、現在の位置番号の2倍+1 or +2になる next1 = 2 * olds + 1 next2 = 2 * olds + 2 if r < EPSILON: # ランダムに次のステップを選択 if random.randint(0, 1): s = next1 else: s = next2 else: # Q値が高い次のステップを選択 # ここがQ学習のポイント if qvalue[next1] > qvalue[next2]: s = next1 else: s = next2 return s def updateq(s, qvalue): qv = int() # 最下段の選択の場合 if s > 6: if s == 14: # 14がゴール。報酬を付与する。 qv = qvalue[s] + ALPHA * (1000 - qvalue[s]) else: # ゴール以外は報酬は付与しない qv = qvalue[s] else: # 1,2段目の場合 # 次のステップのQ値の最大値をセット next1 = 2 * s + 1 next2 = 2 * s + 2 if qvalue[next1] > qvalue[next2]: qmax = qvalue[next1] else: qmax = qvalue[next2] # ゴールではないが、次の選択可能なステップの最大値の # 数値を利用して報酬を付与。 # これによりゴールに近いステップのQ値も高くなる。 # ただし、次のステップのQ値が低いとQ値は減算される。 # qmax - qvalue[s] qv = qvalue[s] + ALPHA * (GAMMA * qmax - qvalue[s]) qv = int(qv) return qv main()
他の強化学習の手法として
群知能
→蟻が餌場から巣穴までの最短距離を見つける仕組みを利用
蟻は方向感覚がない。
しかし通った道にフェロモンを残す。
しかしフェロモンは一定時間で消える。
フェロモンの濃度が高い道を選択する傾向がある。
→最も最短経路ほど、フェロモンが高濃度で残り、選択されやすくなる。
進化的手法(遺伝的アルゴリズム)
→良い遺伝子を組み合わせると、よりよい遺伝子が生まれる可能性が高い仕組みを利用
「まずまず」の結果を「素早く」求めるのに向いている手法