Security || AI

[강화학습] 2. 멀티암드 밴딧 문제(muti-armed bandit) 본문

AI/강화학습

[강화학습] 2. 멀티암드 밴딧 문제(muti-armed bandit)

보안&인공지능 2021. 1. 28. 01:44

강화학습 공부 1일차 2020.01.27

 

강화학습의 기본 문제인 멀티암드 밴딧 문제는 n개의 손잡이가 달린 밴딧에서 어떤 손잡이를 잡았을 때

가장 높은 보상을 제공하는 손잡이를 찾아내고, 앞으로도 항상 이 손잡이를 선택하게 하는 문제이다.

 

2021/01/27 - [AI/강화학습] - [강화학습] 강화학습의 기본 개념들

멀티암드 밴딧 문제는 강화학습 3요소(위의 글 참조) 중 행동 의존성만 고려하면 되므로 기초로 풀기 좋다.

 

멀티암드 밴딧 문제 

정책

멀티암드 밴딧 문제를 풀 때 정책이라는 개념을 알아야 한다.

정책은 주어진 환경의 어떤 상황에서 어떤 에이전트가 취하게 되는 일련의 행동을 말한다. 이때, 에이전트가 주어진 환경 내에서 최대의 보상을 얻을 때, 이를 최적의 정책이라고 한다.

 

정책 경사

정책 경사는 분류(Classification) 문제를 풀 때 사용된다.

어떠한 상태에서 어떠한 행동을 결정하는 것이 가장 좋을지를 판단하는 것이다.

 

 

멀티암드 밴딧 문제 코드 및 풀이

첫 실습이라 모르는 코드가 많아 차근차근 코드를 분석해 보기로 하였다.

 

tensorflow slim은 tensorflow의 네트워크 모델을 더욱 간결하고 쉽게 만들 수 있게 해준다.

 

4개의 손잡이를 가지는 밴딧을 정의한다. 이 때, 인덱스 3(값이 -2인 것)이 가장 자주 양의 보상을 제공하도록 만든다.

여기서 np.random.randn(1)은 표준정규분포에서 샘플링된 난수를 반환한다.

 

해당 코드에서는 에이전트의 신경망을 구현하게 된다.

보상과 선택된행동을 네트우어크에 피드해주고, 비용을 계산한 다음 비용을 이용해 네트워크를 업데이트 해야한다.

tf.reset_default_graph()는 기존에 생성된 graph를 모두 삭제한다.

Variable 함수는 모델의 파라미터들을 저장할 변수들 의미한다. 여기서 ones는 모든 원소의 값을 1로 만들어 준다.

tf.nn.softmax(weights)는 소프트맥스 알고리즘을 사용하게 된다. (W*x + b)

placeholder() 함수는 다양한 데이터를 입력 받아 처리할 수 있게 만들어 준다.

AdamOptimizer 함수는 목적 함수의 최소값을 찾는 것이다.

import tensorflow as tf
import tensorflow.contrib.slim as slim
import numpy as np

bandit_arms = [0.2,0,-0.2,-2]
num_arms = len(bandit_arms)

def pullBandit(bandit):
	result = np.random.randn(1)
	if result > bandit:
		return 1
	else:
		return -1


#에이전트 신경망
tf.reset_default_graph()

weights = tf.Variable(tf.ones([num_arms]))
output = tf.nn.softmax(weights)

reward_holder = tf.placeholder(shape=[1], dtype=tf.float32)
action_holder = tf.placeholder(shape=[1], dtype=tf.int32)

responsible_output = tf.slice(output, action_holder, [1])
loss = -(tf.log(responsible_output)*reward_holder)
optimizer = tf.train.AdamOptimizer(learning_rate=1e-3)
update = optimizer.minimize(loss)

#에이전트 학습
total_episodes = 1000
total_reward = np.zeros(num_arms)

init = tf.global_variables_initializer()

with tf.Session() as sess:
	sess.run(init)
	i = 0
	while i < total_episodes:
		actions = sess.run(output)
		a = np.random.choice(actions, p=actions)
		action = np.argmax(actions == a)

		reward = pullBandit(bandit_arms[action])

		_,resp,ww = sess.run([update, responsible_output, weights],\
			feed_dict={reward_holder:[reward], action_holder:[action]})

		total_reward[action] += reward
		if i%50 == 0:
			print("Running reward for the "+str(num_arms)+" arms of the bandit: "+
				str(total_reward))

		i+=1

	print("\nThe agent thinks arm "+str(np.argmax(ww)+1)+" is the most promissing....")

	if np.argmax(ww) == np.argmax(-np.array(bandit_arms)):
		print("...and it was right")
	else:
		print("...and it was wrong!")

 

실행 결과

4번째 손잡이의 reward가 276인 것을 통해 제대로 수행한 것을 볼 수 있다.

반응형

'AI > 강화학습' 카테고리의 다른 글

[강화학습] A3C의 개념, 장점, 구조  (0) 2021.02.16
[강화학습] 1. 강화학습의 기본 개념들  (0) 2021.01.27