
AI 기초부터 시작하기: Rust로 첫 번째 뉴런 구현하기
요약
Rust 언어를 사용하여 인공 신경망의 가장 기초적인 단위인 단일 뉴런을 직접 구현하는 튜토리얼입니다. 데이터셋을 활용해 예측, 오차 계산, 훈련 루프가 작동하는 수학적 원리를 코드로 학습합니다.
핵심 포인트
- Rust를 이용한 단일 뉴런의 구조적 구현 방법 제시
- 데이터셋을 통한 입력값과 출력값 사이의 관계 학습 원리 설명
- 예측, 오차 계산, 훈련 루프의 핵심 메커니나 이해
- AI 모델의 근본적인 수학적 원리(y = mx + b) 파악
GPT를 사용해 본 적은 있지만, 그 내부에 무엇이 있는지 알고 있나요? 이 포스트에서는 Rust를 사용하여 모든 신경망(Neural Network)의 가장 근본적인 블록인 단일 뉴런을 구축하고, **예측(Prediction), 오차(Error), 훈련(Training)**이 실제로 어떻게 작동하는지 이해해 보겠습니다.
목차
- 1 서문
- 2 문제 정의
- 3 데이터셋(Dataset)이란 무엇인가
- 4 공식: y = mx + b
- 5 뉴런 구현하기
- 6 오차 계산하기
- 7 훈련 루프(Training Loop) 개발하기
- 8 이 방법의 한계
- 9 결론
1. 서문
저는 최근 코드를 작성하고, 제품을 만들고, 이 분야에서 일어나는 모든 일을 따라가기 위해 많은 AI를 사용하고 있습니다. 제가 항상 동의하는 한 가지 점은 기초를 공부하는 것의 중요성입니다.
우리는 어느 시점에 jQuery를 사용하고, 그 다음에는 React, Vue, Svelte, Next, Nuxt, Xupt, Xep, 그리고 plinbols를 사용합니다. 이 모든 것의 이면에는 변하지 않는 개념과 원칙이 존재하며, 저는 그것을 이해하려고 시간을 투자하는 것이 가치 있다고 믿습니다.
기술적 지식이 없는 지인이 당신에게 이른바 AI가 어떻게 작동하는지 물었을 때, 무엇이라고 답해야 할지 전혀 모르는 상황을 상상해 보세요. 아마 별로 큰 차이는 없을 수도 있습니다. 상대방도 모든 세부 사항을 이해하지는 못할 것이기 때문입니다. 하지만 저는 그런 창피를 당할 위험을 감수하고 싶지 않습니다.
그래서 저는 다시 처음으로 돌아가기로 했습니다. 몇 가지 근본적인 개념을 공부하고, 이를 구현하고, 노트를 작성하며, 이 학습 여정을 공유하기 위해 이러한 메모들을 일련의 포스트로 변환하기로 했습니다.
이 첫 번째 포스트는 입력 X와 출력 Y 사이의 관계를 학습할 수 있는 인공 뉴런을 구현하고 훈련하는 것에 관한 것입니다.
2. 문제 정의
발사할 때마다 발사 에너지를 조절할 수 있는 대포가 있다고 상상해 보세요. 우리는 포탄이 어디까지 날아갈지 알고 싶습니다.
질문은 이것입니다: 이전에 사용해 본 적 없는 에너지 값이 주어졌을 때, 거리를 예측할 수 있을까요?
에너지 → [ 뉴런 ] → 예측된 거리
이것이 바로 뉴런이 학습하게 될 내용입니다 — 공식으로부터가 아니라, 우리가 수집한 데이터로부터 학습합니다.
3. 데이터셋 (Dataset)이란 무엇인가
누군가 대포를 9번 발사했고, 매 발사 시마다 두 개의 숫자, 즉 사용된 에너지와 포탄이 이동한 거리를 기록했습니다.
let dataset: Vec<(f64, f64)> = vec](https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0ahy3my0wpmz4avz6dev.png)
- **보라색 선** — 0에 붙어 있는 뉴런의 예측값
- **초록색 점** — 데이터셋의 실제값
- **주황색 선** — 각 지점에서의 오차 크기
목표는 파란색 선이 초록색 점들을 통과할 때까지 `weight`와 `bias`를 조정하는 것이며, 주황색 선들이 사라지면 뉴런이 학습을 완료한 것입니다.
### 7. 트레이닝 루프 (training loop) 개발
이제 오차를 계산할 수 있게 되었으므로, 뉴런이 예측을 개선하도록 만들어야 합니다.
트레이닝 루프 (training loop)는 동일한 과정을 여러 번 반복하는 것으로 구성됩니다. 데이터셋을 한 번 완전히 통과하는 것을 하나의 `epoch`라고 부릅니다. 매 `epoch`마다 관측된 값에 직선을 근사시키기 위해 `weight`와 `bias`를 조정해 나갈 것입니다.
이 첫 번째 예제에서는 경사 하강법 (gradient descent)이나 미분 계산을 아직 도입하지 않고, **매우 단순하고 교육적인** 전략을 사용할 것입니다:
1. `weight`와 `bias`를 (0, 0) 값으로 초기화합니다.
2. 데이터셋의 각 쌍(예: (10, 28))에 대해 예측 오차를 계산합니다.
3. 오차가 0보다 크면 예상보다 더 큰 값을 예측하고 있다는 의미이므로, `weight`와 `bias`를 0.01만큼 감소시킵니다.
4. 오차가 0보다 작으면 예상보다 더 작은 값을 예측하고 있다는 의미이므로, `weight`와 `bias`를 0.01만큼 증가시킵니다.
5. `weight`와 `bias` 값을 보정하기 위해 이 과정을 1000 `epoch` 동안 반복합니다.
for epoch in 0..epochs {
for (energy, actual) in dataset {
let predicted = self.predict(*energy);
...
이 조정 규칙은 시각화하기 쉽기 때문에 선택되었습니다. 뉴런이 위쪽으로 오차를 내면 파라미터(parameters)를 아래로 밀어내고, 아래쪽으로 오차를 내면 위로 밀어냅니다. 이는 모델을 개선하지만, **아직 학습(training)을 위한 가장 적절한 절차는 아닙니다.**
1000 에포크 (epochs) 이후:
[](https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhibuynze0talsudcmd6b.png)
직선이 조정되었습니다. 뉴런이 무언가를 학습했습니다.
### 8. 이 방법의 한계
직선이 조정되었지만 완벽하지는 않습니다. 중간 지점들은 잘 맞추지만 양 끝단에서는 오차가 더 커집니다.
그 이유는 이 알고리즘이 **오차의 크기 (size of the error)**를 고려하지 않고 오직 부호(sign)만을 고려하여 항상 동일한 고정 단계(`0.01`)로 조정하기 때문입니다. 또한, 손실 함수 (loss function)의 기울기 (slope)를 사용하여 조정의 최적의 방향과 강도를 결정하지 않기 때문에, 어느 순간부터 진동(oscillate)하기 시작하여 정답 값을 지나치고, 반대 방향으로 과하게 수정했다가 다시 지나치는 현상이 발생합니다. **에포크 (epochs)를 더 늘린다고 해결되지 않습니다.**
이를 해결하는 방법은 **경사 하강법 (gradient descent)**이며, 이는 다음 포스트에서 살펴볼 오차를 줄이기 위한 또 다른 방법입니다.
### 9. 결론
이번 포스트에서는 아무것도 없는 상태에서 시작하여 Rust로 기능하는 뉴런을 구현해 보았습니다.
학습한 내용:
- 인공 뉴런은 `y = mx + b` — 즉, 직선의 방정식입니다.
- `weight` (가중치)와 `bias` (편향)는 파라미터이며 학습을 통해 조정됩니다.
- 데이터셋 (dataset)은 정답지 역할을 하며, 뉴런은 공식을 보지 않고 예시를 보며 학습합니다.
- 오차 (error)는 뉴런이 각 지점에서 얼마나 틀리고 있는지를 측정합니다.
- 학습 루프 (training loop)는 매 에포크 (epoch)마다 오차를 사용하여 파라미터를 조정합니다.
실제로 우리가 여기서 구축한 것은 **수동 조정 규칙으로 학습된 단순 선형 모델 (simple linear model)**이며, 이는 다른 알고리즘을 배우기 전이라도 예측, 오차, 수정이라는 핵심적인 직관을 이해하기에 충분합니다.
우리가 아직 해결하지 못한 점은 오차 신호에 의한 조정이 **너무 단순하다**는 것입니다. 이는 오차의 크기를 정확하게 고려하지 않으며 진동(oscillation)을 유발할 수 있습니다.
다음 포스트에서는 이를 개선하는 것을 목표로 하는 알고리즘이자, 현대의 모든 머신러닝 (Machine Learning)의 강력한 기초가 되는 **경사 하강법 (gradient descent)**에 대해 다룹니다.
### 참고 문헌
- [프로젝트 소스 코드](https://github.com/z4nder/rs-linear-neuron)
- [Neural Network from Scratch — 이 시리즈에 영감을 준 영상](https://www.youtube.com/watch?v=GkiITbgu0V0&t=477s)
- [Artificial neuron — Wikipedia](https://en.wikipedia.org/wiki/Artificial_neuron)
만약 이 포스트가 도움이 되었다면, 자연스러운 다음 단계는 손실 함수 (loss function)를 구현한 다음, 실제 머신러닝 (Machine Learning)에서 사용하는 방식에 훨씬 더 가까워지는 **경사 하강법 (gradient descent)**으로 넘어가는 것입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기
