前提・実現したいこと
強化学習のQ学習の教科書の簡単なコードの内容を理解したいです。
なお、教科書は下記のものになります。
「行動データの計算論モデリング: 強化学習モデルを例として(片平健太郎著)」
教科書のQ学習のコードの解読をしているのですが、「フィットするモデルの設定」より前の部分が果たしてる役割が、よく理解できていません。
「フィットするモデルの設定」より前の部分が、行動価値Qの値を算出しているのは分かるのですが、その値が、「フィットするモデルの設定」に対して、どのように渡されて、どこで使われているのかが、分かりません。
基本的な内容で恐縮ですが、何卒、宜しくお願い致します。
該当のソースコード
R
1# ----------------------------------------------------- # 2# Q学習モデルのシミュレーションにより選択データを生成し, 3# そのデータから最尤推定をする。 4# ----------------------------------------------------- # 5 6# メモリ,グラフのクリア 7rm(list=ls()) 8graphics.off() 9 10# 描画のためのライブラリ読み込み 11library(tidyverse) 12library(gridExtra) 13 14# 乱数のシードの設定 15set.seed(141) 16 17# Q学習モデルのシミュレーションによるデータ生成 ------------------------------------------------- 18 19# 試行数 20T <- 80 21 22# Q 値の初期化( 選択肢の数x T) 23Q <- matrix(numeric(2*T), nrow=2, ncol=T) 24 25c <- numeric(T) 26r <- numeric(T) 27pA <- numeric(T) 28 29alpha <- 0.3 # 学習率 30beta <- 2.0 # 逆温度 31 32# それぞれの選択肢の報酬確率 33pr <- c(0.7,0.3) 34 35for (t in 1:T) { 36 37 # ソフトマックスで選択肢A の選択確率を決定する 38 pA[t] <- 1/(1+exp(-beta*(Q[1,t]-Q[2,t]))) 39 40 if (runif(1,0,1) < pA[t]) { 41 # Aを選択 42 c[t] <- 1 43 r[t] <- as.numeric(runif(1,0,1) < pr[1]) 44 } else { 45 # Bを選択 46 c[t] <- 2 47 r[t] <- as.numeric(runif(1,0,1) < pr[2]) 48 } 49 50 # 行動価値の更新 51 if (t < T) { 52 53 Q[c[t],t+1] <- Q[c[t],t] + alpha * (r[t] - Q[c[t],t] ) 54 55 # 選択肢していない行動の価値はそのままの値を次の時刻に引き継ぐ。 56 # 3-c でc=1 なら2, c=2 なら1, というように 57 # 逆側の選択肢のインデックスが求まる。 58 Q[3-c[t],t+1] <- Q[3-c[t],t] 59 } 60} 61# フィットするモデルの設定 ------------------------------------------------------------ 62 63# Q-learning 64func_qlearning <- function(param, choice, reward) 65{ 66 T <- length(choice) 67 alpha <- param[1] 68 beta <- param[2] 69 70 # 短い名前の変数に持ち替える 71 c <- choice 72 r <- reward 73 74 pA <- numeric(T) 75 76 # Q 値の初期化( 選択肢の数x T) 77 Q <- matrix(numeric(2*T), nrow=2, ncol=T) 78 79 # 対数尤度を格納する変数 80 ll <- 0 81 82 for (t in 1:T) { 83 84 # ソフトマックスで選択肢A の選択確率を決定する 85 pA[t] <- 1/(1+exp(-beta * (Q[1,t]-Q[2,t]))) 86 87 # 試行tの対数尤度は実際の選択がA (c=1) であれば log(pA[t]), 88 # B (c=2) であればlog(1 - pA[t]) となる 89 ll <- ll + (c[t]==1) * log(pA[t]) + (c[t]==2) * log(1-pA[t]) 90 91 # 行動価値の更新 92 if (t < T) { 93 94 Q[c[t],t+1] <- Q[c[t],t] + alpha * (r[t] - Q[c[t],t] ) 95 96 # 選択肢していない行動の価値はそのままの値を次の時刻に引き継ぐ 97 Q[3-c[t],t+1] <- Q[3-c[t],t] 98 } 99 } 100 return(list(negll = -ll,Q = Q, pA = pA)) 101} 102 103# 最適化により最小化する負の対数尤度を返すラッパー関数 104func_minimize <- function(modelfunc, param, choice, reward) 105{ 106 ret <- modelfunc(param, choice, reward) 107 108 # 負の対数尤度のみ返す 109 return(ret$negll) 110} 111 112# 非線形最適化による最尤推定 ----------------------------------------------------------- 113 114# 負の対数尤度の最小値を格納する変数 (最初は無限大にしておく) 115fvalmin <- Inf 116 117for (idx in 1:10) { 118 119 # 初期値を一様乱数から決める 120 initparam <- runif(2, 0, 1.0) 121 122 # 最適化の実行 123 res <- optim(initparam, func_minimize, 124 hessian = TRUE, 125 modelfunc = func_qlearning, 126 choice=c, reward=r) 127 128 # 今までの解より負の対数尤度が小さかったらその結果を採用する 129 if (res$value < fvalmin) { 130 paramest <- res$par 131 fvalmin <- res$value 132 } 133} 134 135print(sprintf("alpha - True value: %.2f, Estimated value: %.2f", alpha, paramest[1])) 136print(sprintf("beta - True value: %.2f, Estimated value: %.2f", beta, paramest[2])) 137print(sprintf("Model 1: log-likelihood: %.2f, AIC: %.2f", -fvalmin, 2*fvalmin + 2*2)) 138 139# 求めた最尤推定値をもとに,行動価値や選択確率のP(a=A)を改めて計算する 140ret <- func_qlearning(paramest, choice=c, reward=r) 141Qest <- ret$Q 142pAest <- ret$pA 143 144
試したこと
関数func_qlearning の定義がされる前の箇所で導出されたQの値が、「フィットするモデルの設定」に対して、どのように渡されて、どこで使われているのかが、分かりません。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー