社員研修会
画像モデル入門~AIは何を学習するのか?
参加者は何を学習するのか?

5月27日~28日に泊りがけで社員研修会を行い、20人を超える社員が参加しました。毎年テーマを決めて行ってきましたが、今年は「画像モデル」としました。進化の著しいこの分野で、今さら何をやっても驚かないですが、それでもどういう仕組みで動いているのか?ということに関しては、知っている人はほとんどいないのではないでしょうか?ということで、研修会では、各自の持参したPC上でpyainoを使って基本的なモデルを作り、それを動かすという流れで研修を進めました。これをしたからと言って、理解はまた別かもしれませんが、少なくとも自分事としてAIを扱うという観点では、何らかのものをつかんでほしいと願ってのことでした。
参加者自身に説明してもらう。
参加者全員というわけにはいきませんが、参加者自身に今回のテーマに関連することがらの発表を行う機会を設けました。以下の5つです。
1.Neuron,Convolution,Pooling,Interpolate
2.VAE,Diffuser,ViT
3.Data Loader
4.MNIST,CIFAR-10,celebA
5.微分、そして、Define by runと自動微分
これを説明する資料をAIの力を借りて作り、ここからが重要ですが、「自分の言葉で」「参加者にわかるように」説明する。というものです。
いずれも、説明以前に理解するのも大変なものばかりですが、AIの力を借りて何とかしよう、ということで半月前にお題を与えて取り組んでもらい、当日発表してもらいました。
担当してもらった5人がみなそれぞれにきちんとした資料を用意し、そして熱意をもって説明してくれました。熱が入りすぎて資料のページ数が多く、どうなることかと思いましたが、ともかく、これだけでも、大きな成果だと思います。
そして研修の内容は?
さてこの発表が終わってからがいよいよ実践です。各自PCを持参してもらって、以下の内容を自身のPCの上で動かしていこうというものです。
画像認識のクラス分類、マルチラベルの属性分類、クラスからの文字画像生成、マルチラベルの属性からの顔画像生成、そして、VAE、Diffuser(紹介のみ)
一通りの分類問題と、画像生成を両方とも、ということで掲げたのがこれらでした。そしてこれらの「モデルを作る」ことを体験してもらう、ということを主軸としました。そして、モデルを作る部分は空白にして、その周囲の部分は事前に用意しておくようにしました。それというのも、簡単なプログラムでも完成させるのは結構大変だからです。そもそもプログラムを書くときに、もっとも多いのはタイポによるバグです。そしてバグ取りは記述よりも多くの時間を要し、大変な労力を強いられることとなってしまいます。ともかくも「モデルを作る」ことを体験してもらうためには、それ以外の部分に時間と労力をとられたくなかったのです。
モデルのつくり方
さてその「モデルを作る」ですが、モデルを作る一番簡便な方法は、pyaino.Neuronに定義された、SequentialないしはSequentialWithLossを使うことです。そしてその中に、Neuronに定義された基本モジュールやFunctionsの関数を並べることで、その並べた順番に信号が受け渡されてdefine by runにより学習可能なモデルが作れます。例えば、こんな感じです。
model = Neuron.SequentialWithLoss(
LossFunctions.CrossEntropyError(),
)
この空白の部分に何かを記述して、モデルを作るのです。例えば、以下のようにです。
model = Neuron.SequentialWithLoss(
Neuron.Conv2dLayer(16, activate='ReLU', optimize='AdamT'),
Neuron.NeuronLayer(10, activate='Softmax', full_connection=True, optimize='AdamT'),
LossFunctions.CrossEntropyError(),
)
この例は、10クラスの分類を行う3層(何もない入力層を1と数え、畳込み層、全結合層、併せて3と数えた場合)のごく簡単なニューラルネットワークです。これはMNISTの0~9の手書き文字の分類問題に使えるものです。このこれでモデルができれば、あとは、pyainoのdata_loaderを使ってデータを供給しながら;
for x, t in loader_train:
y, l = model(x, t)
l.backtrace()
model.update(eta=0.001)
これで1epoch分の学習ができます。だから、プログラムとしてはそんなにステップ数も多くなく動かすことができます。むろん先に書いたように、この学習部分などは事前に用意しておいたので、受講者は書かなくて良いのです。つまり先ほど示した空白部分の穴埋めだけを行なえば良いのです。
それでも...
それでもNeuron.pyに定義されたモジュールが何で、それに対してどういう引数を与えれば良いのか、活性化関数(activate)は何か、最適化関数(optimize)は何か、などなど、このたった2行を記述するだけでも、初学者にはわからないことだらけだろうと思います。だからはじめは、(ほんの一例に過ぎない)お手本を見て、その通りに記述するしかなかっただろうと思います。
終わりまで行きつきました。
ともかくも、けっこう難しいところまで、2日間の研修の中で到達することができました。この技術的な内容については、また別途、ブログを書こうと思います。
ブログのご感想やAIフレームワーク「ufiesia」「pyaino」に関するお問い合わせは、
問い合わせフォームからお送りください。
- お問い合わせ内容によりましては、ご期待に添えない場合やご回答が出来ない事が有ります。