PPO의 하이퍼파라미터 메모 #2b: 배치 사이즈 & 버퍼 사이즈(연속 행동 공간)편

소개



PPO의 하이퍼파라미터를 여러가지 만지면 어떻게 되는지 실험의 메모. 지난번에 이어, 이번은 연속 행동 공간의 환경에서 PPO를 학습시킬 때의 배치 사이즈, 그리고 (이어서) 버퍼 사이즈에 대해.

Best Practices when training with PPO 라는 기사의 batchsize에 대한 지식의 요약을 재 게시 :
  • 배치 크기 (batch_size)는 경사 강하의 각 업데이트에 얼마나 많은 샘플을 사용하는지에 해당합니다
  • .
  • 배치 크기의 배수가 버퍼 크기 (buffer_size) 여야합니다
  • 행동 공간이 이산 할 때는 작고, 연속일 때는 큰 것이 좋다

  • 이전의 검증에서, 이산 행동 공간에 대해서는, 확실히 배치 사이즈는 작은 것이 좋다는 것을 알았다.
    이번에는 연속 행동 공간을 가진 Pendulum-v0에서 검증해 보겠습니다. 과연…

    실험



    update_interval (= 버퍼 크기)을 10240으로 고정하고 배치 크기를 16,64,256,512,1024,2048,5120,10240으로 바꾸어 실험해 보자.

    소스 코드도 마찬가지로 여기에서 빌렸다.
    argument로 변경하는 것은 --batchsize (와 저장 장소를 실험마다 변경하기 때문에 --outdir)이다.
    
        parser.add_argument('--gpu', type=int, default=0)
        parser.add_argument('--env', type=str, default='Pendulum-v0')
        parser.add_argument('--arch', type=str, default='FFGaussian',
                            choices=('FFSoftmax', 'FFMellowmax',
                                     'FFGaussian'))
        parser.add_argument('--bound-mean', action='store_true')
        parser.add_argument('--seed', type=int, default=0,
                            help='Random seed [0, 2 ** 32)')
        parser.add_argument('--outdir', type=str, default='results',
                            help='Directory path to save output files.'
                                 ' If it does not exist, it will be created.')
        parser.add_argument('--steps', type=int, default=10 ** 6)
        parser.add_argument('--eval-interval', type=int, default=10000)
        parser.add_argument('--eval-n-runs', type=int, default=10)
        parser.add_argument('--reward-scale-factor', type=float, default=1e-2)
        parser.add_argument('--standardize-advantages', action='store_true')
        parser.add_argument('--render', action='store_true', default=False)
        parser.add_argument('--lr', type=float, default=3e-4)
        parser.add_argument('--weight-decay', type=float, default=0.0)
        parser.add_argument('--demo', action='store_true', default=False)
        parser.add_argument('--load', type=str, default='')
        parser.add_argument('--logger-level', type=int, default=logging.INFO)
        parser.add_argument('--monitor', action='store_true')
    
        parser.add_argument('--update-interval', type=int, default=10240)
        parser.add_argument('--batchsize', type=int, default=64)
        parser.add_argument('--epochs', type=int, default=10)
        parser.add_argument('--entropy-coef', type=float, default=0.0)
    
    

    최적화 기법은 이전 결과에 따라 SMORMS3 (인수 없음)을 사용합니다.

    실험 환경


  • CPU : Intel Core i7-8700CPU @ 3.20Hz x 12
  • 메모리 : 32GB
  • 그래보: GeForce RTX2080Ti 11GB

  • 결과



    학습 곡선



    100 구간의 이동 평균을 취한 것.


    16~2048의 경우는 학습 횟수 $1.0\times 10^6$회 사이에 수렴하고 있는 것처럼 보인다.

    최고의 모델 성능



    best 모델로 10000회 달렸을 때의 누적 보수의 상자 수염도. 부정적인 보상이므로 위로 갈수록 좋습니다. 왼쪽이 전체, 오른쪽은 일부 확대도.


    이것을 보면, 가장 좋은 것이 1024일 때는 있지만, 작은 배치 사이즈도 충분한 성능을 내고 있는 것 같다.
    5120 이상은 안되는 모양.

    학습 시간



    오른쪽은 확대한 것. 당연한 이야기이지만 배치 크기를 줄이면 시간이 늘어납니다.

    버퍼 크기 실험



    이번에는 배치 크기를 1024로 고정하고 버퍼 크기 (chainerRL의 PPO에서 "update_interval")를 1024, 2048, 4096, 10240, 20480, 40960, 102400, 409600, 8192 비교해 보자.

    학습 곡선



    100 구간의 이동 평균을 취한 것.



    최고의 모델 성능



    best 모델로 10000회 달렸을 때의 누적 보수의 상자 수염도. 마찬가지로 부정적인 보상이므로 위로 갈수록 좋습니다. 왼쪽이 전체, 오른쪽은 일부 확대도.



    결론



    다시 한번, 전 기사의 이상 범위를 보자.

    Batch Size
    Typical Range (Continuous): 512 - 5120
    Buffer Size
    Typical Range: 2048 - 409600

    Pendulum-v0에서는 :
  • 배치 사이즈:$1024$가 베스트. $16\sim 2048$ 의 범위가 좋고, 그다지 큰 차이가 없다(전반 쪽이 학습이 빠르다). 그 이후에는 학습이 느려집니다.
  • 버퍼 사이즈:$4096$가 베스트. $ 2048\sim 20480 $ ($ batchsize\times 2\sim 20 $)의 범위가 좋고 그 이후에는 학습이 느려집니다.

  • 마음이 가면 계속됩니다.

    좋은 웹페이지 즐겨찾기