機械学習のライブラリPyTorchを現役エンジニアが解説【初心者向け】

初心者向けに機械学習のライブラリPyTorchについて現役エンジニアが解説しています。PyTorchとはFacebookの人工知能研究グループにより開発されたオープンソースの機械学習ライブラリです。今回は機械学習のチュートリアルでは定番のMNISTをやってみます。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

機械学習のライブラリPyTorchについて、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して、初心者向けに解説します。

 

Pythonについてそもそもよく分からないという方は、Pythonとは何なのか解説した記事を読むとさらに理解が深まります。

 

なお本記事は、TechAcademyのオンラインブートキャンプ、Python講座の内容をもとに紹介しています。

 

田島悠介

今回は、Pythonに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

機械学習のライブラリPyTorchについて詳しく説明していくね!

大石ゆかり

お願いします!

 

ニュートラルネットワークとは

ニューラルネットワークとは人間の脳内にある神経細胞(ニューロン)と神経回路網を人工ニューロンという数式的なモデルで表現したものをいいます。ディープラーニングで使用されている技術です。

ある入力に対して何かを出力する装置をつなげてネットワークを構成しています。ニューラルネットワークは教師データの入力によって 問題に最適化されていく教師あり学習と、教師データを必要としない教師なし学習に分けられます。ニューラルネットワークにおいて、学習とは、出力層で人間が望む結果が出るよう、パラメータ(重みとバイアス)を調整する作業を指します。ニューラルネットワークを学習させる際に用いられるアルゴリズムは誤差逆伝播法です。

誤差逆伝播法は損失関数の微分を効率的に計算する方法の一つです。毎回正しい答えを出せるようになるまでニューロンの入力に対する重みが最適化されるには大量のデータを読み込む必要があります。ネットワークの最適化はトレーニングあるのみで、学習段階を経てニューロンネットワークは正解にたどり着くまでのルールを学ぶようになります。
 

ライブラリPyTorchとは

PyTorchとは、Python向けにオープンソース機械学習のライブラリです。Facebookの人工知能研究グループにより開発され2016年にリリースされた比較的新しいライブラリです。

もともとは、Lua言語で書かれた機械学習ライブラリである「Torch」がPyTorchの原型です。DeepMind社もTensorFlow以前はTorchを使用していたと言われています。そのTorchをPythonでサポートさせたライブラリがPyTorchです。

海外では人気が上がっていますが、日本語での情報が少ないため、日本だとTensorFlowやChainerがよく使われています。しかし、2019年12月にChainerを開発しているPreferred NetworksはChainerのアップデートを終えて、開発基盤をPyTorchに移行することから、今後は日本でもPyTorchを使用する機運が高まってくることが考えられます。
 

[PR] Pythonで挫折しない学習方法を動画で公開中

ライブラリPyTorchの導入と使い方

PyTorchの導入

実際にPyTorchをインストールしてみます。こちらをクリックして、PyTorchのセットアップ画面を開きます。

以下の設定画面まで移動し、動作環境を選択することで、お使いのマシンにあわせたPyTorchをインストールするためのコマンドを「Run this Command」で確認できます。

PyTorchの導入のための公式サイトの動作環境設定画面。

インストールを終えたら、以下のコマンドを実行して、PyTorchのバージョンを表示させます。なお、PyTorchのライブラリを確認するには、「import torch」で確認できます。

python -c "import torch; print(torch.__version__)"

 

PyTorchの使い方

無事インストールを確認できたところで、PyTorchを使ってみます。今回は機械学習のチュートリアルでは定番のMNISTをやってみます。順番にコピペすれば一通り体験していただけます。

まずは以下のコマンドを使用し、データセットをインストールします。

import torch
train_loader = torch.utils.data.DataLoader(
    datasets.MNIST('../data', train=True, download=True,
                   transform=transforms.Compose([
                       transforms.ToTensor(),
                       transforms.Normalize((0.1307,), (0.3081,))
                   ])),
    batch_size=args.batch_size, shuffle=True, **kwargs)
test_loader = torch.utils.data.DataLoader(
    datasets.MNIST('../data', train=False, transform=transforms.Compose([
                       transforms.ToTensor(),
                       transforms.Normalize((0.1307,), (0.3081,))
                   ])),
    batch_size=args.batch_size, shuffle=True, **kwargs)

次に、Class文を使ってモデルの定義を行なっていきます。

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)

    def forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(-1, 320)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = F.relu(self.fc2(x))
        return F.log_softmax(x)

定義したモデルを元にモデルの生成と最適化関数の設定を行います。

なお、本記事では紹介しませんが、GPU版をインストールした場合はここでGPUでモデルの学習をさせることができます。

model = net.Net()
if args.cuda:
    model.cuda()

optimizer = optim.SGD(model.parameters(), lr=args.lr, momentum=args.momentum)

学習の関数を定義します。

def train(epoch):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        if args.cuda:
            data, target = data.cuda(), target.cuda()
        data, target = Variable(data), Variable(target)
        optimizer.zero_grad()
        output = model(data)
        loss = F.nll_loss(output, target)
        loss.backward()
        optimizer.step()
        if batch_idx % args.log_interval == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                epoch, batch_idx * len(data), len(train_loader.dataset),
                100. * batch_idx / len(train_loader), loss.data[0]))

いよいよ学習をします。結果は順番にコンソールに出力されます。

for epoch in range(1, args.epochs + 1):
    train(epoch)
    test(epoch)

 

まとめ

MNISTのサンプルを試して頂いてお気づきかと思いますが、文法的にはChainerとよく似ているので、Chainerを使ってた方にとっては学習コストが低いかと思います。Chainerをやっていた方はこの機会にPyTorchを初めてみるのもいいかもしれません。
 

監修してくれたメンター

メンター三浦

モバイルゲームを運用している会社のエンジニアをしています。趣味でWEB開発やクラウドコンピューティングもやっており、ソフトもハードもなんでもやります。

TechAcademyジュニアではPythonロボティクスコースを担当しています。好きな言語はPython, Node.js。

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

 

TechAcademyでは、初心者でも最短4週間で、Pythonを使った人工知能(AI)や機械学習の基礎を習得できる、オンラインブートキャンプを開催しています。

また、現役エンジニアから学べる無料体験も実施しているので、ぜひ参加してみてください。