ディープラーニング、ニューラルネットワークについて解説してきましたが、では、ニューラルネットワークはどのようにつくるのでしょうか?
その質問に答えるため、「機械学習」とは何か、ということを解説していきましょう。
機械学習にも種類が色々あるのですが、今回はその中でも「教師あり学習」というものについて解説します。
人の顔から感情を推定するというモデルを例に取ります。
この場合、一昔前であれば細かいルールベースのプログラミングが必要でした。
顔の画像から、口や目の特徴点を取り、その特徴点の配置等から感情を確定させます。
ただ、人の顔は解像度や年齢、性別、国、写真の角度によっても様々変わりますから、そのプログラミングは一筋縄では行きません。
そこで機械学習の出番です。
ニューラルネットワークで機械学習を行うと、上記のようなプログラミングは不要です。
ニューラルネットワークを定義して、そのニューラルネットワークに対して、
この顔は怒っている顔。
この顔は喜んでる顔。
この顔は悲しい顔。
のように大量の顔と、その顔がどんな感情を表しているかというデータをニューラルネットワークに与えます。
するとニューラルネットワークは、これを学習していきます。
どのように学習するかというと、入力に対しての出力が正解と一致していない場合、自分自身(ニューラルネットワーク)の各ニューロンの発火タイミングを正解データが出力されるように少し調整します。
これを繰り返すことによって、そのニューラルネットワークは最終的に顔の画像から感情を出力出来るようになります。
上で少しプログラミングに触れましたが、ニューラルネットワーク構築の際もプログラミングは必要になります。
ただ、プログラミングする内容が、上記に記載したものとは全く異なります。
まず考えないといけないのは下記の定義です。
・入力はどんな形式か(例:200×200の顔の画像)
・ニューラルネットワークのニューロンはどんな構造なのか(例:層の数・ニューロンの数)
・出力はどんな形式か(例:喜怒哀楽)
を定義することになります。
この定義したニューラルネットワークに対して、プログラム上で大量の訓練データ(例:顔画像と正解の感情のペアのデータ)を流し込むのです。
つまり、プログラム上では口の位置を判別して・・だとか、目の位置を判別して・・・だとかの画像処理はほとんど必要ありません。
また、ニューラルネットワーク上のニューロンの構造ですが、これは複雑にすると複雑な処理ができるようになります。
例えば簡単なニューラルネットワークの構造だと口元が笑っていたら【嬉しい】という感情を出力するモデルが出来たとしますが、もう少し複雑にすると口元が笑っていても目が怒っていたら作り笑いと判定して【怒り】という感情を出力するモデルができるかもしれません。
ニューラルネットワークの構造の定義のパターンは、数種類というわけではなく膨大です。また複雑にすればするほど学習に時間がかかり、精度とのトレードオフになります。
そのため、ここの構造の定義は機械学習エンジニアの腕の見せどころでもあります。
機械学習の手法が改善されていくことによって、より賢い人工知能を作れるということですね。