交差エントロピー誤差が-∞になるのを防ぐ


機械学習の本を色々と読んでいるのですが、ふと交差エントロピーの数式を見て誤差が-∞になるじゃん、と今更気づいたので、実際に実装上どのようにして回避しているのかを調べました。

交差エントロピーは以下の式で表されます。

$$E=-\sum_{k}t_k\log {y_k}$$

結論から言うと、下記のサイトに答えはありました。どうやら、小さい数値を足しておくことでlog(0)を誤差に足してしまうことを防ぐようです。

「ゼロから作るDeep Leaning」4章:ニューラルネットワークの学習

つまりは以下のコードを誤差関数として利用するということでした。

def numerical_diff(f, x):
    h = 1e-4 # 0.0001
    return (f(x+h) - f(x-h)) / (2*h)

以上です。理論と実装の狭間を少しずつ埋めていきたい。

A Neural Network Playground を使ってみた

Tensorflow グループが A Neural Network Playground というブラウザ上でDeep Neural Networkの動きを可視化するツールを出しています。少しいじってみたので、参考までに書きます。

提供されているデータセットは4種。ノイズパラメータをいじることで、複雑なデータにすることもできます。

UIは直感的なので、色々といじってみると分かるかと思いますが、入力のフィーチャーを選択して、隠れ層の段数や個数を調整して、活性化関数や正則化の方法を選択するなどして左上の再生ボタンを押すとアニメーションでNNがどのようにしてデータを分類しているのかが分かります。

活性化関数を変えてみると、収束までにかかるエポック数が変化するのが分かります。例えばSigmoid関数を使うと収束は遅くなり、最近はSigmoidがあまり使われないというのも納得できるようになります。

その他にも、線形分離可能でないデータ(例えば1番目のデータ)は最初のフィーチャーの選択によっては正しく分類できない場合があることが分かります。(フィーチャーとしてX11とX22を選ぶと円形で分離できるようになりました)

 

何となくDeep Learningがどういうものか分かってきた人が、実際に動かしてイメージをつかむのに良いツールであると思いました。

データサイエンスと機械学習を学ぶのに最適なMOOC

HackerNewsに上がっていた、データサイエンスと機械学習を学ぶのに最適なMOOCというのを抜粋してみます。

https://news.ycombinator.com/item?id=15073441

個人的には、このリストの上から進めていくのが初心者には良いのかなと思います。

Andrew Ng: Machine Learning

https://www.coursera.org/course/ml

ご存知、Andrew Ng先生の機械学習コース。私も実際に修了しましたが、実用例が多く紹介されており、数学的に難しくないので初心者が始めるのに最適だと思います。

Hasti/Tivshirani: Elements of Statical Learning

http://statweb.stanford.edu/~tibs/ElemStatLearn/

これは、私は書籍の方を読みました。数式が結構出てきますが、内容はそれほど高度ではないです。動画と合わせて本を読んでいくことで理解が進みやすいと思います。

Yaser Abu-Mostafa: Learning From Data

https://www.edx.org/course/caltechx/caltechx-cs1156x-learning-data-1120

こちらも私は本を読み終えています。上記二つを終えていれば概念的に難しい内容はそれほどないと思います。数学的にしっかりと、訓練誤差の話などがコンパクトにまとめられているので、こちらも本と合わせて動画を見ることで内容理解が深まるかと思います。

Geoff Hinton: Neural Nets for Machine Learning

https://www.coursera.org/course/neuralnets

私はこのコースを修了しましたが、はっきり言って難しかったです。後半はあまりよく理解できませんでした。動画も、Andrew Ng先生のようなものを期待していたのですが、スライドをただ読んでいく感じで理解するのが難しい部分がかなりありました。

Andrew Ng先生がCourseraで新しくDeepLearningのコースが始まるようなので、このコースよりはそちらを受けてみるのが良いかもしれません。

Hugo Larochelle: Neural Net lectures

YouTubeに上がっている動画コース。見ていないのであまりコメントできませんがNeuralNetsとDeepLearningにフォーカスしている内容のようです。

Daphne Koller: Probabilistic Graphical Models

https://www.coursera.org/course/pgm

このコースも受けてみたいなと思いつつ受けていません。コメントによると他の授業には無い内容が多いが、結構難しいみたいです。

Sony製 Deep Learning Framework: Neural Network Consoleを試してみた

ソニーがGUIでDeep Learningアプリケーションを作成するツールを公開しました。

ソニー、ニューラルネットをGUIで設計できる深層学習の統合開発ツールを無償公開

 

ネットワークを構築する部分がGUIで書けるようで、どれくらい便利なのかを試してみることにしました。
個人的にはKerasやTensorflowを使ったとしても、ネットワーク構築の部分は積み木のような感覚なのでそれほど難しいとは思わないので、GUIで出来るというのがどれほどメリットがあるのか懐疑的でした。

実際に試してみると、直感的に使えるので試行錯誤の段階には意外と便利かもしれないと感じました。

ダウンロード

以下のページからダウンロードをします。まずはメールアドレスを登録すると、ダウンロード先のリンクが送られてきます。

https://dl.sony.com/

ファイルサイズは900MBほどあります。ちなみに現時点ではWindowsのみ対応しています。

ディレクトリ構造

ディレクトリ構造は以下の通りです。

実行

neural_network_console.exeをダブルクリックで実行できる。

最初にライセンス規約が表示されるので、同意する。

すると以下のような画面が表示される。色々とサンプルが用意されているようだ。

 

とりあえず、2番目のMNISTサンプル(手書き数字認識)をクリックしてみるとMNISTデータのダウンロードが始まります。

ダウンロードが終わるとサンプルのネットワークが表示されます。このサンプルは画像が9かどうかを判定するサンプルのようです。

直感的に分かりやすい。ConvolutionとMaxPoolingを2回やって、Affine変換を2回やって、最後はBinaryCrossEntropyで評価ね、と分かります。

F5を押すとトレーニングが始まる。トレーニング中はエポックごとに評価関数の推移がグラフで表示される。TrainingErrorとValidationErrorが表示されるので、テストセットの分離は勝手にやってくれているのだろうか?

 

せっかくなので、ネットワークを少しいじってみようと思います。色々と試してみましたが、In/Outの行列サイズが表示されるのが便利だと感じました。

ここでは単純に活性化関数をtanhからReLUにしてみました。

左側のツールボックスからブロックを選択して繋ぎかえるだけなので、直感的に操作できます。

(ちなみに畳み込み層を1層追加しようとしたのですが、デフォルトのフィルターサイズが5×5だったためサイズが合わないという警告がグラフ上に出て初心者には分かりやすいと思いました)

過去の試行錯誤結果は保存されているため、色々なネットワークで試して一番良いものを使うことが出来ます。

Validation結果が一番良かったものを使って、テストデータを動かしてみます。F6でテストデータの評価が始まります。

各テスト画像に対しての結果とConfusion Matrixが作成されます。

Presicision, Recall, F値が表示されて分かりやすいです。

結論

ドキュメントを読まなくても結構直感的に使えて、機械学習初心者に向いているのではないかと感じました。

GUI部分もよく出来ていてストレスを感じることなく使えます。ネットワーク作成に使う要素も、一通りのものが揃っているので手軽にやりたいことを始めるのには良いのでないかと思います。

 

現実的にはユーザー数の規模では、世界的に見たら既存のフレームワークが圧倒している状況だと思います。

今後、他のDeep LearningフレームワークでもGUIでネットワーク構築を行うツールが出てくるかと思うので、差別化できる部分を実装して頑張って欲しいです。

データサイエンス関係のpodcastをまとめてみた

最近盛り上がりを見せるデータサイエンス界隈。
様々なpodcastが存在しているが、あまり言及されることが無いようなのでここでまとめておく。
割と更新頻度が高いものを中心に選んだつもりなので、これらを購読すれば聞くものが無いという状態にはなかなかならないかと思う。

言語は英語なので、データサイエンスの最新動向を知るのとともに英語の勉強にも使えるかと思う。
日本の機械学習エンジニアと研究者が世界と戦うための一助になれば幸いです。

  • Super Data Science
番組ホストのKirill Eremenkoが毎週インタビュー形式のメインエピソードと、Tips的なショートエピソードを配信している。
英語は聞きやすいので、英語に自信が無い人はまずはショートエピソードから入ってみるのも良いかもしれない。
  • The AI Podcast

https://blogs.nvidia.com/ai-podcast/
 ご存知NVIDIAの提供で行われるPodcast。
Andrew NgとかIan Goodfellowなどのスーパースターがゲストで登場していたりしているので、それだけでも聞く価値はあるかと思う。

  • Linear Digressions

http://lineardigressions.com/
機械学習に関連するトピックを実例をもとに紹介する。
ディスカッション形式のポッドキャスト。

  • This Week in Machine Learning

 https://twimlai.com/

毎週、機械学習に関連する研究者や企業関係者へのインタビュー形式で配信されるポッドキャスト。
実際の応用事例が豊富に聞ける。
  • O’Reilly Data Show
ご存知O’Reillyの提供で行われるPodcast。
企業の研究者などへのインタビュー形式。
最新のエピソードではFacebookの研究者へのインタビューが行われた。
 
  • Not So Standard Deviation

 https://soundcloud.com/nssd-podcast

2人のホストが機械学習や統計に関連したトピックを話す形式のポッドキャスト。
 
  • Data Skeptic
技術的なトピックについて話し合うポッドキャスト。
MINIシリーズという形式の回は20分程度なので聞きやすい。

Character-level Convolutional Networks for Text Classification を読んだ

Character-level Convolutional Networks for Text Classification を読んだ。
テキストの分類を文字単位のCNNで行うと、大規模なデータセットでは従来の手法よりも良い結果が得られたという論文。

テキスト関連の処理は形態素単位でのRNNを使うのがセオリーなのだと思っていたが、文字単位でCNNを行った際に良い結果が出たというのは驚き。
論文中にも書かれていたが、テキストというのは文字単位の信号処理ととらえることが出来るのかもしれない。