NN
この記事はKCS AdventCalendar 10日目の記事です.
前書き
昨今,AIというものが非常に盛り上がりを見せていますね.例えば,AIが曲を自動で生成したり,自然な人間な顔を生成したりすることができます.このAIというものはどのような方法で曲を作ったり画像を生成したりできるのでしょうか.ここでは,その方法をすべて説明することはできないので,その基礎となるニューラルネットワークというものを数式なしで雑に説明しようと思います.(本当は数式ありのほうがわかりやすいと思うのですが,諸事情で数式がなくなりました)
ニューラルネットワークとは?
ニューラルネットワークは一体何をしているのでしょうか.これは,一言でいえば目的となるデータに関数を近似することをしています.(詳しくは後述)これだけでは機械学習の線形回帰などと何ら変わらないのですが,ニューラルネットワークの特徴として非線形変換を何度も繰り返して関数の表現能力を高めていることがあげられます.重回帰と比較すると,入力データに対して
非線形か線形変換をしてから「重み」をかけて線形に和をとります.しかし,ニューラルネットワークではこの和をとって非線形変換をおこなった値を新たなデータとして同じことを何回も繰り返します.この和と非線形変換をとる回数がそのニューラルネットワークの「層」の数となります.
以下の図を見て下さい.
これは簡単な3層ニューラルネットワークの図です.図では青が入力データ,赤が線形和に非線形変換をした新たなデータを表しています.矢印はデータに重みをかけることを表しています.それぞれの重みがかけられたデータの和をとって非線形変換されます.ここで作られたデータは隠れ層とよばれここのデータ数によってニューラルネットワークの表現能力が変わります.最後に出力された緑のデータは,ニューラルネットワークのタスクの種類によって変わります.例えば,0~9の文字を分類するタスクであれば最後にソフトマックス関数という非線形関数によって10個のデータを出力させます.そうして得られた出力と用意した目的のデータとの損失を計算します.その損失情報をもとに「重み」を更新していくことでデータに関数を最適化していきます.以下にこれまでのニューラルネットワークの流れをまとめます.
- 入力データ,目的とするデータを用意する.
- 入力データ(or 新たなデータ)に重みをかけて線形に和をとる.
- その線形和に非線形変換をとり新たなデータを作る.
- 2~3を一定回数繰り返す.
- 最終的に出力された値と目的データとの損失を計算する.
- その損失をもとに重みを更新させる.
ここからは,6の方法が特徴的なので具体的に見ていくことにします.
重みの損失情報(勾配情報)をどう渡すか?
ニューラルネットワークでは,勾配法という手法を用います.これは,簡単に言えば微分して得られた勾配にある定数をかけた分だけ,変数を更新するという方法です.ある定数は学習率と呼ばれたりします.
ニューラルネットワークの場合は,出力した値をそれぞれの重みで偏微分することになります.勾配は出力した値から得られるため,勾配情報は先ほどの図で言えば右から伝わることになります.そのため,この更新方法は誤差逆伝播法と呼ばれます.
おわりに
今回は,数式なしでニューラルネットワークを解説してみたのですが,かえってわかりにくくなってしまいましたね.個人的な好みなのですが,ニューラルネットワークをベイズ的に取り扱う,つまり各パラメータを確率変数として計算していく見方が好きです.皆さんもベイズに入門して計算してみてください.
Posted on: 2019年12月11日, by : 下山竜矢