見出し画像

【Kerasの引数備忘録】01_kerasの引数はなにを指定しているのか


機械学習触りたてですが「この引数なに?」
ということが多すぎたので調べたものをまとめました。

今回は全結合編です。(全部Denseで作るやつ)

CNNは書くか分かりません。
暇があったら書きます。

最終目標

keras(機械学習)でよくわからず渡してる引数がなんなのか
(とりあえずでも)理解する。

kerasについて説明していますが、keras以外を使っている人でも、
引数の意味が分からないという人は参考になるかもしれません。

例えばレイヤーを追加するときの

model.add(Dense(3))

これの

「Denseって何?」
「何が3?」

っていうのを備忘録がてら解説します。

今回解説する項目はこちら。

・Sequential()
・Dense, Activation
・'sigmoid', 'relu'などよくわからない単語
・compile(optimizer, loss, metrics)の引数

想定読者

「kerasのサンプル動かしたけど自分が何書いてるのかわからん」
といった人向けです。

モデル作成の記述

今回の解説に使用するモデルを作成します。

中間層が1層、ユニット数は入力層、中間層、出力層
それぞれ2ずつのネットワークを作るとき、以下のように書きます。

活性化関数(後述)は中間層ではシグモイド関数を、
出力層ではsoftmaxを使います。

model = Sequantial()
 model.add(Dense(2, input_dim=2))
 model.add(Activation('sigmoid'))
 model.add(Dense(2))
 model.add(Activation('softmax'))
 model.compile(optimizer='adam',
               loss='categorical_crossentropy',
               metrics=['accuracy'])


このモデルは簡易的に表すと下図のようになります。


ここのわからんポイントは

・Sequential
・Dense(2, input_dim=2)
・Activation
・sigmoid?softmax?
・compile(ナンチャラカンチャラ)

です。
順番に解説します。

*解説*

ー Sequential ー

kerasのモデルを作る方法は
今回のSequentialと、もうひとつfunctional APIというのがあります。Sequentialでは、モデルの後ろに層を追加していく形でモデルを作成します。

model=Sequential()でインスタンス化して、
の形式)で層を足していって簡単にモデルが作ることができます。

functional APIは、複数個所からの入出力や分岐など、
複雑なモデルを作成する場合に使います。

だいたいSequentialで事足りることが多いです。

ー Dense ー

全結合層のことです。
図ではそれぞれのユニットが次のユニットのすべてに繋がっています。

このように「前の層の全ユニットの出力」が
「次の層の全ユニットの入力」となるのが全結合層です。

引数にはその層のユニット数を渡します。
入力層でDenseを追加した場合はinput_dimで入力パラメータの数を渡します。

今回の例では入力が2つなので「input_dim=2」です。
例えば入力が[年齢, 身長, 体重]の3つなら「input_dim=3」と指定します。

ー Activatio(sigmoid, relu) ー

活性化関数です。
例で書いた'sigmoid', 'softmax'の他には
'linear', 'softplus', 'relu', 'softmax'などがあります。
(softmaxはあとで個別に説明します)

基本的には「前の層からの出力をどのように変換するか」という解釈でいいと思います。

それぞれグラフの形が違っていて、
活性化関数によってネットワーク内での情報の伝わり方が変わってきます。

'relu'だとうまくいかなかったけど'sigmoid'だとうまくいくといったことがあったりします。
'linear'と'relu'がわかりやすいので少し解説します。

・linear
f(x)=xです。
つまり、入力(+バイアス値)がそのまま出力になります。
・relu
0以下では0を出力し、0より大きい時はlinearと同じ挙動になります。


大事なのは「式を覚える」というよりも
「活性化関数によって結果が変わってくる」ということだと思います。

ー softmax ー

softmaxも活性化関数ですが、少し特殊な使い方をします。
活性化関数は、ユニットごとに個別に入力から出力を決めるのが基本ですが
softmaxは「全ユニットからの出力を、合計が1になるようにする」というものです。

例を挙げると
3ユニットからの出力[1, 2, 2]があった時に
これをsoftmaxに入力すると[0.2, 0.4, 0.4]というように出力してくれます。

だいたい分類モデルの最後の層に加えることが多いと思います。
「入力データからAかBかCか」という分類の問題でどれくらいの割合で
予想されているか出力したいときに手軽にできます。

機械学習は、結果の出力に大きい値やマイナスの値を出すことがあります。
これらの値をsoftmax関数に入力すると、出力の合計が1になるように出力してくれます。

softmax関数は分類モデルの最後の層に加えることが多いと思います。
「入力データから、AかBかCか判別」という分類の問題で
どれくらいの割合で予想されているか出力したいときに手軽にできます。

ー compile ー

モデルを作成した後、そのモデルがどのように学習をするかを決めます。

引数の意味はそれぞれ

optimizer:最適化関数
loss:損失関数(目的関数)
metrics:評価関数

です。

・optimizer(最適化関数)
教師データの値から「どのように学習するか」を決めます。
'SGD', 'adam', 'adadelta'などいろいろ種類があります。
ここでは、わかりやすいSGDだけ解説します。
SGDは「Stochastic Gradient Descent」の略で日本語では
「確率的勾配降下法」といいます。

機械学習は、モデルが入力の値から予想した結果が
どれくらい間違っているかの"間違い度"を小さくしていくことで学習します。

SGDでは、この"間違い度"のグラフの傾きを求め、
その傾きから、値が小さくなる方向へ学習を進めていきます。

傾き(勾配)を下る(降下)ので勾配降下法です。

最適化関数も活性化関数と同じようにいろいろな種類あり、
adamもその中の一つです。

他と比べて優秀、というものはありますが、
もちろん学習対象によって結果は変わってきます。

・loss(損失関数, 目的関数)
調べてみると「目的関数の中に損失関数という種類のものがある」ということらしいです。

「どこの国か分類する」「どの動物か予想」など
他クラス分類は'categorical_crossentropy'を指定します。

「立地、敷地面積、部屋数から家賃を予想」
「日にち、気温、湿度から売り上げを予想」など

数値を予想する回帰では'mean_square_error'を指定します。
これにもいろいろ種類がありますが、学習したい内容によって使い分けます。

・metrics(評価関数)

学習に影響はしません。
分類の時には'acuracy'、回帰の時には'mae'など、
これにもいろいろ種類があり学習したい内容に合った評価関数を決定します。
accuracyは正解率、maeはMean Absolute Errorの略で日本語で「平均絶対誤差」といいます。
例ではmetrics='accuracy'と指定してますがmetrics='acc'と略すこともできます。

・accuracy

分類問題で、ニューラルネットワークが予想した結果が、どれくらい正解しているかの正解率を出します。
1に近いほどよく、1だと全部正解(的中率100%)という意味になります。

・mae(平均絶対誤差)

回帰問題で、ニューラルネットワークが予想した値が、正解の値とどれくらい離れているかを出します。
0に近いほどよく、0だと誤差なしでピタリと言い当てているという意味になります。


評価関数にもいろいろ種類がありますが、指定してもしなくても
学習そのものに影響はありません。

あくまで「学習中にどれくらい正解しているか」を見るためのものです。
また、metrics=['acc', 'mae']とすることで複数の評価関数を指定できます。

おわりに

機械学習のモデル作成では

・ユニット数をいくつにするか
・ネットワークは何層にするか
・活性化関数、最適化関数は何にするか

など、決めなければいけないことがたくさんあります。
さらに活性化関数、最適化関数も種類があり、
どれにすればいいのか...という感じです。

調べてみた内容と、触ってみた感じの完全主観になってしまいますが
各関数の特性はわかっていた方が良いにしても、
それが学習にどう影響するのかは、自分の中に経験則を作っていくしかないと思います。

なにせ学習がどう進んでいるかは専門の方でもわからないらしいので...

特性などは調べれば一覧やグラフも出てきます。
式を調べてみても面白いです。

いろいろ試してみて、
「こういう時はこれを使うとうまくいくんだ」
を探すのが大事だと思いました。

以上、イワタでした!

◆───-- - - - 

ラフアンドレディでの採用はこちら ↓ ↓ ↓

RECRUIT

エン転職

目黒オフィスでお待ちしています。

SESでの開発、受託での社内開発。ラフアンドレディでは、みんなのびのびと仕事をしています!エンジニアが長く幸せに活躍できる環境で、仲間と楽しく働いてみませんか?

◆───-- - - - 

この記事が気に入ったらサポートをしてみませんか?