
파이토치(PyTorch)를 이용한 딥러닝 모델 설계의 첫 단추는 텐서(Tensor) 생성입니다. 단순히 텐서를 만드는 것을 넘어, 각 함수의 통계적 특성과 메모리 할당 방식을 이해하는 것은 모델의 초기 수렴 속도와 성능에 결정적인 영향을 미칩니다. 본 포스팅에서는 rand, randn, zeros, ones의 명확한 차이점을 분석하고 실무적인 활용 팁을 공유합니다.
1. 텐서 초기화의 중요성: 왜 함수를 구분해야 하는가?
딥러닝 모델의 가중치(Weight)를 어떻게 초기화하느냐에 따라 Gradient Vanishing(기울기 소실)이나 Exploding(폭주) 문제가 발생할 수 있습니다. 예를 들어, 모든 가중치를 ones나 zeros로 설정하면 대칭성(Symmetry) 문제로 인해 뉴런들이 서로 다른 특징을 학습하지 못하게 됩니다. 반면, randn은 정규 분포를 따르므로 가중치 초기화에 가장 빈번하게 사용됩니다.
2. 주요 생성 함수 비교 및 요약
각 함수가 생성하는 데이터의 분포와 범위를 한눈에 비교할 수 있도록 정리하였습니다. 이 표는 실무에서 어떤 함수를 선택할지 결정하는 기준이 됩니다.
| 함수명 | 데이터 분포 (Distribution) | 값의 범위 (Range) | 주요 용도 |
|---|---|---|---|
torch.rand() |
균등 분포 (Uniform) | [0, 1) | 확률값 모사, 노이즈 추가 |
torch.randn() |
표준 정규 분포 (Normal) | 평균 0, 표준편차 1 (무한대) | 가중치 초기화 (Xavier, He 등) |
torch.zeros() |
상수 (Zero) | 0 | 편향(Bias) 초기화, 누적값 저장 |
torch.ones() |
상수 (One) | 1 | 마스킹 연산, 스케일링 인자 |
3. 실무 중심의 Sample Examples (7가지 활용 사례)
단순한 문법을 넘어, 실제 파이토치 프로젝트와 연구 환경에서 바로 적용 가능한 코드 예제입니다.
Example 1: 가중치 초기화(Weight Initialization)에서의 randn 활용
선형 레이어의 가중치를 정규분포로 초기화하여 학습의 시작점을 최적화합니다.
import torch
# 가중치(Weights)는 정규분포, 편향(Bias)은 0으로 초기화
weights = torch.randn(784, 256) * 0.01 # 작은 표준편차 적용
bias = torch.zeros(256)
print(f"Weights Mean: {weights.mean():.4f}, Std: {weights.std():.4f}")
Example 2: Dropout 레이어 모사를 위한 rand 활용
특정 확률 이하의 값을 0으로 만드는 커스텀 드롭아웃 로직을 구현할 때 유용합니다.
p = 0.5
input_tensor = torch.ones(10)
mask = (torch.rand(10) > p).float() # 0 또는 1의 마스크 생성
output = input_tensor * mask
print(f"Masked Output: {output}")
Example 3: 더미 데이터 입력을 통한 모델 구조 검증
모델을 정의한 후 입력 텐서의 크기가 맞는지 확인하기 위해 randn을 사용합니다.
# (Batch Size, Channels, Height, Width)
dummy_input = torch.randn(1, 3, 224, 224)
# model = MyCNN()
# output = model(dummy_input)
print(f"Input Shape: {dummy_input.shape}")
Example 4: zeros_like와 ones_like를 활용한 장치(Device) 일치
기존 텐서와 동일한 dtype 및 device(CPU/GPU)를 가진 텐서를 생성하는 효율적인 방법입니다.
target = torch.randn(3, 3).to('cuda' if torch.cuda.is_available() else 'cpu')
# target과 동일한 위치(GPU)에 0으로 채워진 텐서 생성
buffer = torch.zeros_like(target)
print(f"Buffer Device: {buffer.device}")
Example 5: 특정 값으로 채워진 텐서 생성 (full의 대안)
ones에 상수를 곱하여 특정 값(예: 무한대 마스킹)으로 채워진 텐서를 만듭니다.
# Attention 메커니즘에서 Masking 시 -inf 값 부여
mask_value = -1e9
mask = torch.ones(5, 5) * mask_value
print(mask)
Example 6: 원-핫 인코딩(One-Hot Encoding) 준비
먼저 zeros로 도화지를 만들고 특정 인덱스만 1로 채우는 방식입니다.
num_classes = 10
batch_size = 4
labels = torch.tensor([2, 5, 0, 9])
one_hot = torch.zeros(batch_size, num_classes)
one_hot.scatter_(1, labels.unsqueeze(1), 1.0)
print(f"One-hot labels:\n{one_hot}")
Example 7: 학습 루프 내 손실(Loss) 합계 계산
스칼라 텐서를 0으로 초기화하여 매 에포크마다 손실값을 누적합니다.
running_loss = torch.zeros(1) # 또는 torch.tensor(0.0)
# 가상의 루프
for i in range(10):
loss = torch.rand(1) # 가상의 손실값
running_loss += loss.item()
print(f"Total Epoch Loss: {running_loss.item()}")
4. 성능 및 메모리 최적화를 위한 팁
실무에서는 텐서 생성 시 dtype을 명시하는 습관이 중요합니다. 기본적으로 파이토치는 float32를 사용하지만, 정밀도가 낮은 float16(Half Precision)이나 정수형인 long을 사용해야 할 때가 있습니다. 또한, requires_grad=True 옵션을 통해 생성과 동시에 연산 그래프에 포함시킬지 여부를 결정할 수 있습니다.
내용 출처 및 참고 문헌:
- PyTorch Official Documentation:
torch.creationops (v2.1 기준) - Deep Learning with PyTorch (Eli Stevens, Luca Antiga, Thomas Viehmann)
- CS231n: Convolutional Neural Networks for Visual Recognition (Stanford University)
'Artificial Intelligence > 21. PyTorch' 카테고리의 다른 글
| [PYTORCH] 스칼라 텐서를 파이썬 숫자로 변환하는 필수 방법 `item()` : 실무 해결 가이드 7가지 (0) | 2026.04.05 |
|---|---|
| [PYTORCH] 텐서 슬라이싱 메모리 공유 문제 해결 및 효율적인 복사 방법 3가지 (0) | 2026.04.05 |
| [PYTORCH] Inplace 연산 add_ 사용 시 주의해야 할 3가지 이유와 해결 방법 (0) | 2026.04.05 |
| [PYTORCH] 브로드캐스팅(Broadcasting) 규칙 3가지와 차원 불일치 해결 방법 (0) | 2026.04.05 |
| [PYTORCH] torch.chunk()와 torch.split()의 치명적 차이점 2가지와 효율적 해결 방법 7가지 (0) | 2026.04.05 |