2013-08-25

ニューラルネットのシグモイド関数と tanh 関数の関係

ニューラルネットの標準シグモイド関数と tanh 関数の関係は次のようになります。

標準シグモイド関数は、
\[ sigm(x) = \frac{1}{1 + e^{-x}} \]
です。

tanh 関数の別表現は、
\[ \tanh(x) = -1 + \frac{2}{1 + e^{-2x}} \]
となります。

よって、
\[ \tanh(x) = -1 + 2sigm(2x) \]
となります。

つまり、標準シグモイド関数の入力値を2倍にして、出力値の値域を (-1, 1) に引き伸ばした感じです。

関連
参考

2013-08-17

Eclipse で Android 2.3.3 のソースを表示する方法

Eclipse で Android 2.3.3 のライブラリのソースコードを表示させようとしたのですが、Android SDK Manager の「Android 2.3.3 (API 10)」にはソースコードがなくて、ダウンロードできません。

下記のURLから Eclipse のプラグインをインストールして、ライブラリのソースコードを表示できるようになりました。
adt-addons
Additional Eclipse plugins for Android
http://code.google.com/p/adt-addons/
詳細は上記のサイトを読んでもらうとして、以下に簡単に説明します。

まず、Eclipse でプラグインをインストールする要領で、
下記の Location から「Android SDK Installer」をインストールします。
http://adt-addons.googlecode.com/svn/trunk/installer/com.android.ide.eclipse.installer.update/

Eclipse を再起動すると「Android SDK Installer」のダイアログが表示されるとありますが、私の環境では表示されませんでした。

次に、下記の Location から「Android Sources」をインストールします。
http://adt-addons.googlecode.com/svn/trunk/source/com.android.ide.eclipse.source.update/

これで Android 2.3.3 のライブラリでソースコードを表示できるようになりました。

2013-08-13

OpenCL 雑感

Deep Learning を GPU で動かすと CPU よりも速くなるというのを見かけたので、次のグラボを買ってみました。あと、CPU 内蔵ではない GPU で OpenCL も試したかったので。

ASUS HD7790-DC2OC-1GD5 ¥16,640

このグラボのスペックは次のとおりです。

GPU: AMD ATI RADEON HD 7790 (1075MHz)
メモリ: GDDR5 1GB (6400MHz)

こちらの性能表を見ると、この GPU は 1792 GFLOPS、CPU は Wikipedia から適当に推測すると 80 GFLOPS くらいでしょうか。

20倍?少なく見ても10倍?なんて淡い期待を抱きつつ、OpenCL のコードを組んでみました。

完成したプログラムを走らせてみると…あれ?あんまり速くなってない。むしろ、CPU から GPU へのデータ転送時間も含めると遅くなるかも、という結果に。しかも、C言語で組まないといけない、メモリの使用制限が厳しい等、OpenCL 対応するのが面倒くさい。

AMD の OpenCL ガイドを読んでみたり、GPU 関連の論文を少し読んでみたのですが、自分の計算処理では期待したほどの効果は得られませんでした。

まあ、GPU で爆速なんて謳っているのは、5~10万円くらいのグラボを2~3枚使ってますしね。

演算量が多ければ安い GPU でもそれなりの効果が得られるのかも知れませんが、作るコストや作り直すコストを考えると普通に CPU でいいかなと思いました。

2013-03-20

C++11

C++11 で auto キーワードやメモリ管理系のクラスが追加されていたのを次のブログで知った。
C++11 スマートポインタの話 - ここは匣
http://fimbul.hateblo.jp/entry/2013/03/20/020349
auto_ptr が deprecated になっていたなんて…。
久々に C++ をさわってみよう。

2012-11-17

Eclipse のフォントに Consolas を指定した場合に日本語の文字が小さい

Eclipse のフォントに Consolas を指定した場合に日本語の文字が小さく表示された。
フォントリンクだけで以前は特に問題なかったような気もするが…。

対処法をググって、次のページを見つけた。ちょうどよい大きさで表示されるようになった。
[Eclipse] Eclipse: Consolas + メイリオ の ClearType 表示
http://monado.dtiblog.com/blog-entry-128.html

レジストリエディタで以下のパスを開く。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink

Microsoft Sans Serif の項目を開き、1行目に次のフォントリンク指定を追加する。

meiryo.ttc,Meiryo,128,72

再起動する。
私が試した環境は Windows 7 と Eclipse 4.2.1。

2012-11-10

ニューラルネットの活性化関数 その1

ニューラルネットの活性化関数 (activation function) としては次のようなものがある。
  1. 標準シグモイド関数 (standard sigmoid function):   y = 1 / (1 + exp(-x))   【グラフ】
  2. 双曲線正接関数:   y = tanh(x)   【グラフ】
  3. abs を使った関数:   y = x / (1 + abs(x))   【グラフ】
それぞれの導関数 (derivative) は次のとおり。
  1. y * (1 - y)
  2. 1 - y * y
  3. 1 / pow(1 + abs(x), 2) または pow(1 - abs(y), 2)
上記の活性化関数とその導関数は次の論文から引用した。
A Better Activation Function for Artificial Neural Networks, David Elliott, 1993
http://drum.lib.umd.edu/handle/1903/5355
次のサイトによると、活性化関数の計算の速さは (3) の abs を使った関数の方が (1) の標準シグモイド関数よりも2倍以上速いらしい。
※ 2004年の結果なので、最近の CPU では異なるかも知れない。
Neural Network Code Optimizations
http://sharpneat.sourceforge.net/network_optimization.html
その他、参考にしたサイト。
Backpropagator's Review
http://www.dontveter.com/bpr/activate.html

[追記]

[関連記事]

2012-11-06

C++ のサイト

いつの間にか C++ のサイトができていた。
Standard C++
http://isocpp.org/
以下、関連など。
Twitter @isocpp
https://twitter.com/isocpp

Bjarne Stroustrup's Homepage
http://www.stroustrup.com/

2012-11-05

ByteBuffer.allocateDirect で確保したメモリを解放する方法

ByteBuffer.allocateDirect で確保したヒープ外のメモリを解放するには、オブジェクトの参照を全て外してから GC をする必要がある。別の方法としては、下記のページのように sun.misc.Cleaner を呼び出せば解放することができるようだ。
java - Examples of forcing freeing of native memory direct ByteBuffer has allocated, using sun.misc.Unsafe? - Stack Overflow
http://stackoverflow.com/questions/8462200/examples-of-forcing-freeing-of-native-memory-direct-bytebuffer-has-allocated-us
おそらく、Oracle (Sun) の Java のみ有効。

ググってたら、次のようなユーティリティのソースを見つけた。
ByteBufferUtil xref
http://static.netty.io/3.5/xref/org/jboss/netty/util/internal/ByteBufferUtil.html

2012-10-22

Visual Studio の NuGet が便利

Visual Studio Express 2012 for Windows Desktop で遊んでいるのですが、NuGet でライブラリが組み込めるようになっていて、いつの間にか便利になっていました。Java で言うと Maven みたいなものです。

CodePlex から圧縮書庫の操作ライブラリを探してきて、NuGet でそのパッケージを追加すれば、簡単に解凍プログラムが作れます。

2012-10-17

3次ベジェ曲線を高速に計算して描画する方法

ずっと昔に読んだ、3次ベジェ曲線 (Cubic Bezier curve) を前進差分で高速に計算する方法を解説した記事が復活していたので、メモ。
Forward Difference Calculation of Bezier Curves | Dr Dobb's
http://www.drdobbs.com/forward-difference-calculation-of-bezier/184403417
Figure とか Listing とかのリンクが切れているが、ページ下の方の「1 2 3 4 5 Next」から見ることができる。

2013-08-17 追記
リンク先の生存を確認。http://www.drdobbs.com/ はしばしばアクセスできなくなるが、その場合は時間をおいて再度アクセスするとよい。

2013-10-25 追記
下記のページにも Dr Dobb's と同じ記事が存在する。http://www.drdobbs.com/ のサイトが見られない場合はこちらを参照。
November 1997/Forward Difference Calculation of Bezier Curves
http://collaboration.cmc.ec.gc.ca/science/rpn/biblio/ddj/Website/articles/CUJ/1997/9711/bartley/bartley.htm