diff --git a/lessons/3-NeuralNetworks/03-Perceptron/translations/README.ko.md b/lessons/3-NeuralNetworks/03-Perceptron/translations/README.ko.md new file mode 100644 index 00000000..e559f074 --- /dev/null +++ b/lessons/3-NeuralNetworks/03-Perceptron/translations/README.ko.md @@ -0,0 +1,92 @@ +# 뉴럴 네트워크 소개: Perceptron + +## [강의 전 퀴즈](https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/103) + +현대의 뉴럴 네트워크와 유사한 것을 구현하려는 최초의 시도 중 하나는 1957년 코넬 항공 연구소의 프랭크 로젠블랫에 의해 수행되었습니다. 삼각형, 사각형, 원과 같은 원시적인 기하학적 도형을 인식하기 위해 설계된 "Mark-1"이라는 하드웨어였습니다. + +| | | +|--------------|-----------| +|Frank Rosenblatt | The Mark 1 Perceptron| + +> 이미지 출처 [위키피디아](https://en.wikipedia.org/wiki/Perceptron) + +입력 이미지는 20x20 광전지 배열로 표현되었습니다. 따라서 뉴럴 네트워크에는 400개의 입력과 하나의 이진 출력이 있습니다. 간단한 네트워크에는 **임계값 논리 장치(threshold logic unit)** 라 불리는 하나의 뉴런이 포함되어 있습니다. 뉴럴 네트워크의 가중치들은 훈련 단계에서 수동으로 조정해야 하는 가변 저항(potentiometer)처럼 작동합니다. + +> ✅ 가변 저항은 사용자가 회로의 저항을 조정할 수 있는 장치입니다. + +> 당시 뉴욕 타임즈는 Perceptron에 대해 다음과 같이 썼습니다: *해군이 기대하는 전자 컴퓨터의 배아는 걷고, 말하고, 보고, 쓰고, 번식하고, 자신의 존재를 자각할 수 있을 것입니다.* + +## Perceptron 모델 + +모델에 N개의 특징이 있다고 가정하고, 이 경우 입력 벡터는 크기 N의 벡터가 됩니다. Perceptron은 **이진 분류** 모델로, 입력 데이터를 두 가지 클래스로 구분할 수 있습니다. 각 입력 벡터 x에 대해 Perceptron의 출력은 클래스에 따라 +1 또는 -1이 될 것이라고 가정합니다. 출력은 아래의 공식을 사용하여 계산됩니다. + +y(x) = f(wTx) + +여기서 f는 계단 활성화 함수(step activation function)입니다. + + + + +## Perceptron 훈련 + +Perceptron을 훈련하려면 대부분의 값을 올바르게 분류하는, 즉 가장 작은 **오차**를 발생하는 가중치 벡터 w를 찾아야 합니다. 이 오차는 아래와 같은 방식으로 **퍼셉트론 기준(perceptron criterion)** 에 의해 정의됩니다: + +E(w) = -∑wTxiti + +여기서: + +* 잘못된 분류가 발생한 훈련 데이터 i지점에서 합계를 구합니다. +* xi는 입력 데이터이고, ti는 음수인지 양수인지에 따라 -1 또는 +1이 됩니다. + +이 기준은 가중치 w에 대한 함수로 생각할 수 있고, 이를 최소화해야 합니다. 간혹, **경사 하강(gradient descent)** 이라는 방법이 사용되는데, 초기 가중치 w(0)로 시작한 다음 각 단계에서 공식에 따라 가중치를 업데이트하는 방식입니다: + +w(t+1) = w(t) - η∇E(w) + +여기서 η는 **학습률(learning rate)** 를 의미하고, ∇E(w)는 E의 **기울기(gradient)** 를 나타냅니다. 기울기를 계산한 후에는 아래와 같이 마무리됩니다. + +w(t+1) = w(t) + ∑ηxiti + +Python의 알고리즘은 다음과 같습니다.: + +```python +def train(positive_examples, negative_examples, num_iterations = 100, eta = 1): + + weights = [0,0,0] # 가중치 초기화 (거의 무작위로) + + for i in range(num_iterations): + pos = random.choice(positive_examples) + neg = random.choice(negative_examples) + + z = np.dot(pos, weights) # perceptron 출력 계산 + if z < 0: # negative로 분류된 positive + weights = weights + eta*weights.shape + + z = np.dot(neg, weights) + if z >= 0: # positive로 분류된 negative + weights = weights - eta*weights.shape + + return weights +``` + +## 결론 + +이번 강의에서는 이진 분류 모델인 Perceptron과 가중치 벡터를 사용해서 Perceptron을 훈련하는 방법에 대해서 배웠습니다. + +## 🚀 도전 과제 + +자신만의 Perceptron을 구축해보고 싶다면, [Azure ML designer](https://docs.microsoft.com/ko-kr/azure/machine-learning/concept-designer?WT.mc_id=academic-77998-cacaste)를 사용하는 [Microsoft Learn](https://docs.microsoft.com/ko-kr/azure/machine-learning/component-reference/two-class-averaged-perceptron?WT.mc_id=academic-77998-cacaste)에서 이 실습을 해보시기 바랍니다. + +## [강의 후 퀴즈](https://red-field-0a6ddfd03.1.azurestaticapps.net/quiz/203) + +## 복습 및 자가 학습 + +Perceptron을 사용하여 간단한 문제뿐만 아니라 실제 문제를 해결하고, 학습을 계속할 진행하려면 [Perceptron Notebook](../Perceptron.ipynb)으로 이동하시 바랍니다. + +여기 Perceptron에 대한 [흥미로운 기사](https://towardsdatascience.com/what-is-a-perceptron-basics-of-neural-networks-c4cfea20c590)도 있습니다. + +## [과제](../lab/README.md) + +이번 강의에서, 이진 분류 작업을 위한 퍼셉트론을 구현하고 이를 이용해 두 개의 손으로 쓴 숫자를 분류해 보았습니다. 실습에서는 숫자 분류 문제를 완전히 해결해야 합니다. 즉, 주어진 이미지에 가장 일치할 가능성이 높은 숫자를 결정해야 합니다. + +* [설명](../lab/README.md) +* [Notebook](../lab/PerceptronMultiClass.ipynb)