MS AI school 6기

[Microsoft AI School 6기] 2/3(29일차) 정리 - 딥러닝(Deep Learning), 퍼셉트론, 신경망 구현

parkjiyon7 2025. 2. 3. 18:03

파이썬으로 배우는 딥러닝(Deep Learning)

 

실습 환경 설정

 

Azure > 리소스 그룹 설정 > market place(만들기) > machine learning 검색하여 Azure machine learning 클릭

 

Azure machine learning

 

Launch studio > Notebooks > Files > Upload folder

하여 실습 폴더를 업로드

 

폴더 업로드

 

위와 같이 폴더를 확인할 수 있으면 업로드가 되었음을 확인할 수 있다

컴퓨팅 리소스를 생성한 후, 

python 파일의 실행 버튼을 누르면 실행이 됨을 확인할 수 있다

 

Notebooks

 

 

퍼셉트론

 

퍼셉트론

 

인간의 뉴런

인간의 뉴런(신경세포)은 감각을 통해 얻은 신호를 처리

뉴런은 신호를 취합하여 일정 값 이상이면 다음 뉴런으로 신호를 전달

-> 의미 있는 신호를 입력 받으면 출력을 함

 

퍼셉트론

인간의 뉴련을 모방

입력값(input)과 가중치(weight)가 선형 결합 되어 있음

 

권진욱 강사님 강의자료

 

선형 결합의 결괏값과 주어진 임계값(세타)에 따라 출력값의 활성화(신호 전달) 여부를 정하는 모델

즉, 임계값에 따라 활성화 여부를 정하는 모델

 

 

AND/OR/NAND Gate

 

퍼셉트론으로 회로 구성 - AND GATE

AND 게이트의 진리표 : 두입력이 모두 1 일 때만 1 을 출력하고, 그 외에는 0 을 출력

 

AND

 

-> 퍼셉트론으로 수행

 

권진욱 강사님 강의 자료

 

연결 강도(weight)과 임계값을 설정하면 transitor의 역할을 대신함을 알게됨

-> 임계값을 설정하여 이보다 작으면 0, 이보다 크면 1로 판단

-> 대입값을 여러 개를 자유롭게 대입

 

권진욱 강사님 강의 자료

 

즉, 선을 기준으로 0과 1을 판단하는 분류를 수행할 수 있음

 

AI 프로젝트를 위한 Python 라이브러리 - NumPy

  • Numerical Python을 줄여서 표기한 것 
  • 수학 및 과학 연산을 위한 패키지 
  • 수치해석 및 통계 분야에 널리 사용됨

신경망 학습 및 연산에서 행렬 연산이 수행됨

-> NumPy 사용

 

AND Gate 코드

 

and gate code

 

위의 코드를 살펴 보면 w는 weight, b는 임계값으로 해석할 수 있다

w1 = 0.5, w2 = 0.5, b = -0.7

w1x1 + w2x2 + b > 0 일때를 1이라고 가정

하여 AND 게이트를 작성한 결과가 위와 같다

 

퍼셉트론으로 회로 구성 - OR GATE

AND Gate와 마찬가지로 OR Gate를 만들면 구조가 다음과 같다

 

or

 

권진욱 강사님 자료

 

이에 실질적으로 값을 부여하면 다음과 같다

 

OR - 권진욱 강사님 강의 자료

 

임계값을 낮추게 되면 OR 회로를 형성할 수 있다.

위의 이미지를 보면, 가운데의 경우, 0과 1이 있을때 임계값이 0.7이면 0으로 판단하여 and 게이트가 되지만

임계값이 0.2인 경우 임계값보다 값이 커 1로 판단하여 or 게이트가 됨을 알 수 있다

 

OR Gate 코드

따라서 위의 AND Gate 코드에서 임계값(threshold)을 변경하게 되면 OR 게이트를 만들 수 있다

OR Gate code

 

임계값을 0.2로 변경하였더니 or gate 결과값이 나옴을 확인할 수 있다

  1.  각 데이터의 값x와 가중치w의 곱을 구하고(x1w1, x2w2, ...)
  2. 이것을 모두 더한 것( x1w1 + x2w2 + ...)이
  3. theta(임계값, b)을 넘으면 1을, 넘지 않으면 0을 출력

따라서 임계값을 낮추면 합이 작아도 쉽게 1을 출력하고,

데이터에 곱해줄 w를 증가 시켜주면 합이 커져서 임계값을 잘 넘게 됨(w와 theta는 hyper parameter처럼 임의 지정 가능).

 

퍼셉트론으로 회로 구성 - NAND GATE

NAND 게이트의 진리표 : AND게이트의 정 반대 결과를 출력

 

NAND

 

궘진욱 강사님 강의자료

 

AND gate와 반대로 구현하면 NAND 게이트가 됨을 알 수 있다

 

권진욱 강사님 강의 자료

 

and의 정반대의 동작을 하게 하기 위해서는 

w(weight)과 theta(b) 값을 음수로 지정하여 사용한다

 

NAND Gate 코드

 

NAND Gate code

 

AND 게이트에서 가중치와 임계값을 음수로 변경하여 작성한 코드는 NAND 게이트를 나타내며 이를 구현하면 위와 같이 나온다

 

 

XOR Gate

 

XOR 게이트: 문제의 시작

NAND 게이트의 진리표 : 둘 중 하나만 1일 경우 1을 출력하고, 그 외에는 0을 출력한다

 

xor

 

권진욱 강사님 강의 자료

 

위의 그림에서 보다 시피, 하나의 선으로 XOR를 분류할 수 없다

-> 즉, 하나의 선형분류가 동작하지 못한다는 문제점을 가지고 있다

 

이를 여러 개의 선으로 나누어 분리, 즉 여러 연산자를 조합하여 2개의 Layer를 구성하면 XOR 연산이 가능해진다

 

권진욱 강사님 자료 - 변형

 

1 Layer에는 NAND와 OR를 수행, 이후 해당 결과를 2 Layer에서 AND를 수행하면 XOR 결과 값이 나온다

-> 2개의 Layer를 이용하여 XOR 문제 해결

 

XOR Gate 코드

 

XOR Gate code

 

XOR Gate code

 

즉, 위에서 구성한 AND, OR, NAND 게이트를 활용하여 2개의 Layer로 구성하면 XOR 문제를 해결할 수 있다

이를 코드로 구현하면 위의 이미지와 같다

 

 

신경망

 

활성화 함수

 

인공신경망에서 다양한 Activation function 함수 적용

활성화 함수 : 입력값을 일정 기준에 따라 변화시켜 출력하는 비선형 함수

 

입력값과 가중치(weight)를 곱하고 편향(bias)을 더한 후 활성화 함수를 적용함 활성화 함수는 주어진 값이 특정 조건을 만족하게 되면 해당 값 출력

-> 결과값이 다양하게 나올 수 있기 때문에 이를 균일하게 하기 위한 활성화 함수 존재

  • 퍼셉트론의 활성화 함수는 계단함수(Step function)의 형태를 갖음
  • 다양한 활성화 함수가 적용되면서 인공신경망으로 발전 : Sigmoid, ReLU, Softmax 등

-> 퍼셉트론의 결과 값에 활성화 함수 적용하여 결과 값을 만듦

 

계단함수

- 일정 값 이상이면 1 이하이면 0

 

계단 함수

 

Sigmoid 함수

- 미분이 용이

 

Sigmoid 함수

 

활성화 함수 : 입력값을 일정 기준에 따라 변화시켜 출력하는 비선형 함수

입력값과 가중치(weight)를 곱하고 편향(bias)을 더한 후 활성화 함수를 적용함

- 활성화 함수는 주어진 값이 특정 조건을 만족하게 되면 해당 값 출력.

 

활성화 함수 사용 이유 

  • 비선형성(Non-linearity) 추가 : 복잡한 데이터 패턴 학습 및 다양한 함수 근사
  • 출력 범위 제한 : 다음 층 입력 값 크기 관리. 수렴 속도 향상 예. Singmoid [0, 1], tanh[-1, 1]
  • Gradient 계산의 용이성 : 역전파로 가중치 조정시 활성화 함수의 도함수 필요
  • 계산 효율성 : 계산이 단순하고 빠르게 수행돼 전체 학습 및 추론 속도 향상

- 비선형성을 도입해야 신경망이 복잡한 패턴을 학습할 수 있게 됨

즉, 중간 결과 값을 활성화 함수에 넣어 최종 결과값을 얻음

-> wx1+wx2+...+theta(b)의 값을 x로 하여 활성화 함수에 대입

 

활성화 함수(계단 함수) - 코드

- 계단 함수를 코드로 작성하여 보면 다음과 같다

 

활성화 함수 코드

 

활성화 함수 그래프

 

x가 0보다 큰 경우 1, 그 외에는 0으로 결과 값이 나오도록 계단 함수를 구성한 결과는 위와 같다

만일 모듈이 없다는 오류가 나올 경우, 우측 상단에 Python 3.10 - SDK v2 등으로 커널을 변경하여 주면 된다

 

활성화 함수(Sigmoid 함수) - 코드

 

sigmoid 함수 코드

 

sigmoid 함수 그래프

 

Sigmoid 함수의 공식을 대입하여 결과 값이 0-1 사이의 값이 되도록 하였다

즉, 여기에서는 활성화 함수가 sigmoid 함수가 된다

 

ReLU 함수 - 코드

0보다 작은 값은 0으로, 0봐 큰값은 취함

 

ReLU 함수 코드

 

ReLU 함수 그래프

 

- Sigmoid 함수의 단점을 극복하기 위해 ReLU 함수를 사용한다

- 0 이하의 값은 버리고 0 이상의 값은 취한다고 생각하면 이해가 쉽다

 

Sigmoid 함수와 계단 함수 비교

계단 함수 

  • 0을 경계로 출력이 갑자기 변화 

Sigmoid 함수 

  • 부드러운 곡선 
  • 입력에 따라 출력이 연속적으로 변화 
  • 신경망에서 중요한 역할

 

 

다차원배열의 계산

 

행렬 연산 - NumPy library 활용

 

  • 차원수는 ndim으로 확인 
  • 형상은 shape으로 확인 
  • 처음 차원은 0, 다음은 1번째 차원 
  • 2차원 배열을 matrix라고 부름(3차원 이상은 Tensor)
  • 가로 방향 row(행)
  • 세로 방향 column(열)

 

신경망에서의 행렬의 곱

 

권진욱 강사님 강의 자료

 

위의 경우에서 y1을 구하고 싶은 경우,

x1(가중치)*1 +x2*2(가중치)와 같이 구한다

이를 쉽게 계산하기 위해서 행렬을 만들어 주는데

 

신경망에서의 행렬의 곱

 

위와 같이 나온다.

즉, 

x 행렬: x의 수

W 행렬: 각 가중치를 정렬한 행렬(x1의 가중치는 1행, x2는 2행...)

y행렬: 이를 곱한 값

 

이를 코드로 나타내면 아래와 같다

 

신경망에서의 행렬의 곱

 

 

3층 신경망 구현하기

 

다층 퍼셉트론: MLP(Multi Layer Perceptron)

MLP : 인공신경망의 초기 모델 - 선형 모델인 퍼셉트론을 보완한 모델.

  • 입력층(Input layer) : input 데이터
  • 은닉층(Hidden layer) : 여러 퍼셉트론의 조합 (비선형 활성화 함수 사용)
  • 출력층(Output layer) : 모델의 최종 결과값

- Hidden Layer의 개수가 여러 개인 것을 Deep Neural Network라고 부른다

 

다층 퍼셉트론

 

3층 신경망 구현하기

- weight layer가 3개인 것을 3층 신경망이라고 함

- 입력 2개, 출력 2개, 은닉층 2개인 3층 신경망 기본 구조와 표기법

 

3층 신경망

 

표기법

 

표기는 책마다 다르니 유의

각각의 weight값이 행렬로 표기가 됨 - 위의 경우 2*3 행렬로 표현

 

입력층에서 1층으로 신호 전달

 

입력층에서 1층으로 신호 전달

 

Threshold -> bias(b) - (원래 Threshold 였으나 Sigmoid 함수로 변경되면서 bias로 사용하게 됨)

- bias 값을 중간 출력값에 그대로 적용하기 위해 1 노드를 사용

x1*w1 +x2*w2...+b = a(중간 출력값)

 

1층 계산식

 

이를 간단히 정리하면 다음과 같다

 

1층 계산식

 

활성화 함수 처리에 대한 그림은 다음과 같다

 

활성화 함수

 

이를 코드로 작성해 보면 다음과 같다

 

1) 입력층에서 1층으로 신호 전달

A1 = X*W1(1Layer의 가중치) + B1(1Layer의 Bias)

 

입력층에서 1층으로 신호 전달

 

2) 이렇게 얻은 A1에 활성화 함수(Sigmoid) 적용

 

활성화 함수 적용

 

신호전달

 

즉, 코드로 구한 Z1은 빨간 네모를 행렬로 나타낸 것이다

 

1층에서 2층으로 신호 전달

 

1층에서 2층으로 신호 전달

 

위에서 구한 Z1을 X2로 하여 A2를 구할 수 있다

A2 = Z1(=X2)*W2 + B2

-> 실제로는 W랑 B값을 랜덤 넘버로 하여 학습하여 최적의 값을 찾아냄

 

이를 코드로 나타내면 다음과 같다

 

1) 1층에서 2층으로 신호 전달

 

1층에서 2층으로 신호 전달

 

2) 활성화 함수 적용

 

활성화 함수 적용

 

활성화 함수 적용

 

Z2 값은 위의 사진에서 빨간색 네모로 표시된 Z값의 행렬이다

 

2층에서 3층으로 신호 전달

 

2층에서 3층으로 신호 전달

 

앞서 구한, Z2를 활용하여

A3 = Z2 * W3 +B3를 구한다

그 후, 변환을 적용하여 출력층인 Y를 구한다

 

이를 코드로 나타내면

 

1) 2층에서 3층으로 신호 전달

 

2층에서 3층으로 신호 전달

 

 

출력층 설계하기

 

Softmax 변환

최종 출력단에서는 Softmax 변환을 적용한다

 

Softmax 변환

 

softmax 변환은 위와 같다 이를 통해 y를 구하면,

 

softmax

 

위와 같이 구할 수 있다

 

정의

 

softmax 함수

 

성질

  • 확률분포 : Softmax 함수의 출력값들은 항상 0과 1사이의 값이며, 모든 출력의 합은 1이다. 따라서 출력벡터를 확률분포로 해석 가능
  • 미분 가능성 : Softmax 함수는 미분 가능하므로 역전파 학습과정에서 사용 가능
  • 입력값의 상대적 크기 반영 : 입력값의 상대적 크기에 따라 출력을 조정하며, 큰 입력값일수록 더 큰 확률을 가짐
  • 순서보존 : 입력값의 순서는 출력 값의 순서에 영향을 미침

 

이러한 softmax 함수를 이용하여 아래의 출력값인 y를 구한다

 

 

출력층 변환 - softmax

 

이를 코드로 작성하면 다음과 같다

 

softmax 함수 적용

 

Y, 즉, 출력층의 값이 나옴을 알 수 있다.

 

 

손글씨 숫자인식

 

숫자인식을 위한 MNIST 데이터 셋

 

mnist dataset

 

  • MNIST 데이터셋은 0부터 9까지의 손글씨 이미지로 구성 
  • 훈련 데이터가 6만장, 테스트 데이터가 1만장 
  • 각 데이터는 이미지와 라벨로 이루어짐 
  • 각 이미지는 28×28 해상도의 흑백 사진 
  • 각 픽셀은 0에서 255로 밝기 표현

라이브러리 import

 

라이브러리

 

이미지 로드 및 이미지 보여주는 함수

 

코드

 

위의 코드를 통해 이미지를 출력하면 다음과 같이 나온다

 

출력 결과

 

x_train[5]는 다섯번째 이미지라는 뜻이며, t_train[5]는 다섯번째 이미지의 label이

image 형식이 28*28이기 때문에 reshape을 해주어야 한다

load 시 flatten을 True로 해준다

-> 이는 데이터를 1차원 데이터로 만들어 주며, 신경망에 입력하기 쉽게 해준다

normalize data는 정규화를 해주면 0-1 사이의 값을 갖게 된다

 

Image matrix

28x28 행렬, 0에서 255로 각 픽셀의 밝기를 표현하도록 구성됨

 

권진욱 강사님 강의 자료

 

2차원으로 되어 있는 이미지에 대한 행렬을 Flatten을 통해 1차원으로 변환 -> 신경망에 입력이 용이하도록

 

 

오늘의 간단한 후기

 

설명을 친절하고 이해하기 쉽게 해주셔서 좋았다. 드디어 퍼셉트론이 무엇인지 이해한 것 같은 느낌이 들었다. 직접코딩을 해보고 절차들을 하나하나 밟아보니 무엇을 하고 있는 지에 대한 감을 잡기가 쉬웠다.

   

 

 

출처

 

[1] Oooops, "활성화 함수의 종류," *Velog*, https://velog.io/@oooops/%ED%99%9C%EC%84%B1%ED%99%94-%ED%95%A8%EC%88%98%EC%9D%98-%EC%A2%85%EB%A5%98 (accessed Feb. 3, 2025).

[2] Yaneodoo2, "딥러닝 신경망(Neural Network)의 모든 것," *Tistory*, https://yaneodoo2.tistory.com/entry/04-%EB%94%A5%EB%9F%AC%EB%8B%9D-%EC%8B%A0%EA%B2%BD%EB%A7%9DNeural-Network%EC%9D%98-%EB%AA%A8%EB%93%A0-%EA%B2%83 (accessed Feb. 3, 2025).

[3] EdrawSoft, "네트워크 다이어그램 템플릿," *EdrawSoft*, https://www.edrawsoft.com/kr/diagram-tutorial/network-diagram-templates.html (accessed Feb. 3, 2025).

[4] 고려대학교 응용수학 연구실, "신경망 (Neural Networks)," *Korea University Computational Mathematics Lab*, https://compmath.korea.ac.kr/deeplearning/NeuralNetworks.html (accessed Feb. 3, 2025).

[5] TensorFlow, "MNIST Dataset," *TensorFlow*, https://www.tensorflow.org/datasets/catalog/mnist?hl=ko (accessed Feb. 3, 2025).

[6] GS Network, "XOR Gate," *GS Network*, https://www.gsnetwork.com/xor-gate/ (accessed Feb. 3, 2025).

 

-If any problem for references, or any questions please contact me by comments.

-This content is only for recording my studies and personal profiles

 

일부 출처는 사진 내에 표기되어 있습니다

본문의 내용은 학습과 개인 profile 이외의 다른 목적이 없습니다

출처 관련 문제 있을 시 말씀 부탁드립니다

상업적인 용도로 사용하는 것을 금합니다

본문의 내용을 Elixirr 강의자료 내용(권진욱 강사님)을 기반으로 제작되었습니다

깃허브 소스코드의 내용을 담고 있습니다

강의 커리큘럼이 '밑바닥부터 시작하는 딥러닝' 교재를 바탕으로 제작되었습니다

본문의 내용은 MS AI School 6기의 강의 자료 및 수업 내용을 담고 있습니다

반응형