Загружаем каталог…
Загружаем каталог…
반 전체의 과목별 점수를 표로 정리해 본 적 있나요? 그 표가 바로 행렬 입니다. 📋 딥러닝 코드를 읽다 보면 shape mismatch 에러를 정말 자주 만나는데, 그 대부분은 "이 행렬이 몇 행 몇 열인가" 를 확인하는 습관 하나로 막을 수 있어요. 이번 글에서는 행렬의 shape , 행렬 곱셈의 패턴( 행과 열을 짝지어 내적 ), 그리고 행렬에는 왜 나눗셈 대신 역행렬 이 필요한지를 정리합니다. 📘 이 글은 위키독스 도서 Zero to 머신러닝 딥러닝 Master 의 00-02 행렬 — 성적표는 곧 행렬이다 을 블로그용으로 다듬은 글입니다. 💻 실습 코드: GitHub · 🏠 mldict.net · ✍️ 기술 블로그 💻 이 글의 코드: 00-02-matrices-report-card · Open in Colab — 핵심 코드와 실제 실행 결과는 글 아래 💻 GitHub 실습 섹션에 있습니다. ⬅️ 이전 글: #02 벡터란? 장바구니로 이해하는 벡터·내적·코사인 유사도 (파이썬 NumPy 실습) ➡️ 다음 글: #04 최소제곱법과 정규방정식 — 선형회귀가 머신러닝의 첫 모델인 이유 (파이썬 NumPy) TL;DR — 3줄 요약 행렬의 크기는 행 → 열 순서("3×2" = 3행 2열)로 읽고, 코드에서는 .shape 로 가장 먼저 확인합니다. 행렬 곱셈은 앞 행렬의 행 × 뒤 행렬의 열의 내적 을 반복하는 연산입니다. 그래서 안쪽 차원이 같아야 해요. 행렬에는 나눗셈이 없어서, $Ax=b$를 풀 때는 역행렬 $A^{-1}$을 곱합니다. 00-02-D 📏 행렬의 크기(shape) 표현하기 — "몇 행 몇 열인가요?" 사람을 소개할 때 키와 몸무게를 말하듯이, 행렬을 소개할 때는 "가로로 몇 줄, 세로로 몇 줄인가"를 먼저 말합니다. 이 "행렬의 몸집"을 크기(size) 또는 모양(shape)이라고 부릅니다. 앞으로 행렬을 다룰 때마다 "이 행렬의 shape가 뭐지?"를 가장 먼저 확인하게 될 텐데, 그 이유는 뒤에서 배울 덧셈·곱셈이 전부 이 크기가 맞느냐 안 맞느냐로 가능 여부가 갈리기 때문입니다. 🔑 앞서 만든 성적표 행렬을 다시 봅시다. 가로로 3줄(학생 철수·영희·민수), 세로로 3줄(수학·영어·과학)이 있었습니다. 이런 행렬을 "3행 3열 행렬" , 줄여서 "3×3 행렬"이라고 부릅니다. 읽을 때는 "삼 바이 삼(3 by 3)"이라고 읽습니다. 🎯 절대 잊으면 안 되는 약속 — 행이 먼저! 행(가로)의 개수를 먼저 쓰고, 열(세로)의 개수를 나중에 씁니다. "3×2"라고 쓰면 "행이 3개, 열이 2개"라는 뜻이지, 그 반대가 아닙니다. 이 순서를 뒤집어 부르면 완전히 다른 행렬을 가리키게 되므로, 처음부터 확실히 몸에 익혀두어야 합니다. 💜 더 쉽게 이해하기 — "행렬"이라는 이름 자체가 힌트 외우기 어렵다면, "행렬(行列)"이라는 단어를 그대로 읽어보세요. 한자 행(行, 가로)이 먼저 나오고 열(列, 세로)이 뒤에 나옵니다. 크기를 쓰는 순서도 똑같이 행 → 열 입니다. 영어로도 R ow → C olumn, 알파벳 순서 그대로라 "알씨(RC)" 순서라고 기억하면 편합니다. 🗂️ 이제 처음 예시를 정확히 정리해봅시다. 학생이 4명 이고 과목이 2개 라면, 행(학생)이 4개, 열(과목)이 2개이므로 이 행렬의 크기는 4×2 입니다. 순서를 헷갈려 "2×4"라고 쓰면 "학생 2명, 과목 4개"라는 전혀 다른 표를 가리키게 됩니다. 숫자 두 개는 같아 보여도 순서가 의미를 완전히 바꿔버립니다. 🔄 🧩 크기에 따라 특별한 이름이 붙는 행렬들 크기 이름 설명 n×n 정사각행렬 행과 열의 개수가 같은 "정사각형" 행렬 (단위행렬·역행렬이 여기서 등장) 1×n 행벡터 한 줄짜리 가로 벡터 — 00-01장에서 본 벡터의 정체 m×1 열벡터 한 칸짜리 세로 벡터 — 장바구니 예시의 "가격표"가 이것 1×1 스칼라 숫자 하나 — 우리가 평소에 쓰는 그냥 "수" 🔬 수학적 표기 — $\mathbb{R}^{m\times n}$ 수학책에서는 "$A$는 $m$행 $n$열의 실수 행렬"이라는 말을 다음과 같이 짧게 씁니다. $$ A \in \mathbb{R}^{m \times n} $$ 여기서 $\mathbb{R}$은 실수(real number) 전체를 뜻하고, 오른쪽 위의 $m \times n$이 바로 크기입니다. 이 표기 하나에 "이 행렬은 실수로 채워져 있고, 행이 $m$개, 열이 $n$개다"라는 정보가 모두 담겨 있습니다. 논문이나 교재에서 아주 자주 보게 될 표기이니 눈에 익혀두세요. 👀 🐍 Python import numpy as np # 학생 4명 × 과목 2개 → 4행 2열(4×2) 행렬 scores = np.array([ [85, 90], # 철수 [92, 88], # 영희 [70, 85], # 민수 [60, 75] # 지수 ]) print("shape(행, 열):", scores.shape) # (4, 2) → 행 먼저, 열 나중 print("차원 수(ndim) :", scores.ndim) # 2 (행렬은 2차원) print("전체 원소 수 :", scores.size) # 8 (=4×2) 🔗 GitHub에서 코드 보기 — 00_02_matrices_report_card.py L12–L24 ✅ Output shape(행, 열): (4, 2) 차원 수(ndim) : 2 전체 원소 수 : 8 .shape 가 돌려주는 (4, 2) 는 튜플이고, 항상 (행, 열) 순서 입니다. 우리가 손으로 "4행 2열"이라고 셌던 것과 정확히 같습니다. 🎉 🐞 실수하기 쉬운 부분 — 엑셀 셀 주소와 헷갈리지 마세요 엑셀에서 셀 주소 B3 은 열(B)을 먼저, 행(3)을 나중에 씁니다. 즉 엑셀은 행렬 수학과 정반대 순서 입니다. 그래서 엑셀에 익숙한 사람일수록 "열-행" 순서로 착각하기 쉽습니다. 수학·NumPy에서는 무조건 행이 먼저 라는 점을 별도로 각인해두세요. ⚠️ 00-02-E 🌍 우리 주변의 행렬들 — "세상은 표로 가득 차 있다" 행렬을 "성적표"라는 딱딱한 수학 개념으로만 생각하면 금방 지루해집니다. 하지만 일단 "행과 열로 정리된 숫자 표"라는 눈으로 세상을 보기 시작하면, 우리 주변이 온통 행렬 투성이라는 사실이 보입니다. 사실 컴퓨터와 AI가 세상을 이해하는 거의 유일한 방법이 "모든 것을 행렬(숫자 표)로 바꾸는 것"입니다 . 몇 가지 예를 자세히 들여다봅시다. 🔍 💜 더 쉽게 이해하기 — 사물함 비유 학교 복도의 사물함 🗄️을 떠올려보세요. 사물함은 여러 층·여러 칸으로 반듯하게 나뉘어 있고, 각 칸에는 물건이 하나씩 들어 있습니다. "몇 층 몇 번째 칸"만 말하면 원하는 물건을 정확히 찾을 수 있죠. 행렬도 똑같습니다. "몇 행 몇 열"이라는 주소만 있으면 그 칸의 숫자를 콕 집어 꺼낼 수 있습니다. 세상의 수많은 데이터가 이 "반듯한 사물함" 구조에 딱 들어맞습니다. 📊 엑셀 스프레드시트 : 우리가 매일 보는 그 표가 바로 행렬입니다. 첫 행에 항목 이름, 왼쪽 열에 이름표를 붙이고 나면, 안쪽의 숫자들이 통째로 하나의 행렬입니다. 회사의 월별 매출표, 가계부, 반 친구들 연락처 — 전부 행렬이라고 부를 수 있습니다. 🖼️ 디지털 사진 : 흑백 사진은 가로·세로로 픽셀이 촘촘히 박혀 있고, 각 픽셀은 "얼마나 밝은가"를 나타내는 0(검정)~255(흰색) 사이의 숫자 하나입니다. 그래서 가로 1000·세로 1000 픽셀의 흑백 사진은 그대로 1000×1000 행렬 입니다. 컬러 사진은 여기에 빨강·초록·파랑(RGB) 세 장이 겹쳐 있어서 행렬 세 개, 즉 3차원 "텐서"가 됩니다 (텐서는 뒤에서 다룹니다). 🎬 영화 평점 데이터(추천 시스템) : 행에 사용자, 열에 영화를 두면, 각 칸에는 "그 사용자가 그 영화에 준 별점"이 들어갑니다. 넷플릭스·유튜브의 추천 알고리즘은 바로 이 거대한 (그리고 대부분 빈칸인) 행렬에서 "빈칸을 채워 넣는(=아직 안 본 영화의 예상 별점을 맞히는)" 문제를 풉니다. 🕸️ 친구 관계(그래프/SNS) : 행과 열에 똑같이 사람들을 나열하고, "A와 B가 친구면 1, 아니면 0"을 적으면 인접행렬(adjacency matrix)이 됩니다. SNS의 친구 추천, 지하철 환승 경로 계산이 이런 행렬 위에서 이루어집니다. 🔎 검색 엔진(문서-단어 행렬) : 행에 문서, 열에 단어를 두고 "그 문서에 그 단어가 몇 번 나왔는지"를 적으면, 검색 엔진이 문서의 내용을 이해하는 기초 행렬이 됩니다. 🧠 신경망의 가중치 : AI 모델 내부에는 수많은 행렬이 저장되어 있고, 이 행렬들의 숫자 하나하나가 AI의 "지식"에 해당합니다. AI가 학습한다는 것은 결국 이 행렬 속 숫자들을 조금씩 바꿔 나가는 과정입니다. (이 장의 마지막 절에서 다시 만납니다.) 📋 한눈에 보는 "행렬로 표현되는 데이터" 분야 행(가로) 열(세로) 각 칸의 의미 성적표 학생 과목 점수 흑백 사진 세로 픽셀 가로 픽셀 밝기(0~255) 추천 시스템 사용자 영화 별점 SNS 그래프 사람 사람 친구면 1, 아니면 0 검색 엔진 문서 단어 등장 횟수 "사진이 정말 숫자 표일까?" 5×5짜리 아주 작은 흑백 이미지를 행렬로 직접 만들어보면 실감이 납니다. 아래에서 255 는 흰색, 0 은 검정입니다. 숫자 배치가 화면의 밝기 패턴과 그대로 대응됩니다. 🖼️ 🐍 Python import numpy as np # 5×5 흑백 이미지 (255=흰색, 0=검정) — 가운데에 십자 모양이 그려진 그림 image = np.array([ [ 0, 0, 255, 0, 0], [ 0, 0, 255, 0, 0], [255, 255, 255, 255, 255], [ 0, 0, 255, 0, 0], [ 0, 0, 255, 0, 0] ]) print("이미지 크기(shape):", image.shape) # (5, 5) # 밝은 칸(255)은 ■, 어두운 칸(0)은 · 로 그려보기 for row in image: print("".join("■" if v > 127 else "·" for v in row)) 🔗 GitHub에서 코드 보기 — 00_02_matrices_report_card.py L28–L42 ✅ Output 이미지 크기(shape): (5, 5) ··■·· ··■·· ■■■■■ ··■·· ··■·· 숫자 255 가 있던 자리에 정확히 십자(+) 모양이 나타났습니다. 이미지가 곧 행렬 이라는 것을 눈으로 확인한 셈입니다. 나중에 배울 "이미지를 알아보는 AI(CNN)"는, 결국 이 숫자 행렬 위에서 계산을 하는 것입니다. 🎯 📌 핵심 : 사진이든, 평점이든, 관계망이든 — 세상의 데이터는 일단 행렬(숫자 표)로 바뀐 다음에야 컴퓨터와 AI의 계산 대상이 됩니다. 그래서 행렬은 "선택 과목"이 아니라 머신러닝의 공용 언어 입니다. 🗣️ 00-02-Q 🔁 패턴 정리 — "행과 열을 짝지어서 내적한다" 앞에서 2×2 행렬 곱셈을 하며 네 칸(1행1열, 1행2열, 2행1열, 2행2열)을 하나씩 채웠습니다. 그 네 번의 계산에는 완전히 똑같은 한 가지 패턴 이 반복되고 있었습니다. 그 패턴을 딱 한 문장으로 뽑아내면 행렬 곱셈의 전부를 손에 쥘 수 있습니다. 👀 ✨ 한 문장 요약 결과 행렬의 (i행, j열) 자리에 들어갈 숫자 = 왼쪽 행렬 A의 i번째 행과 오른쪽 행렬 B의 j번째 열을 짝지어 "내적"한 값 💜 잠깐 복습 — "내적"이 뭐였죠? (00-01 벡터) 내적은 "같은 자리끼리 곱해서, 그것을 전부 더하는" 연산이었습니다. 예를 들어 $(1,2)$와 $(5,7)$의 내적은 $1\times5 + 2\times7 = 19$입니다. 장바구니 예시에서 "개수 × 단가를 다 더해 총액을 구한 것"이 바로 내적이었죠. 🛒 행렬 곱셈은 이 내적을, "A의 각 행"과 "B의 각 열"의 모든 짝에 대해 반복하는 것뿐입니다. 🔬 수학적 의미 — 공식과 변수 정의 $$ C_{ij} = \sum_{k=1}^{n} A_{ik}, B_{kj} $$ 변수 정의 (기호를 하나씩 확실히 짚고 갑니다): • $A$ : 왼쪽 행렬, 크기 $m \times n$ • $B$ : 오른쪽 행렬, 크기 $n \times p$ • $C$ : 결과 행렬, 크기 $m \times p$ • $i$ : 결과에서 지금 채우려는 행 번호 ($1 \le i \le m$) • $j$ : 결과에서 지금 채우려는 열 번호 ($1 \le j \le p$) • $k$ : 짝지어 곱할 대상을 훑는 합의 인덱스 , $1$부터 $n$까지 • $n$ : 짝지을 대상의 개수 = A의 열 개수 = B의 행 개수 (이 둘이 같아야만 곱셈 가능) 공식 $\sum_{k=1}^{n} A_{ik} B_{kj}$를 말로 풀면 이렇습니다. "A의 i행을 왼쪽에서 오른쪽으로($A_{i1}, A_{i2}, \dots, A_{in}$), B의 j열을 위에서 아래로($B_{1j}, B_{2j}, \dots, B_{nj}$) 훑으면서, 같은 순번(k)끼리 곱해 전부 더한다." 이게 정확히 내적입니다. ✏️ 공식을 예시에 대입해보기. 앞의 $A=\begin{bmatrix}1&2\3&4\end{bmatrix}$, $B=\begin{bmatrix}5&6\7&8\end{bmatrix}$에서 결과의 (1행, 1열), 즉 $C_{11}$을 공식으로 구하면: ✅ Output i=1, j=1 이므로 A의 1행(1,2), B의 1열(5,7) C11 = Σ(k=1..2) A1k·Bk1 = A11·B11 + A12·B21 = 1 × 5 + 2 × 7 = 5 + 14 = 19 ✅ (손으로 계산했던 값과 일치!) 🧠 직관적 의미 — 왜 하필 "곱하고 더하기"일까? 내적은 결국 가중합(weighted sum)입니다 . B의 한 열이 "각 항목에 얼마씩 가중치를 줄지"를 정하는 규칙이라면, A의 한 행에 그 규칙을 적용해 "하나의 대표 숫자"로 요약하는 것이 내적입니다. 장바구니 예시에서 "각 과일 개수에 단가라는 가중치를 곱해 총액 하나로 요약"한 것과 똑같습니다. 이 "가중합으로 요약하기"가 뒤에서 배울 신경망의 뉴런 하나가 하는 일과 정확히 같습니다. 🔗 공식 $C_{ij}=\sum_k A_{ik}B_{kj}$를 삼중 반복문 으로 그대로 옮겨보면, NumPy의 @ 가 내부에서 무슨 일을 하는지 손에 잡힙니다. 💻 🐍 Python import numpy as np A = np.array([[1, 2], [3, 4]]) # (m=2, n=2) B = np.array([[5, 6], [7, 8]]) # (n=2, p=2) m, n = A.shape # A: m행 n열 n2, p = B.shape # B: n행 p열 assert n == n2, "내부 차원(n)이 안 맞으면 곱할 수 없음!" C = np.zeros((m, p)) # 결과는 m×p 크기 for i in range(m): # 결과의 행 for j in range(p): # 결과의 열 for k in range(n): # 짝지어 곱할 대상(합의 인덱스) C[i, j] += A[i, k] * B[k, j] # 곱해서 누적 = 내적 print("직접 구현한 결과:\n", C) print("NumPy @ 결과:\n", A @ B) 🔗 GitHub에서 코드 보기 — 00_02_matrices_report_card.py L46–L62 ✅ Output 직접 구현한 결과: [[19. 22.] [43. 50.]] NumPy @ 결과: [[19 22] [43 50]] 공식을 그대로 옮긴 삼중 루프의 결과와 @ 의 결과가 완전히 같습니다. 즉 @ 는 이 세 겹 반복을 (아주 빠르게) 대신 해주는 것뿐입니다. 실제로는 항상 @ 를 쓰지만, "속을 열어보면 이 공식"이라는 걸 아는 것과 모르는 것은 큰 차이입니다. 🔧 ⚖️ 프레임워크 관점 — 같은 공식, 다른 이름 개념 NumPy PyTorch TensorFlow JAX 행렬 곱 A @ B torch.matmul tf.matmul jnp.matmul 공식 그대로 (아인슈타인 표기) np.einsum('ik,kj->ij', A, B) einsum 은 네 프레임워크 모두 동일 문법으로 지원 특히 einsum('ik,kj->ij') 는 방금 배운 공식 $\sum_k A_{ik}B_{kj}$의 인덱스를 문자 그대로 적은 것입니다. 공식을 이해했다면 이 표기가 오히려 가장 직관적으로 보일 것입니다. 🧠 🐞 디버깅 포인트 — 내부 차원(n)이 생명 곱셈이 가능하려면 A의 열 개수와 B의 행 개수(둘 다 $n$)가 같아야 합니다. 안 맞으면 ValueError: ... not aligned 가 납니다. 곱하기 직전에 print(A.shape, B.shape) 로 안쪽 두 숫자 가 같은지 확인하는 습관을 들이세요. 예: (2, 3 ) @ ( 3 ,4) → OK, 결과는 (2,4). 00-02-Y 🤔 역행렬은 왜 필요할까? — "행렬에는 나눗셈이 없다" 역행렬($A^{-1}$)을 배웠지만, "그래서 이걸 어디에 쓰지?"라는 의문이 남습니다. 역행렬이 태어난 이유는 딱 하나, 행렬에는 "나눗셈"이라는 연산이 아예 없기 때문 입니다. 그런데 우리는 종종 나눗셈이 필요합니다. 그 필요를 대신 채워주는 것이 역행렬입니다. 🧩 가장 흔한 상황은 이런 식입니다. 어떤 값 $x$를 모르는데, "$x$에 $A$를 적용했더니 $b$가 나왔다"는 사실만 알고 있습니다. 수식으로는: $$ A x = b $$ 여기서 우리가 알고 싶은 건 "원래 $x$가 무엇이었나?"입니다 . 이건 사실 연립방정식 을 푸는 것과 같고, 현실에서는 "결과($b$)를 보고 원인($x$)을 거꾸로 알아내는" 아주 흔한 문제입니다. 예컨대 "여러 재료를 섞어 만든 음료의 성분($b$)을 보고, 원래 재료를 얼마씩 넣었는지($x$)를 역추적"하는 상황이죠. 🔎 💜 더 쉽게 이해하기 — "되돌리기(Undo)" 버튼 비유 역행렬은 컴퓨터의 Ctrl+Z(되돌리기) 🔙 같은 존재입니다. $A$가 "$x$에 어떤 변형을 가하는 작업"이라면, $A^{-1}$은 그 변형을 정확히 원상복구하는 작업 입니다. 자물쇠를 잠그는 열쇠($A$)가 있으면 여는 열쇠($A^{-1}$)가 있고, 둘을 이어서 쓰면 아무 일도 없던 것처럼($I$) 됩니다. 그래서 $A^{-1}A = I$인 것입니다. 일반 숫자였다면 $3x = 6$에서 양변을 3으로 나눠 $x = 2$를 구했을 겁니다. 하지만 행렬에는 나눗셈이 없으니, "나누기" 대신 "역행렬을 곱하기"를 씁니다. 🔬 공식 유도 — 단계별 출발: $$ A x = b $$ 1 양변의 왼쪽 에 $A^{-1}$을 곱합니다 (여기가 핵심!): $$ A^{-1}(A x) = A^{-1} b $$ 2 왼쪽에서 $A^{-1}A = I$ (역행렬 × 원래 행렬 = 단위행렬): $$ I x = A^{-1} b $$ 3 단위행렬 $I$는 곱해도 값이 변하지 않으므로 ($Ix = x$): $$ \boxed{,x = A^{-1} b,} $$ ⚠️ 왜 "왼쪽에" 곱해야 하나요? 행렬 곱셈은 순서를 바꾸면 결과가 달라진다는 것($AB \neq BA$)을 앞에서 배웠습니다. $Ax=b$에서 $A$는 $x$의 왼쪽 에 붙어 있으므로, 이를 떼어내려면 $A^{-1}$도 반드시 양변 모두 왼쪽 에 곱해야 합니다. 만약 오른쪽에 곱하면($xA^{-1}$) 위치가 안 맞아 $A^{-1}A$를 만들 수 없어 $x$를 분리할 수 없습니다. "붙어 있는 쪽과 같은 쪽에서 떼어낸다"고 기억하세요. 🔑 이렇게 역행렬을 이용하면 $Ax = b$ 형태의 방정식에서 $x = A^{-1}b$로 답을 구할 수 있습니다. 이 논리는 00-03장에서 연립방정식을 본격적으로 풀 때 그대로 다시 등장합니다. 🔁 ⚠️ 모든 행렬에 역행렬이 있는 것은 아닙니다. 일반 숫자에서 $0$의 역수 $\frac{1}{0}$이 정의되지 않는 것처럼, 어떤 행렬은 역행렬이 존재하지 않습니다(이를 특이행렬, singular matrix 라 합니다). 역행렬이 있느냐 없느냐는 행렬식(determinant)이 0이 아니냐 0이냐로 판별하는데, 이 개념은 뒤에서 따로 다룹니다. 🚀 머신러닝에서는? — 선형회귀의 "정규방정식" 머신러닝에서 가장 기본이 되는 선형회귀 의 정답 공식(정규방정식)이 바로 역행렬로 쓰입니다. $$ w = (X^\top X)^{-1} X^\top y $$ 데이터 $X$와 정답 $y$로부터 최적의 가중치 $w$를 한 번에 구하는 이 식에 $(\cdots)^{-1}$이 등장합니다. 즉 "$Xw = y$를 거
То, что RADAR обнаружил и классифицировал для этой возможности. Это опубликованный источником текст, а не подтверждение, что предложение ещё действует.
[Zero to ML Master #03] 행렬 쉽게 이해하기 — shape·행렬 곱셈·역행렬이 필요한 이유 (파이썬 NumPy). 반 전체의 과목별 점수를 표로 정리해 본 적 있나요? 그 표가 바로 행렬 입니다. 📋 딥러닝 코드를 읽다 보면 shape mismatch 에러를 정말 자주 만나는데, 그 대부분은 "이 행렬이 몇 행 몇 열인가" 를 확인하는 습관 하나로 막을 수 있어요. 이번 글에서는 행렬의 shape , 행렬 곱셈의 패턴( 행과 열을 짝지어 내적 ), 그리고 행렬에는 왜 나눗셈 대신 역행렬 이 필요한지를 정리합니다. 📘 이 글은 위키독스 도서 Zero to 머신러닝 딥러닝 Master 의 00-02 행렬 — 성적표는 곧 행렬이다 을 블로그용으로 다듬은 글입니다. 💻 실습 코드:…
Открыть источник