検索エンジンにN-gram+Scoreを追加しました

技術置き場に新しい検索エンジンを実装しました。

ベースは N-gram ですが、出現確率が高いほどスコアが高くなるような計算を行い、スコアに関して降順に結果が表示されます。ただし、スコアが0.0001より小さくなる場合は検索対象にはなりません。スコアの最大値は恐らく1.0です。

この検索エンジンのよいところは比較的あいまいな検索に対応できることです。特に動詞、助動詞と言った、語尾が変化する単語の検索に威力を発揮します。

なお、本検索エンジンはN-gramの軽微な改良であるため、記事化は予定しておりません。

jcurandの記事を追加しました

cuRAND を JCuda 環境で使用するための API である、jcurand の使い方をアップしました。

お膳立てが若干ありますが、それさえクリアすれば、シンプルな呼び出しで高速に乱数生成ができます。

メモリはデバイス側に確保する必要がありますが、メモリコピーを使えばホスト側に持ってきて使用することが可能です。

JCuda 版ニューラルネット記事追加

JCuda 版ニューラルネットのコードに関する説明記事をアップしました。CPU 版と比較して、以下の変更があります、

  • CPU版では batchsize 方向の並列化はしなかったが、JCuda 版では batchsize 方向も並列計算する。
  • CPU 版ではホストメモリの管理のみだったが、JCuda 版ではホストメモリおよびデバイスメモリの両方を管理する。
  • JCuda 版では計算はデバイスメモリで閉じるようにする。
  • メソッドはほぼ共通して使えるように、デバイスメモリ管理をオブジェクト定義に追加して隠蔽する。

 

SimpleNet.java バグ修正しました

SimpleNet.java の forward() 計算で、bias を使用しないというバグがあったため、JCudaNNKernel.cu とともに修正しました。ただ、bias があってもなくても正答率に目立った変化はないようです。

JCuda 版ニューラルネットのソースコード解説は、現在作成中です。完成にはあと2〜3日かかると思いますので、好ご期待。

AutoEncoder 系のライブラリも作成中ですが、まだ動きません。

NeuralNet.java のバグを修正しました

NeuralNet.java でバグが見つかり、本来

for (int y = 0; y < ysize; ++y) {
  d += w[x][y] * bderivative[y]
}

と書くべきところを x に関して和を取っていました。修正し、GitHub を更新しました。

修正の結果、収束がさらに速くなった気がします。また、ループを繰り返すと過学習してしまう傾向がみられます。

JCuda 記事を追加しました

JCuda の記事として、デバイスメモリの使い方〜カーネルの記述までを追加しました。

preparePtxFile() は JCuda というよりは JCudaDriverSample の機能なので、敢えて解説していません。

次はいよいよ JCuda を使ってニューラルネットを構築します。

JCudaSimple

JCuda ライブラリの利用方法を説明するためのプロジェクト JCudaSimple をGitHubにアップロードしました。

中身はほとんど JCudaDriverSample と同じですが、Java8 風に書き換えてあります。外部 JAR として jcuda, jcuda-natives を参照しているので、ここだけ各自の環境にあったファイル名に書き換えてください。

解説記事は一両日中に書きたいと思います。

scrayping.py にバグ

このホームページを拡張してサブフォルダを作ってみたり、他のサイトを参照したりした結果、scrayping.py がエラーを出力するようになりました。

このバグを修正した版を GitHub に上げておきました。

意外に修正が難しかった。

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

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

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

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

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