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

2020年3月24日(火)は、ルミノソジャパン合同会社への最終出社日でした。退職日は2020年4月5日(日)になります。2018年12月3日(月)に入社したので、勤続日数は490日でした。

転職時の記事はこちら
shiumachi.hatenablog.com



この会社での仕事はあまり表に書くことがなかったので、どんなことをやっていたのかを簡単に紹介します。

一応少しこの辺で触れていました。
shiumachi.hatenablog.com
shiumachi.hatenablog.com



夏頃までは、プリセールスとポストセールスを半々くらいで仕事していました。デモを作ったりプレゼン資料を作る一方で、構築作業や技術サポートなどをメインに仕事していました。

夏以降はほぼポストセールスに専念する形になり、開発にもかなりの時間を割いていました。(余談ですが、同時に在宅勤務となり、夏以降はほぼ出社していません)

大体以下のようなものを開発していました。

  • サービスAPIを活用した各種ツール
  • サービスが生成したモデルを使った各種デモアプリ(先述の記事参照)

開発は全部Pythonで行っていました。書いたコードの行数はトータルで2万行いかないくらいです。
(Webアプリのテンプレート等は未カウント)

この会社での目標として、「お客様にとって本当に必要なものを、自分の手で作る」というものがありましたが、最終的に1年がかりでお客様の要望を整理し、プロトタイプを作成し、本社にプレゼンし、会社として開発を進めていく方向に持っていくことができたので、一定の目標は達成できたと感じています。

作ったツールについても、VPoEと古参エンジニアに「この品質ならそのまま製品化できる」と言ってもらえたのが自分としてはとても嬉しい成果となりました。

反面、自然言語処理の技術・知識については、そもそも製品がベクトルモデルを作るものである以上、原理の理解以上の応用部分はあまり関与せず、スキルとしてはさほど上達しなかったので、目標達成とは言えませんでした。(少なくともNLPエンジニアと名乗れるレベルの知識・技術は獲得できていない)


4月6日(月)からはまた新たな仕事が始まります。どのような仕事をするのかは次の記事で書くことにしましょう。

明日からしばらく何するの?

情報交換も兼ねて、色々な人に会いたいと思っています。といっても、昨今の新型コロナウィルス流行の状況もあり、世間でもリモートワークが急速に浸透しているので、今回リモートで色々な人と情報交換しようと思っています。既に何人かアポを取らせていただいています。もし、「久々に話したい!」という方がいましたら、お気軽にご連絡ください。リモートでアポとるとかなり詰め込めるのでいくらでも余裕があります!

今年こそは自宅で運動を始めたい人のためのFreeleticsガイド(2020年版)

新年明けて、心機一転してまた運動を再開しよう、という人がちらほら周りに増えてきたので、私が使い続けているトレーニングアプリ Freeletics について紹介します。

Freeleticsは、ユーザにとって最適なトレーニングプランを提供してくれる、いわゆるAIパーソナルトレーナーアプリです。数分単位の短い時間にきついトレーニングをこなす、いわゆる高強度インターバルトレーニング (HIIT) をベースにしています。

Freeleticsは、

  • 自宅でできる
  • 短時間
  • 自分だけのトレーニングメニューを作ってくれる

と、運動したいけど忙しい、という人に最適な特長を持っています。

このブログでも何度か紹介していますので、興味のある方は過去記事も読んでみてください。

shiumachi.hatenablog.com
shiumachi.hatenablog.com

購入方法

Freeleticsは有料のアプリです。年間1万円のサブスクリプションですが、Webから購入すると割引が効きます(今は30%)。アプリではなく、必ずブラウザから買いましょう。
3ヶ月プランや6ヶ月プランもあるので、続ける自信がないという人はこちらを購入してもいいです。14日間は返金に応じてくれるので、試しに買ってみて、合わなかったら返金しましょう。

食事アプリのNutritionやマインドフルネスアプリなどもついていますが、どちらも日本語対応していませんし、Trainingだけで十分です。

インストール

購入したら自分のスマホにアプリをインストールして、ログインします。

Freeletics: トレーニング&フィットネス
Freeletics: トレーニング&フィットネス
開発元:Freeletics GmbH
無料
posted withアプリーチ

レーニングジャーニーを選ぶ

レーニングジャーニーというのは6週間あるいは12週間のトレーニングコースです。自分の目的に合わせて選んでいきます。途中から変更できるので、適当に選んでから後で変更してもいいでしょう。迷ったら「スタートストロング(男性)/スタートスマート(女性)」という6週間の初級コースを選べばいいです。

f:id:shiumachi:20200126172407p:plain

基本は自重トレーニングですが、去年からランニングを含むコースも増えました。自重トレーニングではなくランニングをしたいという人はこちらを選びましょう。逆に自宅でのトレーニングしかしないのであればランニングのないコースを選びましょう。私は自宅トレーニングしかしてません。

f:id:shiumachi:20200126172351p:plain

レーニングする

毎週のトレーニング日数を決める必要があるのですが、ここで重要なのは週5日を選ぶということです。週2日などにすると1日ごとの負荷がすごく高くなるため、きつすぎて続けられません。週5日を選んでおいて、日数調整は自分でやった方がいいでしょう。

f:id:shiumachi:20200126172429p:plain

1日のトレーニングは、ウォーミングアップ→トレーニング→クールダウンという流れで行います。1回のトレーニングは、初級だと20分程度、中級コースだと30分程度に調整されています。

フィードバックする

レーニングを行ったあとにフィードバックを入力します。この入力が次のトレーニングの負荷に影響するので正確に行う必要があります。「全く休まずできたら右端、休憩したけどなんとか完走したら真ん中、途中でリタイアしたら左端」くらいに覚えておけばいいでしょう。

新機能: 毎日のトレーニングでの微調整

2019年12月のアップデートから、レーニングの微調整ができるようになりました。その中で一番の目玉は、リングフィットアドベンチャーでいうところのサイレントモードの実装です。

Freeleticsを薦めたときに友人から一番多く言われたのが、「マンションなので階下に響く運動はできない」というものでした。確かにFreeleticsはジャンプ運動が入るために、そのままでは階下に響いてしまいます。

しかし、このサイレントモードを使えば、全てのジャンプ運動はスクワットとランジなどの静かなものに変わるため、静かにトレーニングすることができます。

レーニングの微調整は、毎日のトレーニングメニューを開いて、右下のCボタンを押して行います。

f:id:shiumachi:20200126172701p:plain

ここで、「静かにトレーニングする必要がある」を選べば、サイレントモードに変更することができます。

f:id:shiumachi:20200126172805p:plain

たとえば、この日の私のメニューは、クランチ(腹筋) と、マウンテンクライマー(四つん這いになりながら足だけ駆け足する)を交互に行うというメニューです。

f:id:shiumachi:20200126172950p:plain

これをサイレントモードにすると、プッシュアップ(腕立て)、クランチ、スクワットに変わります。

f:id:shiumachi:20200126174200p:plain

サイレントモード以外にも、「15分モード」や「筋肉痛モード」などもあるので、その日の状況に合わせたトレーニングを選ぶことができます。

先程と同じメニューを「15分モード」に変えると、ランジ(片脚づつ交互に膝立ちする脚の運動)、ヒールレイズ(四つん這いになってかかとを交互に後ろに上げる運動)、プランクニーズツーチェスト(四つん這いの状態から膝を胸につける腹筋と体幹の運動)が3セットだけに変わります。

f:id:shiumachi:20200126173239p:plain


また、その日のメニューが気分に合わないときは、「違うセッション」を選択することで、別パターンに切り替えることができます。

これも先程のメニューの例でいうと、スプロール(バーピーの簡易版の激しい全身運動)、パッシブハング(懸垂台でのぶら下がり)に変わります。

f:id:shiumachi:20200126174215p:plain

Tips

マットを買う

レーニングマットは必須といっていいレベルなので買いましょう。私はALINCOのマットを使っています。

レーニング回数は週5回を選択すること

上でも書いたことですが、これは強く推奨します。週2-3回のトレーニングを選択すると負荷が高すぎるためモチベーションが下がります。

レーニング実施日数にはこだわらない

アプリ上では何曜日にトレーニングするかを選択する必要がありますが、あまりそれにこだわらず、できそうなら毎日やった方がいいです。逆に気が乗らない場合はその日は思い切ってサボった方が長続きします。ただし、3日以上空けるとやる気がどんどん下がっていくので、休むのは1日だけ、多くても2日くらいにしておいた方がいいです。

シングルエクササイズを活用する

通常のトレーニングメニュー以外にも、特定の種目だけ選択できるシングルエクササイズモードがあります。

f:id:shiumachi:20200126173400p:plain

通常メニューをやる気がないときに、スクワット10回だけなど、ほんのちょっとだけでもやっておくとモチベーションの維持がしやすいです。
逆に通常メニューが簡単すぎて物足りない場合は、好みのトレーニングをいくつか追加していくといいでしょう。
私は通常トレーニングに加えて、軽めの運動を少し加えています。

レーニング開始前に水を飲む

水分補給は重要なので必ず飲みましょう。また、ルーティンとして組み込むことでトレーニングのやる気を上げる効果もあります。

ウォーミングアップ・クールダウンはサボらない

ケガの防止にもなりますのでサボらずやりましょう。

レーニング終了後にプロテインを飲む

ある程度運動に慣れてきたら、トレーニング後にプロテインを飲むと、ダイエットにも効果的です。お試し程度に買うのなら、Amazonで買えばすぐ届くのでまずは1kgくらい買ってみてもいいでしょう。

マイプロテインは公式サイトでは不定期(といってもほぼタイミングは決まっている)タイムセールを開催しているので、慣れてきたら公式サイトから買った方がいいと思います。ただし、海外発送のため時間がかかること、購入代金を調整しないと関税がかかってしまい逆に割高になってしまうことに注意してください。難しそうならAmazonで買ってしまった方が楽だと思います。

自分の成長の記録を見てやる気を上げる

過去の自分の記録と比較して、「以前これだけキツかったのが今これだけできるようになったんだ」というのを視覚化できると、達成感をえることができます。

気が向いたときに、プロフィール→ワークアウトから、過去のトレーニング履歴を眺めてみると楽しくなります。

f:id:shiumachi:20200126174623p:plain

ケガしたら無理せず(その部位だけ)休む

Freeleticsでは、筋肉痛のときにその部位を休めるという機能はありますが、ケガしたときまではケアしてくれません。

もし万一ケガしてしまった場合は、無理せず休んで病院にいきましょう。

とはいえ、全くやらなくなるとモチベーションが下がってやらなくなるだけなので、例えば肩をケガした場合はスクワットだけはやる、など、シングルエクササイズモードをうまく活用して、トレーニングの習慣だけは維持するようにしましょう。

公式サポートに質問する

アプリとしては比較的安定しており、落ちることはありませんが、インターフェイスが使いづらかったり、訳が間違ってたり、ほしい機能がなかったりなど、色々と気になることが出てきます。そんなときは公式サポートに質問しましょう。プロフィール→設定→お問い合わせから問い合わせできます。日本語も対応していますので安心して質問できます。

f:id:shiumachi:20200126173422p:plain

その他

実際にFreeleticsを使っていて気づいたこと、知ったことなどを共有しておきます。

SNS連携はInstagramしかない

SNS連携はかなり貧弱です。SNS周りを強化してほしい場合は機能要望をどんどん出していきましょう。

APIが公開されていない

個人的にこれはかなり残念です。サポートに問い合わせしましたけど現在提供予定はないとのこと。ほしい場合は機能要望を出しましょう。

プロダクトを作るということについて考える

こちら、pyspa Advent Calendar 2019の23日目の記事です。前日の記事は id:kutakutatriangle さんの34のおっさん(当時)が痔ろう手術するハメになって健康大切だと実感した思い出話(前編)でした。

お前誰?

Luminosoという会社でソリューションチームの一員として働いています。業務としては、製品のプロトタイプ開発のような作業が大半です。お客様の要望に応えるために、既存の自社製品だけでは満たせない拡張部分を作っていくのが主な業務になります。
そうした仕事を通して、プロダクトを作るということについて自分なりに考えたことを書いていきます。

できるだけ開発しない

既存の製品・機能でできることがあるのであれば、まずそちらを使うべきでしょう。開発は、既存のプロダクトではユーザのニーズに「応えられない」ことがわかった場合に初めて行うものであり、「応えられるかわからない」ときにやるべきではありません。できないことがわかるまで製品や既存のソリューションについて調べるべきでしょう。

ユーザの言葉を鵜呑みにしてはいけない

ユーザは技術的に何ができて何ができないかはわかりません。それどころか、自分たちが本当にしたいことは何かも把握できていないこともよくあります。「君のところが作ってる車で空を飛びたいんだ。空を飛ぶ機能つけてよ」と言われることを想像してみてください。厄介なのが、「空を飛べるようになるなら君のところの車を買うよ」と契約を盾にした要望で、この状態になると社内の営業チームはプロダクトの開発チームに無理を通してでもその機能をつけようとプッシュしてくるようになります。

この問題に対する有効な解決策は自分ではまだ見つかっていません。予防策としては、以下のようなものがあります。

  • マーケティング・プリセールスの段階で自分たちのプロダクトができることをはっきりさせておく。特にプリセールスの段階で「できないこと」をユーザにきちんとインプットするよう気をつける。(ただし、風呂敷を広げるタイプの営業はこのような説明を嫌う場合があるので注意)
  • ユーザからの要望が出てきた段階で、早期に課題を明確化するためのコンサルティングを行う。プリセールスがやるのが理想だと思うが、営業チームとして売ることが優先になっている場合は別チームの人間がやった方がいいかもしれない

ユーザのニーズを元にして開発をしなければならない

一方で、ユーザの話を全く聞かないというのも非常に危険です。開発者が思い込みだけで「こういうのが必要だろう」と思って作ったプロダクトや機能は、大抵の場合期待するほどユーザには受け入れられません。プロダクトの話になるとしばしば耳にする忠告なので、そんなこと本当にあるのかなと思っていましたが、現実にそうした事象を目にすると、とてもよくわかります。開発した動機だけを聞くと、それめっちゃクールだよね、確かにそういうの欲しいよね、と錯覚してしまいます。しかし、そうしたプロダクトを実際にユーザに見せても、お金を払ってでも欲しいと思わせられるかどうかは未知数です。

前職Clouderaでは、新製品のリリース時には必ずローンチカスタマーがついていました。これは、単にマーケティング的な効果をもたらすだけでなく、ユーザのニーズに基づいて開発することで、本当に必要とされるプロダクトに特化するということを体現していた証だったと思っています。

ユーザのニーズは(例え実現不可能であるように見えても)バックログにいれて管理しなければならない

「この車で空を飛びたい」のような、一見突拍子もないような意見であっても、そうした意見を眺めているうちに本当の問題や本当の解決策にいきあたる場合があります。特に、複数のユーザからそういう突拍子もない意見がでてきた場合は、その要望を再検討する機会はあってもいいと思います。

そのためには要望の管理が必要です。 GitHub Issues でも JIRA でも Trello でもいいので、とりあえず放り込んでおく、という先は用意しておいた方が後で便利です。

開発は常に保守性を考えなければならない

ソリューションチームにいると、複数のプロダクトを開発していくことは頻繁にありますし、数ヶ月特に保守する必要もなく安定して提供できていたプロダクトに急遽開発要件が生まれるということもあります。また、製品本体や外部ツールのバージョンアップによる非互換性への対応なども必要になります。こういうときに保守性を考慮した開発を行うことで、保守工数を削減するだけでなく、新規開発を素早く行うことができるようになります。

作成したソリューションやツールなどは、あくまで位置づけとしてはプロトタイプというだけであり、実際に製品化されるかどうかは決まっていません。場合によっては長期的に保守する必要があるため、保守性を高めておくことは重要です。

まとめ

ユーザの話を鵜呑みにせず、しかしきちんと話を聞き、その上で保守性を考慮して開発する、というのがこの一年でプロダクト開発について自分が学んだことでした。ごく当たり前のことしか書いておらず、知っている人にとっては目新しい話は何もありませんが、こうした知識を経験として体得できたというのが大きな収穫だったと感じています。

明日は @wozozo です。

ワードエンベディングベクトルを使った検索アプリを作った話

この記事は、情報検索・検索エンジン Advent Calendar 2019の17日目の記事です。
https://qiita.com/advent-calendar/2019/search

昨日書いた、自然言語処理 Advent Calendar 2019の16日目の記事からの続きになっています。

Luminosoの会社と技術(昨日の記事のおさらい)

アンケートや口コミなどのデータを解析して顧客の声や従業員の声を解析したり、業務報告書などを解析してあいまい検索を行うようなサービスを提供するボストン発のMITスピンアウトのスタートアップです。

もう少しNLPの技術者向けに説明すると、セマンティック辞書に基づいて補正したワードエンベディングベクトルモデルを、ドメインデータでfine-tuningすることで、少量のデータで前処理込でユーザ毎のモデルを高速に作成するサービスを提供している会社です。

単語ベクトルを使って文書検索をする

まず、「ベクトルを使って検索する」ということですが、一番シンプルな方法はベクトルの類似度を計算するという方法です。ベクトル検索でいうと最近傍探索を思い浮かべる人がいると思いますが、私の会社で扱うデータですと数千レコード程度のごく少量で済むため(昨日の記事参照)、雑に全件分計算しても十分な速度で結果が返ってきます。

では、単語ベクトルから文書ベクトルをどのように定義するかということですが、我々は単純に文中に出現した単語のベクトルの平均を取ることで表しています。これにより、単語ベクトルと同じ次元で文書ベクトルを表現することができるため、文書と文書の比較だけでなく、単語と文書の比較もできるようになります。

利点としては、とにかく手軽に検索ができるという点です。辞書も前処理もいらずに数千行のデータに対してあいまい検索ができるようになります。例えば、電化製品の製品レビューコメントを検索するときも、「故障する」と検索するだけで「通電しなくなった」と書かれている文書を検索できるようになります。単にベクトルで距離計算しているだけなので、専用のエンジン等も一切必要ありません。

欠点としては、BoWなどと同様、文構造や単語の順序を考慮していないため、複雑な文や長文に対して精度が悪くなるということです。

類似する単語をシノニムとした検索

文書検索にはもうひとつの方法があります。単語ベクトルが既に存在しているので、ある検索キーワードと距離が近い単語をシノニムとして検索を行うことです。モデルの性質上、文脈上近い使われ方をしている単語や意味的に近い単語の類似度が高くなるため、類似度の高い高い単語をシノニムとして扱うという手法は有効です。Luminosoではこの方法を標準的な検索方法として採用しています。

ベクトル計算の応用

文書ベクトルを「単語ベクトルの平均」としたのと同様、あるフィルタ条件のベクトルも、「そのフィルタ条件にあてはまる文書ベクトルの平均」とすれば、計算は可能です。これにより、特定の検索クエリにもっとも近い「住所」「性別」「年齢」はどれか、などを計算することができるようになります。これらの属性を「ファイル」や「Webページ」ととらえれば、一般的な検索と同じことをしているということがわかるかと思います。

Luminosoでは、デモアプリとして単語ベクトルを使ったこのような検索アプリケーションを使用しています。

ベクトルを使った検索アプリの実際

例えばフィルタ処理やAND/ORなど、検索にはさまざまな機能が要求されるため、実際にはベクトル計算だけでは実運用する検索アプリケーションとしては十分な機能を提供できません。また、先述の通り、素朴なベクトル類似度計算では、少しデータが多くなるだけで性能面では全く使い物にならないほど遅くなってしまいます。このように、機能面・性能面を考慮すると、十分に開発が進んだ検索エンジンを使う必要がでてくるでしょう。Elasticsearchは、近年ベクトル検索をサポートしています。今年の検索アドベントカレンダーでもElasticsearchのベクトル検索を使った記事がありますので、この記事での紹介は省略します。


で、結局何ができるの?

LuminosoとElasticsearchを組み合わせると、数千行程度のテキストを投げ込むだけで、前処理も辞書作成も行わずに、社内用語や専門用語、類義語や表記ゆれ、typoなどに対応した検索アプリケーションを作成することができます。これができるようになれば、今までコストの面などで苦労していた、エンタープライズ領域の検索システムもより気軽に導入できるようになるでしょう。

ワードエンベディングモデルしか触らないNLPエンジニアとしての仕事の紹介

この記事は、自然言語処理 Advent Calendar 2019の16日目の記事です。
https://qiita.com/advent-calendar/2019/nlp

この記事では、私が勤めるLuminosoという会社及びその技術、そこで私がどのような仕事をしているか、ということを紹介します。

どんな会社なの?

アンケートや口コミなどのデータを解析して顧客の声や従業員の声を解析したり、業務報告書などを解析してあいまい検索を行うようなサービスを提供するボストン発のMITスピンアウトのスタートアップです。

もう少しNLPの技術者向けに説明すると、セマンティック辞書に基づいて補正したワードエンベディングベクトルモデルを、ドメインデータでfine-tuningすることで、少量のデータで前処理込でユーザ毎のモデルを高速に作成するサービスを提供している会社です。

何をやっているの?

ソリューションアーキテクトとして、会社製品の活用についてコンサルティングしたり、出力結果を活用するツールを開発してお客様に提供したりしています。

自社ワードエンベディングモデルの概要

ConceptNet という、人間の常識を蓄積したオープンナレッジグラフをセマンティック辞書として、従来手法によって作成されたワードエンベディングモデルにレトロフィッティングやバイアス除去などを適用して作成したオープンデータのワードエンベディングモデル、 ConceptNet-Numberbatch をベースとしています。

詳細はこのビデオのこのあたりを観てください。
https://youtu.be/IEZxMhm1kV0?t=1289

ワードエンベディングについてはこのアドベントカレンダーの読者のほとんどには既知の話だと思うので省略します。

ConceptNetは、人間世界における常識をナレッジグラフとして集積したオープンデータです。例えば、「りんご」は「果物」の類型の一つであり、「赤い」や「赤または緑」という要素を持ち、「🍎」という記号で表される、などです。
ConceptNetは公開Webサイトで誰でも試すことができます。りんごの例は以下のURLからアクセスして確認することができます。
http://conceptnet.io/c/ja/%E3%82%8A%E3%82%93%E3%81%94

レトロフィッティング(Retrofitting)というのは、ワードエンベディングモデルをセマンティック辞書を使って意味的な情報に基づいて補正をかけるという手法です。例えば、「実行」と「実施」は類義語の関係にあるので、データソースにおいて文脈上何も関係がなかったとしてもベクトルの距離を近づける、などです。

バイアス除去というのは、元データに存在する様々な偏見を除去するための手法です。例えば、ある国におけるマイノリティがネガティブな単語と結びつくというのはバイアスの一つなので、これの除去を行います。

こうして作成されたものが ConceptNet-Numberbatch で、出力結果のモデルはGitHub上で公開されています。
https://github.com/commonsense/conceptnet-numberbatch

製品版はここからさらに拡張していて、ドメインデータを取り込んだ後、前処理を自動で実施した後にfine-tuningしてドメイン毎のモデルを作成します。

どういうメリットがあるの?

数千行のデータで、辞書作成や前処理をせずに、非常に小さい計算リソースしか利用せず(GPUも使わない)、数分から数十分という単位でベクトルモデルを作成できます。

最大のメリットは、未知語、表記ゆれ、略語などに非常に強いということです。たとえば「自然言語」と「NLP」は、適切な例文さえ用意できれば辞書がなくても容易に類義語だと見分けることができるでしょう。社内の専門用語も、他のどの用語と意味的に関連が深いかということを見分けることができるようになります。

銀の弾丸なの?

残念ながらそうは甘くありません。

skip-gram モデルによって基礎となる単語ベクトルを作成している以上、単語の出現順番が大きく影響します。そのため、テンプレート文に非常に弱いという特徴があります。「いつもお世話になっております。」という文章が繰り返し出現するだけで、「いつも」と「お世話」が非常に関連が高いと解釈してしまうでしょう。

文単位での解析しか行わないため、パラグラフ単位や章単位などの大きな単位のメタ情報を考慮できないという問題もあります。しかし、こうした長文を解析したいというニーズはあるため、色々な工夫をしてお客様にご提供しています。(業務に深く関わる話なのでこの辺は省略)

どうやって仕事をしているの?

私は、業務としてはNLPを扱うエンジニアではありますが、辞書作成もモデル作成も全くしていません。ひたすらベクトルを扱い続けます。 ELMo や BERT といった流行りの技術も全く扱いません。

扱うライブラリはほぼ pandas と numpy です。
たとえば一番高頻度に実施する処理は、ドット積を取ることによるベクトルの距離計算です。これはそのまま類似度に使うことができるため、この結果をもとに様々な処理に応用できます。

テンプレートの削除など、現場では結局のところ前処理が必要になります。不要なテンプレート文の削除などの処理を行わないと、効率よく解析できなくなります。前処理はほとんどPython標準の文字列関数や正規表現で行っていますが、たまに spaCy を使うこともあります。

解析した結果を使いながら、お客様が望むような仕組みを作るためにコードを書いたり仕組みを設計したりするということを行っています。

多分、NLPと名のつくエンジニアの中でもかなり特殊な仕事をしているでしょうし、NLPのエンジニアの中には、私のような仕事はNLPではないと言う人もいるかもしれません。

製品としてモデルを勝手に作ってくれるので、そのモデルをいじるのではなく、そのクセを考えながら、お客様が望むようなシステムを提供するにはどうすればいいかを検討するというのが普段私がやっている仕事になります。

仕事の一例として、ベクトルデータを使った検索アプリケーションというものがあります。

明日の情報検索・検索エンジン Advent Calendar 2019ではそちらについて簡単に触れたいと思います。
https://qiita.com/advent-calendar/2019/search

まとめ

Luminosoは、自社製のワードエンベディングモデルを提供する会社です。そこで働くエンジニアである私は、辞書作成やモデル作成といったことを行わず、ベクトルばかり触っているという、NLPのエンジニアとしてはちょっと変わった仕事をしていますよ、ということを紹介しました。

超予測力: 未来を予測する技術を学べる本

今年読んだ本の中で一冊を挙げるならば、間違いなく本書でした。


本書は、非常に予測能力の高い人達はどのように予測をしているのか、ということに注目した本です。

米国では、情報先端研究計画局(IARPA)による、情報分析予測トーナメントが開催されています。 本書で登場する「超予測者」は、この予測トーナメントで非常に高い成績を収めた人達です。この超予測者達を調査し、その予測手法についてまとめあげたものが本書です。

その中から、特に汎用性が高く、すぐに使える手法をいくつか紹介しましょう。

予測手法1: 確率についての正しい理解

「天気予報だと降水確率80%だったんだけど、雨は結局降らなかったよ」

我々は普段、このような会話をしますが、大抵は「天気予報が外れた」という意味を込めています。

確率という観点に立てば、本来は「天気予報が正しかったかどうか、これだけではわからない」というのが正しいはずです。

降水確率は「80%」なのですから、逆に言えば20%は外れる可能性があるわけです。しかし、我々一般人は、80%という数字を100%であるかのように錯覚してしまいます。

超予測者達の特徴の一つとして、この確率の粒度が非常に細かいというものがあります。一般人は、ものごとを「はい、いいえ、どちらともいえない」といった粒度で予測を行います。しかし、超予測者は1%刻みで予測を行うのです。

頭の中に選択肢が三つしかない人は確率を判断しろと言われると、50%という数字を使いがちだ。50%を「どちらとも言えない」と同義に考えているからだ。このため頻繁に50%を使う人は、予測の正確性が低いと考えられる。(p.204)

まず、この確率に対する認識を改めることが、予測力を高める最初の手法となります。

予測手法2: フェルミ推定

「なんだフェルミ推定か」と肩を落としてしまったかもしれません。しかし、本書のフェルミ推定は、一般に知られている基本的な手法よりも少し奥が深いです。それは、「外側の視点」と本書で呼んでいる手法です。

「レンゼッティ家には44歳の父親と35歳の母親、5歳の息子がいる。父は引っ越し会社の経理担当、母は保育士をしている。父親の母も同居している。このとき、レンゼッティ家がペットを飼っている可能性はどれくらいか。」という問題が本書に書かれています。

一般人は、上記の家族構成や背景についてまず考え始めますが、超予測者は、こうした情報を最初は無視します。その代わり、全国でペットを飼っている世帯の割合を調べます。それはインターネット上で検索すればすぐに答えが見つかります。(本書の記載時点では62%)

このように、背景を無視した上で得られる、完全に客観的なデータや、それに基づいたフェルミ推定を行い、その確率を「基準値」とすることが本書で記載されている手法です。

基準値がない場合、誤った予測に結びつく可能性が非常に高くなります。「このようなことが起こる確率は高い」と、「通常はこのようなことが起きる確率は5%だが、今回は通常に比べて起こる確率は通常に比べて高い」では、大きく印象が違うでしょう。前者は少なくとも50%以上であるかのように判断してしまいがちですが、後者であれば20-30%であると予想するのではないでしょうか。このように、人間の心理は基準となる値にひきずられてしまいがちです。なので、最初に基準値を設定することは非常に有効なのです。

予測手法3: 逆の意見に耳を傾ける

「X国が3ヶ月以内にY国に軍事侵攻する確率はどのくらいか」という質問があったとします。あなたがX国に詳しくて、X国が政治的にも経済的にもY国に軍事侵攻することを簡単に予測できる場合、この問題は非常に易しくみえてしまうでしょう。超予測者は、そのような場合でも、「X国が3ヶ月以内にY国に軍事侵攻『しない』」という意見に耳を傾けたり、あるいは、どういう条件であれば自分の意見を翻すか、という可能性を考えます。

本書では、こんな研究が紹介されています。
予測精度の低い人ほど持論に自信を持っていて、さまざまな事象について「起こり得ない」「確実」などと言い切る傾向が高く、一方で、予測精度の高い人ほど、自らの誤りを認め、考えを変える傾向があり、「しかし」「だが」「とはいえ」「それに対して」といった転換語を多用する、というのです。

さらに、面白いのはこの一文です。

知名度と正確さには逆相関が見られたのだ。有名な専門家ほど、その予測の正確さは低かった。(p.109)

メディアや一般大衆は、シンプルで好きのない明快なストーリーを好むため、断言しない専門家はメディアでは成功しない、とまで書いています。

予測はできない、だからこそ予測する

本書は、8章までは先述のような超予測者の予測手法にフォーカスを当てていますが、9章以降はチーム論や組織論、リーダーシップ論などにフォーカスを当てて、予測をどのように活用するかを述べています。

そこで述べられている最も重要なことは、「結局のところ完全な予測はできない」というものです。

2001年4月11日、当時の米国国務長官ドナルド・ラムズフェルドが、ジョージ・W・ブッシュ大統領とディック・チェイニー副大統領宛に、リントン・ウェルズ博士が執筆した、1900年から2000年までの、10年ごとの戦略的状況の分析メモを送付しました。

その内容は、10年ごとの戦略分析は「全て」的外れであるということを示していました。例えば、1930年の国防計画基準には「今後10年は戦争はしない」と記されていますが、実際には9年後に世界大戦が勃発しています。1960年の時点では、まだ米国国民の大半はベトナムという国を知らず、1990年にはインターネットという概念を国民の大半が知らない、という状態でした。
「2010年の状況は、我々の想定しているものとは全く異なるものだから、それを前提にして計画を立てるべき」とそのメモは締めくくられていました。

そしてその半年後、911が発生したのです。


ファストアンドスローで有名なダニエル・カーネマンや、ブラック・スワンで有名なナシーム・ニコラス・タレブが本書に何度か登場します。

ブラック・スワン[上]―不確実性とリスクの本質

ブラック・スワン[上]―不確実性とリスクの本質

カーネマン、タレブ、そして著者の三者は、「10年先の地政学的状況あるいは経済を予測できるというエビデンスは存在しない」という点で意見が一致しています。

では予測は役に立たないのか?そうではなく、予測できないからこそ、細かく予測をして準備をするのです。

予測についてしっかりと考える人は少ない、だから「20年先の地政学的状況を予測する」とか、「次の一世紀を占う」などの本がべストセラーになるといったバカげた現象が起こる、と本書は断じています。

特に、以下の二つの文が印象に残りました。

わかっていないという現実を認識するのは、わかっていないことをわかっていると思い込むよりましである。(p.337)

宇宙規模で考えれば、人間の予測能力などちっぽけなものだ。だがちっぽけな人間の世界で生きている以上、それを軽んじるのは筋違いだ。(p.342)

本書は、予測する人だけでなく、他人の予測を評価するための予測リテラシーを養うための教科書としても非常に優れています。本書の締めくくりの一部を引用します。

本書を読まれたみなさんもそれに気づき、そこから大きな変化が生まれることが私のひそかな願いである。予測にお金を払う人々は、魅力的なストーリーを語る評論家に騙されず、彼らに過去の予測の実績を尋ねてほしい。相手が自慢話や華やかな経歴ばかりを並べたら、それでは答えにならないと突っぱねてほしい。いまではわれわれの口にする医薬品は全て実験で有効性が確認され、ピアレビューを受けている。それと同じように予測を受け入れる前に、それを立てた者が厳格な検証を通じて自らの予測が正確であると証明しているか確認するべきだ。(p.346-347)

我々が普段目にする情報には、読みやすく、素晴らしいロジックを持って、「こうに違いない」と確信できるような華やかな「予測」にあふれています。そして、それらを信じる人や、信じない人が言い争うという光景も幾度となく目にしているでしょう。予測リテラシーを高めれば、まず一歩引いた状態で情報を分析し、その予測が注目に値するかどうかを確認する武器となることでしょう。

年末にこの本に目を通してから、「2020年を占う、予測する」といったテレビ番組を眺めてみる、というのも悪くないかもしれませんよ。

Freeleticsで半年間自宅トレーニングしたら食制限なしで6kg痩せた

前回の投稿からさらに四ヶ月弱経ちましたが、未だにFreeleticsを継続できています。

shiumachi.hatenablog.com


半年間自宅で運動を続けた結果、なんと体重がピーク時差分で6.2kg、7日移動平均で4.5kg減りました。画像はFitbitの体重の記録です。

f:id:shiumachi:20190915105757j:plain:w300
半年で体重6.2kg減

ジムも行かず、何かを我慢するような食制限を一切せず(食生活の変化はあり、後述)、毎朝30分程度、自宅で運動するだけでここまで痩せることができたのは自分でも驚きました。

なぜ継続できているか

「そりゃ毎日運動してたら痩せるだろ」って思うかもしれないでしょう。それはその通りで、この生活を継続できた理由が一番重要です。

理由は主に3つあります。

理由1: 時間が短い

開始から終了まで30分、ジムへの移動等の時間消費は一切なしというのが、忙しい自分の生活にとてもよくマッチしました。

理由2: 頭を使わなくていい

メニューを自動で組んでくれるので、運動に集中できます。

理由3: 楽しい

自分の記録を視覚化できるので成長を実感できます。

どういう運動をしているか

前回の記事で紹介した、Freeleticsというアプリを使って、毎朝運動しています。起きてから時間をおいて運動するときは、運動の30分から60分前にプロテインを一杯飲んでいます。そして、運動の直前にコップ一杯の水を飲んで、スタートします。終わったらシャワーを浴び、プロテインを飲みます。これ以外の運動は一切行いません。
基本的には毎日運動していますが、サボりたいときは一日ならサボっていいことにしています。その代わり、その翌日はどんなにつらくてもやります。過去の経験上、2日空くと途端に継続率が下がったと感じていたので、今回はこの2日目を頑張ってやることに注意しました。

Freeleticsで選択したジャーニー(12週1セットのトレーニングプラン)は以下の通りです。

食生活の変化

よく友人に「食制限してないの?」と聞かれるのですが、私は何かを食べるのを我慢したり、お酒を飲むのを控えたりしているわけじゃないので、自分としては食「制限」という意識はありません。なので、あえて「食生活の変化」という表現をしています。
少しづつ、3つの食生活の変更を行いました。

プロテイン

運動してから3ヶ月目くらいから、プロテインを飲み始めました。運動前後に飲む他、おやつ代わりに一日2回ほど飲むようになりました。プロテインマイプロテインというサイトで、Impactホエイプロテインを購入しています。

頻繁にキャンペーンをやっていて、特にゾロ目の日や給料日(25日前後)には40%オフなどのセールもやっていますし、一定金額以上購入すると送料無料になるため、購入するときはこうしたセール日を狙ってまとめ買いするのがオススメです。

公式サイトから購入した方が先のセールなどでかなり安くなるのでオススメです。Amazonで買うこともできますが、セール時価格からは割高になりますので、どうしてもAmazonから買いたい(あるいは別のECサイトから買いたくない)場合はあまりオススメしないです。

ストウブ

ストウブを使った無水調理を行うようになりました。ストウブは、食材を買ってきて放り込むだけで、簡単においしい料理が作れるようになる調理器具です。毎週末にストウブで鶏むね肉を3枚と野菜を買ってきて調理し、タッパーに入れて保存しています。これを一週間で消費していきます。

f:id:shiumachi:20190819181428j:plain:w300

ストウブを使うときは、下記の本とセットで買った方がいいでしょう。手軽においしい料理を作れるレシピがたくさん載っています。最初は一番上の本だけ購入し、慣れてきたら二冊目、三冊目と購入するのがいいと思います。

サラダごはん

さらに、最近はサラダごはんを食べるようになりました。野菜を何種類か買ってきて(葉物の野菜、トマト、たまねぎなど)、ゆで卵、アボカド、先程の鶏むね肉を載せ、後は好きなドレッシングをかけるという食事です。ボリュームたっぷりで、食材を変えることで全く飽きない、とてもおいしい料理です。サラダごはんは、以下の本を参考にしていますが、あまりレシピ通りに作ることはなく、その日の食材や気分で色々とアレンジしています。

ミックスサラダ

ミックスサラダ

毎日続ける やせる サラダごはん

毎日続ける やせる サラダごはん

食生活を変える

サラダごはんは作るのにそれなりに手間がかかるので、ここまでやる必要はないと思います。こうした食生活の変化を導入するなら、プロテイン→ストウブ→サラダごはんの順に取り入れるのがオススメです。

もちろん、上記のような食生活を毎日しているわけではなく、他の物が食べたくなったら普通に食べていますし、お酒や揚げ物、甘いものなど一切制限していません。食制限してストレスがかかって継続できなくなるより、長期間継続できる形を優先しています。

Freeletics 利用時のポイント

友人達からもらった質問や、自分で調べたことを元に、Freeletics を使うときのベストプラクティスをいくつか紹介します。

フォーム優先、それから速度

FreeleticsはHIITのコンセプトを用いた、短時間のトレーニングを行います。HIITの後のアフターバーン(EPOC)という効果によって、運動していない間もカロリー消費を行うことができるようになります。なので、短時間に高負荷をかけることが重要です。だからといってただ速くやるだけでは高い負荷は得られません。とにかくフォームを優先して、完璧なフォームができてからタイムを短くするようにします。

フィードバック

フィードバックは厳し目に行った方がいいです。フィードバックを元に次のトレーニングプランが組まれるので、緩めに書くと翌週からやたらときついメニューが組まれ、モチベーションを大きく下げてしまいます。

公式ヘルプに書いてある、気をつけるべき点は以下の通りです。

  • タイム計測。適当にポチポチ押してスキップすると、「すごい速さで終わらせた」とみなされて翌週の負荷が上がります。面倒でもきちんと1つのワークアウトが終わるたびにきちんとクリックして記録を取ってください。
  • 「どれだけきつかったか」「正しいフォームでできたか」。この二つのフィードバックの違いはヘルプに書いてないので詳しくはわかりませんが、おそらく前者が持久力的なフィードバックで、後者が筋力的なフィードバックではと推測しています。「正しいフォームでできたか」のフィードバックで「できた」とつけると、そのワークアウトにスターがつきますが、これは明確に「翌週の負荷を上げる」とヘルプに書いてあるので、本当に正しいフォームができたと自信を持って言えるまでは選択しない方がいいです。
  • 身長、体重、年齢(生年月日)、性別。メニュー作成に必要なので正しく入力してください。
ウォームアップ、クールダウン

レーニングで一番怖いのがケガで、その次が筋肉痛や筋疲労によるモチベーションダウンです。なので、サボらずやることが非常に重要です。

フォロワーを増やし、いいねを押しまくる

Freeleticsコミュニティは互いに褒め称え合ういい文化で、しかもそれ以上の馴れ合いもない大変ストイックな文化です。他の人がやってるのを見るとモチベーションアップにつながるし、他の人からいいねをもらってもやる気が出てくるので、積極的にフォローするのをオススメします。

自分は、主なフォロー相手は「日本でトレーニングしている人」「Lv100以上の高レベルアスリート」に絞っています。
Freeleticsはフォロワーを探す機能が貧弱なので、どういう人をフォローしたらいいかわからないという人は、とりあえず私のアカウントを検索して、そこからフォロワーをたどっていけばいいと思います。

私のアカウントは、私の名前で検索すれば以下のように出てきます。

f:id:shiumachi:20190915130204p:plain:w300

まとめ

  • Freeleticsを毎日続けたら、きつい食制限なしで半年で6kg痩せた
  • 続いた理由は、短時間で頭使わず運動できて、楽しいから
  • 食事の変化はいきなり行わず、徐々にやった方がいい。プロテインとストウブは買おう
  • Freeleticsはいいぞ!


Freeleticsを始めてみたいという人は、下記のリンクから購入すれば20%オフで買えます。 Coach と Nutrition (食生活改善)の二種類が出てきますが、Nutrition は自分は試していません。運動だけなら Coach で十分と思いますが、誰か Nutrition を試した人がいたら感想教えてください。

https://www.freeletics.com/r/124871187

14日間の返金期間がありますので、気になったら一週間くらい試してみるといいでしょう。