멀티 팔 터치 문제의 토대(탐색만 해당)

개시하다
강화 학습에서 가장 기본적인 다팔 접점 문제에 대해 저는 자신의 스타일을 정리하여 코드를 실시하려고 했습니다.첫 기고라 포맷 오류나 오류가 있을 수 있으니 부드러운 눈으로 봐주시기 바랍니다.
강화 학습 정보
기계학습에서는'교사 학습이 있다','교사 학습이 없다','강화학습'세 가지로 나눌 수 있다.

학습을 강화하는 것은 시스템 자체가 끊임없이 모색하는 과정에서 가장 좋은 시스템 제어를 실현하는 기계 학습 방법 중의 하나이다.이번에는'강화학습'에서 가장 기본적인 다팔 트리거 문제에 대한 프로그램을 써서 공유하고 싶습니다.
다팔 접점 문제의 구체적인 예
나는 팔이 달린 플러그 기계를 고려할 것이다.플레이어(기계)가 가장 돈을 잘 버는 기계 팔을 잡고 호랑이 기계에서 돈을 번다.하지만 플레이어(기계)는 어느 팔이 비교적 잘 맞는지 모른다.따라서 탐색(적당한 기계팔을 잡아보자)과 활용(지금까지 가장 잘 맞은 기계팔을 잡아보자)을 통해 장기적으로 돈을 버는 것(총보수의 최대화)은 내 마음속의 터치 문제에 대한 해석이다.이번에는 가장 간단한 탐색만 실시했다.

이번 상황에서 우리는 팔이 3개일 때의 촉점 문제를 고려할 것이다.문제의 설정으로 팔을 뽑으면 1,안 맞으면 0의 벨누이 테스트를 고려했다.위의 그림부터 세 팔의 슬롯으로 돌아가는 반환(평균 설정)p=[0.7,0.5,0.1].(여기에 명중 확률이 정해져 있지만 유저(기계)는 어느 팔이 비교적 명중하기 쉬운지 모른다.)즉시 실시하다.
import pandas as pd
import numpy as np
import random
import matplotlib.pyplot as plt
class bandit:
  #各スロットのアームの当たりやすさをprob,アーム(スロット)の個数をarmsとした。
  def __init__(self, arms = 3, prob = [0.7, 0.5, 0.1]):
    self.arms = arms
    self.prob = prob

  #arm番目のスロットを選択した時にあたりを引けるか
  def select(self, arm):
    if np.random.rand() < self.prob[arm]:
      return 1
    else:
      return 0
select는 랜덤으로 선택된arm 슬롯이 줄어들 때 보수를 되돌려주는 함수입니다.예를 들어 0번째(70%)의 기계 팔을 선택할 때if문의 왼쪽을 초과하면 1개의 보수를 받을 수 있다.
def estimate_means(bandit, steps):
  rewards = {}
  for arm in range(bandit.arms):
    rewards[arm] = []

  for _ in range(steps):
   #どのスロットのアームを取るか決める
    arm = np.random.randint(bandit.arms)
   #選んだアームが報酬をもらえるか
    reward = bandit.select(arm)
    rewards[arm].append(reward)

  average = []
  for arm in range(bandit.arms):
   #それぞれのアームの報酬が貰える確率を求める
    average.append(sum(rewards[arm])/len(rewards[arm]))

  return average, rewards
이어 각 팔의 확률과 보수를 계산했다.
Bandit = bandit()
result = []
for step in [1000,2000,3000,4000,5000]:
  estimates,rewards = estimate_means(Bandit,step)
  result.append(estimates)
이번에는 1천회, 2천회, 3천회, 4천회, 5천회 시행 횟수를 기록했다.
#5000回探索した時の結果
for i in  range(len(prob)):
  print(i,"番目が選ばれた回数",len(rewards[i]))
  print("報酬の合計",np.sum(rewards[i]),"\n")

##################################################################
0 番目が選ばれた回数 1671
報酬の合計 1149 

1 番目が選ばれた回数 1647
報酬の合計 844 

2 番目が選ばれた回数 1682
報酬の合計 166 
탐색을 5000회 했을 때의 총 보수와 각자의 팔이 몇 번 뽑혔음을 나타낸다.
결실
plt.figure(figsize=(10,6))
prob = [0.7, 0.5, 0.1]
arm = [0,1,2]
steps = [1000,2000,3000,4000,5000]
arm = np.array(arm)

color = ["b","g","r","y","pink"]
for i in range(len(result)):
  plt.bar( arm+0.075*i , result[i], color=color[i], width=-0.15, align="edge",alpha=1,label = steps[i])
plt.bar( arm-0.15 ,prob,color="purple", width=-0.15, align="edge",alpha=1,label = "mean")
plt.xlabel("select arm")
plt.ylabel("probability")
plt.hlines(0.7, -0.3, 2.5,color="black")
plt.hlines(0.5, -0.3, 2.5,color="black")
plt.hlines(0.1, -0.3, 2.5,color="black")
plt.legend(title = "steps")
plt.show()

모든 확실한 확률과 검색의 확률에 얼마나 큰 편차가 있는지 계산했다.다음 테이블은%입니다.
import math

result = np.array(result)
loss = []

for i in range(len(result)):
  loss = abs(result - prob) *100

loss = pd.DataFrame(loss,columns=prob,index=steps)
loss["sum"] = loss.sum(axis=1)
loss
##################################################################
           0.7        0.5         0.1           sum
1000    6.206897    2.941176    3.373860    12.521933
2000    1.320182    1.399116    0.120846    2.840144
3000    0.916335    4.571984    0.020661    5.508980
4000    0.499244    1.315789    0.610687    2.425720
5000    1.238779    1.244687    0.130797    2.614263
총결산
이번에는 탐색만 생각하는 단순한 다팔 터치 문제다.결론은 어느 플러그의 팔을 당기면 더 많은 보수를 받을 수 있는지 알았다는 것이다.학습을 강화하는 목적은 보수를 극대화하고 더 많은 보수를 받을 수 있는 팔을 조속히 발견하고 활용하기 위한 것이다.이번에는 유저(기계)가 보수를 극대화하는 플러그의 팔을 알고 있기 때문에 아래 기사에 활용법을 적고 싶다.

좋은 웹페이지 즐겨찾기