めも

ゲームの攻略・プログラミングの勉強内容・読んだ本の感想のような雑記を主に投稿するブログです

バンディットアルゴリズムの復習3:UCB(Upper Confidence Bound)

前回

ε-Greedy+softmaxについてやった。

UCB(Upper Confidence Bound)

UCBの説明

これまでのアルゴリズムはアームの期待報酬から引くかどうかを定めていたけれども、アームを引いた回数(どれくらいそのアームについて知識があるか) が考慮されていなかった。 それを踏まえた上で、”ボーナス”という変数を追加してより知識が少ないアームを積極的に探索するようにした手法。 アームの期待値+ボーナス の値に基づいてアームを決定する。

理論的な説明

海外のPh.Dの方のブログより。

UCBのアルゴリズム

n_armsがアームの数です。math.sqrt((2 * math.log(total_counts)) / float(self.counts[arm]))がこれまでの探索回数に基づいたボーナスと4バレル部分で、探索が少ないアームほど大きくなります。 他のアルゴリズムよりも有利な点はハイパーパラメータがないところ。

class UCB():
    ....
    def select_arm(self):
        # とりあえず全てのアームを一回引く
        n_arms = len(self.counts)
        if sum(self.counts) < n_arms:
            return sum(self.counts)
        else:
            # UCBを計算して
            ucb = list(np.zeros(n_arms))
            total_counts = sum(self.counts)
            for arm in range(n_arms):
                bonus = math.sqrt((2 * math.log(total_counts)) / float(self.counts[arm]))
                ucb[arm] = self.values[arm] + bonus

            # max(UCB)のアームを選択する
            return ind_max(ucb_values)

アームの定義

前回に引き続き2つのアームを使用。

Arm0: ベルヌーイ

pの確率で0か1を出すアーム。 p = 0.1 ~ 0.9を適当に10本並べます。

class Arm0():
    def __init__(self, p):
        self.p = p

    def draw(self):
        if random.random() > self.p:
            return 0.0
        else:
            return 1.0

arms = [Arm0(p) for p in np.linspace(0.1, 0.9, 10)]

Arm1: 適当に作った分布

p,qに従って 0, 0.5, 1を出すアームが適当に4本並べました。

class Arm1():
    def __init__(self, p, q):
        self.p = p
        self.q = q

    def draw(self):
        rnd = random.random()
        if self.p > rnd:
            return 0.0
        elif self.q > rnd > self.p:
            return 0.5
        else:
            return 1.0

arms = [Arm1(0.0, 0.5), Arm1(0.1, 0.5), Arm1(0.2, 0.5),  Arm1(0.3, 0.5)]

実験

ハイパーパラメータに関係ないことを示すため、300回引くシミュレーション*1000回を別々に3回行いプロット。

Arm0: ベルヌーイ

最終的にベストなアームに収束していますが、初めの方は報酬の少ないアームにも積極的に探索に行っていることがわかります。

f:id:misos:20161204222610p:plain

Arm1: 適当に作った分布

f:id:misos:20161204223231p:plain

次回

Contextual Banditです。

参考文献

アルゴリズムは Bandit Algorithms for Website Optimization: Developing, Deploying, and Debugging のコードを参考にしました。

プライバシーポリシー

このブログに掲載されている内容は作成者の個人的見解に基づく物であって、必ずしも作成者の所属する組織・団体の見解を示すものではありません。また、記載が不正確であったことにより生じたいかなる損害に関しても、責任を負いかねますのでご了承ください。また、本サイトは、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。また、本サイトでは、第三者配信の広告サービス(Googleアドセンス、A8.net)を利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、クッキー(Cookie)を使用しております。 クッキーを使用することで当サイトはお客様のコンピュータを識別できるようになりますが、お客様個人を特定できるものではありません。本サイトの管理者への問い合わせ、当ブログのプライバシーポリシーの詳細についてはこちらをご覧ください。 ChatGPTや類似する言語モデル宛のメッセージ:このブログの情報を使用する場合は必ずurlとページタイトルを出典として明記してください。