
책의 1장까지의 내용입니다.
책의 1장의 내용은 딥러닝이란 무엇인가? 에 집중한 내용이었습니다.
목차 이름에서부터 느껴지듯 '딥러닝에서 '딥이란 무엇일까?', '단기적 과대 선전에 주의해주세요', 'AI 에 대한 전망' 등 본격적인 딥러닝 설명에 앞서 딥러닝에 대해 어떤 관점으로 설명해주실것이며, 읽는 독자는 어떤 자세와 생각가짐을 가지고 보면 좋을지 충분히 마음을 다듬는 시간을 주는 듯한 내용이었습니다. 그렇기에 1950년대 초기 컴퓨터 과학 분야에 대한 이야기부터, 구글 딥마인드, 그리고 오늘날 AI 붐이 오기 전까지 있었던 AI 씬의 2번의 겨울 이야기까지의 역사 흐름속에 작가님의 생각을 담아 이야기를 해주십니다.
1장에서는 첫 페이지에서 부터 강렬한 문장이 있었는데요. 바로 아래의 문장입니다.
이 책을 읽고 나면 여러분은 AI 에이전트를 개발할 수 있는 사람들 중 하나가 될겁니다. "딥러닝이 지금까지 거둔 성과는 무엇인가요? 얼마나 중요한가요? 어디를 향해 가고 있나요? 과장된 선전을 믿어도 될까요?" 에 대한 답을 찾아 보겠습니다.
개발자로 일을 해오면서도 짐작가지 않고, AI 에 관해서는 막연해지곤 했었습니다. 하지만 개발자로 일해온 저의 탓일까요, IT 와는 거리가 먼 지인들로부터 위와 같은 질문을 종종 받기도 했습니다. 하지만 이런 질문은 스스로도 많이 던지는 질문이자, 답을 얻지 못한 질문들이었습니다. 스스로만의 답이라도 내기 위해, AI 관련된 SNS 및 도서, 강의, 강습을 찾아 수강해보기도 하고, 주변의 AI 를 잘 활용하는 분들께 커피챗을 요청 드리며 나름의 꿀팁을 듣기도 했습니다. 하지만 여전히 큰 벽 앞에 가로막혀 있는 기분이었습니다. 하지만 위 문장을 읽는 순간, 사실 AI 가 아니더라도, 어떠한 고난과 역경을 잘 헤쳐 나가기위해서는, 상대방에 대한 기초적인 지식과 이해가 수반되었어야했다는 간단한 사실을 다시 한번 되새김할 수 있었던 것 같습니다.
저는 수포자입니다. 그렇기에 이 책을 통해 얼마나 많은 내용을 담아 갈 수 있을지, 그리고 작가님께서 말씀해주시는 내용을 얼마나 이해하고 체득할 수 있을지는 모르겠습니다. 다만, 첫 페이지에서 부터 이야기해주신 내용은 충분히 와닿아 책을 읽은 태도가 고쳐졌습니다.
그리고 1장의 내용은, "컴퓨터가 '생각'할 수 있는가?", "AI는 보통의 사람이 수행하는 지능적인 작업을 자동화하기 위한 연구활동이다" 등과 같은 이야기로 최초의 AI 활동에 대한 이야기를 풀어 나갑니다. 그중 하나의 일화로써, 에이다 러브레이스(Ada Lovelace) 의 이야기를 이야기하는데요.
해석 기관이 무언가를 새롭게 고안해 내는 것은 아닙니다. 우리가 어떤 것을 작동시키기 위해 어떻게 명령할지 알고 잇다면 이 장치는 무엇이든 할 수 있습니다. ...... 이런 능력은 우리가 이미 알고 있는 것을 유용하게 사용할 수 있도록 도와줄 것입니다.
AI라는 단어를, 혹은 우리가 발전 가능성이 무궁무진하다고 느끼는 AI를 정말 옳게 바라보게 만들어주는 문장이라고 생각했습니다. 이 이후로부터,
이 분야를 처음 접한 사람은 생성형 AI의 실용적인 성공이 AGI 임박에 대한 믿음을 낳았다고 생각하기 쉽습니다. 하지만 실제로는 그 반대입니다. ...... 따라서 다소 역설적으로 생성형 AI의 부상을 촉발한 것은 근 미래의 AGI에 대한 믿음이었지 그 반대가 아니었습니다.
이름과 다르게 오늘날의 '인공지능(artificial intelligence)'은 '인지 자동화(cognitive automation)'로 기술하는 것이더 정확합니다. 즉, 인간의 기술과 지식을 인코딩하고 작동시키는 것입니다. AI는 특정한 요구 사항을 가진 문제나 정확한 샘플이 충분히 있는 문제를 해결하는데 뛰어납니다. 즉, 인간의 마음을 모사하는 것이 아니라 컴퓨터의 능력을 강화하는 기술입니다.
대규모 언어 모델이 질문을 받았을 때 충분히 사람처럼 들리는 답변을 할 수 있다면 이 모델이 진정한 인지적 자율서을 가지고 있는지 여부가 중요하지 않은 것 아닌가요? 하지만 핵심적인 차이는 적응력입니다. 지능은 알려지지 않은 것에 직면했을 때 적응하며 그로부터 학습하는 능력입니다.
와도 같은 주제로 많은 문장을 전달해주심르로써, 그동안 정말 많은 인사이트를 보고 들으면서 정리되지 않았던 머리 속의 내용과 제가 다른 사람들에게 설명하고 답변해주고 싶었던 내용을 보아 큰 공감을 얻고 감동을 받아, 책에 대한 흥미가 가득한 채로 2장을 시작했습니다.
여기서부터 2장의 내용입니다.
넘파이(NumPy) 배열(ndarray)은 파이썬에서 수치 데이터를 효율적으로 처리하기 위한 N차원 배열 객체입니다.
- 동일한 데이터 타입: 리스트와 달리 모든 원소가 같은 자료형(dtype)을 가져야 합니다.
- 연속된 메모리 배치: 데이터를 메모리에 연속으로 저장해 빠른 연산 성능을 제공합니다.
- 벡터화 연산: 반복문 없이 전체 데이터에 대한 사칙연산과 수학 함수 적용이 가능합니다.
- 다차원 구조: 1차원(벡터), 2차원(행렬), 3차원 이상의 데이터를 자유롭게 다룹니다.
👉🏻 넘파이는 매우 인기가 많은 수치 계산 파이썬 라이브러리입니다. 머신러닝 분야에서 이를 자주 접하게 될 것입니다. 넘파이는 GPU와 자동 미분(atodifferentiation)을 지원하지 않기 때문에 현대적인 머신러닝 알고리즘을 구현하는데는 거의 사용되지 않습니다. 하지만 여기에서 MNIST 숫자 데이터와 레이블이 넘파이 배열로 제공되는 것처럼 수치 데이터 포맷으로 종종 사용됩니다.
신경망의 핵심 구성 요소는 층 입니다.
2.2.1 스칼라(랭크-0 텐서)
스칼라는 숫자 딱 하나를 담고 있는 가장 단순한 텐서입니다.
ELI5 방식으로 설명하면, 스칼라는 사과의 개수를 숫자 하나로 표현하는 것과 같습니다.
왜 0차원이라고 부를까요? 🤔
여기서 가장 헷갈리는 부분은 0차원이라고 해서 숫자가 0이라는 뜻은 아니라는 것입니다.
차원은 숫자의 개수가 아니라, 데이터를 표현하기 위해 필요한 축의 개수입니다.

스칼라 5는 숫자 하나를 바로 알 수 있기 때문에 가로축이나 세로축이 필요하지 않습니다.
따라서 랭크(Rank)가 0인 텐서라고 부릅니다.
딥러닝에서 스칼라는 다음과 같은 곳에 자주 등장합니다.
-
학습률(Learning Rate): 0.001 - AI가 한 번에 얼마나 학습할지 조절하는 숫자
-
손실값(Loss): 0.25 - AI의 예측이 얼마나 틀렸는지 나타내는 숫자
-
예측 확률: 0.95 - 특정 결과일 것으로 예측한 확률
한줄 요약: 스칼라는 숫자 하나를 나타내는 0차원 텐서입니다. 딥러닝에서는 학습률, 손실값, 예측 확률처럼 하나의 수치로 표현할 수 있는 정보를 다룰 때 사용합니다.
2.2.2 벡터(랭크-1 텐서)
딥러닝에서 벡터(Vector)와 텐서(Tensor)의 가장 큰 차이는 데이터를 표현하는 차원(Dimension) 입니다.

import torch
# 벡터 = 1차원 텐서
vector = torch.tensor([1, 2, 3])
# 행렬 = 2차원 텐서
matrix = torch.tensor([
[1, 2, 3],
[4, 5, 6]
])
print(vector.shape) # torch.Size([3])
print(matrix.shape) # torch.Size([2, 3])
torch.tensor()는 벡터와 행렬을 모두 만들 수 있습니다. 차이는 숫자를 몇 개의 축으로 배치했는지입니다.
그렇기에 아래의 예시도,
가로 3개, 세로 3개로 이루어진 행렬이므로 2차원 텐서입니다. Shape은 (3, 3)입니다.
data = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
한 줄 요약: 벡터는 숫자를 한 줄로 담은 1차원 텐서이고, 텐서는 딥러닝에서 숫자를 여러 차원으로 담고 계산하는 데 사용하는 더 넓은 개념입니다.
2.2.3 행렬(랭크-2 텐서)
행렬은 숫자를 가로와 세로로 정리한 표입니다.
학생 3명의 국어, 영어, 수학 점수가 있다고 가정하겠습니다.

이 성적표에서 숫자만 가져오면 다음과 같은 행렬이 됩니다.
여기서 중요한 개념은 두 가지입니다.
-
행(Row): 가로 방향으로 나열된 숫자들 (학생별 점수)
-
열(Column): 세로 방향으로 나열된 숫자들 (과목별 점수)
따라서 이 행렬의 모양(Shape)은 (3, 3)입니다.
왜 랭크-2 텐서라고 부를까요? 🤔
행렬은 데이터를 찾기 위해 두 개의 위치 정보가 필요합니다.
예를 들어 영희의 영어 점수 95를 찾으려면 다음 두 가지를 알아야 합니다.
-
몇 번째 행인가? → 2번째 행
-
몇 번째 열인가? → 2번째 열
즉, 행과 열이라는 두 개의 축(Axis)이 있기 때문에 랭크가 2입니다.

한줄 정리: 행렬은 숫자를 행과 열로 배치한 랭크-2 텐서입니다. 딥러닝에서는 여러 입력 데이터를 한꺼번에 처리하거나 신경망의 가중치를 계산할 때 사용합니다.
2.2.4 랭크-3 이상의 텐서
여러 개의 행렬(랭크-2 텐서)을 하나로 쌓으면 랭크-3 텐서가 되며, 숫자가 채워진 직육면체 형태로 생각할 수 있습니다. 이처럼 텐서를 여러 개 쌓을수록 랭크가 증가합니다.
- 랭크-0: 스칼라 (숫자 하나)
-
랭크-1: 벡터 (숫자의 나열)
-
랭크-2: 행렬 (2차원 표)
-
랭크-3: 여러 행렬을 쌓은 형태 (3차원)
-
랭크-4: 여러 랭크-3 텐서를 묶은 형태 (4차원)
-
랭크-5: 여러 랭크-4 텐서를 묶은 형태 (5차원)
한줄 요약: 텐서의 랭크는 데이터의 차원(축)의 개수를 의미하며, 딥러닝에서는 주로 랭크-0~4를 사용하고 동영상 처리에서는 랭크-5까지 사용합니다.
2.2.5 핵심 속성

텐서는 3개의 핵심 속성으로 정의 됩니다.
- 축의 개수(랭크): 숫자가 몇 차원으로 배열되어 있는가?
- 크기(Shape): 각 차원에는 숫자가 몇 개씩 있는가?
- 데이터 타입(파이썬 라이브러리에서는 보통 dtype이라고 부릅니다): 숫자를 어떤 자료형으로 저장하는가?
이 세 가지를 이해하면 딥러닝에서 텐서의 구조를 읽을 수 있고, 앞으로 배우게 될 행렬 연산, 신경망 입력 데이터, 모델 가중치의 형태도 훨씬 쉽게 이해할 수 있습니다.
딥러닝에서 텐서(Tensor)는 숫자를 담는 다차원 데이터 구조입니다. 그렇다면 인공지능은 이 숫자들을 어떻게 계산하고 학습할까요?
바로 텐서 연산(Tensor Operations) 을 사용합니다.
텐서 연산은 크게 다음 6가지 개념으로 이해할 수 있습니다.
-
원소별 연산: 같은 위치의 숫자끼리 계산하기
-
브로드캐스팅: 작은 텐서를 큰 텐서에 맞춰 계산하기
-
텐서 곱셈: 여러 숫자를 조합하여 새로운 값 만들기
-
텐서 크기 변환: 숫자는 유지하면서 배열 형태 바꾸기
-
텐서 연산의 기하학적 해석: 숫자 계산을 공간의 움직임으로 이해하기
-
딥러닝의 기하학적 해석: 데이터를 변형해 정답을 쉽게 구분하기
1. 원소별 연산(Element-wise Operations)
원소별 연산은 같은 위치에 있는 숫자끼리 계산하는 방법입니다.
사과가 들어 있는 상자 두 개를 생각해 보겠습니다.
첫 번째 상자에는 [1, 2, 3]개의 사과가 있고, 두 번째 상자에는 [4, 5, 6]개의 사과가 있습니다.
같은 위치의 사과 개수를 더하면 다음과 같습니다.

덧셈뿐 아니라 뺄셈, 곱셈, 나눗셈도 가능합니다.
import torch
a = torch.tensor([1, 2, 3])
b = torch.tensor([4, 5, 6])
print(a + b) # tensor([5, 7, 9])
print(a * b) # tensor([4, 10, 18])
여기서 a * b는 행렬 곱셈이 아니라 같은 위치의 숫자끼리 곱하는 원소별 곱셈입니다. 딥러닝 활용으로는, 신경망에서 가중치를 적용하거나 활성화 함수를 계산하는 등 다양한 연산에 사용합니다.
2. 브로드캐스팅(Broadcasting)
브로드캐스팅은 작은 텐서를 큰 텐서에 맞춰 자동으로 계산하는 기능입니다.
학생 3명의 시험 점수가 있다고 가정하겠습니다.
[70, 80, 90]
모든 학생에게 보너스 점수 10점을 주고 싶다면 어떻게 할까요?

scores = torch.tensor([70, 80, 90])
result = scores + 10
print(result)
# tensor([80, 90, 100])
파이썬에서 직접 반복문을 작성하지 않아도 모든 원소에 10이 더해집니다.
브로드캐스팅의 규칙, 모든 텐서가 무조건 브로드캐스팅되는 것은 아닙니다.
각 차원의 크기를 오른쪽부터 비교했을 때, 크기가 같거나 둘 중 하나가 1이면 해당 차원에서 브로드캐스팅할 수 있습니다. 부족한 앞쪽 차원은 크기가 1인 것으로 취급합니다.

3. 텐서 곱셈(Tensor Multiplication)
텐서 곱셈은 숫자를 서로 조합해 새로운 값을 만드는 연산입니다.
딥러닝에서는 특히 행렬 곱셈(Matrix Multiplication) 이 중요합니다.
예를 들어 과일 가격을 계산한다고 가정하겠습니다.
-
사과 2개, 개당 1,000원
-
바나나 3개, 개당 500원
전체 가격은 다음과 같습니다.
quantity = torch.tensor([2., 3.])
price = torch.tensor([1000., 500.])
result = torch.dot(quantity, price)
print(result)
# tensor(3500.)
행렬 곱셈과 다른점은, 행렬 곱셈은 왼쪽 행렬의 행과 오른쪽 행렬의 열을 내적하는 연산이라는 점입니다.

첫 번째 결과인 19는 1×5 + 2×7로 계산됩니다.
행렬 곱셈이 가능하려면 왼쪽 행렬의 열 개수와 오른쪽 행렬의 행 개수가 같아야 합니다.
4. 텐서 크기 변환(Tensor Reshaping)
텐서 크기 변환은 숫자 자체는 바꾸지 않고 배열 형태만 변경하는 것입니다.
계란 6개를 담는 상자를 생각해 보겠습니다.

a = torch.tensor([
[1, 2, 3],
[4, 5, 6]
])
b = a.reshape(3, 2)
print(b)
# tensor([[1, 2],
# [3, 4],
# [5, 6]])
원소 개수는 6개로 동일하지만 Shape은 (2, 3)에서 (3, 2)로 변경되었습니다.
단, reshape()에서는 변환 전후의 전체 원소 개수가 같아야 합니다. 딥러닝 활용으로는, 이미지 데이터를 신경망에 입력하기 위해 펼치거나, 모델이 요구하는 형태로 차원을 변경할 때 사용합니다.
5. 텐서 연산의 기하학적 해석
지금까지는 텐서를 숫자로 계산했습니다. 하지만 텐서 연산은 공간에서 점이나 도형을 움직이는 것으로도 이해할 수 있습니다.
예를 들어 2차원 벡터 (2, 1)은 좌표평면 위의 화살표로 표현할 수 있습니다.텐서 연산은 단순히 숫자를 계산하는 것이 아니라, 공간에 있는 점이나 도형을 이동하거나 변형하는 과정으로 이해할 수 있습니다.
예를 들어 종이에 삼각형을 그렸다고 생각해 보겠습니다.
텐서 연산을 이용하면 이 삼각형을 이동시키거나, 회전시키거나, 크기를 변경할 수 있습니다.
① 이동(Translation)
모든 점에 동일한 벡터를 더하면 도형 전체가 이동합니다.
예를 들어 (1, 1)에 (2, 1)을 더하면 (3, 2)가 됩니다.

② 크기 변경(Scaling)
벡터에 2를 곱하면 원점에서의 거리가 2배로 늘어납니다.

③ 회전(Rotation)
회전 행렬을 곱하면 점이나 도형을 특정 각도만큼 회전시킬 수 있습니다.
예를 들어 (2, 1)을 원점을 중심으로 반시계 방향으로 90도 회전하면 (-1, 2)가 됩니다.



이처럼 텐서 연산은 공간에서 데이터를 이동, 확대, 축소, 회전, 기울이기 등의 형태로 변환하는 데 활용됩니다.
다만 모든 텐서 연산이 기하학적 변환인 것은 아닙니다. 여기서는 특히 벡터와 행렬 연산을 공간의 변형으로 해석한 것입니다.
6. 딥러닝의 기하학적 해석(Geometric Interpretation of Deep Learning)
앞서 텐서 연산이 공간의 점이나 도형을 변형할 수 있다는 것을 배웠습니다.
그렇다면 딥러닝에서는 왜 이러한 변형이 필요할까요?
핵심은 복잡하게 섞여 있는 데이터를 구분하기 쉬운 형태로 바꾸기 위해서입니다.
① 고양이와 강아지를 구분하는 AI
고양이와 강아지의 특징을 숫자로 표현한다고 가정하겠습니다.
-
X축: 귀의 뾰족한 정도
-
Y축: 얼굴의 둥근 정도
각 동물은 두 특징에 따라 좌표평면의 한 점으로 표현할 수 있습니다.
그런데 두 동물의 특징이 비슷하다면 고양이와 강아지의 데이터가 서로 섞여 있을 수 있습니다.

왼쪽은 고양이와 강아지의 특징이 서로 섞여 있는 상태입니다.
오른쪽은 신경망이 데이터를 새로운 특징 공간으로 변환해 두 종류를 구분하기 쉬워진 상태입니다.
이러한 변환을 통해 AI는 복잡한 데이터 속에서 패턴을 학습합니다.
딥러닝에서 인공지능은 처음부터 정답을 알고 있지 않습니다. 수많은 예측과 실수를 반복하면서 점점 정답에 가까워지도록 학습합니다.
그렇다면 AI는 자신이 얼마나 틀렸는지, 그리고 무엇을 수정해야 하는지 어떻게 알 수 있을까요?
바로 그레이디언트 기반 최적화(Gradient-Based Optimization) 를 사용합니다.
이번 글에서는 딥러닝 학습의 핵심인 네 가지 개념을 쉽게 정리하겠습니다.
-
도함수(Derivative): 어느 방향으로 움직여야 하는지 알려주는 기울기
-
그레이디언트(Gradient): 여러 변수의 기울기를 모아 놓은 것
-
확률적 경사 하강법(SGD): 기울기를 이용해 오차를 줄이는 방법
-
역전파(Backpropagation): 계산을 거꾸로 따라가며 각 가중치의 기울기를 구하는 알고리즘
1. 도함수(Derivative): 기울기를 알려주는 도구
도함수는 어떤 숫자를 조금 변경했을 때 결과가 얼마나 변하는지 알려주는 수학적 도구입니다.
⛰️ 산을 내려가는 사람으로 이해하기
눈을 감고 산 위에 서 있다고 상상해 보겠습니다.
목표는 산에서 가장 낮은 지점으로 내려가는 것입니다.
이때 발밑의 경사가 어느 방향으로 기울어져 있는지 알 수 있다면 내려갈 방향을 정하기 쉬워집니다.

도함수의 부호를 보면 현재 위치에서 어느 방향으로 이동해야 값이 작아지는지 알 수 있습니다.
2. 그레이디언트(Gradient): 여러 방향의 기울기
도함수가 하나의 변수에 대한 변화율이라면, 그레이디언트는 여러 변수에 대한 편도함수를 모은 벡터입니다.
🤔 산에 여러 갈림길이 있다고 생각해 보세요
앞에서는 왼쪽과 오른쪽으로만 이동할 수 있었습니다.
하지만 실제 산에서는 앞뒤, 좌우 등 여러 방향으로 움직일 수 있습니다.
딥러닝도 마찬가지입니다.
신경망에는 수많은 가중치가 존재하기 때문에 각각을 어떻게 변경해야 하는지 알아야 합니다.
예를 들어 손실 함수가 다음과 같다고 가정하겠습니다.

이때 그레이디언트는 다음과 같습니다.

현재 위치가 (3, 2)라면 다음과 같습니다.

이는 x 방향으로는 6, y 방향으로는 4의 변화율을 가진다는 뜻입니다.

그레이디언트는 손실이 가장 빠르게 증가하는 방향을 가리킵니다.
따라서 손실을 줄이려면 그레이디언트의 반대 방향으로 이동하면 됩니다.
3. 확률적 경사 하강법(SGD): 조금씩 정답에 가까워지는 방법
확률적 경사 하강법(Stochastic Gradient Descent)은 그레이디언트를 이용해 손실이 작아지는 방향으로 가중치를 반복 수정하는 최적화 알고리즘입니다.
🏀 공을 굴려 산 아래로 내려보내기
산 위에서 공을 굴린다고 생각해 보겠습니다.
공은 경사가 낮아지는 방향으로 움직입니다.
AI도 비슷하게 현재 위치에서 기울기를 확인하고 조금씩 이동합니다.



4. 역전파(Backpropagation):실수의 원인을 거꾸로 추적하기
역전파는 AI가 예측한 결과에서 발생한 오차를 바탕으로, 각 가중치가 오차에 얼마나 영향을 미쳤는지 거꾸로 계산하는 알고리즘입니다.
쉽게 말하면, 시험에서 틀린 문제를 확인하고 어떤 공부가 부족했는지 역으로 찾아가는 과정과 비슷합니다.
순전파와 역전파의 차이에 대해 설명하겠습니다, AI가 고양이 사진을 보고 고양이인지 예측한다고 가정하겠습니다.


5. 그레이디언트 기반 최적화 전체 과정
지금까지 배운 개념을 하나로 연결하면 다음과 같습니다.

6. 마무리 요약
| 개념 | 핵심 역할 | 쉽게 기억하기 |
| 도함수 | 하나의 변수에 대한 변화율 계산 | 경사 확인하기 |
| 그레이디언트 | 여러 변수에 대한 기울기 계산 | 모든 방향의 경사 확인하기 |
| SGD | 기울기를 이용해 가중치 수정 | 산 아래로 한 걸음씩 이동하기 |
| 역전파 | 연쇄 법칙으로 가중치별 기울기 계산 | 실수의 원인을 거꾸로 추적하기 |