![見出し画像](https://assets.st-note.com/production/uploads/images/122860622/rectangle_large_type_2_db3e8fbb4564fa67d4d01b19dfc8d838.png?width=800)
分類AIの進化史④LeNet
前回は、畳み込みニューラルネットワーク(Convolutional Neural Network, CNN)の元祖ともいえるネオコグニトロンについて紹介しました。
今回は、畳み込みニューラルネットワークの訓練に誤差逆伝播法を取り入れることで学習の高速化と推論の高性能を実現したLeNetを紹介します。その原型は、ネオコグニトロンから約10年後の1989年に提案されました。
ヤン・ルカン
LeNetの開発研究はヤン・ルカン(Yann LeCun)によって行われました。現在、彼はメタ(Meta)社のチーフAIサイエンティスト(Chief AI Scientist)ですが、当時は米国のベル研究所に所属していました。また、それ以前の1988年までは、トロント大学のジェフリー・ヒントンの研究室に所属していました。
ヤン・ルカンは、ニューラルネットワークの訓練において誤差逆伝播法を実用化させることに成功しました。現在では、ディープラーニングなどにおいて当たり前となっている手法です。PyTorchやTensorFlowなどに組み込まれており、ニューラルネットワークのパラメータの最適化を行うための仕組みです。 以下は、ニューラルネットワークの学習とPyTorchのコードを対応させたものです。
![](https://assets.st-note.com/img/1698365683058-vtWS3KDIzw.png)
簡単にいうと、モデルの予測と正解データとの誤差を少なくするようにニューラルネットワークのパラメータを更新していきます。つまり、誤差を計算する関数の勾配を各パラメータに対して計算し、誤差の値が小さくなる方向へとパラメータの数値を上下させます。
推論する方向を前進方向と捉えると、誤差逆伝播とは最終的な予測値の誤差(の勾配)をパラメータへと逆方向へ計算していくので、そういう名前になっています。英語では、Back Propagationと呼ばれています。
このようにして計算された勾配を使って誤差が降下するようにパラメータを更新することを勾配降下法と呼びます。厳密には、誤差逆伝播は勾配の計算であり、上図でいうところの loss.backward() に相当します。そして、勾配降下法は勾配を使ってパラメータの更新を行う部分なので optimizer.step() が呼ばれるのに相当します。ただし、ディープラーニングの学習などでは、誤差逆伝播法や勾配降下法はほぼセットで扱われるので、どちらか一方に言及すると両方の意味を含んでいることも多々あります。
甘利俊一
時代をさらに遡ると、日本人の研究者による貢献が見つかります。例えば、甘利俊一は、1967年に多層パーセプトロンを使って勾配降下法の定式化に成功しています。ただし、Wikipediaによると当時の計算機の能力の低さもあり検証が難しく、あまり注目されずに終わったとのことです。
![](https://assets.st-note.com/img/1698367618613-6zttWFatjR.png)
コグニトロン、勾配降下法、第五世代コンピュータと日本はかなり時代を先取りしていましたが、実用化に至りませんでした。歴史に、「もし、…だったら」は存在しないのですが、違った道のりがあったのではと思わずにいられません。コンピュータの性能がもっと向上していればと考えてしまいますが、それは他の国でも同じことでしょう。
その後も、ジェフリー・ヒントンなどによって誤差逆伝播法が再発見されました。こうして歴史を振り返ってみると、その研究所にいたヤン・ルカンが、ベル研究所に移籍したところで、その手法を実現したのも自然な流れだったように見えます。
MNISTデータセット
話を戻すと、ヤン・ルカンは誤差逆伝播法を畳み込みニューラルネットワークで実用化させました。もちろん、誤差逆伝播法や勾配降下法などは、以前から知られてるアルゴリズムであり、彼が発見したわけではありません。しかし、実用化がなかなか成功しない状況において、彼の貢献は賞賛されるべきものです。
LeNetの研究は90年代に渡って継続され、手書きの数字を読み取ることに成功します。手書きの数字のデータセットといえばMNISTを思い浮かべる方も多いと思います。MNIST自体もヤン・ルカンがLeNetの学習のために準備したものです。
![](https://assets.st-note.com/img/1698367579548-rhWNgtliZg.png?width=800)
やがて、LeNetは米国郵政公社が提供する手書きの郵便番号の識別が可能となりました。1 日に何百万もの小切手を読み取れるようにまで精度とスピードが向上しました。
LeNetの構造
現在、ヤン・ルカンはメタ社のチーフAIサイエンティストであり、メタ社が提供するPyTorchのチュートリアルにLeNetの解説があります。そのネットワークの構造は下図から分かるように割と単純です。
![](https://assets.st-note.com/img/1698367976026-LlGpLbJdIW.png?width=800)
畳み込みとMaxプーリングを交互に2回繰り返し、入力画像からの特徴量を抽出しています。モノクロ画像一つは2次元(縦横)なので、特徴量も2次元です。これを各画像ごとに平坦化(一次元、ベクトル)したものを線形層(と活性化関数)を3回繰り返した部分に通します。最終的には、0から9までの各数字に対する予測の値が出力されます。この値が一番大きい数字が予測の数字となります。
PyTorchにコードによるLeNetのモデルの定義をPyTorchのチュートリアルより引用したものは、以下になります(コメントを日本語にしています)。
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 入力画像のチャンネル数:1
# 出力チャンネル数:6
# 5x5 の畳み込みカーネル
self.conv1 = nn.Conv2d(1, 6, 5)
self.conv2 = nn.Conv2d(6, 16, 5)
# 線形層: y = Wx + b
self.fc1 = nn.Linear(16 * 5 * 5, 120) # 5*5 from image dimension
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
# 2x2のMaxプーリング
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
# 2と指定しても、2x2の意味
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
# バッチの次元以外を平坦化
x = torch.flatten(x, 1)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
このコードでは、活性化関数としてReLUが使われていますが、LeNetが開発された当時は、ReLUはまだ存在していません。ReLUはジェフリー・ヒントンらによって2010年に提唱されています。元来のLeNetは活性化関数としてtanhを使っていました。
ここまでは、順方向の処理(フィードフォワード)ですが、この後に誤差逆伝播と勾配降下法の処理が行われます。
import torch.optim as optim
# オプティマイザ
optimizer = optim.SGD(net.parameters(), lr=0.01)
# フィードフォワード
output = net(input)
# 損失値の計算
loss = criterion(output, target)
# 勾配のリセット
optimizer.zero_grad()
# 誤差逆伝播
loss.backward()
# パラメータの更新
optimizer.step()
なお、PyTorchにおける畳み込みニューラルネットワークの理論・実装については、こちらの記事に詳細があります。
ビッグデータはどこに?
LeNetは手書き数字の認識に成功しました。畳み込みニューラルネットワークを効率良く訓練することを実用化しました。それでも世間的にはあまり知られることはありませんでした。ニューラルネットワークに対する注目度もあまり高くなく、どちらかといえばエキスパートシステムなど知識を集積して利用するタイプのAIが注目されていました。
そして、1995年ごろから再び、AIは冬の時代に入ります。
![](https://assets.st-note.com/img/1698371674186-VCBoh0qTpc.png?width=800)
やがてディープラーニングという言葉が流行するのには、2012年に登場するAlexNetを待つ必要があります。
ちなみに、AlexNetはジェフリー・ヒントンの指導のもとAlex Krizhevskyが開発しました。ジェフリー・ヒントンがAIの歴史で色々と登場するので、「深層学習の父」と呼ばれたりするのも頷けます。
90年代に開発されたLeNetからは、10年以上のギャップがあります。なぜなら、いくつかの問題点が解消される必要があったからです。勾配消失の問題の解消や、高速に学習を行うためのGPUの利用などです。
また、もう一つ重要なのは、ディープラーニングでは大量のデータセットが必要だということです。そこで、ImageNet(イメージネット)の登場が関わってきます。もともとはディープラーニングの成功を直接的に意図したものではなかったプロジェクトでしたが、結果として大いに貢献することとなりました。
(続く)
この記事が気に入ったらサポートをしてみませんか?