def 小児科医():

かけだし小児科医が仕事の合間にプログラミングを勉強するブログです。

ディープラーニングに挑戦してみる話。

人工知能プログラミングのための数学がわかる本」もついに最終章

 

 

最後は深層学習に挑戦。

手書きの数字を認識するモデルを作る。

今回は基本的(らしい)deep neural network;DNNを使うとのこと。

データセットは「MNIST」というものを使う。

なんか手書きの数字とラベルとして正解の数字がくっついてるデータセット

AIの基本中の基本みたいなやつらしい。

んでこの正解の数字がついているのを正解ラベルと言って、正解ラベルを使うのを「教師あり学習」というらしい。まぁなんか今までもそういう話は聞いていたのでなんとなくわかる。

DNNには入力相と出力相がありその間に中間層が2つ以上あるものをいうらしい。

こんな感じ?急にバカっぽくなったな。

んでこの?の部分がノードと言われるところで、ある条件下で活性化するようにすることで、なんやかんやあって(もうついて行けていない)出力相に一定の信号を送る、という感じらしい。

実際にやることは今までと似ていて、入力値xとして出力y、重みをw、バイアスをbとして

y =wx+b

今までと違うところは、この式に活性化関数σをなんやかんやすることである。

 

と思ったのだがこの活性化関数のうち1種類は

ς(x)=1/(1+exp(-x))

ロジステック回帰のあれじゃん。

 

もう一つ有名なのはReLU関数

φ(x)=max(0,x)={0(x<=0), x(x>0)}

xが0以下で0 0より大きければφ(x)=xとなる関数

バカそうな絵で書くと

すごい、すごくバカそうだ。

 

こういう線形で表せられないような関数を非線形系という。

かっこいいよね、非線形系っていう響き。よくわかってないけど。

これがAIのいわゆる「人間のような知能」に関係するんですね。

 

一つ一つのノードで行われることは、今までの重みづけと同じで

y=w1x1+w2x2+w3x3+...+b

なので入力値xの列ベクトルX、重み行列W、前相の出力値の列ベクトルa、バイアスbとして

X=Wa+b

各層の入力値→出力値では活性化関数σを受けるので

a=σ(x)

これを繰り返していくということか。

 

最後の出力層では活性化関数ではなくsoftmax関数という関数で非線形変換されるらしい。

softmax関数とは

n次元の実数ベクトルxに対して返り値yベクトルを返す関数で

yi=exp(xi)/(exp(x1)+exp(x2)+exp(x3)+,,,,exp(xn))

というやつらしい。もうよく分からんけど覚えとこう。

なんかこうすると結果が確率になるらしい。

つまり、「この数字が5である確率は〜%だ!」となる感じ。

 

 

なるほどなぁ。

エンジニアがやるのはこのノードの数を幾つにするか、中間層を何層にするか、ということらしい。はぁ〜。

 

今回のお手本コードでは、

中間層を3層としてそれぞれ256、128、32ノードとしているみたいです。

活性化関数はReLU関数、出力はsoftmax関数で行なったようです。

 

ここまででなんかできるようになった気がしたけど、まだ重みづけのところとかできてないことに気づいた。

 

続きはまた次回。