ニューラルネットワーク

Image from Gyazo

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

ニューラルネットワーク(Neural Netowork) とは, 生物の脳を数理的に表現したモデルのことであり, 1943年に外科医であったウォーレン・マカロック(Warren McCulloch)氏と, 数学者であったウォルター・ピッツ(Walter Pitts)氏が考案した形式ニューロンが起源とされています.

1940年代~60年代の第1次AIブームに大きく注目され, 単純パーセプトロン と呼ばれるニューラルネットワークが提案されます. その後,1980年代の第2次AIブームにおいて, ニューラルネットワークの学習アルゴリズムである バックプロパゲーション(誤差逆伝播法) が確立し, 多層パーセプトロン へ発展します.

近年は第3次AIブームであり,ニューラルネットワークをさらに多層化させた ディープラーニング(深層学習) が提案され,画像認識などの分野で高い性能を示しています. 今後もディープラーニングは進化し,自動運転やロボット技術に応用され, 我々の生活を支える必要不可欠な技術になると予想されます. 本授業では,ニューラルネットワークの歴史を追いながら, Google Colaboratory(Colab) で実装することで,その技術を理解することを目標とします. また,ディープラーニングの実装には,Pytorch を採用します.

Google Colaboratory

ブラウザでPythonの実装が可能なGoogle Colaboratoryを利用します. Google Colaboratoryではpipコマンドを利用して,ライブラリをインストールすることが可能です. ここでは,ディープラーニングのライブラリであるPytorch をインストールしてみます.

!pip install torch
!pip install torchvision

Image from Gyazo

Google Colaboratoryの基本

ノートブックの作成

Google Colaboratoryにアクセスしたら,ノートブックを新規作成します. ノートブックを作成したら,ノートブックのタイトル(ファイル名)を設定します. 今回のタイトルは「chapter1.ipynb」としましょう.

Image from Gyazo

ライブラリのインポート

インストールしたPyTorchをインポートします. インポートとは,プログラムで該当のライブラリを利用可能な状態にすることです. 下記のコードを入力したら,Run ボタンをクリックします(Shift + EnterでもOK).

import torch

テンソルの演算

1次元のテンソルを作成してみます. printは変数や文字列をコンソールに出力するための関数です.

$$ \left( \begin{array}{ccc} 0 & 1 & 2 \end{array} \right)\
$$

t = torch.tensor([0, 1, 2])
print(t)
#出力
tensor([0, 1, 2])

2次元のテンソルを作成してみます.

$$ \left( \begin{array}{ccc} 0 & 1 & 2 \\\
3 & 4 & 5
\end{array} \right)\
$$

t = torch.tensor([[0, 1, 2], [3, 4, 5]])
print(t)
#出力
tensor([[0, 1, 2],
        [3, 4, 5]])

テンソルの軸をtranspose()で入れ替えます(行列の転置).

$$ \left( \begin{array}{ccc} 0 & 1 & 2 \\\
3 & 4 & 5
\end{array} \right)^T = \left( \begin{array}{ccc} 0 & 3 \\\
1 & 4 \\\
2 & 5 \end{array} \right) $$

t.transpose(0, 1)
#出力
tensor([[0, 3],
        [1, 4],
        [2, 5]])

テンソルの加算をadd()で求めます.

$$ \left( \begin{array}{ccc} 0 & 1 & 2 \\\
3 & 4 & 5 \end{array} \right) + 1 = \left( \begin{array}{ccc} 1 & 2 & 3 \\\
4 & 5 & 6 \end{array} \right)\
$$

torch.add(t, 1)
#出力
tensor([[1, 2, 3],
        [4, 5, 6]])

テンソルの乗算をmul()で求めます.

$$ \left( \begin{array}{ccc} 0 & 1 & 2 \\\
3 & 4 & 5 \end{array} \right) \times 2 = \left( \begin{array}{ccc} 0 & 2 & 4 \\\
6 & 8 & 10 \end{array} \right)\
$$

torch.mul(t, 2)
#出力
tensor([[ 0,  2,  4],
        [ 6,  8, 10]])

テンソル同士の乗算をmm()で求めます.

$$ t_1 = \left( \begin{array}{ccc} 0 & 1 & 2 \\\
3 & 4 & 5 \end{array} \right)\
$$

$$ t_2 = \left( \begin{array}{ccc} 1 & 1 \\\
2 & 2 \\\
3 & 3 \end{array} \right)\
$$

$$ t_1 \times t_2 = \left( \begin{array}{ccc} 0 \cdot 1 + 1 \cdot 2 + 2 \cdot 3 & 0 \cdot 1 + 1 \cdot 2 + 2 \cdot 3 \\\
3 \cdot 1 + 4 \cdot 2 + 5 \cdot 3 & 3 \cdot 1 + 4 \cdot 2 + 5 \cdot 3 \end{array} \right) = \left( \begin{array}{ccc} 8 & 8 \\\
26 & 26 \end{array} \right)\
$$

t1 = torch.tensor([[0, 1, 2], [3, 4, 5]])
t2 = torch.tensor([[1, 1], [2, 2], [3, 3]])
torch.mm(t1, t2)
#出力
tensor([[ 8,  8],
        [26, 26]])

行列とベクトルのテンソルの乗算をmv()で求めます.

$$ t_3 = \left( \begin{array}{ccc} 2 & 2 & 2 \end{array} \right)\
$$

$$ t_1 \times t_3 = \left( \begin{array}{ccc} 0 \cdot 2 + 1 \cdot 2 + 2 \cdot 2 & 3 \cdot 2 + 4 \cdot 2 + 5 \cdot 2 \end{array} \right) = \left( \begin{array}{ccc} 6 & 24 \end{array} \right)\
$$

t3 = torch.tensor([2, 2, 2])
torch.mv(t1, t3)
#出力
tensor([ 6, 24])

テンソルの形状

テンソルの形状をshapeで確認します.

print(t1.shape)
print(t2.shape)
print(t3.shape)
#出力
torch.Size([2, 3])
torch.Size([3, 2])
torch.Size([3])

テンソルのデータ型

テンソルのデータ型をtype()で確認します.

print((torch.tensor([0, 1, 2])).type())
print((torch.tensor([0.0, 0.1, 0.2])).type())
#出力
torch.LongTensor #64ビット符号付き整数
torch.FloatTensor #32ビット浮動小数点

課題

Google Colaboratoryで作成した chapter1.ipynb を保存し, 共有用のリンクノートブック(.ipynb) をダウンロードして提出してください. 提出の前に必ず下記の設定を行ってください.

参考書籍

愛知県名古屋市にある椙山女学園大学 文化情報学部 向研究室の公式サイトです. 専門は情報科学であり,人工知能やデータベースなどの技術要素を指導しています. この公式サイトでは,授業で使用している教材を公開すると共に, ベールに包まれた女子大教員のミステリアスな日常を4コマ漫画でお伝えしていきます. サイトに関するご意見やご質問はFacebookまたはTwitterでお問い合わせください.