2019年GWに読んだ本

とりあえずざっと読んだ程度で、細かくは読んでいません。内容の理解が間違っている可能性がありますのでご注意ください。


高次元の統計学 (統計学One Point 11)

高次元の統計学 (統計学One Point 11)

d次元のデータについて標本数nのとき、従来は n >> d を仮定していたが、この本では d >> n を仮定しています。
例えば10000次元のデータでサンプル数100とかのケース。
これを分析するのに、標本共分散行列ではなく双対標本共分散行列というのを使うというのがメインの手法です。
d x d 次元の標本共分散行列の固有値固有ベクトルを、 n x n 次元の双対標本共分散行列の固有値固有ベクトルから計算できるということを最初に紹介しています。

従来のPCAは本書で書かれているようなデータには適用できないので、本書ではノイズ掃き出し法(ベクトルの各次元のパラメータが互いに独立)とクロスデータ行列法(互いに独立と仮定できない場合)という2つの手法を紹介しています。
高次元ベクトルにおける平均ベクトルの推定も説明されています。さらに、高次元データに対する二値分類の方法も紹介しています。
私の扱うデータではこの手法を活かせる機会がかなり多そうなので、どこかで試してみようと思いました。


全くの初学者向けなのに、Dockerでコンテナ起動するとこから始めるし、チャットボットのアプリをローンチするためにテキスト解析回り(MeCabとか正規表現とか)をやったりWebアプリを作るためにDjangoJQueryに触ったりと、意図してたくさんのライブラリやツールに触れさせる作りになっていて、なかなかおもしろい本でした。
とはいえ自分は初学者ではないので、誰かこれからPython始めたいという人でこの本を読んだ人の感想を聞いてみたいものです。


統計解析が主体で、機械学習等の流行りの技術の話はあまり出てこないですが、従来の商品売買の分析ではなくサービスの分析というところに主体を置いて概要を説明するというスタンスの本なので、切り口が違って面白いです。
アンケート結果からの統計解析から始まり、6章ではベイジアンネットワーク分析を紹介しています。
全くの初学者向けの入門書ではなく、既に他分野である程度の知識がある人向けの入門書になっていて、内容はそこそこ高度な割に、実際に使えるようなテクニックが書いているわけじゃないので、人によっては役に立たない本って判断するような書籍かもしれないです。
内容的には「きちんとした、サービスデータの解析についての有料まとめブログ記事」に近い感じです。

私の場合、まさにこの分野の解析手法について知りたかったのでとても有益な本と感じました。


人気の本だけあって、非常にわかりやすいいい本でした。
グラフの使い方とかも書いてあるのでダッシュボード作成とかの参考にもなりそうです。


ペーパープロトタイピング 最適なユーザインタフェースを効率よくデザインする

ペーパープロトタイピング 最適なユーザインタフェースを効率よくデザインする

これを真面目に実践しようと思うと、想像以上に手間がかかって、簡単なデモアプリとかだと、この手間より普通にアプリ作った方が早そうな気がしてきます。
とはいえ、手法としてはとても面白いので、どこかで試してみたいです。

今年はラグビーワールドカップもあるということで、読んでみたラグビー漫画。手にとってから初めて、「ここから今は倫理です。」と同じ作者の作品だと気づきました。

「ここから今は倫理です。」は、独特な雰囲気の教師漫画でしたが、ALL OUT!!は正統派のスポーツ漫画。絵にクセはあるので好みは分かれるでしょうが、この作者の勢いのある表現は私はとても好きですね。

面白いなと思ったのは、コーチや教師目線のエピソードが結構散りばめられていることです。自分も年なのか、こういう高校生のスポーツものを見ると保護者視点で見るようになってきて、そういう自分にはこの視点はとても興味深く感じました。

なので、個人的に一番好きなエピソードは、8巻のコーチ・顧問による飲み会の回ですね。

指導者は常に、子供を驚かせる張本人じゃなきゃならない。……突然、海に連れてったりしなさい。突然、相撲させなさい。もちろん明確な意図を伝えてね。"この人についていけば、なにか起きるかも"って思うだけで、意外とみんなついてきてくれるもんですよ。
(ALL OUT!! 8巻 p159-161


17歳の日本人の少年を主人公にした、アイスランドでの生活と人々とのやりとりを描く漫画。一応ストーリーがあったり、主人公の少年が機械の心を読み取れる超能力者だったりしますが、メインはなんといってもアイスランドの紹介で、とてもいい観光漫画です。

データサイエンスレガシーコード

Repro Tech Meetup #7 にて、「データサイエンスレガシーコードに立ち向かう」というタイトルで講演しました。



データサイエンティスト全てというわけではありませんが、データサイエンスのコードは試行錯誤の連続であり、様々な手法を連続して試すことを考えると、最初からきちんとテストを書いた保守性の高いコードを書く、というのはそう簡単ではありません。

しかし、そうした試行錯誤を経て出来上がったデータサイエンスのコードを、「動いているから」という理由でそのまま実戦投入していくケースを目にしたことある人はいるのではないでしょうか。

このような状況に直面したとき、私が思い出したのは、10年前の、あるプロジェクトのことでした。


当時の私はある社内システムの開発に携わったのですが、既存コードには一切テストがなく、かなりの分量の改修が必要で、そして期日が迫っている、という状況でした。

このとき私のバイブルとして助けになったのが、「レガシーコード改善ガイド」でした。


レガシーコード改善ガイド (Object Oriented SELECTION)

レガシーコード改善ガイド (Object Oriented SELECTION)


まさか10年経ってからこの本を再び開くことになるとは思いませんでした。しかし、そこに書かれている内容は、まさに今の私にとって役に立つ内容ばかりでした。


この本の冒頭には、以下の一文が記されています。

レガシーコードとは、単にテストのないコードです

この一文を読んで、私は「データサイエンスレガシーコード」という言葉を思いつきました。


データサイエンティストの考えたモデルがもし本当に有用であれば、コードはきちんと整備され、あるいは書き直されることになるでしょう。しかし、そうなる前の段階、つまり、データサイエンティストの頭の中から一歩踏み出した状態は、保守性の低い、レガシーコード同様となっていることが多いでしょう。このようなときに、この古い書籍は大変役に立ちます。


とはいえ、この本で取り上げている例やツールは現代から見ればかなり古く、また、コードもJavaC/C++で書かれているため、私が使うPythonの世界にはそのままでは適用できません。

Pythonでテストを書くための本として、テスト駆動Pythonがあります。この本は2018年に出たばかりの新しい本であり、内容もわかりやすく、Pythonでテストを書くのに慣れていない人にとってはかなり有益な本でしょう。


テスト駆動Python

テスト駆動Python


ソフトウェアエンジニアと違い、短期間のうちに様々な小さいコードを実装しなければいけないソリューリョンアーキテクト(あるいは、プリ・ポスト含む全てのフィールドエンジニア)がよく口にするのは、「テストなんて書いている時間がない」というものですが、テストを書けば、バグ探しや確認作業のための工数が減り、改修作業のときの手戻りを減らし、同僚や他プロジェクトで自分が書いたコードが再利用されるときに発生する質問や支援依頼もぐっと減り、その結果、自分の時間を大きく節約することができます。なので、私は小さなコードであってもなるべくテストは書くべきと考えています。


テストを忌避する理由として考えられるのは、推測ですが、「テストが品質向上のためのものであり、テストを書くには分岐網羅などを全て行った、カバレッジの高いものにしなければいけない」という考えがあるからでは、と思っています。私は、特にソリューションアーキテクトのような立場でコードを書く場合のテストは、単に確認作業の自動化くらいの意味合いで考えれば問題ないと考えています。普段自分が実行しているコマンドや作業を自動化するというくらいの軽い気持ちでテストを書くだけで、必要最低限のテストでの保護は可能となります。そしてそのためのテストコードは数行で書くことができます。


新しいアイデア、素晴らしい機械学習モデル、こうしたものを作ることそのものは確かに誰にもできないことであり、その業績は褒められるべきものです。しかし、せっかくのその傑作を素早く広めていくには、保守性の向上は常に考える必要があります。そのためにも、テストがないコードにテストをかぶせていく手法を学ぶのはとても有益と考えています。


テストの話とは外れますが、こうした発想がソリューションアーキテクトという仕事において有益である、という話を、4/24(水) 開催の SA Night #1 で少しだけ触れますので、興味がある人は是非ご参加ください。

健全な危機感と過剰な成功体験の危険性

先日、あるお客様を訪問しました。そのお客様はかなり先進的な企業で、社員の方達の能力も高く、企業の業績も大変良好なのですが、そのお客様はとても印象深い一言をおっしゃっていました。

「確かに我々は日本では先進的だと言われているようだが、グローバルの企業に比べれば足元にも及ばない。なんとかしないといけない」

この言葉に、私は非常に驚きました。今まで多くの優れた企業の方とお会いしてきましたが、トップ企業の方で、社員レベルでここまでの危機意識を徹底されている会社は多くありません。

もう10年ほど前になりますが、大学のある先輩がある企業に就職した後、一度会う機会があって、そのときに聞いた話を思い出しました。その先輩が勤めている企業は、日本を代表する有名な企業でしたが、デジタル化の波に飲まれて主要事業が急激に縮小するも、新しい事業を次々に創出して生存に成功した企業でした。その先輩と話をしたのは、ちょうどその業績回復で話題になっていた頃でしたが、そのときその先輩はこのような話をしていました。

「とにかく危機感がすごい。誰一人として、このままでいいとか思っていない。新しいことはすぐに始めるし、自分みたいな若手にも仕事はバンバン任せてくれる」

多くの会社では、社内外に向けて鼓舞するようなメッセージを発信します。自分たちはすごい、自分たちはできる、自分たちは偉大だ、といったようなメッセージです。当然ながら、会社というのは常に様々な危機や試練がつきまとうので、士気の向上のために、こうしたメッセージは重要と思います。

では、もし本当にうまくいってしまったら、その後はどうなるのでしょう?自分たちはすごい、ということを本当に証明してしまったら?私はここに一つの落とし穴があるのではと考えました。成功体験に基づく自尊心は、その後の失敗に対して正常に対処できなくなるのでは、と、ふと思いました。

もちろんこれも難しい話で、危機感を煽るばかりだと、「この会社本当にヤバイんじゃないか」と勘違いする人が出てきて、退職者が続出したり、いい人材を採用できなかったり、株価に影響を与えたり、と、ネガティブな効果ももちろん少なくないでしょう。しかし、健全な危機感を抱き続けるというのは、特に予定通りに計画が進まなかった場合に問題解決に柔軟になれるのではないか、と思いました。

では、どうすれば健全な危機感を抱き続けることができるのでしょう?一つは、適切な高いゴールを決めることではないかと思います。ハードルが低すぎては成功体験が過剰になってしまい、ハードルが高すぎては誰も真面目にそのゴール達成を考えなくなるでしょう。しかし、ゴール設定だけでは健全な危機感を持つというのは難しそうな気がします。そもそも、健全な危機感とはどのようなものか、まずこの定義を明確にする必要があるでしょう。いずれにせよ、まだ自分の中で答えの出ていない話です。

関連書籍

こうした、失敗から学ぶという書籍は何冊か読んだことがあります。そのうちの一冊、「名経営者が、なぜ失敗するのか?」は面白い本ではありますが、あくまで経営者視点の話で、現場の意識のような話には言及していません。

国家の失敗というテーマで有名な書籍としては、「失敗の本質」や「大国の興亡」がありますが、いずれも組織論、あるいは大組織に関連する機能についての言及が主体で、やはり現場の意識という観点ではあまり言及はされておりません。(いずれも名著なので本件とは別に読む価値はあります)

転職エージェントの活用法

この記事は pyspa Advent Calendar 2018の10日目の記事です。前日は
放送大学と調べ物と私 - rokujyouhitoma's blog
でした。

私がClouderaを退職し、Luminoso Technologies(日本法人名: ルミノソジャパン合同会社)に転職したことは既に書いた通りですが、この転職は転職エージェントのヘッドハンター経由で行ったものでした。

外資系IT企業のヘッドハンターと言えば、スパムのようにメールを送ってきたり、名前を間違えたり、職場にいきなり電話してきたりと悪評は留まるところを知りませんが、今回利用させていただいた中で活用のメリットというのが見えてきたので、私のエピソードとともに共有します。

ヘッドハンターを活用した転職エピソード

ClouderaがIPOした後、会社としては一区切りもついたことだし、現状に不満は特になかったものの、その先のことも考えなければと思い、面白そうな仕事や技術のトレンドなどをゆっくりと探していました。そんな中、あるヘッドハンターからのメールが目に止まりました。

大半のヘッドハンターが大企業の案件を紹介してくる中、そのヘッドハンターだけは見たことも聞いたこともない企業名を挙げてきました。しかも、北米のスタートアップと書いています。興味が湧いたので、会ってみることにしました。

そのスタートアップ自体は話を聞く限りあまり興味の引かれる案件ではなかったものの、そのヘッドハンターは、海外のスタートアップの案件を持っているそうなので、ものは試しにと思い、好き勝手な条件をつけて、この条件を満たした企業があったら話を持ってきてください、とお願いしました。
主な条件は以下の通りです。

  • 自然言語処理に関係があること
  • botに関係があること
  • 立ち上げ、あるいはそれに準ずるフェーズであること
  • 勤務地は東京であること

もともとpyspaの中で俳句botというものを作っていた関係もあり自然言語処理botの世界にはとても興味を持っていました。しかし、自分の知る限りではこの二つを結びつけてビジネスを成功させている企業は一社もなく、とても仕事になるとは思っていませんでしたが、せっかくなので自分のやりたいことを現実性度外視でぶつけてみることにしました。上記以外にも給与等の様々な条件をつけましたが、正直そのヘッドハンターがその条件に合致した案件を持ってくることはあまり期待しておらず、当たればラッキーくらいの軽い気持ちで条件を提示していました。

それから一年後、そんな話をすっかり忘れていた私の元に、一通のメールが届きました。読むと、その会社は自然言語処理に関係があり、botに関係があり、日本での立ち上げメンバーを探している、ということでした。私が提示した条件にほぼ合致していた案件を、そのヘッドハンターは持ってきたのです。

私もこちらが出した条件を満たした案件を持ってきてもらった以上、会わないのでは義理が立たないので、とりあえず会ってみることにしました。

以上が、私が Luminoso と出会った経緯となります。

(余談になりますが、Luminosoはあくまでデータソースの一つとしてchatbotを扱えるというだけで、別にbotの会社ではありませんでした)

ヘッドハンターの活用についての教訓

今回わかったこととしては、未知の業界や未知の分野、未知の職種・職位など、自分が行ってみたいもののツテも何もない、という場合にヘッドハンターを活用することには大きな意味があるということです。ヘッドハンターなしには、私はLuminosoという会社を知ることすらなかったでしょう。
一方、もし既存の技術や職種の延長上での仕事を探したり、よく知った人物と一緒に仕事したいなど、既知の領域での転職を考えているのであれば、ヘッドハンターの活用はあまり有効ではないでしょう。そもそも、全く知らない会社に転職するというのは大きなリスクを伴うものです。私のように、よほど未知の世界に興味がない限りは特に使う必要もないと思います。
また、今すぐにでも転職したい・しなければならない場合などは、一見ヘッドハンター経由だとすぐに仕事見つかりそうな気もしますが、上記の通り全く知人のいない会社への転職はリスクがある上に、転職への焦りからつまらない仕事を選んでしまう可能性もあるため、私としてはあまりおすすめはしません。余裕のあるときに会っておくのが一番いいと思います。

ヘッドハンターの活用法

これはすごく簡単で、以下の3つを実施するだけです。

  • 会って話する
  • 自分の要望を好き勝手に告げておく
  • 放置する

先述の通り、なるべく余裕のあるときに実施しておいた方がいいです。本当にいい案件が来たときだけ話を聞けばよく、そうでなければ普通に現職の業務を続ければいいからです。
要望については、「5000兆円ほしい」でもなんでもいいので、とにかく好き勝手言っといて問題ないです。条件に合致しなければ放置されるだけだし、デメリットは一切ありません。

おまけ: ヘッドハンターとスパムメール

「ヘッドハンターからのメールってテンプレで大量に投げたり、たまに名前間違えて投げてきたりするじゃないですか?あれほとんどの人がスパムフラグ立てて読んでもいないから、もうちょっと丁寧に投げた方がいいと思いますよ」

という話をしたらとても驚いていて、そんな風に扱われているとは知らなかったとショックを受けていました。普段からたくさんの案件を同時並行でやる傍ら大量のメールを送っていて、自分でもそうした問題に悩んでいたのですが、さすがにスパム扱いは衝撃だったようです。

今回の転職活動の中でヘッドハンターの仕事というのも知ることができたし、何より担当したヘッドハンターは素晴らしく協力的で大変助かったという恩もあるので、今後はスパム扱いするのは少し控えようと思いました。

……が。


全てのヘッドハンターのメールからスパムフラグを外すのはまだ当分先の話になりそうです。


pyspa Advent Calendar 2018、明日は taichi です。

ルミノソジャパン合同会社に転職しました

2018年12月3日付で、Luminoso Technologies Inc. の日本法人である、ルミノソジャパン合同会社のソリューションアーキテクトとして勤務を開始しました。

この会社は、自然言語理解のためのMITスピンアウトのスタートアップです。まだ全世界で数十名しかおらず、日本では私と代表の2名のみの会社です。

Luminosoを使うことで、お客様のお問い合わせ記録のテキストからお客様の声を抽出したり、口コミなどの解析から迅速な製品の改善に繋げることが可能になります。

これだけ聞くとあまり目新しくないように見えますが、Luminosoの特長としては、こうした結果を、辞書も不要で、かつ少量のデータだけで実現できるということです。NLPの本番導入の大きな壁の一つであった、辞書管理やデータ管理をスキップすることで、導入コストと時間を大幅に削減することができます。

詳細については以下のページをご覧ください。

プレスリリース: https://www.atpress.ne.jp/news/159774
日本語webサイト: https://www.luminoso.jp/

では、なぜこの会社に入社することに決めたのかを説明します。

もう一度ゼロからスタートする

7年半前に入社したClouderaも、入社当初は70人ほどの会社で、日本はまだオフィスすらない状況でした。それから大きくなっていくに従い、会社の規模だけでなく製品の機能や、会社としてできることの数が大きく増えていきました。それはそれで楽しいことでしたが、同時に「このまま成功の波に乗り続けるだけでいいのか」とも考えていました。自分はたまたま運がよかっただけでであり、その幸運の上にあぐらをかいていていいのか、と考えました。そこで、リセットしてもう一度最初から始めてみることにしました。

会社の規模が小さいというだけではありません。自分がNEC時代から含めて8年半以上学んできたHadoopエコシステムの知識や経験も置いてきました。Luminosoでは一切Hadoopは用いていません。その代わりに、これからは自然言語処理の技術を学んでいくことになります。

もともと自然言語処理に興味があり、既に何冊かの本を読んで学んだとはいえ、この分野ではまだ素人同然です。Cloudera時代のように専門家気取りでえらそうなことを話せば、真の専門家達から袋叩きにされることでしょう。初心にかえって、一から勉強し直します。

また、技術だけでなく、自分の築き上げた人脈も置いていきます。通常、外資系の転職の場合、会社が変わっても人間関係を全部変えることは非常に稀で、一般的な日本企業よりも長期にわたって「仲間うち」で仕事する人も多いです。こうした人のつながりも置いてきました。Luminosoには、少なくともLinkedInで調べた限り、元Clouderaの人間は一人もいません。全員が初対面です。

このように、会社規模、技術と経験、人間関係、全てをゼロに戻して最初からスタートすることにしたのが今回の転職です。

データ基盤からデータ活用サイドへ

データ基盤は十分に普及したものの、データの活用方法について悩んでいるというお客様を前職では数多くみてきました。そこで、次はデータを活用する側にとって役立つようなことがしたいと常々考えていました。Luminosoは、データ基盤ではなく、データを活用する側の技術ですので、私のやりたい方向性と合致していました。

オープンソースからオープンデータへ

Luminosoは、もう一つ大きな特徴があります。ConceptNet というオープンデータをメンテナンスし、これをコアコンポーネントとしていることです。

http://conceptnet.io/

10年以上オープンソースで仕事をしてきて、オープンソースビジネスというものの将来性については十分に理解をしていたものの、オープンデータを核として成功した企業というのは聞いたことがありませんでした。これが、私がLuminosoに興味を抱いたもうひとつの理由です。

未来は誰にもわからない

この会社が成功するかどうか、私にはわかりません。入社して早々に買収されるかもしれないし、突然大企業が競合製品を発表して息の根を止めにかかってくるかもしれません。私自身ももしかしたら半年後にクビになるかもしれません。でも、だからこそ挑戦してみたいと思いました。一年後どうなっているか予想できる仕事より、一年後どうなっているのか全くわからない方が、自分には合っています。

まずは第一日目が終わりました。これから自分がどうなっていくのか、本当に楽しみです!

Clouderaを退職しました

2018年11月30日(金)は、Cloudera株式会社への最終出社日でした。2011年4月1日に入社したので、勤続日数は2800日でした。


f:id:shiumachi:20181130102447j:plain
Clouderaオフィス2011年



f:id:shiumachi:20181130102256j:plain
Cloudera Japan オフィス 2012年




日本にオフィスも同僚もいない状態からのスタートでしたが、今日、多くの同僚たちに見送られる形で会社を出ることができました。

退職するときは、最後の一人として会社を去るか、自分がいなくても会社が回るようになったときか、そのどちらかにしよう、と決めていました。皆が退職することを惜しんでくれましたが、私がいなくても会社は問題なく続いていくでしょう。私が理想とする結末にたどり着くことができて、本当に嬉しいです。

7年前、ごく一部の人しか知らなかったHadoopは、今や多くの人が知るソフトとなり、Hadoopに限らず、様々なデータ基盤を活用することが当たり前の時代となりました。

この先もきっと、データ基盤の業界は伸びていくことでしょう。そしてClouderaもその中心を担う存在であり続けると信じています。

Clouderaは最高の会社です。この会社で働くことができて、本当に幸せでした。最高のチームとも出会えました。皆と一緒に仕事できなくなるのは本当に寂しいですが、自分の行く道を信じて、新しい旅に出ることにします。

週明けからはまた新たな仕事が始まります。どのような仕事をするのかは次の記事で書くことにしましょう。


f:id:shiumachi:20181115210634j:plain
Cloudera Japan オフィス入り口 2018年

2018年冬休み: 自然言語処理の本5冊読んだ

自然言語処理の本を5冊ほど読みました。


自然言語処理の基本と技術

自然言語処理の基本と技術

自然言語処理の技術概要から、ユースケースの紹介まで、この分野における基本的な内容をざっと押さえることができました。
数式や技術的に難解な話はなく、さっと読める本でした。
最初のとっかかりとしてとてもいい本です。
非技術者や、少しだけこの分野をかじっておきたい別分野の技術者ならこれ一冊読めば十分かと思います。


自然言語処理 (放送大学教材)

自然言語処理 (放送大学教材)

こちらも入門レベルの本ですが、「自然言語処理の基本と技術」とは異なり、もう少し技術寄りに特化した内容です。
その代わり、扱う技術分野が幅広く、文字コード言語学分野の話も出てきて、どういう知識が必要なのかを理解するのに役立ちました。
この分野の基本的な知識インデックスを頭に入れたければ上記の本と合わせてこの本まで読めば十分だと思います。


言語処理のための機械学習入門 (自然言語処理シリーズ)

言語処理のための機械学習入門 (自然言語処理シリーズ)

数式も出てきて、実際に手を動かして学ぶ必要のある本です。先の2冊が概要の把握レベルの本であれば、こちらは技術書としての入門書になります。
この本の演習問題では「〜を作れ」といった記述しかなく、おそらく机上レベルでの作成を意図しているのでしょうが、今は scikit-learn という便利なツールがあるため、実際に手を動かしてモデルを作って試しながら読んでました。


入門 自然言語処理

入門 自然言語処理

NLTKは既に古いと chezou さんにアドバイスを受けたし、内容も前半部分はPythonの基礎の話や文字列処理やトークナイズの話(つまり、既に自分が理解済みの内容)だし、後半の話も他の書籍で読める内容の上、付録以外は英語ベースの話のため、私の今の興味から外れている内容でした。
ざっと目を通した程度です。
英語の解析をする必要が出てきたら読むかもしれません。


文脈解析- 述語項構造・照応・談話構造の解析 - (自然言語処理シリーズ)

文脈解析- 述語項構造・照応・談話構造の解析 - (自然言語処理シリーズ)

サブタイトルの通り、述語項構造、照応、談話構造の解析に特化した内容です。ほぼ読み物で、演習問題等もなく、これ一冊で何かできるというような内容ではないです。