日本語版 fast.ai Deep Learning 2: Part 1 Lesson 1



These notes are Japanese translations from the notes written by Hiromi Suenaga. Huge thanks to Hiromi who approved me to translate her fantastic notes, and to Jeremy and Rachel who gave us all the opportunity to learn.

fast.aiのDeep Learningコースの日本語版ノートです。これらのノートはHiromi Suenagaの翻訳版です。Hiromiを含め、こうした素晴らしい機会を与えて下さったJeremyとRachelには感謝の気持ちで一杯です。


Lesson 1

はじめに[0:00]:

  • ニューラルネットワークを鍛えていくには、大概のケースにおいてGPU(Graphics Processing Unit/画像処理用演算プロセッサ)が必要になります — 特にNVIDIA GPUがいいでしょう。 なぜなら、NVIDIA GPUのみしか、CUDAがサポートされていないからです。 (CUDAとは深層学習においてほとんどのケースにおいて用いられる言語とフレームワーク)
  • GPUを借りるには以下の方法があります: Crestle [04:06], Paperspace [06:10]

Dogs vs. Cats コンペによるJupyter Notebook入門[12:39]

  • セルを実行するには、選択してshift+enter を押す。(shift を長押ししながら enter を連打することによって連続して下にいくことが出来る), もしくは、上部にあるRunボタンを押す。セルには、コード、文章、画像、ビデオなどを含むことが出来ます。
  • Fast.ai にはPython 3が必要です。
%reload_ext autoreload
%autoreload 2
%matplotlib inline
# This file contains all the main external libs we'll use
from fastai.imports import *
from fastai.transforms import *
from fastai.conv_learner import *
from fastai.model import *
from fastai.dataset import *
from fastai.sgdr import *
from fastai.plots import *
PATH = "data/dogscats/"
sz=224

個別の画像を見てみましょう[15:39]

!ls {PATH}
models	sample	test1  tmp  train  valid
  • ! はbash (シェルの一種) のコマンドであることを示す(Pythonではなく)
  • training set とvalidation setに馴染みがなかったら、, Practical Machine Learning コースをチェックしてみてください(もしくはこちらのブログRachel’s blog)
!ls {PATH}valid
cats  dogs
files = !ls {PATH}valid/cats | head
files
['cat.10016.jpg',
'cat.1001.jpg',
'cat.10026.jpg',
'cat.10048.jpg',
'cat.10050.jpg',
'cat.10064.jpg',
'cat.10071.jpg',
'cat.10091.jpg',
'cat.10103.jpg',
'cat.10104.jpg']
  • このようなfile構造は画像分類に置ける最も主流の方法です。個々のfolderがlabelを示します。(e.g. dogs もしくはcats).
img = plt.imread(f'{PATH}valid/cats/{files[0]}')
plt.imshow(img);
  • f’{PATH}valid/cats/{files[0]}’ — これはPython 3.6. format stringの一種です。
img.shape
(198, 179, 3)
img[:4,:4]
array([[[ 29,  20,  23],
[ 31, 22, 25],
[ 34, 25, 28],
[ 37, 28, 31]],
[[ 60,  51,  54],
[ 58, 49, 52],
[ 56, 47, 50],
[ 55, 46, 49]],
[[ 93,  84,  87],
[ 89, 80, 83],
[ 85, 76, 79],
[ 81, 72, 75]],
[[104,  95,  98],
[103, 94, 97],
[102, 93, 96],
[102, 93, 96]]], dtype=uint8)
  • img は3次元配列(a.k.a. ランク3 のtensor)
  • 3つのitem (e.g. [29, 20, 23]) はそれぞれ赤と緑と青の0 and 255の間の値を示している。
  • これらの数字を用いてその数字がcatもしくはdogを表すか予測できるモデルを作るのが趣旨である。
  • このデータセットは Kaggleコンペ からもってきたもので、2013年のリリース時における最先端の正確せいは正確さはおよそ 80% だった。

モデルを鍛えよう[20:21]

  • 以下のたったの三行のコードでモデルを鍛えることができます。
data = ImageClassifierData.from_paths(PATH, tfms=tfms_from_model(resnet34, sz))
learn = ConvLearner.pretrained(resnet34, data, precompute=True)
learn.fit(0.01, 3)
[ 0.       0.04955  0.02605  0.98975]                         
[ 1. 0.03977 0.02916 0.99219]
[ 2. 0.03372 0.02929 0.98975]
  • これでは3 epochs 実行される、つまり計3回全体の画像をみるような設定になっています。
  • 最後の数字は validation setに置ける正確度を示すものです。
  • 最初の2つはtraining set と validation setにおけるloss関数 (こちらのケースは cross-entropy loss)を通じて得られた数字です。
  • 一番最初の数字は、(e.g. 0., 1.) のepoch番号です。
  • 17秒で、わずか3行のコードで99%に近い正確度を誇るモデルを作ることができました! (2013のKaggleコンペでは優勝してたであろう) [21:49]
  • 多くの人は深層学習は非常に膨大なリソースや時間やデータを必要とすると推測しているが、一般的にはそうではない!

Fast.ai ライブラリ[22:24]

  • このライブラリでは可能な限り全てのベストの手法を導入しています。面白すな論文が出るたびに、テストされて様々な種類のデータセットに対して上手く対応するか吟味され、チューニングに成功したのちにライブラリに初めて導入されます。
  • Fast.ai ライブラリでは全てのベストな手法やパッケージをあなたのために掻き集めているので、多くの場合においてはライブラリ自体が自動的に解決してくれることが多いです。
  • Fast.ai はPyTorchというライブラリの上に位置しています… PyTorchはとても柔軟性の高い、deep learning, machine learning, and GPU computation が強みのフェイスブックによって書かれたライブラリです。
  • 多くの人はTensorFlowの方が PyTorchよりも馴染みやすいかもしれませんが、Jeremyによるとほとんどのトップの研究者は最近では PyTorchを使用しています。
  • Fast.ai はとても柔軟性が高く、ベストな手法を自分の好みに合わせて用いることができます。どんな地点においても引き寄せやすく、自分の data augmentation, loss function, network architecture, etc, を容易に書くことができます。

結果を分析する[24:21]

validation dataset のレーベルは次のようになっています(正解みたいなもの):

data.val_y
array([0, 0, 0, ..., 1, 1, 1])

これらの0と1は何を表すのでしょう?

data.classes
['cats', 'dogs']
  • data validation と training data を含みます
  • learn modelを含みます

validation set に対して予測を行いましょう(予測はlogのスケールとなっています):

log_preds = learn.predict()
log_preds.shape
(2000, 2)
log_preds[:10]
array([[ -0.00002, -11.07446],
[ -0.00138, -6.58385],
[ -0.00083, -7.09025],
[ -0.00029, -8.13645],
[ -0.00035, -7.9663 ],
[ -0.00029, -8.15125],
[ -0.00002, -10.82139],
[ -0.00003, -10.33846],
[ -0.00323, -5.73731],
[ -0.0001 , -9.21326]], dtype=float32)
  • output は cats と dogs に対しての予測値を表します。
preds = np.argmax(log_preds, axis=1)  # from log probabilities to 0 or 1
probs = np.exp(log_preds[:,1]) # pr(dog)
  • PyTorch と Fast.ai では、多くのモデルでは 予測値の log を返すようになっています。(なぜ予測値そのものではないかはのちにコースにて学びます。)とりあえず今は、予測値を得るには np.exp()を実行するといいことを覚えておきましょう。
  • numpy (np) について詳しくなるようにしましょう。
# 1. A few correct labels at random plot_val_with_title(rand_by_correct(True), "Correctly classified")
  • 画像の上の数字はdogになる確率(予測値)を指しています。
# 2. A few incorrect labels at random
plot_val_with_title(rand_by_correct(False), "Incorrectly classified")
plot_val_with_title(most_by_correct(0, True), "Most correct cats")
plot_val_with_title(most_by_correct(1, True), "Most correct dogs")

より興味深いのは、以下はモデルが高い確率でdogであると思ったが実はcatであったパターンの画像と確率を表しています(もしくはその逆):

plot_val_with_title(most_by_correct(0, False), "Most incorrect cats")
plot_val_with_title(most_by_correct(1, False), "Most incorrect dogs")
most_uncertain = np.argsort(np.abs(probs -0.5))[:4]
plot_val_with_title(most_uncertain, "Most uncertain predictions")
  • なぜこのように画像をビジュライズした方がいいのか? Jeremy が model を作った後にまず最初にすることは如何に作ったものをビジュライズすることができるか工夫することらしい。なぜなら、モデルを改良したいならばこれらのことを有利に用いて欠点を次々に補っていかなければいけないからである。
  • このケースでは、データセットに含まれるべきでないであろう画像が含まれていることが確認された。しかしながら、もデレうの改良の余地はまだまだあることは気に留めておくべきであろう。( 例えばのちに学ぶ data augmentation など)
  • これで自分のイメージ分類モデルを作る準備ができました!(一般的な画像に対してのみ、 CT scanは除いてね笑) 例えば、学生が作成したモデルにはこれらがあります。
  • この記事 には異なる方法を用いたビジュライズの手法が書かれています。(例えば、2つ以上のカテゴリがある時など)

Top-down vs Bottom-up [30:52]

Bottom-up: 1つ1つのブロックの作り方を学んで、最終的にこれらを統合する

  • モチベーションを保ちにくい
  • 高い視点から俯瞰することができない
  • 最終的に必要なピースを把握しずらい

fast.ai: 直ちにニューラルネットワークを用いて、結果を得られるようにする

  • 徐々に背景にある層や手法などを解剖していく。

コースの概要 [33:53]

  1. 最小限の行数によるdeep learning による画像分類
  2. マルチレーベル分類と違う種類の画像 (例えば衛星画像など)
  3. Structured data (例えばセール予測など) — structured dataはデータベースやエクセルなどから派生したもの
  4. 言語モデル: NLP 分類 (例えば映画レビュー分類)
  5. Collaborative filtering (例えば推薦機能)
  6. 一般的な言語モデル: 自分のニーチェ文学を0からキャラクターベースで書く
  7. computer visionに逆戻り — 画像を認識するだけではなく、どこに位置するのか(heat map) や自分のarchitectureを0から作っていく (ResNet)

画像分類の例:

画像分類アルゴリズムの実用例は多岐にわたる.

  • 例えば、 AlphaGo [42:20] は勝者か敗者かのレーベル付きの何千もの盤面に目を通してモデルを作った。すなわち、盤面を見てその盤面が良い、もしくは悪い態勢にいるのかを見分けるモデルを作ることに成功したー以後において最も重要なステップはどの指し方が効果的かどうかである。
  • 次の例は初期の生徒が作った マウスの導線画像分類機 は不正な取引を見分けることに成功した。

Deep Learning ≠Machine Learning [44:26]

  • Deep learning は machine learningの一種である。
  • Machine learning は Arthur Samuelによって発明されました。50年代後半には、彼は IBM mainframeに彼より上手くチェッカーズをプレイできるようにMachine learningを鍛えました。彼はメインフレームを何回も自分と対戦させ、どのような手が勝利に結びつくことを考えさせ、自動的に自らのプログラムを改良させるように仕向けた。1962年には、そのうち Arthur Samuel はほとんどのコンピュータソフトウエアは人間の手ではなくこのMachine learningアプローチによって書かれることにだろうと予測した。
  • C-Path (Computational Pathologist)[45:42] は伝統的なMachine learningのアプローチの例である。彼は病理学の乳がん細胞診スライドを用いて、多くの病理学者をどのようなパターンや特徴が長期的な生存と関連性があるのかコンサルティングを行った。彼らはその後スペシャリストのアルゴリズムを書いてこのような特徴を計算し、線形回帰を用いて生存率を予測した。病理学者よりも良い結果をもたらしたものの、多くの専門家やコンピュータ専門家の何年ものの労力を要した。

より良いやり方[47:35]

  • この3つの特質があるアルゴリズムをDeep Learningと言います。

Infinitely Flexible Function … 無限に柔軟な機能

All-Purpose Parameter Fitting … 万能パラメーター適正

Fast and Scalable … 速くて適応力の高い

無限に柔軟な機能: Neural Network [48:43]

deep learning のもととなっている機能はneural networkと言います。

  • 今知っとかなければいけないのはこれは一定数のシンプルな線形的な層と共に非線形的な層が散財しているということです。このように層を散財させると、universal approximation theorem(普遍性定理)というものが成立します。universal approximation theorem(普遍性定理)が何を表しているかというと、要はこのような関数はある程度のパラメーターを足す限り、全ての問題を任意の正確性に近づけることができるということです。

万能パラメーター適正: Gradient Descent(最急降下法) [49:39]

速くて適応力の高い: GPU [51:05]

上記のニューラルネットワークは一層のみの隠れ層があります。ここ数年の研究で判明したことはニューラルネットワークは隠れ層を複数足さない限り速くて適応力の高いようにはならないということですー “Deep” learningと言われるのはそのためです。

全てを組み合わせると [53:40]

以下が例の一部です:

肺ガンを診断する [56:55]

他の応用例:

Convolutional Neural Network(畳み込みニューラルネットワーク) [59:13]

線形層(線形関数)

http://setosa.io/ev/image-kernels/

非線形層(非線形関数・活性化関数)[01:02:12]

Sigmoid and ReLU
  • 線形層と非線形層の組み合わせは任意の複雑な形の形成が可能になるー universal approximation theorem(普遍性定理)のエッセンスはここにある。

パラメーターはどのようにして設定すれば良いのか [01:04:25]

  • Stochastic Gradient Descent(確率的勾配降下法) —丘を一歩ずつ少しずつ降りていくかのように進んでいく。一歩の大きさを learning rate(学習率)という。
  • 学習率が大きすぎると、収束せず分散してしまう。
  • 学習率が小さすぎると、一生掛かってしまう。

Convolutional Networks(畳み込みニューラルネットワーク)を可視化し理解する [01:08:27]

最初はとてもシンプルなもので始めたが、スケールを大きくするにつれてuniversal approximation theorem(普遍性定理)とdeep learningにおける複数の隠れ層のおかげで多岐にわたる能力が獲得される。これがdog vs cat コンペにおいてモデルを鍛えるために用いたものです。

Dog vs. Cat再来— learning rate(学習率)を選ぶ [01:11:41]

learn.fit(0.01, 3)
  • 最初の数0.01 が learning rate(学習率)です。」
  • learning rate(学習率)はどれだけ速く・遅く重み(パラメーター)を更新したいか決めるものです。 Learning rate は最も設定するのが難しいパラメーターの一つです、なぜならモデルのパフォーマンスに直結するからです。
  • メソッド learn.lr_find() は最適な learning rate(学習率)を探すのに一役買ってくれます。これは2015の論文 Cyclical Learning Rates for Training Neural Networksのテクニックを用いたもので、lossが減少するのが止まるまで、 learning rateをとても小さな値から徐々に増やしていく、というようなものです。これを可視化するために、learning rateを縦軸に、 batchを横軸にプロットすることができます。

*** batchというのはtrainingに用いる例・データの量、よくbatch size というパラメーターでこれをコントロールできる。***

learn = ConvLearner.pretrained(arch, data, precompute=True)
learn.lr_find()

我々の learn object は sched という属性を持ち、これには learning rate スケジューラーであったり、以下のような便利なプロット機能を有している。

learn.sched.plot_lr()
  • Jeremy は今learning rateを線形的もしくは指数関数的に増やすか実験しているところである。

次にloss 対 learning rate の相関性を表す図を以下のように描き、どの地点でlossの減少が止まるのか見ることができる。

learn.sched.plot()
  • lossが未だに改善しているであろうlearning rate を選びます — このケースでは1e-2 (0.01)

epochの数を決定する [1:18:49]

[ 0.       0.04955  0.02605  0.98975]                         
[ 1. 0.03977 0.02916 0.99219]
[ 2. 0.03372 0.02929 0.98975]
  • epoch の数は何個でも良いが、あまりに長い時間鍛えさせていると正確度が低下する可能性がある。これは “overfitting”(過剰適合)といって、のちにこれについて説明する。
  • またepochの数があまりに多すぎると、時間がかかり過ぎてしまう。

助言やトリックなど(jupyter notebookにおいて) [1:21:40]

1.Tab — auto completeで function の名前をサジェストしてくれる。

2. Shift + Tab — function の引数を示してくれる。

3. Shift + Tab + Tab — documentationを示してくれる。(docstringなど)

4. Shift + Tab + Tab + Tab — 違うウィンドウにおいて同様のことを表示してくれる。

?の後にfunction の名前をセルに入力して実行しても shift + tab (3 times) と同様の結果が得られる。

5. 2つの?マークでソースコードが表示されます。

6. H をJupyter Notebook 内で押すとキーボードショートカットの一覧が出てきます。1日に4つか5つ覚えるようにしましょう。

7. 使用後は、Paperspace, Crestle, AWS を止めましょう。 —ではないとお金がかかります。$$

8. 最新情報については forumhttp://course.fast.ai/ をチェックしてください。

Source: Deep Learning on Medium