torutkのブログ

ソフトウェア・エンジニアのブログ

Java読書会BOF「Deep Learning Javaプログラミング」を読む会(第2回)を開催して #javareading

Java読書会BOF主催の読書会「Deep Learning Javaプログラミング」を読む会(第2回)を開催しました。

前回第1回では、活性化関数にステップ関数を用いたパーセプトロンと、シグモイド関数を用いたロジスティック回帰の2つのアルゴリズムまで読み進めました。

今回は、活性化関数に多クラス分類を可能とするソフトマックス関数(シグモイド関数の多変量版)を用いた多クラスロジスティック回帰、多層パーセプトロンディープラーニングの制約付きボルツマンマシン、ディープビリーフネット、そしてデノイジング・オートエンコーダの触りまで読み進めました。

今回、1週間ほど前から予習として範囲を読んでいたのですが、予習から数式の壁にぶつかり、理解に努めたけれどなかなかに難しく、中途半端なまま当日を迎えました。

前回読んだ箇所もだいぶ忘れており、尤度関数って何だっけ? 事後確率って何だっけ?といった具合でした。分からないことは参加者同士で議論することである程度は理解が進みますが、それでも今回は厳しいところが多々ありました。一人では、予習をした段階で挫折に近い状態だったので、やはり読書会に取り上げてよかった書籍です。「独力で読めない本は読書会でみんなで読もう」です。

技術編

ソフトマックス関数

多クラスロジスティック回帰の箇所で分類に使用する活性化関数のソフトマックス関数について、この本では、

シグモイド関数の多変量版であるソフトマックス関数

とだけ説明されています。式が以下のように出てきます*1

y_k(\bf{x})=\frac{\exp(\bf{w}_k^T\bf{x}+b_k)}{\sum_{j=1}^{K}\exp(\bf{w}_j^T\bf{x}+b_j)}

ぐぐってみたところ、次が分かりやすかったです。

ソフトマックス関数 | 高校数学の美しい物語

出力は0〜1の範囲、y1 + y2 + ... + yn = 1、xの各成分でxiが大きいときyiがほぼ1で他の成分はほぼ0
という特性があるそうです。

尤度関数

これもピンとこない概念でした。

ぐぐって、ここが分かりやすそうでした。
最尤法によるパラメータ推定の意味と具体例 | 高校数学の美しい物語

こんな調子で、式の理解に時間がかかって(理解しないままのものも多数あり)いました。

多層パーセプトロンバックプロパゲーション

隠れ層を設けて非線形に対応したもの

制約付きボルツマンモデル

ディープラーニングの事前学習(プレトレーニング)で用いられるモデルです。入力と出力を一致させるように誤差関数を取るというのがミソのようです。
この節に出てくる数式は手に余るものがありました。

ディープビリーフネットワーク

最終段にロジスティック回帰を入れたモデルで、プレトレーニング済みであれば多層ニューラルネットワークでも消失問題は起きないということでした。

脳に汗かく時間を過ごしました。

多分、今回の内容を、いわゆるセミナーで説明を受けていたら、ほとんど定着せずに抜けていってしまったと思います。
読書会形式(その場で読んで理解する)では、時間をかけて頭を使って考えることになります。
あとは、帰宅してから自分の手でサンプルプログラムを書いて動かしてみると復習になってよいかなと思います。ただ機械的に写すだけでなく、クラス・メソッド構造をより良いものに変えてみるとか、GUIを付けてみるとかにより、また意味を考え直すことにつながります。

昼食編(0次会)

お昼はいつも参加者揃って近所の中華料理店に行きます。Java読書会BOFでは、ぼっち飯の心配はありません。座り合わせた参加者同士で会話がはずみます。

食事後は珈琲好き有志で近くの珈琲豆焙煎店まで足を運んで持ち帰りでコーヒーを買って会場に戻ります。焙煎店のだけあって美味しいです。また、ついでに豆を買っていく人もいます。昼食後の読書は眠くなりがちですが、コーヒーのおかげで割と眠らずにすみます。

二次会

5時から会場近くの居酒屋で2次会を実施しました。
この時間なら予約なしで十分入れるので、いつものとおりよさそうな店のめぼしだけつけて、お店の前に着いたら人数を数えて入れるかどうか聞いて、大抵はOKとなるのでぞろぞろと店に入ります

復習編

理解の参考になる資料

パーセプトロンから、ロジスティック回帰、勾配、多層ニューラルネットワークのあたりが数式を控え目に文章で解説されている記事を見つけました。
ニューラルネットワークと深層学習

多クラスロジスティック回帰のサンプルプログラム(GUI

読書会から帰った翌日、読んだ範囲のサンプルプログラムを、GUIを付けながら作成開始しました。
まずは多クラスのロジスティック回帰のサンプルプログラムを見ながらJavaFXGUIを付けて一から書き直してみました。

画面を貼っておきます。

サンプルプログラムは、id:torutk:20170114 と合わせて github にアップしました。
https://github.com/torutk/DeepLearningEssentials

*1:はてなダイアリーでも標準機能で数式を出すことができるのですね。内部ではmimetexを使っているとヘルプに書かれていました。ビットマップフォントの画像で数式が表示されるので、ちょっと汚いですね。