きっかけ
DeepLearningを使った画像分類や画像認識が盛んですが、関連の単語でわからないものもたくさんあってなかなか理解が進まないと思います。そこで簡単にですが、まとめてみました。
実際には何かしらの本を一冊読んで、ChainerやらDeepLearningデモを動かしたりコードを読んだりするのが一番だと思うので、そこ前段階の 「へー」 くらいを目指そうかと思います。厳密に間違っているものもあるかもしれませんが、私は直感的にこう理解していますという内容を綴っていきたいです。
なお、コードを読める人はGithubにも目を通すと良いかと思います。自分はChainerが好きなので、Chainerを貼って起きます。
知っとくと良い単語
機械学習全般編
教師あり学習
入力するデータに対して、出力がこうあるべき!!といった関連付けられたワンセットを入力して学習していく方式。
教師なし学習
データを座標空間にプロットしてみて、数学的手法でグループ分けをしたり、将来の値を予想したりするもの。入力データに対して出力が定まったデータを用意するのは容易ではない場合は教師なし学習となる。外れ値などの検出も教師なし学習といえる。
関数
y=f(x)の形で表せるような、入力xに対してyを求めるための計算式
ニューラルネットワーク
脳を模擬した、関数のつらなり。ただ、ニューラルネットワークの場合にはベクトルを扱うため、ベクトルの次元数分の関数が縦にならび、その関数の縦列のことを層と呼ぶ。
DeepLearning(DL)
ニューラルネットワークででてきた層を何重にも重ねたもの。つまり関数の縦方向の連なりである層をさらに横方向に何重にもたくさん並べたもの。
学習
これらの関数は前述の教師あり学習では入力するデータに対して、出力がこうあるべき!!といった関連付けられたワンセットを入力するたびに、現在の関数の出力と理想出力を比較して関数式を修正していく。この過程を学習といいます。
実装編
モデル(Model)
まずDeepLearning(DL)のモデルという言い方をよくします。DeepLeaningには数多くの実装があり、それぞれ得意不得意が違います。そもそも、作られた時代も違います。インプットは何か、各層(まあ実装のようなもの)は何か、アウトプットは何か、その具体的な構成をモデルといいます。別の言い方でアーキテクチャやネットワークなんて言い方もします。何がしたいかが異なればモデルも異なるということです。
例えば画像検出などに使われる*Single Shot Multibox Detector(SSD)*なる仕組みがありますが、それにもさらにSSD300とSSD500というモデルが存在します。
大体のDLの実装例(examplesってフォルダがあると思います。)には必ずモデルを選択できるようになっています。大きく大別されたモデルの中から、さらにコード中で細かくモデルを選択するものもあります。
また、モデルの中には学習で説明した関数の修正方法についても定義されています。
データセット
モデルのインプットに突っ込むデータ集合です。当然ながら何がしたいかによってデータセットは異なります。画像関連だったらデータセットは画像になります。また教師あり学習では、つまりデータに対して出力はこうあるべき!!というのが結び付けられている必要があります。
初期化(Initialize)
DLは関数のつらなりである層が、横方向にもつらなっているということを説明しましたが、関数の学習の前にすでにある程度の関数に仕上げておいてほしいものです。なぜなら1を入れて100を出力してほしい関数を作るときに、1を入れて1000000を出力される初期関数と1を入れて1000を出力する初期関数では、同じテストデータがあっても最終的な関数の仕上がりに違いがあるからです。
そのため、DeepLeaningではモデル、データセットと匹敵するほどの大事な要素としてこの初期化があげられます。
グレースケール
RGBで表現された画像を無色にすること。つまり、モノクロ画像にすること。
Meanファイル(中間画像)
画像系ではたびたび計算途中でMeanファイルを求められることがあります。この中間ファイルというのはつまり、各画像のピクセル単位の値(画素)を平均した値のことです。例えば真っ白な画像であれば画素平均は RGB=(255,255,255)となります。グレースケールに変換する場合には真っ白な画像はG=255となります。
計算式は全ピクセルの画素の和をピクセル数で割ればいいです。これをデータセット全体で計算し、平均をとります。
ハイパーパラメーター(バッチサイズ、イテレーション、エポック)
データセットが1000こあった場合、これらを一度に入力して学習しようとすると、そのデータ内部のとっても平均的な値に関数が訓練されます。これをさけて、ど平均の関数よりも、汎用的な関数に仕上げたいです。
そこでデータセットをN等分してN回学習を行います。このNをイテレーション回数といいます。
N等分されたデータサイズをバッチサイズといいます。
このバッチサイズに分けたデータをN回学習することで各データセットは一度は使われることになります。
ですが、一度では足りないです。それをさらにEpoch回数繰り返します。この繰り返す回数のことをエポック数とよびます。エポック数はデータセットを関数の更新に何回用いるかを表します。
おわりに
次は具体的な実装や、実装内部で出てくる関数について触れます。