Slide 1

Slide 1 text

最短コースでPyTorchと ディープラーニングを 征服するためのツボ ⾚⽯ 雅典

Slide 2

Slide 2 text

講演者プロフィール AIエンジニア 著書 「最短コースでわかる PyTorch &深層学習プログラミング」 「Pythonで儲かるAIをつくる」 「最短コースでわかるディープラーニングの数学」 以上⽇経BP 「現場で使える!Python⾃然⾔語処理⼊⾨」(共著) 翔泳社 「Watson Studioで始める機械学習・深層学習」リックテレコム twitter @makaishi2

Slide 3

Slide 3 text

「最短コースでわかる PyTorch &深層学習プログラミング」 想定読者 1. まだPythonもKeras/TensorFlowも知らないが、ディープラーニングプログラミングをこれ から勉強してみたいという⽅ 2. ⼊⾨書を読んで機械学習やディープラーニングアルゴリズムの実装イメージは持てたが、この 先どのように活⽤したらよいかがわからない⽅ 3. 理⼯系の⼤学・⼤学院の学⽣で研究の⼀環としてディープラーニングのプログラムを開発す る必要がある⽅ 4. 企業でディープラーニングプログラムを業務で利⽤している、あるいはこれから利⽤しようとし ているITエンジニアや研究者 サポートサイト (書籍中のコードをすべて公開。デモアプリをGoogle Colabで簡単に試せます。) https://github.com/makaishi2/pytorch_book_info/blob/main/README.md

Slide 4

Slide 4 text

最短コースでPyTorchとディープラーニングを征服するためのツボ PyTorchは、ディープラーニングプログラミングのフレームワークとして最近急速に注⽬を浴びていますが、⼀⽅でKerasと⽐較する と、わかりずらい側⾯があります。講演者はこの課題に対応するため書籍「最短コースでわかるPyTorch&深層学習⼊⾨」を出 版しました。 当講演では、この本の内容を引⽤しつつ、「Define by Run」「勾配計算」などの重要概念や、「予測計算」「損失計算」「勾 配計算」「パラメータ修正」の繰り返しによって成り⽴つディープラーニングの学習アルゴリズムのポイントを、数式によらず図を多 ⽤してわかりやすく解説します。当講演を聴講することで、「PyTorch」と「ディープラーニングの学習アルゴリズム」がどんなものであ るか、イメージから理解することができます。 ※ 当資料の図版はすべて「最短コースでわかる PyTorch &深層学習プログラミング」⽇経BP からの引⽤です。

Slide 5

Slide 5 text

⽬次 1. 機械学習の数学的原理 関数 微分 損失関数 ⼭登りアルゴリズム(勾配降下法) 2. PyTorchの特徴的機能 テンソル Define by Run 計算グラフ 勾配計算 3. PyTorchによる機械学習 機械学習アルゴリズム全体像 予測計算 損失計算 勾配計算 パラメータ修正 繰り返し処理

Slide 6

Slide 6 text

1. 機械学習の数学的原理

Slide 7

Slide 7 text

関数とは 数値を⼊⼒すると、数値が出⼒されるブラックボックスと考えられます。 xという⽂字を利⽤してブ ラックボックスの種明かし をしている 関数の表記法 𝑓 𝑥 = 2𝑥! + 2 Pythonでの関数定義

Slide 8

Slide 8 text

合成関数とは 2つの以上の関数をつないで、全体を1つの関数とみなすことを合成関数といいます。 下は、𝑓 𝑥 = 2x! + 2 を3つの簡単な関数の合成関数として再定義した例です。 ディープラーニングのアルゴリズムは、複雑な合成関数の固まりといっていいです。 なので、「合成関数」はディープラーニングの世界では⾮常に重要な概念です!! 𝑓 𝑥 = 𝑓! ∘ 𝑓" ∘ 𝑓#(𝑥) 𝑦 = 𝑥" 𝑦 = 2𝑥 𝑦 = 𝑥 + 2

Slide 9

Slide 9 text

Pythonの合成関数 前ページの合成関数を Pythonで実装してみます。 関数の呼び出し結果を次の関数の引数 にすると、⾃然と合成関数を作ったこ とになります。 →ディープラーニングの プログラミングでよく登場します︕

Slide 10

Slide 10 text

多変数関数 機械学習における関数は、基本的にすべて多変数関数だと考えて下さい。 イメージの持ちやすい多変数関数として、2変数関数をとりあげます。 2変数関数のグラフは左図のように曲⾯になります。右図は同じ曲⾯を真上から⾒た等⾼線表⽰です。

Slide 11

Slide 11 text

微分 ディープラーニングで合成関数と並んで重要な数学概念は微分です。微分の計算⽅法は以下の通りです。 グラフ上の⼆点を結んだ傾きの式で、⼆点間の距離ℎを限りなく0に近づけた結果です。 (𝑥, 𝑓 𝑥 ) (𝑥 + ℎ, 𝑓 𝑥 + ℎ ) ℎ 𝑓 𝑥 + ℎ − 𝑓(𝑥) f0(x) = lim h!0 f(x + h) f(x) h 関数上の2点間の傾き 2点間の距離を限りなく0に近づける dy = f(x + dx) f(x) ; f0(x)dx 𝒉を𝒅𝒙と置き換えると、𝒅𝒙が⼗分⼩さいとき下記の近似式が成⽴します。

Slide 12

Slide 12 text

極⼤・極⼩ 𝑓(𝑥)の増加量は 𝑓" 𝑥 𝑑𝑥と近似的に等しいです。 -> 𝒇" 𝒙 = 𝟎となるような𝑥では、𝑓(𝑥)の値は増えも減りもしないです。 -> 極⼤値または極⼩値になります。 極大 極小 𝑓′ 𝑥 < 0 𝑓′ 𝑥 > 0 𝑓′ 𝑥 > 0 ディープラーニングではある関数(損失関数)の値が最⼩に なるパラメータ値を求めることが⽬的です。 -> パラメータで微分した結果が0になる場所を求める問題 と同じになります。 -> 「勾配降下法」の動作原理です。 dy = f(x + dx) f(x) ; f0(x)dx

Slide 13

Slide 13 text

数値微分 Pytorchなどの機械学習フレームワークでは微分計算は、数式で⾏うのでなく。数値を使って近似計算します。この ような微分の⼿法を数値微分と呼びます。実際の数値微分は、前ページの微分の定義式でなく、下記の式を⽤いる ことが多いです。その理由は、右の図で⽰しました。

Slide 14

Slide 14 text

偏微分 (勾配計算) 偏微分とは、他変数関数において⼀つの変数のみ着⽬して他の変数を定数として微分することを意味します。グラ フ上のイメージでいうと、下図のように、曲⾯を特定の平⾯で切ったときできる曲線の傾きです。偏微分の計算は「勾 配計算」とも呼ばれ、 PyTorch ではこの呼び⽅の⽅がよく⽤いられます。「勾配」とは斜⾯の傾きのことです。下の図 を⾒ると、偏微分計算を「勾配計算」と呼ぶ理由がわかります。 平⾯ ! = 0 平⾯ $ = 0

Slide 15

Slide 15 text

損失関数 機械学習のアルゴリズムでは、最初にモデルの精度を数値で評価できるような「損失関数」を定義し、次に勾配降下 法という⼿法で、損失関数の値を最⼩にするようなパラメータ値を求めます。 損失関数の具体的実装としてイメージを持ちやすいのが、「回帰」と呼ばれる数値を予測するタイプの機械学習モデ ルです。この場合、正解値とモデル予測値の差の2乗を求め、すべてのデータで平均を取った値を損失と定めます。 ਤ ɹάϥϑ্Ͱͷ࣮ଌ஋ͱ༧ଌ஋ͷޡࠩ ʢਖ਼ղ஋ʣ ʢ༧ଌ஋ʣ yp yt yp yt

Slide 16

Slide 16 text

損失関数 「分類」と呼ばれる、1か0かを判断するモデルでは、損失は下記のような「交差エントロピー関数」になります。 なぜこの関数で損失が計算できるかはやや複雑な話なので省略しますが、 損失から先のパラメータ最適化の考え⽅は「回帰」の場合とまったく同じです。 ͠·͍ɺଛࣦؔ਺ؒͰͷਫ਼౓ͷൺֱ͕೉͘͠ͳͬͯ͠·͏ͷͰɺฏۉΛ ͱΔ͜ͱͰσʔλ݅਺ͷӨڹΛͳ͘͠·͢ɻ ɹ ʢʣ 1ZUIPO Ͱ͸഑ྻͷΠϯσοΫε͸ ͔Β࢝·ΔͷͰɺm ͷ։࢝஋Λ ͱ͠·͢ɻ ɹ͢Δͱ࠷ऴతͳଛࣦؔ਺ͷࣜ͸࣍ͷܗʹͳΓ·͢ ɻ ɹͨͩ͠ ʢʣ L(w0, w1, w2) = − 1 M M−1 m=0 (yt(m) · log (yp(m)) + (1 − yt(m)) log (1 − yp(m))) u(m) = w · x(m) = w0 + w1x(m) 1 + w2x(m) 2 yp(m) = f(u(m)) ࣮͸ ʢʣ ͷ͕ࣜొ৔͢Δͷ͸ຊॻͰ ౓໨Ͱ͢ɻ࠷ॳʹग़͖ͯͨͷ͸ અ ʮ͸͡Ίͯͷػ ※この理由を詳しく知りたい⽅には、講演者の著書の⼀つである「ディープラーニングの数学」がお勧めです。 https://www.amazon.co.jp/dp/4296102508

Slide 17

Slide 17 text

⼭登りアルゴリズム(勾配降下法) これから、⼭登りのたとえ話で勾配降下法のアルゴリズムを説明します。 次のようなシチュエーションを想像します。 ⽬的︓⼭の頂上にたどりつくこと 前提条件︓ ・霧がかかっていて視界は1mしかないので、頂上を⾒ることはできない ・⽊や、崖や、⾕など障害になるものはなく、どの⽅向にも進めるものとする 使える道具︓ ・正確な⽅位を測定できるコンパス ・⻑さを測定できるメジャー ・数cm単位で⾼さを測定できる⾼精度GPS

Slide 18

Slide 18 text

⼭登りアルゴリズム(勾配降下法) 考えた⽅法 ① コンパスとメジャーを⽤いて現在位置から東⻄南北に正確に1m進んだ地点に移動し、GPSを使って⾼度を測定 し、現在値との差を記録する。 ② ⾼度の差が、北向き+10cm 、東向き+20cmだったとする。右図のような作図をし、できた直⾓三⾓形の斜辺 を次に進む向きとする ③ ②で定めた斜辺の⻑さの100倍の距離だけ先に進んでそこを次の地点とし、①を繰り返す。 ①⾼度の差の測定 ②次に進む向きの決定

Slide 19

Slide 19 text

⼭登りアルゴリズム(勾配降下法) 前ページの⽅式で⼭登りをしたところ、⾒事⼭頂にたどりつきました。 その経過を、等⾼線付きの地図であとから確認した結果が下図になります。

Slide 20

Slide 20 text

⼭登りアルゴリズム(勾配降下法) 以上で説明したたとえ話を、本来の勾配降下法と対応づけると次のようになります。 ⼭登り 勾配降下法 ⾼性能のGPS GPSで得られた⾼度値 ⾼度値の差 1ステップでの移動距離 損失関数 損失 勾配値 (勾配計算結果) 1ステップでのパラメータ変化量

Slide 21

Slide 21 text

勾配降下法 勾配降下法の実装イメージをまとめると、下図のようになります。 後ほど、PyTorchの実装コードを通じて、1ステップずつ詳しく確認します。 GPSで測定した⾼度値 ⾼度値の差 1ステップでの移動量

Slide 22

Slide 22 text

2. PyTorchの特徴的機能

Slide 23

Slide 23 text

テンソル PyTorchの特徴は、テンソル(クラス Tensor)と勾配計算です。 最初にテンソルについて、ご説明します。 テンソル (クラス Tensor)の特徴 1. NumPy同様、任意の階数のデータ配列を扱える 2. 勾配計算を⽬的としたいくつかの仕掛けがある

Slide 24

Slide 24 text

テンソルの特徴1: 任意の階数のデータ配列 「次元」という⾔葉は、ベクトルの要素数の意味でも使うことがあるため、 混同しないように「階数」という⾔葉を⽤います。 具体例から説明します。 0階テンソル : 単なる数値。数学⽤語でいうと「スカラー」 1階テンソル: 1つのインデックスを持つデータ配列。数学⽤語でいうと「ベクトル」 2階テンソル: 2つのインデックスを持つデータ配列。数学⽤語でいうと「⾏列」 3階、4階テンソル : それぞれ3つ、4つのインデックスを持つデータ配列。対応する数学⽤語はない この点だけでいうと、⾏列演算⽤のライブラリである NumPy と違いはありません。 2階テンソル(⾏列)の例

Slide 25

Slide 25 text

テンソルの特徴 2: データ配列以外の仕掛け テンソルには、データ配列としての役割以外の仕掛けがいくつかあります。 その中で、特に重要なmax関数を紹介します。この関数は多値分類モデルで正解値取得に⽤いられます。 max関数︓最⼤値を取得する関数だが、最⼤値だけでなく、最⼤値を取る indexも同時に取得 第2引数は「軸」を意味していて、こ の例では「⾏⽅向の集計」となる

Slide 26

Slide 26 text

Define by Run PyTorchのフレームワークとしての最⼤の特徴といえる、「Define by Run」について説明します。 Define by Run とは、 テンソル変数間で演算をする際の過程を「計算グラフ」の形で⾃動的に記録する機能 ということができます。 この機能を利⽤したい場合、対象とするテンソル変数で、 requires_grad属性をTrueにします。 なぜ、このような仕組みを持っているかというと、それは、次に説明する「勾配計算」をするためということになります。

Slide 27

Slide 27 text

Define by Run 下記の形で定義したテンソル変数 𝑥 を出発点として⾏った計算に関しては、計算グラフが⾃動⽣成されます。 requires_grad属性を True に設定

Slide 28

Slide 28 text

計算グラフの⽣成 テンソル変数 𝑥 から計算されたテンソル変数 𝑦 と 𝑧 は、「計算グラフ」を保持しています。 𝑦 = 2𝑥! + 2 の計算をしながら 計算グラフ⽣成 更に 𝑦 の要素をすべて⾜した結果を 𝑧 に代⼊ (この計算でも計算グラフを⽣成)

Slide 29

Slide 29 text

計算グラフの可視化 make_dot関数を⽤いて、テンソル変数 𝑧 の計算グラフを可視化しました。 関数𝑧の計算の過程が正しく保持されていることがわかります。 勾配値保存⽤ 𝑦 = 𝑥! 𝑦 = 2𝑥 𝑦 = 𝑥 + 2 3つの関数を合成すると 𝑦 = 2𝑥! + 2になる 𝑦の要素をすべて加算

Slide 30

Slide 30 text

勾配計算 こうやって計算したテンソル変数 𝑧 は、計算グラフを持っているので勾配計算が可能です。 勾配計算はbackward関数により実⾏されます。 計算結果は、テンソル変数 𝑥のgrad属性により取得可能です。

Slide 31

Slide 31 text

勾配計算結果の可視化 関数 𝑦 = 2𝑥! + 2 の計算結果 (y.data)と、関数の勾配計算結果 (y.grad.data)をグラフ表⽰します。 2次関数とそれを微分した1次関数が表⽰され、正しく勾配計算できていることが確認できます。

Slide 32

Slide 32 text

勾配降下法の実装と最適化関数 PART 1で説明した⼭登り(勾配降下法)は勾配計算結果(grad)を⽤いて下記の実装になります。 (線形単回帰の場合) 最適化関数を⽤いるとパラメータ修正は 下の実装で⾏える

Slide 33

Slide 33 text

3. PyTorchによる機械学習

Slide 34

Slide 34 text

機械学習アルゴリズム全体像 PyTorchの標準的な機械学習アルゴリズム全体像を⽰します。 個々のパートで何がおこなわれているかを以下のスライドで⽰します。

Slide 35

Slide 35 text

予測計算 最初のステップである予測計算の標準的な実装パターンです。 ① 事前に予測モデルの構造をNetクラスで定義した上で、Netクラスのインスタンス変数netを⽣成します。 予測関数netには学習対象のパラメータが含まれています。 ② ⼊⼒データがinputsであるとき、予測値の取得は outputs = net(inputs) により⾏われます。 (初期処理) 予測関数 net をNetクラスのインスタンスとして⽣成 (繰り返し処理) 予測関数 net を呼び出して予測を実施

Slide 36

Slide 36 text

損失計算 損失計算の典型的なパターンを以下に⽰します。 ① モデルの種類に応じて適切な損失関数クラス(下の例ではnn.MSELoss)を選択し、損失関数criterion をクラスのインスタンスとして⽣成します。 ② 繰り返し処理中に、予測計算の出⼒(outputs)と正解ラベル(labels1)を引数に損失関数 criterionを 呼び出し、損失計算をします。 (初期処理) 損失関数 criterion を nn.MSELossクラスのインスタンスとして⽣成 (繰り返し処理) 損失関数 criterion を呼び出して損失(loss)を計算

Slide 37

Slide 37 text

損失、予測関数、損失関数の関係 ここで、下記のコードに注⽬して下さい。 冒頭で説明した合成関数の実装パターンがここにも出てきていることに気付きます。 損失(loss)は、予測関数 net と損失関数 criterion の合成関数です。

Slide 38

Slide 38 text

損失の計算グラフ可視化結果 前ページで説明した「損失は予測関数と損失関数の合成関数」であることは、損失の計算グラフを可視化した結果 からも確認できます。 予測関数 損失関数 勾配計算対象

Slide 39

Slide 39 text

勾配計算 勾配計算はこうやって計算したテンソル変数 loss に対して backward 関数を呼び出すだけで⾏えます。 勾配計算結果は、書籍5章のモデル(線形単回帰)の場合、net.l1.weight.gradと net.l1.bias.grad に保持されています。

Slide 40

Slide 40 text

パラメータ修正 パラメータ修正の実装は ① 最適化クラス(この例ではoptim.SGDクラス)のインスタンス変数 optimizer を⽣成 ② step関数呼び出しで、パラメータ修正実施 からなります。 (初期処理) 最低化関数optimizer を optim.SGDクラスのインスタンスとして⽣成 パラメータで指定している lr は学習率で、機 械学習において最も重要なパラメータ (繰り返し処理) step関数呼び出しにより予測関数net内のパラメータ を修正

Slide 41

Slide 41 text

繰り返し処理 ①予測計算、②損失計算、③勾配計算、④パラメータ修正 の4つの計算を繰り返すことで、予測関数 net 内の 最適なパラメータ値を求めます。これがPyTorchによる機械学習実装の全体像です。