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

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

新規登録して質問してみよう
ただいま回答率
85.47%
Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2813閲覧

DQNにて、ε-greedy法からボルツマン選択に変更したい

退会済みユーザー

退会済みユーザー

総合スコア0

Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/02/28 07:35

前提・実現したいこと

Deep Q-Networkを使った迷路探索プログラムにおいて行動選択の方法をε-greedy法からボルツマン選択法に変更したいのですが、プログラム知識がなく実装できずにいます。

私事の期限が近いため、教えてくださると幸いです。

該当のソースコード

python

1 def get_action(self, state): 2 sta = [state] 3 sta = xp.asarray(sta, dtype=np.float32) 4 s = Variable(sta) 5 Q = self.model(s) 6 Q = Q.data[0] 7 print Q 8 #εの確率でランダムな行動をする(ランダムの時の行動価値は0) 9 if np.random.rand() < self.epsilon: 10 #18は行動の最大数(3*3*2) 11 return np.random.randint(0, 3), 0 12 #行動価値が一番高い行動とその値を返す 13 else: 14 #stateの配列を学習時に合わせる 15 #sta = [state] 16 #sta = xp.asarray(sta, dtype=np.float32) 17 #s = Variable(sta) 18 #Q = self.model(s) 19 #Q = Q.data[0] 20 a = np.argmax(Q) 21 return xp.asarray(a, dtype=np.int8), max(Q) 22 #行動選択のεの値更新(下がるだけ) 23 def reduce_epsilon(self): 24 #最小値より多くて設定時間を超えていれば 25 if self.epsilon > self.epsilon_min and self.exploration < self.goal: 26 self.epsilon -= self.epsilon_decay

https://github.com/gallardo22/DQN-chainer

補足情報(FW/ツールのバージョンなど)

processing 3.4
python anaconda3-4.4.0
numpy 1.15.1
chainer 5.0.0(ニューラルネットワーク動かすためのもの)
pyautogui 0.9.38(キーボード操作、ディスプレイ内の画像検索するため)

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

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

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

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

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

guest

回答1

0

python

1import random 2import numpy as np 3 4def argmax_random_choice(list_): 5 #二次元以上のリストを渡したらここでエラーが起きる 6 max_value = max(list_) 7 max_value_indices = [i for i, v in enumerate(list_) if v == max_value] 8 return random.choice(max_value_indices) 9 10def boltzmann_distribution(array, temperature_parameter): 11 #本来は2次元以上でも計算可能ではあるが、実用的に使わなさそうなので、エラーを起こす 12 assert array.ndim == 1, "配列は1次元でなければならない" 13 14 if temperature_parameter == 0: 15 result = np.zeros([len(array)]) 16 result[argmax_random_choice(array)] = 1 17 return result 18 return array ** (1 / temperature_parameter) / np.sum(array ** (1 / temperature_parameter)) 19 20def boltzmann_random(array, temperature_parameter): 21 boltzmann_array = boltzmann_distribution(array, temperature_parameter) 22 random_value = random.uniform(0, 1) 23 threshold = 0 24 for i, value in enumerate(boltzmann_array): 25 threshold += value 26 if random_value < threshold: 27 return i 28 return i 29 30#行動価値 31array = np.array([0.5, 0.3, 0.2]) 32#temperature_parameter = 0であれば最大値のみを選択する 33action_index = [boltzmann_random(array, 0) for _ in range(10000)] 34print([action_index.count(i) for i in range(len(array))]) 35#temperature_parameterを大きくするほどランダム性が高まる 1であれば行動価値に応じた確率で行動を起こす 36action_index = [boltzmann_random(array, 1) for _ in range(10000)] 37print([action_index.count(i) for i in range(len(array))])

boltzmann_randomに一次元の行動価値の配列を渡して使います。

投稿2019/02/28 08:05

編集2019/02/28 08:34
puroko3

総合スコア185

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

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

退会済みユーザー

退会済みユーザー

2019/03/01 08:12

ご回答ありがとうございます。 ご提示いただいたプログラムはそのまま引用して使えるものでしょうか? NameError: global name 'boltzmann_distribution' is not defined のエラーが出てしまいます。
puroko3

2019/03/01 11:32

こちらでは動作確認は出来てます。 boltzmann_distributionを同じ場所に置いていますか? 後このコードには2点ほど問題がありますね。 行動価値が全て0である場合と行動価値にマイナス値が含まれている場合は、正しく動かないです。 0の方は完全にランダムで返すようにすればいいだけですが、マイナス値の方は、マイナスが含まれないようにスケールしなおす必要がありますね。
退会済みユーザー

退会済みユーザー

2019/03/08 07:37 編集

ご返信に気付けず申し訳ありません。 boltzmann_distributionを同じ場所に置くとはどういうことでしょうか? 行動価値についてのご意見ありがとうございます。 行動価値が0のときは return np.random.randint(0, 3), 0 でランダムに返すことはできていませんか?
puroko3

2019/03/09 03:47

boltzmann_randomを呼び出す時に、boltzmann_distributionを同じモジュールに置いていますか?という事です。 すいません、このコードというのは私が書いたコードの事です。
退会済みユーザー

退会済みユーザー

2019/03/09 15:35

ご返信ありがとうございます。 ・実際に使用する際にはいただいたコードをコピペして元のコードに貼っただけではできないということでしょうか? ・勘違いしていました。すいません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問