ゼロ から 作る deep learning python で 学ぶ ディープ ラーニング の 理論 と 実装。 「ゼロから作るDeep Learning」書評。購入を迷っている方へ

「ゼロから作るDeep Learning」のその先へ... TensorFlowを使いこなす

ゼロ から 作る deep learning python で 学ぶ ディープ ラーニング の 理論 と 実装

大ベストセラーの斎藤 康毅著『』。 すでに入手された方は多いと思います。 Amazonでも好意的な評価が多く、期待していたのですが、評判通り丁寧な本で、これまでイメージでしか理解していなかったディープラーニング 深層学習 について、コード上での具体的な動きがよくわかるものでした。 目次はこんな感じです。 1章 Python入門 2章 パーセプトロン 3章 ニューラルネットワーク 4章 ニューラルネットワークの学習 5章 誤差逆伝播法 6章 学習に関するテクニック 7章 畳み込みニューラルネットワーク 8章 ディープラーニング もっと詳しい目次は にあります 文字通りTensorFlowなどのライブラリを使わずに、Pythonと数値計算ライブラリだけで、簡単なディープラーニングを実装してしまおうという本です。 オライリーの本なので、基本的にプログラマ向けではあるのですが、機械学習の知識は必要ありません。 とはいっても、用いられる関数の説明で結構な量の数式が使われています。 数式、グラフ、コードによる解説 例えば入力に対し、閾値を境にして出力を切り替える、活性化関数に用いられるシグモイド ロジスティック 関数は という数式で表せます。 exp -x のようにPythonのコードがあれば本当にプログラミング上でも「関数」なのだと言うことが実感できますし のように、出力が同じ活性化関数であるステップ関数 点線 との比較により、出力が1か0ではなく、曲線的に変化することが分かります。 曲線的に変化することの重要性は4章でわかります それに加えて、NumpyなどのPythonライブラリのおかげもあってか、微分や、行列などの数学の取っ付きにくい考え方についても、とりあえず、そうプログラムすればいいのか、ということもわかるので、深層学習以外の機械学習理論についても物怖じせずに立ち向かえそうです。 微分で使う「極限」がよくわからなかったのですが、「まともにコンピュータで計算しようとすると、ある値にひたすら近づけようとするので、処理が終わらない」ことを知りました。 プログラムの考えを通せば数学の概念の理解もいくぶん簡単になりそうです プログラミングについてはある程度経験があるけれども、数学はあまり得意ではなく、ディープラーニングの仕組みが、雰囲気としては判るけどあまり理解できていないプログラマの方には本当におすすめです。 私が行った勉強と注意点 ただ、幾つか注意点があります。 本文中にもありますが、この本を見ながら実装しても、Googleの機械学習系サービスのようなものが作れるわけではありません。 性能と作る手間を考えると、例えばになどの深層学習ライブラリを組み合わせて使うほうが実用的です。 また、確かにわかりやすく解説がされており、最終的にはきちんと理解できるのですが、やはり流し読みして理解できるようなものでもありません。 丁寧にコードを「写経」して、matplotlib Pythonのグラフ描画ライブラリ でグラフを出力し、その関数がどのような値を取るのかを視覚で把握しながら学習をすすめて行くのがおすすめです。 私は1ヶ月ほどかかりました。 途中を飛ばすと絶対にわからなくなると思いますので多少時間がかかっても順番にこなしていくのがおすすめです。 章タイトルをみていくと、2章 パーセプトロンと、いきなり大変そうですが、基本情報技術者試験の最初に出てくるような論理回路を例に説明してくれるので、それに関する知識があれば、理解できます。 その2章をやりきってしまえば、残りはその勢いのまま、最後までクリアできるでしょう。 5章で少しつまづきましたが…2日くらい間を置いたら理解できました。 ディープラーニングを使いこなすための基礎知識が、実践レベルで手に入るので、おすすめです。

次の

『ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装』☆5

ゼロ から 作る deep learning python で 学ぶ ディープ ラーニング の 理論 と 実装

目的 「ゼロから作るDeep Learning -- Pythonで学ぶディープラーニングの理論と実装」 (2017年7月28日 初版第10刷発行, 発行所 株式会社オライリー・ジャパン) この書籍は、かなりいい書籍だと思います。 しばらく、手元においておきたい書籍です。 パラパラと何度か眺めていて、気づいたことなどをここに記します。 以下の項目は、少し、参考になるかも。 勾配法が最小値にならない件• ドット積とかの説明• ReLU関数• 階層構造による情報抽出 ReLU関数 いまは、SigmoidよりReLU関数を用いるほうが良いみたいです。 p53引用 シグモイド関数は、ニューラルネットワークの歴史において、古くから利用されてきましたが、最近ではReLU Rectified Linear Unit という関数が主に用いられます ドット積とかの説明 ドット積は、内積とも呼ばれます。 本書で必要なのは、乗算とドット積(内積)の2つです。 numpyの演算例を示します。 outer a,b array [[ 4, 5, 6], [ 8, 10, 12], [12, 15, 18]] 引用: ベクトル積(英語: vector product)とは、ベクトル解析において、3次元の向き付けられた内積空間において定義される、2つのベクトルから新たなベクトルを与える二項演算である。 演算の記号からクロス積(cross product)と呼ばれることもある。 2つのベクトルからスカラーを与える二項演算である内積に対して外積(がいせき)とも呼ばれるが、英語でouter productは直積を意味するので注意を要する。 誤差逆伝搬法の説明の仕方 5章の誤差逆伝搬法の最初のページ(P123 に以下の記載があります。 誤差伝搬法を正しく理解するためには、2つの方法があると、筆者は(個人的に)考えています。 ひとつは「数式」によって、もうひとつは「計算グラフ computational grapf 」によって理解するものです。 この書籍では、後者を選択しています。 後者の方法で、順序よく説明されていますが、読み手が全体をうまく把握するのが、意外と難しいです。 部分、部分は、納得できますが、全体がうまく把握できない面があります。 前者の手段での説明で、かなーりわかりやすいページ(qiita として、以下などがあります。 ご参考まで。 よく見られているようです。。。。 勾配法が最小値にならない件 4. 1 勾配法 P106 において、以下の記載があります。 勾配の方向が必ず最小値を示すとはかぎらないにせよ、その方向に進むことで関数の値を最も減らすことができます。 そのため、最小値の場所を探す問題--もしくは、できるだけ小さな値となる関数の場所を探す問題--においては、勾配の情報を手がかりに、進む方向を決めるべきでしょう。 ニューラルネットの学習において、一般的に、こんな感じで、最小値を探すことはあっさりあきらめる感じですが、 気になる方もいるかなと思い、メモしました。 大体、いつもこんな感じだと思います。 誤記かな(チャンネルの件) P241の末尾から次ページにかけて 畳み込み層のチャンネル数は、前層から順に、16、16、32、32、64 チャンネル数は、R、G、Bの3とかグレーの1とかじゃないんでしょうか?上記の値は、深さとか? 階層構造による情報抽出 「より複雑で抽象化された情報が抽出される」との説明のところで、 以下が引用されています。 Conv3:Textureという説明は、相当、違和感がある (そもそも、この表示が何をどう見える形で見える状態にしているかにもよるが。。。 ) p236の図7-26の説明として記載されている『何にニューロンが反応するか』についての説明を表にすると、 層 説明 1層目 エッジやブロブ 3層目 テクスチャ 5層目 物体のパーツ 最後の)全結合層 物体のクラス 犬や車など) となっています。 理解しようとした場合、 以下のページの内容が充実しています。 また、以下のサイトの説明が、なんとなく、納得感がある。 (出典:上記のサイト) 特に、答えはないですが、以下の記事にもう少し、何か書きました。 端的には、実際に動かしみると、なんとなく、だんだんいい気がしています。 以下の記事を別途書きました。 単に、結果を貼っただけですが。 見る価値があるかも。。。。 うまく理解できない部分 8. 3 層を深くすることのモチベーション の項のP247において、 5x5の畳み込み演算と、3x3の畳み込み層を2回繰り返した場合とを比較し、パラメータ数が25 5x5 と18 2x3x3 で 少なくなっているとの説明があります。 この表題の中でかたるほど、大きな差でない気もしました。 用語について(畳み込み) 畳み込みという用語は、よく耳にする用語ですが、 個人的には、どういうものか、正確に意識したことがありませんでした。 「畳みこむ」なので、本当に「畳む」様子をイメージしていました。 引用 正しくは、 Wikiなど参照するといいでしょう。 下記をみていて、重畳という言葉がありますが、畳むには、重ねる的な意味がありますね、 そういえば。 引用 畳み込み(たたみこみ、英: convolution)とは関数 g を平行移動しながら関数 f に重ね足し合わせる二項演算である。 畳み込み積分、合成積、重畳積分、あるいは英語に倣いコンボリューションとも呼ばれる。 用語について(inception) inceptionは、このAI以外では、馴染みのない用語でした。 意味を調べましたが、特別な意味は、見つかりませんでした。 以下の説明のように、「発端」とかの意味で、わりと、大人用の言葉という程度でした。 引用 「inception」とは、どういう意味なのでしょうか? ネイティブにとっては、「inception」は相当難しい言葉です。 「inception」という言葉の意味を知らないネイティブの高校生や中学生が多くいます。 日本語では「始まり」、「開始」、「発端」という意味になります。 英語では「beginning」、「start」、「genesis」という言葉が意味的に「inception」に近いですが、「inception」は日常英語ではそれほど使われていません。 まとめ この書籍は、気に入っています。 関連(本人) 今後 また、何か関連する検討ができれば。 コメントなどあれば、お願いします。

次の

ゼロから作るDeepLearning~Pythonで学ぶディープラーニングの理論と実装~その3|しゅんだい|note

ゼロ から 作る deep learning python で 学ぶ ディープ ラーニング の 理論 と 実装

その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.

次の