ディープラーニングとは?
ディープラーニング(DL)とは、ニューラルネットワークの層を深くしたものです。ニューラルネットワークとは、人間の脳の神経回路(ニューロン)の仕組みをモデルにした機械学習アルゴリズムです。このニューラルネットワークを多層にし、データのパターンを学習することで、高度な予測や分類を可能にします。
モデルとディープラーニング
DL の中には、モデルという概念があります。モデルとは、プログラミングにおける関数のようなもので、入力を受け取り、出力を返すものです。
最初、モデルはデタラメな出力を返します。そして、このモデルを学習させていくことで、「未知のデータに対する予測精度(能力)が高いモデル」を作っていく。これが DL です。
モデルの種類
モデルには様々な種類があります。中でも有名なのは以下の3つです。
- MLP(Multi Layer Perceptron, 多層パーセプトロン):他の DL のベースとなっているモデル
- CNN(Convolutional Neural Network, 畳み込みニューラルネットワーク):画像分野に特化したモデル
- RNN(Recurrent Neural Network, 再帰型ニューラルネットワーク):自然言語処理に特化したモデル
この記事では、最も基本である MLP について解説します。
全結合層(Fully Connected Layer)
MLP は 3 つの層で構成されます。
1. 入力層: データの入り口(例: 「部屋の広さ」「築年数」「駅からの距離」)
2. 中間層(隠れ層): データを加工する層(hidden layer)
3. 出力層: 予測結果(例: 「家賃」)
MLP では、入力層から出力層まで、ノードを重ねて計算を行います。
その際に、以下の 3 つの要素を用いて計算を行います。
各層のバイアス項とパラメータを掛けて計算を行ったノードたちを重ねていくことで、出力層で予測結果を出すことができます。
教師あり学習
MLP は基本的に「教師あり学習」として分類されます。「教師あり学習」とは、入力データとそれに対する正解データを用いて、モデルを学習させる手法です。
また、教師あり学習には以下の 2 種類があります。
今回は、回帰の例を用いて解説します。
Pytorch で全結合層を作成する方法
import torch.nn as nn
nn.Linear(入力ノード数, 出力ノード数)
入力層が3つ
、中間層が2つ
、出力層が1つ
の場合は、以下のように記述します。
nn.Linear(3, 2)
nn.Linear(2, 1)
DL でよく使用する計算
1. 線形変換(ノードを重ねる際にウェイトをかける)
- 名前にあるように、線(一次関数)に変換可能な計算で使用
- 「入力層->中間層」「中間層->出力層」までのノードを重ねる際に使用
2. 非線形変換(活性化関数を適用)
- 線形変換では、線に変換可能な計算であるため、ニューラルネットワークの表現力が低い
- 非線形変換を適用することで、ニューラルネットワークの表現力を高めることができる
- 代表的な活性化関数には、ReLU 関数、シグモイド関数、ソフトマックス関数などがある
- これらは、「中間層」で使用される
3. 目的関数(損失関数)を計算(予測値と正解値の誤差を計算)
- 予測値と正解値の誤差を計算することで、モデルの学習を行う
- これらは、「出力層」で使用される
順伝播: 入力層 → 出力層のデータの流れ
逆伝播: 出力層 → 入力層のデータの流れ(誤差の修正)
線形変換
線形変換は、ノードを重ねる際に、ウェイト(パラメータ)を掛ける計算です。
主に、「入力層->中間層」「中間層->出力層」までのノードを重ねる際に使用されます。
計算式:
y = Wx + b
y
: 出力値W
: ウェイト(パラメータ)x
: 入力値b
: バイアス
非線形変換
これは、「中間層」で使用される計算です。
イメージとしては、線形変換では、線に変換可能な計算であるため、バラバラになっているノードを線に変換するのは難しいです。
そのため、バラバラになっているノードを多次元関数のような線に変換するために、非線形変換を使用します。
そうすることで、ノード内のデータを忠実に表現することができます。
また、非線形変換は、活性化関数を使用します。
代表的な活性化関数
目的関数(損失関数・コスト関数)
予測値と目標値の誤差を測定する関数。
逆伝播とパラメータの更新
MLP において、一番重要といっても良いのが、逆伝播とパラメータの更新です。
これまでの計算で生じた、誤差を修正し、適切なパラーメターに更新してあげることで、ニューラルネットワークの精度を高めることができます。
この計算を行うためには、最急降下法と誤差逆伝播法を用います。
最急降下法(SGD: 確率的勾配降下法)
Pytorch によるニューラルネットワークの実装
全結合層の作成
import torch.nn as nn
fc = nn.Linear(3, 2)
fc.weight # 重み
fc.bias # バイアス
乱数のシードを固定
DL を行う際、デフォルトでは、ランダムな値を用いて計算を行います。
以下のように、乱数のシードを固定することで、同じ結果を得ることができます。
import torch
torch.manual_seed(0)
テンソルの作成
テンソルは、Pytorch で用いられるデータの型です。
Pytorch で計算を行う際は、テンソルを用いる必要があります。
x = torch.tensor([1., 2., 3.])
print(x) # tensor([1., 2., 3.])
print(type(x)) # torch.Tensor
print(x.dtype) # torch.float32
線形変換の計算
fc = nn.Linear(3, 2)
u = fc(x)
print(u) # tensor([-0.1261, -0.1261], grad_fn=<AddBackward0>)
非線形変換(ReLU 関数)
import torch.nn.functional as F
fc = nn.Linear(3, 2)
u = fc(x)
h = F.relu(u)
print(h) # tensor([0.00000, 0.0526], grad_fn=<ReluBackward0>)
ReLU 関数は max(0, x)
を計算し、0 以下の値を 0 に変換します。
目的関数の計算
# 目標値
t = torch.tensor([1., 3.])
# 予測値
y = torch.tensor([2., 4.])
# 平均二乗誤差
mse = F.mse_loss(y, t)
print(mse) # tensor(1.0000)
まとめ
Pytorch を活用しながら、ディープラーニングの理解を深めていきましょう!