Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

1a818bcb46ae361694782268afd5fb21?s=47 makaishi2
January 26, 2022

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

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

1a818bcb46ae361694782268afd5fb21?s=128

makaishi2

January 26, 2022
Tweet

More Decks by makaishi2

Other Decks in Business

Transcript

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

  2. 講演者プロフィール AIエンジニア 著書 「最短コースでわかる PyTorch &深層学習プログラミング」 「Pythonで儲かるAIをつくる」 「最短コースでわかるディープラーニングの数学」 以上⽇経BP 「現場で使える!Python⾃然⾔語処理⼊⾨」(共著)

    翔泳社 「Watson Studioで始める機械学習・深層学習」リックテレコム twitter @makaishi2
  3. 「最短コースでわかる PyTorch &深層学習プログラミング」 想定読者 1. まだPythonもKeras/TensorFlowも知らないが、ディープラーニングプログラミングをこれ から勉強してみたいという⽅ 2. ⼊⾨書を読んで機械学習やディープラーニングアルゴリズムの実装イメージは持てたが、この 先どのように活⽤したらよいかがわからない⽅

    3. 理⼯系の⼤学・⼤学院の学⽣で研究の⼀環としてディープラーニングのプログラムを開発す る必要がある⽅ 4. 企業でディープラーニングプログラムを業務で利⽤している、あるいはこれから利⽤しようとし ているITエンジニアや研究者 サポートサイト (書籍中のコードをすべて公開。デモアプリをGoogle Colabで簡単に試せます。) https://github.com/makaishi2/pytorch_book_info/blob/main/README.md
  4. 最短コースでPyTorchとディープラーニングを征服するためのツボ PyTorchは、ディープラーニングプログラミングのフレームワークとして最近急速に注⽬を浴びていますが、⼀⽅でKerasと⽐較する と、わかりずらい側⾯があります。講演者はこの課題に対応するため書籍「最短コースでわかるPyTorch&深層学習⼊⾨」を出 版しました。 当講演では、この本の内容を引⽤しつつ、「Define by Run」「勾配計算」などの重要概念や、「予測計算」「損失計算」「勾 配計算」「パラメータ修正」の繰り返しによって成り⽴つディープラーニングの学習アルゴリズムのポイントを、数式によらず図を多 ⽤してわかりやすく解説します。当講演を聴講することで、「PyTorch」と「ディープラーニングの学習アルゴリズム」がどんなものであ るか、イメージから理解することができます。

    ※ 当資料の図版はすべて「最短コースでわかる PyTorch &深層学習プログラミング」⽇経BP からの引⽤です。
  5. ⽬次 1. 機械学習の数学的原理 関数 微分 損失関数 ⼭登りアルゴリズム(勾配降下法) 2. PyTorchの特徴的機能 テンソル

    Define by Run 計算グラフ 勾配計算 3. PyTorchによる機械学習 機械学習アルゴリズム全体像 予測計算 損失計算 勾配計算 パラメータ修正 繰り返し処理
  6. 1. 機械学習の数学的原理

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

    + 2 Pythonでの関数定義
  8. 合成関数とは 2つの以上の関数をつないで、全体を1つの関数とみなすことを合成関数といいます。 下は、𝑓 𝑥 = 2x! + 2 を3つの簡単な関数の合成関数として再定義した例です。 ディープラーニングのアルゴリズムは、複雑な合成関数の固まりといっていいです。

    なので、「合成関数」はディープラーニングの世界では⾮常に重要な概念です!! 𝑓 𝑥 = 𝑓! ∘ 𝑓" ∘ 𝑓#(𝑥) 𝑦 = 𝑥" 𝑦 = 2𝑥 𝑦 = 𝑥 + 2
  9. Pythonの合成関数 前ページの合成関数を Pythonで実装してみます。 関数の呼び出し結果を次の関数の引数 にすると、⾃然と合成関数を作ったこ とになります。 →ディープラーニングの プログラミングでよく登場します︕

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

  11. 微分 ディープラーニングで合成関数と並んで重要な数学概念は微分です。微分の計算⽅法は以下の通りです。 グラフ上の⼆点を結んだ傾きの式で、⼆点間の距離ℎを限りなく0に近づけた結果です。 (𝑥, 𝑓 𝑥 ) (𝑥 + ℎ,

    𝑓 𝑥 + ℎ ) ℎ 𝑓 𝑥 + ℎ − 𝑓(𝑥) f0(x) = lim h!0 f(x + h) f(x) h 関数上の2点間の傾き 2点間の距離を限りなく0に近づける dy = f(x + dx) f(x) ; f0(x)dx 𝒉を𝒅𝒙と置き換えると、𝒅𝒙が⼗分⼩さいとき下記の近似式が成⽴します。
  12. 極⼤・極⼩ 𝑓(𝑥)の増加量は 𝑓" 𝑥 𝑑𝑥と近似的に等しいです。 -> 𝒇" 𝒙 = 𝟎となるような𝑥では、𝑓(𝑥)の値は増えも減りもしないです。

    -> 極⼤値または極⼩値になります。 極大 極小 𝑓′ 𝑥 < 0 𝑓′ 𝑥 > 0 𝑓′ 𝑥 > 0 ディープラーニングではある関数(損失関数)の値が最⼩に なるパラメータ値を求めることが⽬的です。 -> パラメータで微分した結果が0になる場所を求める問題 と同じになります。 -> 「勾配降下法」の動作原理です。 dy = f(x + dx) f(x) ; f0(x)dx
  13. 数値微分 Pytorchなどの機械学習フレームワークでは微分計算は、数式で⾏うのでなく。数値を使って近似計算します。この ような微分の⼿法を数値微分と呼びます。実際の数値微分は、前ページの微分の定義式でなく、下記の式を⽤いる ことが多いです。その理由は、右の図で⽰しました。

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

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

    yt yp yt
  16. 損失関数 「分類」と呼ばれる、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
  17. ⼭登りアルゴリズム(勾配降下法) これから、⼭登りのたとえ話で勾配降下法のアルゴリズムを説明します。 次のようなシチュエーションを想像します。 ⽬的︓⼭の頂上にたどりつくこと 前提条件︓ ・霧がかかっていて視界は1mしかないので、頂上を⾒ることはできない ・⽊や、崖や、⾕など障害になるものはなく、どの⽅向にも進めるものとする 使える道具︓ ・正確な⽅位を測定できるコンパス ・⻑さを測定できるメジャー

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

    ②で定めた斜辺の⻑さの100倍の距離だけ先に進んでそこを次の地点とし、①を繰り返す。 ①⾼度の差の測定 ②次に進む向きの決定
  19. ⼭登りアルゴリズム(勾配降下法) 前ページの⽅式で⼭登りをしたところ、⾒事⼭頂にたどりつきました。 その経過を、等⾼線付きの地図であとから確認した結果が下図になります。

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

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

  22. 2. PyTorchの特徴的機能

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

    勾配計算を⽬的としたいくつかの仕掛けがある
  24. テンソルの特徴1: 任意の階数のデータ配列 「次元」という⾔葉は、ベクトルの要素数の意味でも使うことがあるため、 混同しないように「階数」という⾔葉を⽤います。 具体例から説明します。 0階テンソル : 単なる数値。数学⽤語でいうと「スカラー」 1階テンソル: 1つのインデックスを持つデータ配列。数学⽤語でいうと「ベクトル」

    2階テンソル: 2つのインデックスを持つデータ配列。数学⽤語でいうと「⾏列」 3階、4階テンソル : それぞれ3つ、4つのインデックスを持つデータ配列。対応する数学⽤語はない この点だけでいうと、⾏列演算⽤のライブラリである NumPy と違いはありません。 2階テンソル(⾏列)の例
  25. テンソルの特徴 2: データ配列以外の仕掛け テンソルには、データ配列としての役割以外の仕掛けがいくつかあります。 その中で、特に重要なmax関数を紹介します。この関数は多値分類モデルで正解値取得に⽤いられます。 max関数︓最⼤値を取得する関数だが、最⼤値だけでなく、最⼤値を取る indexも同時に取得 第2引数は「軸」を意味していて、こ の例では「⾏⽅向の集計」となる

  26. Define by Run PyTorchのフレームワークとしての最⼤の特徴といえる、「Define by Run」について説明します。 Define by Run とは、

    テンソル変数間で演算をする際の過程を「計算グラフ」の形で⾃動的に記録する機能 ということができます。 この機能を利⽤したい場合、対象とするテンソル変数で、 requires_grad属性をTrueにします。 なぜ、このような仕組みを持っているかというと、それは、次に説明する「勾配計算」をするためということになります。
  27. Define by Run 下記の形で定義したテンソル変数 𝑥 を出発点として⾏った計算に関しては、計算グラフが⾃動⽣成されます。 requires_grad属性を True に設定

  28. 計算グラフの⽣成 テンソル変数 𝑥 から計算されたテンソル変数 𝑦 と 𝑧 は、「計算グラフ」を保持しています。 𝑦 =

    2𝑥! + 2 の計算をしながら 計算グラフ⽣成 更に 𝑦 の要素をすべて⾜した結果を 𝑧 に代⼊ (この計算でも計算グラフを⽣成)
  29. 計算グラフの可視化 make_dot関数を⽤いて、テンソル変数 𝑧 の計算グラフを可視化しました。 関数𝑧の計算の過程が正しく保持されていることがわかります。 勾配値保存⽤ 𝑦 = 𝑥! 𝑦

    = 2𝑥 𝑦 = 𝑥 + 2 3つの関数を合成すると 𝑦 = 2𝑥! + 2になる 𝑦の要素をすべて加算
  30. 勾配計算 こうやって計算したテンソル変数 𝑧 は、計算グラフを持っているので勾配計算が可能です。 勾配計算はbackward関数により実⾏されます。 計算結果は、テンソル変数 𝑥のgrad属性により取得可能です。

  31. 勾配計算結果の可視化 関数 𝑦 = 2𝑥! + 2 の計算結果 (y.data)と、関数の勾配計算結果 (y.grad.data)をグラフ表⽰します。

    2次関数とそれを微分した1次関数が表⽰され、正しく勾配計算できていることが確認できます。
  32. 勾配降下法の実装と最適化関数 PART 1で説明した⼭登り(勾配降下法)は勾配計算結果(grad)を⽤いて下記の実装になります。 (線形単回帰の場合) 最適化関数を⽤いるとパラメータ修正は 下の実装で⾏える

  33. 3. PyTorchによる機械学習

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

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

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

    損失関数 criterion を nn.MSELossクラスのインスタンスとして⽣成 (繰り返し処理) 損失関数 criterion を呼び出して損失(loss)を計算
  37. 損失、予測関数、損失関数の関係 ここで、下記のコードに注⽬して下さい。 冒頭で説明した合成関数の実装パターンがここにも出てきていることに気付きます。 損失(loss)は、予測関数 net と損失関数 criterion の合成関数です。

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

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

  40. パラメータ修正 パラメータ修正の実装は ① 最適化クラス(この例ではoptim.SGDクラス)のインスタンス変数 optimizer を⽣成 ② step関数呼び出しで、パラメータ修正実施 からなります。 (初期処理)

    最低化関数optimizer を optim.SGDクラスのインスタンスとして⽣成 パラメータで指定している lr は学習率で、機 械学習において最も重要なパラメータ (繰り返し処理) step関数呼び出しにより予測関数net内のパラメータ を修正
  41. 繰り返し処理 ①予測計算、②損失計算、③勾配計算、④パラメータ修正 の4つの計算を繰り返すことで、予測関数 net 内の 最適なパラメータ値を求めます。これがPyTorchによる機械学習実装の全体像です。