본문 바로가기
Artificial Intelligence/21. PyTorch

[PYTORCH] rand, randn, zeros, ones 텐서 생성 함수 4가지 차이와 효율적 사용 방법

by Papa Martino V 2026. 4. 5.
728x90

rand, randn, zeros, ones 텐서 생성 함수
rand, randn, zeros, ones 텐서 생성 함수

 

파이토치(PyTorch)를 이용한 딥러닝 모델 설계의 첫 단추는 텐서(Tensor) 생성입니다. 단순히 텐서를 만드는 것을 넘어, 각 함수의 통계적 특성과 메모리 할당 방식을 이해하는 것은 모델의 초기 수렴 속도와 성능에 결정적인 영향을 미칩니다. 본 포스팅에서는 rand, randn, zeros, ones의 명확한 차이점을 분석하고 실무적인 활용 팁을 공유합니다.

1. 텐서 초기화의 중요성: 왜 함수를 구분해야 하는가?

딥러닝 모델의 가중치(Weight)를 어떻게 초기화하느냐에 따라 Gradient Vanishing(기울기 소실)이나 Exploding(폭주) 문제가 발생할 수 있습니다. 예를 들어, 모든 가중치를 oneszeros로 설정하면 대칭성(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_likeones_like를 활용한 장치(Device) 일치

기존 텐서와 동일한 dtypedevice(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.creation ops (v2.1 기준)
  • Deep Learning with PyTorch (Eli Stevens, Luca Antiga, Thomas Viehmann)
  • CS231n: Convolutional Neural Networks for Visual Recognition (Stanford University)
728x90