最終更新日: 2024 年 10 月 13 日
「Python による数理・データサイエンス・AI」(初版) 正誤表

p.iii

誤

正

本書のキーワードはなるべくモデルカリキュラムのキーワードにあわせていま

本書のキーワードはなるべく「数理・データサイエンス・AI（応用基礎レベル）

す．表 0.1 を見ると分かるように，本書は，「コア学修項目」と「基盤となる学モデルカリキュラム〜AI× データ活用の実践」(2021 年 3 月 29 日制定) のキー

修項目」はカバーしています．

ワードにあわせています．表 0.1 を見ると分かるように，本書は，「コア学修項目」と「基盤となる学修項目」はカバーしています．

p.iii, 表 0.1
2-5. データ加工

集計処理，四則演算処理，ソート処理，サンプリング処

2-5. データ加工

理，データの標準化，ダミー変数，分散処理

p.v

そのような状況に遭遇した場合は，バージョンの更新を検討してください．

集計処理，四則演算処理，ソート処理，サンプリング処理，データの標準化，ダミー変数，分散処理

そのような状況に遭遇した場合は，バージョンの更新を検討してください．例
えば，threadpoolctl を pip でアップグレードするには，プロンプトで下記の下線部を入力します．
(base) pip install --upgrade threadpoolctl --userまた，バージョンを指定してインストールするには，次のように入力します．
(base) pip install threadpoolctl==3.1.0


1



誤

p.15
p.16

ベクトル x = [x1 , x2 , . . . , xN ] に対して，∥x∥2 =
t

を削除

p.56

p.60, 中程ベクトル x = [x1 , x2 , . . . , xN ] に対して，∥x∥22 =
t

PN

2
t
i=1 xi です．また， はベ

クトルあるいは行列の転置を表します．

と表され，この形は第 3.1 節の重回帰式 (3.1) と同じになります．

と表され，この形は第 3 章の重回帰式 (3.1) と同じになります．

N
X





p
X

∂E

wj xji − yi  xi ,
=
∂wn
j=0
i=1

p.48, ソース
コード 4.5 の
2 行目, Series2t
i=1 xi です．また， はベ

クトルあるいは行列の転置を表します．

p.17, 補題 2.2
の証明

p.20

正

PN

2

∂ E
∂
=
∂wm ∂wn
∂wm



∂E
∂wn


=

N
X

n
xm
i xi

i=1

N
X





p
X

∂E

wj xji − yi  xni ,
=
∂wn
j=0
i=1

∂2E
∂
=
∂wm ∂wn
∂wm



∂E
∂wn


=

N
X

n
xm
i xi

i=1

これは，実際の値と予測値の絶対値の 2 乗を平均したものであり，値が 0 に近これは，実際の値と予測値の差の 2 乗を平均したものであり，値が 0 に近いほいほどいいモデルだといえます．

どいいモデルだといえます．

import pandas as pd # Pandas の読み込み
from pandas import Series,DataFrame # Pandas から Series, DataFrame を読み込む

import pandas as pd # Pandas の読み込み
from pandas import DataFrame # Pandas から DataFrame を読み込む

なお，反復終了判定は，

なお，反復終了判定は，∥wnew − wold ∥<ε∥wold ∥2

∥wnew − wold ∥<ε∥wold ∥

(4.18)(4.18)となります．ただし，p(x, Ck ) は，入力 x とクラス Ck が同時に起こる確率をとなります．ただし，P (x, Ck ) は，入力 x とクラス Ck が同時に起こる確率を

表します．

表します．

p.62


 
un1
w01
 un2   w02  . = .
 ..   ..
unK

w0K

w11
w12
..
.
w1K

···
···
..
.
···



wp1
xn0


wp2 
 xn1 ..   ..  ⇐⇒ un = W xn = [w0 , w1 , . . . , wp ]xn.  . 
wpK



 
un1
w01
 un2   w02  . = .
 ..   ..
unK

xnp
(5.6)

2

w0K

w11
w12
..
.
w1K

···
···
..
.
···

t



w0
wp1
xn0
t
 w1 


wp2 


 xn1 ..   ..  ⇐⇒ un = W xn =  ..  xn (5.6)
 . .  . 
wpK

xnp

t

wp ]

誤

p.63

まず，初期値 w(2)(1)

を適当に決め，式 (5.10) を t = 1, 2, . . . に対して逐次計算し， まず，初期値 w(3)w , w , . . . を求めます．こうして計算される w
増えるにつれ，E(w(t) ) を確実に減少させます．
pp.88-89

正(t)

は η が小さければ，t が単語の出現回数（TF: Term Frequency）に全文書数に対するその単語が出現する文書数の割合（DF: Document Frequency）の逆数を掛けることで，単語の重みを調整します．

Inverse Document Frequency（文書頻度の逆数）は次のように定義されます．
nidf(t) = log
1 + df(t)(2)

１つの文書中における単語の出現頻度（TF: Term Frequency）に全文書におけるその単語の出現頻度（DF: Document Frequency）の逆数を掛けることで，単語の重みを調整します．文書 d における単語 t の出現回数を nd(t) とし， 全n単語数を T とすると，T F は T Fd(t) = ∑T d(t)nt=1

ここで df(t) はその単語が出現する文書数を表し，n は全文書数です．
大まかに表現すると，IDF はその単語が出現する文書数の全体に対する割合の逆数と見ることができます．

idf(t) ≈を適当に決め，式 (5.10) を t = 0, 1, 2 . . . に対して逐次計算, w , . . . を求めます．こうして計算される w(t) は η が小さければ，t が増えるにつれ，E(w(t) ) を確実に減少させます．
し，w

(1)

(0)

すべての文書数
単語 t が出現する文書数と表せます．一方，Inversed(t)Document Frequency（IDF: 文書頻度の逆数）は，単語 t が出現する文書が全文書中に占める割合の逆数であり，単語 t が一部の文書にどれだけ現れるかを示します．具体的には，df (t) を単語 t が出現する文書数とし，N を全文書数としたとき単語 t に対する IDF をN
IDF (t) = log
df (t) + 1と定義します．IDF (t) が大きいほど，単語 t が出現する文書数 df (t) は少なく

TF-IDF はこれらを掛け合わせたもので，その単語の出現回数を全文書におけるその単語の出現する文書数の割合で割ることで，頻出単語の重みを小さくするように調整します．
TF − IDF =Term Frequency × Inverse Document Frequency
単語 t の出現回数=
単語 t の出現する文書数の全体に対する割合なります．全文書数 N が大きくなるほど， dfN(t) の値が大きくなりやすいため，

log をとるとともに，分母に 1 を加えることによってゼロ除算により計算できな
くなることを回避しています．
TF-IDF はこれらを掛け合わせたもので，文書 d における単語 t の T F −IDFd(t)は，次のようになります．
T F − IDFd(t)=T Fd(t) × IDF (t) ≈文書 d における単語 t の出現頻度
全文書における単語 t の出現頻度対象とする文書 d に単語 t が頻繁に登場し，しかもその単語が文書全体ではあまり現れない（つまり，一部の文書にしか登場しない）場合，T F − IDFd(t) の値は大きくなります．結局のところ，T F − IDFd(t) は，単語 t が文書 d にとってどれだけ重要かを示す指標になっています．

3

誤

正

p.90, 適合率

Positive と分類したうちで，正解した割合 (PRE)．予測の誤判定を避けたい場合に利用する．予測の誤判定を避けたい場合に利用する．

Positive と分類したうちで，正解した割合 (PRE)．予測の誤判定を避けたい場合に利用する．例えば，P ER = 0.9 は，Positive と判定したうち，90%が実際に Positive であることを意味する．予測の誤判定を避けたい場合に利用する．

p.90，再現率

実際のクラスが Positive のうち，Positive だと予測できた割合 (REC)．再現

実際のクラスが Positive のうち，Positive だと予測できた割合 (REC)．例えば，率は，「陽性」の予測における見落としをなるべく避けたい，別の言い方をすREC = 0.9 は，データに含まれる Positive の 90%を検出できることを意味す「陽性」の予測における見落としをなるべく避けたい，別の言いる．再現率は，方をすれば，偽陰性 (FN) を減らすことを重視する場合に利用する．再現率は，
感度 (sensitivity) とも呼ばれる．

れば，偽陰性 (FN) を減らすことを重視する場合に利用する．再現率は，感度(sensitivity) とも呼ばれる．
p.90

p.91

特異率 (Speciﬁcity) 実際のクラスが Negative のうち，Negative だと予測で特異率 (Speciﬁcity) 実際のクラスが Negative のうち，Negative だと予測できた割合 (SPE)．特異度は，「陰性」の予測における見落としをなるべく「陰性」のきた割合 (SPE)．特異率は，特異度とも呼ばれる．特異度は，避けたい，別の言い方をすれば，偽陽性 (FP) を減らすことを重視する場予測における見落としをなるべく避けたい，別の言い方をすれば，偽陽性合に使う．

(FP) を減らすことを重視する場合に使う．

PRE と REC の最適化の長所と短所のバランスをとったものが F1 スコアです． PRE と REC の最適化の長所と短所のバランスをとったものが F1 スコアです．
適合率を最適化しようとすると，F P を下げることになりますが，これは F N

適合率を上げようとすると，F P を下げることになります．F P が減るというの増加を招きます．一方，再現率を最適化しようとすると，F N を下げること

ことは，Negative と判断される割合が増えるということですから，これは F Nになりますが，これは F P の増加を招きます．結局，F P と F N は同時に小さの増加を招きます．一方，再現率を上げようとすると，F N を下げることにな

くすることはできず，トレードオフの関係にあります．

りますが，これは F P の増加を招きます．結局，F P と F N は同時に小さくすることはできず，トレードオフの関係にあります．そのため，F 値のような指標が考えられました．

4

誤

p.95

正

# 混同行列から特異性を求める関数
(

p.102
wik =

1
0

# 混同行列から特異率を求める関数(xi が k 番目のセントロイドのクラスターに属する)(それ以外)

(wik =1 (xi がセントロイド µk のクラスターに属する)
0 (それ以外)






xi1
µk1
 . 
 . 
 . 
. 
ここで，xi = 
 .  , µk =  .  とすれば，式 (8.1) は以下のように表せま
xin
µkn




xi1
µk1
n
X
 . 


..  , µk =  ...  , ∥xi − µk ∥2 =(xij − µkj )2 とすれば，
ここで，xi = 
 


j=1
xin
µkn

す．

式 (8.1) は以下のように表せます．

p.104, ややく
どいので表現を変更．

また，この式は µk は k 番目のクラスターに割り当てられたすべてのデータ点

また，この式は µk は k 番目のクラスターに割り当てられたすべてのデータ点xn

xn の平均値とおいているものと単純に解釈することができます．k-means(k 平均) アルゴリズムという名の由来はここにあります．

ムという名の由来はここにあります．

p.109, ソース

ax1.set title(’KNN on Iris (train)’)ax1.set title(’KNN on Iris (test)’)p.104の平均値であると単純に解釈することができます．k-means(k 平均) アルゴリズ

コード 8.4, 22
行目

p.110, 実 行
例，図の位置はそのままだが，「test」と「train」を 入れ替える．

accracy_score による正解率 (train):0.9667
accracy_score による正解率 (test):0.9333

5p.110誤

正

ここでは，init=’k-means++’ を明示的に指定します．なお，セントロイドの

ここでは，init=’k-means++’ を明示的に指定します．n init は，異なる乱数

位置は，cluster_centers_属性で取得できます．

のシードで初期セントロイドを選ぶ回数で，最終的には，最も良い結果が出力されます．デフォルト値は 10 ですが，ここではこれも明示しています．なお，
セントロイドの位置は，cluster_centers_属性で取得できます．

p.111, ソース
コード 8.5, 23
行目

kmeans = KMeans(n clusters = 5, init = ’k-means++’,random state = 0, n init = 10) # 初期化

kmeans = KMeans(n clusters = 5, init = ’k-means++’,random state = 0, n init = 10) # 初期化

p.112(1) 入力データからランダムに１つ選び，それを１つ目のセントロイドとする．

(1) 入力データからランダムに１つ選び，それを１つ目のセントロイドとする．

(2) セントロイドが k 個選ばれるまで，以下の手順を繰り返す．

(2) セントロイドが k 個選ばれるまで，以下の手順を繰り返す．

(a) 各入力データと各セントロイドとの距離を求める．

(a) 各入力データと各セントロイドとの距離を求める．

(b) 入力データ xi ごとに，最も近いセントロイドとの距離 d(xi ) を求める．

(b) 入力データ xi ごとに，最も近いセントロイドとの距離 d(xi ) を求める．

(c) 距離の２乗に比例する確率(c) 入力データ xp がセントロイドとして選ばれる確率（選択確率）を距
離の２乗に比例する確率d(xp )2p(xp ) = P
2i d(xi )d(xp )2p(xp ) = P
2i d(xi )に従って，入力データの中からデータを１つ選択し，それをセントロイドとして採用する．手順 (c) のような選択方法はルーレット選として求め，これに従って，入力データの中からデータを１つ選択し，択 (Roulette selection, Roulette wheel selection) と呼ばれる．

それをセントロイドとして採用する．より具体的には，0 ∼ 1 の乱数r を生成し，各データの選択確率 p(xi ) を順に足していき，つまり，P累積確率 i p(xi ) を考え，r がこの累積確率を超えた点をセントロイドとする． 手順 (c) のような選択方法はルーレット選択 (Rouletteselection, Roulette wheel selection) と呼ばれる．データ xp とセン
トロイドの距離が短いほど選択確率 p(xp ) は低く，距離が長いほど
高くなる．

6

誤

正

p.127

p.128, ソース
9.7 の 86 行目(1) p 次元の特徴量ベクトル x を平均偏差ベクトルにする．

(1) p 次元の特徴量ベクトル x を平均偏差ベクトル y にする．

(2) 特徴量ベクトルに基づき，p × p の共分散行列を作成する．

(2) 特徴量ベクトルに基づき，p × p の共分散行列を作成する．

(3) 共分散行列の固有値と単位固有ベクトルを求める．

(3) 共分散行列の固有値と単位固有ベクトルを求める．

(4) 固有値を大きい順に並べ替えて，単位固有ベクトルで p × p の射影行列を作成する．

(4) 固有値を大きい順に並べ替えて，単位固有ベクトルで p × p の射影行列を作成する．

(5) p × p の射影行列の k 列より後の列を削除し，p × r の射影行列に変換する．

(5) p × p の射影行列の k 列より後の列を削除し，p × r の射影行列に変換する．

(6) p 次元の特徴量ベクトル x に射影行列 W を掛けて，r 次元の主成分 f を作成する．

(6) p 次元の平均偏差ベクトル y に射影行列 W を掛けて，r 次元の主成分
f = t W y を作成する．

print(’ 累積寄与率 (scikit-learn):’.format(【自分で補おう】)) )p.130,
図10.1(a) を 変
更7

print(’ 累積寄与率 (scikit-learn):’.format(【自分で補おう】))

誤p.130, §10.1

正t

p 次元ベクトル x = [x1 , . . . , xp ] と，同様に p 次元のパラメータベクトル w =t[w1 , . . . , wp ]，そしてスカラー b に対して，超平面は以下のように表現することができます．
t
wx + b = 0(10.1)

tp 次元ベクトル x = [x1 , . . . , xp ] と，同様に p 次元のパラメータベクトル w =t[w1 , . . . , wp ]，そしてスカラー b に対して，超平面 H は以下のように表現することができます．
t
wx + b = 0(10.1)

ここでの目的は，マージン dM を最大化する超平面を見つけ出すことです．

ここでの目的は，マージン dM を最大化する超平面を見つけ出すことです．

マージン dM は，サポートベクトルと決定境界（つまり超平面）との間の距離

マージン dM は，サポートベクトル x+ , x− と決定境界（つまり超平面）とのであるため，次の等式が成り立ちます．

間の距離であるため，次の等式が成り立ちます．

p.131,(10.9)
1ŵ, b̂ = argmin ∥w∥2 ,
2
w,b

p.132
p.132,(10.17),(10.18)subject to yn (t wxn + b) ≥ 1(n = 1, 2, . . . , N )1{ŵ, b̂} = argmin ∥w∥2 ,2
w,bsubject to yn (t wxn + b) ≥ 1(n = 1, 2, . . . , N )(10.9)(10.9)

式 (10.11), (10.12) を KKT 条件 (KKT condition, arush-Kuhn-Tucker condi-

式 (10.11)∼(10.13) を KKT 条件 (KKT condition, arush-Kuhn-Tucker condi-tion) と呼びます．

tion) と呼びます．

αi ≥ 0 (i = 1, 2, . . . , N )αi = 0 または yn (t wxn + b) − 1 = 0

p.133 の式変形
L(w, b, α1 , . . . , αN ) =N
X
1∥w∥2 +
αn 1 − yn (t wxn + b)
2
n=1

..
.
=

(10.17)(10.18)

N
X
n=1

αn −

1
2

N
X
i=1

!
α i y i xiNX

αn ≥ 0αn = 0(n = 1, 2, . . . , N )または yn (t wxn + b) − 1 = 0

L(w, b, α1 , . . . , αN ) =

α j y j xj NX
1∥w∥2 +
αn 1 − yn (t wxn + b)
2
n=1

..
.
=

N
X
n=1

j=1

8

(10.17)(10.18)

αn −

1
2

t

N
X


! N
X
α i y i xi 
α j y j xj 

i=1

j=1

誤

正

p.133, 論理にやや飛躍があるので説明を追加．厳密には強双対定理が必要．

結局，以上の議論から， 12 ∥w∥2 の最小化問題の代わりに，L̃(α) の最大化問題

p.134

したがって，勾配ベクトルは次のように計算できます．

∂ L̃(α)1 ∂(t α)∂αt=1−(Hα) + αH= 1 − Hαj
∂αj
2
∂αj
∂αj

p.135

により最適解 α̂ を求めれば，元の解 ŵ が得られることが分かります．

(
arg min

w,ξ,b

N
X
1
∥w∥2 + C
max{0, 1 − yn (t wxn + b)}2
n=1= minw,b maxα≥0 L(w, b, α) =maxα≥0 minw,b L(w, b, α) = maxα≥0 L̃(α) から， 21 ∥w∥2 の最小化問題の代PN
わりに，α に関する制約条件 α ≥ 0, n=1 αn yn = 0 の下で L̃(α) の最大化問
題の最適解 α̂ を求めれば，元の解 ŵ,b̂ が得られることが分かります．

∂ L̃(α)
1
=1−
∂αj
2

具体的には，スラック変数 (slack：ゆるい)ξ を導入することで，

p.136

結 局 ，以 上 の 議 論お よ び minw,b 21 ∥w∥2∂(t α)∂α(Hα) + t αH
∂αj
∂αj


= 1 − (Hα)j

具体的には，スラック変数 (slack：ゆるい) ξn を導入することで，()(10.27)

argminw,bN
X
1∥w∥2 + C
max{0, 1 − yn (t wxn + b)}2
n=1)(10.27)

p.139, ソ ー
スコード 10.2の 16 行目を削除# ハードマージンのモデルを作成# model = LinearSVC(loss=’hinge’, C=10000.0, multi class=’ovr’, penalty=’l2’,
random state=0)
model = LinearSVC(loss=’hinge’, C=10000.0, multi class=’ovr’, penalty=’l2’,
dual=’auto’, random state=0)# ハードマージンのモデルを作成# model = LinearSVC(loss=’hinge’, C=10000.0, multi class=’ovr’, penalty=’l2’, random state=0)
model = LinearSVC(loss=’hinge’, C=10000.0, multi class=’ovr’, penalty=’l2’,
dual=’auto’, random state=0)

p.141のような警告が出た場合は，max_iter を大きくする，C を小さくするなどの工のような警告が出た場合は，linearSVC において max iter を大きくする (デ夫が必要になります．

フォルトは 1000)，C を小さくするなどの工夫が必要になります．

p.142,(10.36)

(
yn =

(

1
(t wxn > 0)
−1 (t wxn < 0)(10.36)9yn =1(t wxn +b > 0)
−1 (t wxn +b < 0)(10.36)

p.146, 1 行目
pp.147-148,
Y は太字にしない．

誤正

究極的には一つ一つのデータをすべて別の次元，データが N 個あれば N 次元

究極的には一つ一つのデータをすべて別の次元，データが N 個のとき N 次元まで拡張すれば，必ず N − 1 次元の分離超平面で分離することができます．

まで拡張すれば，必ず N − 1 次元の分離超平面で分離することができます．

t

ここで， ϕ(y n )w がスカラーであることに注意すれば，式 (11.2) および (11.3) より

ここで，t ϕ(y n )w がスカラーであることに注意すれば，
式 (11.2) および (11.3) より

N
N
(
)
1 ∑
1 ∑
ϕ(y n )t ϕ(y n )w = λw =⇒ w =ϕ(y n ) t ϕ(y n )w
N n=1
λN n=1V w = λwNN)
1 ∑1 ∑ (tvn ϕ(y n )ϕ(y n )w ϕ(y n ) =λN n=1
N n=1
 
v1
 . 
1
1t

=
[ϕ(y 1 ), . . . , ϕ(y N )]  ..  = N ϕ(Y )v
N
vN

=⇒
=⇒

1t
ϕ(Y )ϕ(Y )w = λw
N
(
w)
1
1
= t ϕ(Y )v
w = t ϕ(Y ) ϕ(Y )
N
λ
N

=

)
ϕ(y n )w /λ, v = t [v1 , . . . , vN ] としまし
た．したがって，式 (11.3) は次のようになります．

を得ます．なお，この式変形において vn =

(t

1t
1
1
ϕ(Y )ϕ(Y ) t ϕ(Y )v = λ t ϕ(Y )v
NNN
1=⇒ ϕ(Y )t ϕ(Y )ϕ(Y )t ϕ(Y )v = ϕ(Y )t ϕ(Y )v
N1=⇒ ϕ(Y )t ϕ(Y )v = ϕ(Y )v
N=⇒ KN v = λv

10を得ます．なお，この式変形において v = ϕ(Y )w/λ = t [v1 , . . . , vN ], vn =(t)
ϕ(y n )w /λ としました．したがって，µ = λN とおけば，式 (11.3) は次のようにな
ります．

1t
1
1
ϕ(Y )ϕ(Y ) t ϕ(Y )v = λ t ϕ(Y )v
NNN
1=⇒ ϕ(Y )t ϕ(Y )ϕ(Y )t ϕ(Y )v = λϕ(Y )t ϕ(Y )v
N1=⇒ ϕ(Y )t ϕ(Y )v = λv
N
1=⇒ KN v = λv =⇒ KN v = µv
N

誤

正

K̄N = Kn − ĒN KN − KN ĒN + ĒN KN ĒNK̄N = KN − ĒN KN − KN ĒN + ĒN KN ĒN

p.148, (11.4)

p.149，表 現を変更

カーネル関数は，元のデータが高次元空間に投影されたときにどのように見えるか，その「像」を提供します．実際にはデータを高次元空間に投影せずに，それらのデータが高次元空間でどのように見えるか（どのような関係性を持つか）を知ることができます．これは，元のデータ空間でのデータ点間の類似性を測定することによって達成されます．
そのため，カーネル PCA における「固有ベクトル」は，この高次元空間における固有ベクトルの「像」を表しています．これらの固有ベクトルは元のデー
タ空間のデータ点に対応しており，各データ点が新しい（高次元の）特徴空間
でどのように位置するかを示しています．それらは，「軸」ではなく，「射影されたデータ点」を表しています．
結局のところ，カーネル PCA の「固有ベクトル」は，この写像を通じてデー
タが高次元空間でどのように配置されるかを捉えています．したがって，これらの固有ベクトルは，元のデータ空間のデータに対応し，それぞれのデータ点が新しい特徴空間でどのように位置するかを示しています．

11

カーネル関数は，元のデータが高次元空間に投影された場合の関係性を捉えます．実際にはデータを高次元空間に投影せずに，元の空間におけるデータ点間の類似性を測定することによって，高次元空間でのデータの関係性を知ることができます．
そのため，カーネル PCA における固有ベクトルは，主成分軸そのものではな
く，データがこれらの軸に射影された結果を表しています．このことは，vn =t

ϕ(y n )w/λ であり，t ϕ(y n )w が ϕ(y n ) を w へ射影した座標であることからも分かります．つまり，これらの固有ベクトルは高次元空間におけるデータ点の射影を表しており，元の空間におけるデータ点の関係性を捉えています．
結局のところ，カーネル PCA の固有ベクトルは，写像された高次元空間におけるデータの分散の方向を捉えています．したがって，これらの固有ベクトルは，元の空間のデータに対応しており，それぞれのデータ点が新しい特徴空間
でどのように関連しているかを示しています．

誤p.157,(11.12).
ϕ を太字に．

tŵϕ(x) + b̂ =

t

N
X

!
α̂n yn ϕ(xn ) ϕ(x) + b̂ =n=1

p.158,(11.15)

N
X

正

N
X

α̂n yn K(xn , x) + b̂ = 0

n=1

ŵϕ(x) + b̂ =

t

N
X

!
α̂n yn ϕ(xn ) ϕ(x) + b̂ =

n=1

N
X

α̂n yn K(xn , x) = t (α̂ ⊙ y)K(X̃, X)

n=1

p.165

t

N
X

α̂n yn K(xn , x) + b̂ = 0n=1

α̂n yn K(xn , x) = t (α̂ ⊙ y)K(X, x)

n=1

訓練データ全体を一度用いて行う学習を 1 エポック (epoch) と数えます．訓練デー

訓練データ全体を一度用いて行う学習を 1 エポック (epoch) と数えます．訓練デー

タを複数のサンプルに分けたとき，そのサンプルのまとまりをバッチ (batch)， タを複数のサンプルに分けたとき，そのサンプルのまとまりをバッチ (batch)，
バッチに含まれるサンプル数をバッチサイズ (batch size) と称します．

バッチに含まれるサンプル数をバッチサイズ (batch size) と称します．バッチ
サイズのデータを一度用いて行う学習を１イテレーション (iteration) と数えます．例えば，訓練データセットが 1000 個のサンプルで構成されており，バッチ
サイズが 100 の場合，1 エポックは 10 イテレーションで構成されます．

p.166, (12.7),(12.8)
w

←

b

←

∂E
∂w
∂E
b−η
∂b
w−η

12

w

←

b

←

∂E
∂w
∂E
b−η
∂b
w−η

誤

p.168,(12.22)

p.182,
12.3

∂b
uj
=
∂w
bij
課題

p.184
p.188

∂

P

L
bpj xp + bj
p=1 w

∂w
bij

正


∂ ûj
=
∂w
bij

= xi

∂

P

L
bpj xp + bbj
p=1 w



∂w
bij

= xi

... としてプログラムを実行せよ．これらの結果に対する自分の考えや解釈を述べよ．

... としてプログラムを実行せよ．さらに，PyTorch による結果も確認せよ．これらの結果に対する自分の考えや解釈を述べよ．

畳み込み処理は，フィルタ (ﬁlter) またはカーネル (kernel) を用いて，画像から畳み込み処理は，フィルタ (ﬁlter) またはカーネル (kernel) と呼ばれるものを用

特徴を抽出する操作のことを指します．

いて，画像から特徴を抽出する操作のことを指します．

畳み込み層やプーリング層の出力を全結合層に入力する際には，出力された画

畳み込み層やプーリング層の出力を全結合層に入力する際には，出力された画像は平坦なベクトルに変換されます．

像は平坦なベクトル (1 次元配列) に変換されます．

...
最終的に「猫らしさ」や「犬らしさ」などの数値を出力するためには，何らか...
最終的に「猫らしさ」や「犬らしさ」などの数値を出力するためには，何らかの段階で特徴を 2 次元から 1 次元に変換する必要があります．

の段階で特徴を 2 次元配列 (画像あるいは行列) から 1 次元配列 (ベクトル) に変換する必要があります．

p.189

これらを疑似的に再現することが，データ拡張における重要なポイントとなります．

これらを疑似的に再現することが，データ拡張における重要なポイントとなります．
画像に含まれる被写体の意味を変えるような操作をしてはいけません．
例えば，親指を立てたサムズアップと下に向けたサムズダウンとでは意味が異なるので，これらの画像を 180 度回転させてデータ拡張することは適切ではありません．

p.190, モメン
タム

ただし，確率的勾配降下法と比較すると，調整が必要な定数が η, α の 2 つなの

ただし，確率的勾配降下法と比較すると，調整が必要な定数が η, α の 2 つなので，やや調整が難しくなります．

で，やや調整が難しくなります．なお，本節で登場する式 (13.2)〜(13.12) は成∂E+ α∆wjk と解釈
分ごとに解釈します．例えば，(13.2) は wjk ← wjk − η ∂w
jk

します．

13

誤

p.190, 最終行

正以下においても，t が更新回数です．

以下において，右下の (t) が更新回数です．

p.191
∂E
∂wt−1

2
∂E
vt ← β2 vt−1 + (1 − β2 )
∂wt−1
mt
m̂t ←
1 − β1tvtv̂t ←1 − β2tm̂t
wt ← wt−1 − η √v̂t + ϵmt ← β1 mt−1 + (1 − β1 )(13.8)

m(0) = v(0) = 0∂E∂w(t−1)2∂Ev(t) =β2 v(t−1) + (1 − β2 )∂w(t−1)m(t)m̂(t) =
1 − β1tv(t)v̂(t) =
1 − β2tm̂(t)w(t) =w(t−1) − η pv̂(t) + ϵm(t) =β1 m(t) + (1 − β1 )(13.9)(13.10)(13.11)(13.12)14(13.8)(13.9)(13.10)(13.11)(13.12)

p.191
p.196, 10 行
目を 9 行目に移動

p.196, 上 記
変更に伴う
出力結果変
更 ．(conv2)と (pool) を
入れ替え．

誤

正

式 (13.8) は式 (13.2) に，式 (13.9) は式 (13.6) に対応しており，式 (13.10) によ

式 (13.8) は式 (13.2) に，式 (13.9) は式 (13.6) に対応しており，式 (13.12) によりこれらを組み合わせた更新しています．

りこれらを組み合わせた更新しています．

７行目: # 畳み込み層:(入力チャンネル数, フィルタ数、フィルタサイズ)

７行目: # 畳み込み層:(入力チャンネル数, フィルタ数、フィルタサイズ)

８行目: self.conv1 = nn.Conv2d(3, 6, 5)

８行目: self.conv1 = nn.Conv2d(3, 6, 5)

９行目：# プーリング層:（領域のサイズ, ストライド）

９行目：self.conv2 = nn.Conv2d(6, 16, 5)

10 行目：self.conv2 = nn.Conv2d(6, 16, 5)
11 行目：self.pool = nn.MaxPool2d(2, 2)

10 行目：# プーリング層:（領域のサイズ, ストライド）Net((conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))(pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))(fc1): Linear(in_features=400, out_features=256, bias=True)(dropout): Dropout(p=0.5, inplace=False)(fc2): Linear(in_features=256, out_features=10, bias=True))

Net((conv1): Conv2d(3, 6, kernel_size=(5, 5), stride=(1, 1))(conv2): Conv2d(6, 16, kernel_size=(5, 5), stride=(1, 1))(pool): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(fc1): Linear(in_features=400, out_features=256, bias=True)(dropout): Dropout(p=0.5, inplace=False)(fc2): Linear(in_features=256, out_features=10, bias=True))

8 行目 . . .

8, 20 行目 . . .

10 行目 . . .

11, 20 行目 . . .

11 行目 . . .

9, 11, 21 行目 . . .

11 行目：self.pool = nn.MaxPool2d(2, 2)

p.197

p.198, 実行例の後に追記

ソースコード 13.5 の 32 行目にある eval メソッドは，モデルを評価モードに設定するために使用されます．この評価モードは，Dropout のような訓練と評価で挙動が異なるメソッドに影響します．訓練モードでは，これらのメソッドはランダムな挙動を示しますが，評価モードではランダム性が排除され，一貫した出力が得られます．そのため，テストデータセットでの評価や新しいデータに対する予測を行う際には，network.eval() のように指定して評価モードに設定することが重要です．

15

誤

正

p.201,
図14.2, 14.3

図中の (t) を (T ) にする．

p.202

隠れ状態ベクトル (hidden state layer) の次元を示します．

隠れ状態ベクトル (hidden state vector) の次元を示します．

p.205

入力に対する損失関数の勾配は次のようになります．

式 (14.7) より，入力に対する重み行列 W の勾配は次のようになります．

 (t)
x11
 (t)
T
T
X
X  x12∂Et (t) (t)
 .
=
X ∆ =
 .
∂W
 .
t=1

t=1

(t)

x1m

x21
(t)
x22
..
.

(t)

···
···
..
.

  (t)(t)
δ11xh1(t)   (t)xh2  δ21.. 
  ..
.  .

(t)

···

xhm

x2m

(t)

(t)

δh1

δ12
(t)
δ22
..
.

(t)

···
···
..
.


(t)
δ1n
(t) 
δ2n 
.. 

. 

(t)

···

δhn

δh2

(t)

ここで，h はバッチサイズ，m は入力ベクトルの次元です．したがって，t X (t)
および ∆

(t)

はそれぞれ h × m および h × n の次元を持つ行列となります．

 (t)
x11
 (t)
T
T
X
X  x12∂Et (t) (t)
 .
=
X ∆ =
 .
∂W
 .
t=1

t=1

(t)

x1m

x21
(t)
x22
..
.

(t)

···
···
..
.

  (t)(t)
δ11xh1(t)   (t)xh2  δ21.. 
  ..
.  .

(t)

···

xhm

x2m

(t)

(t)

δh1

δ12
(t)
δ22
..
.

(t)

···
···
..
.


(t)
δ1n
(t) 
δ2n 
.. 

. 

(t)

···

δhn

δh2

(t)

ここで，h はバッチサイズ，m は入力ベクトルの次元です．したがって，t X (t)および ∆(t) はそれぞれ m × h および h × n の次元を持つ行列となります．

行列の各要素は，バッチ内のデータ点および時間ステップ全体での総和を取っ

行 列 の 各 要 素 は ，バッチ 内 の デ ー タ 点 お よ び 時 間 ス テップ 全 体 でたものになります．したがって，あるバッチ内での勾配は，各データ点におけの 総 和 を 取った も の に な り ま す．し た がって ，あ る バッチ 内 で のる勾配の総和で求めることができます．これは，式 (14.7) によってバッチ処理

勾 配 は ，各 デ ー タ 点 に お け る 勾 配 の 総 和 で 求 め る こ と が で き ま す．

に対応しています．

これは，式 (14.7) によってバッチ処理に対応しています．

16

誤

p.206

正

まず，次のように定義します．

まず，次のように定義します．
(t)δout =∂E∂eu(t)これにより，式 (14.7) と同様の考え方から，次の式を得ることができます．
T
X

T
X

∂E ∂e
∂E
u(t)
(t) (t)yi δout
=
=
(t)
∂w
ei
∂
w
e
∂e
u
i
i=1
i=1

p.209, ソース
コ ー ド 14.2,
13 行目

def forward(self, x):

p.209, ソース
コード 14.3# 最適化アルゴリズム SDG を指定

p.212 の 式
(14.19)〜(14.21)(14.13)# フォワードパスの定義(t)(14.12)

∂e
uj

T
T
X
X
∂E ∂e
∂E
u(t)
(t) (t)yi δout,j==(t) ∂ w
∂w
eij
e
∂e
u
ij
i=1
i=1

(14.13)# 順伝播の定義# 最適化アルゴリズム SGD を指定(14.19)(14.20)Pτ Ph(t)δ
Pτt=1 Phk=1 k2(t)
t=1
k=1 δk2
..
.
Pτ Ph
(t)
t=1
k=1 δk2∂E

これにより，式 (14.7) と同様の考え方から，次の式を得ることができます．

def forward(self, x):τX∂Et (t) (t)
=
X ∆
∂W
t=1
τ
X
∂E
t (t−1) (t)
=
Y
∆
∂V
t=1
Pτ Ph(t)
t=1
k=1 δk1
PP τ(t) t=1 hk=1 δk1
∂E
=
..

∂B

.
Pτ Ph
(t)
t=1
k=1 δk1

δout,j (t) =(14.12)

···
···
..
.
···


Pτ Ph
(t)
δ
Pτt=1 Phk=1 kn
(t) 
t=1
k=1 δkn  (14.21)
..


.
Pτ Ph
(t)
δ
t=1
k=1 kn17

TX∂E
t (t) (t)
=
X ∆
∂W
t=1
T
X
∂E
t (t−1) (t)
=
Y
∆
∂V
t=1
Ph
Ph
(t)
(t)
k=1 δk1
k=1 δk2
P
P
(t)
(t)
h
T 
X
 hk=1 δk1∂E
k=1 δk2

=
..
..

∂B
.
.
t=1 
Ph
P
(t)
(t)
h
δ
k=1 k1k=1 δk2(14.19)(14.20)
···
···
..
.
···


Ph
(t)
k=1 δknPh(t) 
k=1 δkn 

..


.
Ph
(t)
δ
k=1 kn(14.21)

p.212, 14.9.2

p.213, ソース
コード 14.5

p.213, ソース
コード 14.5

p.214, ソ ー
スコード 14.5の 71 行目

誤

正

出力層は全結合層となります．この出力層において，活性化関数を f ，重みを出力層は全結合層となります．この出力層において，活性化関数を f ，重みをW ，バイアスを B ，入力を X ，そして出力を Z と表すこととします．すると，順伝播は以下の式で表現できます．

W ，バイアスを B ，入力を X ，そして出力を Z と表すこととします．通常，
f , W , B は RNN 層のそれとは違うものです．同じ記号を使っていますが，異なるものであることに注意してください．すると，順伝播は以下の式で表現できます．

# 各設定値
n_steps = 10 # 時系列のステップ数
n_input = 1 # 入力層のニューロン数n_hidden = 20 # 中間層のニューロン数
n_output = 1 # 出力層のニューロン数# 各設定値
n_steps = 10 # 時系列のステップ数 . ソースコード 14.1 の n time に相当
n_input = 1 # 入力層のニューロン数 . ソースコード 14.1 の n in に相当

n_samples = 【ソースコード 14.1 と同じ】 # サンプル数
input_data = 【ソースコード 14.1 と同じ】 # 入力
correct_data = 【ソースコード 14.1 と同じ】 # 正解
for i in range(0, n_samples):input_data[i] = 【ソースコード 14.1 と同じ】
correct_data[i] = 【ソースコード 14.1 と同じ】 # 正解は入力よりも一つ後

n_samples = 【ソースコード 14.1 と同様】 # サンプル数
input_data = 【ソースコード 14.1 と同様】 # 入力
correct_data = 【ソースコード 14.1 と同様】 # 正解
for i in range(0, n_samples):input_data[i] = 【ソースコード 14.1 と同様】
correct_data[i] = 【ソースコード 14.1 と同様】 # 正解は入力よりも一つ後

delta = self.y - t

n_hidden = 20 # 中間層のニューロン数
n_output = 1 # 出力層のニューロン数 . ソースコード 14.1 の n out に相当# 出力の誤差 (14.25) の実装

delta = self.y - t

18# 出力の誤差 (14.29) の実装