DRL에서의 디버깅 방법, 하이퍼파라미터 설정
사실 DRL은 디버깅 과정이 과학이라기보다는 예술에 더 가깝다.
디버깅을 잘하려면 딥 러닝 소프트웨어의 특이한 점들과 수치 계산, 그리고 하드웨어에 대해 직접 무언가를 해보면서 경험을 많이 해볼 필요가 있다.
난이도가 높은 프로젝트에서는 언제나 그렇듯이, DRL을 작동시키려면 엄청난 끈기가 필요하다.
디버깅의 주요 목적은 실패의 근본적인 원인 탐색이다.
디버깅 과정은 본질적으로 문제 해결의 과정이며 오류가 의심되는 다양한 부분을 체계적으로 확인하면서 오류를 찾아내는 과정이다.
여기서 중요한 것은 체계적으로 한다는 것이다. 오류라고 추측되는 의심스러운 부분들을 오류 가능성이 높은 순으로 나열해 놓고, 가능하면 독립적으로 하나씩 테스트해야 한다.
테스트가 실패할 때마다 오류 의심 항목을 하나씩 지우면서 다음 항목을 테스트하는 것이다.
아마도 이렇게 하면 빠른 시간 안에 근본적인 원인을 찾을 수 있을 것이다.
생존 신호
DRL 알고리즘이 제대로 작동하고 있는지 확인하기 위해서는 기본적인 생존 신호를 확인할 필요가 있다.
- total reward
- 에피소드 길이
- lr, epsilon (점차 감소시킬 경우)
보상의 총합
- 가장 간단한 지표는 total reward와 그것의 이동평균이다.
- 제대로 작동하고 있는 알고리즘이라면 무작위로 선택된 에이전트보다 더 높은 보상을 얻어야 한다.
- 만약 랜덤 에이전트와 같거나 더 적은 보상을 받고 있다면 알고리즘이 제대로 작동하지 않는 것이다.
에피소드 길이
- 시간 단계의 개수가 알고리즘의 성공에 영향을 미친다면 에피소드 길이를 확인해보는 것이 좋다.
- 빠른 실행이 알고리즘에 중요한 요소라면 짧은 에피소드가 더 바람직하고,
- 알고리즘이 처리하는 작업이 많은 단계로 이루어져 있다면 에피소드의 길이가 길수록 더 좋다.
학습률(learning rate) 감쇠, 입실론-탐욕 정책의 입실론 감쇠
- 만약 학습률이나 입실론이 시간에 따라 decay된다면, 적절히 감쇠하고 있는지 확인하기 위해 값을 출력해서 보기도 해야 한다.
- 예를 들어, 입실론 탐욕 정책의 입실론 변수가 어떤 버그 때문에 감소하지 않는다면 알고리즘은 항상 무작위로 선택된 행동을 도출할 것이다.
정책 그라디언트에 대한 진단
엔트로피
- Policy Gradient Method의 경우에도, 정책에 특화된 변수들을 모니터링할 수 있다.
- 이 변수들은 행동 확률분포의 엔트로피\ 같은 것으로부터 계산할 수 있는 값들이다.
[정보 이론] 정보량, 엔트로피와 Cross Entropy의 정의
딥러닝을 학습하며 "크로스 엔트로피 오차"를 아무렇지 않게 사용하고 있었다.그런데 최근 논문을 탐색하면서, "크로스 엔트로피"라는 용어의 정의를 생각보다 엄밀하게 규정해두지 않아 개념
dev.go-gradually.me
- 대개는 훈련을 시작할 때 정책이 무작위 분포로 주어지기 때문에 행동 확률분포의 엔트로피는 이론적인 최댓값에 가까워야 하는데 실젯값은 행동 공간의 크기와 유형에 따라 달라질 것이다.
- 행동 엔트로피가 감소하지 않는다면 이것은 정책이 여전히 무작위 분포이며 아무런 훈련도 이루어지지 않는다는 것을 의미한다.
- 반대로 경험칙에 따르면, 에이전트가 정책을 학습하는 데 보통 백만 번의 시간 단계가 걸린다고 할 때 처음 1,000번의 시간 단계 동안 행동 확률의 엔트로피가 급격히 감소한다면 에이전트가 학습하는 정책은 좋은 정책이 아닐 가능성이 매우 높다.
확률
- 행동 확률이나 로그확률은 행동 확률분포의 엔트로피와 밀접하게 관련되어 있다.
- 이것은 행동이 선택될 확률을 나타낸다.
- 훈련이 시작할 때는 행동 확률이 균일한 무작위 분포에 가까울 것이다.
- 에이전트가 더 나은 정책을 학습하면서 행동은 좀 더 정교하게 선택될 것이다.
KL Divergence(KL 발산)
- 정책 업데이트의 '크기'를 나타내는 KL 발산 또한 중요하다.
[정보 이론] KL Divergence (KL 발산) - 크로스 엔트로피를 쓰는 이유
어떤 데이터의 확률밀도함수 p(x)가 있다고 하자.이 함수를 정확히 알 수 없어서 이 함수를 근사적으로 추정한 확률밀도함수 q(x)를 사용한다고 가정하자.그러면 실제 분포인 p(x)로 얻을 수 있는
dev.go-gradually.me
- KL 값이 작으면, 정책 업데이트에 따른 정책의 변화 역시 작다는 뜻이다.
- KL이 갑자기 매우 커지면, 이는 성능붕괴를 유발할 수 있을 정도로 큰 정책 업데이트가 방금 발생했음을 나타낸다.
- 이는 PPO가 정책 ratio를 클리핑하는 방식으로 완화하고 있기도 하다.
데이터에 대한 진단
- 데이터의 정확성은 중요하다.
- 특히 에이전트와 환경 사이에 전달되는 정보가 많은 변환을 거친다면 더욱 중요하다.
- 데이터에 대한 디버깅을 수작업으로 하는 것(Manual Debugging)은 보통 매우 유용하다.
숫자의 경우
- 행동과 보상과 같은 숫자의 경우, 그 값들을 출력해봄으로써 직관을 얻을 수 있다.
- 변수의 패턴을 파악하고 나면 직관이 생기기 시작할 것이다.
이미지의 경우
- 이미지의 경우에는, 이미지를 렌더링해서 살펴보는 것이 좋다.
- OpenCV같은 라이브러리를 활용해서 이미지를 렌더링해보자.
전처리
- 환경으로부터 나오는 상태와 보상은 에이전트의 메모리에 저장되거나 훈련에 사용되기 전에 보통 전처리 과정을 거친다.
- 대표적으로 발생할 수 있는 실수
- 이미지 채널 순서 규칙
- (폭,높이,채널)과 같은 순서가 변경된 경우
- 데이터의 시간 순서가 반대로 된 경우
- 이미지 채널 순서 규칙
메모리
- 데이터의 형태와 type이 일치하는지 확인하자.
- 데이터의 순서도 확인하자.
- On-Policy의 경우, 훈련 단계가 끝날 때마다 메모리가 정상적으로 초기화되는지 확인 또한 필요하다.
- On-Policy에서 한번 사용한 데이터는 쓰고 버려야 한다.
알고리즘 함수
데이터의 생성과 저장에 오류가 없다면, 데이터를 사용하는 주요 알고리즘 함수를 디버깅할 필요가 있다.
- 벨만 방정식
- GAE
- V (상태 가치) 함수
- Q (행동 가치) 함수
이와 같은 함수는 손으로 계산한 결과와 구현한 코드의 결과가 같은지를 확인하는 empirical unit test가 이루어져야 한다.
pytest, pytorch, numpy 모두 좋은 근사값을 검사하는 테스트 도구를 제공한다.
보통 발생하는 오류는 다음과 같다.
- 배열 인덱스 이슈
- 수치적 오류
- 코너 케이스
신경망
강화학습 알고리즘이 학습에 실패할 때, 의심해 볼 만한 부분은 신경망이다.
신경망에 대해선 다음과 같은 것들을 출력해봐야 한다.
- 활성화 함수
- 입-출력 차원
- 신경망 파라미터 초기화
- 입-출력 값의 범위
- Regularization
- Normalization
- 기울기 폭발
- Gradient Clipping
- etc.
- 신경망 파라미터의 업데이트 실제로 확인하기
- 파라미터가 변하지 않은다면, 계산 그래프(computation graph)를 확인해야 한다.
그럼 A2C와 같은 구조에서는 어떻게 하나 싶을텐데, 이럴땐 그냥 단순히 다른 손실 함수를 해제하고 훈련을 몇 단계 실행해보자.
가치 손실을 제외한 상태에서 훈련을 실행해서 네트워크가 정책 손실로부터 업데이트되고있는지 확인하고,
정책 손실을 제외한 상태에서 훈련을 실행해서 네트워크가 가치 손실로부터 업데이트되고있는지 확인하자.
알고리즘 간소화
복잡한 알고리즘은 버그를 낳는다.
기능은 최소 단위로 추가되어야 하며, 한번에 다 하려고 하면 안된다!
예를 들어, 다음과 같은 구조를 통해 기능을 추가해나갈 수 있다.
- REINFORCE를 구현한다.
- REINFORCE로부터, A2C를 구현한다.
- A2C로부터 PPO를 구현한다.
이렇게 하면 정확히 문제가 어디서 발생했는지 검사할 수 있다.
문제 간소화
처음부터 복잡한 문제를 풀려고 하지 말자.
먼저 카트폴과 같은 간단한 문제부터 풀어보자.
물론 이러면 '간단한 문제에서 잘 동작하던 알고리즘이 복잡한 문제에서도 잘 동작한다'라는 보장은 없기 때문에 무의미해보일 수 있다.
근데 잘 생각해보자.
- 카트폴은 4개의 성분을 갖는 소규모 상태를 사용한다.
- 아타리 문제는 상태 + DNN과 이미지 전처리를 요구한다.
즉, 아타리 문제를 풀더라도 카트 폴에 들어있던 기능들에 대한 디버깅은 해야 한다.
문제는 잘게 쪼갰을 때 풀기 쉬워짐을 명심하자.
하이퍼파라미터
DRL은 하이퍼파라미터에 매우 민감할 수 있지만, 우리는 일반적으로 이미 존재하는 알고리즘을 구현한다.
그리고 보통은 연구 논문이나 다른 구현 결과에서 잘 작동하는 하이퍼파라미터를 참고할 수 있다.
하이퍼파라미터 튜닝은 굵직한 버그를 모두 수정하고 나서, 그 이후 조금씩 하이퍼파라미터를 튜닝하자.
본 글은 단단한 심층강화학습 도서를 참고하여 작성되었습니다.
단단한 심층강화학습 - 예스24
심층강화학습의 확고한 기반을 다지기 위한 완벽한 방법!이 책은 이론과 실무적 내용을 독특하게 결합한 심층강화학습 소개서다. 직관적인 설명에서 시작하여 심층강화학습 알고리즘에 대한
www.yes24.com