텐서 압축

IT 위키

텐서 압축(Tensor Compression)은 고차원 배열(텐서)을 저장·처리할 때 메모리 사용량과 계산 복잡도를 줄이기 위해 희소성(sparsity) 또는 저차(rank) 구조를 이용하여 데이터를 압축하는 기법이다.

개념[편집 | 원본 편집]

고차원 텐서란 3차원 이상(예: 3‑way, 4‑way…) 배열을 의미하며, 텐서 압축은 이러한 배열에서 대부분이 0이거나 중요도가 낮은 원소를 효율적으로 표현하는 방식이다. 압축 기법은 대략 두 가지 축을 따른다:

  • 희소 저장(sparse storage) — 비제로(non‑zero)가 극히 적은 텐서에서 인덱스‑값 쌍만 저장하는 방식
  • 저차 분해(low‑rank decomposition) — 텐서를 여러 저차 텐서의 곱 또는 합으로 나타내어 차원 또는 순위를 줄이는 방식

구성 요소 및 방식[편집 | 원본 편집]

텐서 압축에서 흔히 쓰이는 일부 형식은 다음과 같다:

  • Compressed Sparse Fiber(CSF) 형식 — 다차원 텐서의 섬유(fiber)를 기준으로 계층적 압축을 수행하는 방식
  • 좌표 형식(Coordinate, COO) 확장 — 텐서의 각 비제로 원소를 (모드1 인덱스, 모드2 인덱스, …, 값) 형태로 저장하는 방식
  • 혼합형 모드 압축(level‑based) — 각 차원(모드)에 대해 ‘dense’ 또는 ‘compressed’ 저장 여부를 지정하는 방식

이들 방식은 각각 다음 배열 구조를 가진다:

  • values — 비제로 원소들의 값 배열
  • indices 모드별 배열 — 각 비제로 원소의 각 차원 인덱스를 저장
  • pointer 또는 pos 배열 — 특정 모드(또는 계층)에서 섬유가 시작되는 위치 정보를 저장

특징 및 동작[편집 | 원본 편집]

  • 희소 텐서에서 메모리 사용량을 대폭 절감할 수 있다. 예컨대 대부분 원소가 0인 경우 저장량을 비제로 개수 수준으로 줄일 수 있다.
  • 텐서 연산(예: 텐서·행렬 곱, 텐서 분해)에서 불필요한 0 연산을 회피할 수 있어 성능 개선이 가능하다.
  • 하지만 압축 형태가 복잡할수록 인덱스 관리, 탐색, 업데이트가 까다로워질 수 있다.
  • 텐서의 차원(모드) 수가 많아질수록 압축 인덱스의 중복 제거나 탐색 비용이 증가할 수 있다.

장점[편집 | 원본 편집]

  • 대용량 고차원 데이터셋(예: 추천 시스템의 사용자×아이템×시간, 과학적 시뮬레이션의 공간×시간×파라미터 등)에서 저장 공간 및 메모리 대역폭을 효율적으로 사용 가능하다.
  • 연산 시 불필요한 0 또는 미사용 원소를 건너뛰어 계산 비용을 낮출 수 있다.
  • 다양한 라이브러리나 컴파일러 인프라에서 지원되기 시작하고 있어 활용성이 증가하고 있다.

단점[편집 | 원본 편집]

  • 압축된 형식에 맞춘 알고리즘을 설계해야 하므로 구현이 복잡해질 수 있다.
  • 압축‑저장 방식이 특정 연산 방식이나 하드웨어에 적합하지 않을 수 있다. 즉, 형식과 연산 패턴이 맞아야 효율이 올라간다.
  • 압축 상태에서의 동적 수정(예: 원소 삽입, 삭제, 구조 변경)이 어렵거나 비효율적일 수 있다.

응용 및 변환[편집 | 원본 편집]

  • 머신러닝 및 데이터마이닝 영역에서 희소 텐서 분해(sparse tensor decomposition), 텐서 회귀 분석 등에 사용된다.
  • 컴파일러 및 하드웨어 설계에서는 텐서 압축 저장 형식을 명시하고 그에 최적화된 코드·하드웨어를 생성하는 연구가 진행 중이다.
  • 압축 방식 간 변환도 가능하며, 예컨대 COO 형식으로 표현된 희소 텐서를 CSF 형식으로 변환하여 연산 효율을 높이는 방식 등이 있다.

예시[편집 | 원본 편집]

다음은 3‑모드(3차원) 희소 텐서를 압축 저장하는 간단한 예이다. 텐서 X 형태: 차원 (I×J×K) = (3×3×2) 비제로 원소:

  • X[0,1,0] = 5
  • X[2,2,1] = 7
  • X[1,0,1] = 4

위 비제로 원소만 저장한다고 가정하면, 좌표 형식(COO 방식 확장)으로는 다음과 같이 저장할 수 있다:

  • indices_mode0 = [0, 2, 1]
  • indices_mode1 = [1, 2, 0]
  • indices_mode2 = [0, 1, 1]
  • values = [5, 7, 4]

보다 효율적인 형식으로 모드‑0를 ‘compressed’, 모드‑1 · 모드‑2를 좌표로 저장하는 CSF 유사 방식이라면 다음과 같은 구조를 쓸 수 있다:

  • ptr_mode0 = [0, 2, 3] (모드‑0 인덱스별 값 시작 위치)
  • indices_mode0 = [0, 2, 1]
  • indices_mode1 = [1, 2, 0]
  • indices_mode2 = [0, 1, 1]
  • values = [5, 7, 4]

이렇게 하면 각 모드‑0 인덱스(0, 2, 1)마다 연관된 비제로들이 연속 저장되고, 모드‑0를 기준으로 빠르게 섬유(fiber) 단위 접근이 가능하다.

같이 보기[편집 | 원본 편집]

참고 문헌[편집 | 원본 편집]

  • Tew, P. A., Meng, J. “An investigation of sparse tensor formats for tensor libraries.” MIT, 2016.
  • Baskaran, M. et al. “Efficient and Scalable Computations with Sparse Tensors.” IEEE HPEC, 2012.
  • Helal, A. E. et al. “ALTO: Adaptive Linearized Storage of Sparse Tensors.” arXiv:2102.10245, 2021.

각주[편집 | 원본 편집]