Sign In
AI

퍼셉트론부터 AlexNet 까지

최윤진
DALL-E 3
이번 글에서는 딥러닝의 초기 구조인 퍼셉트론부터 현대 아키텍쳐의 완성이라고 볼 수 있는 AlexNet까지 살펴보며 딥러닝을 전체적으로 개괄 해보도록 하겠습니다.

딥러닝이란?

만약 세상의 모든 지식, 원리, 감각, 현상 모두를 논리적으로 풀어내서 코딩으로 구현해낸다면 완벽한 인공지능을 만들어 낼 수 있습니다. 하지만 현실적으로 불가능하기 때문에 데이터를 통해 학습시키는 머신러닝을 통해 인공지능을 구현합니다. 학습이란 데이터의 패턴이나 특징을 일반화되도록 하는 과정을 말합니다.
딥러닝은 머신러닝 방법론 중 하나로 인간의 신경망을 모방하는 방법론 입니다. 현재 대부분의 인공지능 연구는 딥러닝을 기반으로 이루어지고 있습니다.
대표적으로 기존의 머신러닝 방법들은 데이터의 특징(피처)을 지정해줘야만 데이터 학습을 진행할 수 있지만, 딥러닝은 데이터의 특성을 지정해주지 않고도 학습 시킬 수 있다는 점에서 가장 큰 차이점이 있습니다. 예를 들어 기존 머신러닝 방법은 개나 고양이 사진을 분류하기 위해서 귀 모양, 눈의 크기 같은 피처를 지정해줘야하지만 딥러닝은 단지 이미지 벡터를 넣어주면 됩니다.
특징(피처)를 선별할 필요가 없다는 딥러닝의 특성상 많은 분야에 적용이 가능합니다. 대표적으로 언어와 같은 시퀀스 데이터를 학습하는 자연어 처리, 인간의 시각을 학습하는 컴퓨터 비전과 같은 분야가 있으며 로보틱스, 음성 등의 분야에서도 활발히 적용되고 있습니다.
출처 : http://tobetong.com/?p=9393
특히, 문서를 종합적으로 이해하는 AI 모델을 만드는 DocumentAI 의 경우 컴퓨터 비전, 자연어 처리의 여러 태스크를 혼합하여 풉니다. 대표적으로 아래와 같은 태스크가 있습니다.
자연어 처리 (NLP)
기계 독해 MRC (Machine Reading Comprehesion)

출처 : https://www.ntt-review.jp/archive/ntttechnical.php?contents=ntr201909fa3.html
엔티티 분석 NER - (Name Entity Relation)
출처 : https://towardsdatascience.com/named-entity-recognition-and-classification-with-scikit-learn-f05372f07ba2
개체간 관계 분석 RE (Relation Extraction)
출처 : https://paperswithcode.com/task/relation-extraction
정보 추출 (Key Information Extraction)

출처 : https://blog.research.google/2022/04/formnet-beyond-sequential-modeling-for.html
정보 검색 (information retrieval)
요약 (Summarization)
컴퓨터 비전(CV)
이미지 분류(Image Classification)
출처 : https://towardsdatascience.com/10-papers-you-should-read-to-understand-image-classification-in-the-deep-learning-era-4b9d792f45a7
객체 탐지(Object Detection)
출처 : https://alwaysai.co/blog/object-detection-for-businesses
분할(Segemntation)
출처 : https://indiaai.gov.in/article/image-segmentation-the-deep-learning-approach
OCR
출처 : https://www.plugger.ai/blog/what-is-optical-character-recognition-ocr-the-definite-guide
레이아웃 분석(Layout Analysis)
출처 : https://towardsdatascience.com/auto-parse-and-understand-any-document-5d72e81b0be9
VQA (Visual Question Answering)
출처 : https://visualqa.org/

[딥러닝 타임라인] 퍼셉트론부터 AlexNet까지

1.
1958년, 인간의 신경망을 모방한 퍼셉트론 출시
2.
[딥러닝의 1차 겨울] 1969년, 퍼셉트론으로 XOR 문제와 같은 비선형 문제를 풀 수 없다는 것이 밝혀짐.
3.
1974년, Backpropagation 알고리즘을 통해 가중치와 편향을 자동으로 계산하는 방법을 고안.
4.
1986년, 제프리 힌튼이 다층 퍼센트론(MLP) 를 제시함으로써 비선형 문제를 풀 수 있게 됨.
이것을 기반으로 CNN, RNN 과 같은 딥러닝 알고리즘 등장.
5.
[딥러닝의 2차 겨울] 1990년대 부터 기울기 소실, 오버피팅, 느린 학습시간 등의 문제를 극복하지 못해 또 다시 암흑기를 맞이함.
6.
2012년 ReLU 활성화 함수, DropOut 과 같은 방법들의 등장으로 기존 문제를 해결함.
AlexNet의 등장과 함께 딥러닝이 부흥함.
출처 : https://datart.tistory.com/22
요약하자면 3세대에 걸져 현대 딥러닝 신경망 아키텍쳐가 탄생되었습니다.
아키텍쳐
1세대
퍼셉트론
2세대
MLP
3세대
AlexNet(ReLU, DropOut)
퍼셉트론부터 차례대로 살펴보겠습니다.

1. 1958년 - 퍼셉트론

출처 : https://kwounsu.medium.com/간단요약-퍼셉트론-로지스틱-회귀-서포트-벡터-머신-56cf834d53c4
퍼셉트론은 인간의 뉴런 구조를 모방하여 만든 구조입니다.
x 는 입력 값이며, w는 가중치입니다.

input값은 벡터

input값은 벡터이며 각 차원은 데이터의 특징을 의미합니다. 하나의 노드는 하나의 차원을 의미합니다.
예를 들어 키와 몸무게를 통해 건강 상태를 예측하는 모델을 만들어 본다고 생각해보겠습니다.
그렇다면 x = (x1, x2) 는 x = (키, 몸무게) 로 표현될 수 있습니다.
퍼셉트론의 노드 갯수에 의해 입력 가능한 벡터의 shape이 정해집니다. 관찰되는 데이터에 따라 그 내부 실제 값들은 매번 달라집니다.
x1 = (170, 70)
x2 = (180, 78)
28*28 픽셀로 표현되는 이미지 데이터는 784 차원의 벡터 로 표현할 수 있으며 784개의 노드들로 입력값에 들어값니다.
출처 : https://steemit.com/kr-steemit/@beseeyong/mnist-data
문자단위로 글자의 특징을 인식한다고 하면 100글자의 문장은 100 차원의 벡터로 표현할 수 있습니다.

가중치는 각 노드가 얼마나 중요한지를 알려준다.

각 노드 값들은 각각 가중치와 곱해져서 가중합이 되어 전달됩니다. 가중치(w)는 연결 강도로서 어느 노드가 얼마만큼 중요한지를 나타내는 값이라 할 수 있습니다. 키와 몸무게 중 어느 것이 건강 상태에 영향을 주는 지를 나타내는 값입니다. 다음과 같이 계산되어 출력층으로 전달 됩니다.
T = \sum_{i=1}^{n} w_ix_i
이것은 아래와 같이 선형 변환식으로 표현될 수 있습니다.
T = w ⋅ x
w = (w_{1}, w_{2}, w_{3}, ... , w_{n})
x = (x_{1}, x_{2}, x_{3}, ... , x_{n})
퍼셉트론은 하나의 선형변환입니다.

활성화 함수

활성화 함수는 가중 합된 값을 최종적으로 어떻 출력할 지 결정 짓는 함수입니다.
퍼셉트론에서는 활성함수로 0과 1로 이진 분류를 하는 계단함수를 사용했습니다. 퍼셉트론의 출력은 항상 0 or 1 입니다.
추가로 활성화 함수의 활성 강도를 조정해주기 위한 조정 값으로 출력값에 편향 b 값을 더해줍니다.
아래와 같이 가중합과 편향이 더해진 값은 활성화 함수를 거쳐 최종 퍼셉트론의 출력이 됩니다.
output = f\left(w ⋅ x + b\right)
(f는 계단함수)
x1 = (170, 70) - 정상
x2 = (180, 78) - 정상
x3 = (180, 150) - 비정상
x4 = (170, 200) - 비정상
위의 데이터를 w1=1, w2=1, b=-300 으로 지정하면 학습 정답 데이터대로 이진 분리를 정확히 해낼 수 있습니다.
아래는 키와 몸무게를 기반으로 건강 상태를 알아내는 퍼셉트론입니다.
Perceptron = F(1*x_{1} + 1*x_{2} - 300), f 는 계단함수
Q. 새로운 데이터 (175, 200) 은 정상인가? 비정상인가 ?
A. 모델에 따르면 175 + 200 - 300 > 0 이므로 비정상입니다.

퍼셉트론은 XOR 문제를 풀지 못한다.

퍼셉트론에서 가중치를 조절하면 AND, OR 로 표현되는 현상을 표현해낼 수 있습니다.
하지만 퍼셉트론은 절대 XOR을 모델링할 수 없습니다. 현실속의 많은 문제들은 비선형 구조를 가지고 있기 때문에 XOR 을 모델링 하지 못한다는 것은 심각한 문제입니다.
아래 그림은 (1,1), (1,0), (0,1), (0,0) 을 좌표 평면에 표시하고 퍼셉트론을 통해 AND, OR, XOR 분리하는 그림입니다. 퍼셉트론은 구조적으로 곡선을 근사할 수 없기 때문에 XOR 과 같은 비선형이 필요한 분포는 표현할 수 없습니다. 관찰되는 데이터는 비선형의 구조를 가지고 있기 때문에 한계에 봉착하게 되는 것입니다.
출처 : https://velog.io/@soyoun9798/DL1-2장-정의-구현-한계점

2. 1986년 - MLP

퍼셉트론을 2층 이상 쌓은 것을 다층 퍼셉트론(MLP, Multi-Layerd Perceptron)이라 하며 신경망(Neural Network)이라 칭합니다. 신경망은 시그모이드 활성화 함수와 결합하여 비선형 함수를 표현할 수 있게 되었고, 이로 인해 퍼셉트론의 한계였던 XOR을 해결하게 되었습니다.
💬
Q. 선형성이란?
A. 아래 두가지 비례성(proportionality)와 덧셈 가능성(additivity)이 성립해야 한다.
비례성(proportionality): f(kx)=kf(x) 가 모든 실수 kx에 대해 성립해야 한다.
덧셈 가능성(additivity): f(x+y)=f(x)+f(y) 가 모든 실수 xy에 대해 성립해야 한다.

비선형 활성화 함수

신경망을 여러개 쌓으면 표현력이 증가하지만, 활성화 함수가 없다면 퍼셉트론을 깊게 쌓는것은 의미가 없습니다. 왜냐하면  $B*(Ax)$ 는 $BAx$ 로 표현될 수 있기 때문있며, 이것은 하나의 선형 변환으로 $Cx$ 로 나타낼 수 있다는 것을 의미합니다.
하나의 층은 한번의 선형 변환이다. 활성화 함수가 없으면 여러 층을 쌓는 것은 하나의 변환과 같아질 수 있다. 출처 : https://jinseob2kim.github.io/deep_learning.html
따라서 비선형모양의 활성화 함수를 중간에 넣어주는 것이 중요합니다.
MLP를 만들어 낸 제프리 힌튼은 시그모이드 함수를 비선형 활성화 함수로 사용했습니다. 시그모이드 함수는 $−∞$에서 $+∞$ 사이의 모든 실수를 입력값으로 받아서 0과 1사이의 값을 출력하는 함수입니다.
시그모이드 함수 출처 : https://medium.com/@dlgkswn3124/summary-ablation-cam-visual-explanations-for-deep-convolutional-network-via-gradient-free-7cbc71a2e64d
이전 층에서 건너온 출력값들이 시그모이드를 거쳐 선형적으로 표현할 수 없는 비선형 변환을 거치게 되고 이러한 작업들이 층 단위로 이루어지면서 복잡한 표현(함수)를 얻게 되는 것입니다.
아래 그림을 살펴보면 활성화 함수와 퍼셉트론 층을 많이 쌓을 때 마다 더 복잡한 함수를 근사하는 것을 확인 할 수 있습니다.
출처 : https://jinseob2kim.github.io/deep_learning.html
MLP에서 가운데 존재하는 층을 ‘은닉층(hidden layer)’ 이라 칭합니다. 이것들이 하는 역할은 무엇일까요?
출처 : https://elogeel.wordpress.com/2010/05/05/multilayer-perceptron/
각 은닉층의 출력값들은 이전 층의 출력 값을 가중합하여 활성화 함수를 거친 값 들입니다.
수식적으로 보면 매우 복잡한 모양의 함수를 신경망이 만들어 내는 역할을 하는 값들입니다.
출처 : https://www.digitalocean.com/community/tutorials/mnist-dataset-in-python
신경망은 어떻게 숫자 3과 1을 구분 할 수 있는 걸까요? 이미지가 일렬로 나열되어 784 차원으로 들어왔다고 가정했을 때 분명 3과 1의 차이는 어느정도 존재합니다. 적절한 학습을 가하면 가로 부분이 탐지 되었을 때 은닉층의 특정 노드가 높은 활성화 값을 보이고, 세로 부분의 특정 패턴이 감지되었을 때 특정 노드가 활성화가 됩니다.
선형 변환과 활성화 함수를 거치고 적절한 가중치 조정이 이뤄지면 사람이 알지 못하는 미세한 변화와 패턴들을 은닉층의 노드들을 통해 감지해낼 수 있습니다.
출처 : https://stackoverflow.com/questions/60126470/how-can-i-concatenate-dynamic-values-with-the-flatten-vector-in-cnn
잘 표현할 수 있다는 것을 알아냈으니 이것을 결정하는 가중치(w) 를 찾기 위해선 어떻게 해야 할까요? MLP 이의 단점은 층을 쌓을수록 가중치 수도 많아진다는 사실입니다. 자동으로 가중치를 조절할 수 있는 방법들을 찾기 위해 노력했고 그에 대한 해답이 손실함수(Loss Funtion) 과 Backpropagation 입니다.

가중치 조절을 위한 손실 함수

먼저 직접 관찰된 데이터를 통해서 직접 가중치를 찾아내는 방법을 시도해보겠습니다.
키와 몸무게 관계 데이터를 생각해봅시다. 키에 따라 몸무게를 결정하는 모델을 찾고 싶습니다.
키(input x)
몸무게(정답)
100
30
150
50
170
70
180
78
아주 간단하게 활성화 함수 조차 없는 단순한 퍼셉트론으로 모델링 해봅시다.
y_{prediction} = w*x + b
이제 아래와 같이 모델의 prediction을 적을 수 있습니다.
키(input x)
몸무게(정답)
y_prediction
100
30
100*w + b
150
50
150*w + b
170
70
170*w + b
180
78
180*w + b
현재 작업의 목적은 관찰된 데이터로 부터 딥러닝 신경망의 적절한 가중치를 찾아내는 것입니다.
만약 일반성을 반영하는 데이터가 수집되었다는 가정하에 $y_{true} - y_{prediction} = 0$ 이도록 w와 b 를 조정해 주는 것이 합리적입니다.
$30 - (100*w + b) = 0$
$50 - (150*w + b) = 0$
이 두 식을 통해 $w = 0.4, b=-10$ 을 손쉽게 밝혀 낼 수 있습니다.
손실함수의 기본적인 아이디어는 모델 예측값과 관찰된 데이터(정답)의 차이가 0에 가깝게 수렴되도록 가중치를 조절하면 그것은 데이터를 잘 설명하는 모델이라는 것입니다.
위에선 단순한 차이를 손실 함수로 사용했지만, 손실 함수는 데이터의 형식에 따라 다르게 지정할 수 있습니다.
손실함수 = F(y_{true},y_{prediction})
MAE(평균 절대 오차) : 차이의 절댓값을 오차로 계산
MSE(평균 제곱 오차) : 차이의 제곱합을 오차로 계산
크로스 엔트로피 : 확률 분포 차이를 오차로 계산
손실 함수의 아이디어를 설명하기 위해서 위에서는 직접적으로 식을 풀었지만 가중치가 많아지면 적용이 불가능한 방법입니다.

손실함수의 최솟값 찾기 : 미분

실제로는 미분을 통해 손실 함수의 가장 작은 지점을 찾아내는 방식을 사용합니다. 미분은 순간의 변화율을 의미하며 그것의 음의 방향으로 이동하는 것은 그 지점에서 최솟값을 향해 가는 가장 빠른 길입니다.
만약 가중치가 1개라면 학습 라벨 데이터와 학습 하려는 모델의 손실이 아래와 같이 좌표 평면에 표시할 수 있습니다. 손실이 출력되면 가중치에 대한 손실함수의 접선의 기울기에 비례에 음의 방향으로 가중치를 조절하면 됩니다. 그렇게 움직인다면 조정된 가중치는 같은 상황에서 손실이 적게 나오게 됩니다.
모든 데이터를 MSE 로 손실을 계산해서 그릴 수 있는 식, 그 데이터에 한해 손실을 최소화하는 w 값이 존재함. x 축은 weight. 출처 : [https://velog.io/@superahxd/역전파Backpropagation-backward-pass](https://velog.io/@superahxd/%25EC%2597%25AD%25EC%25A0%2584%25ED%258C%258CBackpropagation-backward-pass)
가중치가 여러개인 경우에도 기본적인 원리는 같습니다. 다변수 상황에서는 손실함수를 각 가중치 변수로 편미분한 벡터를 Gradient Vector라 칭하고 그것의 음의 방향으로 이동하면 됩니다. 이것을 gradient descent 라고 합니다. gradient descent는 산 정상에서 가장 빠르게 하산하는 길을 찾아내는 것으로 비유할 수 있습니다.
출처 : https://mangkyu.tistory.com/34
출처 : https://venkysdatablogs.hashnode.dev/gradient-descent-optimizing-machine-learning-models
손실함수를 구성하는 모든 가중치에 대해서 편미분해서 gradient Vector를 구성하는 것이 가장 원론적인 방법(수치미분)입니다. 하지만 이것은 가중치 개수 만큼 미분을 해야 하기 때문에 비효율적인 방법이며 연쇄법칙(Chain Rule) 을 기반으로 하는 Backpropagation 을 통해 gradient descent 를 수행하게 됩니다.

Backpropagation : 각 가중치들은 손실에 얼마나 영향을 미치나요?

신경망의 구조는 이전의 은닉층이 다음 은닉층에 영향을 주며 모든 가중치는 모두 연결되어 있습니다.
아래 그림처럼 생각해볼 수 있습니다.
출처 : https://mathinsight.org/chain_rule_idea
함수로 적어본다면 다음과 같이 적을 수 있습니다.
y = f(g(x))
y 에 대한 x 의 변화율을 얻기 위해선 곧바로 계산 할수도 있지만 아래와 같이 변화율의 곱을 통해 표현 될 수 있습니다.
출처 : https://velog.io/@wise_head/모델-학습법-02
각 단계의 변화율을 곱함으로써 역순으로 변화율을 차례대로 계산할 수 있는 것입니다. 이것이 연쇄법칙(chain rule) 이며 backpropagation은 이것을 이용하여 가중치를 조절해나가는 방법입니다.
아래 신경망을 생각해봅시다.
출처 : https://evan-moon.github.io/2018/07/19/deep-learning-backpropagation/
활성화 함수는 시그모이드라고 가정했을 때 실제 계산되는 값들입니다.
손실함수는 MSE(평균 제곱 오차), 활성화 함수는 시그모이드라 해봅시다.
손실에 대한 w^{1}_{10} 미분은 chain rule 에 의해 아래와 같이 계산 될 수 있습니다.
출처 : https://evan-moon.github.io/2018/07/19/deep-learning-backpropagation/
∂E/∂a_{20} = 0.37
∂a_{20}/∂z_{20} = 0.25
∂Z_{20}/∂w^{1}_{10} = 0.54
∂E/∂w^{1}_{10} = 0.37_0.25_0.54 = 0.049
이러한 방식으로 모든 가중치의 개선 정도를 자동으로 개선시켜 나갈 수 있습니다.
텐서플로우와 파이토치의 경우 이러한 backpropagation 을 구현한 프레임워크입니다.

3. 2012년 - AlexNet

이론상 2층 이상의 신경망 구조로 모든 함수를 근사할 수 있으며 backpropagation을 통해 손쉽게 가중치를 학습할 수 있습니다. 하지만 학습 데이터에 가중치가 과하게 학습되어 일반화 된 성능을 보여주지 못하는 오버피팅 문제가 있었습니다. 기울기가 제대로 전달되지 않은 기울기 소실 문제도 발생했습니다.
오버피팅 문제는 학습하는 과정에서 특정 노드의 연산을 배제하는 Dropout을 통해 이것을 극복했습니다.
출처 : https://velog.io/@ksh273/딥러닝-3
기울기 소실 문제는 시그모이드를 활성화 함수를 ReLU 함수를 바꾸어 극복했습니다.
출처 : https://wiki.terzeron.com/Artificial_Intelligence/기본_개념_및_용어
이렇게해서 현대 딥러닝 아키텍쳐가 완성됩니다. 이것을 종합하여 만들어진 AlexNet을 살펴봅시다.
제프리 힌튼과 일리야 수츠케버가 공동으로 설계하여 2012년 ILSVRC 손글씨 숫자 분류 대회 에서 우승을 거둔 모델입니다. 3세대 딥러닝에 CNN 을 적용한 것이라고 볼 수 있습니다.
출처 : [https://www.google.com/search?q=alexnet+architecture&tbm=isch&ved=2ahUKEwjV3cC22feDAxVIXvUHHQEnDiIQ2-cCegQIABAA&oq=alexNet+ar&gs_lcp=CgNpbWcQARgAMgUIABCABDIECAAQHjIECAAQHjIECAAQHjIECAAQHjIECAAQHjIECAAQHjIGCAAQCBAeMgYIABAIEB4yBggAEAgQHlD5A1i_C2DUEGgAcAB4AIABvQGIAa0FkgEDMC41mAEAoAEBqgELZ3dzLXdpei1pbWfAAQE&sclient=img&ei=DeOxZZWjLMi81e8Pgc64kAI&bih=916&biw=1413#imgrc=fgDwdXHzEgTsgM](https://www.google.com/search?q=alexnet+architecture&tbm=isch&ved=2ahUKEwjV3cC22feDAxVIXvUHHQEnDiIQ2-cCegQIABAA&oq=alexNet+ar&gs_lcp=CgNpbWcQARgAMgUIABCABDIECAAQHjIECAAQHjIECAAQHjIECAAQHjIECAAQHjIECAAQHjIGCAAQCBAeMgYIABAIEB4yBggAEAgQHlD5A1i_C2DUEGgAcAB4AIABvQGIAa0FkgEDMC41mAEAoAEBqgELZ3dzLXdpei1pbWfAAQE&sclient=img&ei=DeOxZZWjLMi81e8Pgc64kAI&bih=916&biw=1413#imgrc=fgDwdXHzEgTsgM)
CNN은 커널이라는 것을 통해 이미지를 학습하는 방법이며, AlexNet은 CNN을 통해 이미지 데이터를 효과적으로 모델링하였니다. 아래 AlexNet의 코드를 보았을 대 Dropout, ReLU 와 같은 방법들이 사용된 것을 확인할 수 있습니다.
class **AlexNet**(nn.Module): def __init__(self): super(AlexNet, self).__init__() # Image input_size=(3, 227, 227) self.layers = nn.Sequential( # input_size=(96, 55, 55) nn.Conv2d(in_channels=3, out_channels=96, kernel_size=(11, 11), stride=4, padding=0), nn.ReLU(), # input_size=(96, 27, 27) nn.MaxPool2d(kernel_size=3, stride=2), # input_size=(256, 27, 27) nn.Conv2d(in_channels=96, out_channels=256, kernel_size=(5, 5), stride=1, padding=2), nn.ReLU(), # input_size=(256, 13, 13) nn.MaxPool2d(kernel_size=3, stride=2), # input_size=(384, 13, 13) nn.Conv2d(in_channels=256, out_channels=384, kernel_size=(3, 3), stride=1, padding=1), nn.ReLU(), # input_size=(384, 13, 13) nn.Conv2d(in_channels=384, out_channels=384, kernel_size=(3, 3), stride=1, padding=1), nn.ReLU(), # input_size=(256, 13, 13) nn.Conv2d(in_channels=384, out_channels=256, kernel_size=(3, 3), stride=1, padding=1), nn.ReLU(), # input_size=(256, 6, 6) nn.MaxPool2d(kernel_size=3, stride=2), ) **self.classifier = nn.Sequential( nn.Dropout(p=0.5), nn.Linear(in_features=256*6*6, out_features=4096), nn.ReLU(), nn.Dropout(p=0.5), nn.Linear(in_features=4096, out_features=4096), nn.ReLU(), nn.Linear(in_features=4096, out_features=1000), )** def forward(self, x): x = self.layers(x) x = x.view(-1, 256*6*6) x = self.classifier(x) return x
아래 그림은 AlextNet과 유사한 LeNet-5 라는 모델을 통해 손글씨를 인식하는 것을 보여주고 있습니다. 커널을 통과한 이미지(피쳐맵)을 놓고 이것이 어떻게 해석될 수 있는지를 살펴보고 있습니다.
필터 커널을 통해 이미지의 정보를 추상화 합니다. 그리고 그렇게 관찰된 피처맵은 하나의 선형 connected 층으로 변환되고 그것은 선형변환과 활성화 함수를 거쳐 정해진 클래스 노드 수로 출력되도록 합니다. 그 중에 가장 높은 출력값을 가지는 노드의 인덱스가 모델의 최종 분류 숫자가 됩니다.
마지막 classifier 층은 앞서 MLP 에서 살펴봤던 것처럼 가중치들과 은닉층 그리고 활성화함수가 복잡하게 얽히면서 비선형 함수를 만들어내고 곡선, 직선 과 같은 패턴들을 감지하는 역할을 수행합니다.
출처 : https://m.blog.naver.com/intelliz/221710683250
이렇게 해서 딥러닝의 초창기 모델인 퍼셉트론부터 AlexNet 까지 살펴보았습니다.

마치며

현대 딥러닝 모델은 완전히 바닥부터 가중치를 초기화하고 학습하지는 않습니다. 굉장히 많은 데이터로 잘 훈련된 사전 학습 모델(Pretrained Model)을 미세 조정(FineTuning) 하는 방식들을 많이 사용합니다.
나아가 최근에는 프롬프트를 잘 설계하는 LLM의 능력을 끌어올리는 프롬프트 엔지니어링과 같은 방법은 미세 조정 방법을 대체하려 하고 있습니다. OpenAI 의 GPTs 와 같은 서비스들이 대표적인 예시라고 할 수 있습니다.
하지만 딥러닝의 기본 원리를 파악하는 것은 여전히 중요하다고 할 수 있습니다. GPT 조차 이러한 backpropagation 을 기반으로 학습되었기 때문입니다.
마지막으로 아래 그림은 딥러닝의 발전 과정에서 큰 것들만 표시를 해 둔 것입니다. 퍼셉트론 부터 MLP, CNN, RNN, Transformer, LM, LLM 으로 이어지는 큰 흐름들이 있습니다. 이런 흐름을 기반으로 하여 딥러닝에 대한 지식을 쌓아나가는 것도 좋은 방법이라고 생각합니다.
퍼셉트론부터 GPT까지

참고 자료

Kp
Subscribe to 'KPMG Lighthouse'
Subscribe to my site to be the first to receive notifications and emails about the latest updates, including new posts.
Join Slashpage and subscribe to 'KPMG Lighthouse'!
Subscribe
👍🏻
1
😀
1
😘
1
🤭
1
😍
1