2015年7月8日水曜日

人工知能はコメント欄を健全化できるか?

これすごいな。メールのSPAM検出の開発並にすごいのでは

http://blogos.com/article/121140/

Yahoo!ニュースのコメント欄は、荒れることが多い。誹謗中傷、特定の国に対する侮辱的な書き込みなど、ドロドロしたネット民のダークサイドに満ちている。
それは欲求不満の発露であったり、匿名であることで理性や良識が外れてしまうからだろう。リアルで面と向かって、同じようなことがいえる人が、どれほどいるのかは疑問だ。
そんなコメント欄を、人工知能で管理できるサービスが登場した。

人工知能で“荒れない”コメント欄--「議論の場」醸成めざしメディアに無料提供 - CNET Japan
人工知能や自然言語処理を活用したサービスを提供するクーロンは7月7日、機械学習や自然言語処理、行動分析にもとづく独自の人工知能を搭載した、読者が健全な議論を交わすための“荒れない”コメントシステム「QuACS(クアックス)」をウェブメディア向けに提供開始した。人工知能を活用したコメントシステムは世界で初めてだという。

(中略)

「単語」ではなく、同一コメント内の前文の内容、他者のコメントへのレス(会話)の流れなど、文章や文脈を判定しているのが特徴。たとえば、麻薬や覚醒剤の購入を促すような違法取り引きに関するコメントは非表示になるが、「麻薬」「覚醒剤」といった単語が文中で適切に使われる場合には表示される可能性が高い。

若者言葉やネットスラングなど、時代によって新たな言葉が生まれたり言葉の使い方が変わったりするが、機械学習により使えば使うほど精度が高まり適切な状態を保てるという。なお、「何かを表現したくてできなかったことは怒りに直結する」(同社代表取締役社長の佐藤由太氏)との考えから、たとえ非表示になったコメントでも、投稿者本人の画面には表示し、あたかも投稿できたかのように見せかける。
学習機能がどれだけ機能するかだね。ネットスラングは次々に生み出されているし、一部を伏せ字にしたりする手法もあるし、たとえ話で連想させたりもする。
ある意味、人工知能とネット民の知恵比べかもしれない。
「QuACS(クアックス)破り」なんてのが、流行ったりして。

“荒れたコメント欄”は、ネットの一面とはいえる。
そこに露出された過激な言葉は、そういう人間が身近にもいるという警告でもある。世の中は、ダークサイドと隣り合わせなのだと。
過激なコメントを書く人が、リアルな日常の会社や学校でも過激な発言や行動をしているとは限らず、善良な市民の仮面を被っている場合もあるだろう。
日常の人格と、ネット上でのもうひとりの人格という二面性……多重人格を顕現させるのが、ネットの特性でもある。

QuACS(クアックス)がどれほど有効かを実験するには、Yahoo!ニュースのコメント欄が最適だと思うよ(^_^)


ディープラーニングを小学生でも使えるようにしてみる

http://wirelesswire.jp/2015/06/32460/

この一ヶ月で、ディープラーニングが急激に使いやすくなってきています。
Google傘下のディープラーニング研究グループDeep Mindでインターンをしているスタンフォード大学の学生はこんな台詞をツイートしています。
スクリーンショット 2015-06-30 5.57.49
「ディープラーニングに関して、新しくクールな論文が発表される速度は、それを読める速度より速い」
それこそ毎日のようにディープラーニングに関する何らかの新しい話題が出てきます。
それくらい、ディープラーニングは盛り上がっているのです。
「人工知能は人間を超えるか」を記した東京大学の松尾豊先生によれば、「ディープラーニングはWebの発明に匹敵するほどの発明」とのことでしたが、なぜそれほどまでに世界中の研究者が夢中になるのか、筆者も自分がディープラーニングの世界にどっぷりと漬かってみることによつてようやく理解できてきました。
そしてその興味はいまや確信に変わりつつあります。
確かにこれはWebの発明、いや、ひょっとするとコンピュータそのものの発明に匹敵するくらいのインパクトを生み出すのではないかと。
この数十年、人工知能の研究は「機械学習」と呼び替えられ、迷惑メールフィルタやAmazonなどのオススメ商品の推薦といった分野にもっぱら使われてきました。
しかしここに来て突然、ディープラーニングは脚光を浴びることになります。
理由はいくつかあります。
機械学習を理解するには、相当な数学的センスと知識が必要でした。
これは今でもあまり変わっていません。
昨日、ふと秋葉原の書泉ブックタワーにでかけていって、ディープラーニングに関して言及した書籍を探してみると、まず技術書の中で、ディープラーニングを専門的に扱っている本は一冊も見つかりませんでした。
Amazonで検索すると、辛うじて「深層学習(機械学習プロフェッショナルシリーズ)」という本が引っかかります。
そして他の「機械学習」はどれもディープラーニング以前の時代に書かれたものばかりなのです。
こういう光景には、見覚えがあります。
それは1994年の書泉ブックタワーでした。

大学に入学したばかりの私は、当時3Dプログラミングにどっぷりと浸かっていました。
その頃はまだプレイステーションすらも発売されておらず、リアルタイム3Dを駆使したゲームは、片手で数えるほどしかない、そんな時代です。
新潟の片田舎から上京してきた私は、東京の秋葉原の書店ならきっとたくさんの本があるのだろうと期待に胸を膨らませながら書泉ブックタワーに向かいました。
その頃はAmazonのような便利なしくみがなかったので、本を探したければ、足で探すしかなかったのです。この時代はGoogleはおろかYahooすらありません(Konishikiというコードネームでスタンフォード大学のジェリー・ヤンとデビッド・ファイロがYahooの原型を作っていた頃です)。
ところが東京の書店に来ても、リアルタイムの3D処理について言及している書籍はほとんどありませんでした。
肩を落とした私は、ふと、見慣れない書籍がずらりと並ぶコーナーを訪れます。
そこは輸入書のコーナーでした。
するとそこには、リアルタイム3D処理に関する書籍がずらりと並んでいたのです。
私は衝撃を受けました。
日本語の書架をみれば、当時はリアルタイム3D処理に関して日本人の誰もが興味を持っていないことは明らかでした。書籍を書けるほどの知識も蓄積されておらず、学生が書く連載が1,2本、雑誌に載っているだけでした。
一方、海外では、信じられないほど多くの人がリアルタイム3D処理に熱中し、研究し、日本の何年も先を行っていたのです。

この時、私は時代の風を感じました。
今自分が見つめるこの場所が、紛れも無いフロンティアであることを知ったのです。
その年の暮れにプレイステーションが発売され、当初の予想を覆すほどの大ヒットとなりました。

私はゲーム業界に身を投じ、3年後にはリアルタイム3D処理に特化した書籍を執筆し、ちょっとしたベストセラーとなって、それがきっかけで在学中に米Microsoft corpの仕事を引き受けることになります。今やリアルタイム3D処理は、スマートフォンのブラウザーですら当たり前のように用いられています。あの頃、日本人の技術者、プロのエンジニアと呼ばれる人たちがまるごと無視していた領域にこそ、本当のフロンティアがあったのです。
この頃はまさに時代の潮目であり、それを最初に感じたのはあの書泉での体験でした。

ディープラーニングに関して、私は今同じような感覚を感じています。
大半のビジネスマンは未だディープラーニングをバズワードの一種と捉えています。確かにこれまで、似た考え話にたくさんの肩透かしを食らってきました。
文字認識、音声認識、といった分野は今も着々と認識率を上げていますが、それでも100%とは程遠いといった印象です。Siriに一発で自分の言葉を意思どおりに入力できる人はまだ少ないでしょう。
要するに機械学習の一番身近な成果は、Siriの音声認識やWindowのタブレットに搭載されている文字認識であり、それが100%とは程遠いことを人々は体験的に知っているからです。
そしてディープラーニングによる画像分類も、確かに認識率だけ見れば、まだ良くて96%程度と、音声認識が99.8%くらいまで迫っているのに比較するとまだまだという印象を拭えません。

しかし決定的な違いは、ディープラーニングによる分類には汎用性があるのに対し、音声認識や文字認識といった分野は汎用性が狭いことです。文字認識なら文字認識に特化したノウハウが必要ですし、音声認識なら音声認識に特化したノウハウが必要です。
ディープラーニングはそのどちらにも応用可能であるだけでなく、もっと他のことにも応用が期待されます。

一例を挙げれば、例えばPhotoshopなどで使われる画像フィルタの入力画像と出力画像のペアをディープラーニング・ニューラルネットワークに大量に学習させると、そのニューラルネットワークがそれまで見たことがない画像を入力しても、Photoshopのフィルタと全く同じように画像を処理するようになります。これは、単純なアルゴリズムなら、ニューラルネットワークが学習・模倣できてしまうことを意味します。

文字認識や音声認識はクリティカルな使用法を想定するから問題が起きるのであって、クリティカルでない使用法を想定すれば、もっと自由に使えるようになります。

さらにプリファード・ネットワーク(PFN)のオープンソースフレームワーク、Chainerの出現です。

Chainerはそれまで機械学習の専門的知識を持った人のみを対象としていた学習環境に比べて、ディープラーニングによるニューラルネットワークをより簡単に素早く扱えるように設計された新世代のフレームワークです。
Chainerは、それまでディープラーニングの主流フレームワークのひとつであった、カリフォルニア大学バークレー校を中心にGoogle、NVIDIAで使用されているCaffeというフレームワークの1/10の記述量で画像分類のニューラルネットワークを記述することができるというシンプルさがウリです。

さらに、jetpac Deep Belief SDKというオープンソースのライブラリを使用すると、ディープラーニングされた画像認識エンジンをだれでも簡単に扱うことができるようになります。
このSDKでは、「jpcnn_classify_image」という関数をひとつ呼ぶだけで、画像を認識し、その画像に含まれるものをテキストで返します。
いわば画像を入力するとテキストが返ってくるブラックボックスなわけですが、これをツールとしてスマートフォンアプリやRaspberry Piに組み込むことで様々な分野へ応用できるというわけです。
ここまで簡単になると、もはやディープラーニングは研究者の手を離れて、エンドユーザーに近い人々が何か新しい利用法を考える段階と言えます。

そこで試しに、弊社で開発中のiOS向けプログラミング開発環境MOONBlock DXにこの機能を組み込んでみました。

MOONBlock DXはスマートフォンだけで独立してアプリを開発することができる開発環境ですが、例えば画像認識するプログラムはこのように書くことが出来ます。
スクリーンショット 2015-06-30 6.34.43
これは、ボタンが押された時に写真を撮影し、「画像認識」というブロックに「写真」を渡すと、認識された画像の候補をアラートボックスに表示するという簡単なサンプルです。ものの数十秒で作ることが出来ます。
早速実行してみましょう。
スクリーンショット 2015-06-30 6.34.49
起動すると、シンプルに撮影ボタンだけが表示されます。
これをタップするとカメラが起動します。
スクリーンショット 2015-06-30 6.34.59
試しに会社の机にあったディキシーカップを撮影してみます。
すると、数秒も待たずして内蔵されたニューラルネットワークから推定結果が返ってきます。
スクリーンショット 2015-06-30 6.35.04
このDeep Belief SDKに内蔵されたニューラルネットワークは当然海外で教育・訓練を受けたものなので、日本人がイメージするようなものとは違うものを教育されています。それでもディキシーカップを認識したのは優秀だと思います。
他のものも試してみましょう。
スクリーンショット 2015-06-30 6.35.11
筆者のMicrosoft Surface3はどうでしょうか。
スクリーンショット 2015-06-30 6.35.16
とにかくコンピュータと認識されているようです。
このMOONBlock DXに搭載されたニューラルネットワークは、およそ1000種類の画像を判別します。
ですが日本向けにニューラルネットワークを教育しなおしたほうが良い結果が得られそうです。
たとえば郵便ポスト一つとっても各国で形が異なります。
今後はニューラルネットワークのローカライズが重要になってくるでしょう。
しかしここまで来ると、名実ともに、ニューラルネットワークを手軽に使える時代がやってきました。
画像分類タスクはひとつの例に過ぎませんが、今後もディープラーニングを応用した様々なタスクが現れ、そしてこんなふうに簡単に使えるようになっていくでしょう。

こういう時代は控えめに言って、驚くべき時代です。
これまで、プログラミングといえば、プログラマーの独擅場でした。
プログラマーは全てのロジックを理解し、積み上げ、デバッグして納品する、それが当たり前の作り方でした。
これからはそのワークフローが少し変化するかもしれません。
プログラマーがプログラムを組むのはしばらくは変わりませんが、それと並行してプログラマーではない人、たとえば仮にそれを「AIトレーナー」と呼ぶことにしますが、彼または彼女が、チームリーダーの指示にしたがって人工知能を教育するための学習データを収集・整備し、次々と人工知能を教育(トレーニング)していきます。

実際、弊社ではディープラーニング用の学習画像データ・セットを集めているのはアルバイトや事務、秘書など、それまで全くコンピュータやAIに対する専門性を持っていなかった人々です。そして一口に「学習画像データセット」と言っても、無数の可能性があります。インターネットで画像を拾ってくるだけでは、本当の意味での現実世界の認知は不可能です。

つまり学習画像データ・セットを集めるには文字通り教育的なノウハウが必要で、そうしたノウハウはむしろAIの専門家よりも人間の教育の専門家の方がよほど効果的に学習データを集めることができるようになるかもしれません。
それはそれまで存在しなかったタイプのノウハウです。この学習データセットを収集するというのも立派にひとつの仕事として成り立っていくでしょう。

プログラムを納品する段階でトレーニングしたAIと、プログラム本体を一緒に納品し、さらに納品後も次々とAIのトレーニングを続け、精度を上げていきます。
こうした従来型のプログラミングパラダイムと、AIという新しいパラダイムのハイブリッドが、近い将来のソフトウェア像になるのではないでしょうか。

もはやディープラーニングは、対岸の火事ではありません。
全てを飲み込む可能性を秘めた情報産業全体のブレークスルーとなる可能性があります。

IoTのセンサーネットワークやゲーム、映画、検索エンジン、Eコマースなどなど、ありとあらゆる分野にAIが応用されていくでしょう。それはもう夢物語ではなくなってきています。

シンギュラリティ、技術的特異点と呼ばれる世界では、AIを使いこなした人だけが活躍していくことになるでしょう。
そしてAIを使いこなすということは、すなわちAIをプログラミングするということと、AIを教育・訓練することの2つです。
そしてAIを利用したプログラムは、先ほど示したようにとても簡単にできるようになります。

あとはこれをどのように使っていくか、イマジネーションの勝負です。

明日から東京ビッグサイトで開催されるプロダクションEXPO内では、弊社、株式会社ユビキタスエンターテインメント(UEI)の展示ブースでもディープラーニングに関するささやかな参考出品を行う予定です。

2015年7月7日火曜日

Mastering OpenCV wtih Practical Computer Vision Projects のサンプルソース

いわずとしれた、OpenCVは便利な代物。でも、いろいろありすぎて、何ができるかわからない。あーんど、関数・クラスは存在するが使い方がわからんものが多い。

ってことで本を買いました。

Mastering OpenCV wtih Practical Computer Vision Projects

中身は結構いいので、それは別途紹介するとして、サンプルソース集を見つけました。なぜこれがいるかといえば、解りやすいのだけど、打ち込むのが面倒なだけです。

GitHubにありました。著者の一人が公開。
https://github.com/MasteringOpenCV/code

2015年7月5日日曜日

C++ の書き方の勉強

C/C++のコードの書き方は無数にあります。が、読みやすい書き方はおおよそ決まっています。
私は昔、某会社のコーディング規約の制作にかかわったことがあるのですが、その前は、まぁ、バラバラ。読みにくいったらありゃしない。(その辺をばらすのは良くないので詳しくは述べませんが、後述する乗用車のを応用して作りました。) 可読性が高いプログラムを書くことは、チームプログラムでは必須のことですし、可読性の高いプログラムはバグも少ないです。

プログラムに最近復帰した自分の書き方がわかりにくくなっていると自分で感じたので基本から勉強しなおしをすることにした。

基本を勉強する本
1.CODE COMPLETE 第2版 上
  CODE COMPLETE 第2版 下
業界標準みたいなものです。と言っても私は、忘れていましたが。上巻は設計やプログラミング、下巻はテストやデバッグを扱っています。

2.リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック
C++を使っている人向けです。導入から感心させられます。一見の価値あり。


2015年7月4日土曜日

c++ vector iterator index取得とその使用の注意点

まれにiteratorのindexを取得したい場合がある。が、ほんとはこんなことしない方がいいのはわかるが、iteratorの要素ごとの相互関係を定義したいときに使おうと思って試してみた。

#include <vector>

vector<int> v;
vector<int>::iterator it;

for(int i=0; i<10; ++i) v.push_back(i);

it = find(v.begin(), v.end(), 3);

cout << it - v.begin() <<endl;

結果:
3

とりあえずうまく行きそうだが、これってデータを追加・削除するときにbeginのデータがなくなったりしたら順番が全部変わる気がする。試してみよう。erase で 3 の格納されている要素を消してみる。

#include <iostream>
#include <vector>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
vector<int> v;
vector<int>::iterator it;

for (int i = 0; i<10; ++i) v.push_back(i);

it = find(v.begin(), v.end(), 3);

//cout << it - v.begin() << endl;

v.erase(it);

it = find(v.begin(), v.end(), 2);

cout << it - v.begin() << endl;

it = find(v.begin(), v.end(), 4);

cout << it - v.begin() << endl;

return 0;
}

結果:
2
3

2の入っている要素は変わらないが、4の入っている要素が繰り上がって3になっている。

よって、このアルゴリズムを使う注意点としては、要素をpush_backで追加したときはそれまでの要素のIndexがかわらないが、削除した時は変わってしまうことであろう。注意する。


参考
http://kogecoo.hatenablog.com/entry/20090731/1248994749

2015年7月1日水曜日

cmake Visual studio(2013) ALL_BUILD 実行ファイル変更

CmakeでVisual Studio用のファイルのslnを使ってプロジェクトを作ると、実行ファイルが標準ではALL_BUILDとなり、F5とかCtrl+F5で実行できない。

そこで、実行ファイルの指定を変えます。

通常の画面の上の[Project]->[Properties]を起動。

Single startup project でALLBUILDから実行ファイルのあるプロジェクトに変更する。

だけ。自分でVisual Studioを触れば早かったのだが、検索ではいいものがみ、意外に苦労した。意外に苦労した。

CMakeList.txt の設定 (Visual studio 2013 + OpenGL & OpenCV & Eigen)

cmakeをつくるのに苦労したので、その記録。初心者だー
今作っているプログラムは、OpenGL & OpenCV & Eigenを使っています。それらのCmakeの作り方はそれぞれ違っていので、いろいろと参考になるねーってことでまとめ。また、私の環境はいろいろ制限(インストール不可+特定フォルダにアクセス不可)されているので、OpenGLはふつうはこんなことしなくてもいいかも。また、この理由によりパスは私の使っているものなので、自由に変更してほしい。変更するところだけ太字にしておく。

1.OpenCV
Windowsで自前でOpenCVをコンパイルした時にはCmakeはそのフォルダをわかってくれない。そのためOpenCV_DIRで場所をしていしてあげる。

ーーーーーCMakeList.txtの中身ーーーーー
# OpenCVインストールパスを指定
set(OpenCV_DIR "C:/dev/opencv-2.4.10/build/install")

# OpenCVのパッケージを探す
find_package(OpenCV REQUIRED)

# OpenCVが見つかった場合のみ設定を行う
if(OpenCV_FOUND)
  # インクルードパスを指定
  include_directories(${OpenCV_INCLUDE_DIRS})

  # リンクするライブラリ指定
  target_link_libraries(platform ${OpenCV_LIBS})
endif(OpenCV_FOUND)

2.Eigen
Eigenはインクルードのみで使えるライブラリなのでそのパスだけを指定してあげる。

ーーーーーCMakeList.txtの中身ーーーーー
# Eigen
include_directories("C:/dev/eigen-3.2.4")

3.OpenGL
なぜかこれをかなり苦労した。freeglutをダウンロードしてコンパイルして使っているのだが、フォルダ構成が違うせいかOpenCVと同じ方法をとっても何か上手くいかない。そのため、どうせ使うのはfreeglut.libとインクルードだけなので直接指定した。Cmakeの利点が消えている気がするがまぁいい。いつかいいことあるだろう。

ーーーーーCMakeList.txtの中身ーーーーー
# OpenCVのパッケージを探す
find_package(OpenGL REQUIRED)
include_directories("D:/twatanabe8/dev/freeglut-2.8.1/include")

target_link_libraries(platform "D:/twatanabe8/dev/freeglut-2.8.1/lib/x64/freeglut.lib")