노름의 종류에 따라 벡터의 기하학적 성질이 다르며, 필요에 따라 다른 노름을 선택하여 사용할 수 있다.
L1-노름은 로버스트 학습이나 라쏘 회귀에 사용되며, 기하학적으로 맨해튼 거리를 나타낸다.
L2-노름은 리지 회귀나 유클리드 거리 계산에 사용되며, 기하학적으로는 유클리드 거리를 나타낸다.
행렬 (Matrix)
행렬이란?
행렬은 벡터를 원소로 가지는 2차원 배열이다. 각 행은 데이터 포인트를, 각 열은 특정 변수를 나타낸다.
전치행렬은 행과 열을 바꾼 행렬로, matrix.T와 같이 표현된다.
행렬을 이해하는 방법
벡터가 공간에서 한 점을 의미한다면 행렬은 여러 점들을 나타냅니다. 행렬의 행벡터 $x_i$는 $i$번째 데이터를 의미하며 $x_ij$는 $i$번째 데이터의 $j$번째 변수의 값을 말합니다.
행렬끼리 같은 모양을 가지면 덧셈, 뺄셈을 계산할 수 있습니다. 성분곱은 각 인덱스 위치끼리 곱하는 것으로 벡터와 똑같습니다. 스칼라곱도 차이가 없습니다. 행렬 곱셈(matrix multiplication)은 $i$번째 행벡터와 $j$번째 열벡터 사이의 내적을 성분으로 가지는 행렬을 계산합니다. (numpy에선 @연산을 사용합니다.)
numpy에서의 내적은 앞에서 이야기한 것과 조금은 다른 의미를 가집니다. np.inner는 $i$번째 행벡터와 $j$벡터 행 벡터 사이의 내적을 성분으로 가지는 행렬을 계산하기 때문에 수학에서 말하는 내적과는 다릅니다. np.inner를 사용하려면 반드시 transpose를 해서 사용해줘야 합니다. 이때도 행 벡터의 길이가 같아야 내적을 계산할 수 있습니다.
행렬은 벡터공간에서 사용되는 연산자(operator)로 이해합니다. 행렬곱을 통해 벡터를 다른 차원의 공간으로 보내거나 패턴을 추출할 수 있고 데이터를 압축할 수도 있습니다. (모든 선형변환(linear transform)은 행렬곱으로 계산할 수 있습니다.)
행렬의 연산
덧셈과 뺄셈: 동일한 크기의 행렬 간에 수행되며, 데이터 집합 간의 차이를 나타낼 때 사용된다.
성분곱: 벡터와 동일하게 각 위치의 요소를 곱한다.
행렬 곱셈: 벡터 공간에서의 변환을 나타내며, 데이터의 차원 변환 또는 패턴 추출에 사용된다.
역행렬: 주어진 선형 변환을 뒤집는 행렬로, np.linalg.inv(matrix)를 통해 계산한다.
역행렬
어떤 행렬 $A$의 연산을 거꾸로 되돌리는 행렬을 역행렬(inverse matrix)이라 부르고 $A^−1$라 표기합니다. 역행렬은 행과 열의 숫자가 같고 행렬식(determinant)이 0이 아닌 경우에만 계산할 수 있습니다.
경사하강법
미분 (Differentiation)
미분(differentiation)은 변수의 움직임에 따른 함수값의 변화를 측정하는 도구로, 최적화에서 가장 많이 사용되는 기법 중 하나입니다. 미분은 변화율의 극한으로 정의됩니다.
정의: 미분은 함수 $f$의 주어진 점 $(x, f(x))$에서의 접선의 기울기를 구하는 것입니다.
조건: 미분을 계산하기 위해서는 함수가 매끄럽고 연속적이어야 합니다.
응용: 한 점에서 접선의 기울기를 알면, 어느 방향으로 점을 움직여야 함수값이 증가하는지 또는 감소하는지 알 수 있습니다.
함수값을 증가시키고 싶다면 미분값을 더합니다. 이를 '경사상승법(gradient ascent)'이라 하며, 함수의 극대값의 위치를 구할 때 사용합니다 (목적함수를 최대화할 때 사용).
함수값을 감소시키고 싶다면 미분값을 뺍니다. 이를 '경사하강법(gradient descent)'이라 하며, 함수의 극소값의 위치를 구할 때 사용합니다 (목적함수를 최소화할 때 사용).
정지 조건: 경사상승법이나 경사하강법은 극값에 도달하면 움직임을 멈춥니다.
기본 알고리즘
var = init # 시작점
grad = gradient(var) # 미분을 계산하는 함수
while abs(grad) > eps:
var = var - lr * grad # lr은 학습률
grad = gradient(var)
eps는 미분값이 0에 가까워질 때까지의 기준입니다.
lr은 학습률로, 미분값을 통한 변수의 업데이트 속도를 조절합니다.
선형회귀분석
for t in range(T): # T: 학습 횟수
error = y - X @ beta
grad = -X.T @ error
beta = beta - lr * grad
선형회귀에서는 경사하강법을 사용하여 회귀 계수 beta를 최소화합니다.
확률적 경사하강법 (Stochastic Gradient Descent, SGD)
확률적 경사하강법(SGD)은 경사하강법의 변형으로, 각 반복에서 전체 데이터 대신 일부 데이터(미니배치)만을 사용하여 그래디언트를 계산합니다.
확률적 경사하강법의 장점
효율성: 전체 데이터 대신 일부 데이터를 사용하므로 계산 효율성이 높습니다.
일반화: 전체 데이터에 대한 과적합(overfitting)을 방지할 수 있습니다.
# 전체 데이터 D = (X, y)
# 미니배치 D(b) 사용
grad_approx = approximate_gradient(D(b), theta)
theta = theta - lr * grad_approx