前提・実現したいこと
強化学習で、下記の初心者向けの課題に取り組んでいます。
『選択肢A(報酬が70%の確率で得られる), B(報酬が30%の確率で得られる)のうちから行動を選択する、Q学習モデルの仮想実験を、1セット200試行として、1000セット行い、1セットあたりで、報酬が70%の確率で得られるAを選んだ試行の割合を算出しなさい。』
*片平健太郎著 行動データの計算論モデリング:強化学習モデルを例として 問題2.2
上記の課題において、α, βの値を変更することで、Aを選択する割合がどのように変化するかを確認したいのですが、α, βの値を変更しても、出力結果(=print(table(c)) の値)が変わりません。
どうしたら、α, βの値の変更が、反映されるようになるでしょうか?
該当のソースコード
R
1# ----------------------------------------------------- # 2# calc_optimrate() 3# 章末問題2.3の回答に使える関数 4# qlearning_simulation.Rがベース 5# ----------------------------------------------------- # 6 7# 関数calc_optimrateの定義 8# 最適な選択肢を選択した割合を返す関数 9# 引数 10# T: 試行数、pr: それぞれの選択肢の報酬確率、alpha: 学習率、beta: 逆温度 11i<-1 12 13for (i in 1:1000) { 14 15 # 試行数 16 T <- 200 17 alpha <- 0.3 # 学習率 18 beta <- 5.0 # 逆温度 19 20 # それぞれの選択肢の報酬確率 21 pr <- c(0.7,0.3) 22 23 24 calc_optimrate <- function(T, pr, alpha, beta) { 25 26 # 最適な選択肢を必ず1番目の選択肢にする 27 if (pr[1] <= pr[2]) { 28 stop(paste("1番目の報酬確率を2番目より大きくしてください。")) 29 } 30 31 # Q値の初期化(選択肢の数 x T) 32 Q <- matrix(numeric(2*T), nrow=2, ncol=T) 33 34 c <- numeric(T) # 各試行での選択(1=A, 2=B) 35 r <- numeric(T) # 各試行での報酬 36 pA <- numeric(T) # Aの選択確率 37 38 39 40 41 for (t in 1:T) { 42 43 # ソフトマックスで選択肢Aの選択確率を決定する 44 pA[t] <- 1/(1+exp(-beta*(Q[1,t]-Q[2,t]))) 45 46 if (runif(1,0,1) < pA[t]) { 47 # Aを選択 48 c[t] <- 1 49 r[t] <- as.numeric(runif(1,0,1) < pr[1]) 50 } else { 51 # Bを選択 52 c[t] <- 2 53 r[t] <- as.numeric(runif(1,0,1) < pr[2]) 54 } 55 56 # 行動価値の更新 57 if (t < T) { 58 59 Q[c[t],t+1] <- Q[c[t],t] + alpha * (r[t] - Q[c[t],t] ) 60 61 # 選択肢していない行動の価値はそのままの値を次の時刻に引き継ぐ。 62 # 3-c でc=1 なら2, c=2 なら1, というように 63 # 逆側の選択肢のインデックスが求まる。 64 Q[3-c[t],t+1] <- Q[3-c[t],t] 65 } 66 } 67 68 return(list(optimrate=mean(c==1), 69 pr=pr, 70 alpha=alpha, 71 beta=beta)) 72 } 73 74print(table(c)) 75i <- i+1 76}
試したこと
α, βの値を変更することにより、print(table(c))の値が変わることを期待したのですが、変わりません。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/16 06:49