반응형
이전 글에서 DQN을 구현해 CartPole 환경을 학습시켜보았습니다. DQN은 간단하고 효과적이지만, 여전히 다음과 같은 문제가 남아 있습니다.Q값의 과추정(Overestimation): DQN은 최대 Q값을 직접 사용하기 때문에, 노이즈나 학습 초기 불안정으로 인해 실제보다 높은 Q값을 선택하는 경향이 있습니다. 이로 인해 정책이 왜곡될 수 있습니다.데이터 효율성과 안정성 문제: 경험 리플레이를 사용하지만, 모든 transition이 동일한 확률로 샘플링됩니다. 또, Q값 계산 시 행동에 따른 Q분포를 좀 더 효율적으로 학습할 수 있는 구조적 개선도 가능할 것입니다.이러한 문제를 완화하기 위해 다양한 DQN 변형 알고리즘이 제안되었습니다. 그중 대표적인 두 가지를 소개하겠습니다.Double DQN (..
지금까지 우리는 CUDA 프로그래밍 기초부터 시작해 Host-Device 메모리 관리, 스레드/블록/그리드 개념, 비동기 스트림, 메모리 계층(Shared/Constant) 최적화 기법, 그리고 CMake와 Modern C++를 활용한 빌드 환경 개선까지 쭉 달려왔습니다. 이제 어느 정도 기본기가 갖추어졌다면, 실제 GPU 코드가 의도대로 동작하고 있는지 확인하고, 혹시 병목현상이 일어나지는 않는지 점검하는 단계가 필요합니다. 이번 글에서는 디버깅(Debugging)과 성능 프로파일링(Performance Profiling) 방법을 간단히 살펴볼 겁니다. 한 번에 모든 툴과 기법을 다루긴 어렵지만, 대표적인 도구와 기본적인 절차를 익혀두면 앞으로 문제 해결에 큰 도움이 됩니다.GPU 디버깅 기본 아이디어..
이번에 소개할 표현은 "Hit the Ground Running"입니다. 이 표현은 시작부터 신속하고 효과적으로 작업을 시작하다는 의미로, 새로운 프로젝트나 작업을 빠르게 진행해야 하는 상황에서 자주 사용됩니다. 특히, 새로운 환경에서 빠르게 적응하거나, 첫 단계부터 생산성을 발휘해야 할 때 적합한 표현입니다.1. 표현의 의미"Hit the Ground Running"은 "땅에 발을 딛자마자 달리기 시작하다", 즉 "바로 행동으로 옮기다"를 의미합니다. 이는 사전 준비를 끝낸 상태에서, 작업을 시작하자마자 빠르고 효율적으로 성과를 내는 것을 뜻합니다.예:"우리는 새 프로젝트를 시작하자마자 빠르게 작업을 진행할 준비가 되어 있어요."→ "We’re ready to hit the ground running ..
이번 글에서는 모던 CMake를 활용하여 재사용 가능한 라이브러리를 패키지화하고, 다른 프로젝트에서 손쉽게 사용할 수 있도록 설정하는 방법을 알아보겠습니다. CMake의 패키지 관리 기능을 통해 라이브러리를 배포하고, find_package()를 이용하여 의존성을 간편하게 관리할 수 있습니다. 이 과정을 통해 프로젝트의 확장성과 유지보수성을 크게 향상시킬 수 있습니다.CMake 패키지 구성의 필요성재사용 가능한 라이브러리를 패키지화하면 다음과 같은 이점을 얻을 수 있습니다:의존성 관리의 단순화: find_package()를 통해 필요한 라이브러리를 손쉽게 찾고 링크할 수 있습니다.버전 관리: 특정 버전의 라이브러리를 요구하고, 호환성을 보장할 수 있습니다.배포의 용이성: 라이브러리를 다른 개발자나 프로젝..
미국 빅테크 기업에서 일할 때, 매니저나 멘토와의 1:1 미팅은 업무 진행 상황 점검, 커리어 발전 방향 논의, 피드백 요청, 목표 설정 등 다양한 목적을 지닌 중요한 시간입니다. 이 때 영어를 통한 의사소통은 명확하고 효율적이어야 합니다. 이번 글에서는 1:1 미팅 상황에서 바로 활용할 수 있는 영어 표현, 대화 전략, 구체적 예문과 가상 시나리오를 풍부하게 제시합니다.1. 1:1 미팅의 기본 원칙: 사전에 어젠다 공유 & 명확성 유지1:1 미팅은 한정된 시간 안에 핵심 사항을 다루기 위해 어젠다를 미리 공유하는 것이 좋습니다.예문:"I’d like to discuss three main points today: progress on the new feature, potential obstacles, ..
안녕하세요! 지난 글에서는 C++20/23 문법과 OpenCL C++ Wrapper를 활용해 OpenCL 코드를 훨씬 깔끔하게 만드는 방법을 살펴봤습니다. 이번 글에서는 실제로 유용할 수 있는 간단한 이미지 처리 예제를 통해 OpenCL의 이미지 기능을 체험해보려 합니다. 기본적인 버퍼 연산만 다뤘던 것에서 한 단계 나아가, GPU 가속을 활용한 이미지 변환(예: 컬러 이미지를 그레이스케일로 변환)을 시도해보죠.이번 글에서는 다음 내용을 다룹니다.이미지 객체를 사용한 데이터 처리호스트 측에서 이미지 로딩(예: stb_image 사용)OpenCL 커널에서 read_imagef, write_imagef 함수 활용결과 확인을 위한 이미지 저장CUDA와 비교: CUDA 텍스처/서피스와 유사한 개념1. 준비사항이..
C++23에서는 범위(Range) 라이브러리에 풍부한 알고리즘들이 추가되어, 데이터 처리 시 다양한 시나리오를 표준화된 방식으로 해결할 수 있게 되었습니다. 그중 하나인 std::ranges::sample 알고리즘은 범위에서 무작위로 일부 원소를 추출하여 샘플링할 수 있도록 하는 기능을 제공합니다. 이를 통해 무작위 데이터 선정, 표본 추출 등의 작업을 표준 라이브러리 알고리즘만으로 간편히 구현할 수 있습니다.이번 글에서는 std::ranges::sample의 개념과 사용법, 그리고 이전 방식과 비교하여 어떠한 개선점을 제공하는지 알아보겠습니다. std::ranges::sample란 무엇인가요?std::ranges::sample(rng, out, n, gen)는 범위 rng에서 원소를 n개 무작위로 선택..
C++23에서는 비동기 프로그래밍과 스레드 관리 패턴을 한층 더 간단하고 효율적으로 만들기 위해 std::in_place_stop_source와 std::in_place_stop_token이 도입되었습니다. 이들은 C++20에서 도입된 std::stop_source와 std::stop_token을 개선한 것으로, 비동기 작업이나 스레드 실행을 안전하고 직관적으로 중단(stop)할 수 있는 메커니즘을 제공합니다.기존의 std::stop_source/std::stop_token과 달리, in_place 버전은 무상태(stateless)로, 저장 비용이 줄고 더 가벼우며, 기본적으로 커스텀 메모리 관리나 동기화 없이도 안전하게 중단 신호를 전달하고 처리할 수 있습니다.이번 글에서는 std::in_place_s..
C++23에서는 범위(Range) 라이브러리를 더욱 강화하기 위해 다양한 뷰(View) 어댑터가 추가되었습니다. 그중 std::views::repeat와 std::views::repeat_n는 특정 값을 무한히 반복하거나, 지정된 횟수만큼 반복하는 시퀀스를 손쉽게 만들 수 있도록 해주는 뷰 어댑터입니다. 이를 통해 반복적인 데이터 소스를 간편하게 생성할 수 있으며, 다른 범위 어댑터와 결합하여 여러 가지 흥미로운 데이터 처리 파이프라인을 구성할 수 있습니다. 이번 글에서는 std::views::repeat와 std::views::repeat_n의 개념과 사용법, 그리고 이전 방식과 비교하여 어떠한 개선점을 제공하는지 알아보겠습니다. std::views::repeat란 무엇인가요?std::views::re..
미국 대입 과정에서 수십 년간 이어져온 ‘Affirmative Action(소수인종 우대정책)’은 역사적으로 흑인, 히스패닉/라틴계 학생 등 제도권 교육에서 소외된 인종 그룹에게 교육 기회를 확대하는 데 기여해왔습니다. 그러나 이 정책은 동시에 학업 성취도가 높음에도 불구하고 인종 우대로 인해 불이익을 받는다고 주장한 아시아계 학생들 사이에서 역차별(reverse discrimination) 논란을 불러일으켰습니다. 마침내 2023년 6월 미국 대법원은 인종 기반 Affirmative Action을 금지하는 판결을 내리며, 미국 대학 입학 환경은 새로운 전환점을 맞이하게 되었습니다. 이 글에서는 Affirmative Action의 역사적 배경, 최근 위헌 판결 이후 대학별 입학 현황 변화, 인종·계층별 ..