私的AI研究会 > PyLearn

 PyTorch 学習ノート

 「機械学習]と「PyTorch」の学習過程で見つけた新山 祐介氏のサイト 『真面目なプログラマのためのディープラーニング入門』 の学習メモ。

▲ 目 次
※ 最終更新:2024/03/18 

 GPU の仕組みと PyTorch 入門 == 編集中 ==

 『真面目なプログラマのためのディープラーニング入門』 第6回 GPU の仕組みと PyTorch 入門 より

1. GPU (Graphical Processing Unit)

2. PyTorch 入門

 PyTorch は「機械学習フレームワーク」と 呼ばれるソフトウェアの一種であり、効率のよいニューラルネットワークを 簡単に実装するために開発された。
 PyTorch を使う利点は:

  1. GPU を使って高速に計算できる
  2. 勾配を自動的に計算する機能 (autograd) がある。 そのため、各レイヤーで backward() メソッドを書く必要がない
  3. よく使われるレイヤー、活性化関数などがあらかじめ定義されている

2-2 Tensor (テンソル) とは何か?

  1. Tensor上のデータは、CPU上の主記憶か、 あるいは GPU上のメモリのどちらに格納するか選ぶことができる
  2. Tensor上の各数値は、それが計算されたときの勾配 (grad) を保持することができる

2-3 Tensor を使って勾配を自動的に計算する

2-4 GPU を使って計算する

2-5 PyTorch における学習の流れ

  1. PyTorch では「レイヤー」 (PyTorchではModuleと呼ばれる) を細かく分ける
    たとえば、完全接続されたノードの入力に 重みをつけて足す部分と、(シグモイドやReLUなどの) 活性化関数、max pooling処理などはそれぞれ別々の「レイヤー」として定義されている
    これは個々のレイヤーを組み合わせることで柔軟に ニューラルネットワークを構築できるため

  2. PyTorch では、ニューラルネットワークへの入力・出力は 1個1個の訓練データではなく、ミニバッチ全体である
    これは先に述べた CPU-GPU 間の通信を最小限にするため

  3. PyTorch では、ネットワークの重み・バイアスを更新するときに 直接変更せず、最適化器 (optimizer) という特別な オブジェクトを経由しておこなう
    これは、重み・バイアスの更新に単純な確率的勾配降下法 (SGD) 以外の より優れた方式を使えるようにするため (詳細は Adam最適化器を使う を参照)
    # ニューラルネットワークを定義する
    model = ...
    # ニューラルネットワークを訓練モードにする
    model.train()
    # ミニバッチごとの訓練データを用意する
    minibatches = [ ... ]
    # 最適化器と学習率を定義する
    optimizer = optim.SGD(model.parameters(), lr=0.01)
    # 各ミニバッチを処理する
    for (inputs, targets) in minibatches:
        # すべての勾配(.grad)をクリアしておく
        optimizer.zero_grad()
        # 与えられたミニバッチをニューラルネットワークに処理させる
        output = model(inputs)
        # 損失を計算する。
        loss = F.mse_loss(output, targets)
        # 勾配を計算する
        loss.backward()
        # 重み・バイアスを更新する
        optimizer.step()
    ・PyTorch のコードは大抵どれもこのパターンに従っている
    ・違うのは最適化器と学習率および損失関数
    ・上の例ではそれぞれ最適化器として optim.SGD (普通の確率的勾配降下法)、学習率 0.01、そして損失関数として F.mse_loss を使っている
     (PyTorchでは、ニューラルネットワーク用の関数は すべて F. という名前空間で定義される慣例になっている)

3. PyTorch を使った MNIST の実装

3-1 学習したネットワークを保存・読み込む

3-2 GPUを使って計算させる

 PyTorch では、計算に使うテンソルが GPU 上にあれば GPU 上で計算が行われる

  1. ニューラルネットワークの重み・バイアスを GPU に転送する
    # model = MNISTNet()
    model = MNISTNet().to('cuda')
  2. 入力する各ミニバッチ (inputs) を GPU に転送する
    inputs = inputs.to('cuda')
  3. GPU 内で演算を実行する
    outputs = model(inputs)
  4. GPU 内で演算を実行する
    出力結果 (outputs) を CPU に転送する

Datasetクラスと DataLoaderクラスを使う

3-4 Adam最適化器を使う

3-5 全部ををまとめる

 

更新履歴

参考資料

 

Last-modified: 2024-03-18 (月) 05:55:32