PyTorchでニューラルネットワークの基本PyTorchの習得は、シンプルなニューラルネットワーク(NN)の、まずは1つだけのニューロンを実装することから始めてみよう。ニューロンのモデル定義から始め、フィードフォワードとバックプロパゲーションといった最低限必要な「核」となる基本機能に絞って解説。自動微分についても簡単に触れる。});この記事は会員限定です。「PyTorch」を使いたい。考えて、PyTorchの公式チュートリアルを開いて学習を始めてみた、という人は少なくないだろう。挫折してしまったり、なかなか進まなかったり、という人も少なくないのではないだろうか。いうのも、その公式チュートリアルの、最初の「テンソル」解説だけは(NumPyライクな直観的なAPIなので)難しくないとしても、次が「Autograd(自動微分)」、その次が「ニューラルネットワーク」......と言いつつも、いきなり「CNN(畳み込みニューラルネットワーク)」による説明になっているからだ。ニューラルネットワークやディープラーニングの経験が浅い初心者にとって、そういった少しハイレベルな視点からの解説は、PyTorch機能そのものを学ぶ際の「理解の妨げ」になりやすいだろう。そもそも公式チュートリアルやAPIドキュメントが英語版しか提供されていない、という障壁もある(※ただし最近は、Chromeブラウザーが持つ[日本語に翻訳]機能が優秀なので、機械翻訳すれば十分に読めるが)。PyTorchはわざと「入門の壁」を高くして、ある程度の知識がある人だけが入って来られるように「門前払い」しているのではないか。筆書はそんなふうにすら感じている。PyTorchだって難しくないしかしPyTorchはしょせん“ツール”に過ぎない。ツールとして捉えて「PyTorchを活用するのは難しくない」と本連載では主張したい。本連載の目的と方針PyTorchは世界的な人気のわりには、日本語の分かりやすいチュートリアルがまだほとんどない。そこで本連載は、日本語によるチュートリアル入門記事として、できるだけシンプルなニューラルネットワークを題材にして、PyTorchでニューラルネットワークを活用するための最重要かつ最低限の基礎知識を最短で説明していく(※基本中の基本を本連載の第1回〜第3回の3本にまとめた)。読者に想定するゴールとしては、PyTorchの基本的な実装パターンを理解し、初歩的なニューラルネットワーク&ディープラーニングのコードが思い通りに書けるようになること、としたい。本連載の読者対象は、「ニューラルネットワークの基本を学んだことがあるレベル」を想定している。2+Keras(tf.keras)入門』のうち、下記の「仕組み理解×初実装」の前編・中編・後編の3本を読んで、内容を理解している状態とする。(SGD)」と聞いて、「その概念が分からない」といった場合には、先に上記3本の記事に目を通してほしい。この3本の記事では、ニューラルネットワークの挙動を図で示しながら、仕組み(とKerasによる実装方法)を分かりやすく説明しているのでお勧めである。本連載では、Python(バージョン3.6)と、ディープラーニングのライブラリ「PyTorch」の最新版1.4を利用する。Colaboratory(以下、Colab)を用いる。説明を始めよう!PyTorchとは?PyTorch(パイトーチ)とは、Facebookが開発しているオープンソースの機械学習(特にディープラーニング)のライブラリである。その代表的な特徴を3つだけ挙げるとすれば、以下の通りだ。「動的」に計算グラフ(=ライブラリ内部で計算処理に使うデータフローなどのグラフ)を構築できる3番目が特に重要で、例えばモデルのフィードフォワード時にif条件やforループなどの制御フローを書くなどして動的に計算グラフを変更するといったことが可能だ。Processing:自然言語処理)の分野では、研究者はさまざまな長さの文を訓練する必要があるので、「動的な計算グラフ」機能が必要不可欠である(※実際に筆者が「PyTorchがデファクトスタンダードになっている」と初めて聞いたのは、NLPの分野だった)。Execution(即時実行)などとも呼ばれている。Executionが搭載されたが、「動的な計算グラフ」の細かな使い勝手はPyTorchに一日の長がある(と筆者は感じている)。本連載の第3回までで説明する大まかな流れ本連載では、PyTorchの基礎を一気呵成(かせい)に習得していく。具体的には、次の流れで説明する。テンソルとデータ型(5)データセットとデータローダー(DataLoader)(6)ディープニューラルネットのモデル定義(7)学習/最適化(オプティマイザ)(8)評価/精度検証(1)〜(3)が1セットで、1つのニューロンだけのネットワークを題材に、PyTorchの核となる部分を説明する。これが第1回(本稿)。(4)は、より本格的にPyTorchによるディープラーニングの手順を学ぶに当たり、PyTorchの基礎部分(テンソルとデータ型)をチートシート形式でざっと確認していただく。(5)〜(8)が再び1セットで、4層のディープニューラルネットワークを題材に、PyTorchによる基本的な実装と一連の流れを解説する。第3回までのタイトルは下記のようになっている。PyTorchによるディープラーニング実装手順の基本(2020/02/20木曜公開予定)全部読み通すとかなりのボリュームになっているが、頑張って最後まで付いてきてほしい。(1)ニューロンのモデル定義それでは、「ニューロン」の入力と出力を行うコードをPyTorchで記述してみよう。torch.__version__)を実行すれば、バージョンを確認できる)。バージョンが1.4以上ではない場合は、ライブラリ「torch」を最新版にアップグレードして使う必要がある。そのためには、リスト1-0に示すいずれかのコードを実行して、アップグレード(もしくはインストール)する。RUNTIME]ボタンが表示されるので、クリックしてランタイムを再起動してほしい。[オプション]ライブラリ「PyTorch」最新バージョンのインストールリスト1-0では、「torchvision」パッケージもアップグレード(もしくはインストール)しているが、本連載では使っていない。同時にインストールしておかないと、パッケージ関係が不整合になるため、ここでインストールしておく必要がある。ニューロンのモデル設計と活性化関数PyTorchの利用環境が整ったとして話を進めよう。ここでは、2つの入力を受け付けて、それを使った計算結果を1つの出力として生成するニューロンを、モデル化(=モデル設計)する。モデル設計のために、ライブラリ「PyTorch」のメインパッケージであるtorchをインポートし、その中で定義されているnnパッケージ(=NN:ニューラルネットワーク機能)を使って、torch.nn.Moduleクラスを継承した「独自の派生クラス」(今回の名前は「NeuralNetwork」)を作成する。torch.nn.Moduleを「モジュール」と記載すると、Pythonの「モジュール」と紛らわしいので、本連載では「torch.nn.Module」で表記を統一する。ちなみにPyTorchによるモデルの作成方法/書き方は幾つかあり、代表的なものを挙げるなら以下の3つである。高水準APIのtorch.nn.Moduleを使う方が、効率がよいモデル設計のコードは、リスト1-1のようになる。ちなみにPyTorchでは、インデントのタブ文字数は4となっているので、本連載ではそれに従うこととする。ここでは何らかの座標を入力すると(2つの入力値)、それが青色なのかオレンジ色なのか(1つの出力値)を推測するものとする(青:1.0〜オレンジ:-1.0の範囲)。「出力=活性化関数(第n層(入力))」の形式で記述する。層(layer)を重ねる場合は、同様の記述を続ければよい(第3回)。「出力(output)」は次の層(layer)への「入力(input)」に使う。ニューロンのモデル設計と活性化関数コード内にできるだけ多くの説明コメントを入れたので、本文ではポイントのみを示すこととしよう。NeuralNetwork(nn.Module):が、「torch.nn.Moduleクラスのサブクラス化」の部分である。フィードフォワード(=活性化関数で変換しながらデータを流す処理)を実装するの2つのメソッドが実装されている。NeuralNetworkクラスをインスタンス化すればモデルの作成は完了だ。Consoleなど)とも呼ばれている。Linearクラスのコンストラクター(厳密には__init__関数)の第1引数と第2引数には、入力ユニット数と出力ユニット数を指定すればよい。活性化関数は、activation変数に定義しているが、今回はtanh関数(図1-1)を使用する。tanh関数(参考比較対象:シグモイド関数)PyTorchでは、活性化関数としてtorch.nnパッケージ内に以下のものが用意されており、すぐに利用できる(※カッコ書きがあるものは特に有名なもの)。「パラメーター(=重みとバイアス)を初期化したい」というニーズは高いだろう。「0」や「一様分布のランダム値」で初期化するなどの方法がある。この方法については、第3回で掲載するリスト7-4の冒頭で示す。ここでは「自動的な初期化」ではなく「任意の初期値の指定」を行う方法を説明する。初期値の例として、2つの入力(の接続線)にかかる重みに「0.6」と「-0.2」を、バイアスには「0.8」を設定することにしよう(リスト1-2)。パラメーター(重みとバイアス)の初期値設定リスト1-2もポイントを示しておこう。モデルのパラメーターはtorch.nn.Parameterオブジェクトとして定義する必要がある。そのtorch.nn.Parameterクラスのコンストラクターには、torch.Tensorオブジェクト(以下、テンソル)を指定する(※テンソルの使い方の詳細は、第2回で説明する)。そのtorch.Tensorクラスのコンストラクターには、Pythonの多次元リストを指定できる。このクラスを活用して、重みとバイアスをweight_arrayとbias_arrayという変数に定義している。バイアスを指定可能を使用すればよい。重みやバイアスといったパラメーターの情報を取得して表示したい場合には、<モデル名>.state_dict()メソッドが便利だ。このメソッドを使えば、パラメーターといったtorch.nn.Module全体の状態が取得できる。ちなみに情報取得ではなく、最適化のために使う「実際のパラメーターのオブジェクト」を取得するには、<モデル名>.parameters()メソッドを呼び出せばよい。この方法については、第3回に掲載するリスト7-1で示す。(2)フィードフォワード(順伝播)以上でモデルの設計は完了だ。実際にサンプルデータを入力してフィードフォワードを実行し、その出力結果を確認してみよう。フィードフォワードの実行と結果確認フィードフォワード、つまりモデルによる推論/予測は、modelオブジェクトを関数のように呼び出すだけである(厳密には__call__メソッドの呼び出し)。この関数の引数には、(テンソルの)入力値を渡せばよい。戻り値として、出力結果(つまり予測値)がテンソル値で返される。それを実際に行っているのがリスト2-1である。フィードフォワードの実行と結果確認リスト2-1のポイントを示す。設定を有効にする必要があります。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。