2018年2月24日土曜日

確率論的プログラム

近頃AIツールから流行りだしてきた新しい考え方として、確率論的プログラムがある。
以前からNLPの分野では絶対的に必要になる確率論の登場だ、そもそも自然言語は確率論で解析されるべき現象かもしれない。相手は自然言語なので、発生した表現はどれも正しいえる、例え文法的にも間違いがあっても、その場で言語の役目をになえば、正しいといえる。時代時代の言葉、若者があるコミュニティで発した言葉、どれも正しいのだ。
これを時と場合の状況に合わせ、主体者が主体的に選択したものを、NLPで解析しているのが事実で、実際に対訳データを解析してみると確率を使った分析で単語とかはかなり高い確率で解析できる。
確率論的プログラムは今後飛躍的に発展してくる技術であることが予想される。
でも確率論と統計解析とどのように区別するべきなのであろうかという疑問が残る。少なくとも確率論は統計解析を参照するが、総体的統計ではなく局所的統計を意味を論理的に判断してアルゴリズムを組むことで異なる判断がなされると考える。(自己流の解釈です。)
現在、Pytorch+Pyro、WebPPL等が注目されているが、この考え方は、これ以前からある、B-Prolog+PrismやASPと共通している考え方であると思う。それにしてもまたもやPrologの先進的な手法がレガシーなものになってしまうのか、今後の流れに注目していきたい。

2018年2月12日月曜日

Picat言語の将来性

また新しいプログラム言語かと思い少しうんざりしていた、今日この頃ですが、どうやらそうも言っていられないかも知れません。

この言語の特徴をあげると(本家サイトの情報から)
1.マルチパラダイムプログラム、PythonとPrologの側面
2.ルールベース言語
3.記述が非常にシンプル
4.制約論理を実装している
5.テーブリング、メモ化して最適化計算
6.仮想マシンで動作し、スケーラブル
7.SATのアルゴリズムでも賞を最近とっている
8.アクター(イベントハンドリング)

この他、基本的な情報はウィキを参照してください。

これだけの理想的な特徴を持っている言語は他にはないような気がする。
Haskellは殆どが満たしているが、コードが読みにくい。
試しにサイトのコードやライブラリを眺めて見ると、びっくりするほどシンプルに記述されている。

本家サイトには大量のサンプルプログラムがあり、使う上で
のフレームワークは殆ど揃っている。

今まで、PythonやPrologで記述しづらいアルゴリズムがこのPicatで解決できるような気がする。

そういう意味では、Prologに慣れている人(殆どいないかも)には待ち焦がれた実用システムが構築可能なプログラム言語と言える。(ちなみにPrologの特徴であるassertが見つからないが、cl_factsが同じ意味を持つらしい。違うのは述語を全リストで登録し、更新するときは毎回全述語入れ替えが起こる。つまりバッチ化されたということ。)

アクターとイベントハンドリングは、UIやWeb等の仕組みで使われることを前提にしているようです。Webの説明の切り口が少ないので、今はどうやって利用するか調査中です。

今は、TensorFlowのようなニューロン系のAIが大注目されているが、いずれSATによる手法もクローズアップされる時期も来るかも知れない、その時の為にPicatのようなクールな言語は最適かも知れない。
この意味で、人工知能系のアルゴリズムの研究には適していると感じている。

改めて、現在ライブラリーやサンプルコードを眺めた限りは、制約論理系に重点を置いている感じがするが、NLPもターゲットにしているようなので、是非新しいアルゴリズムが開発されることを期待したい。

「Picatに将来性あれ!!」

追伸:3月27日
この記事を書いてから、PicatをPrologの代わりに使い続けて、約1ヶ月半が経ちました。これまでの感想そ追加します。
利点:
Prologよりも遥かに綺麗なコードが書ける。
カットがないので、無限ループに遭遇することが少ない。
エンジンとして使うのに適している。
Prologで遅いアルゴリズムで使えないアイデアも使えるようになった。
まさしくルールに集中できるので、思考にもいい影響がある。(Prologのコードを再構築できるようになった。)
tableを使い、組み合わせの最適化解を求めたいのであれば、絶対的に使うべき言語です。
欠点:
汎用的なコードはまだPrologの方が早い。
メモリが巨大化するので、これを防ぐようにアルゴリズムを考える必要がある。

追記:20181229
Picatを使い始めてから実際のところ、言語の使い方は習得できましたが、メモリのガーベージがだめなようで、まだまだPrologに頼るところが多い状態です。現状報告まで。
追記:20190223
garbage_collect関数を呼ぶとき、sysをインポートすれば、正常にガーベージできました。誤報を流してしまい申し訳ありませんでした。