๋ณธ ๊ธ€์€ ์ œ๊ฐ€ PyTorch Turotial์˜ autograd ๋ถ€๋ถ„์„ ์ฝ๊ณ  ์ดํ•ด๊ฐ€ ์•ˆ ๋˜๋Š” ๋ถ€๋ถ„์„ ๋ณด์ถฉํ•˜๊ธฐ ์œ„ํ•ด ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ง€์ ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค :)

11 minute read

๋ณธ ๊ธ€์€ ์ œ๊ฐ€ PyTorch Turotial์˜ autograd ๋ถ€๋ถ„์„ ์ฝ๊ณ  ์ดํ•ด๊ฐ€ ์•ˆ ๋˜๋Š” ๋ถ€๋ถ„์„ ๋ณด์ถฉํ•˜๊ธฐ ์œ„ํ•ด ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. ์ง€์ ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค :)

์ฝ๊ธฐ์ž๋ฃŒ:
PyTorch Tutorials - AUTOGRAD: AUTOMATIC DIFFERENTIATION


autograd์€ ๋”ฅ๋Ÿฌ๋‹์˜ Backpropagation์„ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•œ PyTorch์˜ ํ•˜๋ถ€ ํŒจํ‚ค์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Backpropagation์— ๋Œ€ํ•ด ๋จผ์ € ์ˆ™์ง€ํ•˜๊ณ  ๋ณธ ๊ธ€์„ ์ฝ์œผ์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Backpropagation์€ ๊ฐ ๋‰ด๋Ÿฐ์˜ ๊ฐ€์ค‘์น˜weight๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ทธ ์—…๋ฐ์ดํŠธ ๊ณผ์ •์€ ์ถœ๋ ฅ์ธต์—์„œ ์ž…๋ ฅ์ธต ์ˆœ์„œ๋กœ ์ง„ํ–‰๋œ๋‹ค.

autograd๋ž€?

autograd๋Š” PyTorch์—์„œ Backpropagation์„ ์ˆ˜ํ–‰ํ•˜๋Š” PyTorch์˜ ํ•˜๋ถ€ ํŒจํ‚ค์ง€์ด๋‹ค. Backpropagation์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„  ๋‰ด๋Ÿฐ์—์„œ ํ–‰ํ•ด์ง€๋Š” ์—ฐ์‚ฐ์— ๋Œ€ํ•œ Gradient๋ฏธ๋ถ„๊ฐ’๋ฅผ ๊ตฌํ•ด์•ผ ํ•œ๋‹ค. autograd๋Š” ํ…์„œ ๊ฐ์ฒด์˜ ๋ณ€์ˆ˜ grad์— Gradient ๊ฐ’์„ ๋‹ด์•„์ค€๋‹ค.

์š”์•ฝ: autograd๋Š” ํ…์„œ์˜ ์—ฐ์‚ฐ์— ๋Œ€ํ•ด ์ž๋™์œผ๋กœ Gradient ๊ฐ’์„ ๊ตฌํ•ด์ฃผ๋Š” ํŒจํ‚ค์ง€์ด๋‹ค.

ํ…์„œ ๊ฐ์ฒด์™€ autograd

ํ…์„œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ requires_grad ์˜ต์…˜์„ True๋กœ ์„ค์ •ํ•˜๋ฉด, ์•ž์œผ๋กœ ๊ทธ ํ…์„œ์— ํ–‰ํ•ด์ง€๋Š” ๋ชจ๋“  ์—ฐ์‚ฐ์„ ์ถ”์ ํ•˜๊ณ  ๊ทธ์— ๋Œ€ํ•œ Gradient๋ฅผ ๊ณ„์‚ฐํ•ด์ค€๋‹ค.

requires_grad ์˜ต์…˜์„ True๋กœ ํ•˜๊ณ  ํ…์„œ x๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์•˜๋‹ค.

x = torch.ones(2, 2, requires_grad=True)

ํ…์„œ x์— ๋ง์…ˆ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ…์„œ y๋ฅผ ๋งŒ๋“ ๋‹ค.

y = x + 2

out

tensor([[3., 3.],
        [3., 3.]], grad_fn=<AddBackward0>)

ํ…์„œ y๋Š” grad_fn์ด๋ผ๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. grad_fn์€ ํ•ด๋‹น ํ…์„œ ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค ์—ฐ์‚ฐ์œผ๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€๋ฅผ ์•Œ๋ ค์ค€๋‹ค.

๋‹จ, ํ…์„œ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ํ…์„œ์—์„œ ์—ฐ์‚ฐ์„ ํ†ตํ•ด ์ƒ์„ฑ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ torch.ones()๋‚˜ torch.rand()์™€ ๊ฐ™์ด ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ํ…์„œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฝ์šฐ๋Š” grad_fn ๊ฐ’์ด none์ด๋‹ค.

์—ฐ์‚ฐ์„ ๋” ์‚ฌ์šฉํ•ด์„œ ํ…์„œ ๊ฐ์ฒด๋ฅผ ๋” ๋งŒ๋“ค์–ด๋ณด์ž.

z = y * y * 3
out = z.mean()

out

tensor([[27., 27.],
        [27., 27.]], grad_fn=<MulBackward0>)
tensor(27., grad_fn=<MeanBackward0>)

Gradient

Backpropagation์„ ํ•˜๊ธฐ ์œ„ํ•ด์„  ํ…์„œ ๊ฐ์ฒด์—์„œ backward() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

out.backward()

๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ฒฐ๊ณผ์ธ Gradient ๊ฐ’์€ ํ…์„œ ๊ฐ์ฒด์˜ grad์— ๋‹ด๊ธด๋‹ค.

print(x.grad)

out

tensor([[4.5000, 4.5000],
        [4.5000, 4.5000]])

์ด๋•Œ, x.grad์˜ ๊ฐ’์€ d(out)/dx์— ๋Œ€ํ•œ ๊ฐ’์ด๋‹ค.


๊ฒฐ๊ณผ๋ฅผ ์‹ ๊ฒฝ๋ง์˜ ๊ด€์ ์—์„œ ํ•ด์„ํ•ด๋ณด์ž.

์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ์—ฐ์‚ฐ(*, +, mean())์œผ๋กœ ํ…์„œ x, y, z, out์„ ๋งŒ๋“  ๊ณผ์ •์€ ์ผ์ข…์˜ Loss functionLoss function์„ ๋งŒ๋“  ๊ฒƒ์ด๋‹ค.

์ฒ˜์Œ์— ๋งŒ๋“  ํ…์„œ x๋Š” ๊ฐ€์ค‘์น˜์ด๋‹ค. ์ง์ ‘ ๋งŒ๋“  ํ…์„œ ๊ฐ์ฒด์—๋Š” grad_fn ๊ฐ’์ด ์—†๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ๊ฐ€์ค‘์น˜ ์ž์ฒด๋Š” ์–ด๋–ค ์—ฐ์‚ฐ์œผ๋กœ๋ถ€ํ„ฐ ์œ ๋„๋œ ๊ฐ’์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— grad_fn์ด ์—†๋Š” ๊ฒƒ์ด ๋‹น์—ฐํ•˜๋‹ค.

out์€ Loss function์˜ ๊ฐ’ ์ž์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. Backpropagation์€ โ€œ๊ฐ ๋‰ด๋Ÿฐ์ธต์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐฑ์‹ ํ•ด์ฃผ๋Š” ์ž‘์—…โ€์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ณผ์ •์—์„œ Gradient ๊ฐ’์ด ์‚ฌ์šฉ๋œ๋‹ค. Gradient ๊ฐ’์€ ๊ฐ€์ค‘์น˜์— ํ•ด๋‹นํ•˜๋Š” ํ…์„œ ๊ฐ์ฒด์˜ grad์— ๋‹ด๊ฒจ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋งˆ์ง€๋ง‰์— out.backward()๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , x.grad ๊ฐ’์„ ํ™•์ธํ•˜์˜€๋‹ค. x.grad๋Š” d(out)/dx ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค.

$$w\leftarrow w-\eta \nabla _{ w }Loss\left( w \right)$$

GDGradient Descent์—์„œ๋Š” d(Loss)/dw๋ฅผ ๊ตฌํ•˜์—ฌ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์–ป์€ x.grad(=d(out)/dx)๊ฐ€ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” d(Loss)/dw์ธ ๊ฒƒ์ด๋‹ค.


autograd ํŒจํ‚ค์ง€๋ฅผ define-by-run์‹คํ–‰์‹œ์ ์— ์ •์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๊ณ  ์„ค๋ช…์„ ํ•œ๋‹ค. ์ด๊ฒƒ์€ Backpropagation์ด ์ •์ ์œผ๋กœ, ํ•˜๋‚˜์˜ ํ˜•ํƒœ๋กœ ๊ณ ์ •๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ python ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ์— ๋™์ ์œผ๋กœ ์ •์˜๋˜๊ณ , ๊ทธ์— ๋”ฐ๋ผ Backpropgation์˜ ํ˜•ํƒœ๊ฐ€ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

autograd ํŒจํ‚ค์ง€์˜ ์ฝ˜์…‰ํŠธ์„ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ํŽธ๋ฆฌํ•œ(?) Backpropagation์„ ์ œ๊ณต
  • backward()์„ ํ˜ธ์ถœํ•˜๋ฉด, Gradient๋ฅผ ์ž๋™์œผ๋กœ ๊ณ„์‚ฐ
  • grad_fn์„ ํ†ตํ•ด์„œ ์—ฐ์‚ฐ์„ ์ถ”์ ํ•˜๊ณ  ๊ธฐ๋ก

(๋ฒˆ์™ธ) autograd์™€ vector-Jacobian Product

PyTorch Tutorial์—์„œ๋Š” vector-Jacobian Product(VJP)๋ฅผ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ๋‹ค.

$$ J = \begin{pmatrix} \cfrac { \partial { y }_{ 1 } }{ \partial { x }_{ 1 } } & \cdots & \cfrac { \partial { y }_{ 1 } }{ \partial { x }_{ n } } \\ \vdots & \ddots & \vdots \\ \cfrac { \partial { y }_{ n } }{ \partial { x }_{ 1 } } & \cdots & \cfrac { \partial { y }_{ n } }{ \partial { x }_{ n } } \end{pmatrix} $$

Jacobian $J$๋Š” vector-valued function1์˜ Gradient๋ฅผ ํ‘œํ˜„ํ•œ ํ–‰๋ ฌ์ด๋‹ค.

์ด๋ฒˆ์—” ๋ฒกํ„ฐ $\vec { y }$๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๊ฐ–๋Š” ์Šค์นผ๋ผ ํ•จ์ˆ˜ $L = g\left( \vec { y } \right)$๋ฅผ ์‚ดํŽด๋ณด์ž. ํ•จ์ˆ˜ $L$์˜ $\vec { y }$์— ๋Œ€ํ•œ Gradient์ธ ๋ฒกํ„ฐ $\vec { v }$๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

$$\vec { v } = { \left( \cfrac { \partial L }{ \partial { y }_{ 1 } } , ..., \cfrac { \partial L }{ \partial { y }_{ n } } \right) }^{ T }$$

์ด์ œ ๋ฒกํ„ฐ $\vec { v }$์™€ Jacobian $J$๋ฅผ ๊ณฑํ•  ๊ฒƒ์ด๋‹ค. ์ด๋•Œ, $J$๋Š” ๋ฒกํ„ฐ $\vec { y }$์˜ ๋ฒกํ„ฐ $\vec { x }$์— ๋Œ€ํ•œ Gradient์ด๋‹ค. ๊ฒฐ๊ณผ๋Š” Chain Rule์— ์˜ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 2

$${ J }^{ T }\cdot v = \begin{pmatrix} \cfrac { \partial { y }_{ 1 } }{ \partial { x }_{ 1 } } & \cdots & \cfrac { \partial { y }_{ n } }{ \partial { x }_{ n } } \\ \vdots & \ddots & \vdots \\ \cfrac { \partial { y }_{ 1 } }{ \partial { x }_{ n } } & \cdots & \cfrac { \partial { y }_{ n } }{ \partial { x }_{ n } } \end{pmatrix}\begin{pmatrix} \cfrac { \partial L }{ \partial { y }_{ 1 } } \\ \vdots \\ \cfrac { \partial L }{ \partial { y }_{ n } } \end{pmatrix}=\begin{pmatrix} \cfrac { \partial L }{ \partial { x }_{ 1 } } \\ \vdots \\ \cfrac { \partial L }{ \partial { x }_{ n } } \end{pmatrix}$$

์ด์ œ vector-Jacobian Product๊ฐ€ PyTorch์™€ ๋ฌด์Šจ ๊ด€๋ จ์ด ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

์œ„์˜ ์ˆ˜์‹์—์„œ $\vec { x }$๋ฅผ ๊ฐ€์ค‘์น˜๋กœ, $L$์„ Loss function์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ฐ€์ค‘์น˜ $\vec { x }$๋Š” ์–ด๋–ค ์—ฐ์‚ฐ๋“ค(=ํ•จ์ˆ˜ $f$)์„ ๊ฑฐ์ณ์„œ ๋ฒกํ„ฐ $\vec { y }$๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฒกํ„ฐ $\vec { y }$๋Š” ๋˜ ์–ด๋–ค ์—ฐ์‚ฐ(=ํ•จ์ˆ˜ $g$)๋ฅผ ๊ฑฐ์ณ์„œ Loss function $L$์„ ๋งŒ๋“ ๋‹ค.

๋ฒกํ„ฐ $\vec { v }$๋Š” Loss $L$์˜ $\vec { y }$์— ๋Œ€ํ•œ Gradient์ธ๋ฐ, $\vec { v }$๋Š” grad_tensor๋กœ backward() ํ•จ์ˆ˜์— ์ธ์ž๋กœ ์ „๋‹ฌ๋œ๋‹ค.3 (๋ฒกํ„ฐ $\vec { v }$๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ด์œ ๋Š” ์›๋ž˜๋Š” L.backward()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ตฌํ–ˆ์–ด์•ผ ํ•  $\nabla_{\vec{ y }} {L}$๋ฅผ $\vec{ v }$๋กœ ๋Œ€์ฒดํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)

์ด์ œ PyTorch Tutorial์— ์ œ์‹œ๋œ ์ฝ”๋“œ๋ฅผ ์•ฝ๊ฐ„ ๋ณ€ํ˜•ํ•˜์—ฌ ์‚ดํŽด๋ณด์ž.

x = torch.randn(3, requires_grad=True)

y = x * 2

v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)

print(x.grad)
out
tensor([1.0240e+02, 1.0240e+03, 1.0240e-01])

4

non-scalar function์ธ y์— ๋Œ€ํ•œ Gradient๋ฅผ ๊ตฌํ•˜๋ ค๋ฉด vector-Jacobian Product๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ณ , VJP๋ฅผ ํ•˜๋ ค๋ฉด ๋ฒกํ„ฐ $\vec {v}$๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋ฒกํ„ฐ v๋ฅผ ์ƒ์„ฑํ•œ ํ›„, backward() ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์˜€๋‹ค.

๊ฒฐ๋ก ์€ โ€œautograd๋Š” backward()๊ฐ€ ์‹คํ–‰๋  ๋•Œ, ๋‚ด๋ถ€์ ์œผ๋กœ vector-Jacobian Product๋ฅผ ํ†ตํ•ด Gradient๋ฅผ ๊ตฌํ•œ๋‹คโ€๋Š” ๊ฒƒ์ด๋‹ค.

Tips

  • ๋งŒ์•ฝ backward() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ , x.grad์— ์ ‘๊ทผํ•œ๋‹ค๋ฉด, None์ด ๋ฆฌํ„ด๋œ๋‹ค.
  • non-scalar function์ธ y์—์„œ backward()๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, grad_tensor ์—†์ด y.backward()ํ•˜๊ฒŒ ๋˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • .grad์—์„œ ์ฃผ์˜ํ•  ์ ์€ ๊ณ„์‚ฐ ๊ทธ๋ž˜ํ”„์—์„œ leaf node์— ํ•ด๋‹นํ•˜๋Š” ํ…์„œ์˜ .grad ๊ฐ’์—๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ non-leaf node ํ…์„œ์˜ .grad์— ์ ‘๊ทผํ•˜๋ ค ํ•œ๋‹ค๋ฉด, backward() ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ „์— .retain_grad() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์ž!
    • ์œ„ ๋ฐฉ๋ฒ•์œผ๋กœ ํ…์„œ z์˜ grad๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด, z.grad๋Š” d(out)/dz๊ฐ€ ๋œ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ


  1. vector-valued function $\vec { y } =f\left( \vec { x } \right)$์€ ๋ฒกํ„ฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ด๋•Œ, ์ž…๋ ฅ์ด ๋ฒกํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ $\vec { y }$๋Š” ๋‹ค๋ณ€์ˆ˜ ํ•จ์ˆ˜์ด๋‹ค. ๋‹ค๋ณ€์ˆ˜ ํ•จ์ˆ˜์˜ Gradient๋Š” Jacobian $J$ ๊ฐ™์€ ํ–‰๋ ฌ์˜ ๊ผด๋กœ ํ‘œํ˜„๋œ๋‹ค.ย 

  2. ์ด๋ฆ„์€ โ€œvector-Jacobianโ€์ธ๋ฐ ${ J }^{ T }\cdot v$๋ฅผ ํ•œ ์ด์œ ๋Š” ${ v }^{ T }\cdot J$๊ฐ€ row vector๋ฅผ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. column vector๋ฅผ ์ทจํ•ด์•ผ ๋˜๋‹ค๋ฅธ Jacobian $J_2$์„ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ${ J_1 }^{ T }\cdot v$ ๊ฒฐ๊ณผ ์•ž์— ์”Œ์šธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ${ J_2 }^{ T }\cdot \left( { J_1 }^{ T }\cdot v \right)$ย 

  3. ์•ž์—์„œ๋Š” backward() ํ•จ์ˆ˜์— ์ธ์ž๋ฅผ ๋„ฃ์ง€ ์•Š์•˜์Œ์— ์ฃผ๋ชฉํ•˜๋ผ. ๊ทธ ๊ฒฝ์šฐ๋Š” out์ด scalar function์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ non-scalar function์—์„œ backward()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด, grad_tensor๋ผ๋Š” ์ธ์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค!ย 

  4. x๋ฅผ randn()์œผ๋กœ ์ƒ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— output ๊ฐ’์€ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.ย 

  5. Variable์ด๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ์–ธ๊ธ‰๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Variable ํด๋ž˜์Šค๋Š” ์ง€์›์ด ์ค‘๋‹จ๋œ ํด๋ž˜์Šค๋กœ 2020๋…„ 9์›” ๊ธฐ์ค€์œผ๋กœ๋Š” ๋”์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.link Variable์„ Tensor ํด๋ž˜์Šค๋กœ ์น˜ํ™˜ํ•˜์—ฌ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.ย 

Categories:

Updated: