2018-12-25

エンジニアキャリア15年のふりかえり

pyspa Advent Calendar 2018の25日目の記事です。

2018年は体を壊して停滞の年でした。タイピングで腕に痛みが生じる状態が続き、生産性はガタ落ちした上に通院に時間を取られて何もできませんでした。潔く今年の話題は諦めて、今までのソフトウェアエンジニアのキャリアを振りかえります。

1行で書くと大学で生物やってSIerに入って何回か転職して機械学習エンジニアです。

就職

2002年、私は研究の道に進む気は無く就職活動をしていました。就職氷河期*1と呼ばれた時期でさらに「理系なのに就職先が無い」と言われる生物学部生だったので学部不問の求人をあたっていました。さて、学部不問の新卒求人と言えばSIerです。あらゆる人材を受けいれているだけあってすんなり内定が出ました。インターネット界隈では常にDisられる存在ですが情報システム開発の現場に潜り込む機会を与えてくれた点には感謝しています。

SIer時代

ここでは受託の業務システム開発を経験しました。主にDBMSにOracleを使い、WebアプリケーションはJavaで書きました。バッチ処理はJavaかPL/SQLで書いてJP1から起動する構成が印象に残っています。プログラムを書く事もありましたが、パワーポイントの資料とエクセル方眼紙に仕様書を書く時間が長かったです。グローバル製造業のプロジェクトではバグが出ると世界中に存在する物流拠点の業務が止まってしまうため良い緊張感がありました。しかし自分でコードが書けないのはストレスだったので自社プロダクト開発をしている会社に転職しました。受託システムエンジニアからプロダクト開発エンジニアへの転職は難しいらしいですが、運が良かったのでしょう。転職活動は3ヶ月程度で済みました。

この頃休日に勉強していたのは簿記会計・データベース・Java・JavaScriptです。JavaScriptでDOMを弄る手法はDynamic HTMLと呼ばれていました。スキマ時間にNetscape4.7とIE6の両方で動くリッチな業務画面を試作しましたが、デバッグが難しすぎました。Adobe Flex*2やBiz/Browserといったリッチクライアント製品を採用するプロジェクトはあっても、JavaScriptでフロントエンドを構築するプロジェクトはありませんでした。とはいえWeb標準(HTML, CSS, JavaScript)でUIを洗練させる方向には大きな可能性があると感じたため、その後も情報を追いかけました。

ソフトウェアベンダー時代

2008年春にSIerを辞めた後、企業向けグループウェア製品やダッシュボード製品の開発をしました。
SaaS提供の業務システム開発に関った時は衝撃を受けました。唯一のバージョンが稼動し全ての顧客が同じ環境を利用するマルチテナント構成。これなら少人数開発でサービスが提供できて高い利益率が出せると。複数のバージョンの保守が必要で、顧客の動作環境にバグ修正パッチを当てるのに人件費がかかるインストール型ソフトウェアの開発経験をした直後だったので尚更です。しばらくしてWebフロント開発専業になり、ExtJSをUIコンポーネントに採用したダッシュボード製品をメンテナンスしていました。今で言うフロントエンドエンジニアです。

この頃は現代アートの展示活動をしている人達に混ざり展示用のインラクションも作っていました。制作にはC++でコードを書くopenFrameworksも使いましたが、Webブラウザを描画に利用するのが一番自分に向いていました。Web Worker, WebSocket, CSS3, WebGL が使えるようになり、Webブラウザの表現力は著しく向上していました。夢中になって新しくブラウザに実装された物を使うあまり、展示物はWebkitのナイトリービルドでしか動かない始末でしたが、展示用のマシンで動けば良かったので環境はどうとでもなりました。

インタラクション制作に使ったKinectコントローラーが面白くて本を書いたり勉強会の主催をしました。当時のインターネットはSSL/TLSが普及しておらずプレーンテキストが通信経路を流れていたため、公開のWifiを設置して通信内容を展示物に利用する事ができました。HTTPSがデフォルトの現代ではとても考えられない事です。

スマホアプリエンジニア時代

2011年からは現職VOYAGE GROUPです。最初はスマートフォンアプリの開発しました。クライアントサイドはHTML5とネイティブ両方の開発を経験しましたが、UX・開発効率共にネイティブに軍配が上がりました。JavaScriptが得意ならスマホアプリ開発もいけるだろうという幻想は砕かれたのです。結果的にこれは次の学びを促進する良い材料になりました。

2012と2013年は学びの年でした。Kinectのポーズ認識の論文*3で知った機械学習に興味を持ち、PRML*4読書会に参加したりCourseraの有名なMachine Learningコースを受講しました。同時に基礎力不足を痛感し、統計学・情報理論を学びます。ここではIPython Notebook(今のJupyter)を駆使しました、確率分布にしろ何にしろなるべく可視化して理解の助けとしていました。同時に社内のSICP*5輪読会でLISPとプログラミングの基礎をやりなおしました。

知り合いにPython使いが増えたため、APIサーバーをDjangoを使って構築したり、UI自動操作による業務自動化(今で言うRPA)をPythonとOpenCVで実装*6したりと自分が立ち上げメンバーのプロジェクトにPythonを採用していきました。

機械学習エンジニア時代

2015年にインターネット広告の事業部に異動になりデータ活用が命じられます。僥倖でした。具体的に何をやるかは任されていたのでデータ分析基盤構築とBIツールの導入から着手しました。BigQueryを使い始めたのはこの時です。驚いた事に使い慣れたPythonがこの領域のデファクトとなっていました。

この年は偶然Machine Learning Summer School Kyotoの開催年でこれに参加できたのは素晴しい経験になりました。凸最適化、確率集中不等式、劣モジュラ、システムのデプロイ、強化学習, etc.と様々なトピックに一気に晒される事で関連分野の認知範囲が広がりました。機械学習界隈の知り合いができたのも大きく、今でも付き合いがあります。

分析基盤が安定し、アプリケーションからデータが利用できる状態になった後は個別施策の開発です。一つは機械学習による予測処理を組み込んだ広告配信ロジックです。インターネット広告の分野は参考になる論文が多く、これに助けられました。クリック予測・コンバージョン予測・配信最適化・広告効果の推定, etc. 国際会議のKDDに参加して、インターネット広告業界のトッププレイヤーを目の当たりにし、彼らにいかに近づけるかも考えました。

また経済学出身の人が使いこなす因果推論に感銘を受けた結果、オライリーの『仕事ではじめる機械学習』の効果検証の章ができあがりました。

これから

これからやっていきたいのは決まっていて、オンライン凸最適化・ミクロ経済学・メカニズムデザインです。実務では予測をしたとして、予測値をどう使いたいかといえば何らかの指標の最大化です。しかしそれが売上なのか粗利なのか、他の指標なのかそもそも非自明だったりします。エンジニアの想定する最適化とビジネス設計にズレがあり、ビジネスサイドとの議論がかみあわない事もありました。この一貫性を保つにはミクロ経済学の切り口が有用な感触があります。同様に価格決定もインセンティブデザインと強く結びつく所なので理解を深めたい所です。

最適化は制約を厳密に満たせなくても動くオンライン設定が広告配信(Online Ad Allocation)にマッチする気がしています。

ここまで書くと運が良かっただけで生き残った感じがしますが、機械学習の分野は優秀な若者が次々と参入して来ます。特段の強みもなく子育ての片手間に働いているのでは早々に駆逐されるでしょう。まだまだ学び続ける必要があります。事業へのコミットはもちろんとして、成果を論文にして国際会議に通すのも数年以内に達成したいです。


------
*1: 1993-2005年の事を言うらしい via Wikipedia
*2: FlashベースのUIコンポーネント https://www.adobe.com/jp/products/flex.html
*3: Shotton, Jamie, et al. "Real-time human pose recognition in parts from single depth images." Computer Vision and Pattern Recognition (CVPR), 2011 IEEE Conference on. Ieee, 2011.
*4: パターン認識と機械学習
*5: 計算機プログラムの構造と解釈 第二版
*6: 相手にAPIが無くGUIを操作する必要があり、止むを得ず

このエントリーをはてなブックマークに追加

2018-11-15

IBIS2018に参加してきました

IBISは機械学習の理論寄りのワークショップです。今年で4回目の参加でした。
そして感想を書こうと思った矢先に次のyokoiさんのツイートが流れてきて完全に同意。
私はアプリケーション側の人間です。そして解きたい問題のサーベイをしても同じ設定の文献が見つからない事がよくある。サーベイの仕方が悪いのか、そもそも研究対象になっていないのか判断がしにくい。そこでIBISにいらっしゃる方々に話を振ってみるとスッと見た事のない文献を教えてもらえたり、それは研究テーマになりそうだね、と次に繋がったりするのが最高。

あとは目の前で寿司を食っている人が3年前からTwitterでフォローしていた人だとわかったりするのが面白い。

チュートリアル

山田先生の半教師付き学習におけるラベル無しデータの役割りの話はまさに疑問に思っていた所の解説。さらにMulti-Task Learningは業務で試したかったので丁度良いタイミング。後で既存実装はMatlab版があると教えていただけた、Python版の実装をするならMatlabの実装を使って答え合せができる。

https://github.com/jiayuzhou/MALSAR

Selective Inferenceは身に沁る話題だった。L1正則化で素性選択した機械学習モデルを日々運用していると、稀に誤った素性が選択されおかしな動作をして問いあわせが発生するので。LASSOに対する特徴選択バイアスの補正は計算可能との話なので、手元で試せたらやってみたいネタ。

「クエリ可能な確率的組合せ最適化問題」は不完全な情報下で最適化問題を解くにあたってどこの情報を探れば良いかを求める物。組合せのパフォーマンスが不明でコストをかけて情報を得ていく設定は実務でよくあるのでこの手の話は好き。しかし終盤は難しくて敗北しました。ただ自分のやりたい事に近くて、どの方向に行けばいいかの示唆が得られたのが大きかった。

企画セッション:離散構造処理

組合せパターンをグラフで表現して高速に演算する話。ZDD, BDDは全く知らない分野だったので聞けてよかった。そして問題構造にマッチしたら圧倒的に強い事がわかった。事例紹介に出てきた組合せパターンの数の60桁越え……。Pythonのライブラリもメンテナンスされており、今すぐに適用できる問題が近くに無いか探したくなる奴だ。

招待公演 Multi-armed bandits and Boundary Crossing Probabilities

容赦無くテクニカルな内容。バンディットアルゴリズムの理論については確率一致法やチェルノフ・ヘフディングの不等式で裾確率の上界を抑えるんでしょ程度の理解しか無かったのでついていけなかった……。ただ今の研究の雰囲気が知れたのは良かった。30年前に導かれた境界通過確率(Boundary crossing probabilities)を駆使しているのと、報酬の分布を一般化してK次元指数分布まで進んでいるっぽい。

まとめ

北海道の食を堪能できました。


このエントリーをはてなブックマークに追加

2018-10-30

KDD2018 アドテク関連レポートを書きました

職場のブログにKDD2018参加レポートを投稿しました。主にアドテク業界の人向けに書いてあります故、SSPやDSPといった用語の説明が無いのはご容赦ください。



このエントリーをはてなブックマークに追加

2018-10-21

何故予測が当たるだけではマズいのか、因果と機械学習

KDD2018の感想です。AdKDDやネット広告方面は職場のBlogに書くので、こちらは他の話を。今年は因果推論のチュートリアルが超満員だったり、予測モデルの差別、解釈性と説明性「interpretable and explainable machine learning models」が注目されたりと単に予測するのでは無く運用課題の話が増えたのが印象に残っています。

リスク予測とインセンティブデザイン


上の写真はDavid Hand氏による講演「Data Science for Financial Applications」の一場面です。自動車保険の保険料が女性に比べて男性が高い事に抵抗して行政上の性別を変更した男性*3の例が紹介されています (NEW YORK POSTの記事)。
事故を起す確率が高いと予測された顧客に高い保険料を課すのは自然なアイデアです。しかし事故発生確率と因果があるのは運転中のふるまいや走行時間であり、行政上の性別ではありません。運転中のふるまいを計測して保険料に反映していれば*1男性は安全運転をする事で低い保険料が得られました。相関はあるものの*2事故と因果の無い性別を利用して保険料を算出した事で、安全運転よりも性別を書き換える方にインセンティブが生まれてしまった例で興味深かったです。

Anti-Discrimination Learning

機械学習モデルによる差別の話。チュートリアルの一つに「Causal Modeling based Anti-Discrimination Learning」がありました。相関ベースの物は知っていたのですが、Causal Modelingベースの物は知りませんでした。同じ時間帯は因果推論のチュートリアルに参加していたのでこちらは後で資料を見ました。

From: Anti-discrimination Learning: From Association to Causation
Fairnessの文脈でローンの融資可否判定機はよく出てきますが、融資可否の判定で収入のみが "explainable" な効果と表現しています。人種・住所がデフォルト率に相関があるため貸し倒れリスクの計算には使えるが、人種・住所が原因で融資を拒否するモデルでは説明がつかないという例。ちなみに彼らの手法はprotected attributeを変えた時の結果への影響の差を利用して予測モデルに差別があるかどうかを検出するといった物でした。

予測が当たれば良いケース

Applied Data Science Trackの医療系セッションで緑内障診断のために網膜の厚さから視野感度を推定する事例*4が紹介されました。医療系では医師が予測モデルの出力を理解できるよう、説明性・解釈性が重要とよく説明されますが、そもそもメカニズム不明の疾病であれば相関を使って低コストで予測できる事に十分な意義があるんだなと感じました。

まとめ

機械学習予測モデルが様々な場面で利用されるようになったため、我々開発者はより注意深く要件を見極める必要があります。予測モデルの出力が何に使われるのか、その値が誰にどんな影響を与えるのか。予測が当たれば良いのか、因果関係が必要なのか、顧客への説明性が重要なのか。製造業では不具合の根本対策が求められるため、異常を検知できるだけの予測屋では不十分だと聞いた事があります。そういった現場ではモデルのinterpretabilityとセットでcausalがより求められるでしょう。
因果推論と機械学習の組合せは個人的に興味のあるトピックなので引き続き追っていきます。

注釈と参考文献

[1] 現在ではtelematicsと呼ばれる機器を利用して運転中のデータを保険会社に送るのが一般的なようです。これを装備しない場合は保険料が高くなる。

[2] 前提として機械学習では目的変数と相関のあるデータがあれば予測が可能になる。

[3] Man legally changes gender to get cheaper car insurance: report

[4] Estimating Glaucomatous Visual Sensitivity from Retinal Thickness by Using Pattern-Based Regularizat.



このエントリーをはてなブックマークに追加

2018-07-15

Machine Learning Casual Talks #5 でMLシステムの実装・運用について発表しました

ネット広告配信サービスのMLシステムをどのように作って運用しているかの話をしました。メルカリさんの発表が組織の課題を解決していく話になっているのに対して、私のは個人で好き勝手にやっていく話で非常にカジュアルだったと思います。チームの規模が違いますからね。

スライド: ネット広告配信サービスにおけるMLシステムの実装と運用 


発表の他には雑談で「GBDTの推論処理をWebサーバーに組みこむのはどうするのがいいか」なんて話が気軽にできたり、非常に楽しめました。 会場のメルカリ社は初訪問、人材のブラックホールなだけあって元同僚にも遭遇。関係無いけどメルカリ社からは、eBayが出してるような実験経済系の論文が出てくると面白いかなと期待しております。

このエントリーをはてなブックマークに追加