質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
強化学習

強化学習とは、ある環境下のエージェントが現状を推測し行動を決定することで報酬を獲得するという見解から、その報酬を最大限に得る方策を学ぶ機械学習のことを指します。問題解決時に得る報酬が選択結果によって変化することで、より良い行動を選択しようと学習する点が特徴です。

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

Q&A

解決済

1回答

1115閲覧

教科書記載の、Q学習の一番基本的なコードの内容を理解したい。

YYJP

総合スコア23

強化学習

強化学習とは、ある環境下のエージェントが現状を推測し行動を決定することで報酬を獲得するという見解から、その報酬を最大限に得る方策を学ぶ機械学習のことを指します。問題解決時に得る報酬が選択結果によって変化することで、より良い行動を選択しようと学習する点が特徴です。

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

0グッド

0クリップ

投稿2021/05/30 13:59

編集2021/05/31 01:59

前提・実現したいこと

強化学習の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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/05/30 17:26

お使いの教科書のタイトルを書いたら、それを読んだ人が答えてくれる可能性が高まります。その際は、質問文を編集して質問文中にお書きください。
YYJP

2021/05/31 02:00

ありがとうございます。修正しました!
guest

回答1

0

ベストアンサー

Qの値が、「フィットするモデルの設定」に対して、どのように渡されて、どこで使われているのか

ソースファイルを見ればどこで使われているかはすぐに分かると思います。
そして、その値は最終的にリストの一要素として呼び出し元に返されています。

# 行動価値の更新 if (t < T) { Q[c[t],t+1] <- Q[c[t],t] + alpha * (r[t] - Q[c[t],t] ) # 選択肢していない行動の価値はそのままの値を次の時刻に引き継ぐ ...

これで納得できないことがあるなら、もう少し質問を具体的に補足してください。

投稿2021/05/31 03:00

KojiDoi

総合スコア13669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YYJP

2021/05/31 11:09

ご回答下さり、ありがとうございます。下記に張り付けたコードの前半部が、どのような役割を果たしているかを知りたいです。 下記のコードに続く、func_qlearning 関数の定義以降の箇所でも、下記のコードとほとんど同じ処理がなされいてるように思うので、コードの前半部は、なんのために存在しているのか、が分かりません。一方で、前半部を消して実行したところ、エラーになったので、なんらかの役割を果たしているのだろう、というところまでは、理解できています・・・。 # Q学習モデルのシミュレーションによるデータ生成 ------------------------------------------------- # 試行数 T <- 80 # Q 値の初期化( 選択肢の数x T) Q <- matrix(numeric(2*T), nrow=2, ncol=T) c <- numeric(T) r <- numeric(T) pA <- numeric(T) alpha <- 0.3 # 学習率 beta <- 2.0 # 逆温度 # それぞれの選択肢の報酬確率 pr <- c(0.7,0.3) for (t in 1:T) { # ソフトマックスで選択肢A の選択確率を決定する pA[t] <- 1/(1+exp(-beta*(Q[1,t]-Q[2,t]))) if (runif(1,0,1) < pA[t]) { # Aを選択 c[t] <- 1 r[t] <- as.numeric(runif(1,0,1) < pr[1]) } else { # Bを選択 c[t] <- 2 r[t] <- as.numeric(runif(1,0,1) < pr[2]) } # 行動価値の更新 if (t < T) { Q[c[t],t+1] <- Q[c[t],t] + alpha * (r[t] - Q[c[t],t] ) # 選択肢していない行動の価値はそのままの値を次の時刻に引き継ぐ。 # 3-c でc=1 なら2, c=2 なら1, というように # 逆側の選択肢のインデックスが求まる。 Q[3-c[t],t+1] <- Q[3-c[t],t] } }
KojiDoi

2021/06/01 12:00

> 下記に張り付けたコードの前半部が、どのような役割を果たしているか func_minimizeの実行に必要なc,rを準備していますね。 その中でQは中間データの保持に使われ、またループを回る際に「ひとつ先」の中間データを都度作り出す構造になっています。どれかなくなれば「未定義で計算が出来ません」エラーが発生し得ますね。 私Qlearningとやらには詳しくないので、それぞれの「計算式」の役割については答えられません。そのへんは教科書を見てください。
YYJP

2021/06/04 01:46

ご回答頂きありがとうございます。授業が月曜日で、分からないと答えて乗り切った後、他の課題に取り組んでいました。 まだ少し疑問があるのですが、またこちらの課題に取り組む際に、改めて質問させて頂こうと思います。 ご多忙な中、本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問