ゼロ から 作る deep learning 3。 O'Reilly Japan

ゼロから作るDeep Learning(理論と実装)輪読会 #3

ゼロ から 作る deep learning 3

こんにちは、斎藤 康毅(さいとう こうき)といいます。 ここ1年間はずっと本を書いていました。 最近ようやく、原稿を書き終わろうとしています。 この本は「ディープラーニングの フレームワークを作ろう」という本です(野心的にも、オリジナルの「フレームワーク」をゼロから作ります)。 世界中を見回しても、ほとんど類書がないような本になっていると思います。 これから先、できるかぎり良い本になるよう、最後の最後までブラッシュアップしていく予定です。 さて、今回も前作同様に「公開レビュー」を行います。 興味のある方は、を用意していますので、チェックしてみてください(無料です!)。 問題に感じた箇所や改善すべきと思った点など、コメントいただけますと幸いです。 どんなに小さな指摘や疑問でも構いませんので、気軽にコメントください。 また、レビューに貢献していただいた方には、感謝の印として、本書に名前を記載させていただく予定です(もちろん、同意のある方のみです)。 ちなみに前作では、下記のように、レビューアの方の名前を掲載しています(左は『』、右は中国語に翻訳された『』)。 前提条件としては、Pythonの基本的な知識が必要になります。 そして、ディープラーニングのフレームワーク(Chainer、PyTorch、TensorFlowなど)に興味のある方に適した内容になっています。 ちなみに、本書の概要は次のとおりです。 本書では「DeZero」というディープラーニングのフレームワークを作ります。 DeZeroは本書オリジナルのフレームワークです。 最小限のコードで、フレームワークのモダンな機能を実現します。 本書では、この小さな——それでいて十分にパワフルな——フレームワークを、全部で60(予定)のステップで完成させます。 それによって、PyTorch、TensorFlow、Chainerなどの現代のフレームワークに通じる深い知識を養います。 それでは以下に、今回の「公開レビュー」についての内容を掲載します。 レビュー期間(予定) 2019年11月22日〜2020年1月13日 原稿データ 原稿は下記のページにあります。 今回もDropboxの「」を使ってレビューを行います。 また、原稿は随時追加していく予定です。

次の

【読書レビュー】ゼロから作るDeep Learning │ たけブログ

ゼロ から 作る deep learning 3

目次(カッコ内は筆者の大体の学習時間) 1章:Python入門(2時間) 2章:パーセプトロン(2時間) 3章:ニューラルネットワーク(4時間) 4章:ニューラルネットワークの学習(4時間) 5章:誤差逆伝搬法(3時間) 6章:学習に関するテクニック(5時間) 7章:畳み込みニューラルネットワーク(4時間) 8章:ディープラーニング(3時間) 学習で用いるPythonの基礎から、ディープラーニングのアルゴリズムであるニューラルネットワークの内容と成り立ち、 さらに現在ディープラーニングの分野で話題の技術・手法の概要まで、実装レベルに落とし込んで学習できます。 他の方の読後レビューも読んでみましたが、機械学習を学習済みの人にとっては、1章〜5章までは流し読みできるレベルで、6章からが本番のようでした。 僕はPython、機械学習共にほぼ初めてなので、テキストに書かれているコードを自分でもコーディングしながら進めました。 入門書としては、第5章までの機械学習の基礎についても大変分かりやすくまとめられていて良かったです。 第6章からは、確かにレベルがグッと上がり、より実践的な内容に。 ここからは、自分でコード書きながら(試行錯誤しながら)進めるのは難しく感じたので、基本的にはテキストで用意されているコードの動作を確認しながら進めました。 6章以降も、実践的な内容ながらも、初心者向けに丁寧な説明がされており、用意されたコードを動かしてみるだけでも何となくは理解できます。 でも、もっと時間があれば、第6章以降も自分でコーディングして学習したかったところ。 8章では、刊行時点(2016年9月)で、ディープラーニング分野におけるホットな技術についてもテクニカル面も含めて説明されています。 本の内容を理解する上で肝になりそうな部分 2章:パーセプトロン ・ニューラルネットワークの理論は、どんな過程を経て注目されるようになったのか。 ・ニューラルネットワークの元となったアルゴリズムであるパーセプトロンの説明と、パーセプトロンの限界について。 パーセプトロンでは層を重ねることで非線形な表現も可能。 3章:ニューラルネットワーク ・パーセプトロンからニューラルネットワークへのアルゴリズムの進化と双方の関連性。 ・ニューラルネットワークの出力における、恒等関数(回帰問題)とソフトマックス関数(分類問題)の使い分けとその理由。 ・ニューラルネットワークのアルゴリズム。 重みとバイアス。 4章:ニューラルネットワークの学習 ・ニューラルネットワークにおける学習のプロセスについて。 ・SGD(確率的勾配降下法)の理解。 (説明がわかりやすいように、この本では、各レイヤ(演算)ごとに微分を計算する、計算グラフを用いている)。 ・誤差逆伝搬法の方が、SGDより計算が複雑になるが、処理が早い。 SGDは、誤差逆伝搬法で解いた式(損失関数の勾配)が正しいか否かを確認するのに主に使われテイル。 ・ニューラルネットワークは、ReLUレイヤやSoftmax-with-Lossレイヤ、Affineレイヤ、Softmaxレイヤなどのレイヤを組み合わせることで、好きなようにカスタマイズできる。 6章:学習に関するテクニック ・SGDの欠点と、Momentum・AdaGrad・Adamの理論について。 どれも最速でパラメータを更新するための手法として考案されており、最適解はケースによって異なる。 最近はAdamが使われることが多い。 ・重みの初期値の重要性と、重みの初期値を決定するために用いられる手法。 ・各レイヤのアクティベーション分布が均等であるほど学習が早く進む。 また強制的に均等に調整するために、Batch Normalizationの手法がある。 ・過学習抑制のための、Weight decayについて。 重みの値が大きくなりすぎないように、損失関数に重みの二乗ノルムを加算する手法。 損失関数が最小化されるように学習が進むことにより、重みが抑制される。 ・ハイパーパラメータ(人が決める必要のある値)の種類と最適化方法。 推論からざっくりと決定し、網羅的に値を取り比較することで、範囲を絞り込んでいく。 7章:畳み込みニューラルネットワーク ・全結合層の問題点と、それを解決する畳み込み層について ・畳み込み層演算(パディング、ストライド、フィルター層) ・CNN(Convolutional Neural Network)の実装(Convolutionレイヤ、Poolingレイヤ) ・CNNにおける各レイヤにおける画像認識の可視化。 畳み込み層の1層目では、規則性のある画像となり、グラデーションを伴って変化するフィルターやブロブ(塊のある領域)をもつフィルターとなる。 学習がすすむにつれ、抽象的な情報が抽出されるようになる。 ・代表的なCNN、LeNet、AlexNet。 8章:ディープラーニング ・MNIST文字認識では、さほど階層の深いニューラルネットワークは不要。 だが、画像認識などより複雑なケースでは、階層を深くすることで認識性能が向上するケースが多い。 実際、最近のディープラーニングは、層を深くする方向性。 ・小さなネットワークを重ねてフィルターを深くした方が、学習の効率が高く、またパラメータを減らせるので計算量も少なくて済む。 ・ディープラーニングの歴史。 画像認識コンテストにおいて、2010年では誤認識率が28. CNNの階層をいかに深くするかが最近のトレンド。 ・学習速度の高速化手法。 GPUによる高速化、分散学習、演算制度のビット削減について。 ・ディープラーニングの実用例と用いられている技術。 物体検出、セグメンテーション、画像キャプション作成について。 ・最新の研究。 画像スタイル変換、画像自動生成、自動運転における周辺環境認識、強化学習について。 感想、所感 数学的な頭の使い方も求められて良い感じ 偏微分や行列計算、ネイピア数など、昔数学の授業でやったことを思い出しながら学習していくのはとても楽しかったです。 やはり知的な刺激がある日々は良いものだなと感じたりしました。 難易度的に入門書としてちょうど良く、説明もわかりやすい 前知識はほとんどない状態で本書に挑みましたが、説明が非常に丁寧で、難易度的にもちょうど良く感じました。 よく技術書を読んだ時に起こる、一番難しい部分がなんとなく腑に落ちないような「消化不良感」は、この本では起きませんでした。 ただ記事の始めでも書きましたが、7章のCNNから難易度が上がり、理論的にはなんとなく理解できるものの、実装レベルでの理解が追いつかなかったのが残念ではありました。 CNNの実装については、今後の課題とします。 もっと深く、ディープラーニングが学びたくなる 本の内容的には入門書ではあるのですが、より実践的な内容や最新の研究内容のリンクが参考文献としてまとめられています。 そのため、さらなる学びの足がかりとしても本書を活用できる点がとても魅力に感じました。 ディープラーニングによる画像認識のプロセスについてイメージが湧きやすい 本を読むまで、人間は画像や文字の全体を見て「これは3」などと判断するのに対して機械はピクセル単位でしか認識できないのに、機械がどのように画像認識を行うのか疑問に感じていました。 画像をピクセル単位で入力情報として読み込み、それらを用いてニューラルネットワークを介して認識するというのが、どうも腑に落ちない感じがありました。 しかしそれも、第4章での「特微量」についての説明(入力データの本質的なデータを的確に抽出するための変換器)、 また第 7章でCNNの説明(画像の縦・横・チャネルを入力情報のままで扱える)によって、より納得感を持って学べました。 また、CNNが画像認識を行なう上で、階層が深くなるにつれて、各レイヤでフィルター画像がどのように変化していくか、具体的なイメージが見れるのも良いです。 ニューロンが単純な形状から、より高度な情報へ変化していく様子が、可視化できるのは興味深いです。 以上、本記事では「ゼロから作るDeep Learning」の書籍について紹介しました。 2018. 15 書籍「組織にいながら、自由に働く」(仲山進也著)を読了しました。 その中で気に入ったフレーズがあったので、紹介するとともに、一旦手を止めて自らを振り返[…]• 2018. 14 書籍「いますぐ妻を社長にしなさい」(2014年・坂下仁著)を読了しました。 (読書時間:約2時間) タイトル的には、何やら怪しげな雰囲気を感じる本ですが[…]• 2018. 26 読書が好きなのだけど、最近仕事が忙しかったり家事が忙しかったりで、中々時間が取れないなぁ。 せっかく購入した本も、結局読めずに積み上がっていくし…。 この[…].

次の

『ゼロから作るDeep Learning 3』のコードを全て読んでみた(1)

ゼロ から 作る deep learning 3

その2 を実際に実装する 以下NN では入力の(重み付き)線形和に対して その1 で学んだ活性化関数をかけて出力とします。 で、この線形和を効率的に計算する上で行列の計算は欠かせません。 今回はまずこの行列演算の話をしてから、NNの実装、加えて最終的な出力をどうするかの話をつらつらと書いていきます。 ndarrayは行列計算の 超強力なツールです。 実装したのであとは動作確認します。 本の中で例として重みと入力が与えられてるのでそれを使ってみます。 arange 0. 1, 0. 65, 0. linspace 0. 1, 0. arange 0. 1, 0. 65, 0. linspace 0. 1, 0. arange 0. 1, 0. 45, 0. linspace 0. 1, 0. 1 0. 3 0. 5 0. 1 0. 2 0. 1 0. 2 0. 4 0. 5 0. 1 0. 1 0. 3 0. 1 0. 2] あとはこれらの重みとバイアスを使って3層NNを初期化、入力をつっこみます。 array [ 1. 0, 0. 31682708 0. 69627909] おお、動いた!でも学習させたわけじゃないので何が良いのかわかんないですよね。 これに関しては次回に期待です。 これにて基本的なNNの実装は完了です。 出力層の話 実装の話の中で出力層における活性化関数 の話が出ました。 こいつに何を用いるかは解く問題が回帰問題か分類問題かで変わるそうです。 そして、回帰問題では 恒等関数を、分類問題では ソフトマックス関数を使うのが一般的らしい。 実装のときにも出てきた恒等関数は入力をそのまま出力する関数です。 この後出てくるソフトマックス関数との比較のために、隠れ層からの入力 と 出力 の関係を書くと、 となります。 改めて図示すると以下の通り。 一方のソフトマックス関数は以下の式で表されます。 これを図示すると以下の通り。 両者の大きな違いとして、恒等関数は自分の(ノード)に入ってきた入力だけを使って出力を出しますが、ソフトマックス関数は同じ層の他の入力も使って出力を出しています。 ソフトマックス関数は出力 の総和が1になる( となる)ようになっているので、確率みたいに使うことができるというお話。 例えば、入力 がクラス である確立を として学習させるみたいなことが可能です。 ただ、なんで を噛ませるのかはよく分からないんですよね。 総和を1にするためなら必要ないですし。 この方が微妙な差を捉えられるとか?まあそのうち理由が出てくると期待。 そんなこんなで実装です。 別に難しくないのでそのまま作ります。 max np. amaxと同じ機能. なので、上の実装ではベクトル の最大値を各 に をかける前に引くことで解決しています。 コレがうまくいくのは式変形に拠るのですが、それについては本を参照。 実際にちょっと試して見ます。 array [ 100024. , 100025. , 100027. 33332889 0. 33333222 0. 04201007 0. 1141952 0. 84379473] 確かに の和は1になります。 因みに、 normalは単純な和で全体を正規化したもの。 こう見比べると、差を増幅させるのがソフトマックスで を噛ませる目的な気がしてきますね。 今回のまとめ 確か今回は実装回で、「(numpy)の便利さが遺憾なく発揮され、コードの占める量も増えるはずだ!」って前回の終わりに書いたのですが、現実はひたすら行列計算の説明をしてました。 どうしてこうなった...。 さらっと終わるはずだったのにえらく長くなっちゃうし。 今回のポイントは• 行列計算においてNumpyは最強• 行列計算を使うことでNNはシンプルに実装できる もう今回行列のことしか書いてないですね、うん。 次回は3章その3 実装したを試してみる です。 著者側が用意したデーで使ってみようってだけなのでさらっと終わる.. ああ早くに行きたい.. おまけ 実装したNNを試してみるときに、 numpy. arnge とか np. linspaceを使いました。 こいつらは numpy. ndarrayを生成するときに結構便利です。 ただそのまま使うと、 print np. linspace 0. 1, 0. 1 0. 2 0. 3 0. 4 0. 5 0. 6] 一次元配列が生成されてしまうので、 reshape を使うことで良い感じの形に変えれます。 print np. arange 1, 9, 2. linspace 0. 1, 0. 6, 6. 1 0. 2 0. 4 0. 5 0. 6]] といってもこんな規則の良い数字で初期化することって少なそうですし、 np. zeros や np. ones 、あるいは np. full で、指定した形の配列に同じ数字が入っているものを使うことが多い気がします。 print np. ]] print np. ]] print np. full 2, 4 , 1. 125 0. 125 0. 125 0. 125 0. 125 0. 125 0. 125]] それと、 np. arangeに小数を渡すと謎の挙動をすることがあって、 print np. arange 0. 1, 0. 4, 0. 1 0. 2 0. 3 0. 4] print np. arange 0. 1, 0. 5, 0. 1 0. 2 0. 3 0. 4] なんで一緒のやつでるんやコレ...。 まあ小数ならではっぽい。 とりあえずの解決策としては、 print np. arange 0. 1, 0. 35, 0. 1 0. 2 0. 3] print np. arange 0. 1, 0. 45, 0. 1 0. 2 0. 3 0. 4] みたいに、要素間の間隔 0. 05 で上限を取るようにするしか思いつかないですね。 Tawara.

次の