BC(Behavioral Cloning)알고리즘
⚬ 정의 모방학습의 한 종류로써 사람의 데이터를 기반으로 사람의 행동을 모방하도록 하는 기초적인 알고리즘이다. 강화학습: 에이전트가 환경에서 직접 시행착오를 겪으면서 보상을 최대화하는 방향으로 학습 모방학습: 전문가가 직접 환경을 플레이한 데이터를 통해 전문가가 취한 행동을 모방하도록 학습
⚬ 기법 보상이 음수인 데이터 제외하기 -BC는 전문가의 데이터를 그대로 모방하기 때문에 음수(나쁜 경험) 데이터를 제외하고 나머지 데이터를 학습에 사용
Dropout 오버피팅 문제를 해결하는 기법 중 하나로, 네트워크 연산을 수행할 때 일정 비율의 노드를 선정하여 출력을 0으로 도출하여 노드와 학습되는 가중치가 연산마다 랜덤하게 달라지는 방식으로 오버피팅을 방지 -overfitting: 머신러닝 알고리즘 학습할 때 생길 수 있는 문제 중 하나로, 학습 데이터에 대해 너무 과도하게 학습된 새로운 데이터에 대한 추정 성능이 떨어지는 것
→ 같은 입력에도 조금씩 다른 결과를 도출하게 되어 약간의 탐험을 수행하는 것 같은 다양한 결과를 확인 가능
⚬ 학습 지도 학습 방법으로 매 상태에 대해 점문가가 취한 행동을 모방하도록 학습 손실함수는 Cross Entropy를 사용하고 이를 최소화하는 방향으로 학습
코드 구현
//라이브러리 불러오기
demo_to_buffer: demonstration파일에서 정보를 읽어 buffer로 변환하는 함수
BufferKey: buffer에서 특정 정보를 불러오는 Key를 관리하는 enum 클래스
ObservationKeyPrefix: buffer에서 관측 정보를 불러오는 Key를 관리하는 enum 클래스
데이터 처리 과정[자료 참고5]
//파라미터 값 설정
state_size = 12 * 4: BC 에이전트의 입력으로 사용할 상태의 크기
Observation size(12) * stack size(4)
Observation 요소
[0]: 카트의 현재 속도
[1]: 카트 진행 방향과 다음 목적지까지의 벡터 사이의 내적
[2~10]: Raycast 정보
[11]: 가속 여부(가속중=1, 아닌 경우=0)
action_size: BC 에이전트의 출력으로 사용할 행동의 크기
action 정보 - 조향제어(좌, 우) [-1,1]
train_epoch: 지도학습 Epoch 횟수
demo_path: Demonstration 파일 경로
//Agent 클래스
**init**(self) - Agent클래스의 인스턴스가 생성될 때 실행
actor: Actor 클래스에서 정의한 네트워크
optimizer: Adam 옵티마이저 사용
witer: tensorboard에 진행상황 기록을 위해 사용
get_action(self, state, training=False) - 에이전트의 행동을 선택하는 함수
네트워크 모드 설정:
train 함수로 학습모드 설정
action 계산 및 출력
train_model(self, state, action) - 지도학습을 진행[참고 자료5]
losses리스트 초기화(epoch 안에서 얻는 loss 값 저장을 위해 초기화)
torch.randperm(): 미니 배치 학습에 사용할 인덱스 생성
랜덤 인덱스를 배치 사이즈만큼 슬라이싱한 인덱스를 이용하여 _state, _action 계산
_state를 이용하여 action_pred 구하고 _action과 MSE loss를 구하기
손실함수 값을 통해 actor 네트워크를 옵티마이저 함
얻은 손실함수 값을 losses에 추가
모든 데이터를 사용할 때까지 반복한 후, 손실함수 값의 평균을 리턴
//Main함수
Actor 클래스에서 정의한 네트워크와 BC 에이전트에서 정의한 다양한 함수들을 이용해 학습을 진행하고 유니티 환경과 통신하며 플레이하는 함수[자료 참고7]
Agent 설정
agent: BCAgent 객체 생성
Demonstration 정보 가져오기(학습모드):
-demo_buffer: demo_path에서 가져온 demonstration 정보
-demo_buffer.fields.keys(): demonstration에 저장된 필드들의 키 정보
Demonstration 정보들을 tensor로 변환:
demo_to_tensor(): key를 입력받아 demo_buffer에서 해당 정보를 tensor로 변환하여 출력하는 함수→해당 알고리즘에서는 state, action, reward, done 사용
반환값 계산:
-reward, done 정보를 이용해서 반환값 계산
-반환값이 0보다 큰 state, action 쌍만 학습에 사용 → Negative한 데이터는 학습에서 제외시키기 위함
전처리 된 state, action을 통해 지도학습 시작:
-losses 초기화
-agent.train_model에 state, action을 입력하여 학습 진행
-losses에 매 epoch 정보 추가
진행상황 출력 및 기록, 네트워크 모델 저장:
-print_interval 주기 마다 진행상황 출력 및 기록
-saved_interval 주기 마다 네트워크 모델 저장
유니티 빌드 환경에서 Play 시작:
-학습을 마친 에이전트를 통해 play 시작
-유니티 환경과 상호작용하는 시퀀스는 기존과 동일
<BC를 활용한 Kart학습 과정>
Tensorboard 해석: 초기에는 loss가 빠르게 감소하며 모델이 전문가 행동을 빠르게 학습했고, 이후로는 점진적으로 수렴하며 안정적인 성능을 보였다. train과 validation 간 차이도 거의 없어 과적합 없이 잘 학습되었다.
<Tensorboard 결과>
<학습된 BC알고리즘 테스트 영상>
GAN(Generative Adversarial Network)
사용하는 네트워크 ⏵Generator: 노이즈로부터 실제 데이터와 유사한 데이터를 생성 ⏵Discriminator: Generator에서 생성한 데이터와 실제 데이터를 구분하는 역할 서로 경쟁하며 학습을 수행 GAIL(Generative Adversarial Imaitation Learning): 모방학습 알고리즘에 discriminator를 적용한 기법 정책에 의한 행동과 전문가 경험에 의한 행동 간의 차이를 최소화 시키는 방향으로 학습 한정된 수의 데모 환경이나 불완전한 데모를 통해서도 효과적으로 사용 가능
[GAIL의 학습 과정 도식화]
GAIL파라미터
gamma: GAIL에 의해 생성된 보상에 대한 감가율 strength: 전문가 데이터를 모방하는 속도(값이 클수록 모방학습에 집중하여 학습 → 데모의 품질이 낮을수록 값을 낮게 설정) network_settings: Discriminator 네트워크 구성 learning_actions: Discrimnator 네트워크의 학습율 use_actions: 데모 경험을 기반으로 모방을 수행할지에 대한 Bool 변수(True=데모 경험 기반, False=데모 경험과 다른 행동) use_vail: Discriminator의 학습에서 높은 가치를 평준화할지에 대한 Bool 변수(True=평균적인 보삭을 높여 일반적이고 안정적인 학습 수행) demo_path: 학습에 사용될 데모 파일의 경로
BC 파라미터
demo_path: 학습에 사용될 데모 파일의 경로 steps: 모방 학습을 시작하는 스텝(모방학습이 적용되는 시점; 처음부터 시작 시=0) strength: BC의 정책에 대한 영향력 samples_per_update: 모방 학습 중 업데이트에 사용될 최대 샘플의 수(0으로 설정 시, 업데이트 단계에서 모든 데모를 학습시켜줌)
활동 내용 - 학습 진행 상황 공유 및 학습 내용 공동 스터디