2025/09 44

[강화학습] Target Network를 이용한 안정성 개선

지금까지 우리는 Gridworld 게임을 플레이하도록 심층 강화학습 알고리즘을 훈련하는 데 성공했다.하지만 두 모드의 경우 가능한 4x4 게임판 구성이 아주 많지는 않으므로, 그냥 가능한 모든 게임판 구성을 암기했을 가능성도 있다. 따라서 게임을 이기려면 알고리즘은 게임 플레이 방법을 실제로 배워야 한다.그러나 앞에서 본 잡음이 많은 손실 그래프가 말해 주듯이, 현재 우리의 심층 강화학습 모형은 Gridworld의 무작위 모드를 그리 잘 학습하지 못한다. 그럼 가치 갱신량들을 좀 더 고르게 만드는 또다른 기법을 살펴보자.학습 불안정성DQN 논문에서 딥마인드 팀은 개별 동작마다 QN의 매개변수들을 갱신하다보면 학습이 불안정해질 수 있음을 지적했다.Girdworld 게임처럼 보상이 희소한 환경, 즉 게임..

[강화학습] Experience Replay, ER - Catastrophic Forgetting의 해소

본 내용은 심층강화학습 인 액션 도서를 참고하여 작성되었습니다. 심층 강화학습 인 액션 - 예스24프로젝트로 배우는 심층 강화학습의 이론과 실제!이 책 『심층 강화학습 인 액션』은 환경이 제공하는 직접적인 피드백에 기반해서 환경에 적응하고 자신을 개선해 나가는 에이전트의 구현 방www.yes24.com 우리는 이전 글에서 Gridworld를 학습시켰고, 무사히 학습에 성공한?것을 알 수 있었다.하지만 이것은 게임의 '정적' 모드, 즉 가장 쉬운 버전이었다.mode='random'으로 다시 실험해보면 실망스러운 결과가 나온다.실망스럽지만 흥미로운 결과이다.이 결과를 자세히 살펴보면, 단순히 정적 모드에서의 움직임을 암기했다고 보는게 정확한 수준으로 그대로 움직인다. 학습 또한 'random' 모드로 수행..

[강화학습] DQN

본 내용은 심층강화학습 인 액션 도서를 참고하여 작성되었습니다. 심층 강화학습 인 액션 - 예스24프로젝트로 배우는 심층 강화학습의 이론과 실제!이 책 『심층 강화학습 인 액션』은 환경이 제공하는 직접적인 피드백에 기반해서 환경에 적응하고 자신을 개선해 나가는 에이전트의 구현 방www.yes24.com 과거에도 Q함수를 신경망으로 표현하려던 시도는 있었지만, 이는 다음과 같은 문제가 있어 해결하지 못했다.신경망 학습 연산의 비용이 감당 불가능했다.catastrophic forgetting 문제가 있었다. - ER(Experience Replay)신경망 자체의 편향을 제거하기가 어려웠다. - Target Network시대가 변화하며 GPU의 병렬 연산의 성능이 대폭 향상되었고,구글 딥마인드에서 2013년에..

[USACO Gold] Knapsack DP - 배낭 문제를 다이나믹 프로그래밍으로 풀기

배낭(knapsack) 문제는 보통 제한된 용량의 컨테이너에 물건들의 부분집합을 넣되, 물건과 관련된 어떤 양을 세거나(카운트) 최적화하는 문제를 다룬다.거의 항상 각 물건은 양의 무게를 가지며, 우리가 선택한 물건들의 총 무게는 어떤 수로 주어지는 컨테이너의 용량을 초과해서는 안 된다. 배낭 유형 문제의 변형으로는 다음과 같은 것들이 있다.0/1 배낭 문제: 물건들의 부분집합을 골라 총 가치를 최대화하되, 총 무게가 컨테이너의 용량을 넘지 않도록 한다.가능한 총 무게 찾기: 컨테이너 용량을 넘지 않게 임의의 부분집합으로 만들 수 있는 모든 총 무게를 구한다.정확히 채우는 경우의 수 세기: 총 무게가 정확히 컨테이너 용량이 되도록 하는 물건의 순서열이 몇 개인지 센다(순서가 중요할 수도 있고 중요하지 않..

PS/USACO Gold 2025.09.11

[RabbitMQ] Spring RabbitMQ 사용방법

RabbitMQ는 메시지를 수신하고 전달하는 메시지 브로커이다.이 글은 다음 RabbitMQ 튜토리얼을 Java 버전으로 따라가 본 상태라고 가정합니다.따라서, 주요 API의 스프링에서의 사용법을 언급하며,스프링부트의 org.springframework.boot:spring-boot-starter-amqp를 사용하고 있다고 가정합니다.만약 RabbitMQ가 처음이시라면, 다음 글을 순서대로 따라가보며 내부 원리를 이해해보시길 권장드립니다.[RabbitMQ Java] 가장 간단한 프로듀서-컨슈머 사용해보기 [RabbitMQ Java] 가장 간단한 프로듀서-컨슈머 사용해보기원래 RabbitMQ 는 할 생각이 없었고, Kafka를 해보려고 했는데Kafka Definitive Guide의 내용이 너무 방대해서 ..

[USACO Gold] Dynamic Programming, 동적 계획법, DP 소개

사실 '다이나믹'도 아니고, '프로그래밍'도 아닌 다이나믹 프로그래밍은 알고리즘 문제의 단골 요소이자 매우 효율적인 컴퓨터공학의 계산 효율화 방법이다.DP는 벨만-포드 알고리즘과 벨만 방정식, 강화학습의 토대를 마련한 미국의 응용수학자 리처드 E. 벨만이 발견했다. 이는 리액트의 렌더링 및 BFS, 캐싱, 비즈니스 로직 및 게임 엔진 최적화부터 심지어는 RL에까지 등장하고 있다. 이 DP에 대해, 지금부터 차근차근 알아보자.DP의 성질은 딱 두가지로 정리가 가능하다최적 부분구조중복 부분문제최적 부분구조최적 부분구조(Optimal Substructure)은 "경로에 관계없이" 다음 문제의 해답이 이전 부분문제의 최적화로 구해지는 구조를 의미한다.이를 다르게 표현하면, 뒷 문제의 정답을 구하는 과정이 앞 문..

PS/USACO Gold 2025.09.09

[USACO Gold] 모듈러 연산, 모듈러 역원, 정수론에서의 합동

모듈러 연산에서는 정수 그 자체로 계산하지 않고, 어떤 수를 m으로 나눈 나머지로 계산한다.이를 "모듈러 m을 취한다”라고 부른다. 예를 들어 m=23이라면, x=247 대신 x  mod  23=17을 사용한다.보통 m은 문제에서 주어지는 큰 소수(prime)이며, 가장 흔한 값은1000000007998 244 353=119⋅2^23+1이다.모듈러 산술은 내장 자료형의 범위를 넘는(오버플로) 큰 수를 다루지 않기 위해 사용되며, 다음 공식을 이용해 나머지를 취할 수 있다.Modular Exponentiation (모듈러 거듭제곱)거듭제곱 (Easy)https://cses.fi/problemset/task/1095 CSES - ExponentiationCSES - Exponentiation Time lim..

PS/USACO Gold 2025.09.08

[RabbitMQ Java] RabbitMQ를 이용한 RPC

두 번째 튜토리얼에서 우리는 Work Queue를 사용하여 시간이 오래 걸리는 작업을 여러 워커(worker)에게 분산하는 방법을 배웠다. 하지만 어떤 함수를 원격 컴퓨터에서 실행하고 그 결과를 기다려야 한다면 어떨까?이는 조금 다른 이야기가 된다.이 패턴은 흔히 원격 프로시저 호출(Remote Procedure Call, RPC) 이라고 불린다. 이번 튜토리얼에서는 RabbitMQ를 사용하여 RPC 시스템(클라이언트와 확장 가능한 RPC 서버) 을 만들어보자.분산할 만한 시간이 오래 걸리는 작업은 딱히 없으므로, 임의로 피보나치 수를 반환하는 단순한 RPC 서비스를 예제로 구현할 것이다.클라이언트 인터페이스RPC 서비스 사용 방식을 보여주기 위해 간단한 클라이언트 클래스를 만든다.call이라는 메서드..

[RabbitMQ Java] Pub-Sub 3: 토픽

이전 튜토리얼에서는 로깅 시스템을 개선했다.단순히 브로드캐스팅만 가능한 fanout exchange 대신 direct exchange를 사용하여 선택적으로 로그를 받을 수 있도록 했었다. direct exchange를 사용함으로써 시스템이 개선되었지만, 여전히 한계가 존재한다.바로 여러 기준을 기반으로 라우팅할 수는 없다는 점이다.우리의 로깅 시스템에서는 심각도(severity)뿐 아니라 로그를 발생시킨 소스(source)에 따라서도 구독하고 싶을 수 있다.이 개념은 Unix의 syslog 도구에서 익숙할 수 있다.syslog는 심각도(info/warn/crit...)와 facility(auth/cron/kern...) 모두를 기준으로 로그를 라우팅한다. 이를 지원하는 기법이 바로 토픽(Topic)이다..

[RabbitMQ Java] Pub-Sub 2: 메시지의 라우팅, Direct Binding

이전 튜토리얼 에서는 간단한 로깅 시스템을 구축했다. [RabbitMQ Java] Pub-Sub 모델, 그리고 Exchange이전 튜토리얼 에서는 Work Queue를 생성했다. [RabbitMQ Java] Work Queue 직접 만들어보기와 메시지의 분배 방식이번 튜토리얼에서는 시간이 많이 걸리는 작업을 여러 작업자 간에 분배하는 데 사용할 Wodev.go-gradually.me이를 통해 로그 메시지를 여러 수신자에게 브로드캐스트할 수 있었다. 이 튜토리얼에서는 여기에 기능을 추가해볼 것이다.바로 메시지의 일부만 구독할 수 있도록 하는 것이다.예를 들어, 디스크 공간을 절약하기 위해 중요한 오류 메시지만 로그 파일에 저장하면서도 모든 로그 메시지를 콘솔에 출력할 수 있다.바인딩이전 예제에서는 이미 바..