예제로 배우는 텐서 입문
이 글에서는 텐서를 자세히 살펴봅니다. 텐서가 무엇인지, 어떻게 사용하는지, 그리고 현실 세계에서의 활용 사례를 알아보겠습니다. 이 글은 AI 번역본입니다. 오역이 있을 수 있으니 댓글로 자유롭게 알려주세요.
Created on September 15|Last edited on September 15
Comment
소개
아마 기계학습을 조금이라도 해 봤다면 ‘텐서’라는 말을 들어봤을 것입니다. 그런데 텐서는 정확히 무엇일까요? 단지 거대한 데이터 배열일 뿐일까요? 이 글에서는 텐서가 무엇인지, 텐서의 활용 사례, 그리고 실제 동작 예시를 살펴보겠습니다.
이번 글에서 다룰 내용은 다음과 같습니다:
목차
소개머신러닝에서 텐서란 무엇일까요?텐서의 랭크/차원은 어떻게 결정할까? 텐서의 형태는 어떻게 설명할 수 있을까?만약 내부의 2차원 배열이 있다면 three_dimensional_tensor 모양이 서로 달랐다면 어떻게 될까요?그렇다면 텐서의 데이터 타입과 크기는 어떨까요? 수학에서의 텐서수학에서 “텐서”라는 단어의 역사란 무엇인가?텐서는 무엇에 쓰이나요?머신러닝에서 텐서는 어떻게 쓰이며, 왜 중요한가?파이썬에서의 텐서텐서와 함께 Weights & Biases 사용하기실전 텐서 예시결론추천 읽을거리
머신러닝에서 텐서란 무엇일까요?
머신러닝에서 텐서는 어떤 다차원 데이터 배열일반적으로 행렬은 랭크 2의 텐서로 생각할 수 있습니다. 유의할 점은 텐서는 랭크가 0 이상인 어떤 값도 될 수 있다는 것이며, 여기서 랭크는 해당 텐서나 배열이 가진 차원의 개수를 의미합니다.
텐서에는 네 가지 주요 속성이 있습니다:
- 랭크차원이라고도 함; 텐서의 축(축의 개수)
- 모양: 랭크가 n일 때의 n-튜플; 튜플의 각 값은 해당 차원의 크기입니다
- 데이터 타입: 텐서의 값/데이터 종류(예: 부동소수점, 정수, 객체 등)
- 크기: 한 축의 크기; 모든 축의 크기를 곱한 값(전체 원소 수)을 의미하기도 함
이 문맥에서는 랭크가 차원과 동의어이며, 배열은 텐서와 동의어입니다. 경우에 따라 차원을 축의 대체 표현으로 쓰기도 합니다.
two_dim_tensor = [[1, 2, 3],[4, 5, 6]]
방금 설명한 텐서는 1차원, 즉 랭크가 1입니다. 이제 위에서 정의한 숫자들의 리스트의 리스트를 살펴봅시다. two_dim_tensor이 2차원 배열 또는 텐서는 랭크 2입니다.
조금 헷갈리거나 시각적으로 이해하는 편이라면, 다음 섹션의 그림이 도움이 될 것입니다!
텐서의 랭크/차원은 어떻게 결정할까?
랭크는 이렇게 물어볼 수 있습니다. 텐서에서 특정 값을 선택하려면 인덱스가 몇 개 필요할까?
숫자 3을 찾아봅시다. 1차원 텐서에서는 한 번만 인덱싱하면 됩니다. 0부터 세면 두 번째 원소가 3입니다. 2차원 텐서에서는 두 번 인덱싱해야 합니다. 먼저 0번째 리스트에 들어가서, 그 안에서 두 번째 원소를 찾으면 3입니다.
여기서의 패턴을 더 잘 이해하려면 그림 1을 참고하세요. 각 차원이 하나씩 추가될 때마다, 이전 차원에서 온 텐서들의 리스트를 쌓아 올리고 있습니다. 3차원 텐서는 2차원 텐서들을 차곡차곡 쌓아 놓은 모음에 불과하며, 6차원 텐서가 5차원 텐서들의 스택인 것과 같은 이치입니다.

텐서의 형태는 어떻게 설명할 수 있을까?
텐서의 형태는 정수 튜플로 표현할 수 있습니다. 위의 1차원 예시에서는 one_dim_tensor, 모양은 (3,)입니다. 다만 텐서를 다룰 때에는, 특히 다음과 같은 인기 있는 딥러닝 프레임워크에서는 약간의 뉘앙스가 있습니다 TensorFlow 또는 PyTorch.
horizontal_tensor = [1, 2, 3]vertical_tensor = [[1],[2][3]]
horizontal_tensor 모양은 (3,)이지만 vertical_tensor 모양은 (3, 1)입니다. 각 숫자를 둘러싼 대괄호가 하나 더 들어가서 하다 중요합니다! 기술적으로는, vertical_tensor 의 계수(rank)는 1이 아니라 2입니다 horizontal_tensor.
우리는 이미 1차원과 2차원 텐서를 봤습니다. 아래는 3차원 텐서의 예시입니다. 이 텐서의 모양은 (2, 2, 3)입니다. 가장 바깥 대괄호 안에 2개의 2차원 텐서가 있으므로 (2, 2, 3)의 첫 번째 2가 됩니다. 내부의 두 2차원 텐서는 각각 모양이 (2, 3)이므로, (2, 2, 3)에서 두 번째 2와 3이 그렇게 정해집니다.
three_dimensional_tensor = [[[1, 2, 3],[4, 5, 6]],[[7, 8, 9],[10, 11, 12]]]
만약 내부의 2차원 배열이 있다면 three_dimensional_tensor 모양이 서로 달랐다면 어떻게 될까요?
그것을 …라고 합니다 들쭉들쭉한 텐서! 들쭉들쭉한 텐서(ragged tensor)는 하나 이상의 축을 따라 원소의 개수가 달라지는 텐서입니다. 예시를 살펴봅시다:
ragged_3d_tensor = [[[1, 2, 3], # 3 elements.[4, 5] # 2 elements.],[[6, 7, 8, 9], # 4 elements.[10, 11, 12] # 3 elements.]]# ragged_3d_tensor shape: (2, 2, *)
ragged_3d_tensor 모양은 (2, 2, *)가 됩니다. 각 2차원 텐서 안에서 열의 길이는 제각각이지만, 두 2차원 텐서 모두에서 행의 개수는 일정하기 때문입니다. 이 예시에서는 마지막 축만 길이가 달라진다는 점을 기억하세요. 물론 텐서의 세 축 모두가 달라질 수도 있습니다. 그래도 이 텐서의 계수(rank)는 여전히 3입니다.
그렇다면 텐서의 데이터 타입과 크기는 어떨까요?
텐서와 함께 사용할 수 있는 데이터 타입은 매우 다양합니다(데이터 타입의 예시 목록은에서 확인할 수 있습니다). TensorFlow)예상하셨겠지만, 데이터 타입은 텐서에 담긴 데이터의 종류를 설명합니다.
크기(size)의 경우, 특정 축을 가리킬 수도 있고 텐서 전체의 크기를 의미할 수도 있습니다. The three_dimensional_tensor 전체 크기는 2 * 2 * 3 = 12입니다. 그러나 축 0의 크기는 2(모양에서 첫 번째 2)입니다. 축 1의 크기는 2이고, 축 2의 크기는 3입니다. 총 크기는 텐서에 들어 있는 원소의 개수입니다.
수학에서의 텐서
“텐서”라는 말이 분야마다 조금씩 다른 의미로 쓰이긴 하지만, 기본적으로 핵심 정의는 같습니다. 우리가 머신러닝에서 사용하는 텐서의 정의는 (a 다차원 데이터 배열)은(는) 이 글의 목적에는 충분합니다. 다만 더 명확히 하기 위해, 단어의 어원을 잠깐 짚고 넘어가겠습니다.
수학에서 “텐서”라는 단어의 역사란 무엇인가?
라틴어에서 유래 당기다 “늘이다”라는 뜻으로, “텐서”라는 단어는 19세기 말에 등장했습니다. 1884년에, 조사이아 윌러드 깁스수학·물리학·화학 분야의 과학자인 그는 인체에 가해지는 변형을 연구하면서 이 용어를 사용했습니다. 1894년에, 볼데마르 포이크트 결정의 물리적 성질을 연구하면서 이 용어를 사용했습니다.
“텐서”에 대한 이 초기 두 사용례는 오늘날 수학자들이 이해하는 정의를 잘 보여 준다. 즉, 텐서는 “벡터 공간과 관련된 대수적 객체들의 집합들 사이의 다중선형 관계를 기술하는 대수적 객체”이다 (Wikipedia).
텐서: 벡터 공간과 관련된 대수적 객체들의 집합들 사이의 다중선형 관계를 기술하는 대수적 객체
💡
이 정의는 예시와 약간의 맥락을 통해 더 잘 이해할 수 있다.
...여기서 모든 것은 유지하되 상수이고, 그런 다음 의 선형 함수이다 . 이 사상 함수 이다 a 텐서!
텐서는 무엇에 쓰이나요?
텐서는 물리학, 수학, 머신러닝을 비롯한 여러 분야에서 폭넓게 사용됩니다. 수학에서 간단히 말하면, 텐서는 다양한 작업에 유용한 고유한 변환 성질을 갖춘 표준화된 표현 형식입니다. 머신러닝에서는 더 강력한 하드웨어와 결합된 텐서가 방대한 양의 데이터를 빠르게 처리할 수 있게 해줍니다.
머신러닝에서 텐서는 어떻게 쓰이며, 왜 중요한가?
머신러닝에서 텐서가 사용되고 중요한 이유는, 데이터 처리를 위해 텐서가 매우 적합한 형태이기 때문입니다.
머신러닝, 특히 딥러닝은 병렬화된 연산에서 큰 이점을 얻습니다. GPU와 TPU 같은 하드웨어의 폭발적인 발전이 더해지면서, 병렬 컴퓨팅과 ML이 만나는 최적의 토양이 마련되었습니다.
심층 신경망(DNN)의 입력, 출력, 그리고 “뉴런”(또는 가중치와 바이어스(그렇습니다, 말장난입니다))는 행렬이나 텐서입력 데이터가 DNN에 들어갈 때마다 연쇄적인 행렬 곱셈이 일어납니다. “뉴런”과 입력 데이터가 텐서 형식이고, 병렬 연산에 특화된 GPU와 TPU 같은 하드웨어가 있기 때문에, 방대한 양의 연산을 수행할 수 있습니다. 동시에, 처리 속도를 수천 배, 수만 배까지 끌어올립니다. 사실, 이 놀라운 성과가 오늘날 현대 딥러닝 전반을 떠받치고 있습니다!
ML에서 텐서가 어떻게 쓰이는지 예를 하나 살펴보겠습니다:

위 그림이 무엇인지 전혀 몰라도 걱정하지 마세요! 그것들은 이렇게 부릅니다 인공 신경망 (인공 신경망) 또는 신경망 줄여서. 이 개념은 딥러닝의 모든 것의 기초입니다. 우리의 뇌 뉴런이 연결되는 방식에서 느슨하게 영감을 받아, 이 네트워크도 자체 뉴런과 연결을 갖습니다. 각 원은 노드이며, 각 노드는 그 오른쪽에 있는 모든 노드와 완전 연결되어 있습니다. 회색 선과 원은 모두 신경망을 나타냅니다. 입력은 다음으로 들어가며 그리고 신경망이 이를 처리해 출력을 냅니다 .
이제 이런 맥락이 잡혔으니, 데이터를 네트워크에 전달하기가 얼마나 편리한지 주목해 보세요. 우리는 입력을 벡터, 즉 랭크 1 텐서로 정리합니다 모양이 (2,)입니다. 우리의 가중치는 랭크 2 텐서로 정리할 수 있습니다 모양이 (3, 2)입니다. 우리의 출력은 또 다른 랭크 2 텐서로 정리됩니다 모양이 (3,)입니다. 대신 다음을 계산합니다 그리고 이렇게 가중치와 입력을 행렬로 정리해 순차적으로 계산하면, GPU 같은 연산 장치에서 이를 수행하여 모든 산술 연산을 한꺼번에 처리할 수 있습니다 동시에이제 이 신경망을 데이터로 학습할 때, 개별 덧셈과 곱셈을 하나하나 따로 계산하는 것에 비해 전체 과정을 훨씬 더 빠르게 수행할 수 있습니다.
파이썬에서의 텐서
직접 해 보죠. 오늘 실험에서는 Python, NumPy, 그리고 TensorFlow를 사용하겠습니다. 간단히 하기 위해, TensorFlow와 PyTorch의 텐서 객체가 유사하므로 TensorFlow의 텐서를 예시로 보여 드리겠습니다. 시작하기 전에 먼저 실행 환경을 설정해 봅시다.
독립 실행형 Python을 설치하거나, 필요한 데이터 사이언스와 ML 라이브러리가 모두 포함된 편리한 Python 배포판인 Anaconda를 설치할 수 있습니다.
Python 설치하기:
Anaconda 설치하기
이 경우에는 Anaconda를 설치하고 Jupyter Notebook을 사용하는 것을 추천합니다. 어떤 IDE를 쓰든 상관없지만, 실험하고 코드를 가지고 놀 때는 저는 Jupyter Notebook을 선호합니다.
또는설치를 아예 피하고 싶다면 Kaggle 노트북(필요한 것은 Kaggle 계정뿐), Google Colab(구글 계정 필요), 또는 Deepnote(구글 계정만 연동하면 됨)을 사용할 수 있습니다. 텐서를 다루는 목적이라면 이들 인터랙티브 노트북은 모두 충분합니다(저는 GPU 옵션과 세션 시작 속도 때문에 Google Colab을 선호합니다). 저는 Google Colab에서 코딩하겠습니다.
Python에서는 텐서를 NumPy 배열 또는 TensorFlow/PyTorch 텐서로 표현할 수 있습니다. 각 경우에 대한 예시를 보여드리겠습니다.
편하게 보시려면 제 Colab을 확인해 보세요:
우선 필요한 모듈을 가져오겠습니다.
import numpy as npimport tensorflow as tf
a = np.array([1, 2, 3])b = np.array([4, 5, 6])>>> a + barray([5, 7, 9])>>> a - barray([-3, -3, -3])>>> a / barray([0.25, 0.4 , 0.5 ])>>> a * barray([ 4, 10, 18])>>> print(a.shape)(3,)>>> print(a.dtype)int64
여기에 나온 것보다 훨씬 더 많은 기능이 있습니다! 더 자세한 내용은 꼭 Colab 노트북을 확인해 보세요. 핵심은 NumPy 배열/텐서는 원소별로 산술 연산을 수행한다는 점입니다. 또한 들쭉날쭉한(ragged) 형태를 포함해 다양한 고유한 사양을 가질 수 있습니다.
아래에서는 TensorFlow 텐서의 몇 가지 예시를 볼 수 있습니다. 참고로, 이들은 NumPy 배열과 매우 유사합니다. 대부분의 NumPy 함수에는 TensorFlow에서도 해당하는 함수가 있을 가능성이 높습니다.
>>> e = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])>>> e = e.reshape(-1)>>> earray([1, 2, 3, 4, 5, 6, 7, 8, 9])>>> tf.convert_to_tensor(e)<tf.Tensor: shape=(9,), dtype=int64, numpy=array([1, 2, 3, 4, 5, 6, 7, 8, 9])>
>>> sparse_tensor = tf.sparse.SparseTensor(indices=[[0, 0], [1, 2]],values=[1, 2],dense_shape=[3, 4])>>> print(sparse_tensor, "\n")SparseTensor(indices=tf.Tensor([[0 0][1 2]], shape=(2, 2), dtype=int64), values=tf.Tensor([1 2], shape=(2,), dtype=int32), dense_shape=tf.Tensor([3 4], shape=(2,), dtype=int64))>>> print(tf.sparse.to_dense(sparse_tensor))tf.Tensor([[1 0 0 0][0 0 2 0][0 0 0 0]], shape=(3, 4), dtype=int32)
아직 확인하지 않았다면 Colab 노트북을 꼭 살펴보세요! 조금 더 깊이 있게 다룹니다. 그래도 부족하다면 NumPy나 TensorFlow의 문서 페이지(또는 둘 다)를 방문하는 것을 추천합니다. 훌륭한 가이드가 준비되어 있습니다! 더불어 온라인 자료나 강좌를 빠르게 검색해 보는 것도 좋습니다. 이 미리보기와 노트북의 예시를 통해 텐서가 어떻게 정의되는지, 그리고 어떤 연산이 가능한지 이해하셨기를 바랍니다. 다음으로, 텐서를 Weights & Biases (W&B)와 함께 사용하는 방법을 살펴보겠습니다.
텐서와 함께 Weights & Biases 사용하기
Weights & Biases는 협업, 모니터링, 추적에 훌륭한 도구입니다. 것들텐서가 ML에 쓰이든 아니든 크게 중요하지 않습니다. 대부분의 텐서 활용 사례는 비디오, 이미지, 상수 값, 플롯 등 다양한 형태의 미디어에서 나타납니다. 간단한 예로 로깅을 설정하는 방법을 먼저 살펴보고, 이어서 ML 예제를 보여드리겠습니다.
가상의 물리 시뮬레이션을 실행한다고 가정해 봅시다. 그리고 다음과 같은 것을 기록하고 싶습니다— 응력 텐서 앞에서 일정 기간에 걸쳐 기록한다고 언급했죠. 그걸 어떻게 할까요? 간단합니다! 코드가 Python을 사용한다면, W&B 연동은 코드 3~4줄이면 충분합니다!
# !pip install wandbimport wandbwandb.login() # Make sure you have an account. This will prompt you for your API token.run = wandb.init(project="My physics project", name="run_1")# Code to run simulation here.# Imagine periodically, a function here returns tensor output describing the physics simulation.x, y, z = func1() # Let's say your function returns position in 3 coordinates.# Every log is a time step in the line plot.# For instance, if you had a for loop that iterated 10 times, each time a log was made, the line plots on# W&B would have exactly 10 data points for an "x", "y", and a "z" graph!run.log({"x": x,"y": y,"z": z})# Let's say you don't want separate line charts for each dimension. You can do a 3D point cloud instead!# Below is a trivial example. Imagine you have an array "positions" of shape (n, 3) where n is the number of points# (one for each time step) and 3 is for the number of axes (x, y, and z).positions = np.array([[x+i, y+i, z+i] for i in range(100)])run.log({"point_scene": wandb.Object3D(positions)})run.finish()
보시다시피 W&B에서 텐서를 로깅하고 시각화하는 일은 전혀 어렵지 않습니다. 비디오, 이미지, 테이블, 히스토그램 등 로깅할 수 있는 객체도 다양합니다. 하지만 이것은 W&B가 제공하는 수많은 기능 중 빙산의 일각에 불과합니다. 로깅할 수 있는 항목에 대한 더 자세한 정보는 여기를 확인하세요.
W&B에는 텐서 중심의 작업을 돕는 다양한 도구가 준비되어 있습니다! 앞서 대시보드의 극히 일부분만 소개했는데요. W&B는 텐서(더 일반적으로는 모든 종류의 데이터)를 다음과 같이 저장할 수도 있습니다 아티팩트이들은 W&B 리포트와 함께 사용하면 협업을 위한 효과적인 문서를 만들 수 있습니다.

우리의 ML 텐서 활용을 위해 W&B를 사용하는 몇 가지 예시를 살펴보겠습니다. 최근에 제가 진행한 작은 프로젝트를 소개할 텐데, 여기서는 카글의 이미지 분할 모델 베이스라인을 5폴드 교차 검증으로 구성했습니다. HuBMAP + HPA - 인간 신체 해킹 대회입니다. 이런 용어들이 헷갈려도 걱정하지 마세요! 여기서 중요한 점은 W&B의 유연성을 보여주는 것입니다. 여기에 프로젝트가 있습니다.

그림 5. 내가 만든 W&B 차트 대시보드.
이미지가 주어지면, 참가자는 이미지 안에서 해당 장기의 특정 부위를 분할하는 AI 시스템을 구축해야 합니다. 여기서는 시간에 따라 지표 값을 기록합니다. 이러한 인터랙티브 플롯을 생성하는 데 필요한 코드는 아래에 표시되어 있습니다.
run.log({"mean_loss": np.mean(train_losses),"sum_loss": np.sum(train_losses),"val_mean_loss": np.mean(val_losses),"val_sum_loss": np.sum(val_losses),"val_mean_dice_coeff": np.mean(dice_coeffs),"lr": lr})
끝입니다! 제 Python 스크립트에 이 간단한 설정만으로 모델 성능을 추적하고 모니터링할 수 있는 다양한 인터랙티브 선형 플롯이 생성되었습니다.

그림 6. 내가 만든 W&B 테이블 대시보드.
나는 …을(를) 만들었다 W&B 테이블 모델의 최악 예측을 기록하기 위한 객체입니다. 이 테이블에는 네 가지 항목을 기록했습니다: 지표의 실수 값, 입력 이미지, AI의 예측 이미지, 그리고 해당 입력 이미지에 대응하는 정답(ground truth)입니다. 이런 이미지들은 어떻게 저장될까요? 텐서로 저장됩니다!
W&B를 머신러닝 워크플로에 통합하면, 다양한 형태의 미디어를 자주 로깅하게 됩니다. 이러한 미디어 대부분은 텐서 형식으로 구성됩니다.
실전 텐서 예시
다음 W&B 리포트들은 머신러닝의 다양한 주제를 다루며, 텐서를 W&B 워크플로에 통합하는 방법을 보여줍니다.
The Science of Debugging with Weights & Biases Reports
In this article, we look at how Latent Space uses Weights & Biases Reports to identify issues and debug models quickly.
Interpretability in Deep Learning With Weights & Biases: CAM and Grad-CAM
This article reviews how Grad-CAM counters the common criticism that neural networks are not interpretable.
Adversarial Policies in Multi-Agent Settings
This article explores a range of adversarial examples in multi-agent settings, demonstrating how adversarial policies can win reliably without even playing the game.
Understanding the Effectivity of Ensembles in Deep Learning
In this article, we dissect ensembles in order to provide different insights that are useful for understanding the dynamics of deep neural networks in general.
결론
이 보고서에서는 텐서의 정의를 차근차근 살펴보았습니다. 수학적 배경을 간략히 언급하고, 주로 머신러닝 관점에 초점을 맞췄습니다. 몇 가지 코드 예제를 통해 W&B에서 텐서를 다루는 방법을 보여드렸습니다. 마지막으로, 텐서에 대한 추가 맥락을 제공하기 위해 예시 리포트(위)와 추천 읽을거리(아래)를 함께 제공했습니다. 이 글이 저에게 그랬던 만큼 여러분께도 많은 도움이 되었기를 바랍니다. 감사합니다!
추천 읽을거리
Add a comment