2016年3月8日

[DL]活性化関数はどうやって選ぶのだろう? (1)

CNTKでもそうだが、活性化関数はいくつかから選択することが多い。
じゃあ、どの活性化関数がよいのか?
なにを基準に選べばよいのだろう。

という疑問があるので、調べてみよう。
すぐにわかるわけでもないので、検索してあちこち見ていこう。


今日はこちら。

ニューラルネットワークが任意の関数を表現できることの視覚的証明
直接の解説ではないのだが、内容が面白かったのでリンクを載せる。
学習データから、ほどほどにそれらしい結果を出せるニューラルネットワークを構築できると言うことは、何だかわからない結果から近似式を導き出せるのと同じだ、という話。
何か、FFTとかと似てますな。
「画像をゴッホ風にする」みたいなのもあったけど、突き詰めればそういう意味なんだ、と感心したのでした。

シグモイド関数についても書かれていますが、普遍性とか、そういう話のようです。
うぅ、難しい。。
さらっとそこだけ読んだら、シグモイド関数を合計してもどういう値になるか想像しにくいけど、ステップ関数だったらわかりやすいよね、と言ってるように思った。
思うというか、そう書いてあるところだけ読んだだけ。。。
ステップ関数というのは、たぶんある値以上は入力と同じ値になってる関数のことじゃなかろうか。
掛ける値がある値までは0、ある値から1だからステップ関数なのだと思う。

下の方は・・・やはり理解が追いつかなかった。
いいのだ、それで。
また理解できるようになったら、戻ってくればいい。

2016年3月6日

久しぶりにArduino Unoを動かしたが、いろいろ忘れている

忘れているね。

https://sites.google.com/site/hiro99ma/nfc/experiment/arduino-nfc/rc-s620-s-library

 

接続

image

Arduino Unoの画像はこちらからもらった
https://www.arduino.cc/en/Tutorial/EEPROMRead

 

何度やってもうまくPCから焼けなかったのだが、UARTが共通になっているから、RC-S620/Sと一度外さないといかんのだった。

 

サンプルアプリでは、500msec周期でポーリングしているのだが、期待としては対象カードを検知するとボード上のLEDが点灯したままになってほしいのだ。
しかし、点滅してしまう。
たぶんだが、周期が短すぎるのだ。
それか、明示的にRFをOFFにするとか、そんな対応がいる気がしている。
PC/SCでやろうとしたときも、うまくいかなくて2秒周期くらいに変更したのだ。

[ai]『深層学習』の8章に挫折してCNTKを試す (8) - 最終回

cntkファイルのパラメータを変更して、比較してみよう。
比較する値は、ErrorPrediction/Sampleだ。

layerTypes

  • Sigmoid
    • 0.04145937
  • Tanh
    • 0.049751244
  • RectifiedLinear
    • 0.063018242

何回かやると結果が多少違うのかと思ったが、そうでもないようだ。
乱数的なものがあまりないのか?

ともかく、Sigmoidが一番結果がよいようだ。
サンプル数が603個なので、Sigmoidは25、Tanhは30、RectifiedLinearは38間違った分類を行ったということでよいのかな。
トレーニングデータは10000。
多いのか少ないのかわからん。

 

layerSizes

では、Sigmoidのまま、中間層を増やしてみよう。

  • 2 hidden
    • 0.04145937
  • 1 hidden
    • 0.04145937
  • 3 hidden
    • 0.3946932
  • 5 hidden
    • 0.46766169

おっ、と思ったが、桁が1つ上がってる。
確か、多層にすると発散するとか何とかってのが以前の問題点だったはずだから、増やせばいいというものでも無いのだろう。

 

minibatchSize

次はなんだ?
ミニバッチのサイズとかか。

  • 25
    • 0.04145937
  • 10
    • 0.04145937
  • 40
    • 0.036484245
  • 50
    • 0.039800995

75にしたら、SymFromAddr errorが発生してしまった。
WindowsのくせにUTF-8出力かよ・・・。

ミニバッチのサイズは、特に決め方が無いらしい。
大きいと確率的勾配降下法の良さが損なわれるらしい。

 

learningRatesPerMB

ミニバッチ当たりの学習比率か。

  • 0.5:0.2*20:0.1
    • 0.04145937
  • 0.3:0.2*20:0.1
    • 0.044776119
  • 0.8:0.2*20:0.1
    • 0.03814262
  • 0.9:0.2*20:0.1
    • 0.03814262
  • 0.5:0.5*20:0.1
    • 0.04145937
  • 0.5:0.1*20:0.1
    • 0.039800995
  • 0.5:0.2*20:0.2
    • 0.04145937
  • 0.5:0.2*20:0.5
    • 0.04145937

適当にやってみたが、そもそも値の見方がわからん。
ドキュメントには「比率*ecpoch : 残り」とあるけど、コロンが2つあるし。

 

じゃあ、ここまでで成績がよかった値を全部突っ込むと、よりよい結果になるのか?

  • Sigmoid(変更無し)
    layerSizes=2:50*2:2(変更無し)
    minibatchSize=40
    learningRatesPerMB=0.8:0.2*20:0.1
    • 0.03814262

そういうわけでもない。

 

そもそも、こういうパラメータをあれこれ考えるのがめんどくさいから機械学習させてるんじゃないのか?という気になってきた。
もうちょっと機械的にパラメータが決められないと、つらいぞ。

 

そういうのが、最近の研究で定型化してきたというところなのだろうか。
今回で挫折シリーズを終えて、使い方じゃないことも調べていこう。

[ai]『深層学習』の8章に挫折してCNTKを試す (7)

CNTKの2016/02/08版バイナリがリリースされていた。
https://github.com/Microsoft/CNTK/releases

とりあえずGPU版をダウンロードしておけば、あとは勝手に選択してくれるだろう、ということでWindows-64bit-GPU.zipを選んだ。
1bit-SGDはよくわからんので、やめておいた。高速になるとかじゃなかろうかね(てきとう)。


昨日試したグラフ出力だが、こちらでも同じ「??」だった。
残念。

ConfigもDataも同じものだが、ログを比較すると違いが多い。
たとえば、pass 1のログはこうなっていた。

[前]Validating for node CrossEntropyWithSoftmax. 20 nodes to process in pass 1.
[今]Validating network. 25 nodes to process in pass 1.

意味はわかってないけど、20と25と数字が変わってるから、何か変わったんだろう。
ただ、一番最後のErrorPrediction/Sampleは0.04145937と同じだったから、本質が変わったわけではないのだろう。


さて、次に私がやってわかりそうなことは何か・・・。
よくわからんグラフではあるが、これの元になるのはSimple.cntkしかないはず。
なので、Simple.cntkとグラフの対応をしていけば、何か見えてくるんじゃなかろうか。
第2回でも見たのだが、もう少し詳しく見ていこう。

 

ネットワークの具体的な形はこのファイルになさそうなので、SimpleNetworkBuilderが持ってるんじゃなかろうか。
「形」と私が思っているのは、何とか層、みたいなものの名前が処理する順番につながっているような何かだ。
予想では、SimpleNetworkBuilderが提供している「形」があって、そのパラメータだけがこのファイルに書かれている、なのだが。
たとえば、TutorialのPDFにある、こんな図があって、

image

「この変数は、図のこれと対応してます」みたいな説明を期待しているのだよ、私は。
せめて、GraphVizの出力も、こんな図の出方だったらわかったかもしれないのになぁ。

あ、でも一番下の

image

は、

image

と対応しているように見えないだろうか?
InputValueがMVNormalizedFeaturesノードに集まっているところが上の「X:Input」で、W0のLearnableParmeterが上の「W(1):Weight」だ。

その上の層の

image

は、

image

だ。「Times」「B」「Plus」などという名前も一致している。

そうやって対応づけていくと、こんな感じになるのかな。

image

理論的なところはわかっていないが、T→P→Sでワンセットのようだ。
SがOutputにならないところは、隠れ層(Hidden Layer)。

Simple.cntkのコメントには「2 input, 2 50-element hidden, 2 output」と書かれている。
「2 input」は、SimpleDataTrain.txtの(x, y)の2次元?
「2 output」は、ラベルの数だろうか。
hiddenも2つなのだけど、P→Sの(1)と(2)の2つなのか、(2)と(3)の2つなのか・・・PDFのOne Hidden Layerにならうなら、(1)と(2)がhiddenだ。

なので、Inputノードにウェイトを乗算するTimesノードと、Timesノードにバイアスを加算するPlusノード、Plusノードにシグモイド関数を当てはめて次のInputノードとなるSigmoidノード、これの繰り返しがSimpleNetworkBuilderでできるネットワークだと思う。

 

ここまで読んでて「シグモイドってなんだっけ?」となってしまった。
『深層学習』の2.2章にあるが、活性化関数・・・なのだけど、活性化関数ってのもよくわからないな。
掛けたり足したりを繰り返していくと値が発散するので、それを正規化しようとしているのだとは思う。
本に書かれている式でも、0~1.0とか、-1.0~+1.0とか、そういう範囲になっている。
ただ、最近はシグモイド関数に代わって正規化線形関数という、0以下は0、0以上はy=xという関数の話も書かれている。
まあ、細かいことは今後の課題だ。

SimpleNetworkBuilderで選択できる活性化関数は、

  • Sigmoid
  • Tanh
  • RectifiedLinear

の3種類。
Sigmoidが0~1.0の範囲で、Tanhは-1.0~+1.0、RectifiedLinearがさっきの正規化線形関数だ。

[ai]『深層学習』の8章に挫折してCNTKを試す (6)

CNTKだろうとCaffeだろうと、あるいは別のフレームワークを使ったとしても、同じインプットに対しては同じアウトプットが出ないといけないはずだ。
乱数要素があるとしても、それでも大きく違ってはいけないだろう。

なので、大切なのはインプットだ。
DeepLearningはニューラルネットの構築式(というのか?)がインプットになる。
もちろん学習データもインプットで大切なのだけど、データはDeepLearning以外でも使えるけど、DeepLearningするんだったらニューラルネットの構築がいるのだ。

で、Caffeにはニューラルネットのグラフを出してくれる機能があった。
きっと、CNTKにもあるはずだと思い「CNTK graphviz」で検索した。
GraphVizは、Doxygenなどでも使われているのだが、汎用のグラフ出力ツールだ(たぶん)。
「GraphViz」なのに、なぜかコマンド名が「dot」なので、ちょっと悩むのだがね。

 

そして、あった。
https://github.com/Microsoft/CNTK/wiki/Plot-command

あまり読まずに試したが、たぶん、たぶんだが、

  • modelPathにモデルのファイルパス
  • outputdotFileにGraphViz用のファイル名(CNTKが作る)
  • outputFileに出力する画像ファイル名
  • renderCmdに実行するコマンド

を書いて、configファイルのcommandに追加すると実行してくれそうだ。
Simple2dで試すと、こういうのが出てきた。

image

う、うーん・・・
下から上に矢印が向かっているから、下がインプットなのかな。
WはWeight?、BはBias?、Hって??

それに、なんで「?」がこんなに多いのだろう。
日本語のパスなどは入れていないから文字化けではないと思うのだけど、これではさっぱりわからん。
dotファイルに「?」が入っているから、CNTKが出力しているはず。

 

Windowsで動くからCNTKで勉強するか、と気楽に考えていたが、初心者にはつらいのかもしれん。

2016年3月5日

[ai]『深層学習』の8章に挫折してCNTKを試す (5)

前回・・・もう1ヶ月くらい前だが、ログを出そうとしたがcurrentDirectoryのパスになってしまった、というところで終わっていた。

悔しいので、ちゃんとログのパスを指定したい。

 

cntk configFile=Config/Simple.config currentDirectory=Data stderr="%CD%/log/"

こうすると、作ったlogディレクトリの中にファイルができていた。
configFileはcurrentDirectoryの影響を受けないというのが、釈然としない。

それに、できたファイル名は「_Simple_Demo_Train_Simple_Demo_Test.log」だ。
そう、プレフィクスをstderrで付ける前提のような名前だ。

このファイル名は、commandで指定する「トレーニング」と「テスト」の名前を連結させただけのようだ。
じゃあ、もうファイル名に付加させたいような要素が思いつかないな・・・。

実行日時を付けようかと思ったが、Windowsのバッチファイルで%DATE%や%TIME%を加工することしかできなさそうで、国が違ったりするときれいにできそうな気がしない。
Linuxだともうちょっと楽なのに。。。

じゃあ、cygwinでやればいいやん、と`pwd`など使って指定したが、ファイルがないとか言われて・・・。

どうやってもうまくいかないので、そのうち私は考えるのをやめた。

[c/c++]Arduino Uno版でcstdlibなどがincludeできない

以前作っていた、Arduino版のNFCアクセスライブラリが動かない、というコメントをいただいた。
動かないというか、cstringやcstdlibのincludeができないらしい。
はっはっは、そんなばかn・・・できない!
なんでー?

 

今使っているのは、Arduino 1.6.7のWindows版。
実は、最初ビルドできたのだ。
しかしそれは、ESP8266用の設定にしていたままだった。
これを「Arduino/Genuino Uno」にすると、できなかったのだ。

つまり、コンパイラ側の挙動らしい。


じゃあ、stdlib.hも無いのかと思うと、そうではない。
コンパイルも通る。ファイルはここだと思う。

C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include

いくつか検索したけど、C++風の「.h」がつかないファイルは置いてなさそうだ。
ふーん。

まあ、組み込みで標準ライブラリなどを期待してはいかんのだろうが、最近は普通に動くことが多いので、気が緩んでいかんね。

[win10]ネットワークがよく切れる(解決せず→よくなってきた?→結局買い替えた)

うちのノートPCはThinkPad T61と古いのだが、まだ使えているので現役でがんばっている(メインじゃないけど)。

この子をWindows10にしているのだが、WiFiがよく切断されるようになった。
切断されるというか、その状態になってExplorerを動かそうとするとWindowsが応答しなくなるところまで行ってしまう。
Ctrl+Alt+Delも反応しないけど、起動しているアプリだけは動くような状態になり、ずーーっと待ってると急に動き出す。

 

Intel 4965AGNという内蔵WiFiモジュールを使っていたのだけど、Windows10は対応してくれないようで、よくブルースクリーンになっていた。
なのでUSBのモジュールにしてAGNは機能停止させていたのだが、関係あるかも、と思って外した。
が、関係ないようだ。

ネットで検索するとけっこう出てくる。
解決できている人もいるようで、だいたいこういう対応されてた。

  • 電源の設定
  • WiFiモジュールの設定
  • NetBIOS over TCP/IPを「有効」にする
  • 「SSIDがブロードキャストされてないでも接続する」にする

省電力が影響しているパターンと、なんだかわからないけど設定が影響しているパターンの模様。
ただ、どれもうちでは変わらずでした。。。。

 

IPv6を外すとか、いつも何となく行っている設定が悪さをしているのかもしれないが、それにしてもWindowsの応答が止まるというのは行き過ぎだろう。
だから、もっと根っこの方がよくないので、インストールし直しみたいな方が良いのかもしれない。


2016/03/06

はい、またダメだった。
ちなみに「Windowsが応答しない」というときは、こういうダイアログが出る。

image

 

いつもネットワークが切れるのでそちらで検索していたが、今日はWindows10の応答がなくなる方で検索した。
すると「Superfetchサービスを止めると良かった」という人がいた(ダメだったという人もいるけど。。)。
とりあえず、止めてみよう。

 

そういえば、こういうダイアログが出るんだったら、イベントビューアに何か残ってるかもしれない、と思いついた。
これかどうかわからないけど、エラーが出ていた。

image

開始できませんというか、ファイル自体がないですな。
ドライバをアンインストールしてインストールし直すと出てくるらしいので、やることにする。
うちのは、GW-USNano2。
Windows10への対応状況には載っていないな・・・。
とりあえずデバイスマネージャーから削除させて、インストールしてみた。
が、Rtlihvs.dllは出てこない。。。

そうなると、サービスの「WLAN AutoConfig」がいるのかどうか。
どうせ動かないから、止めて、イベントビューアのイベントもクリアして、また様子を見よう。


2016/03/06 22:21

まただめだった。
今回は、ブラウザ(Firefox)がくるくる回ったままになったので、コマンドプロンプトを起動。
そして、スマホでwww.yahoo.co.jpのIPアドレスを調べ、ping。
通る。
では、www.yahoo.co.jpでping。
応答が返らなくなる。

となると、DNSがらみのような気がする。
pingの作りは知らんが、引数がIPアドレスじゃなかったらDNSでIPアドレスを取得するんじゃなかろうか。
ずっとダメなら設定だろうと思うんだけど、急に止まって、数分すると復帰するから、何か起きてるのだろうという気がする。

次はもう、セキュリティソフトをアンインストールするとか、そういうのになっていくので悩むな。


[2016/03/09]

前回、DNSか?で終わっていたが、1つだけ試したものがあった。
DNSキャッシュの削除だ。

Windows でクライアント側の DNS キャッシュを無効にする方法

> ipconfig /flushdns

無効にまではしていないのだが、ここ数日調子がよい。
まだだ・・・まだ気を許してはいかんと思うのだが、普通に動くのは素直にうれしい。

Windows10で気になっているのは、この問題とExplorerのコンテキストメニューフォント、それと非アクティブなウィンドウがわかりづらいというくらいなので、残りをあきらめれば移行してよいかもしれない。

 

ちなみに、Explorerのコンテキストメニューフォントは、こんなの。

image

こっちはFirefoxで表示させたコンテキストメニュー。

image

微妙に、Explorerの方はぼやっとしている。
格好がよいぼやっとした感じならよいけど、単に見づらいだけなのだ。
フォントを変更するツールを試したけど、Explorerだけは変わらないのだ。

 

非アクティブウィンドウがわかりづらいのは、アプリ次第。
Excel2013はわかりづらい。

これはExplorerアクティブ、Excel非アクティブ。

image

これはExplorer非アクティブ、Excelアクティブ。

image

Explorerはわかりやすいが、Excelはフォントの色しか変わらないし、しかも微妙だ。

ハイコントラストにするとわかりやすいのだが、犠牲が大きすぎる。。。

image image

ただ、設定でここまで変えられると言うことは、まだ可能性はあるのかもしれない。


[2016/05/04]

あれから2ヶ月。

実は、最後の記事を書いてから、また何度か切断される現象が発生していた。
これはもう、セキュリティ関係の設定を変更するしかないと思い、以下を行った。

  • ウイルス対策ソフトを変更する
  • ファイアウォール設定をWindows10デフォルトに任せる

ウイルス対策ソフトは、なんとなく変更した。
あまり疑っていないのだが、たまには変えてみるか、程度のもの。

疑っていたのは、ファイアウォール設定。
こういう陰湿な(?)現象は、ファイアウォール設定でどれか必要な通信を遮断することで、そのプロセスが正しく動かないために発生する、ということがよくあるからだ。

そして2ヶ月くらい様子を見ているが、順調だ。

 

さて、そろそろファイアウォールのアプリを戻して、また遮断させていこうと思う。

http://www.sphinx-soft.com/Vista/order.html
これの、Free版を使っていたのだ。
私がすぐ遮断したがるタイプなので、そのせいだったんじゃないか、という推測だ。
ストアアプリを使うことがほとんどないので遮断していたのだが、それかなぁ。
なので、今回はストアアプリの遮断はなるべくしないようにして、また報告しよう。


2016/09/25

結局、あれから現象が起きたので、あきらめてWindows10に対応したUSBドングルを買い直した。
型番が本体に書いていないからわからないのだけど、見た目はこれ。
http://buffalo.jp/product/wireless-lan/client/wli-uc-gnm2/

ちゃんとWindows10対応というところを確認して買ってきた。
メーカー品で、Window10対応リストがあって、その中に載っていない機種だったら疑わしいということかもしれない。

つなぎ替えてからは、嘘のように何事もなく動いている。
外したGW-USNano2もRaspberry Piで使っているので、うまく収まった。
そういう時代なんだ、ということで終わらせよう。

2016年3月2日

[excel2013]図形のかっこの初期状態がかっこわるい

まさかの連続Excelネタ+ダジャレタイトル・・・。

資料を作るとき、オートシェープの括弧をよく使う。

image

描くと、こんなだ。

image

えー、もうちょっと、なんかねぇ。。。

image

image

せめて、こんな感じにしてほしいのだ、デフォルトで。
あんまりカクカクしていると、本などで見かける形と違うからか、どうしても変更したくなってくる。
「規定の図形」にしても保持されるわけじゃないので、毎回やってるのだ。

 

昔はもうちょっと格好がよかった気がするのだが、美化された記憶なのだろうか?
最近は「Excelで書くのはやめよー!」というのもよく見るのだけど、あれこれ考えているときには手書きしたり図を描いたりしたいのよねぇ。

[excel2013]小さい図形の自由回転をマウスでやりたかったが、なさそうだ

もう時代はExcel2016とかになりつつあるのかもしれんが、うちにあるのは2013だ。

 

昔のExcelには、図形の自由回転(という名称だったかどうかも忘れたが)する図形選択があった。
アイコンで言えば、マウスカーソルのアイコンに緑の丸がついていたような記憶がある。
Excel2013だと、小さいオートシェープなどの図形では回転するハンドルが表示されないので、表示される倍率まで上げないといけない。
この倍率が、図形の大きさによって違うので、めんどくさい。
そして、回転するためだけに倍率を上げて、また元に戻す、という動作が腹立たしい。

なので、昔あった自由回転するアイコンをクイックアクセスツールバーに置いておくと便利だろう、と探していたのだが、5分くらい眺めてもそれっぽいものがわからなかった。
あれって、検索機能が欲しいです・・・。

ネットで検索すると、

  • 拡大させる
  • 書式タブでやる
  • Alt+左右矢印で回転できる

が見つかった。
一番近いのは3番目か。
でも、忘れそうな気がする。人によっては画面が回転したりしないかい?

 

昔のメニューとの対応表があったけど・・・やっぱり拡大させてアンカーを表示させる方式か。

リファレンス: Excel 2003 のコマンドに対応する Excel 2007 のコマンド - Excel

image