스쿨링 플래피 버드: 강화 학습 튜토리얼
게시 됨: 2022-03-11고전적 프로그래밍에서 소프트웨어 명령은 프로그래머에 의해 명시적으로 작성되며 데이터에서 전혀 배울 수 없습니다. 대조적으로, 기계 학습은 통계적 방법을 사용하여 명시적으로 프로그래밍하지 않고도 컴퓨터가 학습하고 데이터에서 지식을 추출할 수 있도록 하는 컴퓨터 과학의 한 분야입니다.
이 강화 학습 튜토리얼에서는 PyTorch를 사용하여 강화 학습 신경망에 Flappy Bird를 플레이하는 방법을 가르치는 방법을 보여 드리겠습니다. 그러나 먼저 많은 빌딩 블록을 다루어야 합니다.
기계 학습 알고리즘은 크게 기존 학습 알고리즘과 딥 러닝 알고리즘의 두 부분으로 나눌 수 있습니다. 전통적인 학습 알고리즘은 일반적으로 딥 러닝 알고리즘보다 학습 가능한 매개변수가 훨씬 적고 학습 능력도 훨씬 적습니다.
또한 기존 학습 알고리즘은 특징 추출 을 수행할 수 없습니다. 인공 지능 전문가는 학습 알고리즘으로 전송되는 좋은 데이터 표현을 파악해야 합니다. 전통적인 머신 러닝 기술의 예로는 SVM, 랜덤 포레스트, 의사 결정 트리 및 $k$-means가 있는 반면 딥 러닝의 중심 알고리즘은 심층 신경망입니다 .
심층 신경망에 대한 입력은 원시 이미지가 될 수 있으며 인공 지능 전문가는 데이터 표현을 찾을 필요가 없습니다. 신경망은 훈련 과정에서 최상의 표현을 찾습니다.
딥 러닝 기술은 아주 오래전부터 알려져 왔지만 최근 하드웨어의 발전으로 딥 러닝 연구 개발이 빠르게 증가했습니다. Nvidia는 GPU가 빠른 딥 러닝 실험을 가능하게 했기 때문에 이 분야의 확장을 책임지고 있습니다.
학습 가능한 매개변수 및 하이퍼 매개변수
머신 러닝 알고리즘은 학습 과정에서 조정되는 학습 가능한 매개변수와 학습 과정 전에 설정되는 학습 불가능한 매개변수로 구성됩니다. 학습 전에 설정한 매개변수를 하이퍼파라미터 라고 합니다.
그리드 검색 은 최적의 하이퍼파라미터를 찾는 일반적인 방법입니다. 무차별 대입 방식입니다. 정의된 범위에서 가능한 모든 하이퍼파라미터 조합을 시도하고 미리 정의된 메트릭을 최대화하는 조합을 선택하는 것을 의미합니다.
지도, 비지도, 강화 학습 알고리즘
학습 알고리즘을 분류하는 한 가지 방법은 지도 알고리즘과 비지도 알고리즘 사이에 선을 긋는 것입니다. (그러나 그것이 반드시 그렇게 간단한 것은 아닙니다. 강화 학습은 이 두 유형 사이 어딘가에 있습니다.)
지도 학습에 대해 이야기할 때 $ (x_i, y_i) $ 쌍을 봅니다. $ x_i $는 알고리즘의 입력이고 $ y_i $는 출력입니다. 우리의 임무는 $ x_i $에서 $ y_i $로의 올바른 매핑을 수행할 함수를 찾는 것입니다.
$ x_i $를 $ y_i $에 매핑하는 함수를 정의하도록 학습 가능한 매개변수를 조정하려면 손실 함수와 옵티마이저를 정의해야 합니다. 옵티마이저는 손실 함수를 최소화합니다. 손실 함수의 한 예는 평균 제곱 오차(MSE)입니다.
\[MSE = \sum_{i=1}^{n} (y_i - \widehat{y_i} )^2\]여기서 $ y_i $는 정답 레이블이고 $ \widehat{y_i} $는 예측 레이블입니다. 딥 러닝에서 매우 인기 있는 옵티마이저 중 하나는 확률적 경사 하강 법입니다. Adam, Adadelta, Adagrad 등 확률적 경사 하강법을 개선하기 위한 많은 변형이 있습니다.
비지도 알고리즘은 레이블이 명시적으로 제공되지 않고 데이터에서 구조를 찾으려고 합니다. $k$-means는 데이터에서 최적의 클러스터를 찾으려는 비지도 알고리즘의 예 중 하나입니다. 아래는 300개의 데이터 포인트가 있는 이미지입니다. $k$ - 알고리즘이 데이터에서 구조를 찾고 각 데이터 포인트에 클러스터 레이블을 할당함을 의미합니다. 각 클러스터에는 고유한 색상이 있습니다.
강화 학습은 보상을 사용합니다. 희소, 시간 지연 레이블. 에이전트는 새로운 관찰과 보상을 얻을 수 있는 환경을 변경하는 조치를 취합니다. 관찰은 에이전트가 환경에서 인식하는 자극입니다. 에이전트가 보고, 듣고, 냄새를 맡는 등이 될 수 있습니다.
에이전트가 행동을 취하면 보상이 주어집니다. 에이전트에게 액션이 얼마나 좋은지 알려줍니다. 관찰과 보상을 인식함으로써 에이전트는 환경에서 최적으로 행동하는 방법을 배웁니다. 아래에서 더 자세히 다루겠습니다.
능동, 수동 및 역 강화 학습
이 기술에는 몇 가지 다른 접근 방식이 있습니다. 우선 여기에서 사용하고 있는 능동 강화 학습이 있습니다. 이와 대조적으로 보상이 관찰의 또 다른 유형이고 대신 고정된 정책에 따라 결정이 내려지는 수동적 강화 학습이 있습니다.
마지막으로, 역강화학습은 행동의 이력과 다양한 상태에서의 보상을 고려하여 보상 함수를 재구성하려고 합니다.
일반화, 과대적합, 과소적합
매개변수와 하이퍼파라미터의 고정된 인스턴스를 모델이라고 합니다. 기계 학습 실험은 일반적으로 훈련과 테스트의 두 부분으로 구성됩니다.
훈련 과정에서 학습 가능한 매개변수는 훈련 데이터를 사용하여 조정됩니다. 테스트 프로세스에서 학습 가능한 매개변수는 고정되고, 작업은 모델이 이전에 보지 못한 데이터에 대해 예측을 얼마나 잘 하는지 확인하는 것입니다. 일반화는 학습 데이터 세트를 경험한 후 새로운, 보이지 않는 예 또는 작업에 대해 정확하게 수행하는 학습 기계의 능력입니다.
모델이 데이터와 관련하여 너무 단순하면 훈련 데이터에 맞출 수 없으며 훈련 데이터 세트와 테스트 데이터 세트 모두에서 성능이 저하됩니다. 이 경우 모델이 과소적합되었다고 말합니다 .
머신 러닝 모델이 훈련 데이터 세트에서는 잘 수행되지만 테스트 데이터 세트에서는 저조한 성능을 보인다면 과적합 이라고 합니다. 과적합은 모델이 데이터에 비해 너무 복잡한 상황입니다. 훈련 데이터에 완벽하게 맞을 수 있지만 훈련 데이터 세트에 너무 많이 적응되어 테스트 데이터에서 성능이 좋지 않습니다. 즉, 단순히 일반화되지 않습니다.
아래는 전체 데이터와 예측 함수 간의 균형이 잡힌 상황과 비교하여 underfitting과 overfitting을 비교한 이미지입니다.
확장성
데이터는 기계 학습 모델을 구축하는 데 중요합니다. 일반적으로 기존 학습 알고리즘에는 너무 많은 데이터가 필요하지 않습니다. 그러나 제한된 용량으로 인해 성능도 제한됩니다. 아래는 딥 러닝 방법이 기존 머신 러닝 알고리즘과 비교하여 얼마나 잘 확장되는지 보여주는 플롯입니다.
신경망
신경망은 여러 레이어로 구성됩니다. 아래 이미지는 4개의 레이어가 있는 간단한 신경망을 보여줍니다. 첫 번째 레이어는 입력 레이어이고 마지막 레이어는 출력 레이어입니다. 입력 레이어와 출력 레이어 사이의 두 레이어는 은닉 레이어입니다.
신경망에 두 개 이상의 은닉층이 있는 경우 이를 심층 신경망이라고 합니다. 입력 세트 $ X $가 신경망에 제공되고 출력 $ y $가 얻어집니다. 학습은 손실 함수와 옵티마이저를 결합한 역전파 알고리즘을 사용하여 수행됩니다.
역전파는 순방향 패스와 역방향 패스의 두 부분으로 구성됩니다. 순방향 패스에서는 입력 데이터가 신경망의 입력에 입력되고 출력이 얻어집니다. 정답과 예측 간의 손실을 계산한 다음 역방향 패스에서 손실에 대해 신경망의 매개변수를 조정합니다.
컨볼루션 신경망
신경망 변형 중 하나는 합성곱 신경망입니다 . 주로 컴퓨터 비전 작업에 사용됩니다.
합성곱 신경망에서 가장 중요한 계층은 합성곱 계층(따라서 이름)입니다. 매개변수는 커널이라고도 하는 학습 가능한 필터로 구성됩니다. 컨볼루션 레이어는 입력에 컨볼루션 연산을 적용하여 결과를 다음 레이어로 전달합니다. 컨볼루션 연산은 학습 가능한 매개변수의 수를 줄여 일종의 휴리스틱으로 기능하고 신경망을 훈련하기 쉽게 만듭니다.
다음은 컨볼루션 레이어에서 하나의 컨볼루션 커널이 작동하는 방식입니다. 커널이 이미지에 적용되고 convolved feature가 얻어집니다.
ReLU 계층은 신경망에 비선형성을 도입하는 데 사용됩니다. 비선형성은 선형 함수뿐만 아니라 모든 종류의 함수를 모델링하여 신경망을 보편적인 함수 근사기로 만들 수 있기 때문에 중요합니다. 이렇게 하면 ReLU 함수가 다음과 같이 정의됩니다.
\[ReLU = \max(0, x)\]ReLU는 신경망에 비선형성을 도입하는 데 사용되는 소위 활성화 함수 의 예 중 하나입니다. 다른 활성화 함수의 예로는 시그모이드 및 하이퍼 탄젠트 함수가 있습니다. ReLU는 다른 활성화 함수에 비해 신경망을 더 효율적으로 훈련시키는 것으로 나타났기 때문에 가장 널리 사용되는 활성화 함수입니다.
아래는 ReLU 함수의 플롯입니다.
보시다시피 이 ReLU 함수는 음수 값을 0으로 변경합니다. 이것은 배니싱 그래디언트 문제를 방지하는 데 도움이 됩니다. 그래디언트가 사라지면 신경망의 가중치를 조정하는 데 큰 영향을 미치지 않습니다.
합성곱 신경망은 합성곱 계층, ReLU 계층 및 완전 연결 계층과 같은 여러 계층으로 구성됩니다. 완전 연결 계층은 이 섹션의 시작 부분에서 이미지의 두 개의 숨겨진 계층에서 볼 수 있듯이 한 계층의 모든 뉴런을 다른 계층의 모든 뉴런에 연결합니다. 마지막으로 완전히 연결된 레이어는 이전 레이어의 출력을 이 경우 number_of_actions
값에 매핑합니다.
애플리케이션
딥 러닝은 성공적이며 컴퓨터 비전, 음성 인식 및 강화 학습을 포함한 여러 기계 학습 하위 분야에서 기존 기계 학습 알고리즘을 능가합니다. 이러한 딥 러닝 분야는 금융, 의학, 엔터테인먼트 등 다양한 실제 영역에 적용됩니다.
강화 학습
강화 학습은 에이전트 를 기반으로 합니다. 에이전트는 환경에서 행동을 취하고 관찰과 보상을 얻습니다. 에이전트는 누적 보상을 최대화하기 위해 훈련을 받아야 합니다. 도입부에서 언급했듯이, 기계 학습 엔지니어는 기존 기계 학습 알고리즘을 사용하여 특성 추출을 수행해야 합니다. 즉, 환경을 잘 나타내고 기계 학습 알고리즘에 제공되는 우수한 특성을 생성해야 합니다.
딥 러닝을 사용하면 비디오와 같은 고차원 입력을 받는 종단 간 시스템을 만드는 것이 가능하며 이를 통해 에이전트가 좋은 조치를 취하기 위한 최적의 전략을 학습합니다.
2013년, 런던 AI 스타트업인 DeepMind는 고차원 감각 입력에서 직접 에이전트를 제어하는 방법을 학습하는 데 획기적인 발전을 이루었습니다. 그들은 Playing Atari with Deep Reinforcement Learning 이라는 논문을 발표했으며, 여기에서 화면을 보는 것만으로 Atari 게임을 하도록 인공 신경망을 가르치는 방법을 보여주었습니다. 그들은 Google에 인수되었으며 몇 가지 개선 사항이 포함된 새로운 논문을 Nature 에 발표했습니다. 심층 강화 학습을 통한 인간 수준 제어 .
다른 기계 학습 패러다임과 달리 강화 학습에는 감독자가 없고 보상 신호만 있습니다. 피드백이 지연됨: 지도 학습 알고리즘에서와 같이 즉각적이지 않습니다. 데이터는 순차적이며 에이전트의 작업은 수신하는 후속 데이터에 영향을 줍니다.
이제 에이전트는 특정 상태에 있는 환경에 위치합니다. 이것을 더 자세히 설명하기 위해 우리는 이 강화 학습 환경을 모델링하는 공식적인 방법인 Markov 결정 프로세스를 사용합니다. 상태 집합, 가능한 작업 집합 및 한 상태에서 다른 상태로 전환하기 위한 규칙(예: 확률)으로 구성됩니다.
에이전트는 작업을 수행하여 환경을 변환할 수 있습니다. 우리는 보상을 $ R_t $라고 부릅니다. 에이전트가 $t$ 단계에서 얼마나 잘 하고 있는지를 나타내는 스칼라 피드백 신호입니다.
장기적으로 좋은 성과를 내려면 즉각적인 보상뿐 아니라 미래의 보상도 고려해야 합니다. $t$ 시간 단계에서 한 에피소드에 대한 총 보상은 $ R_t = r_t + r_{t+1} + r_{t+2} + \ldots + r_n $입니다. 미래는 불확실하고 앞으로 나아갈수록 미래 예측은 더 다양해질 수 있습니다. 이 때문에 할인된 미래 보상이 사용됩니다. $ R_t = r_t +\gamma r_{t+1} + \gamma^2r_{t+2} + \ldots + \gamma^{nt}r_n = r_t + \gamma R_{t+1} $. 에이전트는 할인된 미래 보상을 최대화하는 행동을 선택해야 합니다.
딥 Q-러닝
$ Q(s, a) $ 함수는 $ a $ 상태가
미래 보상의 추정은 Bellman 방정식으로 제공됩니다. $ Q(s, a) = r + \gamma \max_{a'}Q(s', a') $ . 즉, state $ s $ 와 action $ $ 에 대한 최대 미래 보상은 즉각적인 보상과 다음 state에 대한 최대 미래 보상입니다.
비선형 함수(신경망)를 사용한 Q-값의 근사는 그다지 안정적이지 않습니다. 이 때문에 안정성을 위해 경험치 재생을 사용합니다. 훈련 세션의 에피소드 중 경험은 리플레이 메모리에 저장됩니다. 가장 최근의 전환을 사용하는 대신 재생 메모리의 무작위 미니 배치가 사용됩니다. 이것은 신경망을 로컬 최소값으로 구동할 후속 훈련 샘플의 유사성을 깨뜨립니다.
딥 Q-러닝에 대해 언급해야 할 두 가지 중요한 측면이 있습니다. 탐색과 활용입니다. 익스플로잇을 사용하면 현재 정보가 주어지면 최선의 결정이 내려집니다. 탐색은 더 많은 정보를 수집합니다.
알고리즘이 신경망에서 제안한 작업을 수행할 때 활용을 수행하는 것입니다. 신경망의 학습된 지식을 활용합니다. 대조적으로, 알고리즘은 새로운 가능성을 탐색하고 잠재적인 새로운 지식을 신경망에 도입하여 무작위 조치를 취할 수 있습니다.
DeepMind의 논문 Playing Atari with Deep Reinforcement Learning의 "Deep Q-learning algorithm with Experience Replay"가 아래에 나와 있습니다.
DeepMind는 DQN(Deep Q-networks)이라는 접근 방식으로 훈련된 컨볼루션 네트워크를 나타냅니다.
Flappy Bird를 사용한 Deep Q-learning 예제
Flappy Bird는 원래 베트남 비디오 게임 아티스트이자 프로그래머인 Dong Nguyen이 개발한 인기 모바일 게임입니다. 그 안에서 플레이어는 새를 조종하고 녹색 파이프를 치지 않고 날아가려고 합니다.
아래는 PyGame을 사용하여 코딩된 Flappy Bird 클론의 스크린샷입니다.
이후 클론이 분기 및 수정되었습니다. 배경, 사운드, 다양한 새와 파이프 스타일이 제거되고 코드가 조정되어 간단한 강화 학습 프레임워크와 함께 쉽게 사용할 수 있습니다. 수정된 게임 엔진은 이 TensorFlow 프로젝트에서 가져왔습니다.
하지만 TensorFlow를 사용하는 대신 PyTorch를 사용하여 심층 강화 학습 프레임워크를 구축했습니다. PyTorch는 빠르고 유연한 실험을 위한 딥 러닝 프레임워크입니다. 강력한 GPU 가속을 통해 Python의 텐서 및 동적 신경망을 제공합니다.

신경망 아키텍처는 심층 강화 학습을 통한 인간 수준 제어 논문에서 사용된 DeepMind와 동일합니다.
층 | 입력 | 필터 크기 | 보폭 | 필터 수 | 활성화 | 산출 |
---|---|---|---|---|---|---|
전환1 | 84x84x4 | 8x8 | 4 | 32 | 릴루 | 20x20x32 |
conv2 | 20x20x32 | 4x4 | 2 | 64 | 릴루 | 9x9x64 |
conv3 | 9x9x64 | 3x3 | 1 | 64 | 릴루 | 7x7x64 |
FC4 | 7x7x64 | 512 | 릴루 | 512 | ||
FC5 | 512 | 2 | 선의 | 2 |
3개의 컨볼루션 레이어와 2개의 완전 연결 레이어가 있습니다. 선형 활성화를 사용하는 마지막 계층을 제외하고 각 계층은 ReLU 활성화를 사용합니다. 신경망은 플레이어가 할 수 있는 유일한 행동을 나타내는 두 가지 값을 출력합니다. "Fly up" 및 "do nothing".
입력은 4개의 연속 84x84 흑백 이미지로 구성됩니다. 다음은 신경망에 제공되는 4개의 이미지의 예입니다.
이미지가 회전된 것을 알 수 있습니다. 클론 게임 엔진의 출력이 회전하기 때문입니다. 그러나 이러한 이미지를 사용하여 신경망을 학습하고 테스트하면 성능에 영향을 미치지 않습니다.
또한 이 작업과 관련이 없기 때문에 바닥이 생략되도록 이미지가 잘린 것을 알 수 있습니다. 파이프와 새를 나타내는 모든 픽셀은 흰색이고 배경을 나타내는 모든 픽셀은 검은색입니다.
이것은 신경망을 정의하는 코드의 일부입니다. 신경망의 가중치는 균일 분포 $\mathcal{U}(-0.01, 0.01)$를 따르도록 초기화됩니다. 신경망 매개변수의 편향 부분은 0.01로 설정됩니다. 여러 가지 다른 초기화가 시도되었지만(Xavier uniform, Xavier normal, Kaiming uniform, Kaiming normal, uniform 및 normal) 위의 초기화는 신경망을 가장 빠르게 수렴시키고 훈련시켰습니다. 신경망의 크기는 6.8MB입니다.
class NeuralNetwork(nn.Module): def __init__(self): super(NeuralNetwork, self).__init__() self.number_of_actions = 2 self.gamma = 0.99 self.final_epsilon = 0.0001 self.initial_epsilon = 0.1 self.number_of_iterations = 2000000 self.replay_memory_size = 10000 self.minibatch_size = 32 self.conv1 = nn.Conv2d(4, 32, 8, 4) self.relu1 = nn.ReLU(inplace=True) self.conv2 = nn.Conv2d(32, 64, 4, 2) self.relu2 = nn.ReLU(inplace=True) self.conv3 = nn.Conv2d(64, 64, 3, 1) self.relu3 = nn.ReLU(inplace=True) self.fc4 = nn.Linear(3136, 512) self.relu4 = nn.ReLU(inplace=True) self.fc5 = nn.Linear(512, self.number_of_actions) def forward(self, x): out = self.conv1(x) out = self.relu1(out) out = self.conv2(out) out = self.relu2(out) out = self.conv3(out) out = self.relu3(out) out = out.view(out.size()[0], -1) out = self.fc4(out) out = self.relu4(out) out = self.fc5(out) return out
생성자에서 정의된 하이퍼파라미터가 있음을 알 수 있습니다. 이 블로그 게시물의 목적을 위해 초매개변수 최적화가 수행되지 않습니다. 대신, 하이퍼파라미터는 주로 DeepMind의 논문에서 사용됩니다. 여기에서 일부 하이퍼파라미터는 DeepMind의 논문보다 낮게 조정되었습니다. Flappy Bird가 튜닝에 사용한 Atari 게임보다 덜 복잡하기 때문입니다.
또한 이 게임에서는 엡실론이 훨씬 더 합리적으로 변경되었습니다. DeepMind는 1의 엡실론을 사용하지만 여기서는 0.1을 사용합니다. 이것은 더 높은 엡실론이 새를 많이 펄럭이게 하여 새를 화면의 위쪽 경계 쪽으로 밀어서 결국에는 항상 새가 파이프에 충돌하게 하기 때문입니다.
강화 학습 코드에는 학습 및 테스트의 두 가지 모드가 있습니다. 테스트 단계에서 강화 학습 알고리즘이 게임을 얼마나 잘 학습했는지 확인할 수 있습니다. 그러나 먼저 신경망을 훈련해야 합니다. 최소화할 손실 함수와 손실 함수를 최소화할 옵티마이저를 정의해야 합니다. 손실 함수에 Adam 최적화 방법과 평균 제곱 오차를 사용합니다.
optimizer = optim.Adam(model.parameters(), lr=1e-6) criterion = nn.MSELoss()
게임을 인스턴스화해야 합니다.
game_state = GameState()
재생 메모리는 Python 목록으로 정의됩니다.
replay_memory = []
이제 첫 번째 상태를 초기화해야 합니다. 작업은 2차원 텐서입니다.
- [1, 0]은 "아무것도 하지 않음"을 나타냅니다.
- [0, 1]은 "날아올리다"를 나타냅니다.
frame_step
메서드는 다음 화면, 보상 및 다음 상태가 터미널인지 여부에 대한 정보를 제공합니다. 각 새가 파이프를 통과하지 않을 때 죽지 않고 움직일 때마다 보상은 0.1
, 새가 파이프를 성공적으로 통과하면 1
, 새가 충돌하면 -1
입니다.
resize_and_bgr2gray
함수는 바닥을 자르고 화면 크기를 84x84 이미지로 조정하고 색 공간을 BGR에서 흑백으로 변경합니다. image_to_tensor
함수는 이미지를 PyTorch 텐서로 변환하고 CUDA를 사용할 수 있는 경우 GPU 메모리에 넣습니다. 마지막으로 마지막 4개의 순차적 화면이 함께 연결되어 신경망으로 보낼 준비가 됩니다.
action = torch.zeros([model.number_of_actions], dtype=torch.float32) action[0] = 1 image_data, reward, terminal = game_state.frame_step(action) image_data = resize_and_bgr2gray(image_data) image_data = image_to_tensor(image_data) state = torch.cat((image_data, image_data, image_data, image_data)).unsqueeze(0)
초기 엡실론은 다음 코드 줄을 사용하여 설정됩니다.
epsilon = model.initial_epsilon
주요 무한 루프가 따릅니다. 주석은 코드에 작성되며 위에서 작성한 Deep Q-learning with Experience Replay 알고리즘과 코드를 비교할 수 있습니다.
알고리즘은 재생 메모리에서 미니 배치를 샘플링하고 신경망 매개변수를 업데이트합니다. 작업은 엡실론 탐욕 탐색 을 사용하여 실행됩니다. Epsilon은 시간이 지남에 따라 어닐링되고 있습니다. 최소화되는 손실 함수는 $ L = \frac{1}{2}\left[\max_{a'}Q(s', a') - Q(s, a)\right]^2 $ 입니다. $ Q(s, a) $는 Bellman 방정식을 사용하여 계산된 ground truth 값이고 $ \max_{a'}Q(s', a') $는 신경망에서 구합니다. 신경망은 두 가지 가능한 작업에 대해 두 개의 Q 값을 제공하고 알고리즘은 가장 높은 Q 값으로 작업을 수행합니다.
while iteration < model.number_of_iterations: # get output from the neural network output = model(state)[0] # initialize action action = torch.zeros([model.number_of_actions], dtype=torch.float32) if torch.cuda.is_available(): # put on GPU if CUDA is available action = action.cuda() # epsilon greedy exploration random_action = random.random() <= epsilon if random_action: print("Performed random action!") action_index = [torch.randint(model.number_of_actions, torch.Size([]), dtype=torch.int) if random_action else torch.argmax(output)][0] if torch.cuda.is_available(): # put on GPU if CUDA is available action_index = action_index.cuda() action[action_index] = 1 # get next state and reward image_data_1, reward, terminal = game_state.frame_step(action) image_data_1 = resize_and_bgr2gray(image_data_1) image_data_1 = image_to_tensor(image_data_1) state_1 = torch.cat((state.squeeze(0)[1:, :, :], image_data_1)).unsqueeze(0) action = action.unsqueeze(0) reward = torch.from_numpy(np.array([reward], dtype=np.float32)).unsqueeze(0) # save transition to replay memory replay_memory.append((state, action, reward, state_1, terminal)) # if replay memory is full, remove the oldest transition if len(replay_memory) > model.replay_memory_size: replay_memory.pop(0) # epsilon annealing epsilon = epsilon_decrements[iteration] # sample random minibatch minibatch = random.sample(replay_memory, min(len(replay_memory), model.minibatch_size)) # unpack minibatch state_batch = torch.cat(tuple(d[0] for d in minibatch)) action_batch = torch.cat(tuple(d[1] for d in minibatch)) reward_batch = torch.cat(tuple(d[2] for d in minibatch)) state_1_batch = torch.cat(tuple(d[3] for d in minibatch)) if torch.cuda.is_available(): # put on GPU if CUDA is available state_batch = state_batch.cuda() action_batch = action_batch.cuda() reward_batch = reward_batch.cuda() state_1_batch = state_1_batch.cuda() # get output for the next state output_1_batch = model(state_1_batch) # set y_j to r_j for terminal state, otherwise to r_j + gamma*max(Q) y_batch = torch.cat(tuple(reward_batch[i] if minibatch[i][4] else reward_batch[i] + model.gamma * torch.max(output_1_batch[i]) for i in range(len(minibatch)))) # extract Q-value q_value = torch.sum(model(state_batch) * action_batch, dim=1) # PyTorch accumulates gradients by default, so they need to be reset in each pass optimizer.zero_grad() # returns a new Tensor, detached from the current graph, the result will never require gradient y_batch = y_batch.detach() # calculate loss loss = criterion(q_value, y_batch) # do backward pass loss.backward() optimizer.step() # set state to be state_1 state = state_1
이제 모든 부분이 준비되었으므로 신경망을 사용하는 데이터 흐름에 대한 높은 수준의 개요가 있습니다.
다음은 훈련된 신경망이 있는 하나의 짧은 시퀀스입니다.
위에 표시된 신경망은 고급 Nvidia GTX 1080 GPU를 사용하여 몇 시간 동안 훈련되었습니다. 대신 CPU 기반 솔루션을 사용하는 경우 이 특정 작업은 며칠이 걸립니다. 게임 엔진의 FPS는 훈련 중에 매우 큰 숫자로 설정되었습니다. 999… 테스트 단계에서 FPS는 30으로 설정되었습니다.
다음은 반복 중에 최대 Q 값이 어떻게 변경되었는지 보여주는 차트입니다. 10,000번째 반복마다 표시됩니다. 하향 스파이크는 특정 프레임(한 번의 반복은 한 프레임)에 대해 새가 미래에 매우 낮은 보상을 받을 것이라고 예측한다는 것을 의미합니다. 즉, 곧 충돌할 것입니다.
전체 코드와 사전 훈련된 모델은 여기에서 사용할 수 있습니다.
심층 강화 학습: 2D, 3D, 심지어 실생활
이 PyTorch 강화 학습 튜토리얼에서 저는 컴퓨터가 게임에 대한 사전 지식 없이 Flappy Bird를 플레이하는 방법을 배울 수 있는 방법을 보여주었습니다. 인간이 게임을 처음 접했을 때 시행착오 방식만 사용했습니다.
PyTorch 프레임워크를 사용하여 몇 줄의 코드로 알고리즘을 구현할 수 있다는 점은 흥미롭습니다. 이 블로그의 방법론이 기반으로 하는 논문은 비교적 오래되었고, 더 빠른 수렴을 가능하게 하는 다양한 수정을 가한 새로운 논문이 많이 있습니다. 그 이후로 심층 강화 학습은 3D 게임과 실제 로봇 시스템에 사용되었습니다.
DeepMind, Maluuba 및 Vicarious와 같은 회사는 심층 강화 학습에 집중적으로 노력하고 있습니다. 이러한 기술은 바둑에서 세계 최고의 선수 중 한 명인 이세돌을 꺾은 알파고에 적용됐다. 당시 바둑에서 기계가 최고의 선수를 물리칠 수 있으려면 적어도 10년은 걸릴 것으로 여겨졌다.
심층 강화 학습(및 일반적으로 인공 지능)에 대한 관심과 투자의 홍수는 잠재적인 인공 일반 지능(AGI)으로 이어질 수도 있습니다. 컴퓨터에서 시뮬레이션했습니다. 그러나 AGI는 다른 기사의 주제가 되어야 합니다.
참조:
- 심층 강화 학습 이해하기
- Flappy Bird를 위한 심층 강화 학습
- Wikipedia의 "컨볼루션 신경망"
- Wikipedia의 "강화 학습"
- Wikipedia의 "Markov 결정 프로세스"
- RL에 대한 유니버시티 칼리지 런던 과정