# 내 Python 코드는 신경망

> Clean Markdown view of GeekNews topic #15642. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=15642](https://news.hada.io/topic?id=15642)
- GeekNews Markdown: [https://news.hada.io/topic/15642.md](https://news.hada.io/topic/15642.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-07-02T10:11:35+09:00
- Updated: 2024-07-02T10:11:35+09:00
- Original source: [blog.gabornyeki.com](https://blog.gabornyeki.com/2024-07-my-python-code-is-a-neural-network/)
- Points: 2
- Comments: 1

## Topic Body

- 인간은 스파게티 코드 관리에 서툴음  
- 연구 프로젝트에서 원시 데이터에서 정보를 추출하는 프로그램을 작성하는 경우가 많음  
- 데이터는 명확한 사양을 따르지 않음  
- 예시:  
  - 뉴스 기사에서 기업과 임원을 식별  
  - 공공 조달 계약을 서비스 종류별로 라벨링  
  - 엔지니어 간의 메시지에서 프로그램 코드를 식별  
  
##### 메시지에서 프로그램 코드 감지  
  
- 코드 리뷰 중 메시지가 프로그램 코드를 참조하는지 감지하는 문제를 해결  
- 예시 메시지:  
  - LGTM with render_ipa_alloc()  
  - If the FTPSACK flag is set, then use a prespecified value  
  - AFAICT there is nothing else to check (unless you can think of something)  
  - Actually, debug_error() doesn’t return NULL, so we should use IS_ERROR() here  
  - This fails to build on aarch64 even though it works without issue on amd64  
  - I’ve added if (err) goto cleanup; but the code still leaks  
  
##### 결정 규칙 아이디어  
  
- 간단한 규칙을 사용하여 프로그램 코드와 일반 영어를 구분하는 접근 방식  
- 규칙:  
  1. 괄호가 뒤따르는 단어는 코드임  
  2. 모든 대문자 단어는 코드임  
  3. 비영어 단어는 코드임  
- 각 규칙의 장단점:  
  - 규칙 1: 간단하지만 명백한 긍정 사례를 놓침  
  - 규칙 2: 대문자 약어를 프로그램 코드로 잘못 분류함  
  - 규칙 3: 엔지니어링 용어를 프로그램 코드로 잘못 분류함  
  
##### 손으로 작성한 알고리듬  
  
- 간단한 알고리듬이 충분히 잘 작동할 수 있다고 판단  
- 두 단계로 메시지가 코드를 포함하는지 결정:  
  1. 전처리: 메시지를 토큰 시퀀스로 변환  
  2. 추론: 토큰 시퀀스에 규칙을 적용하여 코드 포함 여부 결정  
- Python으로 구현한 예시:  
  ```python  
  from dataclasses import dataclass  
  
  Token = str  
  
  @dataclass  
  class State:  
      previous_was_identifier: bool = False  
      previous_was_open_paren: bool = False  
      previous_previous_was_identifier: bool = False  
      seen_code: bool = False  
  
  def contains_code(tokens: Iterable[Token]) -> bool:  
      state = State()  
      for token in tokens:  
          state = process(state, token)  
      return state.seen_code  
  
  def process(state: State, token: Token) -> State:  
      if state.seen_code:  
          return state  
      if (token == "close_paren" and state.previous_was_open_paren and state.previous_previous_was_identifier):  
          state.seen_code = True  
          return state  
      state.previous_previous_was_identifier = state.previous_was_identifier  
      state.previous_was_identifier = token in ("all_caps_identifier", "underscore_identifier", "misc_identifier")  
      state.previous_was_open_paren = token == "open_paren"  
      return state  
  ```  
  
##### 신경망의 도움  
  
- 상태 기계로서의 `contains_code`와 `process`를 RNN으로 인코딩 가능  
- RNN을 사용하여 더 나은 알고리듬을 찾을 수 있음  
  
##### 일반적인 아이디어  
  
- RNN은 조건부 확률을 근사함  
- 각 토큰에 대해 상태 벡터를 계산  
- 최종 상태를 기반으로 메시지를 분류  
  
##### 수학으로 본 Python 코드  
  
- RNN이 규칙 1을 인코딩하는 방법을 설명  
- 각 토큰을 이진 벡터로 표현  
- 숨겨진 상태를 계산하여 규칙을 적용  
  
##### 네트워크 훈련  
  
- RNN을 훈련시키기 위해 활성화 함수를 ReLU로 변경  
- PyTorch를 사용하여 훈련 가능  
  
##### 더 효율적인 구현을 가진 아키텍처  
  
- Elman RNN과 같은 PyTorch에서 제공하는 아키텍처 사용  
- Elman RNN은 각 숨겨진 레이어가 이전 레이어와 현재 레이어를 모두 입력으로 사용  
  
##### 더 안정적인 그래디언트를 가진 아키텍처  
  
- 긴 메시지는 그래디언트가 0에 가까워져서 문제 발생  
- GRU나 LSTM과 같은 아키텍처가 더 나은 성능을 보일 수 있음  
  
##### 데이터 중심의 규율  
  
- RNN은 스파게티 코드를 더 잘 처리함  
- 데이터 중심의 규율을 강제하여 문제를 명확히 함  
  
##### GN⁺의 의견  
  
- 이 기사는 RNN을 사용하여 복잡한 문제를 해결하는 방법을 잘 설명함  
- RNN을 사용하면 코드 유지보수가 용이해짐  
- PyTorch와 같은 도구를 사용하여 효율적인 구현 가능  
- GRU나 LSTM과 같은 아키텍처를 고려할 필요 있음  
- 데이터 중심의 접근 방식이 문제 해결에 유용함

## Comments



### Comment 26851

- Author: neo
- Created: 2024-07-02T10:11:35+09:00
- Points: 1

###### [Hacker News 의견](https://news.ycombinator.com/item?id=40845304) 
- 이 글은 테스트나 훈련 데이터에 대해 많이 다루지 않음
  - 코드가 이해된다고 생각하는 이유는 일반화된 속성을 비공식적으로 증명했기 때문임
  - 신경망의 경우, 새로운 입력에 대해 어떻게 일반화될지 알 수 없다는 점이 문제임
  - 속성을 잘 정의할 수 있다면, 속성 기반 테스트를 작성하여 많은 테스트 데이터를 생성할 수 있음
  - 이는 증명은 아니지만 시작점이 될 수 있음
  - 스파게티 코드나 신경망에 의존하는 것은 비슷할 수 있음
  - 신경망을 훈련시키는 대신 속성 기반 테스트를 작성할 수 있음
  - 여전히 코드를 더 신뢰할 것 같음, 디버깅이 가능하기 때문임

- 이 글은 실용적인 작업을 수행하기 위한 신경망 구축 방법으로 읽으면 흥미로움
  - 저자는 임의의 입력을 구문 분석하는 어려운 문제를 다룸
  - 이를 해결하기 위해 신경망을 제안하지만, 이는 여전히 이해하기 어려움
  - 읽기 어려운 코드보다는 이해할 수 있는 코드가 더 나을 수 있음

- 신경망에 대한 보편적 근사 정리(Universal Approximation Theorem)가 존재함
  - 그러나 이러한 근사치를 학습할 수 있다는 정리는 없음

- 이 글은 RNN에 대한 깊은 수학적 개념을 다루지만, 흥미로운 아이디어를 제공함
  - 입력 문자열을 문자 단위로 처리하는 접근법이 강력함
  - 얇은 입출력 로직을 작성하고 나머지는 알고리즘이 처리함

- RNN이 트랜스포머에 완전히 대체되었는지 궁금해하는 의견이 있음

- 유전 프로그래밍(Genetic Programming)을 살펴볼 가치가 있음
  - 수학이 필요 없고, 프로그램을 AST로 재조합하여 최적화함
  - 최적화할 항목을 선택할 수 있음 (예: 속도, 프로그램 길이, 복잡한 구조 최소화 등)

- 이 글은 RNN을 학습 경험으로 다루며, PyTorch의 RNN과 비교함
  - 네트워크에 세 개의 숨겨진 레이어를 추가해야 하는 이유를 질문함

- RNN은 임의의 계산을 수행할 수 있지만, 실용적이지 않음
  - 이 글은 상태 기계를 학습하는 방법을 다루며, Python의 실제 의미를 학습하는 것은 어려움

- 신경망이 점점 코드처럼 보일 것이라는 의견이 있음
  - MOE 스타일 모델을 함수 호출로 변환하는 방법이 다음 큰 혁신이 될 것임
