Artificial Neural Network (인공 신경망)

5단 분석법

순서
분석
단어
내용
1
일반 명사
인공
자연의 반대로 사람이 만든 것
신경망
생물학적 뉴런 또는 인공 뉴런으로 구성된 신경 회로망
인공신경망
사람이 만든 신경 회로망?
2
고유 명사
인공신경망
머신 러닝과 인지 과학에서 사용되어 패턴 인식과 문제 해결 능력을 갖추게 하는, 뇌의 뉴런 네트워크를 모방한 알고리즘
3
사용 이유
인공신경망
인간이 일일이 개입하지 않고도 컴퓨터가 지능적인 결정을 내리는 데 도움이 되기 때문에
4
사용 방법
인공신경망
입력 데이터를 뉴런에 제공하고, 가중치를 통해 계산하며, 활성화 함수를 거쳐 출력을 얻고, 학습 과정을 통해 가중치를 조정
5
다른 기술과의 비교
인공신경망
-

정의

일반 명사

인공
자연의 반대로 사람이 만든 것
신경망
생물학적 뉴런 또는 인공 뉴런으로 구성된 신경 회로망
인공신경망
사람이 만든 신경 회로망?
인공은 자연의 반대로 사람이 만든 것을 뜻합니다.
신경망은 생물학적 뉴런 또는 인공 뉴런으로 구성된 신경 회로망을 말합니다.
두 단어를 조합해 보면, 인공신경망은 사람이 만든 신경 회로망이라는 의미로 해석할 수 있습니다.
고유 명사를 한 번 알아볼까요?

고유 명사

인공신경망
머신 러닝과 인지 과학에서 사용되어 패턴 인식과 문제 해결 능력을 갖추게 하는, 뇌의 뉴런 네트워크를 모방한 알고리즘
인공신경망(Artificial Neural Network, 이하 ANN)은 머신 러닝과 인지 과학에서 사용되어 패턴 인식과 문제 해결 능력을 갖추게 하는, 뇌의 뉴런 네트워크를 모방한 알고리즘입니다.
ANN은 A(Artificial)를 생략하고 NN(Neural Network)라고 표현하기도 합니다.
ANN은 Input layer(입력층)과 Hidden layer(은닉층), Output layer(출력층)으로 구성되어 있습니다.
Input layer와 Hidden layer 사이, 그리고 Hidden layer와 Output layer 사이에는 weight 값들이 행렬로 이루어져 들어가있습니다.
1. 회색 뉴런이 있는 이유가 무엇인가요?
Fully Connected Neural Network (완전 연결 신경망)은 각 층의 모든 뉴런이 다음 층의 모든 뉴런과 완전히 연결되어 있는 것을 말하고, ANN은 FCNN를 포함하는 개념이지만, 모든 뉴런을 연결하지 않아도 되기 때문에 확실하게 이해시키기 위해서 하나의 뉴런을 회색으로 표시했습니다.

ANN의 기본 동작 구조

Input layer에 있는 노드에선 입력값을 받습니다.
이때, 입력값은 주로 1차원 배열 즉, Flatten(평탄화) 상태의 데이터를 받습니다.
필요에 따라서 2차원 또는 고차원 배열도 받을 수 있습니다.
Input layer에서 입력데이터를 받으면, Hidden layer에서 예측 과정을 지나 Output layer에서 예측값을 출력하게 됩니다.

Feed-Forward(순전파)

순전파(피드포워드)가 무엇인가요?
“순전파”는 인공 신경망에서 사용하는 용어인 “Feed-Forward”를 한자로 번역한 표현입니다. 각각의 단어를 한자로 풀이하면 다음과 같습니다:
순(順): 순서대로, 차례로 진행함을 의미합니다.
전(傳): 전달하다, 전파하다를 의미합니다.
파(播): 퍼뜨리다, 전파하다를 의미합니다.
따라서, “순전파”는 “순서대로 전달하여 퍼뜨린다”는 의미를 가지고 있습니다. 이는 인공 신경망에서 입력 데이터가 입력층에서 시작하여 은닉층을 거쳐 출력층으로 순차적으로 전달되는 과정을 나타냅니다. “순전파”는 입력 데이터를 통해 네트워크가 예측값을 생성하는 과정입니다.
인공신경망에서 입력 데이터를 출력으로 변환하는 과정만을 의미합니다.
피드포워드 신경망은 입력 데이터를 받아서 은닉층과 출력층을 거쳐 출력을 생성하는 과정을 포함합니다. 이 과정에서 오차를 계산하지는 않습니다.
그런데 피드포워드 과정 중에 오차가 있을 수 있을 것입니다.

Loss Function(손실 함수)

출력층에서 예측된 출력값과 실제 정답을 비교하여 손실(Loss) 값을 계산합니다
선형의 설명은 적절하지 않습니다. 신경망의 피드포워드 과정은 여러 계층을 거치며, 각 계층에서 비선형 변환이 이루어지기 때문입니다. 다만, 더 쉬운 이해를 위해 선형으로 그렸습니다.
여기까지의 과정을 Feed-Forward(순전파)라고 합니다.

Backpropagation(역전파)

이때, 출력층에는 이미 정답이 정해져있는데 정답에서 벗어난 범위를 가중치를 계산하기 위해 벗어난 범위를 계산합니다.

전체 과정

1.
피드포워드 (Feed-Forward)
2.
손실 함수 (Loss Function) 계산
3.
백프로파게이션 (Backpropagation)
4.
경사 하강법 (Gradient Descent)을 통한 가중치 업데이트

설명

1.
피드포워드 (Feed-Forward)
입력 데이터를 신경망의 입력층에서 시작하여, 은닉층을 거쳐, 출력층까지 순차적으로 전달합니다. 이 과정에서 각 층의 가중치와 활성화 함수를 사용하여 출력을 계산합니다.
2.
손실 함수 (Loss Function)
출력층에서 예측된 출력값과 실제 정답을 비교하여 손실(Loss) 값을 계산합니다. 손실 함수는 예측값과 실제값 간의 차이를 정량화하여, 모델의 성능을 평가합니다. 일반적으로 사용되는 손실 함수로는 평균 제곱 오차(MSE), 교차 엔트로피(Cross-Entropy) 등이 있습니다.
3.
백프로파게이션 (Backpropagation)
계산된 손실 값을 기반으로, 손실을 줄이기 위해 각 가중치에 대한 기울기(gradient)를 계산합니다. 이 과정은 출력층에서 시작하여 역방향으로 진행되며, 각 층의 가중치에 대한 그래디언트를 계산합니다.
4.
경사 하강법 (Gradient Descent)
계산된 기울기를 사용하여 가중치를 업데이트합니다. 경사 하강법은 손실 값을 최소화하기 위해 가중치를 조정하는 최적화 알고리즘입니다. 가중치 조정은 역방향으로 이루어지며, 각 가중치는 기울기의 방향으로 조금씩 변경됩니다.

사용 이유

인공신경망
인간이 일일이 개입하지 않고도 컴퓨터가 지능적인 결정을 내리는 데 도움이 되기 때문에
인공신경망은 인간이 일일이 개입하지 않고도 컴퓨터가 지능적인 결정을 내리는 데 도움이 되기 때문에 사용됩니다.
인공신경망은 규칙 기반 프로그래밍으로는 해결하기 어려운 복잡한 문제, 예를 들어 컴퓨터 비전이나 음성 인식과 같은 분야에서 유용합니다.
인공신경망은 대량의 데이터로부터 학습하여 패턴을 인식하고, 이를 기반으로 새로운 데이터에 대해 예측을 수행할 수 있습니다.

사용 방법

인공신경망
입력 데이터를 뉴런에 제공하고, 가중치를 통해 계산하며, 활성화 함수를 거쳐 출력을 얻고, 학습 과정을 통해 가중치를 조정인공신경망을 사용하는 방법은 다음과 같습니다.

1. 입력 데이터 제공

입력 데이터를 인공 뉴런에 제공합니다.
각 뉴런은 입력값을 받아들이고, 이를 다음 단계로 전달할 준비를 합니다.
import numpy as np # 입력 데이터 X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
Python
복사
X는 XOR 문제를 해결하기 위한 입력 데이터입니다. 각 행은 입력 데이터의 하나의 샘플을 나타냅니다.
[0, 0], [0, 1], [1, 0], [1, 1]은 XOR 문제의 가능한 모든 입력 조합입니다.

2. 가중치 계산

각 입력값에 특정 가중치를 곱합니다.
이 가중치는 뉴런 간의 연결 강도를 나타내며, 학습을 통해 조정됩니다.
# 임의의 초기 가중치 weights = np.random.rand(2, 2) # 가중치 계산 예시 weighted_inputs = np.dot(X, weights)
Python
복사
weights는 임의의 초기 가중치입니다. np.random.rand(2, 2)는 2x2 행렬의 무작위로 생성합니다.
weighted_inputs = np.dot(X, weights)는 입력 데이터와 가중치를 곱하여 가중치가 적용된 입력값을 계산합니다. np.dot은 행렬 곱셈을 수행합니다.
np.dot으로 어떻게 계산되는지 모르겠어요
np.dot의 동작 방식
입력 행렬 X와 가중치 행렬 weights의 행렬 곱을 계산합니다. 이는 각 입력 행렬의 행과 가중치 행렬의 열을 곱한 후 합산하여 새로운 행렬을 생성하는 과정입니다.
입력 행렬 X:
[[0, 0], [0, 1], [1, 0], [1, 1]]
Lua
복사
가중치 행렬 weights:
[[0.2, 0.8], [0.5, 0.1]]
Lua
복사
행렬 곱 연산
1.
첫 번째 행의 연산:
X의 1행 1열과 weights의 1행 1열을 곱하고, X의 1행 2열과 weights의 2행 1열을 곱한 후 더합니다.
0 × 0.2 + 0 × 0.5 = 0
X의 1행 1열과 weights의 1행 2열을 곱하고, X의 1행 2열과 weights의 2행 2열을 곱한 후 더합니다.
0 × 0.8 + 0 × 0.1 = 0
결과: [0, 0]
2.
두 번째 행의 연산:
X의 2행 1열과 weights의 1행 1열을 곱하고, X의 2행 2열과 weights의 2행 1열을 곱한 후 더합니다.
0 × 0.2 + 1 × 0.5 = 0.5
X의 2행 1열과 weights의 1행 2열을 곱하고, X의 2행 2열과 weights의 2행 2열을 곱한 후 더합니다.
0 × 0.8 + 1 × 0.1 = 0.1
결과: [0.5, 0.1]
3.
세 번째 행의 연산:
X의 3행 1열과 weights의 1행 1열을 곱하고, X의 3행 2열과 weights의 2행 1열을 곱한 후 더합니다.
1 × 0.2 + 0 × 0.5 = 0.2
X의 3행 1열과 weights의 1행 2열을 곱하고, X의 3행 2열과 weights의 2행 2열을 곱한 후 더합니다.
1 × 0.8 + 0 × 0.1 = 0.8
결과: [0.2, 0.8]
1.
네 번째 행의 연산:
X의 4행 1열과 weights의 1행 1열을 곱하고, X의 4행 2열과 weights의 2행 1열을 곱한 후 더합니다.
1 × 0.2 + 1 × 0.5 = 0.7
X의 4행 1열과 weights의 1행 2열을 곱하고, X의 4행 2열과 weights의 2행 2열을 곱한 후 더합니다.
1 × 0.8 + 1 × 0.1 = 0.9
결과: [0.7, 0.9]
최종 결과
결과 행렬 weighted_inputs는 다음과 같이 계산됩니다:
[[0.0, 0.0], [0.5, 0.1], [0.2, 0.8], [0.7, 0.9]]
Lua
복사

3. 활성화 함수 적용

가중치를 곱한 값을 모두 합산하고, 이 합산된 값을 활성화 함수에 입력하여 뉴런의 출력을 결정합니다.
활성화 함수는 주로 비선형 함수를 사용하여 복잡한 패턴을 인식할 수 있게 합니다.
def sigmoid(x): return 1 / (1 + np.exp(-x)) # 활성화 함수 적용 activated_output = sigmoid(weighted_inputs)
Python
복사
sigmoid 함수는 시그모이드 활성화 함수를 정의합니다. 시그모이드 함수는 입력값을 0과 1 사이로 압축합니다.
np.exp(-x)는 배열 x의 각 요소에 대해 음수 값을 취한 후 자연 지수 함수 e^{-x} 를 계산합니다.
자연 상수 ( e )의 값을 알아야 합니다. ( e )는 약 2.718입니다.
즉, 1/e^x입니다.
그래서 “1/2.718^x“와 같이 변형이 가능하며 즉 1보다 작은 수가 됩니다.
activated_output = sigmoid(weighted_inputs)는 가중치가 적용된 입력값에 시그모이드 함수를 적용하여 출력값을 계산합니다.

4. 출력 도출

활성화 함수를 통과한 값이 최종 출력값이 됩니다.
이 출력값은 문제의 해결책이나 분류 결과를 나타냅니다.
# 최종 출력 값 output = activated_output print("출력 값:", output)
Python
복사
output은 활성화 함수를 통과한 최종 출력값입니다.
print("출력 값:", output)는 최종 출력을 출력합니다.

5. 가중치 조정

학습 과정에서는 출력값과 실제 값의 오차를 계산하고, 이 오차를 최소화하도록 가중치를 조정합니다.
이를 통해 모델이 점점 더 정확한 예측을 할 수 있게 됩니다.
# 실제 값 (예: XOR 문제) y = np.array([[0], [1], [1], [0]]) # 오차 계산 error = y - output # 가중치 조정 (간단한 예: 경사 하강법) learning_rate = 0.1 adjustments = learning_rate * np.dot(X.T, error * (output * (1 - output))) weights += adjustments print("조정된 가중치:", weights)
Python
복사
y는 XOR 문제의 실제 출력값입니다.
error = y - output는 예측값과 실제 값의 오차를 계산합니다.
learning_rate는 학습률로, 가중치를 얼마나 크게 조정할지를 결정합니다.
adjustments는 가중치 조정을 위한 값을 계산합니다. 여기서 error * (output * (1 - output))는 시그모이드 함수의 도함수를 이용한 오차 값의 조정입니다.
weights += adjustments는 가중치를 조정하여 모델을 학습시킵니다.

Google Colab

알아두면 좋은 정보

인공신경망 vs. 다른 머신러닝 알고리즘

인공신경망은 다양한 머신러닝 알고리즘과 비교하여 더 복잡한 패턴 인식 및 예측이 가능합니다.
예를 들어, 전통적인 머신러닝 알고리즘은 주로 명시적 프로그래밍 규칙에 의존하지만, 인공신경망은 데이터로부터 직접 학습하여 더 높은 예측 정확도를 보일 수 있습니다.
전통적 머신러닝
주로 선형 회귀, 결정 트리, 서포트 벡터 머신 등
인공신경망
다층 퍼셉트론, 합성곱 신경망, 순환 신경망 등
이러한 특징 때문에 인공신경망은 이미지 인식, 음성 인식, 자연어 처리 등 복잡한 문제에 효과적으로 사용됩니다.

미니퀘스트

1번 미니퀘스트 - 인공신경망을 이용한 XOR 문제 해결

XOR 문제는 두 입력값이 서로 다를 때 출력이 1이 되는 논리 연산입니다.
이 미니퀘스트에서는 XOR 문제를 해결하는 인공신경망을 구축하고 학습시켜 예측 결과를 확인해 봅니다.

문제 설명

1.
데이터셋 정의
XOR 문제의 입력 데이터와 출력 데이터를 정의합니다.
X는 입력 데이터, y는 출력 데이터입니다.
예시데이터
# XOR 문제 데이터셋 X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([[0], [1], [1], [0]])
Python
복사
2.
모델 생성
Sequential 모델을 생성합니다.
Input 객체를 사용하여 입력 형태를 정의합니다.
첫 번째 Dense 레이어를 추가하여 은닉층을 구성합니다. 뉴런 수는 2개, 활성화 함수는 sigmoid를 사용합니다.
두 번째 Dense 레이어를 추가하여 출력층을 구성합니다. 뉴런 수는 1개, 활성화 함수는 sigmoid를 사용합니다.
3.
모델 컴파일
손실 함수로 binary_crossentropy를 사용하고, 옵티마이저로 adam을 사용합니다.
평가 지표로 accuracy를 설정합니다.
4.
모델 학습
모델을 학습시킵니다. 에포크 수는 10000으로 설정하여 충분히 학습시킵니다.
학습 과정의 출력을 생략하기 위해 verbose=0으로 설정합니다.
5.
예측 결과 출력
학습된 모델을 사용하여 입력 데이터에 대한 예측 결과를 출력합니다.
예측 결과를 반올림하여 0 또는 1로 표시합니다.

코드

import numpy as np import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Input # XOR 문제 데이터셋 X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([[0], [1], [1], [0]]) # 인공신경망 모델 생성 model = Sequential() model.add(Input(shape=(2,))) model.add(Dense(2, activation='sigmoid')) model.add(Dense(1, activation='sigmoid')) # 모델 컴파일 model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 모델 학습 print("모델 학습 중...") model.fit(X, y, epochs=10000, verbose=0) # 예측 결과 출력 predictions = model.predict(X) print("\n입력 데이터:") print(X) print("예측 결과:") print(np.round(predictions))
Python
복사

예측 결과 설명

입력 데이터
예측 결과
[0, 0]
0
[0, 1]
1
[1, 0]
1
[1, 1]
0
이 결과는 XOR 문제의 정답과 일치합니다.
모델이 XOR 문제를 정확히 해결했음을 확인할 수 있습니다.

코드 설명

2번 미니퀘스트 - 간단한 인공신경망으로 AND 연산 학습하기

AND 문제는 두 입력값이 모두 1일 때 출력이 1이 되는 논리 연산입니다.
이 미니퀘스트에서는 AND 문제를 해결하는 인공신경망을 구축하고 학습시켜 예측 결과를 확인해 봅니다.

문제 설명

1.
데이터셋 정의
AND 문제의 입력 데이터와 출력 데이터를 정의합니다.
X_and는 입력 데이터, y_and는 출력 데이터입니다.
2.
모델 생성
Sequential 모델을 생성합니다.
Input 객체를 사용하여 입력 형태를 정의합니다.
첫 번째 Dense 레이어를 추가하여 은닉층을 구성합니다. 뉴런 수는 2개, 활성화 함수는 sigmoid를 사용합니다.
두 번째 Dense 레이어를 추가하여 출력층을 구성합니다. 뉴런 수는 1개, 활성화 함수는 sigmoid를 사용합니다.
3.
모델 컴파일
손실 함수로 binary_crossentropy를 사용하고, 옵티마이저로 adam을 사용합니다.
평가 지표로 accuracy를 설정합니다.
4.
모델 학습
모델을 학습시킵니다. 에포크 수는 10000으로 설정하여 충분히 학습시킵니다.
학습 과정의 출력을 생략하기 위해 verbose=0으로 설정합니다.
5.
예측 결과 출력
학습된 모델을 사용하여 입력 데이터에 대한 예측 결과를 출력합니다.
예측 결과를 반올림하여 0 또는 1로 표시합니다.

코드

# AND 문제 데이터셋 X_and = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y_and = np.array([[0], [0], [0], [1]]) # 인공신경망 모델 생성 model_and = Sequential() model_and.add(Input(shape=(2,))) model_and.add(Dense(2, activation='sigmoid')) model_and.add(Dense(1, activation='sigmoid')) # 모델 컴파일 model_and.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 모델 학습 print("모델 학습 중...") model_and.fit(X_and, y_and, epochs=10000, verbose=0) # 예측 결과 출력 predictions_and = model_and.predict(X_and) print("입력 데이터:") print(X_and) print("예측 결과:") print(np.round(predictions_and))
Python
복사

예측 결과 설명

입력 데이터
예측 결과
[0, 0]
0
[0, 1]
0
[1, 0]
0
[1, 1]
1
이 결과는 AND 문제의 정답과 일치합니다.
모델이 AND 문제를 정확히 해결했음을 확인할 수 있습니다.

코드 설명

미니퀘스트 답안지

ⓒ 2024 startupcode. 모든 권리 보유. 무단 복제 금지.