隠れ層のあるニューラルネットワーク

隠れ層のあるニューラルネットワークに対する逆誤差伝搬法について記述した記事をアプロードしました。

一応確認したつもりですが、式が間違っていたらごめんなさい…

最初  \bar{L} = \frac{1}{S} \sum^S_s L なので、Lの個別値を求めて満足していました。でもどうも収束が遅い。
サンプル全体について添字縮約しなければいけないことに気づいたのが午後10時30分。

なもので、まだ GitHub に上げたサンプルプログラムにはバグフィックスがかかっていません。そのうち直します。

自作ニューラルネットが動かない理由が判明

以前、Java で作成する AI みたいな本を買ってきてプログラムを打ち込んでいたが、MNIST の手書き認識精度が 10% 台とほとんど認識できない状態になっていた。

今回、改めて Java で組んでみてその理由が判明。

σ'(z) とのアダマール積を取るべきところを加算しておりました。
そりゃ、収束せんわなあ。

プログラムを組み直したら劇的に収束が改善され、10回ループくらいで90%の認識率を持つようになりました。(さすが最急降下法!!)
これ以上の認識精度は難しいようです。

まだコメントが一切ないコードなので、コメントを付けて GitHub に上げようと思います。

また、コードを JCuda 版に改造して劇的な性能改善を図る予定です。
(CPU による Java8 の parallelStream は Core i7 6900K では期待した性能が出ないようです。並列化のオーバーヘッドが大きい?)

今は AutoEncoder による Deep Learning を試みていますが、これがまたうまく行かない。

unordered_map から unordered_set は作れないのか?

連想配列を使っていると、キーの集合だけ、値の集合だけを作成したいことがある。そんな時はどうするのがスマートなのだろうか。

1.for 文で地道に拾う

C++ っぽくないので却下。

2.for_each 式+ラムダ式で拾う

using namespace std;

void separate(unordered_set<MapKey> key_set, unordered_key<MapValue> value_set, const unordered_map<MapKey, MapValue> map) {
  for_each(begin(map), end(map), [&key_set, &key_value] (const pair<MapKey, MapValue> &i) { key_set.insert(i->first), value_set.insert(i->second) });
}

Java と違って標準の抜き出しメソッドを用意していないのは set とか他のクラスに実装する可能性を考えているからだろうか。

N-gram 検索エンジンに and 機能を追加

N-gram 検索エンジンに and 検索機能を追加しました。

半角の空白文字を入力すると、空白で区切られた文字列を全て含むページを検索します。

実装がちょっとうまくないですが、おいおい直します。

表示についても統一化していないため、検索にヒットした文の数だけ結果が表示されます。例えば、「可逆 圧縮」と入力した場合、「可逆」で検索された後、「圧縮」で検索されるため、「可逆」で1行、「圧縮」で1行表示されます。

これは検索の問題というよりは表示の問題です。

N-gram 解説記事を展開しました

GitHub にはすでにサンプルを上げてありますが、N-gram 解説記事を新たに展開しました。

使い古されてあまり顧みられなくなった感のある N-gram ですが、実装が簡単な割には厳密な検索が可能なので、個人的には重宝しています。

解説記事はネットに多数掲載されていますが、他の検索エンジン技術と比較するときに対象記事があったほうが便利なので書いてみました。

振り返ってみると、あまり万人向けの解説になっていませんね..。

検索エンジン追加

N-gram ベースの検索エンジンが動くようになりました。結局、索引ファイルの作成は python3 で、検索エンジンは php で組んでみました。

索引ファイルはここでは作成できないので、別のマシンで随時作成したものをアップロードします(ちょっとださい)。

なお、検索対象はホームページ側の記事のみで、ブログ記事は検索されません。ブログを検索したい場合はブログの中で検索をかけてください。

And/Or 検索も実装されていませんが、そのうち実装したいと思います。

しかし、たったこれだけ実装するのに1日かかるとは、コーディングの実力が落ちたもんだ。。。

検索エンジン(2)

今更クローラを C で組みたくないな、と思い始めた。

XML と違って HTML は独特の書き方をするサイトもあるので、結構クローリングは大変なのである。N-gram を収容するファイルのフォーマットは大体決まったので、python か何かのクローリングライブラリを使おうかと思う。

N-gram ファイルの概要

明日は仕事が休みらしいので、ヒマがあれば片付けてしまおう。