からっぽのしょこ

読んだら書く!書いたら読む!同じ事は二度調べ(たく)ない

3.1.1:報酬の期待値計算【ゼロつく4のノート】

はじめに

 『ゼロから作るDeep Learning 4 ――強化学習編』の独学時のまとめノートです。初学者の補助となるようにゼロつくシリーズの4巻の内容に解説を加えていきます。本と一緒に読んでください。

 この記事は、3.1.1節の内容です。報酬の期待値の計算から同時分布と条件付き分布の関係を確認します。

【前節の内容】

www.anarchive-beta.com

【他の記事一覧】

www.anarchive-beta.com

【この記事の内容】

3.1.1 報酬の期待値計算

 同時確率と条件付き確率の関係、期待値の計算を確認します。(次の節から激しめの数式が繰り広げられます。その前に、数式による表現に慣れるための準備運動です。数式は、分かりやすく表現するための1つの方法です。慣れてくれば、数式を使った方が分かりやすく感じるはずです?)

 利用するライブラリを読み込みます。

# 利用するライブラリ
import numpy as np


・サイコロに関する確率

 「サイコロの目」と「確率」の関係(図3-2の対応関係)を表にします。

サイコロ 確率
1 $\frac{1}{6}$
2 $\frac{1}{6}$
3 $\frac{1}{6}$
4 $\frac{1}{6}$
5 $\frac{1}{6}$
6 $\frac{1}{6}$

 全ての目で等しい確率とします。

 続いて、「サイコロの目」と「確率」の関係(この表の内容)を数式で表します。サイコロの目(面の値)を$x$、各面が出る確率を$p(x)$とします。

$$ \begin{aligned} p(x = 1) = \frac{1}{6} \\ p(x = 2) = \frac{1}{6} \\ p(x = 3) = \frac{1}{6} \\ p(x = 4) = \frac{1}{6} \\ p(x = 5) = \frac{1}{6} \\ p(x = 6) = \frac{1}{6} \end{aligned} $$

 「サイコロの目が1である」というのを「$x = 1$」で、「サイコロの目が1になる確率」を「$p(x = 1)$」で表しています。表と対応しているのが分かります。

 サイコロの目$x$の期待値$\mathbb{E}[x]$を求めます。目の値$x$とその確率$p(x)$の積$x p(x)$の総和を求めます。

$$ \begin{aligned} \mathbb{E}[x] &= 1 \cdot p(x = 1) + 2 \cdot p(x = 2) + 3 \cdot p(x = 3) + 4 \cdot p(x = 4) + 5 \cdot p(x = 5) + 6 \cdot p(x = 6) \\ &= 1 \cdot \frac{1}{6} + 2 \cdot \frac{1}{6} + 3 \cdot \frac{1}{6} + 4 \cdot \frac{1}{6} + 5 \cdot \frac{1}{6} + 6 \cdot \frac{1}{6} \\ &= 3.5 \end{aligned} $$

 ところで、全ての組み合わせを書くのは面倒です。そこで、総和の記号$\sum$を使って次のように書けます。

$$ \mathbb{E}[x] = \sum_{x=1}^6 x p(x) = 3.5 $$

 この式で、上の式と同じ計算を表します。(あくまで、分かりやすく表現するために記号を使っています。)

 ちなみに、$\sum$は\sumと書きます。総和を計算するnp.sum()と同じ役割です。

# サイコロの面の数を指定
V = 6

# サイコロの目を作成
x = np.arange(1, V+1)
print(x)

# 各目の確率を作成
p_x = np.repeat(1/V, V)
print(np.round(p_x, 3))

# 期待値を計算
E = np.sum(x * p_x)
print(E)
[1 2 3 4 5 6]
[0.167 0.167 0.167 0.167 0.167 0.167]
3.5

 サイコロの目xとその確率p_xの積x * p_xの総和をnp.sum()で計算することで、サイコロの目の期待値が求まりました。

・コインに関する確率:条件付き確率

 次は、「コインの裏表」と「確率」の関係(図3-3の対応関係)を表にします。

サイコロ コイン 確率
奇数 $\frac{1}{2}$
奇数 $\frac{1}{2}$
偶数 $\frac{4}{5}$
偶数 $\frac{1}{5}$

 サイコロの出目によって利用するコインが変わります。

 「コインの裏表」と「確率」の関係(この表の内容)を数式で表します。

$$ \begin{aligned} p(y = 表 | x = 奇数) = \frac{1}{2} = 0.5 \\ p(y = 裏 | x = 奇数) = \frac{1}{2} = 0.5 \\ p(y = 表 | x = 偶数) = \frac{4}{5} = 0.8 \\ p(y = 裏 | x = 偶数) = \frac{1}{5} = 0.2 \end{aligned} $$

 「サイコロの目が奇数である」というのを「$x = 奇数$」で、「コインが表である」というのを「$y = 表$」で、「サイコロの目が奇数だったときコインが表になる確率」を「$p(y = 表 | x = 奇数)$」で表しています。サイコロの結果によって利用するコイン(裏表の確率)が変わることを条件付き確率で表現します。

 ちなみに、全てのコインの結果ではなく、コインごとの裏表の和(総和)が1になります。

$$ \begin{aligned} p(y = 表 | x = 奇数) + p(y = 裏 | x = 奇数) &= \frac{1}{2} + \frac{1}{2} = 1 \\ p(y = 表 | x = 偶数) + p(y = 裏 | x = 偶数) &= \frac{4}{5} + \frac{1}{5} = 1 \end{aligned} $$

 この式は、裏を0、表を1とすると次の式で表せます。

$$ \sum_{y=0}^1 p(y | x) = 1 $$

 (慣れてくると、具体的に書くよりも記号を使って端的な式で表す方が分かりやすく思えてくるはずです。)(本ではさらに、$x, y$が取り得る値の全てとして(1から6や0と1と書くのを省略して)、$\sum_x, \sum_y$と表現しています。)

 バックアップ線図においては、1つのノードから分岐する全てのノードの確率の和が1になります。

 2種類のコインそれぞれの裏表の確率を作成しておきます。

# サイコロの目が偶数のときのコインの確率を指定
p_even_y = np.array([0.2, 0.8])

# サイコロの目が奇数のときのコインの確率を指定
p_odd_y = np.array([0.5, 0.5])

 0番目の要素を裏の確率、1番目の要素を表の確率とします。

・報酬に関する確率:同時確率

 最後に、「サイコロの目とコインの裏表の組み合わせ」と「確率」・「報酬」の関係を表にします。

サイコロ コイン 確率 報酬
1 $\frac{1}{12}$ 1
1 $\frac{1}{12}$ 0
2 $\frac{2}{15}$ 2
2 $\frac{1}{30}$ 0
3 $\frac{1}{12}$ 3
3 $\frac{1}{12}$ 0
4 $\frac{2}{15}$ 4
4 $\frac{1}{30}$ 0
5 $\frac{1}{12}$ 5
5 $\frac{1}{12}$ 0
6 $\frac{2}{15}$ 6
6 $\frac{1}{30}$ 0

 この表の確率は、「サイコロの目の確率」と「コインの裏表の確率」の積で求まります。これを同時確率または結合確率と呼びます。

 「サイコロの目とコインの裏表の組み合わせ」と「確率」の関係を式で表します。

$$ \begin{aligned} p(x = 1, y = 表) &= p(x = 1) p(y = 表 | x = 1) = \frac{1}{6} \cdot \frac{1}{2} = \frac{1}{12} \\ p(x = 1, y = 裏) &= p(x = 1) p(y = 裏 | x = 1) = \frac{1}{6} \cdot \frac{1}{2} = \frac{1}{12} \\ p(x = 2, y = 表) &= p(x = 2) p(y = 表 | x = 2) = \frac{1}{6} \cdot \frac{4}{5} = \frac{2}{15} \\ p(x = 2, y = 裏) &= p(x = 2) p(y = 裏 | x = 2) = \frac{1}{6} \cdot \frac{1}{5} = \frac{1}{30} \\ p(x = 3, y = 表) &= p(x = 3) p(y = 表 | x = 3) = \frac{1}{6} \cdot \frac{1}{2} = \frac{1}{12} \\ p(x = 3, y = 裏) &= p(x = 3) p(y = 裏 | x = 3) = \frac{1}{6} \cdot \frac{1}{2} = \frac{1}{12} \\ p(x = 4, y = 表) &= p(x = 4) p(y = 表 | x = 4) = \frac{1}{6} \cdot \frac{4}{5} = \frac{2}{15} \\ p(x = 4, y = 裏) &= p(x = 4) p(y = 裏 | x = 4) = \frac{1}{6} \cdot \frac{1}{5} = \frac{1}{30} \\ p(x = 5, y = 表) &= p(x = 5) p(y = 表 | x = 5) = \frac{1}{6} \cdot \frac{1}{2} = \frac{1}{12} \\ p(x = 5, y = 裏) &= p(x = 5) p(y = 裏 | x = 5) = \frac{1}{6} \cdot \frac{1}{2} = \frac{1}{12} \\ p(x = 6, y = 表) &= p(x = 6) p(y = 表 | x = 6) = \frac{1}{6} \cdot \frac{4}{5} = \frac{2}{15} \\ p(x = 6, y = 裏) &= p(x = 6) p(y = 裏 | x = 6) = \frac{1}{6} \cdot \frac{1}{5} = \frac{1}{30} \end{aligned} $$

 互いに独立のとき$p(a, b) = p(a) p(x)$が成り立ち、また依存関係があるとき$p(a, b) = p(a) p(b | a)$が成り立ちます。

 $x$と$y$の同時確率の場合は、$x$と$y$の全ての組み合わせで和をとると1になります。

$$ \begin{aligned} \sum_{x=1}^6 \sum_{y=0}^1 p(x, y) &= p(x = 1, y = 表) + p(x = 1, y = 裏) \\ &\quad + p(x = 2, y = 表) + p(x = 2, y = 裏) \\ &\quad + p(x = 3, y = 表) + p(x = 3, y = 裏) \\ &\quad + p(x = 4, y = 表) + p(x = 4, y = 裏) \\ &\quad + p(x = 5, y = 表) + p(x = 5, y = 裏) \\ &\quad + p(x = 6, y = 表) + p(x = 6, y = 裏) \\ &= \frac{1}{12} + \frac{1}{12} + \frac{2}{15} + \frac{1}{30} \\ &\quad + \frac{1}{12} + \frac{1}{12} + \frac{2}{15} + \frac{1}{30} \\ &\quad + \frac{1}{12} + \frac{1}{12} + \frac{2}{15} + \frac{1}{30} \\ \\ &= 1 \end{aligned} $$


 続いて、「サイコロの目とコインの裏表の組み合わせ」と「報酬」の関係を式で表します。

$$ \begin{aligned} r(x = 1, y = 表) &= 1 \\ r(x = 1, y = 裏) &= 0 \\ r(x = 2, y = 表) &= 2 \\ r(x = 2, y = 裏) &= 0 \\ r(x = 3, y = 表) &= 3 \\ r(x = 3, y = 裏) &= 0 \\ r(x = 4, y = 表) &= 4 \\ r(x = 4, y = 裏) &= 0 \\ r(x = 5, y = 表) &= 5 \\ r(x = 5, y = 裏) &= 0 \\ r(x = 6, y = 表) &= 6 \\ r(x = 6, y = 裏) &= 0 \end{aligned} $$

 これまでのように、「サイコロの目が1である」というのを「$x = 1$」、「コインが表である」というのを「$y = 表$」で表します。「サイコロの目が1で、コインが表のときの報酬」を$r(x = 1, y = 表)$で表します。$r(\cdot)$は、確率ではなく関数です。

・報酬の期待値

 報酬$r(x, y)$は、$x$と$y$の確率によって様々な値を取ります。そこで、期待値$\mathbb{E}[r(x, y)]$を求めます。「報酬の値$r(x, y)$」と「その報酬が得られる確率$p(x, y)$」の積を、$x, y$の全ての組み合わせで足し合わせます。

$$ \begin{aligned} \mathbb{E}[r(x, y)] &= \sum_{x=1}^6 \sum_{y=0}^1 p(x, y) r(x, y) \\ &= p(x = 1, y = 表) r(x = 1, y = 表) + p(x = 1, y = 裏) r(x = 1, y = 裏) \\ &\quad + p(x = 2, y = 表) r(x = 2, y = 表) + p(x = 2, y = 裏) r(x = 2, y = 裏) \\ &\quad + p(x = 3, y = 表) r(x = 3, y = 表) + p(x = 3, y = 裏) r(x = 3, y = 裏) \\ &\quad + p(x = 4, y = 表) r(x = 4, y = 表) + p(x = 4, y = 裏) r(x = 4, y = 裏) \\ &\quad + p(x = 5, y = 表) r(x = 5, y = 表) + p(x = 5, y = 裏) r(x = 5, y = 裏) \\ &\quad + p(x = 6, y = 表) r(x = 6, y = 表) + p(x = 6, y = 裏) r(x = 6, y = 裏) \\ &= \frac{1}{12} \cdot 1 + \frac{1}{12} \cdot 0 + \frac{2}{15} \cdot 2 + \frac{1}{30} \cdot 0 \\ &\quad + \frac{1}{12} \cdot 3 + \frac{1}{12} \cdot 0 + \frac{2}{15} \cdot 4 + \frac{1}{30} \cdot 0 \\ &\quad + \frac{1}{12} \cdot 5 + \frac{1}{12} \cdot 0 + \frac{2}{15} \cdot 6 + \frac{1}{30} \cdot 0 \\ \\ &= 2.35 \end{aligned} $$


 プログラム上でも計算してみます。(今後には影響しないので参考程度にしてください。)

# 値を初期化
E = 0

# 全ての組み合わせの和を計算
for dice in x: # サイコロの目
    for coin in [0, 1]: # コインの裏表
        # 偶数の場合
        if dice % 2 == 0:
            E += p_x[dice-1] * p_even_y[coin] * dice*coin
        # 奇数の場合
        else:
            E += p_x[dice-1] * p_odd_y[coin] * dice*coin
print(E)
2.3499999999999996

 サイコロの目dice1から6、コインの裏表coin01となります。for文を使って全ての組み合わせで計算をして、Eに加えていきます。
 報酬は、コインが表(coin1)ならdiceの値、コインが裏(coin0)なら0になります。それを、dice*coinの計算で再現しています。

 1 / 60.16666666666666666になるのでプログラム上の誤差がありますが、数式での結果と一致しました。

 「同時確率」は「条件付き確率」と「条件の確率」に分解できました。よって、報酬の期待値は、次の2種類の計算式で表せます。

$$ \begin{aligned} \mathbb{E}[r(x, y)] &= \sum_x \sum_y p(x, y) r(x, y) \\ &= \sum_x \sum_y p(x) p(y | x) r(x, y) \end{aligned} $$

 つまり、報酬の期待値とは、取り得る全ての報酬について、各報酬が得られる確率で割り引いて全て足し合わせた値です。全ての状態や方策を考慮した報酬の値と言えます。
 ベルマン方程式の導出においては、確率的方策と遷移確率を用いて報酬の期待値計算を行います。

参考文献

おわりに

 次が難しくてここばかり書き足してたら流石に想定レベルを下げ過ぎたかもしれません。

【次節の内容】

www.anarchive-beta.com