またたびさんの事件ログ

「またたびさんの事件ログ」
http://www.amazon.co.jp/gp/product/4864723338/ref=as_li_ss_tl?linkCode=as2&tag=jnishi-22
関西R大学の学園祭準備中に起こる事件を学生が博士課程の女子学生と共に解決するミステリー。とまあ、ミステリーの紹介なんてネタバレ無しにはできないのでこれくらいで。

情報系の学部、修士課程を経て企業系研究者としてコンピュータビジョンを研究している人が書いているだけあって細部が妙にリアル。
機械学習で学習回してて計算に1週間かかる。そして空調切れて熱暴走でサーバー壊れておじゃん。締め切りが締め切りが...」
「背景差分法が…」「Haar-Like特徴量をブースティングで学習させるパターンかな」
「百数十人いる学科の中で女子がたったの5人...」

その中で一番ツボにはまったのは研究室MTGの様子。学部4年生が卒論に向けての報告をしてる中
「それのどこが研究なの?」
「こんな条件の良い中で実験しても無意味だよね。君の作ったこれにはなんの意味があるの。」
車輪の再発明って知ってる? サーベイを一からやり直して。」
「別の方法ならもっと楽にシンプルに実現出来るよね。自分で勝手に問題を難しくしてない? わざわざ回りくどく難しいやり方でやる意義はないんじゃないの?」
卒論の時の光景を思い出す…これやられるとキツイんだわ。これ、作者の体験談なんだろうな(笑)。
理系の研究室の厳しいところがどんな様子かを知りたい人は是非(笑)

AdaGrad + RDAを実装してみた

AdaGrad + RDA

「結局オンライン最適化はAdaGrad1択だよね」
「AdaGrad + RDAでの分類が精度一番良いみたいです」
「AdaGrad + RDAの方が実装がはるかに簡単」

と立て続けに聞いたのでAdaGrad + RDA*1を理解するために実装してみた。
結論から言うと、確かに実装は簡単だし精度もでました。

損失関数と正則化

AdaGrad自身は最適化手法です。すると適用するには最適化問題の形で記述する必要があります。
分類問題における定式化では損失関数と正則化項を足したものになります。今回の損失関数は
ヒンジロス f_t(x) = \left[ 1 - y_t (z_t \cdot x) \right]_+ = \max(0, 1 - y_t (z_t \cdot x))となります。
 y_tは1 or -1のラベル、z_tはベクトル空間上にマッピングしたデータです。
正則化項はL_1-正則化L_2-正則化など色々有りますが今回はL_1-正則化となります。

微分

で、最適化問題を解くわけです。今回はf_t(x)\phi偏微分を用いるのですが、max関数や絶対値とか入ってて微分できないわけです。こういう時のための劣微分を用います。劣微分の説明は省略しますが、平たく言うと微分不可能な値での微分値としては微分の値としてとり得る範囲の値のどれかを使おうというものです。例えばヒンジロスの部分の劣微分は次のようになります。
\left{ \begin{array}{ll}0 & \mbox{if} y_t (z_t \cdot x) < 1 \\ -y_tz_{t,i} & \mbox{else} \end{array}
ちょうどy_t (z_t \cdot x) = 1となるところでは微分不可能ですがどちらの値を採用しても構わないので0とします。

省略できる処理

\deltaは0にしても問題ない*2\etaは学習データが多い時はあんま影響ないので1にしとけばいい*3などがあります。また、学習データの値が0の要素では値は変わらないので、計算を省略することができます。最後にGが対角行列になる場合に限定します。

アルゴリズム

以上の項目と合わせつつ冒頭に書いたアルゴリズムをうにゃうにゃ変形させる*4とt番目のデータによる学習は次の様になります。

  //ヒンジロスが0の場合は劣微分は0になるので学習にならない
  double loss = 1.0 - t.first * calcInnerProduct(t.second);
  if(loss <= 0.0){
    return;
  }

  //update gradient
  numTrain++;
  for(SparseVector::const_iterator i=t.second.begin();i!=t.second.end();++i){
    int feature = i->first;
    double value = i->second;

    SumOfGradients[feature] -= t.first * value;
    SumOfSquaredGradients[feature] += value * value;

    //sign(u_{t,i})
    int sign = SumOfGradients[feature] > 0 ? 1 : -1;
    //|u_{t,i}|/t - \lambda
    double meansOfGradients = sign * SumOfGradients[feature] / (double)numTrain - lambda;
    if(meansOfGradients < 0.0){
      // x_{t,i} = 0
      SeparationPlain.erase(feature);
    }else{
      // x_{t,i} = sign(- u_{t,i}) * \frac{\eta t}{\sqrt{G_{t,ii}}}(|u_{t,i}|/t - \lambda)
      SeparationPlain[feature] = -1 * sign * (double)numTrain * meansOfGradients / sqrtf(SumOfSquaredGradients[feature]);
    }   
  }

実装は https://github.com/jnishi/rda こちらにあげています。

実行結果

News20*5のデータのうち、15000件を正解データとし、残る4996件をテストデータとして分類をしてみたところ96.7174%であった。 https://code.google.com/p/oll/wiki/OllMainJaこちらによると様々なオンラインアルゴリズムの中で一番良いConfidence Weightedでも96.437%なので確かにAdagrad + RDAの方が性能が良い*6

*1:原論文:「Adaptive Subgradient Methods for Online Learning and Stochastic Optimization.」 http://www.magicbroom.info/Papers/DuchiHaSi10.pdf

*2:原論文参照

*3:「Notes on AdaGrad」http://www.ark.cs.cmu.edu/cdyer/adagrad.pdf

*4:原論文参照

*5: http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary.html#news20.binary

*6:Soft Confidence Weightedだとどうなるのだろう

考えてるつもり

人間の思考が如何に周りの状況の影響をうけるかについての本。

人は自分と同じ集団の人に対しては親しみを持つ。同じ大学の出身、同じ地方の出身、
共通の知り合いがいる等などの場合、初対面だったとしても友好的な態度で話をする。
この事自身はそんなに不思議ではないと思う。
ところが、この性質は思ったよりも極端に働く。一つは自分が意識してなくても作用するという意味で、
もう一つは自分が認識しているよりも友好的な気持ちや憎悪の気持ちが浮かんでしまうという意味で。
そして同じ集団とみなした場合には寛容になり
例えば歩いている人にとって、泥をはねかけられる、道を譲らないなどの理由でドライバーを嫌悪する。
「歩行者はドライバーよりも道徳的だ。奴らドライバーはなんて自分勝手なんだ!!」
同じ人が車を運転すると道路を斜めに渡ろうとし、信号無視をする歩行者を見て「奴ら歩行者はなんて自分勝手なんだ」
と、ドライバーが優れた種族だと認識する。


このカテゴリ付けは色んな所で起こってないだろうか。自分が何かにイラッとした時、相手を無意識に外の集団の
人間とみなして厳しくなっていないだろうか。部下と上司、営業とエンジニア、男と女、日本人と外国人、
といったようにこのカテゴリ付の要素となるものはいっぱいある。


じゃあ、どう防ぐか。自分が偏見を持ちうると認識することだ。
それが故に自分にはどういうバイアスが掛かりそうで、相手とどう認識のズレが生じるかの
学びの機会とすることだ。偏見や先入観は自分が捕らわれていると気付ければ影響は小さくできる。


この他にも有名な「周囲に感じる人の存在の数が多いほど困っている人を助けようという意思は弱まる」
「人に指示されると罪悪感を感じなくなり、酷いことでもやってしまう」などの話もある。「寛容にならなきゃとは思っているんだけど」と自覚している人も、そうでない人もこの辺りの話題でピンとこない人は読んでみるといいかと。

予想どおりに不合理

ここ数年いろんな形でNPOに関わってきているけども、活動を大きしようとして時に直面する難しさに対するヒントが「予想どおりに不合理」にあったので、多分NPOや本業以外に活動をしている人は読んでおいた方が良いかと思って紹介。

第4章「社会規範のコスト」で「社会規範が規則を作る世界」と「市場規範が規則を作る世界」について説明している。社会規範が規則を作る世界では友人や知人の頼み事や好意をベースにしていて、すぐにお返しをする必要はない。大抵ほのぼのとしている。一方、市場規範が規則を作る世界では対価や便益が求められ、シビアな世界となる。

NPOやその他の活動はだいたい社会規範が規則を作る世界でスタートする。お金になる/ならないではなく、何とかしたい、楽しみたい、やりたい辺りが起点となる。そして頼み事で活動する場合はモチベーションが高いので、徐々に活動は進んでいく。やがて様々な人から協力を得て少しづつ活動が大きくなってくる。ところが活動が大きくなってきたところで、お金の面にぶち当たる。それは拡大にともなって必要なインフラが大きくなってきた/事務処理などボランティアでモチベーションを保つには難しい作業が増えてきた/活動に専念したくなって活動そのもので生活費を稼げるようにしたいなどが理由に上げられる。

お金を意識し始めると急に「市場規範が規則を作る世界」になる。そうすると本業で活躍している人ほどモチベーションが急激にダウンしてくる。個々人が活動に対して対価を意識し始めるため、本業で活躍している人ほど他の活動で得られる対価が大きく、非営利な活動で経済的なインセンティブを得るのが難しいからである。また、一度市場規範を意識すると、社会規範には中々戻らない(社会規範から市場規範にいたるのは一瞬である)ので、元には戻りにくい。かくして、バラバラになったりメンバーが入れ替わったりする。

じゃあどうしたらいいかというと、良くは分からない。大事な点としては市場規範と社会規範は両立ができないので、どちらか一つにしておくのが良いのかと思う。サービスを提供している人から対価が期待できるのであれば、はじめから営利企業で突き進め、それが期待できない(だいたいはこっちだと思うけど)のであれば、社会規範をベースにして活動する。後者の場合は多分代表も含めて全員ボランティアで行うほうが良い。

ちなみに、社会規範は対価を意識しないからといって、頼りになりっぱなしでいいわけでは勿論無い。お礼は必要だし、プレゼントや他の活動といった形で報いる必要はある。ただ、現金ではゼッタイダメだという点と、プレゼントや他の活動など、現金を介さない形で報いている限りは社会規範をベースとした世界は続くという点が重要なポイントである。

技術の千年史

会社のミッションが「最先端の技術を最短路で実用化する」で、中核に据えるのが検索でも自然言語処理でも機械学習でも無く「技術」である以上、それらを抽象的に捉えた「技術」についてもちょっと考えたりするわけです。


技術革新(イノベーション)とは大抵の場合既存の技術の組み合わせであるというのは割と一般的に言われていると思います。つまり、技術はある分野に持ち込まれたりするわけです。これを「技術移転」といいます。その技術移転というのは「対話」である。というお話。


対話であるというのはどういうことかというと、「歩み寄る必要がある」「双方向である」ということです。
「歩み寄る必要がある」とはある技術が別の場所で受け入れられるにはそのままでは使えずに現地の状況に合わせて改良及び現地の特性に合わせて培われた技術との組み合わせが必要であり、決してその下地がないところでは使えないということです。


「双方向である」とは、そうして現地で根付かせるために行われた改良が、移転元の方にとっても技術の改善につながるということです。つまり技術を伝え、別の場所にて使い物になるように工夫することが、まわりまわって自分たちに方にもプラスになるように返ってくるというわけです。


以上のようなことが、「技術の千年史」では直近千年間に渡り、農業・造船・銃・鉄道・紡績などの例において具体例と共に書いてあります。

世界文明における技術の千年史―「生存の技術」との対話に向けて
アーノルド・パーシー
新評論
売り上げランキング: 193,027

技術を持って異分野に突入する際に、技術のことと適用分野のことと両方のことを知ってお互いに歩み寄らないと中々難しいわけですが、その難しさもこの「対話」という比喩に含まれてて面白いなあと。また、伝える側にも改善が見込まれるというところは「リバース・イノベーション」と似たコンセプトであったりもするわけです。「技術の千年史」は20年以上の前の本ですけどね。


いずれにせよ、技術は他から取り入れられ、進化した後に提供元にまた還元されるという視点で見ると、戦後日本は欧米の基礎技術を取り込み、製造という形で進化させたわけです。そして今、製造の技術が欧米に帰って欧米が新しい形で発展し、アジアに伝えられて取り込まれる際にまた発展していると考えるのであれば、今は何をすべきかというと他で培われている技術を取り組み、自分たちで扱えるようにすることだろうと思うわけです。もっと貪欲に知識や技術を輸入したい。

雑感

いずれにせよ、マスに対して行なっていた支持者集めがパーソナライズして個別に集めていく方向にシフトしていった感じのようだ。そのために必要な基盤として、10000万人 × 1000個くらいのデータベースを構築したところから始めたのと、さらにそこから支持者になりやすさをレーティングしたところがデータサイエンティストの真骨頂というところだろう。

ただ、パーソナライズとレーティングが肝であるとはいえ、述べ500,000回電話での説得を行ったボランティア、番組制作、メディア制作など、最後の有権者に訴えるのは従来の方法であり、決してデータサイエンティストが無双であったわけではない。まして、そのキーとなった分析だって、収集方法は電話調査だったり、取得すべき特徴を考えるところには社会学者、政治学者、経済分析者が協力している。
一つのテクノロジーが入り込んだことによって戦略がガラリと変わる。それでも従来のものが良い形で活かされる。こういうのって素敵だと思うのです。

アメリカ大統領選のデータサイエンティスト

先日の大統領選でデータサイエンティストが活躍したと評判であったが、どんな風に選挙活動していたのかの記事( http://www.technologyreview.com/featuredstory/509026/how-obamas-team-used-big-data-to-rally-voters/ )があったので読んでみた。

まずは2008年の選挙の際にベースとなるデータとして、

  1. 10000人くらいの簡単なインタビュー
  2. 1000人くらいの詳細なインタビュー結果

を作成した。各人には約1000個くらいの特徴が付けられている。

まずは、下記のことが分かった。

  1. 意外にもMedicareの政策について話すと65歳以上の人よりも45〜65歳の人に好評のようなのでこの世代に積極的にMedicareをアピールする
  2. 女性の同一労働同一賃金についてが最も反響が多く、しかも支持率が低かったことが分かった。そのためはっきりと政党を決めていないが女性問題に特に関心がある女性の支持を得るために、女性の話題にしか触れていないダイレクトメールについて公開した。

そしてここからが面白い
オバマは支持者を使う方法としてはマスメディアやダイレクトメールよりも、ボランティアや支持者の人に他の人を1対1で説得してもらうのを中心に支持者を増やしていった。
その際にあらかじめ対象者を解析し、支持者になりやすいかどうかを0〜10の間でスコア付けを行い、支持者になりやすそうな人に対して片っ端から電話して説得していった。

ケーブルテレビの放送枠を買ったが、効率的に放送するために先の分析で支持者になりやすそうな人の視聴履歴をプライバシーは保護しながらケーブルテレビの会社から購入。支持者になりやすそうな人のテレビがよく見る時間を付きあわせ、金額あたりで支持者になりやすそうな人がもっとも多く見るような最適な時間配分を計算して(線形計画か整数計画かしら?)から放送を行う。