reinforcement-learning-kr / Unity_ML_Agents_2.0

Repository for implementing Unity ML-Agents 2.0
75 stars 31 forks source link

ml-agents강화학습에서 전처리 #49

Closed sunhyunM closed 1 year ago

sunhyunM commented 2 years ago

안녕하세요, 파이토치와 유니티ML-agents로 배우는 강화학습_책에서 질문 드립니다. DQN이나 A2C 알고리즘 내용을 보면 전처리 과정이 있는데 전처리가 어떨때 필요하며(목적지 관측정보가 있을 때만 필요한 것인지, 알고리즘에 따라 다른 것인지..) 책에는 Gridworld 환경에서의 예만 있어서, 일반적으로 어떻게 하는지 좀더 설명해주실 수 있을까요?

그리고 state의 관측정보는 환경의 dec.obs에서 가져오는 것 같은데 VISUAL_OBS=0, GOAL_OBS=1, VECTOR_OBS=2 이면 이러한 배열의 인덱스는 유니티 환경에서 어떻게 정해지는 것일까요? (다른 관측정보가 있는 경우 포함)

마지막으로 Gridworld 환경을 A2C로 학습할때 score는 -0.7정도에서 시작해 조금씩 올라가는데 비해 Actor loss 나 Critic loss는 크게 거의 변화가 없는 것으로 보입니다. loss값이 작아져야 학습이 잘 된것이라고 할 수 있을까요? 학습이 잘되기 위해 살펴봐야 하는 부분은 어떤 것일까요?

hyunho1027 commented 2 years ago

네, 안녕하세요!

  1. 전처리 필요 상황 데이터 전처리를 통해 네트워크 학습에 더 좋은 데이터가 되거나 네트워크의 입력 포맷에 맞춰주어야 할 때 주로 전처리를 진행하게 됩니다. 현재 GridWorld 환경에서 여러 전처리 방식이 존재하겠지만, 기존 DQN 네트워크를 수정 없이 바로 사용하기 위해 데이터를 전처리하여 네트워크 입력 포맷에 맞춰주었습니다.

  2. dec.obs 배열 @jk96491 께서 더 잘 답변해주실 것 같아 멘션드립니다~!

  3. 학습 진행상황 판단 지표 학습이 잘 진행되는지 확인하기 위해 score 그래프를 주로 참고합니다. 추가로 알고리즘마다 각각의 특성 지표를 참고하여 학습 진행상황을 판단하게 됩니다. 저는 A2C로 학습할 때 loss는 주로 0이되어서 더 이상 학습의 진전이 없을지 판단하는 용도로 사용하였습니다!

더 궁금한거 있으시면 편하게 물어봐주세요. 감사합니다 :)

sunhyunM commented 2 years ago

답변 감사합니다. 그런데, 한 에피소드가 종료되면 next_state = term.obs 가 되고 다음 에피소드로 넘어가야하는데 학습이 진행이 되다가 next_state = term.obs 이부분에서 인덱스 오류가 나며 다음 에피소드로 넘어가지 않습니다. 중간 실행을 하면서 확인해보면 state에 dec.obs가 넘어오고 > next_state >다 같은 형태로 넘어옵니다. 그런데 term.obs도 shape 은 같은데 인덱스 오류가 나며 done상태에서 다음 에피소드로 넘어가지 않는 걸까요?

jk96491 commented 2 years ago

답변이 늦어 죄송합니다. state정보의 dec.obs의 경우 유니티 내부에서 정보별로 enum으로 설정되어 있으며 해당 enum에 따라 정리되어 Agent에게 전달되기 때문에 "VISUAL_OBS=0, GOAL_OBS=1, VECTOR_OBS=2" 이런식으로 보내지게 됩니다. 다음 에피소드 넘어갈때 인덱스 에러 질문 관련하여 DecisionRequest의 문제 입니다. 에피소드 종료 신호를 보낼때 인스펙터 뷰에 DecisionRequest 를 추가했을 경우와 코드에 추가했을 경우 함수들 호출 순서에 차이가 있어 해당 오류가 발생하게 되고 이 부분은 현재 ML-Agent 상의 버그로 보여집니다. 따라서 코드상에 추가 해주시는것이 바람직해 보입니다.

sunhyunM commented 1 year ago

답변 감사합니다. 한가지 더 질문드리면 mlagents-learn으로 내장된 ppo코드를 사용하는 경우 network_settings에서 vis_encode_type: nature_cnn 또는 simple 이면 convolution 레이어를 쓰는것 같은데.. 그렇다면 내장 코드로 학습할때는 DQN에서 처럼 전체 화면 이미지를 입력으로 받아 학습하는 것일까요? 여기에 공유된 ppo코드에서 dense레이어들을 conv레이어로 바꿔 사용하기 위해 입력 state부분을 (DQN에서와 같은 방식으로)수정해봤지만 잘 되지 않고, 혹시 이미지데이터 입력이 아니어도 conv레이어를 써는 방법이 있는지 궁금합니다.

Kyushik commented 1 year ago

@sunhyunM 안녕하세요! 말씀하신대로 vis_encode_type의 경우 이미지 입력에 대한 인코딩을 위한 네트워크 구조 설정인 것으로 알고 있습니다. 제가 알기로는 카메라 설정을 통한 이미지 입력의 경우 이렇게 conv 연산을 통해 수행하고 벡터 입력의 경우는 dense 레이어로 연산하는 것으로 알고 있습니다. 이를 수정하기 위해서는 mlagents-learn과 연관된 코드를 직접 수정하거나 혹은 직접 python으로 코드를 짜서 진행해야 될지 않을까 생각합니다.

sunhyunM commented 1 year ago

입력에서 카메라 설정과 관련이 있었군요. 감사합니다.

sunhyunM commented 1 year ago

@Kyushik 안녕하세요, 답변주신데서 궁금한 것이..그럼 별도의 카메라 설정이 없이 빌트인 PPO로 학습할때 네트워크를 cnn 으로 하면(기본 설정) ml-agents 에서 이미지입력까지 처리가 되는 것일까요?

Kyushik commented 1 year ago

@sunhyunM 안녕하세요! 만약 환경에서 이미지 정보를 보내고 mlagents-learn의 yaml에 cnn이 설정되어 있으면 이미지 입력까지 처리하는 것으로 알고 있습니다. 말씀하신 "별도의 카메라 설정 없이"라는 말씀이 유니티로 환경을 만들때 카메라를 통한 이미지 입력 관련 설정을 하지 않은 것을 말씀하시는 걸까요? 이런 경우는 환경에서 카메라 정보 자체가 넘어오지 않기 때문에 이미지 관련 처리는 되지 않습니다!

sunhyunM commented 1 year ago

안녕하세요, 책 내용과 관련해 두가지 질문이 있어 다시 찾았습니다. -92페이지 'num_epoch값이 클수록 안정적으로 학습하지만 학습이 느려진다'고 되어 있는데 공식문서에는 'Decreasing this will ensure more stable updates, at the cost of slower learning.'로 내용이 다른것 같아 혼동이됩니다..

-179페이지 도식에서 입력 상태는 입력으로 들어가는 여러 상태들가운데 한가지 상태를 예로들어 크리틱네트워크에서는 그 상태의 가치, 액터네트워크에서는 그 상태의 행동확률이 나온다는 의미일까요?가치출력이 1개로 되어 있다보니 헷갈려서요. 실제코드에서는 여러개의 s값이 어레이로 들어가고 각각의 s에 대한 가치함수, 정책이 출력되는 것이 맞겠지요? 그리고 크리틱 네트워상태가치가 아닌 Q함수로 출력되는 경우 액터신경망과 어떤 차이가 없어보이는데 실제 구현부에서 어떤 차이가 있는 것일까요?

Kyushik commented 1 year ago

@sunhyunM 안녕하세요! 우선 첫번째 질문에 대한 답변 드립니다! 말씀해주셔서 저도 방금 다시 공식 깃허브 확인해봤는데 그렇게 되어 있네요! PPO에서 데이터를 수집하고 해당 데이터를 설정한 epoch 만큼 학습하는거라 epoch의 값이 클수록 많은 데이터에 대해서 학습을 수행하기 때문에 더 안정적으로 학습이 되지만 학습 속도는 느려질 것이라고 생각해서 책의 내용을 그렇게 작성했었는데요! 동일하게 buffer size의 경우에도 해당 값이 커질수록 학습에 대한 양이 많아지기 때문에 안정적으로 학습이 된다고 나오기도 하구요! 일단은 공식 문서의 내용과는 다르지만 저는 이렇게 생각합니다! 단 제가 잘못 생각하고 있는 부분이 있을수도 있으니 참고 부탁드릴게요!

hyunho1027 commented 1 year ago

@sunhyunM 안녕하세요, 두번째 질문에 대한 답변을 드리겠습니다.

감사합니다.