DonHurry

step41. ν–‰λ ¬μ˜ κ³± λ³Έλ¬Έ

DeZero/πŸ—»μ œ4κ³ μ§€

step41. ν–‰λ ¬μ˜ κ³±

_도녁 2023. 2. 16. 00:01

πŸ“’ λ³Έ ν¬μŠ€νŒ…μ€ λ°‘λ°”λ‹₯λΆ€ν„° μ‹œμž‘ν•˜λŠ” λ”₯λŸ¬λ‹3을 기반으둜 μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 배운 λ‚΄μš©μ„ κΈ°λ‘ν•˜κ³ , 개인적인 곡뢀λ₯Ό μœ„ν•΄ μž‘μ„±ν•˜λŠ” ν¬μŠ€νŒ…μž…λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ ꡐ재 ꡬ맀λ₯Ό κ°•λ ₯ μΆ”μ²œλ“œλ¦½λ‹ˆλ‹€.

 

 

제λͺ©μ—μ„œ μ•Œ 수 μžˆλ“―μ΄ 이번 λ‹¨κ³„λŠ” λ²‘ν„°μ˜ 내적과 ν–‰λ ¬μ˜ 곱을 λ‹€λ£Ήλ‹ˆλ‹€. κ΅μž¬μ—μ„œ κ°„λ‹¨νžˆ μ†Œκ°œλ₯Ό ν•˜κ³  μžˆμ§€λ§Œ, 사싀 이 뢀뢄은 μ„ ν˜•λŒ€μˆ˜ν•™μ„ λ”°λ‘œ κ³΅λΆ€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. λ²‘ν„°μ˜ 내적과 ν–‰λ ¬μ˜ κ³±μ—μ„œ ν•„μš”ν•œ ν˜•μƒμ— λŒ€ν•œ λ‚΄μš©μ€ λ”°λ‘œ κ³΅λΆ€ν•˜λŠ” 것을 μΆ”μ²œλ“œλ¦½λ‹ˆλ‹€. 이번 νŒŒνŠΈμ—μ„œ 주둜 λ‹€λ£° λ‚΄μš©μ€ ν–‰λ ¬ 곱의 μ—­μ „νŒŒμž…λ‹ˆλ‹€. μš°μ„  $y=xW$λΌλŠ” 계산을 μ˜ˆμ‹œλ‘œ μ„€λͺ…을 μ΄μ–΄λ‚˜κ°€κ² μŠ΅λ‹ˆλ‹€.

 

[κ·Έλ¦Ό 41-3]은 κ°„λ‹¨ν•œ ν–‰λ ¬ 곱의 μˆœμ „νŒŒμž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ€‘μš”ν•œ 것은 μ΅œμ’… 좜λ ₯이 μŠ€μΉΌλΌλΌλŠ” κ²ƒμž…λ‹ˆλ‹€. λ”₯λŸ¬λ‹ μžμ²΄κ°€ μ΅œμ’…μ μœΌλ‘œ 슀칼라λ₯Ό 좜λ ₯ν•˜λŠ” 계산을 닀루기 λ•Œλ¬Έμž…λ‹ˆλ‹€. κ²°κ΅­ μ—­μ „νŒŒλ‘œ ꡬ해야할 것은 $L$의 각 λ³€μˆ˜μ— λŒ€ν•œ λ―ΈλΆ„μž…λ‹ˆλ‹€. 증λͺ… 과정은 μƒλž΅ν•˜κ³ , μ½”λ“œ κ΅¬ν˜„μ„ μœ„ν•œ λ‹¨κ³„λ‘œ λ„˜μ–΄κ°€κ² μŠ΅λ‹ˆλ‹€.

 

 

λ‹€μŒ 그림은 $y=xW$λΌλŠ” κ³„μ‚°μ—μ„œ ν–‰λ ¬ 곱의 μˆœμ „νŒŒ, μ—­μ „νŒŒ ν˜•μƒμ„ 보여주고 μžˆμŠ΅λ‹ˆλ‹€. μ—­μ „νŒŒλ₯Ό μ‚΄νŽ΄λ³΄λ©΄ κ²°κ΅­ $L$의 각 λ³€μˆ˜μ— λŒ€ν•œ λ―ΈλΆ„μ΄λΌλŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. 각 λ³€μˆ˜λ₯Ό λ―Έμ„Έν•˜κ²Œ λ³€ν™”μ‹œμΌ°μ„ λ•Œ $L$이 μ–Όλ§ˆλ‚˜ λ³€ν™”ν•˜λŠλƒ, λ³€ν™”μœ¨μ„ λ³΄λŠ” κ²ƒμž…λ‹ˆλ‹€. [κ·Έλ¦Ό 41-6]을 보면 κ·Έ ꡬ체적 계산과 ν˜•μƒμ„ 체크할 수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ μ£Όμ˜ν•΄μ•Όν•  점은 ν˜•μƒμ΄ μ˜¬λ°”λ₯΄λ‹€κ³  ν•΄μ„œ μ—­μ „νŒŒ 식이 항상 μ˜¬λ°”λ₯΄κ²Œ λ„μΆœλ˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€.

 

 

이제 직접 μ½”λ“œλ‘œ κ΅¬ν˜„ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. 이전 단계듀과 λ§ˆμ°¬κ°€μ§€λ‘œ μˆœμ „νŒŒλŠ” λ„˜νŒŒμ΄μ˜ dot λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜κ³ , μ—­μ „νŒŒλŠ” 직접 κ΅¬ν˜„ν•œ ν•¨μˆ˜λ₯Ό ν™œμš©ν•©λ‹ˆλ‹€. μ΄λ•Œ μ—­μ „νŒŒμ—μ„œ μ‚¬μš©ν•˜λŠ” matmul ν•¨μˆ˜λŠ” λ°”λ‘œ 밑에 κ΅¬ν˜„ν•œ ν•¨μˆ˜μ™€ λ™μΌν•©λ‹ˆλ‹€.

class MatMul(Function):
    def forward(self, x, W):
        y = x.dot(W)
        return y
    
    def backward(self, gy):
        x, W = self.inputs
        gx = matmul(gy, W.T)
        gW = matmul(x.T, gy)
        return gx, gW


def matmul(x, W):
    return MatMul()(x, W)

 

이제 λ‹€μŒκ³Ό 같은 ν…ŒμŠ€νŠΈλ„ μ§„ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. x.grad.shape와 x.shapeκ°€ 동일함을 ν™•μΈμœΌλ‘œ 이번 단계λ₯Ό λ§ˆλ¬΄λ¦¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

import numpy as np
from dezero import Variable
import dezero.functions as F

x = Variable(np.random.randn(2, 3))
W = Variable(np.random.randn(3, 4))
y = F.matmul(x, W)
y.backward()

print(x.grad.shape)  # (2, 3)
print(W.grad.shape)  # (3, 4)

'DeZero > πŸ—»μ œ4κ³ μ§€' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

step 43. 신경망  (0) 2023.02.19
step42. μ„ ν˜• νšŒκ·€  (0) 2023.02.18
step40. λΈŒλ‘œλ“œμΊμŠ€νŠΈ ν•¨μˆ˜  (0) 2023.02.15
step39. 합계 ν•¨μˆ˜  (0) 2023.02.14
step38. ν˜•μƒ λ³€ν™˜ ν•¨μˆ˜  (0) 2023.02.13