読者です 読者をやめる 読者になる 読者になる

Precision/Recallのいずれかを重視したい場合にどのように事例を追加するか

機械学習

当たり前の話かもしれないけど、自分は経験したことがなかったのでメモがてら書いてみる。絶対これで行けるというわけではないと思うが、ある程度一般性はあるんじゃないかと。

状況設定

機械学習の評価を考える際に複数の指標がトレードオフの関係にあるというのはよくある話だと思う(例えばPrecisionとRecallの関係)。どれも上がるのは理想的には望ましいが、どちらかというとこれを重視したいというのがあるとしよう。例えばこんな状況。

  • 検索フィルタリング(検索結果に残る側が正例)
    • ユーザーの目に触れるところはちゃんとしたものを出したい。候補となるアイテムは大量にあるので、true negative(誤って負例に分類してしまう)はある程度許容できる。よって、Precisionを特に重視したい
  • Spam判定(spam側が正例)
    • 後段で人手チェックが入るので、ある程度false positive(誤って正例に分類してしまう)は許容できる。漏れがあると嫌なので、Recallを特に重視したい

F値が若干下がることは許容できて、Precision/Recallのバランスを自分が望む状況に倒したいのがやりたいこと。

Precisionを重視したい場合

特にfalse positiveを抑制したい。この場合、事例を見ながら悪影響を及ぼさない範囲で負例を重点的に追加していくと、false positiveを抑制できると考えられる。悪影響を完全に除くことは困難なので、true negativeの事例が若干増えて

  • Precisionは上がる
  • Recallは下がる

という状況が作れる。ある種のソフトなブラックリスト方式と捉えることができる。

Recallを重視したい場合

特にtrue negativeを抑制したい。この場合、さっきと逆で正例を増やしていくと正例側でactiveになる特徴量が増えるので、true negativeになる事例を抑えやすくなると考えられる。よって

  • Recallは上がる
  • Precisionは上がる

という状況が作れる。

考察

特徴量の観点

NLPのような特徴量が高次元スパースなデータの場合、学習事例を増やすというよりも特徴量次元が追加される効果のほうが大きいのかもしれない。10000次元あった特徴量がデータを追加することで重みが正しく修正されるというより、10000次元では捉えられなかった特徴量がデータを追加し15000次元になると捉えられるようになる、といったイメージ。正例/負例のみを追加するので、正例/負例のどちらかでのみactiveになる特徴量が多い、ということだと理解した。

validationデータとの正例負例のバランスの不整合

validationデータはいじらず、trainingデータのみ正例/負例を追加する、ということになるので、データセット間で正例負例のバランスが変わるという状況が起こる。これを解決するために足りていない側のover samplingを行なうことはできるが、それによってより考慮したい評価値が下がるということが考えられるので、over samplingを行なうのが一概によいとは言えなさそうだ。

能動学習

自分が知らないだけで、能動学習(Active Learning)でいい解決方法があるかもしれない。

感想

研究やっているときはデータセットはfixされた状況が多かったので、「Precision/Recallのバランスを調整する = ハイパーパラメータの調整/閾値の調整/特徴量の調整」と思い込んでいたけど、データセットがfixされていない(自分でアノテーションして追加できる)という状況だと他にも色々やりようがあるなという学びがあった。

最近の技術的な勉強について

Perl ElasticSearch TypeScript

入社して恐しいことにもう5ヶ月(!!)経とうとしていますが、Web開発にも段々慣れてきたかなと思います。この5ヶ月で勉強したことや復習したこと、これから勉強が必要そうかなと思う技術について、忘れないうちに書きとめておこうと思います。

サーバーサイド

  • 担当しているサービスが大きめなこともあり、自分で全部把握できる小さいアプリがあると何かと勉強がはかどる
  • はてなの教科書を参考に日記サービスを作って、色々拡張して遊んだ
    • [余談]これを1週間でやってもらうインターン、やっぱりなかなかタフだなー
  • 仕事ではすでに運用されているサービスの改善をやることが多いので、プライベートでは0から自分で一気に作るのも刺激があって面白い
    • サーバーサイドはAPIだけ提供して、domの構築はフロントエンド側で、というのが自分としてはしっくりきている。パフォーマンスの問題とか色々ありそうだけど...
  • dbのschemaの定義とかも考えるの面白い

フロントエンド

  • 最も自分に経験が足りていない領域。仕事でもちょこちょこ触り始めた
    • そして経験の足りなさを実感する...
  • 仕事でtypescriptを触った
    • jsをそんなに書いたわけじゃないからあんまり比較はできないけど、typescriptは結構書きやすい
    • 特に型があり、エディタでの補完が出るのでmethod名をあまり知らない段階だと助かる
  • Vue.jsとかreactとかの概要を知った。データを変更すると、対応するdomの要素を変更してくれたりして便利そう
    • reactはちょっとやるにはコード量が多くなりそうなので、Vue.jsとかから入門したい
  • jsやtypescriptを軽く勉強したいときにサーバーサイドの準備をするのが面倒
    • apiのエンドポイントだけ役割を担ってくれる外部サービスはないのかと探したらfirebaseが便利そうだった
    • RDBMSとかではないけど、そこそこやれそう。特にjsのライブラリが気持ち悪くて(褒めてる)、サーバーサイドのデータをいじるとフロントエンドの値も変更してくれる(逆もやってくれる)すごい世界観だった

ミドルウェア

  • 趣味でelasticsearchを触っていたが、データをbulk insertしてkibanaで検索くらいしかやっていなかったので、仕事でやるには知るべきことが色々ある
  • kibanaが内部でやってくれているクエリーの構築を自分でやらないといけないが、同じように見えること(実は違う)で色々やり方があったり、思った方法だと検索に引っかからなかったりする
  • 同僚のid:shiba_yu36さんが最近elasticsearchを勉強されているようなので、後追いしたい

その他気になり事

  • scalaも勉強しないといけないけど、本を読んだくらいであんまり進んでない
    • 前に勉強したhaskellのこととかclojureの知識はscalaをやる際にもかなり役に立ちそうだなという感じだった
  • 最近論文が読めていないので、社内論文読み会を開いて強制的に機会を作りたい

朝会スピーチでオリンピックの卓球を紹介しました

卓球

はてなではリリース機能改善・周知等を社員で共有する朝会が毎日あります。朝会の中で毎日誰かが自分の好きなことについて3分スピーチをするという文化があります。今日は私が担当だったので、オリンピックでさらに熱いことになっている卓球の魅力について話しました。3分しかないので軽く原稿書いたのですが、せっかくなのでブログにも投稿してみます(スピーチで話す前提で書いているので文だと魅力が伝わらないかもしれない...)。

おはようございます。5Gでwebアプリケーションエンジニアをやっていますid:syou6162です。専門は自然言語処理ですが、今日は今が旬のオリンピック、中でも特に熱い卓球の魅力について話をしたいと思います。色々話したいことはあるんですが、朝会なのでポイントを絞って三つ紹介します。

1: ラリーがダイナミック

まず一つ目の魅力はラリーがダイナミックであるということです。卓球台、全く見たことない人はいないと思いますが、サイズとしては大体長さ2.7m、幅1.5mという縦長の机くらいのサイズ感で、温泉卓球をイメージされる方が多いんじゃないかと思います。ですが、競技としての卓球は(台ではなくて)コートのサイズとしては7m×14mもありまして、バトミントンのコートくらいのイメージです。下の動画を見てもらえばわかりますが、特に男子の試合は中陣後陣に下がってドライブを打ち合う試合が近年特に多くなっていまして、ラリーが何本も続くと観客もヒートアップしてきます。


Tribute to Ma Long - The World Number 1

2: ボールの回転を生かしたプレイスタイルが多彩

二つ目の魅力はプレイスタイルが多彩という点です。卓球が他のボールスポーツと大きく違う特徴として、ボールの回転量が多く、プロ選手だと秒間120回転くらいさせるようなスピンの効いたボールを打てます。回転も上回転だけでなく、下回転あるいは全く回転のかかっていないナックルボールなど様々です。こういったボールの様々な回転により、卓球では様々なプレイスタイルがあり、これも卓球を面白くする大きな要因です。

例えば日本の福原愛選手、卓球台の前についての速攻も得意ですが、ラケットの裏面が表ソフトと呼ばれるラバーを使っていて、相手のドライブをナックルボールにして返球するのが得意です。ナックルボールはボールが伸びてこないため、左右の動きだけでなく前後への厳しい動きも要求されます。ついてこれなくなった相手を今度はスマッシュでトドメを刺すといった具合です。

攻撃型だけでなく守備が得意なカットというプレイスタイルもあります(僕もこのスタイルです)。カットは台から下がって相手の攻撃を主に下回転で返してしのぐというプレイスタイルです。カットはドMだから打たれるのが好きというわけではなく、相手の攻撃を、回転やリズムの変化(すごく下回転のかかったカット、全然下回転のかかっていないカット、横回転のカット、時には上回転で攻撃を混ぜるたり、前陣に出てきてブロック)をつけることでミスを誘うというプレイスタイルです。

プレイスタイルとしては両ハンド攻撃型の選手がメジャーではありますが、選手の個性が強く出る様々なプレイスタイルがあるのも卓球の大きな魅力の一つです。

3: 日本が強い!!!

すごい技術を見せてくれる選手の試合はいつ見てもいいものではありますが、オリンピックということで、みなさんも自分の国の選手が活躍していると胸が熱くなってくるものがあるんじゃないかと思います。そんな皆さんに朗報です!!!リオオリンピック、卓球日本が大活躍しています。すでに終わってしまった個人戦でも

  • 水谷: 男子個人銅メダル
  • 福原: 女子個人4位
  • 丹羽: 男子8位入賞

という活躍ぶりです。中学のときからオリンピックの卓球の試合を眺めていますが、こんなに活躍したオリンピックはこれまでないです。そろそろみなさんも卓球の試合が見たくなってうずうずしてきた頃かと思いますが、オリンピックの卓球はクライマックスに近づいて観戦には最高の時期です。

  • 男子準決勝: 火曜3時(3-1でドイツに勝利!!!)
  • 女子3位決定戦(日本vsシンガポール): 火曜23時
  • 男子3位決定戦(ドイツvsおそらく韓国): 水曜23時
  • 男子決勝戦(日本vsおそらく中国): 木曜7:30

四年後は東京オリンピックですし、今晩からテレビを見てジワジワと盛り上がっていきましょう。以上です。

Supervisorでプロセスをデーモン化(環境変数の設定問題)

Supervisor direnv zsh

30分くらい書いていたやつが消えてしまったので、簡単にまとめる...。

自宅macで管理しているjenkinsやirc bot(ikachan)の死活管理を簡単にしたい。今は調子が悪くなっていないか死んでいないかをmackerelで監視しているが、そもそも死んだら再起動して欲しい。その用途に適したSupervisorというツールを入れてみた。設定はほとんど以下の通り。

これで大体解決なのだが、Supervisorはシェルの環境変数を見てくれないので、設定ファイル毎に書く必要がある。私の場合はdirenvでPATHを含む環境変数を整理するようにしているため、direnvとSupervisorの設定ファイルで環境変数を管理することになると面倒だし、地獄でしかない*1

色々試行錯誤した末、割と簡単にうまく行ったのでメモしておく。commandのところがミソ。

[program:jenkins]
command=zsh -c 'direnv exec . java -jar jenkins.war'
directory=%(ENV_HOME)s/Downloads
user=yasuhisa
numprocs=1
stdout_logfile=/tmp/jenkins_out.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=3
stderr_logfile=/tmp/jenkins_err.log
stderr_logfile_maxbytes=10MB
stderr_logfile_backups=3
autostart=true
autorestart=true

zsh -c 'cmd...'.zshenvから環境変数を読んでcmdを実行するやり方。これでPATHが通ってdirenvが見えるようになる。direnv exec .はdirenvに設定している環境変数を今のプロセス(?)でも設定した上でコマンドを実行するやり方。二重になっていて冗長っぽいが、今までのやり方を大きく変えなくてよさそうなので、これでひとまず運用してみる。

*1:特にjenkinsに関連しているジョブは環境変数から色々読ませている

最近の図書館を体験してきた

日記

会社の方が先日の朝会で最近の図書館を紹介されていて、よさそうと思ったので会社の最寄りの図書館に行ってみました。図書館、高校のときの受験勉強や大学の資料調べで使ってたくらいで、かなり久しぶりな印象。

感想

最初に簡単にまとめておくと、webでしゅっと予約して図書館には取りに行く&返却だけ、という使い方をする人にはよさそう。はてなの社員には結構合いそうな気がする?

  • 「こどもみらい館子育て図書館」ということで新書などは図書館には物理的には置いてない
    • 絵本とか育児関係の本が多い
  • お子さんがかけまわっているので、ここで作業とか勉強は向いてない(しスペースは少なめ)
  • Webで連携しているので、京都市内の図書館のどこかにあれば取り寄せてくれる
  • 休館日の関係でもう少し時間がかかることもあるかもしれないが、2-3日くらいで貸出可能のstatusになった
    • 結構早い
    • あと、amazonと違って自宅にダンボール溜らないのはいいですね...?
  • 開館時間が午前9時30分~午後8時30分

    • 出社する前や就業後ちょっと仕事しても余裕で間に合う時間までやっていてすごくよい
    • 地元の図書館は19時には閉まってたから就業後取りに行けるとは思っていなかった
  • あまりマニアックな専門書はなさそうだが(こちらは会社で購入してもらえばよいという話ではある)、それなりに色々あった。今回は試しに以下の本を借りてみた

    • 初心者のための「文学」
    • BORN TO RUN走るために生まれた
      • 先月全然走ってねぇ...
    • シグナル&ノイズ
    • 京都の路地裏

Improving sentence compression by learning to predict gazeを読んだ

論文 NLP

NAACL2016 shortのベストペーパー。雑に読んだ。

  • 要約の一タスクである文短縮のタスクに視線(gaze)を予測する補助タスクを組込むとよくなったよ、という内容
  • 一種のmulti-task learning(多段の双方向LSTMでやる)
  • CCG-supertagging(ディフォルトで入れてる)も一緒に解いてる
    • gazeのfeature(2種類ある)を変えたらどうなるかを実験している
  • 結果としては入れるとstate-of-the-artと同じかデータセットによってはよい結果になるらしい
    • 難しいデータセットほどgazeの情報が効くとか

モデル

bi-directionalのLSTMを多段に積んでる(3層)。最終的に解きたい文短縮するかどうか(y)以外にも、補助タスクとして

  • gaze
    • この分野でよく知られている(らしい)first pass durationとregression durationの2種類を使い分けている。両方放り込むとどうなるんだろう
  • ccg-tags
    • 文法的にこの単語は削除して大丈夫かというのを入れたいけど、constituent treeはLSTMに直接入れにくいからccgにしたんだろうかとか雑に予想した

の2種類を各層に組み込んで学習している。補助タスクとして組み込むときはこういうやり方をするのかー。

実験

  • 学習に使っているデータの種類が大分違うから比較が難しいけど、例えばGOOGLEデータだとstate-of-the-artと同じくらい出ている
    • けど、比較の表には載っていない
    • gazeの素性の有効性が言いたいからそれでいいってことなのかな
  • CCGはディフォルトで全てのモデルに入ってるけど、これはCCGを入れないと文短縮のモデルとしては機能しないってことか?
  • 難しいデータセットほどgazeの情報が効いてbaselineとの差が広がるみたい

はてな社内の勉強会で構造学習について発表しました

NLP 深層学習 機械学習

先週末、はてな社内の勉強会で構造学習、特に実装が簡単な構造化パーセプトロンについて発表しました。発表資料と説明用にサンプルで書いたPerlの品詞タグ付けのコードへのリンクを張っておきます。

「えっ、Perlかよ」という人がいるといけないので、Clojureで構造化パーセプトロンを使った係り受け解析のサンプルコードへのリンクも張っておきます(2種類あります)。PerlもClojureもあれば8割くらいの人はカバーできそうなので、安心ですね。

以下、深層学習の大バーゲン中になぜいまさら構造化パーセプトロンを紹介したいかをはてなのエンジニア向けに説明したポエムです。長いので要約すると

  • 世の中、深層学習が流行ってるけど、(はてなが現在やっている領域で)深層学習じゃないとできないっていう技術はほとんどない
  • 深層学習よりよっぽど簡単に実装できて、色々な問題に応用できる構造化パーセプトロンっていうのを紹介したい
  • これまで機械学習になじみがなかった人も構造化パーセプトロンを使って、新しくて面白いサービスや機能作っていきましょう!!!

という感じです。エンジニアとしての幅を広げるために深層学習を勉強するんだ、って思ってる人は止めません(むしろ僕に教えてください)。

続きを読む