Python과 Julia로 하는 기호 학습

Symbolic Learning in Python and Julia

github.com/astroautomata ▲ 59 댓글 11 alex_hirner

요약

PySR 라이브러리는 데이터를 설명하는 수식을 자동으로 찾아 주는 Python·Julia 오픈소스 도구입니다.

astroautomata 조직이 관리하는 PySR 라이브러리는 기호 회귀(데이터에 맞는 수식 자체를 찾아내는 머신러닝 기법)를 위한 도구입니다. 탐색 엔진은 Julia 라이브러리 SymbolicRegression.jl이고, Python에서는 scikit-learn과 비슷한 방식으로 씁니다.

왜 중요한가

  • 속을 들여다보기 어려운 신경망 대신 사람이 읽고 해석할 수 있는 수식을 결과로 내놓습니다.
  • 찾은 수식을 SymPy·JAX·PyTorch 형식으로 꺼낼 수 있어 다른 계산이나 미분에 바로 이어 쓸 수 있습니다.
  • 신경망을 수식으로 옮기는 기호 증류에도 쓰여 N체 문제 같은 물리 연구에 응용됐습니다.

핵심 내용

  • fit을 호출하면 Julia 프로세스가 멀티스레드로 수식 후보를 수십만 번 변형하고 평가합니다.
  • 연산자와 손실 함수를 직접 정의할 수 있고, 수식 복잡도와 중첩 깊이에도 제약을 걸 수 있습니다.
  • 결과는 복잡도와 손실을 나란히 보여 주는 후보 수식 표로 나오며, 고르는 기준은 학습 뒤에도 바꿀 수 있습니다.
  • pip이나 conda로 설치하며, Julia 쪽 의존성은 처음 불러올 때 자동으로 설치됩니다.
  • 코딩 에이전트가 PySR 라이브러리를 활용하도록 돕는 AI 에이전트 스킬도 저장소에 들어 있습니다.

HN 반응

  • 한 이용자는 예제가 AI로 대충 만든 코드라며, 난수 생성기 예제의 손실 함수 설계가 엉터리라고 구체적으로 짚었습니다.
  • Python과 Julia 런타임을 함께 띄우는 메모리 부담을 꼬집는 의견이 있었고, Rust·JAX로 만든 결정론적 대안 엔진을 소개하는 댓글도 나왔습니다.

댓글

11개 표시 · 전체 11개
  1. brumar HN

    복잡도에 불이익을 주면서 기호적·결정론적 맥락의 예측 품질을 측정하고 비교하려면 어떻게 해야 하나요? 박사 논문을 쓰면서 이 문제로 고생했는데, 쓸 만한 게 없어서 최소 기술 길이(Minimum Description Length) 구현을 직접 만들어야 했습니다. 제가 물어본 통계학자들은 "기호 모델에는 모델 선택을 시도하지 말고, 확률 모델로 바꿔서 거기서부터 하라"는 반응이었고요.

  2. nsajko HN

    여기서는 연산자, 변수, 상수마다 비용을 매기는 방식을 씁니다. 문서를 보세요.

  3. saithound HN

    PySR 자체는 아직 괜찮습니다. 대부분 예전에 개발해 둔 덕분이죠. 하지만 오래가지는 못할 겁니다. 품질 관리가 무너졌고, 이를테면 저장소의 예제들은 이제 보기 민망한 바이브슬롭(vibeslop)이에요.

    Pangram은 examples 디렉터리에 있는 주석 설명 대부분을 100% AI로 판정합니다. 그것만으로는 문제가 아닙니다. AI가 생성한 코드도 올바를 수 있으니까요. 그런데 이 경우에는 AI가 만든 예제들이 슬롭 특유의 꼴을 하고 있습니다. 그럴듯하게 들리는 전문 용어를 늘어놓았지만, 대상 도메인은 물론 진화적 탐색(손실 함수 설계)조차 전혀 이해하지 못한 채 만든 거예요. 자기가 뭘 하는지도 모르는 사람들이 바이브 코딩으로 만든 겁니다.

    "진화한 PRNG" 예제 [1]을 한번 보세요.

    먼저 이 예제의 손실 함수는 사실상 선형 되먹임 시프트 레지스터(LFSR)만 찾아내도록 보상하게 설계되어 있습니다. 다른 함수 대부분보다 LFSR에 일부러 훨씬 낮은 손실을 줍니다.

    AI 슬롭은 이걸 "주기를 증명한다"고 표현했지만, 이 주기 증명은 최대 주기 LFSR만 식별하고, 나머지 탐색 공간에서는 성립하지 않으며, LFSR이 아닌 대부분에는 아무 의미 없이 아주 높은 손실을 줍니다. 그래서 회귀 결과는 거의 항상 LFSR이 됩니다.

    이 예제를 설계한 쪽(아마 Codex겠죠)은 대부분의 LFSR에 결함이 있어서 난수 생성기로는 형편없다는 것도 알고 있었습니다. 그래서 그런 결함 있는 LFSR을 걸러내려고 "shear" 페널티를 넣었는데, 이것도 당연히 대충 때려 붙였죠.

    측정하는 360개의 상관계수는 합산했어야 합니다(강한 상관이 하나만 있어도 나쁜 거고, 둘이면 하나일 때보다 두 배 나쁜 거니까요). 그런데 평균을 내버려서, 완벽한 상관 하나가 손실에 기여하는 값이 고작 1/360=0.00278입니다.

    아니나 다를까, 문서 [2]에 실린 예제 실행 결과에는 그런 완벽한 상관이 들어 있습니다. 두 번 반복할 때마다 29번 비트가 31번 비트로 복사되고 있어요.

    [1] https://github.com/astroautomata/PySR/blob/master/examples/prng_period.py

    [2] https://pysr.ai/v2.7.0/examples/objectives#inventing-a-pseudorandom-generator-with-no-target

  4. JanisErdmanis HN

    여기 Julia 부분은 JuliaC로 컴파일한 건가요? 아니라면 그렇게 하려면 무엇이 필요한가요?

  5. bikvfeee HN

    juliac으로 컴파일하는 건 명령어 한 줄이면 됩니다.

  6. owls-on-wires HN

    관련 프로젝트: https://github.com/owls-on-wires/keplearn

    SRBench용으로 만든, Rust로 작성한 결정론적 SR 엔진입니다. 이 분야가 첫 페이지에서 관심을 받는 걸 보니 기쁘네요!

  7. jgalt212 HN

    혹시 이걸로 n체 문제를 돌려 본 사람 있나요?

  8. verdverm HN

    관련 프로젝트: https://github.com/verdverm/pge-jax

    최근에 JAX로 포팅한, 기호 회귀(Symbolic Regression)용 결정론적 알고리즘입니다.

  9. verdverm HN

    제 댓글 시간이 갱신된 게 이상하네요. 오늘 쓴 게 아닌데요.

    (제가 이해한 게 맞다면 HN 운영진이 원글을 끌어올린 것 같은데, 어쩌면 dang이나 tomhow가 한마디 해 줄지도 모르겠네요.)

  10. Jtsummers HN

    세컨드 찬스 풀(second chance pool)입니다. 한동안은 모든 댓글이 글과 함께 새 타임스탬프를 받아요. 시간이 지나면 결국 원래 타임스탬프로 돌아옵니다.

  11. thatsabadlook HN

    와, 이제 파이썬 프로젝트를 로드하면 인터프리터 2개, GC 2개, 200MB짜리 램 오버헤드에, JIT 때문에 성능까지 들쭉날쭉하네요.

Hacker News에서 보기 ↗