1077 단어
5 분
테트리스 깨는 AI 제작 - 3

프로젝트 개요#

AI에 대해서는 예전부터 관심이 있었고 C++과 rust같은 로우레벨 프로그래밍 언어도 개인적으로 좋아합니다.

그래서 이번 프로젝트는 C++와 CUDA를 활용해 외부 라이브러리 없이 테트리스 게임을 직접 구현하고, 이 게임을 스스로 플레이하며 최고 점수를 노리는 강화학습 에이전트를 처음부터 만들어보는 과정을 기록하는 것을 목표로 할 것입니다.

로우레벨 언어와 인공지능, 그리고 GPU 프로그래밍에 관심이 많은 학부생으로서, 이미 잘 만들어진 라이브러리나 프레임워크에 의존하지 않고 처음부터 모든 것을 직접 설계하고 구현해보는 경험을 통해, 진짜로 시스템이 어떻게 돌아가는지 깊이 이해하고 싶습니다.

또한, GPU의 병렬 연산 능력을 실제로 활용해보며, 이론으로만 배웠던 개념들이 실제 코드와 하드웨어에서 어떻게 동작하는지 체험하고자 합니다.

이 프로젝트를 통해 배우고자 하는 가장 큰 목표는, 강화학습의 핵심 원리와 GPU 프로그래밍의 실전 기술을 내 손으로 직접 구현하며 익히는 것입니다.

테트리스라는 익숙한 게임을 스스로 만들고, 그 위에서 동작하는 에이전트를 설계하면서, 상태 공간과 행동 집합, 보상 함수 설계의 중요성을 느낄 것입니다.

또한, CUDA를 활용해 대량의 시뮬레이션을 병렬로 처리하는 과정에서, GPU 메모리 관리나 커널 최적화와 같은 실전적인 문제들을 직접 해결해보고자 합니다.

라이브러리 없이 신경망이나 알고리즘을 처음부터 구현하는 과정에서, 평소에는 잘 느끼지 못했던 컴퓨팅 자원의 한계나, 병렬 연산의 어려움도 경험할 수 있을 것이라 기대하고 있습니다.

어려움도 많겠지만 이런 난관들을 직접 부딪히고 해결해가는 과정에서, 단순히 결과만 얻는 것이 아니라, 문제를 분석하고 해결책을 찾아가는 과정 자체가 큰 성장의 기회가 될 것이라고 생각합니다.

오늘 한 것#

레이어 클래스 구현

README 생성

네임스페이스 재정의

회고 및 앞으로 할 일#

엊그제 텐서 클래스를 완성하고 나서 텐서를 이용하여 만들 수 있는 레이어 클래스, 즉 Convolution 레이어, Linear 레이어같은 실제로 모델을 구성하는 레이어의 부모를 선언하고 정의하였습니다.

cuDNN을 이용한 코드로 기존 텐서 클래스의 코드도 갈아엎고 이번 레이어 클래스도 제작했습니다.

각 레이어는 가중치와 편향을 가지고, 입력과 출력을 shared_ptr로 공유해서 가지며 텐서 자체는 cudnn_frontend::graph::Tensor_attributes를 사용하여 저장을 하고 있습니다.

그리고 이 클래스를 상속해서 Tensorflow에서 Dense Layer라고 불리고 Pytorch에서 Linear 레이어라고 불리는 선형 레이어를 제작했습니다.

순전파는 평범하게 XW+B=YXW+B=Y 라는 행렬 곱 연산을 이용해서 구현을 하였습니다.

역전파는 좀 이해하기 어려운 점도 있었는데 일단 편미분까지는 기존에 알고있던 지식이 있어 이해했지만 편미분을 행렬형태로 확장시키는 것이 힘들었습니다. 어찌저찌해서 가중치 W에 대한 미분이

EtotalW=XTLY\frac{\partial E_{total}}{\partial W} = X^T \cdot \frac{\partial L}{\partial Y}

라는 것과 입력 X에 대한 미분이

EtotalX=LYWT\frac{\partial E_{total}}{\partial X} = \frac{\partial L}{\partial Y}\cdot W^T

라는 것을 이해하고 코드로 구현했습니다.

이제 모델을 쉽게 생성할 수 있도록 모델 클래스를 잘 설계하고 만들어야겠습니다.

프로젝트 깃헙#

Ushio-Hayase
/
Ushionn
Waiting for api.github.com...
00K
0K
0K
Waiting...