소개: 선형 대수학과 기계 학습 언어가 필요한 이유
기계 학습 모델이 이미지를 처리하고, 텍스트를 분류하고, 예측을 생성할 때마다 후드 아래에서 수행 중입니다. 선형 대수 연산. 입력 데이터가 플롯됩니다. 어떻게 벡터, 모델 가중치는 다음과 같습니다. 행렬, 그리고 전체 추론 과정 일련의로 귀결된다 행렬 곱셈 그리고 선형 변환.
이 기사에서는 기본 개념부터 시작하여 수학적 기초를 구축합니다. 고유값, SVD 및 분해 PCA, 추천 등 알고리즘의 기반이 되는 그리고 모델 압축. 각 공식에는 하나의 공식이 수반됩니다. 직관적인 설명 전자 하나에서NumPy 구현.
무엇을 배울 것인가
- 벡터, 노름, 스칼라 곱: 데이터의 기하학
- 행렬: 곱셈, 전치, 역 및 그 의미
- 행렬식과 순위: 변환에 관해 우리에게 알려주는 것
- 고유값과 고유벡터: 불변 방향
- SVD(특이값 분해): ML의 가장 강력한 도구
- NumPy의 실제 구현
벡터: 기본 빌딩 블록
Un 벡터 그리고 순서가 지정된 숫자 목록입니다. ML에서 벡터는 단일을 나타냅니다. 데이터 포인트: 이미지의 특징, 프레임의 픽셀, 문장의 인코딩된 단어. 벡터 안으로 \\mathbb{R}^n ha n 구성 요소.
예를 들어 3차원 벡터는 다음과 같습니다.
벡터 노름: 크기 측정
La 표준 벡터의 "길이"를 측정합니다. ML에서 가장 많이 사용되는 두 가지 표준은 다음과 같습니다.
L2 표준(유클리드) - 원점으로부터의 기하학적 거리:
노마 L1(맨해튼) - 희소성을 높이는 데 유용한 절대값의 합:
ML에서는 L2 표준이 사용됩니다. 능선 정규화 너무 많은 무게를 처벌하기 위해 큰 반면 L1 표준은 올가미 정규화 분산된 가중치를 얻기 위해(많은 0으로), 기능 선택에 유용합니다.
스칼라 곱: 유사성 측정
Il 스칼라 곱 (내적) 두 벡터 사이의 아마도 가장 중요한 연산 ML에서. 두 벡터가 얼마나 같은 방향을 가리키는지 측정합니다.
기하학적으로 스칼라 곱은 각도와 관련이 있습니다. \\세타 벡터 중:
언제 \\cos\\theta = 1, 벡터는 평행합니다(최대 유사성). 언제 \\cos\\세타 = 0, 직교합니다(관계 없음). 이것은 정확히는 원리는 약간의 유사성 추천 시스템에 사용됨 그리고 의미 검색에서.
주요 통찰력: 신경망에서 각 뉴런은 내적을 계산합니다. 입력 벡터 사이 \\mathbf{x} 그리고 가중치 벡터 \\mathbf{w}, 편견을 추가합니다 b, 활성화 함수를 적용합니다. \\sigma(\\mathbf{w} \\cdot \\mathbf{x} + b).
import numpy as np
# Vettori
a = np.array([2, -1, 4])
b = np.array([1, 3, 2])
# Prodotto scalare
dot = np.dot(a, b) # 2*1 + (-1)*3 + 4*2 = 7
print(f"Dot product: {dot}")
# Norme
l2_norm = np.linalg.norm(a) # sqrt(4 + 1 + 16) = sqrt(21)
l1_norm = np.linalg.norm(a, ord=1) # 2 + 1 + 4 = 7
print(f"L2 norm: {l2_norm:.4f}")
print(f"L1 norm: {l1_norm}")
# Cosine similarity
cos_sim = np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
print(f"Cosine similarity: {cos_sim:.4f}")
행렬: 데이터 변환
에이 행렬 직사각형 숫자 배열입니다. ML에서 행렬은 다음을 나타냅니다. 데이터 세트 (행 = 샘플, 열 = 기능) e 가중치 신경망의. 매트릭스 \\mathbf{A} \\in \\mathbb{R}^{m \\times n} ha m 라인과 n 열.
행렬 곱셈: 딥 러닝의 핵심
행렬 간의 곱셈 \\mathbf{A} \\in \\mathbb{R}^{m \\times n} 그리고 벡터 \\mathbf{x} \\in \\mathbb{R}^n 새로운 벡터를 생성합니다 \\mathbf{y} \\in \\mathbb{R}^m:
이 작전은 하나 선형변환: 입력 공간에서 벡터를 취합니다. 그리고 이를 출력 공간에 매핑합니다. 신경망 계층은 정확히 다음과 같은 작업을 수행합니다.
어디 \\mathbf{W} 그리고 가중치 행렬, \\mathbf{x} 입력, \\mathbf{b} 편향, e \\시그마 활성화 기능.
전치 및 대칭
La 전치된 \\mathbf{A}^T 행과 열을 교환합니다: (\\mathbf{A}^T)_{ij} = A_{ji}. 이는 다음과 같은 이유로 근본적입니다.
- 스칼라 곱은 다음과 같이 작성됩니다. \\mathbf{a}^T \\mathbf{b}
- 공분산 행렬 e \\frac{1}{n}\\mathbf{X}^T\\mathbf{X}
- 역전파에서는 가중치의 전치를 통해 기울기가 전파됩니다.
행렬식: 부피와 가역성
Il 결정적인 정사각 행렬은 변환이 볼륨의 크기를 조정하는 방법을 측정합니다. 2x2 행렬의 경우:
Se \\det(\\mathbf{A}) = 0, 행렬 e 단수형 (비반전): 변환이 공간을 "분쇄"하여 정보를 잃습니다. 이것은 표시입니다 의 공선성 이는 선형 회귀에 문제를 일으키는 기능입니다.
순위: 유효 크기
Il 계급 행렬과 선형 독립 행(또는 열)의 수입니다. 행렬인 경우 \\mathbf{A} \\in \\mathbb{R}^{m \\times n} 그 사람은 지위가 있어 r < \\min(m, n), 데이터가 부분공간에 존재함을 의미합니다. 크기가 r, 완전한 공간이 아닙니다. 이것이 원칙이다 기초 차원 축소.
import numpy as np
# Matrice dei pesi (layer neurale: 3 input -> 2 output)
W = np.array([[0.5, -0.3, 0.8],
[0.2, 0.7, -0.4]])
x = np.array([1.0, 2.0, 3.0])
# Forward pass: trasformazione lineare
y = W @ x # oppure np.dot(W, x)
print(f"Output: {y}") # [-0.1 + ... = risultato]
# Trasposta
print(f"W shape: {W.shape}") # (2, 3)
print(f"W^T shape: {W.T.shape}") # (3, 2)
# Determinante (solo matrici quadrate)
A = np.array([[3, 1], [2, 4]])
det = np.linalg.det(A)
print(f"Determinante: {det:.2f}") # 10.0
# Rango
rank = np.linalg.matrix_rank(W)
print(f"Rango: {rank}") # 2
고유값과 고유벡터: 특별한 방향
그만큼 고유벡터 행렬의 방향은 다음과 같은 경우 방향이 변하지 않는 방향입니다. 변환이 적용됩니다. 그들은 다음과 같은 요소에 의해서만 확장됩니다. 고유값. 공식적으로 정사각 행렬의 경우 \\mathbf{A}:
어디 \\mathbf{v} 그리고 고유벡터 e \\lambda 해당 고유값.
기하학적 직관: 고무판을 다림질하고 있다고 상상해 보세요. 대부분의 포인트 서로 다른 방향으로 움직이지만 어떤 방향은 회전하지 않고 늘어나거나 압축만 됩니다. 그 는 고유벡터의 방향이고, 고유값이 얼마나 늘어나는지는 고유값에 의해 결정됩니다.
고유값을 찾기 위해 다음을 해결합니다.특성 방정식:
ML에서 공분산 행렬의 고유값은 다음을 알려줍니다. 얼마나 차이가 나는지 긴 것도 있어요 각 주요 방향. 이것이 PCA(주성분 분석)의 기초입니다.
ML 애플리케이션: PCA에서 공분산 행렬의 고유벡터는 다음과 같습니다. 주요 구성 요소, 고유값은 각각이 포착하는 분산의 양을 나타냅니다. 구성 요소. Top-k 고유벡터를 선택하여 차원을 최대한 유지하면서 차원을 줄입니다. 정보의 일부입니다.
import numpy as np
# Matrice simmetrica (come una matrice di covarianza)
A = np.array([[4, 2],
[2, 3]])
# Calcolo autovalori e autovettori
eigenvalues, eigenvectors = np.linalg.eigh(A)
print(f"Autovalori: {eigenvalues}")
print(f"Autovettori:\n{eigenvectors}")
# Verifica: A @ v = lambda * v
for i in range(len(eigenvalues)):
v = eigenvectors[:, i]
lam = eigenvalues[i]
lhs = A @ v
rhs = lam * v
print(f"A*v = {lhs}, lambda*v = {rhs}, uguale: {np.allclose(lhs, rhs)}")
특이값 분해(SVD): 범용 도구
La SVD ML에 대한 선형 대수학의 가장 중요하고 다양한 분해입니다. 모든 매트릭스 \\mathbf{A} \\in \\mathbb{R}^{m \\times n} 다음과 같이 분해될 수 있습니다:
어디:
- \\mathbf{U} \\in \\mathbb{R}^{m \\times m} - 직교 행렬(출력 방향)
- \\boldsymbol{\\Sigma} \\in \\mathbb{R}^{m \\times n} - i가 있는 대각 행렬 특이값 \\sigma_1 \\geq \\sigma_2 \\geq \\cdots \\geq 0
- \\mathbf{V}^T \\in \\mathbb{R}^{n \\times n} - 직교 행렬(입력 방향)
직관: SVD는 모든 선형 변환을 세 단계로 나눕니다. (\\mathbf{V}^T), 축을 따른 스케일링 (\\boldsymbol{\\시그마}) 및 또 다른 회전 (\\mathbf{U}).
잘린 SVD: 스마트 압축
첫 번째 항목만 유지 k 우리가 가장 좋은 것을 얻는 특이값 순위 근사 k 원래 행렬의:
이는 이미지 압축, 추천 시스템(행렬 분해)에 사용됩니다. 텍스트에 대한 잡음 감소 및 LSA(잠재 의미 분석).
import numpy as np
# Matrice (es. ratings utenti-prodotti)
A = np.array([[5, 4, 0, 0],
[4, 5, 0, 0],
[0, 0, 4, 5],
[0, 0, 5, 4]])
# SVD completa
U, sigma, Vt = np.linalg.svd(A)
print(f"Valori singolari: {sigma}")
# SVD troncata (rank-2 approssimazione)
k = 2
U_k = U[:, :k]
sigma_k = np.diag(sigma[:k])
Vt_k = Vt[:k, :]
A_approx = U_k @ sigma_k @ Vt_k
print(f"Matrice originale:\n{A}")
print(f"Approssimazione rank-{k}:\n{np.round(A_approx, 2)}")
# Errore di ricostruzione
error = np.linalg.norm(A - A_approx, 'fro')
print(f"Errore Frobenius: {error:.4f}")
# Varianza spiegata
explained = np.sum(sigma[:k]**2) / np.sum(sigma**2) * 100
print(f"Varianza spiegata con k={k}: {explained:.1f}%")
NumPy의 브로드캐스트 및 효율적인 작업
NumPy는 다음을 지원합니다. 방송, 작업을 수행할 수 있는 메커니즘 복사본을 생성하지 않고 서로 다른 크기의 배열 사이를 이동합니다. 이는 ML 코드 작성의 기본입니다. 효율적이다.
import numpy as np
# Dataset: 1000 campioni, 10 feature
X = np.random.randn(1000, 10)
# Normalizzazione: sottrai media, dividi per std
mean = X.mean(axis=0) # shape: (10,)
std = X.std(axis=0) # shape: (10,)
X_norm = (X - mean) / std # Broadcasting automatico!
# Batch matrix multiplication
# W: (10, 5), X: (1000, 10) -> output: (1000, 5)
W = np.random.randn(10, 5)
output = X_norm @ W # Equivalente a np.dot(X_norm, W)
print(f"Output shape: {output.shape}")
# Moltiplicazione element-wise vs matrix
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
print(f"Element-wise: {a * b}") # [[5, 12], [21, 32]]
print(f"Matrix mult: {a @ b}") # [[19, 22], [43, 50]]
실제 적용: 신경망의 순방향 전달
2 레이어 신경망의 전체 순방향 전달을 구현하여 모든 것을 하나로 묶어 보겠습니다. 선형 대수만 사용:
import numpy as np
def relu(x):
return np.maximum(0, x)
def softmax(x):
exp_x = np.exp(x - np.max(x, axis=1, keepdims=True))
return exp_x / np.sum(exp_x, axis=1, keepdims=True)
# Architettura: 4 input -> 8 hidden -> 3 output (classificazione)
np.random.seed(42)
W1 = np.random.randn(4, 8) * 0.1 # Pesi layer 1
b1 = np.zeros(8) # Bias layer 1
W2 = np.random.randn(8, 3) * 0.1 # Pesi layer 2
b2 = np.zeros(3) # Bias layer 2
# Input: batch di 5 campioni, 4 feature ciascuno
X = np.random.randn(5, 4)
# Forward pass (pura algebra lineare!)
# Layer 1: trasformazione lineare + attivazione
z1 = X @ W1 + b1 # (5, 4) @ (4, 8) + (8,) = (5, 8)
h1 = relu(z1) # (5, 8) - attivazione ReLU
# Layer 2: trasformazione lineare + softmax
z2 = h1 @ W2 + b2 # (5, 8) @ (8, 3) + (3,) = (5, 3)
probs = softmax(z2) # (5, 3) - probabilità per 3 classi
print(f"Probabilità output:\n{np.round(probs, 4)}")
print(f"Somma per riga: {probs.sum(axis=1)}") # Deve essere ~1.0
print(f"Classi predette: {np.argmax(probs, axis=1)}")
ML과의 요약 및 연결
기억해야 할 핵심 사항
- 스칼라 곱 \\mathbf{a} \\cdot \\mathbf{b}: 유사성 측정, 각 뉴런의 기본 동작
- 행렬 곱셈 \\mathbf{W}\\mathbf{x}: 선형변환, 전진패스의 핵심
- 고유값: 최대 분산(PCA) 방향을 나타냅니다.
- SVD: 압축, 추천, 잡음 제거를 위한 보편적인 분해
- L2 표준: Ridge 정규화에 사용되며 과적합을 방지합니다.
- 계급: 실제 데이터 크기, 차원 축소 기준
다음 기사에서: 우리는 다음을 탐구할 것이다. 미분학 딥러닝을 위해. 우리는 그래디언트를 통해 신경망이 어떻게 학습할 수 있는지, 그리고 체인 규칙이 어떻게 이루어지는지 살펴보겠습니다. 역전파를 가능하게 합니다.







