pikesaku’s blog

個人的な勉強メモです。記載内容について一切の責任は持ちません。

人工知能(AI)勉強メモ Q学習

メモ

機械学習とは?

簡単にいえば、プログラムがインプットされた情報を解析して、その結果に応じて内部状態を変える事。
結果として、対処すべき問題があたらられた場合に、巧妙に回答できるようになる。

機械学習技術は従来より存在していた。そこに深層学習技術を活用することで、様々なことが実現可能となった。

機械学習の分類

教師あり学習
教師なし学習
強化学習
→最終結果のみ与えられる環境で学習する方法。問題のルールは知る必要なし。

深層学習により実現された処理

DQN
→ゲームで高スコア

ConvNetVGG
→画像認識
 深層学習の手法の一つである畳みこみニューラルネットを活用

CD-DNN-HMM
音声認識

機械学習の手法

演繹的学習→基礎的抽象的な概念が分かっている状態。その概念を利用して学習

帰納的学習→基礎的抽象的な概念が分からない状態。複数の具体的な事実が分かっている。事実から理論を導き出す手法

強化学習について

最終結果を判定して、成功した手法に"報酬"を与える。
想定できる多数のパターンを実行し、その中で最も報酬を多く得た手法を正とする。

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()

他の強化学習の手法として

群知能
→蟻が餌場から巣穴までの最短距離を見つける仕組みを利用
 蟻は方向感覚がない。
 しかし通った道にフェロモンを残す。
 しかしフェロモンは一定時間で消える。
 フェロモンの濃度が高い道を選択する傾向がある。
 →最も最短経路ほど、フェロモンが高濃度で残り、選択されやすくなる。

進化的手法(遺伝的アルゴリズム)
→良い遺伝子を組み合わせると、よりよい遺伝子が生まれる可能性が高い仕組みを利用
 「まずまず」の結果を「素早く」求めるのに向いている手法