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_final
  • workers: 4, queue_size: 4096, remote_eval: true, remote_cores: 4, remote_host: ws://172.17.0.1:8080/echo
  • max_iter: 12
  • pop_count: 3, peek_count: 12, peek_npts: 0
  • min_size: 1, max_size: 64, min_depth: 1, max_depth: 6
  • max_power: 6, zero_epsilon: 0.000001
  • excluded_cols: 빈 목록, usable_funcs: sin, cos, algebra_methods: 빈 목록
  • multi_expander_params: level_1 항목에 pop_count 3, usable_funcs sin·cos, func_level linear, init_level·grow_level·subs_level med, shrinker false, add_xtop true, grow_filter false, limiting_depth 4
  • err_method: rmse
  • fitness_func_params: normalize, -(1)jpsz, -score, +bic, -(1)psz
  • print_timing: true, log_details: true

알아둘 점

  • 보기 좋게 출력할 때 SymPy가 단순화를 수행함. 부동소수점 출력 정밀도가 충분하지 않으면 0처럼 보이는 항이 제거될 수 있음.

할 일

  • 가장 큰 미완료 작업은 메인 루프를 다시 Go로 옮기는 일임. 이후 Python은 SymPy 기능에만 사용될 예정임.
  • Python은 매우 느리며 Go로 되돌리면 성능이 크게 향상될 것이라는 이유로 이를 추진함.
  • 구현 방식이 중요함.

기여