강화 학습 in Julia

이 기사는 fusic 어드벤트 캘린더 2 23 일째 기사입니다.

fusic에서는 얼마 전까지 Python에서 배우는 강화 학습의 초록책의 윤독회를 하고 있었습니다.
그런 가운데, 「나ー 응인가 Julia로 강화 학습의 패키지 네ー 카나ー」라고 주로 언제나, 조사해도 무엇이 좋은지 모르는 상태가 계속되었습니다.

원래 Julia를 만지고 있는 것이 당사에서 자신만이므로, 들려도 좋은 대답은 돌아오지 않습니다.

귀찮게, Julia slack workspace 할 수 있던.
그렇게 생각해 왔습니다.

Q: 「강화 학습을 지금 공부하고 있습니다만, 뭔가 좋은 패키지 없으면?」

A: 「 ReinforcementLearning.jl 라든지 좋다고 생각해!

상냥하게 가르쳐 주셨습니다.
모처럼 가르쳐 주었으므로, 이 녀석을 이번 조금 만져 보았습니다.
입문편이라고 하는 것으로!

CartPole



어쩌면 가장 유명할 것입니다.
대차에 세워진 막대기를 쓰러뜨리지 않도록 좌우로 움직이는 게임입니다.

이 환경에 대해 이미 이 패키지에 포장되어 있는 심층 강화 학습을 사용해 실천해 봅시다!

패키지 가져오기


using ReinforcementLearning, ReinforcementLearningEnvironments, Flux

위에서 쓴대로 Flux를 사용합니다. 위의 패키지를 추가하십시오.

환경 정보



env = CartPoleEnv(;T=Float32)
ns, na = length(observation_space(env)), length(action_space(env))  # (4, 2)

device = :cpu
  • 상태 공간
  • 위치
  • 속도
  • 각도
  • 각속도
    네 가지가 있습니다.


  • 그래서 행동에 관해서 말하면 오른쪽인지 왼쪽인지 밖에 없기 때문에 2가 설정되어 있습니다.

    레이어 정의


    layer1 = Dense(ns, 128, relu)
    layer2 = Dense(128, 128, relu)
    layer3 = Dense(128, na)
    neural_network_q = NeuralNetworkQ(model = Chain(layer1, layer2, layer3),
                                      optimizer = ADAM(),
                                      device = device)
    

    3층의 네트워크에 128이 노드를 연결시키고 있습니다.
    4개의 행동으로부터, 왼쪽인지 오른쪽인지를 판단하기 위해, 4:128:2 의 순서로 연결합니다.

    전략과 보상


    ϵ_selector = EpsilonGreedySelector{:exp}(ϵ_stable = 0.01, decay_steps = 500)
    
    q_base_policy = QBasedPolicy(learner = BasicDQNLearner(approximator = neural_network_q,
                                                           batch_size = 32,
                                                           min_replay_history = 100,
                                                           loss_fun = huber_loss),
                                 selector = ϵ_selector)
    

    ε-greedy 방법을 선택합니다.

    에이전트 정의


    circular_risa_buffer = circular_RTSA_buffer(capacity = 1000,
                                                state_eltype = Float32,
                                                state_size = (ns,))
    agent = Agent(
        π      = q_base_policy,
        buffer = circular_risa_buffer
    )
    
    

    buffer에 대해서는 어쩐지 잘 모르겠지만 Policy를 개선하기 위해 Agent와 환경을 오가는 것도 싶습니다.


    이런 느낌인 것 같습니다.

    학습해 보겠습니다.


    hook = ComposedHook(
        TotalRewardPerEpisode(),
        TimePerStep()
    )
    
    run(agent, env, StopAfterStep(10000; is_show_progress=true); hook = hook)
    
    Progress: 100%|███████████████████████████████████████████████████████████████| Time: 0:00:11
    

    hook에 보상과 학습 시간을 저장합니다.
    자신의 환경이라면, 대략 11초 정도로 끝났습니다. 빠르네요.

    천이를 가시화하면 이런 느낌입니다.
    using Plots
    plot(hook[1].rewards, xlabel="Episode", ylabel="Reward", label="")
    



    50 에피소드를 넘었을 정도로 만점을 취하고 있습니다.
    흠, 어쩐지 과학하고 있다고 생각합니다만.

    Note



    ReinforcementLearning.jl을 정상적으로 설치해도 불가능했습니다.
    master 브랜치에서 떨어뜨리자.using Pkg; Pkg.add(PackageSpec(name="ReinforcementLearning", rev="master"))로 할 수 있습니다.

    감상



    자신의 강화 학습에 대한 이해가 얕기 때문에, 지금은 이해할 수 없는 부분도 많았습니다.
    문서가 풍부,,, 라고는 말하기 어렵습니다만, 샘플도 있고, 개발 도중같기 때문에, 워치 해 갈까라고 생각합니다.
    감사합니다. 가르쳐 준 Julia의 사람이야.

    결과





    응? ww
    아마 좋지 않을까. 미안해.
    배우지 않으면.

    좋은 웹페이지 즐겨찾기