書籍「最短コースでわかる PyTorch &深層学習プログラミング」補足情報と紹介

# はじめに
　2021年 9月17日に日経BP社より出版した書籍「最短コースでわかる PyTorch &深層学習プログラミング」の筆者です。当記事では執筆後に判明した点、書籍に書ききれなかった点の補足を記載するとともに、この本の特徴についても簡単にご紹介します。

<img width="250" alt="スクリーンショット 2021-10-10 13.37.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/22e11d15-8882-71ec-5699-a45e9d4eb60a.png">

Amazonリンク(単行本)
https://www.amazon.co.jp/dp/4296110322

Amazonリンク(Kindle)
https://www.amazon.co.jp/dp/B09G622WB6

本書サポートサイト (Github)
https://github.com/makaishi2/pytorch_book_info/blob/main/README.md

# 補足情報

## 2.4節 p.80脚注の補足
　この脚注は説明が不十分なところがあるので、コードや図で補足説明をします。

  該当部分の説明準備として、まず下記のコードが実行済みであることを前提とします。

```py
# 必要ライブラリのインポート
import numpy as np
import torch
from torchviz import make_dot

# xをnumpy配列で定義
x_np = np.arange(-2, 2.1, 0.25)
```

　ここで1階のTensor x1を通常のfloat関数による方法で定義してみます。実装コードは下記です。

```py
# 1階のTensor配列を宣言
# float関数を使ってfloat指定
x1 = torch.tensor(x_np, requires_grad=True).float()
```

　この形で宣言したx1はこの段階ですでに、計算グラフのリーフになることができません。それは、make_dot関数で調べてみるとわかります。

```py
# 可視化関数の呼び出し
g= make_dot(x1, params={'x1': x1})
display(g)
```

　可視化の結果は下記のようになります。

<img width="200" alt="スクリーンショット 2021-10-23 18.27.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/f40bb79c-6c76-cd89-99b8-615c4ea5ccad.png">

 x1という変数は、元の変数に対してToCopyという操作を行った結果、つまりリーフノードではないということです。なので、こうやって作ってx1に対して、勾配計算をすることはできないのです。
　次に同じことを、書籍内のコードで試してみます。

```py
# 1階のTensor配列を宣言
# dtypeを使ってfloat指定
x1 = torch.tensor(x_np, requires_grad=True, 
    dtype=torch.float32)

# 可視化関数の呼び出し
g= make_dot(x1, params={'x1': x1})
display(g)
```

　今度はこんな結果になりました。


<img width="150" alt="スクリーンショット 2021-10-23 18.33.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/45b6dc36-7ce2-ca9d-1132-fad5b0539d87.png">

　これは、こうやって作った変数x1がリーフノードのままである、つまり勾配計算の対象にできることを意味しています。


# 本書の目的
　本書の目的を一言で簡単に説明すると、
「**ディープラーニングのプログラムを自分でバリバリ書いて画像分類ができるようになりたい**」
人向けの書籍ということになります。

　筆者は、過去に日経BPから出版した2冊が、幸いにも好評を得ているのですが、それぞれの本の目的を同じように一言で表すと次のようになります。

「**最短コースでわかる ディープラーニングの数学**」
　ディープラーニングの学習アルゴリズムを数学の立場で理解したい。
* [Amazonリンク](https://www.amazon.co.jp/dp/4296102508)
* [サポートページ](https://github.com/makaishi2/math_dl_book_info/blob/master/README.md)


「**Pythonで儲かるAIをつくる**」
　AI(機械学習モデル)にどんな種類のものがあり世の中でどのように活用されているのか知りたい。
* [Amazonリンク](https://www.amazon.co.jp/dp/4296106961/)
* [サポートページ](https://github.com/makaishi2/profitable_ai_book_info/blob/master/README.md)


# 想定読者
当書籍で読者と想定しているのは、およそ下記の4つのパターンの方です。

1. **企業でディープラーニングプログラムを業務で利用している、あるいはこれから利用しようとしているITエンジニアや研究者**  
　Keras/Tensorflowを使った経験がある方は、まずPyTorch独特の「ポリシー」につまずきがちです。PyTorchは「多値分類モデルにおける損失関数」の考え方が独特で、それを分かりやすく解説します。

2. **入門書を読んで機械学習やディープラーニングアルゴリズムの実装イメー ジは持てたが、この先どのように活用したらよいかがわからない方**    
　9 ~ 12 章の「画像認識 実践編」では、最終的に「転移学習」と呼ばれる少ない学習データで学習可能な方法を用いて、自分で集めた画像データを使って 分類モデルを作ります。12 章までたどり着けば、すぐに自分で集めた画像デー タを使って分類モデルが作れるようになります。 また、8 章までの内容は PyTorch でのプログラミング方法を理解すると同時 に、これまで入門書で学んだ機械学習やディープラーニングのアルゴリズムを 復習することにもなります。

3. **理工系の大学・大学院の学生で研究の一環としてディープラーニングのプログラムを開発する必要がある方** 
　今後、論文で公開されている実装コードを試すには、PyTorchの知識が必須になってきます。本書では、ディープラーニングに必要な数学をイメージとして解説するので、公開コードを深く理解し、応用できるようになります。

4. **まだPythonもKeras/TensorFlowも知らないが、ディープラーニングプログラミングをこれから勉強してみたいという方**  
　初心者に向けて、PyTorchプログラミングを理解するのに必要な、Pythonの基本文法と、NumPy、Matplotlibの必要最小限の機能を、巻末の講座として用意しました。目的がディープラーニングだけなら、本書の講座で書いた概念・機能だけを理解すれば十分で、ディープラーニングを学ぶためのスタートラインに立てます。

# 構成
　本書の構成は以下のとおりです。

序章 初めての画像認識

**◆基礎編**
1 章 ディープラーニングのためのPython のツボ
2 章 PyTorch の基本機能
3 章 初めての機械学習
4 章 予測関数の定義

**◆機械学習 実践編**
5 章 線形回帰
6 章 2 値分類
7 章 多値分類
8 章 MNIST を使った数字認識

**◆画像認識 実践編**
9 章 CNN による画像認識
10 章 チューニング技法
11 章 事前学習済みモデルの利用
12 章 カスタムデータの画像分類

**講座** 
Python入門
NumPy入門
Matplotlib入門

　大きくは、次のようなことが各パートの目的となっています。

**序章**：　本書で最終的にめざすことがなんであるかを実習を通じて確認

**基礎編**：　ディープラーニングプロフラミングをする上で最低限必要な基礎知識の習得

**機械学習 実践編**：モデルのパターンを一歩ずつ進化させることで、最終的な目的である画像を対象とした多値分類モデルに近づく

**画像認識 実践編**：実用レベルの画像認識モデルの実装理解

**講座** : 本書を読み進める上で最低限必要なPyThonやライブラリ知識のまとめ


# 特徴
当書籍の特徴として以下のような点があげられます。

## 可視化によるわかりやすさの追求
　筆者は、初心者が抽象的概念を理解する上で、可視化が重要な役割を果たすと考えています。本書では、抽象的な概念が多く、理解の難しいPyTorchに対して徹底的な可視化を試みました。具体的には、以下のような点となります。

### 見開きコースマップ
　本書の見開きには、カラーのコースマップがあり、それぞれの章で登場する重要概念が一目でわかるようになっています。全体で500ページ超と大部の書籍ですが、このマップを見ることで、自分が今、どこにいるかを常に確認することができます。

<img width="600" alt="スクリーンショット 2021-10-10 14.15.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/bda82ee9-2ed4-bdf9-0839-f0de79a98c61.png">
　
### 学習アルゴリズムのフロー図
　機械学習のアルゴリズムとは、結局「予測計算」「損失計算」「勾配計算」「パラメータ修正」の4つのステップの繰り返し処理です。その処理イメージを下の図で表現しました。

<img width="600" alt="スクリーンショット 2021-10-10 14.14.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/613263c0-d1da-522a-8b6b-668964ca0dd5.png">

### PyTorch実装のフロー図
　上の機械学習アルゴリズムが、PyTorchではどのような実装(コード)になるか、上の抽象的な処理を実装コードで具体化したフロー図も作りました。

<img width="600" alt="スクリーンショット 2021-10-10 14.15.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/7c266e52-2049-5930-f115-7022b1c20e81.png">

### 計算グラフの可視化
　PyTorchの特徴の一つは「Define by Run」という言葉に代表される「計算グラフ」とよばれるデータ構造を計算式から自動生成し、その計算グラフを元に、勾配(微分)計算を行う点にあります。この計算グラフはフレームワークだけでは、どの様な形になっているか読み取ることができないのですが、別のOSSのツールを利用することで可視化できます。そこで本書ではこの計算グラフの可視化ツールを書籍全体を通じて数多く利用することとしました。下にその例を示します。このような計算グラフの可視化も、可視化により理解しやすくなる一つの事例です。

<img width="400" alt="スクリーンショット 2021-10-10 14.38.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/7a1cac1a-e232-35a9-8d23-a491ff07fef5.png">

## 実装コード
　本書はプログラミングを目的とした書籍です。なので実装コードにはこだわったつもりです。具体的には、以下のような点に配慮をしています。

### Google Colab で事前セットアップなしにすぐに動かせる
　ディープラーニングのプログラム環境の場合、GPUの準備や、ライブラリ追加導入など、プログラムを開始するまでの準備に相当手間がかかるのが通常です。本章で、Google Colabを前提にすることで、その課題をクリアしました。読者は、何の準備もなしにいきなりプログラムができる状態になる様子を序章の実習ですぐに体験することができます。
　

### 汎用性を考えた実用的なコード
　実装コードは、常に汎用性を考えています。例えば12章の最後の例題では、学習データのzipファイルを差し替えるだけですぐに自分の学習モデルを作ることができます。よく使う機能は共通関数としてGithubにアップしてあり、自分のコードからこの関数を利用することも可能です。

### 豊富なコメント
　コードは、基本的に1行1行に対して詳しいコメントをつけています。ある程度プログラミングに慣れた読者であれば、ソースコードをみるだけでおおよそどんなことをやっているのか、わかるかもしれません。

## 解説内容
　解説内容に関しては、とにかく「**丁寧に、どんな読者にも理解できるように**」を心がけました。具体的には、以下のような点が特徴になっています。

### 1冊で全領域をカバー
　PyTorchの場合、入門書であっても、PythonやNumPyの基本文法、あるいはオブジェクト指向プログラミングなど、読者にある程度の前提を課してしまうことが多いです。本書では、そのようなことはせず、Pythonの基本文法やNumPy、あるいはオブジェクト指向プログラミングの考え方など、必要な概念はすべて一通り解説しました。その結果、この本1冊で、ディープラーニングプログラミングをするのに必要な知識は一通り付けられるようになったと考えています。

### 勾配降下法もイメージから理解
　ディープラーニングのアルゴリズム理解で、数学的に一番高いハードルは勾配降下法です。本書では山登りのたとえ話をつかって、数式に頼らずイメージで勾配降下法を理解できるようにしました。

###  Keras/TensorFlowとの違いを丁寧に解説
　筆者がPyTorchを勉強して一番戸惑ったのは、特に多値分類の時の損失関数の考え方がKeras/Tensorflowと大きく異なる点でした。この点に関しては、6章と7章で詳しく解説してあり、筆者同様Keras/TensorflowからPyTorchに入った読者が躓くことがなくなります。



# リンク集
　本書に関しては、Amazonレビューや個人のブログで大変好意的なコメントをいただいています。その一部をご紹介します。

|ソース  |タイトルとリンク  |補足|
|---|---|---|
|Amazon|[Amazonレビュー](https://www.amazon.co.jp/product-reviews/4296110322)||
|からあげ様ブログ|[PyTorch入門書の決定版！「最短コースでわかる PyTorch ＆深層学習プログラミング」](https://karaage.hatenadiary.jp/entry/2021/09/24/073000)|AI関連で有名なブロガーである「からあげ」様による書評です。|
|新米エンジニアの読んだ技術書を一言まとめるブログ|[Pytorch&深層学習プログラミングはやはり初心者の見方だった](http://blog.livedoor.jp/sicut_study/archives/10927800.html)|本書について激賞していただいています|