Pytorch - Basic Code in Pytorch

Pytorch - Basic Code in Pytorch

Pytorch for AI

ํ•ด๋‹น ์ธ๋„ค์ผ์€ Wonkook Lee ๋‹˜์ด ๋งŒ๋“œ์‹  Thumbnail-Maker ๋ฅผ ์ด์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค

๋ธ”๋กœ๊ทธ๋ฅผ ์ •๋ฆฌํ•˜๋ ค๊ณ  ๋งˆ์Œ ๋จน์œผ๋ฉด์„œ ํ•œ์ฐธ ์ „์— ๋“ค์—ˆ๋˜ Pytorch ๊ฐ•์ขŒ๋ฅผ ๋‹ค์‹œ ๋ณด๋ฉด์„œ ์˜›๋‚ ์—๋Š” ์ •๋ง ์ดํ•ด๊ฐ€ ์•ˆ๋๋Š”๋ฐ ์ด์ œ๋Š” ์กฐ๊ธˆ ์ต์ˆ™ํ•ด์ง„ ๊ฒƒ์„ ํฌ์ŠคํŒ… ํ•˜๋ ค ํ•œ๋‹ค.

torch.nn.Module

pytorch ๋‚ด์—์„œ nn ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Neural Network ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” Layer ์˜ base class ์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ nn.Module ์€ 4๊ฐ€์ง€๋ฅผ ์ •์˜ํ•ด์•ผ ํ•˜๋Š”๋ฐ

input ์ด ๋ฌด์—‡์ธ์ง€
output ์ด ๋ฌด์—‡์ธ์ง€
forward ๋•Œ ์ผ์–ด๋‚˜๋Š” ์ผ์ด ๋ฌด์—‡์ธ์ง€
backward ๋•Œ ์ผ์–ด๋‚˜๋Š” ์ผ์ด ๋ฌด์—‡์ธ์ง€

๋“ฑ์„ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ํ•™์Šต์˜ ๋Œ€์ƒ์ด ๋˜๋Š” parameter(weights) ๋ฅผ ์ •์˜ํ•ด์ฃผ๋ฉด backward ๋•Œ autograd ๋กœ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

torch.nn.Parameter

Parameter ํด๋ž˜์Šค๋Š” Tensor ๊ฐ์ฒด์˜ ์ƒ์† ๊ฐ์ฒด๋กœ nn.Module ๋‚ด์— ์†์„ฑ์ด ๋  ๋•Œ๋Š” required_grad=True ๋กœ ์ง€์ •๋˜์–ด ํ•™์Šต ๋Œ€์ƒ์ด ๋˜๋Š” Tensor ์ด๋‹ค. ์ด ๋ง์€ AutoGrad ์˜ ๋Œ€์ƒ์ด ๋œ๋‹ค๋Š” ๋ง๊ณผ ๋˜‘๊ฐ™์€ ๋ง๋กœ ๊ต‰์žฅํžˆ ํ•ต์‹ฌ ํฌ์ธํŠธ์ด๋‹ค.

๋‹ค๋งŒ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์ง€์ •ํ•  ์ผ์€ ์ž˜ ์—†๋Š”๋ฐ ๊ทธ ์ด์œ ๋Š” ๋Œ€๋ถ€๋ถ„์˜ layer ์—๋Š” weights ๊ฐ’๋“ค์ด ์ง€์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜๋„ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋ฏ€๋กœ ์•Œ์•„๋‘˜ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

Example Model

class MyLinear(nn.Module): #nn.Module ์„ ์ƒ์†๋ฐ›๋Š” ๋ชจ์Šต
    def __init__(self, in_features, out_features, bias=True):
        super().__init__()
        self.in_features = in_features
        self.out_features = out_features

         # ์‹ค์ œ๋กœ ์ด๋ ‡๊ฒŒ Parameter ๋ฅผ ํ†ตํ•ด 
         # weight ๊ฐ’์„ ์žก์•„์ฃผ๋Š” ์ผ์€ ๊ฑฐ์˜ ์—†์Œ

        self.weights = nn.Parameter(
            torch.randn(in_features, out_features)
        )

        self.bias = nn.Parameter(torch.randn(out_features))

    def forward(self, x : Tensor):
        return x @ self.weights + self.bias 

์œ„์— ์ง  ๋„คํŠธ์›Œํฌ๋Š” ์ •๋ง ์ €๋ ‡๊ฒŒ ์งค ์ผ์ด ๊ฑฐ์˜ ์—†๋‹ค. nn ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋‚ด์žฅ๋˜์žˆ๋Š” ๋‹ค๋ฅธ neural network(cnn, rnn ๋“ฑ) ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜๋„ network ์˜ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ์—๋Š” ๊ดœ์ฐฎ์€ ์ฝ”๋“œ์ผ ๊ฒƒ์ด๋‹ค.

Backward

๊ฐ Layer ๋“ค์— ์ˆจ์–ด์žˆ๋Š” weight ๋“ค์˜ ๋ฏธ๋ถ„์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. forward ํ•จ์ˆ˜๋ฅผ ๊ฑฐ์ณ ๋‚˜์˜จ ๊ฒฐ๊ณผ๊ฐ’(Prediction) ๊ณผ ์‹ค์ œ ๊ฐ’(Ground Truth) ๊ฐ„์˜ ์ฐจ์ด(loss) ์— ๋Œ€ํ•ด ๋ฏธ๋ถ„์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ์–ป์–ด๋‚ธ ๋ฏธ๋ถ„๊ฐ’์œผ๋กœ weight ๋“ค์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ดํ•ดํ•ด๋ณด์ž.

Code

for epoch in range(epochs):

    optimizer.zero_grad()

    """model = MyLinear(3, 7)"""
    outputs = model(inputs) 

    loss = criterion(outputs, labels)
    loss.backward()

    optimizer.step()

์ฝ”๋“œ๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ด๋ณด์ž.

์ผ๋‹จ optimizer ๋Š” ์ตœ์ ํ™”๋ฅผ ๋งก๋Š”๋‹ค. ์ตœ์ ํ™”๋Š” ๊ฐ ํ•™์Šต ๋‹จ๊ณ„์—์„œ ๋ชจ๋ธ์˜ loss๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋ชจ๋ธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ณผ์ •์ด๋ผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ epoch ๋•Œ ๋งˆ๋‹ค ๊ฐ layer ์˜ weights ๋“ค์˜ gradient ๊ฐ’์„ 0์œผ๋กœ ์žฌ์„ค์ •ํ•œ๋‹ค. ์ด์œ ๋Š” ์ด์ „์— ํ•™์Šตํ•œ gradient ๊ฐ€ ์ด๋ฒˆ ํ•™์Šต์—์„œ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.

๊ทธ ๋‹ค์Œ model์— inputs ์„ ๋„ฃ์œผ๋ฉด outputs(์˜ˆ์ธก๊ฐ’) ์ด ๋‚˜์˜ฌํ…๋ฐ ๊ทธ๊ฒƒ์„ ์‹ค์ œ label ๊ณผ ๋น„๊ตํ•˜์—ฌ loss ๊ฐ’์„ ๊ตฌํ•ด๋‚ธ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ backward ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ loss ์— ๋Œ€ํ•œ ๋ชจ๋“  weights ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ณ  optimizer.step ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด weight ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

์ด๊ฒƒ์ด ํ•™์Šต์˜ ๊ธฐ๋ณธ ๋ผˆ๋Œ€์ด๋‹ค. ๋‹น์‹œ์— ๋ฐฐ์šธ๋•Œ๋Š” ์šฉ์–ด ์ž์ฒด๋„ ๋‚ฏ์„ค๊ณ  ์ฝ”๋“œ๋„ ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๋˜์„œ ํ•œ์ฐธ ์–ด๋ ค์›Œํ–ˆ๋˜ ๊ธฐ์–ต์ด ๋‚œ๋‹ค. ๋”ฅ๋Ÿฌ๋‹์„ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ๋Š๋‚€ ๊ฒƒ์€ ๊ธฐ์ดˆ๊ฐ€ ํƒ„ํƒ„ํ•˜๋ฉด ๋‹ค๋ฅธ ์–ด๋ ค์šด ๊ฒŒ ๋‚˜์™€๋„ ์ดํ•ด๊ฐ€ ๋น ๋ฅด๋‹ค๋Š” ์ ์ด๋‹ค. ๋‹ค๋“ค ๊ธฐ์ดˆ์— ์ถฉ์‹คํ•˜๋„๋ก ํ•˜์ž.