01wk: torch (1)

Author

최규빈

Published

March 9, 2026

1. 강의영상

2. 코랩

- 코랩은 코드와 텍스트를 같이 볼 수 있는 형태로 이루어져 있음.

  • 코드셀은 파이썬 명령어를 실행할 수 있고 코드의 결과를 확인할 수 있음.
  • 텍스트셀은 글/수식/표/그림 등을 활용한 문서를 작성할 수 있음. (워드랑 같은 역할을 한다고 생각하면 된다.)

- 코랩은 코드+결과물을 출력하는 조각, 워드조각이 혼합이 되어서 나오는 형태임 –> 가독성이 뛰어나서 강의노트를 작성하기 적합함.

3. 필요한 지식

- 선형대수학

  • 벡터와 행렬
  • 행렬의 곱셈
  • 트랜스포즈 (전치행렬)

- 기초통계학(확률의 개념 및 응용, 통계적추론)

  • 정규분포, 이항분포
  • 모수, 추정
  • \(X_i \overset{i.i.d.}{\sim} N(0,1)\)

- 회귀분석

  • 반응변수(\(y\)), 설명변수(\(X\))
  • \({\bf y}={\bf X}{\boldsymbol \beta} + {\boldsymbol \epsilon}\)

- 파이썬

  • 파이썬기본문법
  • 넘파이
  • 전반적인 클래스 지식 (__init__, self, …)
  • 상속

4. 벡터와 행렬

- 레벨테스트 (2026년3월9일)

- 레벨테스트 결과 실력이 부족하다고 생각되면, 아래의 링크로 가서 보충수업을 들어보세요. (40분정도)

5. torch

torchnumpy처럼 파이썬에서 벡터/행렬연산을 쉽게 수행할 수 있도록 도와주는 툴이다.

import torch

A. list vs torch.tensor

- 선언

l = [1,2,3]
l
[1, 2, 3]
a = torch.tensor([1,2,3])
a
tensor([1, 2, 3])

- 기본연산

a+a
tensor([2, 4, 6])
l+l
[1, 2, 3, 1, 2, 3]
3*a
tensor([3, 6, 9])
3*l
[1, 2, 3, 1, 2, 3, 1, 2, 3]
a+2
tensor([3, 4, 5])
l+2
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/tmp/ipykernel_3997/384152985.py in <cell line: 0>()
----> 1 l+2

TypeError: can only concatenate list (not "int") to list

벡터의 느낌이 나는것은 [1,2,3]이 아니라 torch.tensor([1,2,3]) 임.

- 수학연산

a = torch.tensor([1,2,3])
a
tensor([1, 2, 3])
torch.exp(a)
tensor([ 2.7183,  7.3891, 20.0855])
torch.sqrt(a)
tensor([1.0000, 1.4142, 1.7321])
torch.log(a)
tensor([0.0000, 0.6931, 1.0986])

B. 인덱싱

- 선언

l = [11, 22, 33, 44, 55, 66]
a = torch.tensor(l)

- 인덱스로 원소를 뽑아보자.

l[0],l[1],l[2],l[3],l[4],l[5]
(11, 22, 33, 44, 55, 66)
l[-1],l[-2],l[-3],l[-4],l[-5],l[-6]
(66, 55, 44, 33, 22, 11)
a[0],a[1],a[2],a[3],a[4],a[5]
(tensor(11), tensor(22), tensor(33), tensor(44), tensor(55), tensor(66))
a[-1],a[-2],a[-3],a[-4],a[-5],a[-6]
(tensor(66), tensor(55), tensor(44), tensor(33), tensor(22), tensor(11))

- :이용 (슬라이싱)

l[2:4]
[33, 44]
  • 이런느낌임.. \(2 \leq ... < 4\)
a[2:4] # a[2]부터 a[4]까지인데, 끝점은 제외
tensor([33, 44])
l[2:] # l[2]부터 끝까지
[33, 44, 55, 66]
a[2:] # a[2]부터 끝까지
tensor([33, 44, 55, 66])
l[:4] # 처음부터 l[3]까지
[11, 22, 33, 44]
a[:4] # 처음부터 a[3]까지
tensor([11, 22, 33, 44])
l[:]
[11, 22, 33, 44, 55, 66]
a[:]
tensor([11, 22, 33, 44, 55, 66])

- 인덱스의 리스트로 원소를 뽑기

a[[1,3,4]]
tensor([22, 44, 55])
l[[1,3,4]]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/tmp/ipykernel_3997/2588203874.py in <cell line: 0>()
----> 1 l[[1,3,4]]

TypeError: list indices must be integers or slices, not list

C. 2차원배열

- 중첩된 배열의 선언

l = [[1,2,3,4],[-1,-2,-3,-4],[5,6,7,8],[-5,-6,-7,-8]]
a = torch.tensor(l)
l
[[1, 2, 3, 4], [-1, -2, -3, -4], [5, 6, 7, 8], [-5, -6, -7, -8]]
a # 매트릭스처럼 보였지만, 사실 이것도 중첩된 배열임
tensor([[ 1,  2,  3,  4],
        [-1, -2, -3, -4],
        [ 5,  6,  7,  8],
        [-5, -6, -7, -8]])

- l의 원소를 인덱싱해보자.

l[0][0]
1
l[0][1]
2
l[1][2]
-3
l[-1][0]
-5

- a의 원소를 인덱싱해보자.

a
tensor([[ 1,  2,  3,  4],
        [-1, -2, -3, -4],
        [ 5,  6,  7,  8],
        [-5, -6, -7, -8]])
a[0][0]
tensor(1)
a[0][1]
tensor(2)
a[1][2]
tensor(-3)
a[-1][0]
tensor(-5)

- 새로운 기능 (l에서는 안되고 a에서만 가능함)

a[0,0]
tensor(1)
a[0,1]
tensor(2)
a[1,2]
tensor(-3)
a[-1,0]
tensor(-5)

- 응용

a
tensor([[ 1,  2,  3,  4],
        [-1, -2, -3, -4],
        [ 5,  6,  7,  8],
        [-5, -6, -7, -8]])
a[:,:]
tensor([[ 1,  2,  3,  4],
        [-1, -2, -3, -4],
        [ 5,  6,  7,  8],
        [-5, -6, -7, -8]])
a[:,[0,2]]
tensor([[ 1,  3],
        [-1, -3],
        [ 5,  7],
        [-5, -7]])
a[:2,[0,2,3]]
tensor([[ 1,  3,  4],
        [-1, -3, -4]])

정리: 1차원 배열을 의미하는 리스트를 텐서화하면, 그 결과는 거의 벡터처럼 취급해도 무방하다. 그리고 2차원 배열을 의미하는 (중첩된)리스트를 텐서화하면, 그 결과는 거의 행렬처럼 취급해도 무방하다.

D. torch를 이용한 행렬연산

- torch를 이용한 행렬곱

a = torch.tensor([[1,2],[3,4]])
a
tensor([[1, 2],
        [3, 4]])
b = torch.tensor([[2,-1],[4,-3]])
b
tensor([[ 2, -1],
        [ 4, -3]])
a @ b
tensor([[ 10,  -7],
        [ 22, -15]])

# 이상한 예제

a = torch.tensor([[1,2],[3,4]])
b = torch.tensor([[2,-1],[1/2,-3]])
a@b
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
/tmp/ipykernel_3997/1067337049.py in <cell line: 0>()
----> 1 a@b

RuntimeError: expected m1 and m2 to have the same dtype, but got: long int != float

해결책?

a = torch.tensor([[1.0 ,2.0],[3.0, 4.0]])
b = torch.tensor([[2.0,-1.0],[1/2,-3.0]])
a@b
tensor([[  3.,  -7.],
        [  8., -15.]])

#

# 역행렬 – 역행렬을 구하라..

a = torch.tensor([[1,2],[3,4]])
a
tensor([[1, 2],
        [3, 4]])
torch.linalg.inv(a)
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
/tmp/ipykernel_3997/4217229845.py in <cell line: 0>()
----> 1 torch.linalg.inv(a)

RuntimeError: linalg.inv: Expected a floating point or complex tensor as input. Got Long

해결책1

a = torch.tensor([[1.0,2.0],[3.0,4.0]])
a
tensor([[1., 2.],
        [3., 4.]])
torch.linalg.inv(a)
tensor([[-2.0000,  1.0000],
        [ 1.5000, -0.5000]])

해결책2

a = torch.tensor([[1.0,2],[3,4]])
a
tensor([[1., 2.],
        [3., 4.]])
torch.linalg.inv(a)
tensor([[-2.0000,  1.0000],
        [ 1.5000, -0.5000]])

해결책3

a = torch.tensor([[1,2],[3,4]])
a
tensor([[1, 2],
        [3, 4]])
a.float()
tensor([[1., 2.],
        [3., 4.]])
torch.linalg.inv(a.float())
tensor([[-2.0000,  1.0000],
        [ 1.5000, -0.5000]])

#

# 연립1차방정식 – 아래의 연립방정식을 풀어라.

\[\begin{cases} w+2x+3y+4z = 1 \\ 2w+2x+y = 9 \\ x-y=4 \\ 3w+x-y+3z = 7 \end{cases}\]

행렬을 이용하여 위의식을 표현하면 아래와 같다.

\[\begin{bmatrix} 1 & 2 & 3 & 4 \\ 2 & 2 & 1 & 0 \\ 0 & 1 & -1 & 0 \\ 3 & 1 & -1 & 3 \end{bmatrix}\begin{bmatrix} w \\ x \\ y \\ z \end{bmatrix} = \begin{bmatrix} 1 \\ 9 \\ 4 \\ 7 \end{bmatrix} \]

a = torch.tensor([[1,2,3,4],[2,2,1,0],[0,1,-1,0],[3,1,-1,3]]).float()
b = torch.tensor([[1],[9],[4],[7]]).float()
torch.linalg.inv(a) @ b
tensor([[ 2.0000],
        [ 3.0000],
        [-1.0000],
        [-1.0000]])

#