oreilly-japan / deep-learning-from-scratch

『ゼロから作る Deep Learning』(O'Reilly Japan, 2016)
MIT License
3.99k stars 3.34k forks source link

P169. 図6−2について #41

Closed hirokuni closed 4 years ago

hirokuni commented 5 years ago

P169の図6−2では 「図6−2 f(x,y) = x2/20 + y2の勾配」っと説明があり、矢印(勾配)が図中のy=0付近に向かっています。 しかし、実際に上記fの勾配を計算すると逆方向になります。

// 計算に使用した式とその結果(図6−2とは勾配が逆方向)
def f(x, y):
    return (x**2 / 20.0 + y**2)

def df(x, y):
    return x / 10.0, 2.0*y

image

ソースコード全体

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

def f(x, y):
    return (x**2 / 20.0 + y**2)

def df(x, y):
    return x / 10.0, 2.0*y

x = np.arange(-10.0, 10.0, 1)
y = np.arange(-5.0, 5, 1)
X,Y = np.meshgrid(x,y)
Z = f(X,Y)

U, V = df(X, Y)  # 各点での関数 f の勾配を計算する。

###############
# plot
###############

fig = plt.figure(figsize=(20, 5))

# 勾配のベクトル図を作成する。
ax1 = fig.add_subplot(131) # 1行2列目の1目にグラフを描く
ax1.set_title('f gradient')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
quiver = ax1.quiver(U,V)

plt.show()

この図6−2の勾配は、式6.1の損失関数の勾配をイメージされているものでしょうか?

W <- W - η(∂L/∂W)     (6.1)

もしそうであれば、次のようにすれば図6−2の結果が得られました。

def f(x, y):
    return -(x**2 / 20.0 + y**2)

def df(x, y):
    return -x / 10.0, -2.0*y
Githubtumblr commented 5 years ago

你还会日语呀

shigurenomiya commented 5 years ago

図4-9でも同様の計算がなされていますが、そちらには勾配の結果にマイナスをつけて描画したとあります(p105の5行目)ので、こちらも同様にマイナスをつけて描画していると思われます。

Nyoho commented 2 years ago

p.105を開いていて正誤表が出ていないかなと調べていて、このissueに到達しました。

@shigurenomiya さんのおっしゃるように5行目で「マイナスを付けたベクトル描画します」と宣言してあるので、p.105の図はセーフだと思いますが、 p.105の最後の1行のように「勾配は、各地点において低くなる方向を指します」と書かれています。

図はマイナスを付けると言っているのに、その後の本文ではマイナス1倍したことを忘れて、低くなる方向を指すことになってしまっています。勾配は大きくなる方向を示すので 間違いです。

p.169は図も勾配と言われているので両方の意味で間違っていますね。 正誤表には載っていないようでしたので書き込みをしておきます。