SVD [AI POC]
메모리의 종류 및 동작 과정
[ 1. SVD의 각 원소 ]
특잇값 분해(Singular Value Decomposition, SVD)
- U & V는 unitary (conjugate + transpose = inverse)
- v*은 Transpose (실수계에서는 transpose가 inverse로 사용 in Unitary)
[ 2. SVD의 기하학적 의미 ]
- 직교하는 벡터집합에 대하여 선형 변환 후에도 여전히 직교하게 만드는 벡터 집합이 무엇인가?
- 변형 과정에서 크기(시그마)는 변할 수 있음
[ 3. 수학적 분석 ]
3.1 정의에 따른 분석
⇒ A라는 matrix로 서로 수직인 v1,v2를 변환시켰을 때, 결과로 똑같이 수직 관계를 가지는 u1,u2가 나오고 크기는 sigma1, 2만큼 변경
3.2 Layer 분할
u1과 v1(T)의 곱은 하나의 matrix가 되므로, sigma1이라는 정보의 중요도를 가지는 matrix를 얻을 수 있고
이를 모두 합하면 원래의 matrix인 A가 됨
⇒ 전체 데이터 중 sigma 값이 낮은 데이터를 제거해도, 전체 데이터의 낮은 해상도의 데이터를 얻을 수 있다. (데이터 압축)
[ 4. VectorDB 관점 ]
INFP
- 내향 vs 외향 [0.9 0,1]
- 계획 vs 즉흥 [0.2 0.8]
참고 : 공분산(Covariance)과 상관 계수(Correalation)
- 공분산 ⇒ 임의의 두 확률변수 X, Y 사이의 선형관계에 대한 정보
- 단 공분산의 크기가 크다고 관계가 더 깊은 것 과는 상관 없음
- 상관계수 ⇒ 공분산/편차들
- Y가 X일 때의 상관 계수 ⇒ 최댓값 1
- Y가 -X일 때의 상관 계수 ⇒ 최솟값 -1
(-1 ~ +1) 사의의 값
공분산 행렬
주의 : n으로 나누는 이유는 단순히 sample수가 많아지면 값이 커지는 문제를 해결하기 위함이지, 상관계수처럼 값 보정의 의미가 아님!
SVD에서
- X에서 행은 단어의 집합
- X에서 열은 문서 그 자체의 집합
- 행 벡터들끼리의 내적 → 문서–문서 유사도
- 열 벡터들끼리의 내적 → 단어–단어 유사도
(1) A : 기본 데이터
- 문서 집합 (m=3):
- "고양이가 매트 위에 앉아있다"
- "강아지가 고양이를 쫓았다"
- "경제학자들이 금리 인하를 예상한다"
- 단어 사전 (n=7):
- ["고양이", "매트", "강아지", "쫓다", "경제학자", "금리", "인하"]
⇒ 조사/불용어는 제거 (KoNLPy, MEcab)
→ X는 3×7 행렬
(2) U & V 임베딩
- 기본 임베딩
- sigma를 이용하는 이유 (데이터가 많이 변하는 정도에 대한 가중치를 두는 이유)
- 문서 임베딩 : 의미 검색/최근접
- 단어 임베딩 : 단어 유사도/확장
- alpha 가중치
- alpha의 역할 (특정 성분 sigma의 영향력 변화 [적으면 늘리고, 크면 줄이고] )
- 실제 코퍼스에서 σ1\sigma_1σ1은 종종 “문서 길이/불용어/전반적 빈도” 같은 일반성 축을 먹습니다.
- α<1\alpha<1α<1이면 비율이 (σ1/σ2)α(\sigma_1/\sigma_2)^\alpha(σ1/σ2)α 로 압축되어 상위 축의 독주를 줄입니다.
- 예: σ1/σ2=10\sigma_1/\sigma_2=10σ1/σ2=10 → α=0.7\alpha=0.7α=0.7이면 100.7≈5.010^{0.7}\approx 5.0100.7≈5.0 (절반 수준으로 완화)
- 고차원 최근접 탐색에서 특정 벡터가 모든 쿼리의 이웃으로 과도하게 등장(허브)할 수 있어요.
- 큰 특잇값을 누그러뜨리면 분포가 더 등방성(isotropy) 에 가까워지고 허브가 줄어듭니다.
- 실전에서 **코사인 kNN 품질(Recall@k, nDCG)**이 자주 개선됩니다.
- 주의: 정확도는 보지 않음. Top-k에 오답이 많아도 높을 수 있음.
왜?
왜 α\alphaα를 쓰나? (장점)
1) 상위 주성분의 과대지배 완화
2) 허브니스(hubness) 감소 & 등방성 개선
| 상황 | 권장 α\alpha | 이유 |
| 불용어/길이효과가 강함, 상위 축 지배적 | 0.6–0.8 | 과대 가중 완화, 허브 감소 |
| 코퍼스 작음, 상위 토픽이 유의미 | 0.9–1.0 | 정보 손실 최소화 |
| 클러스터링 전처리(등가중 선호) | 0.0–0.5 | 축을 더 균등화(단, 노이즈 증폭 주의) |
Recall@k (검증을 통한 alpha값 조정)
⇒ 주어진 쿼리 q에서 정답 R중에서 상위 결과 k개 중 몇개가 맞는가를 나타내는 지표
- L2 정규화 (= divide by 2-norm)
크기로 나눠서 이후에 연산 편리
EX) 유클리드 거리식 (=크기 1인 벡터의 코사인 유사도) 이 2(1-cos)으로 간결화
(3) 관계 해석
a. 토픽 해석 (수치적으로 구분이 되는 지표지 뭔지 알 수 없음)
- 토픽1: "동물"
- 토픽2: "경제"
b. 임베딩
문서 임베딩 (UΣ)
- 문서1 ("고양이가 매트 위에 앉아있다") → [0.9, 0.1]
- 문서2 ("강아지가 고양이를 쫓았다") → [0.8, 0.2]
- 문서3 ("경제학자들이 금리 인하를 예상한다") → [0.0, 1.0]
단어 임베딩 (VΣ)
- V : "고양이" → [0.85, 0.1], "강아지" → [0.8, 0.15], "금리" → [0.0, 0.95]
쿼리 임베딩
"강아지가 고양이와 놀다” ⇒ UΣ = [0.85, 0.15]
모든데이터 확인
- 코사인 유사도 ⇒ 문서2와 가장 높음
네트워킹 데이터 확인
- ANN 알고리즘(HNSW, LSH 등)
(4)CHUNKING(부분화) 및 UPSERT(삽입) -
청킹 - 문서를 잘개 쪼개서 ⇒ EX) 문단 단위
해당 문단에 쿼리가 포함되면 상위권으로
- 경계 문제 때문에 일부 오버랩 설정
(추가 과정) TransFormer (문맥해석) → 원리 읽다 뇌가 터질거 같아요
- 구조 / 위치 / 주변어 등을 분석 요소로 추가하는 방법
Multi Head
예: “Apple이 칩을 발표했다” vs “나는 사과(apple)를 먹었다”
- 한 시선은 “발표했다/칩”과 강하게 연결되어 회사 Apple,
- 다른 시선은 “먹었다”와 연결되어 과일 apple로
그외 기능
- 부정 처리
- “좋다” vs “별로 좋지 않다”
- 모델은 “좋다” 벡터를 그대로 쓰지 않고, “않다”를 강하게 참고해 의미를 뒤집은 벡터로 업데이트.
- 대명사 해소
- “민수는 제인을 만났다. 그는 늦었다.”
- “그”가 누구인지(민수?)를 앞문장 “민수”와의 연결로 풀어냅니다.
- 구·관용표현
- “손을 놓다”(포기하다)처럼 단어별 사전 뜻보다 묶음 표현으로 이해되도록, 관련 단어들끼리 서로 강하게 참고합니다.