O'REILLYããŒãããäœãDeep Learning âPythonã§åŠã¶ãã£ãŒãã©ãŒãã³ã°ã®çè«ãšå®è£ ãïŒä»¥äž âããã¹ãâïŒèªè éå®å¯Ÿè±¡ã®ãäœåºŠç®ãã®ã·ãªãŒãºã®æçµåã§ãã
ååã¯ã·ã°ã¢ã€ããš2ä¹å誀差ã®èª€å·®éäŒææ³ã®å®è£ ã«ã€ããŠæžããããããã¹ã5ç« ã®ã¯ã©ã€ããã¯ã¹ã¯ãç¶ãAffineã¬ã€ã€ãšSoftmax-with-Lossã¬ã€ã€ã®å®è£ ã®ãã ããªããããªãããšæããããã¹ãå šäœã§ãçœçãšèšããããããªãã ãããïŒ å®éãèè ã¯Softmax-with-Lossã¬ã€ã€ã«é¢ããŠã¯ãå·»æ«ã«10ããŒãžã«ãããä»é²ãèšããŠäžå¯§ãªèª¬æãè¡ã£ãŠãããç¹å¥æ±ãããŠããã®ã ã
ããããã®ããã¹ãã®äŸã«ããããAffineïŒSoftmaxã¬ã€ã€ã®å®è£ ã®èª¬æãçµãããšããããªããã¥ãŒã©ã«ãããã¯ãŒã¯ãžã®éäŒææ³ã®å®è£ ãå§ãŸããé£æ床ãæåŽçµ¶å£ã®ããã«âŠã£ãŠãã®ãã¬ãŒãºãç¹°ãè¿ãã®ã¯äœåºŠç®ã ïŒ
ããã§ä»åã¯ãèªåèªèº«ã«äžããæŒç¿åé¡ãšããŠãããã¹ãP110ã®åœ¢ç¶2Ã3ã®éã¿ã ããæã€ç°¡åãªãã¥ãŒã©ã«ãããã¯ãŒã¯ã«ã€ããŠãéäŒææ³ã§åŸé ãæ±ããŠã¿ãã
ã¹ãã³ãµãŒãªã³ã¯
Â
Â
ãŸãã¯èšç®ã°ã©ããæããŠã¿ãããããŠãéäŒæã®ç¢å°ãæã足ãããšããŠãé©æããããªãã ããã¯ïŒïŒ èšç®ãä»ãå ãããšãããã2ç®æãããªããããªããïŒïŒ
ã€ãŸãAffineã¬ã€ã€ãšSoftmax-with-Lossã¬ã€ã€ããããããäžã€ã®åŠçãšèŠãŠããããã«å¯ŸããéäŒæãèšç®ããã°ãããšããããšãªã®ãïŒ
P110ïŒãŸãã¯ch04\gradient_simplenet.pyïŒã®ã³ãŒããæ¹é ããŠãéäŒæã®å®è£ ãè©Šã¿ãã以äžã«æ¹é ããã³ãŒãã瀺ãããã€ãã®éããããã¹ãã®ã¹ã¯ãªãããå®è¡ã§ããç°å¢ïŒGitHubããããŠã³ããŒãããã¹ã¯ãªãããå®è¡ã§ããç°å¢ïŒãæ§ç¯ããŠãã人ãªããç»é¢äžããã³ããã§Anacondaããã³ããã®å¯Ÿè©±ã¢ãŒãã«è²Œãä»ããŠå®è¡ã§ããã¯ãã§ããã
import sys, os
sys.path.append(os.pardir)
import numpy as np
from common.functions import softmax, cross_entropy_error
class simpleNet:
  def __init__(self):
    self.W = np.array(\
    [[0.47355232, 0.9977393, 0.84668094],\
    [0.85557411, 0.03563661, 0.69422093]])
    self.dW, self.y = np.zeros([2, 3]), np.zeros(3)
  def predict(self, x):
    return np.dot(x, self.W)
  def loss (self, x, t):
    z = self.predict(x)
    self.y = softmax(z)
    loss = cross_entropy_error(self.y, t)
    return loss
  def backward(self, x, t):
    dZ = self.y - t
    self.dW[0] = dZ * x[0]
    self.dW[1] = dZ * x[1]
    return self.dW
ããã¹ãP110ãšã®çžéç¹ã¯ã以äžã®éãã
ããã¹ãã§ã¯éã¿ âWâ ã¯ã¬ãŠã¹ååžã§åæåããŠããããæ°å€ã芳å¯ãããã®ã§ãããã¹ãP111ãšåãå€ãnp.arrayã§äžããŠã¿ãã
Softmax-with-Lossã®éäŒæãæ±ããéã«å éšå€æ° âyâ ã䜿çšããã®ã§ãã¡ã³ãå€æ°ãšããŠãŒãã§åæåããŠã¿ãã
éäŒæãæ±ããã¡ãœãã âbackwardâ ã¯ãéäŒæãäžããåŒãã®ãŸããŸã§ããããã ãããã¹ãèè ã®æè€ããã Python ã®ããã°ã©ã ã«ç¿çãã人ã¯ããã£ãŠãŒãããªæžãæ¹ãâŠã£ãŠããããã€ããã§ããããã¿ãŸããã
äžèšã¯ã©ã¹ã¯ã以äžã®ããã«å®è¡ããŠã¿ããããã察話ã¢ãŒãããã³ããã«è²Œãä»ãå¯èœã®ã¯ãã ã
from common.gradient import numerical_gradient
net = simpleNet()
print(net.W)
x = np.array([0.6, 0.9])
p = net.predict(x)
print(p)
np.argmax(p)
t = np.array([0, 0, 1])
net.loss(x, t)
net.y - tf = lambda W: net.loss(x, t)
numerical_gradient(f,net.W)
net.backward(x, t)
å®è¡çµæã®ã¹ã¯ãªãŒã³ã·ã§ãããæ®ã£ãŠã¿ãã
ânumerical_gradientâ ããªãã¡æ°å€åŸ®åã§æ±ããå€ãšãâbackwardâ ããªãã¡éäŒææ³ãçšããå€ããå°æ°ç¹ä»¥äž4æ¡ç®ããããŸã§äžèŽããŠããããšã確èªã§ããã
ãããïŒãããããããïŒãããããããïŒ
ãããã©ãã ããããããããã«ãã£ãŠãã©ãã ãèšç®ãç¯çŽã§ããããå¯èŠåãããããååã«ç¶ããŠä»åãExcelã§åãããšãããããŠã¿ããååã«æ¯ã¹ãŠã·ãŒãã倧ãããªã£ãã®ã§ãã¹ã¯ã·ã§ã¯2åå²ã§ç€ºãããäžæã®ã·ãŒãäžã«äœæãããã®ã§ããã
ãŸãã¯å·Šååã
ã»ã«ãB1:C1ãã® âå ¥å xâ ããF2:H3ãã® âéã¿ WâããF6:H6ãã® âæåž« tâ ãããã«ãC5ãã®æ°å€åŸ®åãèšç®ããããã®åŸ®å°é âhâ ã¯ãæ°å€ã®æå ¥åã§ããã
Softmax-with-Lossã®åºåãæ±ãããŸã§ã®æé ã説æããã
æšå®å€ âpâ ãèšç®ããã»ã«ãK2ãã«ã¯ãæ°åŒã=$B2*F$2+$C2*F$3ããå ¥åã㊠ãL2:M2ãã«ãã©ãã°ã§ã³ããŒããŠããïŒçµ¶å¯Ÿåç §ã䜿çšããŠããã®ã¯ãæ°åŒãã³ããŒããããã§ããïŒã
exp(p) ãèšç®ããã»ã«ãK5ãã«ã¯ãæ°åŒã=EXP(K2)ããå ¥åã㊠ãL5:M5ãã«ã³ããŒããŠããããã®ãŸããŸãšãããã€ã ã
ãœããããã¯ã¹ãèšç®ããã»ã«ãK8ãã«ã¯ãæ°åŒã=K5/SUM($K$5:$M$5)ããå ¥åã㊠ãL8:M8ãã«ã³ããŒããŠãããã»ã«ãK5ãã®æ°åŒãããã®ãŸããŸããšããã®ã§ããã°ããã¡ããããã®ãŸããŸããšèšããã
ãããŠã»ã«ãM10ãã§ãæ°åŒã=-1*LN(F6*K8+G6*L8+H6*M8)ãã«ããSoftmax-with-Lossã®åºåå€ãèšç®ããŠããã
次ã«ãéäŒæã«ãã âdWâ ã®èšç®ã§ããã
ây ïŒ tâ ãèšç®ããèšç®ããã»ã«ãK13ãã«ã¯ãæ°åŒã=K8-F6ããå ¥åã㊠ãL13:M13ãã«ã³ããŒããŠããããã©ããã©ããããããã®ãŸããŸãã ã
æåŸã« âdWâ ãèšç®ããã»ã«ãK16:M17ãã§ãããããK16ãã«ã¯æ°åŒã=K13*$B$2ããããK17ãã«ã¯ã=K13*$C$2ããå ¥åããããããMåãŸã§ã³ããŒããŠããããããããã¹ãP147ïœã«èšããAffineã¬ã€ã€ã®éäŒæãã«çžåœããïŒã¯ãïŒã
ç¶ããŠå³ååãåãããšãæ°å€åŸ®åã§ããããšæã£ãããããã ãã®æéãå¿ èŠãšãªãã®ã ã
å šéšèª¬æããã®ã¯å€§å€ãªã®ã§ãéã¿ âW[0][0]â ã«ã€ããŠã ãè¿°ã¹ãã
ã»ã«ãQ2ãã«ã¯ã=B2*(F2+$B$5)+C2*F3ãã«çžåœããæ°åŒãããQ3ãã«ã¯ã=B2*(F2-$B$5)+C2*F3ãã«çžåœããæ°åŒããããããå ¥åããŠããïŒãçžåœããããšæžããã®ã¯ãå®éã«äœæããã·ãŒãã§ã¯ãææ°ãç¯çŽã§ããªãããšçµ¶å¯Ÿåç §ãæå®ãããæå®ããŠããªãã£ããããããïŒã埮å°é âhâ ã«çžåœããã»ã« $B$5 ãå ç®ãŸãã¯æžç®ããæšå®å€ p[0] = x[0] à W[0][0] ã®å€ãèšç®ããŠããã®ã§ããã
ã»ã«ãQ6ãããQ7ãã§ã¯ããããã ãQ2ãããQ3ãã® exp ããªãã¡ã=EXP(Q2)ãã=EXP(Q3)ããèšç®ããŠããã
次ããã£ãšãããããããšããã§ãããã»ã«ãQ10ãã«ã¯æ°åŒã=Q6/(Q6+L5+M5)ããããR10ãã«ã¯ã=L5/(Q6+L5+M5)ããããS10ãã«ã¯ã=M5/(Q6+L5+M5)ããèšå®ããŠããã
ã»ã«ãQ11ãã«ã¯æ°åŒã=Q7/(Q7+L5+M5)ããããR11ãã«ã¯ã=L5/(Q7+L5+M5)ããããS11ãã«ã¯ã=M5/(Q7+L5+M5)ããèšå®ããŠããã
ä»åã®ãšã³ããªãŒã®æåã«æ²ããèšç®ã°ã©ãã§èšããšãçãäžãããã®ãEXPããšããããŒãããåå²ããæ¯ç·3æ¬ãäžã®æ¹ã®ãïŒããšããããŒãã§åæµãããïŒããšããããŒããçµãŠå ã®ç·ãšåæµããéšåã«çžåœããã
ã»ã«ãQ14ãã«ã¯æ°åŒã=-1*LN(F6*Q10+G6*R10+H6*S10)ããããQ15ãã«ã¯ã=-1*LN(F6*Q11+G6*R11+H6*S11)ããèšå®ããŠããããã®äž¡è ã®å€ã«ãã âdW[0][0]â ãã=(Q14-Q15)/2/$B$5ããšããŠèšç®ããã®ã§ããã
ãããããã°ã£ããã§çããªããªããã¯ãŠãªããã°ãã«ã¯ Excel ã®ã·ãŒãã貌ãæ©èœã¯ãªãã®ãïŒïŒãªããªã
ããããžExcelã®ã·ãŒããããã©ã£ãã«ã¢ããããŒãã§ããã®ã§ããã°ã¢ããããŒãããŠãééã£ãããšããã£ãŠãªãã誰ãä»äººã®ç®ã§ãã§ãã¯ããŠãããããã®ã ãã
ãšããããããããŠèª€å·®éäŒææ³ã®æ¡çšã§èšç®éãæ Œæ®µã«æžãããããšã«ãã£ãŠãããœã³ã³ãšã€ã³ã¿ãŒããªã¿ã®åŠçèœåã§ãMNISTããŒã¿ã»ããã®æ©æ¢°åŠç¿ãå¯èœã«ãªã£ããšããããšãªã®ã ããã
ãŒãããäœãDeep Learning âPythonã§åŠã¶ãã£ãŒãã©ãŒãã³ã°ã®çè«ãšå®è£
- äœè : æè€åº·æ¯
- åºç瀟/ã¡ãŒã«ãŒ: ãªã©ã€ãªãŒãžã£ãã³
- çºå£²æ¥: 2016/09/24
- ã¡ãã£ã¢: åè¡æ¬ïŒãœããã«ããŒïŒ
- ãã®ååãå«ãããã° (16件) ãèŠã