【速習】Pytorch入門②:MLP回帰を実装してPyTorchの基礎を学ぶ

前回はPyTorchのベースとなるtorchの扱い方をおさらいできました。

今回は、PyTorchで多層パーセプトロン(Multilayer perceptron:MLP)回帰を実装するとともに、主要なPyTorchパッケージを確認したいと思います。

全体の流れ

モデル実装の全体的な流れは下のようになります。()内はその際に使用するPyTorchパッケージです。

  • 入力データセットの作成、反復処理(Dataset, Dataloader)
  • ニューラルネットワークの定義(nn.Module)
  • 損失の計算、勾配をネットワークのパラメーターに伝播(nn.Module)
  • ネットワークの重みを更新(Optimaizer)

主要なPyTorchパッケージ

PyTorchに関わらず、多くのディープラーニングフレームワークでは実装を簡易化するために様々なパッケージを提供しています。PyTorchでは主に以下のものがあります。

torch.tensor多次元配列。PyTorchで使うデータ構造。
torch.autograd順伝播・逆伝播を実装する。逆伝播(backward())などでのTensorに対する自動微分操作をサポートする。
torch.utils.data入力するデータとそのラベルをセットにしてまとめる「Dataset」やDatasetからミニバッチでデータを取り出しモデルへ渡す「Dataloader」などのユーティリティを含む。
torch.nn.Moduleニューラルネットワークの構築に用いる。モデルの保存や読み込み、GPUへの移動など、パラメーターのカプセル化を担う。
torch.optimSDGやAdamなどのパラメータ最適化アルゴリズムを使えるようにする。
主要なPyTorchパッケージ

モデルの実装

データセットの作成

今回は、練習用データとして sin(5x) に乱数を加えたものをnumpyで用意します。from_numpy()でtorch.tensorに変換します。

モデルの定義

pytorchでは、nn.Moduleクラスを継承した「pythonのclass」としてモデルを定義します。

class MLP(nn.Module): 定義するMLPというclassは、親クラスnn.Moduleを継承
def init(): 引数を受け取ってインスタンス化する
super(MLP, self).init(): super関数で親クラスを継承する
def forward(self, x): インスタンス化した後、その関数が呼び出されたときに動作する。forward関数を定義するとbackward 関数(勾配計算)も自動的に定義される

.parameters()でnetworkの構造やパラメータを取得できます。

損失の計算・逆伝播・重みの更新

個々の動作を理解するために、xからデータを1つ取り出してニューラルネットワークに入力し、誤差の計算や重みの更新によるパラメータの変化をみてみます。

学習ループを回してみる

上記の流れをバッチごとに行い、ニューラルネットワークを学習させます。
Datasetはデータとそれに対応するラベルを1組返し、DataLoaderはデータをバッチサイズにまとめて返すクラスです。

計算グラフの可視化

今回作成した3層のMLPの構造はtorchvizというpythonのパッケージを使うことで可視化できます。parameters()だけでは物足りない時にどうぞ。

以上、MLP回帰の実装を通して、PyTorchとその主要なPyTorchパッケージを確認しました。