funolympics’s blog

東大数学科生のAIを使い起業するまでのお話

ゼロから作るDeep Learningでど素人がつまずいたことメモ 7章

7.4.3 convolutionレイヤの実装

 

この章までは読むだけだったので何も詰まるところはありませんでした。

しかし、7.4.3からは実装が入ってくるので少し時間がかかることが予想されます。このim2colというのはブラックボックスとして想定されていますがそれは嫌なので

www.anarchive-beta.com

を読んで、何とか頑張ろうと思います。

と思っていたのですが、結局読まず、教科書だけの説明を理解することにしました。

 

感想

今回は色々と読みましたがあんまり自分で作った感がありません。からっぽのしょこさんみたいにじっくりと取り組むと本当の実力がつきそうなのですが、僕はサーっと読んでしまいました。

ゼロから作るDeep Learningでど素人がつまずいたことメモ 6章

感想

ここで躓いた点は特にありませんでした。おそらくあまりcodingをしていないからで説明をただボケーっと読んでいたからでしょう。

からっぽのしょこさんのブログがとても詳しく書いてくれているのでそれを参照しようと思います。

www.anarchive-beta.com

この方のブログはとても分かりやすくて丁寧に書いてあるのでとてもお勧めできます。

ゼロから作るDeep Learningでど素人がつまずいたことメモ 5章

5.3.3 リンゴの例

図5-15で何をしているのかよく分からないまま適当に記入したら間違いました。

やっぱり原理を理解することは大切ですね。

 

5.4.2 加算レイヤの実装

class AddLayer:

    def __init__(self):

          pass

   ↑

なんでここがpassでいいのかよく分かって無いです。

本には加算レイヤでは特に初期化は必要ないのでと書いてありますが、なんで乗算レイヤでは必要となっているのかの区別がよくつきません。

誰か詳しい人がいたら教えていただけると助かります。

 

5.5.1 ReLUレイヤ

ここでのmaskの使い方がよくわかりません。なんでこのようなことをする必要があるのでしょうかという感じになっています。

 

5.6 Affineレイヤ

ベクトルをベクトルで微分するという操作は

(y1, y2, ... ,yn)Tを(x1, x2, ..., xn)で各要素をx等で微分すればいいのですが、ベクトルを行列で微分しているところがあってそこが微妙でした。この本では行列の積を行うためには成分をうまく調整しなくてはならないから(5.13)が導出されると書いてありますがそれは導出でも何でもなくて積がうまく行われるためにうまく調整しているだけだと思われます。

結局ここは調べてもよく分からなかったです。

 

5.7.2 誤差逆伝播法に対応したニューラルネットワークの実装

まずfrom common.layers import *とありますがこれは要るのでしょうか?これはいらないような気がするのですが詳しい人がいれば教えてください。

ずっとif t.ndim = !1 t = np.argmax(t axis=1)の意味がわからなかったんですけど、

if t.ndim != 1というのはtの次元が1でなければ(つまりone-hot-labelであれば)という意味だったんですね。こういう細かいところの説明もあると良いのですが、、、

次にloss_W = lambda W: self.loss(x, t)という一文なんですが、lambda Wとしてるんだったら、その後の定義する式にWは登場しないの??となりました。分かる人がいれば教えてください。

最後らへんのdW, dBってなんだったけと思い返したら、p152にclass Affineを定義するときに登場していました。ここで思ったのですが、db = np.sum(dY, axis=0)として定義されたいて変な定義だなあと思っていたのですがこれも次元を合わせるための形式的な定義のようですね。

 

5章の感想

少し時間をかけすぎました(18日間くらい)。旅行に行っていたこともあるのですが。時間をかけ過ぎるとこれはなんだったっけと確認の回数が多くなるのでとても効率が悪かったです。今度はもう少し集中的にしなければならないなと感じました。

ゼロから作るDeep Learningでど素人がつまずいたことメモ 4章

4.2.4 [バッチ対応版] 交差エントロピー誤差の実装

まず教師データがone-hot表現の方に少し苦労したのですが、教師データがラベルとして与えられた時は意味不明でした。

そこで、

www.anarchive-beta.comt

というサイトを参照しました。

ここで、y[np.arange(batch_size), t]でyから座標(batch_size, t)が抜き出されるということがわかり、式の意味が分かりました。からっぽのしょこさんありがとうございました。

 

4.3.2 数値微分の例

このセクションの一番最後にあるソースコードch04/gradient_1d.pyの内容がよくわからなかったです。

def tangent_line(f, x):
  d = numerical_diff(f, x)
  print(d)
  y = f(x) - d*x
  return lambda t: d*t + y

このlambdaが何をしているのかがよくわかりませんでした。そういうpythonの関数なんですね。lambdaの後に使いたい文字(例えばa, b, c)を指定して、:の後に使いたい関数を入力するという仕組みのようです。

例えば、

>>>add = lambda a, b, c: a + b + c

>>>add(10, 10, 10)

30

となります。

http://biopython.seesaa.net/article/451906424.html

https://towardsdatascience.com/python-lambda-function-b6e1fa3420c1

この二つのサイトはとても参考になりました。ありがとうございます。

 

4.3.3 偏微分

ここで初めてcodeが示されてない部分が出てきました。

function_2(x)のグラフですね。

これは

gist.github.com

を参考にというか丸写ししたら綺麗なグラフが描けました。

 

#ここら辺で初めて1e-10= 0.0000000001など10の−10乗を表すことを知りました、、、

 

4.4.1 勾配法

図4−10を描くコードがch04/gradient_method.pyにあるんですが、僕はこのコードのfom gradient_2d import numerical_gradientのところで毎回 No module named 'gradient_2d'というエラーが出てきてしまうので諦めて

www.anarchive-beta.com

このサイトを参照しコードをコピペしました。

そしたら実際綺麗な図が描けました。

 

4.4.2 ニューラルネットワークに対する勾配

simpleNetというものを構成するときに、なんでこんなにselfという訳の分からないものがたくさん出てくるのだろうと思っていたのですが、classを設定するのに必要だったのだなと思い出しました。一番最初の方の10ページあたりでしています。

そこからもlambdaってなんだったっけとも思ったのですが、これも以前出てきたものでした。

 

4.5.2 ミニバッチ学習の実装

最初コード通り打っていたはずなんですが、最後のappendコマンドが無いみたいなことを言われて、明日に回してもう一度打ってみると今度は時間がかかりすぎて終わりませんでした。なので、結局高速版の方を使うとできました。後は、グラフが欲しかったので

qiita.com

このサイトに載っていたグラフのcodeを打ち込むと

f:id:FUNolympics:20210827113516p:plain

グラフ

このようなグラフをゲットしたのですが、意外と右上の細かい数字を見てみると最後らへんは値が0.2付近で止まっているのをみると案外小さくならないんだなと思いました。ただaccuracyの値はまだ見てないので何とも言えません。

4.5.3 テストデータで評価

ここら辺でコードをコピペするという技を覚えてしまいました。

今までは見てそのまま手動で打ち込んでいたのですがコピペは楽ですね。

教科書のようなグラフは出てこず、最初からaccuracyは94くらいでした。

f:id:FUNolympics:20210827122114p:plain

手動のグラフ

ただし、python train_neuralnet.pyによってpythonに勝手にやらせると

f:id:FUNolympics:20210827122233p:plain

python_neuralnet.pyによるグラフ

このような綺麗なグラフが出てきました。全く同じものをcodeしているはずなのに違う値が出てくるのは奇妙でした。

 

感想

思っていたより時間がかかりました。4章で挫折したという声もちらほら聞いていたので自分が終わるかは不安でしたが何とか終わらせることができました。4章だけで1週間かかった計算となります。ただ時間がかかっても終わらせれたので満足しています。

次は5章にチャレンジ!

ゼロから作るDeep Learningでど素人がつまずいたことメモ 3章

3.3.1 多次元配列

1次元配列という概念がよくわかりませんでした。

A = np.array([1, 2, 3, 4])

B = np.array([[1], [2], [3], [4]])

これの差があまり良く分かりませんでした。

A.shape

>>>(4,)

B.shape

>>>(4,1)

となることは分かったのですが、行列のやりすぎ?で1次元配列というものに強烈な違和感を抱いています。

後々の行列の積のところでも、行列と1次元配列の積が出てきて???となりました。

これは数学科出身だから違和感を覚えているのでしょうか?

 

3.6.1 MNISTデータセット

そもそもカレントディレクトリーをch03にする方法がよくわからず右往左往していました。

まずそもそもこの本に書いてある

https://github.com/oreilly-japan/deep-learning-from-scratch

に行って、ダウンロードしないといけないことに気づくのに時間がかかりました。

それからはcd /Users/.../Downloads/deep-learning-from-scratch-master/ch03

とすればカレントディレクトリーをch03にできました。

 

(x_train, t_train), (x_test, t_test) = \

    load_mnist(flatten=True, normalize=False)

の部分の \ ←これ何のためにあるのでしょうか。ただの行替えでしょうか。

分かる人教えていただければ非常にありがたいです。

 

3.6.2 ニューラルネットワークの推論処理

つまずいたことではないのですが、適当なタイミングでターミナルを終了していたので、定義した数式が残らないことにここら辺で気づきました。

 

感想

ここまでたまにつまずくことはあったものの何とか来れました。

Amazonのレビューで4章でつまずいたという意見をちらほら見たので少し次が不安です、、、、笑