Gayblack Canadian Man

Foreign Policy Analysis
How to Beat Pong Using Policy Gradients (LIVE)

How to Beat Pong Using Policy Gradients (LIVE)


안녕하세요
*이번 영상 초반에는 마이크가 다소 지직거립니다 안녕하세요 Siraj입니다
생방송 강의에 오신 것을 환영합니다 오늘은 보시는 것처럼 오늘은 보시는 것처럼 policy gradient로
퐁 게임을 정복할 것입니다 게임 화면이 너무 작은 것은 알지만 하지만 화면 크기를 프로그래밍
해두었기 때문에 실시간으로 바꾸기는 어렵습니다 요점은 이게 퐁 게임이라는 것이고 policy gradient라는 기법으로
게임을 풀어나갈 겁니다 policy gradient는 정말
멋진 알고리즘이고 저를 신나게 하는 것 중 하나인데 지난 몇 달간 이 주제를 공부했고 지난 몇 달간 이 주제를 공부했고 시간이 조금 지나자 이 주제가
유명해졌기 때문이죠 어떤 함수의 그래디언트를 계산하고 역전파 하는 것이 맞습니다 딥러닝에서 가장 성공적인 부분은
주로 지도 학습에 집중되어 있는데 딥러닝에서 가장 성공적인 부분은
주로 지도 학습에 집중되어 있는데 이는 계산 그래프나 신경망을
미분할 수 있기 때문입니다 이는 계산 그래프나 신경망을
미분할 수 있기 때문입니다 policy gradient가 특히 멋진 점은 각 노드가 확률적이어도
역전파가 가능하다는 것입니다 이 용어에 대해서는
곧 설명드리겠습니다 이 용어에 대해서는
곧 설명드리겠습니다 확률적이라는 용어와 결정적이라는
용어의 뜻을 알아두면 좋습니다 제 목소리입니다 이제 코딩을 할 것이고 파이썬으로 짰을 때
130줄 정도가 될 것입니다 계속 설명해 드릴 것입니다 지금 데모가 이미 실행되고 있습니다 GPU 클러스터로 구성된
클라우드 환경에서 학습하면 약 5시간 정도가 걸립니다 만약 제 맥북에서 학습한다면 사흘에서 나흘을 꼬박
채워야 할 것입니다 즉 로컬 환경에서
실행할 만한 코드는 아닙니다 하지만 정말 놀라운 점은 이겁니다 하지만 정말 놀라운 점은 이겁니다 이건 어떤 종류의 인공지능보다
더 나아질 것입니다 왜냐하면 policy gradient는
막대의 크기도 모르고 공의 크기도 모르고 공의 속도도 몰라도
학습이 가능하기 때문입니다 그런 식으로 하드코딩된
규칙을 필요로 하지 않습니다 놀랍게도 픽셀값만을 사용해서
학습할 수 있습니다 그냥 픽셀만 보고
가능하다는 것이죠 또한 구글의 DQN보다 낫습니다 구글이 아니라 딥마인드의 것이죠 구글이 거의 8천억원이 넘는 돈을 들여
딥마인드를 인수하게 할 만큼 감명받았던 DQN보다 낫다는 거죠 이 알고리즘은 CNN으로
게임의 픽셀 정보를 읽고 주어진 환경에서 에이전트가
취할 액션을 구합니다 여기서 환경은 모든
아타리 게임이 될 수 있습니다 정말 놀라운 점이죠 각각에 게임에 맞춰 하드코딩
한 부분이 전혀 없습니다 잠시만 기다려주세요 이제 시작하겠습니다 시작하기 전에 두 질문에
대해 답하겠습니다 시작하기 전에 두 질문에
대해 답하겠습니다 제가 특히 관심 있는 주제여서 매우 신나네요 첫 질문은 Lucas가 해주셨습니다
텐서플로우나 신경망이 매우 흥미롭게 느껴지는데
어디서부터 공부를 시작할지 추천해달라는 것이네요 좋은 질문입니다 제 대답은 매우 간단합니다 제 강의를 보세요 저는 작년에 텐서플로우와
신경망에 대한 강의를 만들었고 지금도 매주 강의를 만들고 있습니다 정말 많은 강의가 있습니다 거의 모든 텐서플로우의
주제를 다루었고 텐서플로우에 대한
재생 목록도 있습니다 신경망에 대한 재생 목록도 있고요 제 유튜브 채널을 확인하세요 둘에 대한 재생 목록이 모두 있고 지금 보시는 딥러닝 시작하기
강의도 제 채널에 있습니다 만약 문서화된 자료도 참고하고 싶다면 Chris Olas의 블로그를 보세요 OpenAI와 많은 사람들이 만든
Distill이라는 곳도 좋습니다 시각 자료를 통해 여러 논문을
이해하기 쉽게 도와줍니다 시각 자료를 통해 여러 논문을
이해하기 쉽게 도와줍니다 한 질문만 더 대답하고
시작하도록 하겠습니다 어떤 경우에 분류기를 시험해봐야
하냐는 Sunil의 질문입니다 잠시만요 질문을 정리해보겠습니다 만들어 낸 데이터셋을 쓰는 건 어떻냐고요 만들어 낸 데이터셋을 쓰는 건 어떻냐고요 간단한 테스팅 목적으로 만들어진
데이터셋을 말하는 걸로 이해하겠습니다 간단한 테스팅 목적으로 인간이 만든
데이터셋을 말하는 걸로 이해하겠습니다 당연히 수백만 명이 쓰는
실서비스에 쓰일 분류기를 당연히 수백만 명이 쓰는
실서비스에 쓰일 분류기를 만들어 낸 데이터셋으로만
학습하지는 않겠죠 실서비스에 쓰일 모델이니 실서비스에서 모은 데이터로
학습하는 것이 맞겠죠 실서비스에서 모은 데이터로
학습하는 것이 맞겠죠 시작하겠습니다
다룰 것이 많아요 일단 코딩을 하기 위해
데모를 멈춥시다 일단 코딩을 하기 위해
데모를 멈춥시다 재밌는 점은 텐서플로우를
쓰지 않을 것이라는 겁니다 재밌는 점은 텐서플로우를
쓰지 않을 것이라는 겁니다 numpy만 사용할 겁니다
행렬 계산에 특화되어 있죠 무슨 뜻이냐면 순전파, 역전파, 미분 과정 모두를
직접 손으로 짤 것입니다 순전파, 역전파, 미분 과정 모두를
직접 손으로 짤 것입니다 순전파, 역전파, 미분 과정 모두를
직접 손으로 짤 것입니다 처음 import 하는 것은 numpy입니다 행렬 계산을 하기 위해서요 행렬 계산을 하기 위해서요 그리고 pickle입니다
데이터를 직렬화하는 데 좋습니다 그리고 pickle입니다
데이터를 직렬화하는 데 좋습니다 즉 모델을 저장하고 불러들일 때
쓸 수 있습니다 즉 모델을 저장하고 불러들일 때
쓸 수 있습니다 마지막 라이브러리는 gym입니다 gym은 게임을 실행하기
위해 좋은 환경입니다 gym에 대해 조금만 더
설명하도록 하겠습니다 몇 달 전 OpenAI가 공개했고
여러분의 강화학습 에이전트를 다양한 게임에서 학습시킬 수 있습니다
어떤 게임을 사용할지 고르는 것도 매우 쉽게 할 수 있고요 제대로 나올 때까지 기다리겠습니다 제대로 나올 때까지 기다리겠습니다 OpenAI는 universe라는
플랫폼도 공개했습니다 gym 위에서 작동하며
더 많은 환경을 지원합니다 서로 호환이 되는 것이죠 universe가 gym을 대체하는 것이
아니라 둘 다 호환이 되는거죠 보통은 universe를 쓰지 않아도 됩니다 간단한 환경을 원한다면
gym만 사용하면 됩니다 이 강의처럼요 우리는 퐁 게임만 필요하니까
gym을 쓰면 됩니다 이미 gym 기반의 많은
알고리즘이 나와 있습니다 OpenAI 웹사이트에 가보시면 재밌게 구성 되어 있는 것을
볼 수 있습니다 필요한 라이브러리는
세 가지가 전부입니다 마이크를 고친 후 계속하겠습니다 시작하기 전에 퐁에 대해 얘기해봅시다 이 게임에서 우리가 뭘 해야 할까요? 잠시 하던 것을 멈추고
생각해봅시다 좋은 밤입니다
좋은 낮이든지요 지금 어디에 계시건
강의를 봐주셔서 감사합니다 어떻게 해야 우리 에이전트가
공을 치도록 훈련할 수 있을까요? 사람한테 게임을 시키면
뭔가 단계가 있습니다 제가 해보겠습니다 저는 퐁을 한 번도 해본 적이 없지만 AI가 공을 치는 것을 보고 공을 쳐서 상대에게
넘겨야 한다는 것을 깨닫습니다 그래야 제 점수가 오르거나 상대 점수가 떨어지니까요 사람에게는 쉽습니다 잠시 마이크를 고치겠습니다 잠시 마이크를 들고
말하겠습니다 기술적인 문제가
조금 있었고 생방송이니만큼
몇 가지 문제가 생길 수 있죠 생방송이니만큼
몇 가지 문제가 생길 수 있죠 문제를 해결하는 동안
좀 더 얘기해보겠습니다 우리는 퐁을 잘하지만 퐁에 대해서 생각하지 않고도
게임을 할 방법을 찾아야 합니다 퐁에 대해서 생각하지 않고도
게임을 할 방법을 찾아야 합니다 중요한 건 알고리즘이지
환경이 아니니까요 중요한 건 알고리즘이지
환경이 아니니까요 퐁 게임은 어떻게 동작할까요?
우리의 첫 번째 단계는 게임에서 화면을 받아 오는 것입니다 이게 게임 화면입니다
80 * 80 픽셀로 구성되었고 막대를 위나 아래로
움직일 수 있습니다 이진 결정 문제죠
어떤 화면을 받아서 막대를 위나 아래로 움직이는
액션을 하고 상대 너머로 공을 보내면
보상을 받습니다 만약 공을 놓치면 감점이고
아니면 점수는 그대로죠 상대 너머로 공을 보내면
1점을 받고 공을 놓치면 1점이 깎이고 그 외엔 0점인 겁니다 이게 우리가 할 수 있는
세 가지 액션입니다 다른 것은 중요하지 않습니다 우리는 어떤 액션이
가능한지만 알면 됩니다 policy gradient를
배우는 것이 목적이므로 퐁 게임 자체를 세세히
알 필요는 없습니다 어떤 게임에서도 잘 동작하는
보편적인 알고리즘을 만들려면 어떻게 해야 할까요? policy gradient는
강화학습의 일종입니다 policy gradient의 멋진 점들을 곧 여러분께 말씀드리겠지만 시간이 있을 때
코딩부터 하기로 하죠 시간이 있을 때
코딩부터 하기로 하죠 시간이 있을 때
코딩부터 하기로 하죠 우리가 할 것은 두 층으로 구성된
신경망을 만드는 것입니다 두 층짜리 신경망을 만들 것이고 신경망의 입력으로는
게임의 상태를 넣어줄 것입니다 신경망의 입력은 딱 한개
게임의 상태를 넣어줄 것입니다 정확히는 픽셀 값이죠
한 프레임을 넣는 겁니다 한 프레임씩
계속 넣어줄 것이고 막대를 어느 방향으로 움직일지에
대한 확률이 출력으로 나올 것입니다 막대를 어느 방향으로 움직일지에
대한 확률이 출력으로 나올 것입니다 그 확률에 따라 어떤 방향으로
움직일지 결정하고 그 확률에 따라 어떤 방향으로
움직일지 결정하고 신경망을 업데이트합니다 확률 값을 통해 Policy를 결정한 뒤
역전파로 그래디언트를 구하는 것이죠 확률 값을 통해 Policy를 결정한 뒤
역전파로 그래디언트를 구하는 것이죠 코드를 보면 이해하기
더 쉬울 것입니다 코드를 보면 이해하기
더 쉬울 것입니다 맨 처음 할 일은 하이퍼파라미터를
설정하는 것입니다 맨 처음 할 일은 하이퍼파라미터를
설정하는 것입니다 여기서는 은닉층의 뉴런 개수가 되겠죠 은닉층의 뉴런 개수를
200개로 설정해주고 배치 사이즈도 정하겠습니다 즉 한 번의 업데이트 당 몇 번의
에피소드를 겪을 것인가를 정하는 거죠 10으로 정하겠습니다 학습률은 매우 작게 설정합니다 1e-4는 0.0001이라는 뜻입니다 4는 소수점 뒤에 오는
숫자의 개수를 뜻하는 겁니다 학습률은 파라미터의 수렴을
위해 설정해줘야 합니다 너무 작으면 수렴 속도가 느려지고 너무 크면 수렴하지 않습니다 학습률은 항상 필요합니다 모델의 정확도를 위해서는
학습률을 꼭 설정해줘야 합니다 모델의 정확도를 위해서는
학습률을 꼭 설정해줘야 합니다 이제 gamma 값을 설정합시다 gamma는 policy gradient
알고리즘이 필요로 하는 값인데 gamma는 policy gradient
알고리즘이 필요로 하는 값인데 discount factor를 뜻합니다 discount factor의 뜻은 나중에 관련된
함수를 코딩하면서 말씀드리겠습니다 똑같은 보상을 나중에 받을수록
상대적으로 손해이기 때문에 멀리 보기보다는 곧 받을 수 있는
보상을 기준으로 최적화를 진행할 것입니다 멀리 보기보다는 곧 받을 수 있는
보상을 기준으로 최적화를 진행할 것입니다 나중에 어떤 일이 일어날지는 모릅니다 지금 우리가 다루는 게임은
많은 레벨과 다양한 요소로 구성된 젤다의 전설 시간의 오카리나
같은 게임이 아닙니다 공을 이쪽으로 보내두거나
요정 아이템을 주워 두는 것이 5레벨 후의 보스를 쓰러뜨리는데
도움을 주는 복잡한 게임이 아니죠 이건 퐁입니다 퐁은 그냥 보시는 그대로
게임이 흘러갑니다 그냥 보이는 것이 전부죠 그냥 보이는 것이 전부죠 나중에 코딩을 하며
더 자세히 설명하겠습니다 나중에 코딩을 하며
더 자세히 설명드리겠습니다 이제 decay rate를 0.99로
정하겠습니다 이는 경사 하강법 알고리즘 중 하나인
RMSprop에 쓰이는 값입니다 텐서플로우를 사용할 경우
이 부분은 필요하지 않습니다 모든 내용을 직접 짜기 때문에
필요한 코드인 것이죠 텐서플로우의 장점 중 하나는
자동 미분입니다 미분 과정을 텐서플로우가
자동으로 처리해준다는 뜻이죠 그렇지만 이 강의에서는
직접 미분을 구현할 것이기 때문에 이 부분이 필요합니다
하드 모드인거죠 resume 값은 False
설정해줍니다 예전에 저장된 체크포인트부터
다시 시작할 것이냐를 결정하는 값이기 때문이죠 이제 모델을 초기화해봅시다 모델을 초기화한 후
5분간 질문에 답변하겠습니다 모델을 초기화한 후
5분간 질문에 답변하겠습니다 입력의 차원은 얼마일까요? 입력은 80 * 80 크기의
픽셀 프레임이므로 D는 80으로 설정해줍니다 이 값을 더 크게 설정해주면
게임 화면도 더 커져야겠죠 만약 resume이 참이면 미리 저장된 모델을
불러와야 할 것입니다 cPickle은 여기에 쓰려고
import 해 둔 것입니다 저장된 파일을 읽어서 모델을 로딩합니다 이게 불러오기 기능이었고 여러분이 잘 따라오시는지
한 번 확인하겠습니다 여러분이 잘 따라오시는지
한 번 확인하겠습니다 여러분이 최고예요 resume이 거짓일 경우
직접 모델을 초기화 해줘야 합니다 이 부분이 중요합니다 이 부분이 중요합니다 모델의 가중치를 초기화 할 것입니다 어떻게 하면 가중치를
초기화 할 수 있을까요? 생각해봅시다 계속 쓸데없는 알림이 오네요 하지만 강의를 해야 하기 때문에 알림을 지울 여유는 없습니다 어디까지 했었죠 모델을 완전히 랜덤값으로
초기화 하는 것보다 가짜(pseudo) 랜덤값를 사용하는
더 좋은 방법을 쓸 것입니다 Xavier 초기화라는 방법입니다 Xavier 초기화라는 방법입니다 지금 하는 것은 모델 가중치를 초기화 할 때
은닉층의 노드를 고려하는 것인데 첫 번째 가중치 그룹을 생각해봅시다 지금 신경망에는 두 층이 있죠 첫 번째 가중치 집합은
은닉 노드의 개수와 입력 차원을 고려하여
랜덤값으로 초기화합니다 (H, D)가 랜덤값을 선택할 구간이고 (H, D)가 랜덤값을선택할 구간이고 그 값을 D의 제곱근으로 나눠줍니다 이렇게 초기화하는 이유는 이렇게 초기화하는 이유는 일단 Xavier 초기화에 관한
수식을 몇 가지 보여드리겠습니다 일단 Xavier 초기화에 관한
수식을 몇 가지 보여드리겠습니다 Xavier 초기화는 코드와 같은 공식입니다 이 코드가 곧 공식입니다 H부터 D까지의 구간에서
뽑은 값을 √D 로 나눈 것이 그냥 랜덤값을 쓰는 것보다 좋습니다
이렇게 하면 가중치가 너무 크거나 작아 전파가 잘 되지
않는 것을 방지할 수 있습니다 너무 크거나 작아 전파가 잘 되지
않는 것을 방지할 수 있습니다 경사 소실 문제와 비슷합니다 만약 초기화 된 가중치가
0에 매우 가까웠다면 여러 층을 거칠수록
신호의 크기는 점점 작아집니다 여러 층을 거칠수록
신호의 크기는 점점 작아집니다 가중치가 너무 크다면
신호는 점점 커집니다 이제 첫 번째 가중치 집합을
초기화했으니 다음 가중치도 같은
방법으로 초기화하겠습니다 두 집합 모두 같은 방법으로
초기화를 해줍니다 모델에서 가중치는
키-값 쌍으로 표현됩니다 키는 가중치나 층이 될 것이고 값은 대응되는 벡터가 되겠죠 값은 대응되는 벡터가 되겠죠 실제 행렬의 값을 말합니다 두 번째 집합은 H 구간에서
뽑은 후 √H로 나눠 초기화합니다 이미 주어진 입력이
W1의 가중치를 한 번 거쳤기 때문에 이미 주어진 입력이
W1의 가중치를 한 번 거쳤기 때문에 이미 주어진 입력이
W1의 가중치를 한 번 거쳤기 때문에 W2의 가중치는 다르게
초기화해줍니다 W2의 가중치는 다르게
초기화해줍니다 이게 Xavier 초기화입니다
지금 우리는 numpy만 사용해서 저수준까지 직접 코딩하고
있다는 것을 잊지 마세요 이제 두 변수를 더 초기화할 것입니다 gradient buffer와 RMSprop cache입니다 일단 gradient buffer에는
0으로 이루어진 벡터를 할당하고 일단 gradient buffer에는
0으로 이루어진 벡터를 할당하고 그 다음엔 모델의 각
키-값 쌍에 대해서 모델을 파이썬 딕셔너리로
관리하면 이런 이점이 있죠 모델을 파이썬 딕셔너리로
관리하면 이런 이점이 있죠 gradient buffer를 설정했고 창을 조금만 줄여 보죠 창을 조금만 줄여 보죠 이제 RMSprop를 알아봅시다 rmsprop_cache라는
변수를 선언하고 이 줄만 쓰고 질문을 받겠습니다 그때까지 질문을 모아두세요 제 생각엔 이미 말을 너무
빨리한 것 같습니다 여러 번의 피드백을 통해
스스로 알아차릴 수 있게 되었죠 시행착오를 통해서 말이죠 여기서 한 것은 뭘까요 이것만 설명하고
질문에 답하겠습니다 gradient buffer와
rmsprop cache를 선언했는데요 gradient buffer는
역전파를 진행할 때 사용합니다 그래디언트 값을 저장할 때
사용하는 변수죠 지금은 전부 0이지만 이 변수에 그래디언트 값을
계속 더해나갈 것입니다 역전파를 할 때
보실 수 있을 겁니다 rms cache 변수는
RMSprop 공식에 나오는 값을 저장합니다 우리가 곱하는 값도 포함되고 이 캐시에 적용할 것입니다 이 변수를 실제로 쓸 때
더 자세히 설명하겠습니다 지금 당장은 모델의
모든 변수에 대해 0으로 초기화되어 있습니다 이제 두 질문에 대해 답한 뒤 다시 진행하겠습니다 Omar Miranda가 확률적과
비확률적의 정의에 대해 질문했습니다 수학에서 확률적이라는 것은
선거처럼 예측할 수 없다는 것입니다 선거의 결과는 확률적이죠
어떤 결과가 나올지 알 수 없습니다 인생도 확률적이죠 만약 운명을 믿는다면
인생은 확률적이지 않습니다 운명은 결정적입니다
이미 결과가 정해져 있죠 확률적의 의미는 어떤 일이
일어날지 아닐지 알 수 없다는 겁니다 랜덤 넘버는 항상 확률적입니다 상수는 항상 결정적이고 질문을 다른 말로 바꾸면 지금 다루는 이 값이
확률적인 값들인가 아니면 결정적인 값들인가로
말할 수 있습니다 자유 의지에 대한 질문으로도
볼 수 있겠는데 인간에게 의식이 무엇인지뿐 아니라
자유의지나 결정론을 수학적으로 인간에게 의식이 무엇인지뿐 아니라
자유의지나 결정론을 수학적으로 얘기할 수 있게 해주니
꽤 멋있게 느껴집니다 저는 지금 이 상황이
확률적이라고 생각합니다 우리에겐 자유 의지가 있고
우리가 내리는 결정은 미리 정해진 것이 아니며
딥러닝도 그런 방향으로 나아가는 것을 곧 볼 것입니다 연구자든 개발자든
딥러닝에 종사하는 사람들이 딥러닝 모델에 확률적 요소를
점점 늘리는 것을 볼 수 있습니다 딥러닝 모델에 확률적 요소를
점점 늘리는 것을 볼 수 있습니다 결과를 예측할 수 없으니
멋진 일이죠 Variational Auto-Encoder(VAE)가
좋은 예시입니다 다른 질문입니다
사실 질문이 계속 들어오기 때문에 빠르게 답하도록 하겠습니다 학습에 가장 적합한 배치 사이즈는 무엇인가요
그리드 서치를 하세요 Alvaro Garcia의 질문입니다
하이퍼파라미터를 어떻게 정했나요 경험적으로 잘 되는 것을 골랐습니다 하이퍼파라미터를 학습하기 위한
방법이 따로 없다면 논문에 나온 값을 쓰세요 하이퍼파라미터를 새로 찾고 싶다면
Grid Search를 써보세요 퍼셉트론의 가중치와 편향 값의
AND/OR 로직과의 관련성을 위한 자료를 추천해주세요 구글의 Andrew Trask가 가진
자료가 좋습니다 단백질 예측 모델 품질 평가를 위해서 텐서플로우를 어떻게 사용하면 좋을까요
* 2018년 12월에 AlphaFold가 발표되었습니다 정확히 어떤 내용을
말씀하시는지 모르겠지만 유전자 검사 등의 예측 작업같이
일단 분류 문제로 가정하겠습니다 데이터셋이 있을 것이고
단백질의 타입을 분류하겠죠 아마 미리 답을 달아둔
데이터가 있을 것인데 만약 없다면 팀과 같이
직접 답을 붙여야겠죠 그럼 그 데이터에서
분류기를 시험해보고 순전파 신경망을 사용할 것입니다
유전자 데이터로 미리 학습된 신경망의 가중치를 사용해서
전이 학습을 할 수 있을 것입니다 유전자 선행학습 전이 신경망인거죠 구글에서 검색해보세요 계속 진행하겠습니다 이제 활성화 함수를 정의하겠습니다
모든 내용을 직접 짜고 있기 때문에 코드를 꽤 많이 짰습니다 코드를 꽤 많이 짰습니다 활성화 함수로는
시그모이드 함수를 사용할 것입니다 시그모이드만 사용하는 것은 아닙니다 다른 함수도 사용할 것입니다 ReLU라는 활성화 함수도
사용하려고 합니다 ReLU라는 활성화 함수도
사용하려고 합니다 이제 1을 이 값으로 나눕니다
시그모이드는 항상 이렇게 계산할 수 있고 그 결과는
일종의 확률값입니다 일종의 압축이라고 할 수 있죠
벡터값을 확률로 바꿔줍니다 그 후 전처리 과정을 거쳐줍니다 전처리 과정은 한 게임 프레임을 입력으로 받고 I라는 변수에
게임 프레임이 들어옵니다 주어진 프레임에서
공이나 막대들의 필요한 정보를 추출해줍니다
막대는 2개죠 프레임의 다른 부분은
필요하지 않습니다 이제 프레임을 받아서
공과 막대들이 있는 부분만 잘라내 사용할 것입니다 왜 하필 이 매직넘버로 자르냐고요? 원래는 시행착오를 거쳐서
찾아야 합니다 원래는 시행착오를 거쳐서
찾아야 합니다 잘라낸 프레임을 창으로 열어
어느 부분인지 확인하고 다시 창을 닫는 것이죠 이게 프레임을 잘라내는 단계이고
잘라낸 후에는 이게 프레임을 잘라내는 단계이고
잘라낸 후에는 절반으로 다운샘플링을 합니다
즉 이미지의 부분 집합만 보겠다는 것이죠 지금 쓰고 있는 이 숫자들은
사전에 찾아둔 값입니다 그냥 알게 되는 값이 아니죠 픽셀값이 144이면
오렌지색의 배경을 의미합니다 픽셀값이 144이면
오렌지색의 배경을 의미합니다 픽셀값이 144이면
오렌지색의 배경을 의미합니다 게임에 필요하지 않은 부분이므로 0으로 설정해 지우겠습니다 배경을 지우는 것이죠 우리가 만든 모델이
잘 다루지 못하는 부분을 직접 도와주고 있는 것입니다 지금 하는 것처럼 직접
코드를 짜서 도울 수 있습니다 픽셀값이 109인 경우는 다른 배경을 나타냅니다 배경이 두 층으로 있는 것이죠 아마 이때까지 짠 코드 중
오류가 있겠지만 일단 함수를 완성한 뒤
살펴보도록 하겠습니다 0이 아닌 픽셀값은
모두 1로 바꾸겠습니다 게임에 나오는 막대들과 공은
1로 바뀐다는 뜻입니다 게임에 나오는 막대들과 공은
1로 바뀐다는 뜻입니다 이제 배열을 펼쳐서
리턴하도록 하겠습니다 numpy의 ravel 함수를
사용하면 배열을 1차원으로 펼쳐줍니다 배열을 1차원으로 펼쳐줍니다 이제 다른 헬퍼 함수를
계속 정의하겠습니다 이제 다른 헬퍼 함수를
계속 정의하겠습니다 이때까지는 쉬운 부분만 다뤘고
이제부터 재밌어질 것입니다 discount reward라는
재밌는 부분을 다룰 겁니다 discount reward라는
재밌는 부분을 다룰 겁니다 지금 우리는 단기 보상에 초점을
맞춰 최적화를 하고 있습니다 장기적인 보상이 아니라 당장의 단기적인 보상이요 그걸 반영하는 부분이
discount reward 입니다 그걸 반영하는 부분이
discount reward 입니다 각 시간마다 리워드가 주어집니다 에이전트는 공이 움직이고
한 플레이어를 넘어갈 때마다 에이전트는 공이 움직이고
한 플레이어를 넘어갈 때마다 학습하게 됩니다
그리고 게임은 리셋되죠 학습하게 됩니다
그리고 게임은 리셋되죠 점수는 유지되지만
공과 게임은 다 리셋됩니다 이런 일이 발생할 때마다
리워드를 받을 것이므로 배열에 저장하게 되고 그걸 discount_reward 함수에
넘겨주게 됩니다 그럼 discount_reward 함수에서는 각각의 리워드마다 다른
가중치를 매길 것입니다 더 빨리 받은 리워드일수록
더 가중치를 높게 주는 것이죠 더 빨리 받은 리워드일수록
더 가중치를 높게 주는 것이죠 구현을 보면 이해하는데
도움이 될 것입니다 함수 구현이 끝나면
몇몇 질문에 답하도록 하겠습니다 일단 discounted_r을
0으로 설정해줍니다 일단 discounted_r을
0으로 설정해줍니다 0으로 채워진 행렬이죠 이게 가중치가 적용된
리워드 값의 행렬이 될 겁니다 이게 가중치가 적용된
리워드 값의 행렬이 될 겁니다 물론 관련된 공식도 있습니다 잠시 공식을 보여드리겠습니다 모두를 위한 강화학습이라는 강의를 검색하면
*김성훈 교수님의 모모딥 discount reward라는
검색어도 추가하면 discount reward 공식이라고
검색하는 것이 더 낫겠네요 제가 어떻게 자료를 검색하는지
보여드리는 것도 괜찮네요 이렇게도 표현할 수 있지만 어떻게 보여드리고 싶냐면 김성훈 교수의
깃허브를 살펴봅시다 이 페이지에서 훌륭하고 직관적인
설명을 볼 수 있습니다 감소율이 있고
그에 맞춰 가중치를 줍니다 감소율이 있고
그에 맞춰 가중치를 줍니다 더 먼저 받은 리워드를
나중에 받은 리워드에 비해 지수적으로 큰 가중치를
주는 것입니다 시간이 지날수록
그 때 받은 리워드 값에 가중치를 곱해
지수적으로 작게 만듭니다 가중치를 곱해
지수적으로 작게 만듭니다 장기적으로 어떤 일이
생길지 알 수 없기 때문에 단기적인 성과에 초점을 두고
최적화를 진행하는 것입니다 게임의 현재 상황만
신경쓰면 됩니다 퐁은 진행 속도가 빠른 게임입니다 먼저 running_add 라는
변수를 초기화하겠습니다 먼저 running_add 라는
변수를 초기화하겠습니다 이 변수에는 리워드값의 합을
저장할 것입니다 0부터 r.size 까지의 구간에 대해 리워드 값이 0이 아니면 running_add에 0을 대입합니다 running_add에 0을 대입합니다 이제 합을 구할 것입니다 이 공식을 따르기만 하면 됩니다 이 공식을 따르기만 하면 됩니다 Σ 표기법은 어려운 것이 아니고
그저 표기법일 뿐입니다 그냥 값들을 모두
더한다는 것을 의미합니다 그냥 값들을 모두
더한다는 것을 의미합니다 이제 실제로 공식을 적용하겠습니다 running_add와 gamma를 곱합니다 gamma는 리워드값의 감소율을 뜻하죠 이걸 통해 시간이 지날수록
리워드의 중요도가 지수적으로 감소하게
만들 수 있습니다 퐁 게임을 깨는 에이전트를
만들기 위해서 시간에 대한 얘기도 나오고
의식에 대한 얘기도 나오는군요 우리는 어디로 가고 있는 걸까요 강의가 모두 끝나고 나면 알게 되실 겁니다 이제 감소율이 적용된
리워드 값을 리턴해줍니다 몇 가지 질문을 답하고
넘어가겠습니다 빠르게 답해보도록 하죠 지금 다룬 내용을 텐서보드를 통해
시각화할 수 있을까요 그러기엔 시간이 충분치 않네요
나중에 여러분이 원하는 스포츠 결과 예측 강의 때는
해보도록 하겠습니다 딥마인드의 미분가능 신경컴퓨터에
대한 강의를 만들 거냐고요? 절 잘 알고 계시네요 제가 정말 좋아하는 논문입니다
강의를 곧 만들 예정입니다 단기와 장기가 각각 무슨 뜻으로
쓰였냐는 질문입니다 단기적인 게 무슨 뜻이냐면 공을 상대방 너머로 보내면 1점을 얻게 되죠
그게 단기적인 보상이고 만약 공을 움직인 후
30분이 지나야 보상을 받는다면 만약 공을 움직인 후
30분이 지나야 보상을 받는다면 무슨 액션을 하든
그에 따른 보상을 받긴 하지만 30분 뒤에 보상을 받는다고
가정해보겠습니다 그 보상을 왜 받았는지
알아내기 위해서 30분 전의 액션을
추적해낼 수 있을까요 그렇게 해야만 할까요 이번에 받은 보상의 원인을
알아내기 위해서 40번 전에 어떤 액션을 하고 어떤 리워드를
받았는지 모두 살펴봐야 할까요 아닙니다 그럴 필요는 없습니다 우리가 학습시킬 에이전트는
예전에 무엇을 했는지 점진적으로 학습되는게 아닙니다 그래서 단기적인 보상은 지금 당장
공이 상대방을 넘어갔느냐를 뜻합니다 다른 질문입니다 0번째부터 25번째 줄까지
소리에 문제가 있었는데 다시 설명해줄 수 있나요
개략적으로 다시 짚어보도록 하죠 행렬 연산, 저장 및 불러오기,
게임 환경 구축에 쓰일 3개의 라이브러리를 불러오고 선언된 하이퍼파라미터는 각각
h는 은닉층의 크기 batch_size는 한 배치 당
들어 있는 에피소드의 개수 learning_rate는 신경망의 수렴을 위해 필요했고 gamma는 먼저 받은 리워드가
더 높은 가중치를 가지게 도와주는 역할이었죠
우리의 목표는 단기적인 리워드를 최대화하는 것이니까요
decay_rate는 추후 설명하겠습니다 resume은 저장된 모델을 불러올지
새로 학습할지 결정하는 값입니다 이제 모델을 만듭니다
D는 입력의 크기를 의미하고 저장된 상태에서 모델을 불러오거나
Xavier 초기화라는 똑똑한 방법을 통해 새로 모델을 만듭니다 그 과정에서 은닉층의 크기와
입력의 크기가 필요하죠 행렬값을 확률로 압축시키기 위해
활성화 함수로 시그모이드를 정의하고 공과 막대들만 나오게
프레임을 전처리해주고 그 뒤로는 강의했던 바와 같습니다 자연어처리에 쓰이는 신경망 종류가 LSTM인가요
맞습니다 LSTM은 텍스트 생성에도 좋고
텍스트 분류에도 좋습니다 LSTM은 텍스트 생성에도 좋고
텍스트 분류에도 좋습니다 텍스트를 다루는 과제에선
거의 항상 LSTM이 가장 낫습니다 이제 헬퍼 함수를
두 개 더 정의하겠습니다 순전파와 역전파 함수인데요 텐서플로우를 안 쓰면 각 함수가
어떻게 되는지 보실 수 있을 겁니다 텐서플로우의 마법없이 각 함수가
어떻게 되는지 보실 수 있을 겁니다 그런데 텐서플로우는
긴장을 좀 해야 할 겁니다 파이토치가 쫓아오고 있거든요 얀 르쿤 교수는 파이토치
커뮤니티에 대해 얘기하고 있고 심지어 저는 5분짜리 파이토치
강의 영상을 만들고 있습니다. 스포일러군요 이제 순전파로 넘어가겠습니다
가장 먼저 할 것은 게임 화면의 픽셀 값을
입력 x로 받아서 게임 화면의 픽셀 값을
입력 x로 받아서 은닉층의 상태 h를
내적으로 계산하는 것입니다 은닉층의 상태 h를
내적으로 계산하는 것입니다 선형 대수인데
그냥 행렬의 곱셈입니다 내적을 통해 두 가중치 행렬을
곱할 것입니다 주어진 입력 x에
첫 번째 가중치 행렬 W1을 곱하면 주어진 입력 x에
첫 번째 가중치 행렬 W1을 곱하면 벡터값으로 표현된
은닉층의 상태가 나옵니다 그 상태를 계산하고 나면
비선형 함수를 통해 값을 압축시킬 것입니다 바로 ReLU 함수인데요
ReLU가 무엇이냐면 주어진 값과 0 중 더 큰 값을
고르는 함수입니다 주어진 값이 0보다 작으면
결과는 0이 됩니다 입력이 0보다 더 크면
결과는 입력 그대로입니다 ReLU는 신경망의 중간에 들어가는
활성화 함수 중 가장 많이 쓰입니다 ReLU는 신경망의 중간에 들어가는
활성화 함수 중 가장 많이 쓰입니다 그에 비해 시그모이드는 주로
신경망의 끝부분에서 주어진 값을 확률로 변환하는 등의
역할로 많이 쓰입니다 주어진 값을 확률로 변환하는 등의
역할로 많이 쓰입니다. 분류나 뭐 그런 값을 압축하고 난 후
로그 확률 값을 계산합니다 사실 진짜 로그 함수를
쓴 것은 아닙니다 다만 뒤쪽에서 이 값을 그런 역할로
쓸 것이기 때문에 그렇게 부르겠습니다 이제 다음 가중치 행렬 W2와
은닉층의 상태 h를 내적해서 이제 다음 가중치 행렬 W2와
은닉층의 상태 h를 내적해서 두번째 층을 계산합니다 이제 시그모이드 함수를 통해
확률 값을 계산할 수 있습니다 이제 시그모이드 함수를 통해
확률 값을 계산할 수 있습니다 막대를 위로 올릴지 아래로 올릴지
아니면 그대로 둘지에 관한 확률이죠 이제 이 확률을 기반으로
어떤 액션을 할지 정하고 역전파 시 각 가중치에 대한
편미분을 통해 그래디언트를 계산할 수 있습니다 이에 대해서는 곧 다룰 것입니다 이제 p와 h를 리턴합니다 시간이 많이 지났군요 2번 액션을 선택할 확률과
은닉층의 상태를 리턴합니다 저리 가 코드한테 말한 겁니다 이제 policy_backward 함수를
다루도록 하겠습니다 이제 policy_backward 함수를
다루도록 하겠습니다 왠지 질문이 있을 것 같은데
답변하고 넘어가도록 할까요 질문이 없네요 그래도 반응을 한번 살펴보겠습니다 모두 잘 따라오고 계시네요
어디까지 했었죠? 음향 오류로 인해 5분이
넘을 수도 있습니다 이제 할 것은 두 층 모두에 대해 재귀적으로
오차 도함수를 계산하는 것입니다 두 층 모두에 대해 재귀적으로
오차 도함수를 계산하는 것입니다 이게 프로그래밍에서의 연쇄 법칙입니다 epdlogp는 어드밴티지를 고려한
그래디언트 값입니다 어드밴티지의 의미는
곧 다루도록 하겠습니다 어쨌든 지금 하는 것은
새로 갱신된 W2에 대한 도함수를 계산하는 점부터 시작합니다 코딩을 하면 좀 더
이해에 도움이 될 것입니다 여기 내적을 사용하고 내적에는 전치 행렬을 넣습니다 eph는 은닉층의 상태를
저장한 배열이고 eph는 은닉층의 상태를
저장한 배열이고 에이전트가 공을 놓칠 때마다
한 게임이 끝나는데 한 에피소드는
여러 게임을 담고 있고 그 모든 게임에서
은닉층의 상태를 가져온 것입니다 그 모든 게임에서
은닉층의 상태를 가져온 것입니다 dW2는 W2에 대한 도함수 값입니다 이걸 통해 가중치를 갱신할 것입니다 그 후에 은닉층의
도함수를 계산하고 그 후에 은닉층의
도함수를 계산하고 거기에 활성화 함수를
적용하겠습니다 거기에 활성화 함수를
적용하겠습니다 이 부분을 코딩하고 나면
몇몇 질문에 답하겠습니다 여기서 활성화 함수는 ReLU고
np.outer는 외적입니다 두 값에 대해서 외적을 해준 뒤 dh[eph

51 comments on “How to Beat Pong Using Policy Gradients (LIVE)

  1. hey I tried running the code and I got.

    grad_buffer = { k: np.zeros_like(v) for k,v, in model.iteritems()}
    AttributeError: 'dict' object has no attribute 'iteritems'

  2. Hi Siraj, thanks for introducing https://github.com/hunkim/DeepLearningZeroToAll. As always, I really enjoyed this video. You rock!

  3. 23:25 it is extremely impractical to optimise hyperparameters on this task with grid searching and this is true most decently complex neural networks.

  4. siraj, I have a decently powerful gpu that would speed up training but im not sure what i need to do to let my programs make use of it. what do I need to do?

  5. Hi Siraj, awesome video. Love hard mode :-). In the beginning of the video you mention 6 hours of training in the cloud. Which provider and which tier are you referring to? For example Google has a basic, standard and professional tier with their ml engine, all with different computational power and associated cost.

  6. Was gonna say http://karpathy.github.io/2016/05/31/rl/ seen that blogpost a while ago. Another interesting video. Have thought about summarising your live videos to max 10 minute length short ones afterwards?

  7. can anybody help me with this..? not able to determine how to reshape the tensor so network would accept it…please help
    http://stackoverflow.com/questions/43412395/how-to-reshape-input-matrix-so-this-network-could-function

  8. So it tells me I need to do 'pip install gym[atari]', but when I run that i get 'gym[atari] not found'. Any ideas anyone?

  9. What to do if I have multiple actions (e.g., up, down, left and right)?

    For example, how to roll the dice on line 181 and create a fake label on line 186?

  10. So I did the experiment and ran it on my Toshiba Tecra (i5 4gB ram) for four days straight. Starting running mean was -20 and after 4 days had dropped to -17.921621. I can see that it improved and in the last episode won 7 of the 20 games. I'm guessing with some serious grunt this could have been done way faster, but it was interesting to see it for myself & the kids watched along with Agent Smith's progress. Still at the end of the 4 days I could crush him like a bug; a BUG I tells ya!

  11. Hey Siraj, what do you think of Tree-structured Parzen Estimator for hyperparameters estimation compared to gridsearch or randomsearch?
    I'm trying it on kaggle Quora question pairs competition, but it is hard to find the optimal tradeoff between the data subset size for using on the trials and the time spent on it.

    And you still rocking!!! Keep going! =D

  12. Great video and explanations. I would however say you should more or less give Karpathy credit for all the code, and you dont really do so in the video. Seems like it's almost identical.

    When thats said, however, very glad for the walkthrough!

  13. I think the hard part about implementing an deep learning algorithm is not how to build the model, but the functions to feed the model in a good way.

  14. Siraj Thank you for good lecture~
    This lecture has no English subtitles. please English subtitles in this lecture.

  15. Hello, Siraj! I am a huge fan of all the very helpful work you've been doing, and I hope you can continue to create such awesome content in the future! A question though.. I was under the impression that numpy only ran on a CPU, but you trained this on a GPU cloud machine? How did you manage to do such a thing? Thanks again for your time and effort!

    p.s. Any advice for starting an undergraduate research lab for deep learning?

  16. Are policy gradients used in robotics or is it simply not feasible since it takes so many iterations? What is the best reinforcement learning algorithm to use for a robotic arm? Thanks

  17. Hi Siraj,
    I have been following you video, thanks for them you are going great job.
    I like the transfer learning and implemented it myself.
    Also I used this to run on my AWS EC2 instance but unable to see the play back of game please suggest any solution.

  18. after i tweak and run the code (for python3) it opens pong and doesn't do anything. is there something i am missing?
    ps: same result in python 2

  19. Great video!! Thanks! I think the questions feature is also good, but it would be nice if questions cover the current machine learning problem only instead of the entire AI space.

  20. Thank's that you explain the "gamma" I was miss that in my amature C++ test.
    decay_rate seem to make similar effect on the system as far as understand/missundertand your explanation. Dose the decay_rate decrease the gradient decent (delta) how was long time ago ??

  21. Thank's I was made some similar in C++ and OpenCV
    https://youtu.be/6qqZl7DxmOs
    Unfortnatly I did not get the principle difference of gamma and decade_rate parameterns

  22. Not that is to install gym[atari] on windows, but try installing from this wheel https://github.com/Kojoley/atari-py/releases

  23. You almost used the Karpathy's code in http://karpathy.github.io/2016/05/31/rl/ . You could give more credits and do something different (such as using tensor flow instead of manual NN with numpy)

  24. My pong window is re sizable , does it matter if i increase its size , cause if i increase the size the game slows down and if i decrease the window size the games becomes faster, so does it effect the model ?Do i have to keep it at a certain dimension ?

  25. I'll be honest I'm at 11 minutes and it's starting to hurt my ears and I can't focus on a word you're saying. Just some feedback, I know this is a year old but if that ever happens again in the future you would be better off saying "Sorry guys chill out for a couple minutes we need to make sure this is absolutely fixed so you can fully understand me." And people will be willing to wait. I would respect you for taking the time to fix it instead of rushing through trying not to lose viewers because it's live. I have no idea if that's what you do anyways later on in the video, you very well may end up saying "let me fix this" but that's just my opinion for some constructive feedback.

  26. Okay so now at 18:52 it appears you fixed the microphone issue. But.. And this is just feedback. I'm sure you know this already, but anyways… So I'm sure the rest of the video gives great advice but I'm so like….. tense…. from constantly cringing watching everyone run around trying to be "professional". And that's not anyone's fault but the college that taught them that. Old 60s broadcasting training. And "The show must go on". But you should understand where I'm coming from Siraj… It's 2018 lol (Okay 2017 in the vide but only a year off, I would have said the same thing last year)… To me, even as a loyal follower and consumer of your content, this video aggravated me to the point of skipping it all together.. And the reason is because you're on YouTube not National Television. Your audience isn't 80 year old grandmothers. We're all sitting in our pajamas watching this eating pizza. Your videos are one click and 2 inches away from porn or cat videos that we're probably gonna use as an interlude anyways. This isn't just you, it's everyone on here… Stop trying to be "Professional" and be "Real"…

  27. Hi Siraj, great tutorial. Why do you use np.dot instead of weights and biases for the "hard coded" neural network?

  28. On the note of free will and stochastic processes, I don't think randomness implies free will – I think it's certainly possible that the universe is not deterministic (Quantum mechanics) but either way our thoughts have no influence over the outcomes of particles.

  29. You forgot to copy and paste the lines 84 (recording inputs), 85 (recording hidden states), and 86 (calculating 'y' the fake label) from Karpathy's code.

Leave a Reply

Your email address will not be published. Required fields are marked *