반응형

Q-Learning에서 learning rate가 작아지면 새 경험을 반영하는 속도가 느려져, 같은 반복 횟수 안에서는 수렴이 부족해 보일 수 있습니다.

이 글은 learning rate가 1일 때와 더 작은 값일 때 Q-value가 어떻게 다르게 갱신되는지 로그로 비교한 실험 메모입니다.

 

핵심 정리

learning rate는 기존 Q-value를 얼마나 유지하고 새로 계산한 값을 얼마나 반영할지 정하는 계수입니다. 값이 크면 최근 경험이 빠르게 반영되지만 흔들림도 커질 수 있고, 값이 작으면 안정적일 수 있지만 충분한 반복이 없으면 새 환경으로 이동하는 속도가 느립니다. 이 글의 핵심은 단순히 두 결과가 비율대로 섞인다고 생각하면 안 된다는 점입니다. 경로 길이, 큰 보상 값, 업데이트 순서, 반복 횟수가 함께 작용해 특정 Q-value가 예상보다 빠르거나 느리게 바뀔 수 있습니다.

  • learning rate는 새 Q-value 업데이트를 얼마나 강하게 반영할지 정합니다.
  • 값이 작으면 같은 반복 횟수에서 학습 변화가 부족해 보일 수 있습니다.
  • 값이 1이면 새 계산값을 강하게 반영하므로 빠르게 바뀝니다.
  • 두 실험 결과가 단순 평균처럼 섞인다고 보면 오해가 생깁니다.
  • 보상 크기와 업데이트 순서는 수렴 속도에 큰 영향을 줄 수 있습니다.
  • 수렴 여부를 보려면 반복 횟수, Q-value 변화, 선택 path를 함께 확인해야 합니다.

원문은 실행 로그가 길고 핵심 관찰이 뒤쪽에 나옵니다. 이번 보강은 learning rate가 기존 값과 새 값을 섞는 역할이라는 점을 먼저 설명하고, 왜 작은 학습률에서 수렴이 부족해 보이는지 읽는 기준을 세웠습니다.

이어서 볼 글

 

learning rate 가 1.0일때는 4000이면 수렴하는 것도, learning rate가 그 보다 작으면 수렴하지 않는 문제

예를 들어 다음 코드를 보자.


    run("first", 1)
    run("second", 1)

실행시키면 다음처럼 수렴을 잘 한다.


cur state : (0, 0, 1)
[(((0, 0, 0), (1, 50, 2)), 500000.0), (((0, 0, 0), (1, 40, 2)), 600000.0), (((0, 0, 0), (1, 30, 2)), 700000.0), (((0, 0, 0), (1, 20, 2)), 800000.0), (((0, 0, 0), (1, 10, 2)), 900000.0), (((0, 0, 0), (1, 0, 2)), 1000000.0)]
...
[1][1] t:[0], c: 500,000, p1:(0), p2:(0), path: [(0, 0, 1), (1, 50, 2), (2, 50, 2), (3, 50, 2), (4, 50, 2), (5, 50, 2), (6, 50, 2), (7, 50, 2)]
...
cur state : (0, 0, 1)
[(((0, 0, 0), (1, 0, 2)), 500000.0), (((0, 0, 0), (1, 10, 2)), 700000.0), (((0, 0, 0), (1, 20, 2)), 900000.0), (((0, 0, 0), (1, 30, 2)), 1100000.0), (((0, 0, 0), (1, 40, 2)), 1300000.0), (((0, 0, 0), (1, 50, 2)), 1500000.0)]
...
[1][2] t:[0], c: 500,000, p1:(0), p2:(0), path: [(0, 0, 1), (1, 0, 2), (2, 0, 2), (3, 0, 2), (4, 0, 2), (5, 0, 2), (6, 0, 2), (7, 50, 2)]

그런데 learning rate를 0.5로 변경하면, 다음처럼 "second"를 학습하는데 있어서 수렴이 부족해 보인다.


    run("first", 1)
    run("second", 2)

...
[(((0, 0, 0), (1, 0, 2)), 504211.6016819117), (((0, 0, 0), (1, 10, 2)), 700192.0472732983), (((0, 0, 0), (1, 20, 2)), 900000.0037342851), (((0, 0, 0), (1, 30, 2)), 1100000.0), (((0, 0, 0), (1, 40, 2)), 1300000.0), (((0, 0, 0), (1, 50, 2)), 1500000.0)]
...
[2][2] t:[0], c: 500,000, p1:(0), p2:(0), path: [(0, 0, 1), (1, 0, 2), (2, 0, 2), (3, 0, 2), (4, 0, 2), (5, 0, 2), (6, 0, 2), (7, 50, 2)]

이 과정에서 Q[(0,0), (1,0)]는 1000000.0(백만원)에서 504211.6016819117로 떨어지고,

Q[(0, 0), (1, 50)]는 500000.0에서 1500000.0로 올라가는 드라마틱한 변화를 거치게 되는데..

당황스러운 사실은 다음 세 가지 이다.

1. 각각이 수렴된 상황에서 learning rate 비율대로 합성되는게 아니다.

> 즉 0.5로 설정해서 각각이 0.5비율대로 합성된다면 Q[(0,0), (1,0)]의 경우 1,000,000과 500,000의 중간인 750,000이 되어야 하지만 위의 결과를 보면 그게 아니라 504,221로 0.5보다 훨씬 높은 비율로 후자쪽으로 기울었다.

2. v가 큰값의 경우 수렴속도가 v가 작은 경우보다 빠르다.

> 이건 뭔말이냐면 Q[(0,0), (1,50)]은 이미 "second"의 값으로 수렴이 진즉에 끝났는데,

> Q[(0,0), (1,0)]은 아직 수렴중이라는 사실이다.

3. t가 큰값의 경우 수렴속도가 t가 작은 경우보다 빠르다.

반응형

+ Recent posts