人工知能してみる

人工知能の中の人が機械学習とか統計とかAI的なことを書き連ねます

「AIによる高度な評価」という便利で意味のない言葉

www.fashionsnap.com

某D○NAみたいなこともありましたし、こういった考え方をもったサイトが生まれるのはとても良いことだと思います。

思いますが、記事中にこんな記述があります。

「データとAIによりコンテンツを客観的に評価し、雑誌編集のノウハウを知る編集部員が責任のある編集を行った後に、ユーザーごとに個別最適化して配信する。」

AIによる評価、とはなんでしょう?
good or badの二値ラベルを貼り付けてbowでSVMまわすとか?
その中身に透明性がない限りAIで評価するって言葉にはなんの価値もありません。
せめてインプットデータや解析手法がでてこないとなんとも…。
というか、記事の信憑性なんて評価することがとてもむずかしいので、AIでどうにかなる問題でもないと思います。
好みを見つけるAI技術なみにふわっとした設計ですね。

AIって言葉がバズワードになって久しいですが、未だにAIって言葉でふわっとプロダクトを作る詐欺みたいな案件多いですね。
AI作る側としてはこういった詐欺プロジェクトが減っていって欲しいところです。

人工知能が記事を書く時代になりました

jp.techcrunch.com

つまるところ、企業の出す決算短信など適時開示情報をもとに各社の要約文を出力するわけですね。

実際に出力されている文章をみると割りとルールベースなのかな?って感じです。
たとえば数値について言及しているあたりは企業の過去データが存在すればルールベースで出力できそうです。
後半の企業の事業に関する部分こそAI的ですね。
日経のサイトを見る限りはtfidfやセンチメント分析によって重要単語や情勢を抜き出しているようですね。
ここらへんは割りと枯れた技術なので上手くできそうです。
日経なのでニュースデータに関してはたくさんあるでしょうし、こういったデータを出力するのは上手くできそうです。

総じてみると、とても「上手くやってる」プロダクトって感じです。
枯れた技術と蓄えたデータを上手く活用したいい例じゃないでしょうか?
無理に最先端の技術を使わなくてもこういったいいプロダクトが作れているのだと感じます。
まだテスト段階なので裏側では人間がチェックしているのだと思いますが、とても上手く作れていると思います。

企業の衰勢については数値が重要なので、むしろこういったAIで書いたほうがいいのかもしれませんね。
アナリストレポートなんかはアナリストの主観がバリバリに入っていて「それってあなたの感想ですよね?」みたいなのもたくさんありますから。
逆に数学的に出力されているのはブレがなくて信用できるかも。

こういったレポートは形式も決まっているのでAIにはとても向いていると思います。
ロジカルに出力できるレポートはAIで出力される時代になるでしょうね。

機械学習で理由も説明させる

こんにちはGrahamianです。

こんなニュースがありました。
www.gizmodo.jp

要約するとdeep learningの結果に対して結果の理由を添えてくれる、というもの。

単層パーセプトロンのようなシンプルなものはまだ理由が考えやすかった。
これはインプットに直接重みが与えられるためである。
インプットベクトルのi番目の重みが大きいから、なるほどこの項が重要なんだな。とか。
なので上手くいかないときの修正がそこそこ容易だし、モデルとデータの関係も把握できた。

ところが深層学習ではデータを圧縮して計算に使う。
そのため計算途中で何がエフェクティブなのかわからなくなってしまっている。
(word 2 vecの論文で「なぜか分からないが上手くworkする」と書かれているのは有名)

これは運用中にヘンな結果になったとき何を変えればいいのかわからなくなってしまう。
もちろん、システムを考えればなんとなく何が重要なのかは分かるけど、それは"カン"でしかない。
特に最近流行りのめちゃくちゃ深い深層学習とか複数のセルを組み合わせたものはもう分からない。
なのでこういうシステムの需要はとても大きかった。

っていうのが記事中の研究の意義ですかね。
これの面白いところって複数の解析結果を組み合わせて表現できるってとこですね。
中間言語のようなものができているのでしょうか?
「バットを持っている人」の写真の圧縮ベクトルから「バットを持っている人」という文字列を生成できる訳ですから。
これはある種のsemantic分析(意味分析)ができているとも言えるのでは?
マシンに「バットをもっている人」という共通のベクトルを持たせることに成功していると仮定したらですが。

これを発展させれば、今までは1対1で学習させていたものを汎用的に使えるようになります。
今後に期待ですね。

PyCharmの便利な使い方をまとめておく

PyCharmを最近使っています。
IDEでは便利な機能がたくさんあるのですが、日本語の情報がなかなか見つかりません。
そこで自分が見つけた情報をここにまとめていきたいと思います。
まだまだ、使い始めて日が浅いので情報足りないですけど、段々と追記していきます。

よく使うショートカットキー
control + d : debug開始
control + r : run開始
control + F2 : debug, runの中止
control + F8 : ブレークポイント設定
control + / : 行をコメントアウト
control + e : 行末へ移動
control + a : 行頭へ移動

control + tab : windowの移動

command + b : objectへ移動
command + alt + l : 選択範囲のインデントを最適化

こんな感じでしょうか。
他にも便利な機能を見つけたらここに追記していきます。

バンディットアルゴリズム ε-Greedyモデル

前回バンディットアルゴリズムの全体について見てみました。
grahamian.hatenablog.com

今回はバンディットアルゴリズムの基本であるε-Greedyモデルを見ていきます。

前回、バンディットアルゴリズムでは探索と活用が重要だと言いました。
ε-Greedyモデルでは0から1の乱数を取り、それがεを超えるか否かで探索するか活用するか決めます。

例えば、3本の腕があり、報酬の期待値が最も高い状況を考えます。
活用ではこの腕を引きます。
探索であればこの腕以外を引きます。
探索時に他のどの腕を開くかはランダムです。

ここで乱数を取ります。
0から1の乱数です。
事前に設定したεより高ければ探索、低ければ活用します。
つまりεの確率で探索、1-εの確率で活用するわけですね。

これを繰り返し行うことで次第に高い値が得られた腕が活用されることになります。

このアルゴリズムは非常にシンプルで、バンディットアルゴリズムの考え方がわかりやすいです。
バンディットアルゴリズムは最大の利益を得ることが目的でした。
そのために高い報酬が得られる腕を選びつつ、効率的に他の腕を探索することが重要です。
ε-Greedyモデルでは、探索する閾値をεというパラメータを用いて表現していました。

さて、ε-Greedyモデルはシンプルですが、シンプルゆえに問題点がある手法です。
問題の1つとして、たまたま高い報酬を得られた腕をずっと評価し続けてしまいます。
これは腕について報酬の確率分布について評価しないことに起因します。

これは割りと大きな問題で、実行するたびに失敗する確率が存在することを示しています。
そこでこれを改善したsoftmax法があります。

次回はこのsoftmax法を見てみましょう。

バンディットアルゴリズムって何?

なんかバンディットアルゴリズムというものがすごいらしいです。
勉強したことを少し書き溜めてみます。

バンディットアルゴリズムとは?
目の前にスロットが何台かあるとしましょおう。
それぞれのスロットには当たりの確率がそれぞれ設定されています。
もちろん、こっちは当たりの確率が高い台で遊びたいですよね。
でも使えるお金には限りがあります。
そこで、限られた条件の中で最大の利益を得るにはどうしたらいいか?というアルゴリズムが考えられました。
それがバンディットアルゴリズムです。

バンディットアルゴリズムは活用と探求にわけられます。
活用は良いと考えられる台で遊ぶことです。
探求は良い台を探すことです。

どの割合でそれぞれを行うか、これが肝になります。

よく似た手法としてA/Bテストが挙げられます。
A/Bテストはテスト対象をランダムに選び、その結果を利用するものです。
A/Bテストの難点はテスト回数が多くないと良い台を選ぶことができないことです。
無限大の試行回数があれば最も良い結果が得られますが、実際の問題では制約があります。
そのため、試行回数の限界があるため、十分な結果が得られないことがあります。
バンディットアルゴリズムならば少ない試行回数でもA/Bテストよりも効率良く、良い結果を得ることができます。
もちろん、バンディットアルゴリズムにも問題点はありますが。

次回は具体的なバンディットアルゴリズムの手法について見てみます。

gensimでトピックモデルを実装してみる

自然言語処理のライブラリはpythonでは多々ありますが、gensimを今回は使います。
以前もgensimはWord2Vecを使うために使いましたね。
grahamian.hatenablog.com

今回はトピックモデルを実装するために使います。
とはいえ、作るだけならコードは3行で済みます。

こちらを参考に実装しました。
qiita.com

import gensim 
corpus = corpora.lowcorpus.LowCorpus('text.txt')
lda = gensim.models.ldamodel.LdaModel(corpus=corpus, num_topics=20, id2word=corpus.id2word)

text.txtはスペースで単語を区切ったテキストファイルです。
事前にMecabで分ち書きをして名詞だけにしてあります。

実装はこれだけで完了です。
あとはLdaModelを使って文書分類の推定されたトピックIDを見たり、トピックにおけるトークンの出現率を見ることができます。
また、num_topicsを変えることで分類するトピック数を変えることもできます。

トピックモデルは抽象的な理解は簡単ですが、LDAトピックモデルは統計の知識がないと理解が難しいです。
でも実装がこんな簡単にできるなんて最高ですね。