TL;DR
- 우선순위 문법 열거(Prioritized Grammar Enumeration, PGE)는 기호 회귀(Symbolic Regression)를 푸는 방법이며, PyPGE는 이를 구현한 Python 패키지임.
- PyPGE는 현재 집중 개발 중이며, 설치는 저장소 복제 방식이고 Pip은 더 이상 권장되지 않으며 의존성은 Docker임.
- 평가 서버를 별도로 실행하면 런타임이 훨씬 빨라지며, 실험 컨테이너 안에서 실행하는 방식이 현재 가장 적합함.
- 실험 구성은 YAML 파일, 문제 유형(
explicit또는diffeq), 문제 세트 파일로 지정하며-P옵션으로 실행 없이 예정 실험을 확인할 수 있음. - 기본 설정에서는 작업자 수와 원격 코어 수를 장비에 맞춰야 하며, Python 대신 Go로 메인 루프를 되돌리려는 계획이 있음.
PyPGE
- PyPGE는 PGE 알고리즘의 Python 구현이며, 해당 논문은 GECCO 2013 최우수 논문으로 선정됨.
- 이 라이브러리를 사용해 출판하는 경우 해당 논문을 인용해야 함.
- PGE는 우선순위 문법 열거를 뜻하며 기호 회귀 문제를 푸는 방법임.
- 이 안내 문구가 삭제될 때까지 패키지는 집중 개발 중임.
설치
- 저장소를 복제해 설치함.
- Pip은 더 이상 권장 설치 방법이 아님.
의존성
- Docker가 필요함.
PyPGE 실행
- 평가 서버를 실행하면 런타임이 훨씬 빨라짐. Docker에서
verdverm/pypge-eval이미지를 사용해evalr컨테이너를 만들고, 호스트의 8080 포트를 컨테이너의 8080 포트에 연결함. - 이어 실험 컨테이너를 실행해 현재 디렉터리를
/pycode에 마운트하고 8888 포트를 연결함. 컨테이너 내부에서/bin/bash를 실행하며, 실행에 사용하는 이미지는verdverm/pypge-experiments임. - 컨테이너 안에서
run.sh스크립트를 찾을 수 있음. 현재 PyPGE 실행에는 Docker 내부가 가장 적합한 위치임. - 실행 과정에서 많은 매개변수화 매칭이 이뤄짐. 저장소를 컨테이너에 마운트하므로 설정 변경과 파일 이동 대부분은 컨테이너 밖에서 할 수 있지만, 모든 스크립트는 컨테이너 안에서 실행해야 함. 출력은 컨테이너 밖에도 보존됨.
- 실행 인자는
-x <config_folder> -s <problem_type> -p <problem_set>형식임. <config_folder>에는 하나 이상의 YAML 설정 파일이 있어야 함.<problem_type>은explicit또는diffeq여야 하며, YAML 설정 파일명에도 둘 중 하나가 포함되어야 함.<problem_set>은prob_sets디렉터리에 있는 간단한 Bash 목록 파일임.-P옵션을 사용하면 실험을 실제 실행하지 않고 어떤 실험이 수행될지 확인할 수 있음.
직접 실행
- 실행 흐름은
experiments/megarun.sh,experiments/run.sh,experiments/scripts/helpers.sh,experiments/main.py순서임.
새 실험 만들기
- 현재 이름 지정 방식은 설정 및 PyPGE 실행 스크립트가 파일과 디렉터리를 찾는 방식과 다소 얽혀 있음.
experiments디렉터리 안에<config_folder>인자와 이름이 일치하는 디렉터리를 만들고, 그 안에 PyPGE 설정 파일을 둬야 함.- 데이터는
data/benchmarks/{diffeq,explicit}/<problem_name>.csv에 배치해야 함. experiments/prob_sets안에<problem_set>파일도 만들어야 함.
설정 파일
- 아래 항목은 권장 기본 설정임.
workers와remote_cores는 사용하는 장비에 맞춰 변경해야 함. - 다른 매개변수를 변경할 때는 주의해야 함. 논리적 성능과 런타임 성능 모두 매개변수에 매우 민감함.
- 예시 설정의 항목은 다음과 같음.
name:explicit_finalworkers: 4,queue_size: 4096,remote_eval:true,remote_cores: 4,remote_host:ws://172.17.0.1:8080/echomax_iter: 12pop_count: 3,peek_count: 12,peek_npts: 0min_size: 1,max_size: 64,min_depth: 1,max_depth: 6max_power: 6,zero_epsilon: 0.000001excluded_cols: 빈 목록,usable_funcs:sin,cos,algebra_methods: 빈 목록multi_expander_params:level_1항목에pop_count3,usable_funcssin·cos,func_levellinear,init_level·grow_level·subs_levelmed,shrinkerfalse,add_xtoptrue,grow_filterfalse,limiting_depth4err_method:rmsefitness_func_params:normalize,-(1)jpsz,-score,+bic,-(1)pszprint_timing:true,log_details:true
알아둘 점
- 보기 좋게 출력할 때 SymPy가 단순화를 수행함. 부동소수점 출력 정밀도가 충분하지 않으면 0처럼 보이는 항이 제거될 수 있음.
할 일
- 가장 큰 미완료 작업은 메인 루프를 다시 Go로 옮기는 일임. 이후 Python은 SymPy 기능에만 사용될 예정임.
- Python은 매우 느리며 Go로 되돌리면 성능이 크게 향상될 것이라는 이유로 이를 추진함.
- 구현 방식이 중요함.
기여
- 브랜치 작업 방식은 다음 방법론을 따름: 성공적인 Git 브랜칭 모델.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요