2016-02-14

Softmax 関数の Backpropagation

§ フォワード・パス (Forward pass)

Softmax 関数への入力が x のとき、出力 y は、 \[ y_j = \frac{\exp(x_j)}{\sum_k{\exp(x_k)}} \] である。

また、exp 関数でのオーバーフローを回避するため、
\[ \frac{\exp(x_j)}{\sum_k{\exp(x_k)}} = \frac{C \exp(x_j)}{C \sum_k{\exp(x_k)}} = \frac{\exp(x_j + \log{C})}{\sum_k{\exp(x_k + \log{C})}} \] を利用して、 \[ \log{C} = -\max_j x_j \] と置き、計算する [1]。

§ 導関数 (Derivatives)

Softmax の導関数は、
i = j のとき、 \[ \frac{\partial y_j}{\partial x_i} = y_i(1 - y_i) = y_i - y_i y_j \] i ≠ j のとき、 \[ \frac{\partial y_j}{\partial x_i} = -y_i y_j \] である [2]。

§ バックワード・パス (Backward pass)

y の誤差が δy のとき、x の誤差 δx は、
\[ \delta x_i = \sum_k{ \delta y_k \frac{\partial y_k}{\partial x_i} } = \delta y_i y_i - y_i \sum_k{ \delta y_k y_k } \] である [3][4]。

§ 参考文献

  1. Softmax classifier - CS231n Convolutional Neural Networks for Visual Recognition
    http://cs231n.github.io/linear-classify/#softmax
    Softmax 関数のフォワード・パスの計算について。
  2. linear algebra - Derivative of Softmax loss function - Mathematics Stack Exchange
    http://math.stackexchange.com/questions/945871/derivative-of-softmax-loss-function
    Softmax 関数の導関数について。
  3. Backpropagation, Intuitions - CS231n Convolutional Neural Networks for Visual Recognition
    http://cs231n.github.io/optimization-2/
    バックプロパゲーションについて。
  4. chainer.functions.activation.softmax — Chainer 1.6.1 documentation
    https://chainer.readthedocs.org/en/stable/_modules/chainer/functions/activation/softmax.html
    Python 言語での Softmax 関数の実装。

2016-02-11

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

次のページに活性化関数の式と導関数の一覧があるので、紹介する。
Activation function - Wikipedia, the free encyclopedia
https://en.wikipedia.org/wiki/Activation_function#Comparison_of_activation_functions

[関連記事]

2015-04-01

Visual C++ でユーザ定義マクロを追加する方法

忘れてしまっていたので、メモ。

Visual C++ 2013 英語環境の場合。

メニューの [View]-[Property Manager] を選択する。Property Manager が開く。

右クリックのコンテキスト メニューから [Add New Project Property Sheet...] を選択して、新規プロパティ シートを追加する。

追加したプロパティ シートをダブルクリックする。

画面左の [Common Properties]-[User Macros] を選択して、[Add Macro] ボタンを押してマクロを追加する。

[参考]

My Private Adversaria: VisualC++ のマクロ変数を追加する方法:
http://myprivateadversaria.seesaa.net/article/118865951.html

Create user-defined environment variables (macros) - pinyotae:
https://sites.google.com/site/pinyotae/Home/visual-studio-visual-c/create-user-defined-environment-variables-macros

2015-03-03

Visual Studio 2013 の git でリモート設定を削除する方法

Visual Studio 2013 の git でリモート設定を間違ってしまった場合の削除方法は下記のとおりです。

[Team Explorer] でホームアイコンを押して、[Unsunced Commits] を選択します。
[Actions]-[Open Command Prompt] を押します。
コマンドプロンプトで、「git remote -v」と入力して [Enter] キーを押します。
「origin ...」と表示されるのを確認します。
「git remote remove origin」と入力して [Enter] キーを押します。
コマンドプロンプトを閉じます。
[Unsunced Commits] の画面に [Publish to Remote Repository] が再び表示されます。

2015-02-18

エフェメラルポート

TCP/IP でサーバに接続しようとすると、パケットを受信するためにローカル側にポートが自動で割り当てられます。
Windows では 1025~5000 番の範囲のポートが自動的に割り当てられると記憶していたのですが、それは昔の話で、Windows Vista あたりからは IANA が提唱する 49152~65535 番の範囲のポートが使われているようです。
エフェメラルポート - Wikipedia
http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%95%E3%82%A7%E3%83%A1%E3%83%A9%E3%83%AB%E3%83%9D%E3%83%BC%E3%83%88

2015-02-14

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

記事「ニューラルネットの活性化関数 その1」の閲覧数がそこそこあるので、近年の活性化関数も記しておきます。

(1) Rectified linear unit (ReLU)
(2) Maxout activation functions (Maxout)

以下、簡単に解説しますが、不正確な表現も含みますので、正確な解釈は論文を読んでください。

(1) Rectified linear unit (ReLU) について

活性化関数は、
f(x) = max(0, x)
で、x > 0 の時は f(x) = x、x <= 0 の時は f(x) = 0 となります。
導関数は、
x > 0 の時は f'(x) = 1
です。x <= 0 の時は f'(x) = 0 となるので、結合荷重は変化しません。

こんな簡単な活性化関数で大丈夫なのかと思われるかもしれませんが、隠れ層のユニットの数がそこそこあれば、問題ないようです。

詳しくは次の Wikipedia のページを参照してください。
Rectifier (neural networks) - Wikipedia, the free encyclopedia
http://en.wikipedia.org/wiki/Rectifier_(neural_networks)
(2) Maxout activation functions (Maxout) について

活性化関数は、複数の異なる傾きと切片の直線関数 f(x) = ax + b の最大値 (max) を求めて凸関数を作り、凸関数と凹関数(=凸関数の上下が逆)を組み合わせて、様々な関数を近似するというものです。

詳しくは次の論文を参照してください。
[1302.4389] Maxout Networks
http://arxiv.org/abs/1302.4389

[関連記事]

2015-02-13

Java の InterruptedException の扱い方

Java の InterruptedException の扱い方は、IBM の developerWorks のサイトにある記事が参考になります。
Java theory and practice: Dealing with InterruptedException
http://www.ibm.com/developerworks/library/j-jtp05236/

2013-12-10

Visual C++ でバイトの順序を逆にする関数

Visual C++ でバイトの順序を逆にする関数
_byteswap_uint64, _byteswap_ulong, _byteswap_ushort (CRT) http://msdn.microsoft.com/en-us/library/a3140177%28v=vs.71%29.aspx

がランタイムに存在していたのを下記のサイトの記事で知りました。
melancholic afternoon
http://homepage1.nifty.com/herumi/diary/1312.html#6

2013-11-13

ニューラルネットによる正規分布の学習

ニューラルネットによる正規分布の学習のビデオです。
以前 YouTube で見つけたのを思い出したので、紹介しておきます。

artificial neural network / normal distribution
Artificial neural network learns normal distribution using back propagation

2013-10-23

Android と OpenCL と RenderScript

Andoid 4.3 では OpenCL が使えなくなっているそうです。
代わりに RenderScript というものがあるようです。
RenderScript | Android Developers
http://developer.android.com/guide/topics/renderscript/compute.html
ざっと見た感じでは、float4 型はありましたが、さすがに float16 型はないようです。

モバイル端末でGPUを使って演算できると、自宅で省電力な計算クラスタの構築に使えるので、発展を期待したいです。