自分の部屋の写真をシェアしよう

平山知宏氏:Web2.0の、しかもRettyさんよりも知名度が低いという非常に苦しいところなんですけれども(笑)。エンタープライズの方々が多いというお話でしたから、本日のお話に興味のある人がどれだけいるか不安ですが、とはいえ中にはきっと僕と同じように非常に苦しいリソースの中でプロダクトを成長させて、そこに機械学習を読み込まなきゃいけないという課題を抱えている方が、たくさんいらっしゃると思います。なのでその方たち向けに、できるだけ低コストでやっていくための、「自社で70万コアとか用意できません」という人向けにお話しさせていただければと思います。

(会場笑)

僕は平山知宏と申します。

見かけましたら気軽にハローしていただけるとうれしいです。

やっているサービスは、「RoomClip」と申します。非常に簡単な、というかわかりやすいアプリケーションで、部屋の写真を投稿してみんなでシェアしましょうというものです。それだけ聞くといわゆるよくある写真共有サービスなのかと思われてしまいますが、僕らのコアバリューというのは、データそのものにございます。

部屋の中の写真データで何が重要なのか、という話で言いますと、この1年で他人の部屋を何回見たかを、みなさん自問していただいて、カウントしてほしいんです。

おそらく10件ないと思うんですね。自分、他人の部屋含めても、おそらく5件が限度じゃないかなと思っています。

エンジニアの方々なら一瞬でわかると思いますけれども、他の人がどうやっているのかという実例は非常に重要ですよね。GitHubがない世界を考えたら、コードに接する量は猛烈に下がると思うんですけれども、他の人がやっているパターンを見れば見るほど、その業界に対する知見や技術力はどんどん増していく。

しかし衣食住の中で部屋の中というのは非常に接するパターンが少ない。そのへんのペインを解決するのがRoomClipです。

我々のサービスを開いていただければ、もう浴びるように他人の部屋を見ることができますので、おそらく自分の部屋がどれだけ今まで劣っていたのかが……。

(会場笑)

どれだけ過ごしづらかったのか、または良く過ごしている人たちがたくさんいるんだということを認識できるかなと思っております。

機械学習をどう活かせばいいのか

本日のテーマのお話をさせていただきますと、機械学習とか深層学習のツールは前段でみなさまおっしゃられたとおり、SaaSや、APIであるとか、ライブラリは整ってきていて、十分「巨人の肩に登れる」と思っております。もう出揃った感はあるかなと。

ただ一番問題なのは、登ってどうするのかということです。「プロダクトに活かせるんですか?」「ユーザー・クライアントの課題を本当に解決できるんですか?」というところに対して答えが出せない。

かつ、そこに対してどの程度のコストがかかるのかわからない。先ほどの話で言うと、たぶんお金の問題だけではなくて、人的リソース的にも、どうチームをエンハンスできるのかとか、そのへんのコスト感が見当たらないと思うんですけれども、弊社ではどういうふうにそれを無理やり乗り越えてきたのかを紹介します。

最初に、どうしてこの巨人たちの肩が難しいのか、という話を簡単に説明します。僕の感覚ですが、大きく2つの理由で難しいと思っています。まず、どういう意味の出力なのかがよくわからない。もう1つが、なんとなく意味はわかるけれども、どういうタイミングで使ったらいいのかがいまいちわからない。

これは僕の感覚では、「ガチの知識がない問題」と「知恵と工夫が足りない問題」、大きく分けて2つかなと思っております。

ガチンコの知識がないのは、この機械学習系ではずっとつきまとう問題だと思います。この問題は意外と根深くて、別に高度だからわからないとかではなくて、記述統計という非常に基本的な統計の概念でもよく起こる問題かなと思ってます。

とくによくあるのが、べき乗分布のいわゆるロングテール的な状態になっているグラフに対して、平均でものを語るというあまり意味のないことは一部の方がやってしまうことだと思っています。基本的な部分でも、ガチの知識が不足しているから、なんかよくわからないことをやってしまっていることは、ままあるかなと。

画像の分類を自動化

もう1つが、知恵と工夫が足りない話なんですけれども、ここがまさに突破口だと思っています。言葉は悪いですけれども、浅はかな知識でもできるようなアプリケーションは巨人たちがたくさん作ってくれているので、この表面的なものだけを使って便利にしていくのは、直ちにチャレンジしてもいいんじゃないかなと思っております。

一番最初に、僕がエンジニアも非常に少ないなかで試したケースを簡単に説明させていただきます。部屋全体の写真がどうかというのは、実はうちのサービスでは非常に重要になります。クローズアップされたデスクの上だけ、キッチンの一部分だけなのか、それとも部屋全体の写真なのかというのは、サービスを運営する上で非常に大切な分類になります。

これを今まで人力でやっておりました。「これは部屋全体ですよね」「これは局所的なものですよね」と。これを単純に置き換えたい、自動化したい思った時に、Googleさんの主催イベントで大変恐縮なのですが、Amazonさんで、フルで自動化することを試してみました。「Amazon Rekognition」と「Amazon Machine Learning」を使ってみました。

今までは、画像が投稿されたらそれを人が見て、「Is overview?(部屋全体ですか) TRUE|FALSE」という状態を保存していたんですけれども、いったんこれを一般物体認識というか、RekognitionってVision API みたいなものをボコーンと投げて、いったいどういうものが写っているのかをテキスト情報で獲得します。

それに対して、それが部屋全体だと人間が判定するんだったら「overview:1」というフラグを立てておきます。それでトレーニングデータをたくさん用意する。あとは、本当にシンプルです。得られたトレーニングデータをMachine Learningに対してロジスティック回帰をかけます。

ある程度の機械学習モデルは短時間で作れる

本当に、ありものに対して入力データが1なのか0なのかをただ判定するためだけのモデルを作るだけで、なんとなく自動化できます。すごい特殊な技術もなにも使っていないし、今までやっていたオペレーションで溜まっていた知識をただ機械学習にかけただけで、わりかし悪くないんですよね。

これはわかる人はわかると思うんですけれども、AUCで言うと0.95という、非常に高精度に部屋全体かどうかをジャッジできます。ここにおいてとくに複雑な概念は……「ロジスティック回帰」という言葉くらいですが、これもやや調べれば出てくるような言葉で、それなりのことができてしまうのがまず1つです。

これ、たぶんやるのに5クリックぐらいで済んじゃうんですね。それだけじゃなくて、さらにサーバレスでも組み込めますというのがこの図です。

最終的に、画像が投稿されたらそれがトリガーになって、Lambdaが起ち上がって、Rekognitionに投げてRDSに登録して、さらにLambdaが起ち上がって、Machine Leaningに投げます。EC2という、いわゆるサーバがないんですね。全部フルマネージドで、機械学習モデルを作るところまで一気通貫できます。

これを実際に作ったら、たぶん3時間とかでパパパッと、夜中の日曜大工みたいにできます。1つの技術についてガンガン知識を深めるよりは、表層的な部分だけをポーンと使って、うまく知恵と工夫を使えばできてしまう部分も、もちろんございます。

Jupyterとか使ってらっしゃる方は「こういうケースってよくあるよな」と思ってらっしゃるかもしれませんが、「scikit-learn」というライブラリを使っていただければ、いろんな分析ってサクサクできるんですけれども、深層学習だけはそうはいかないんですよね。

先ほどのガチの知識問題の話で言うと、本当に両方苦しい戦いを強いられるのがディープラーニングという領域だと思っております。

僕も1回失敗しましたという話で、浅はかな深層学習を突貫しましたと。TensorFlowが出たタイミングで、もともとChainerとかで触ってはいたんですけれども、より簡易にできるようになったので、すぐ飛びつきました。これでデータさえ用意すれば簡単にポーンと学習してモデルを作ってなんかできるんじゃないか思ったんですね。例えば、インテリアのスタイルの判定器を、分類器を作ってみようとしました。

ブルックリンスタイル+和風=男前インテリア

簡単にどういうことをやろうとしたのかだけ説明します。インテリアにはスタイルがふんわり存在しています。(スライドを指して)これで言うと、たぶん「ナチュラル系」、「ブルックリンスタイル系」、なんか「ホワイト」みたいな。

(会場笑)

なんかぼんやり存在しているんですね。見る人が見れば、「これは何系ですよ」みたいなことを答える。定義しづらいけれど、なんとなく概念として存在しているんだから、分類はできます。

それで、「ブルックリンスタイル」というのがとくにおもしろいです。ブルックリンというニューヨークの倉庫街があったんですけれども、そこに人がいなくなっちゃったんです。そこにニューヨーカーが流れて、一気に倉庫がオシャレになっていく文化が勃興したんですね。それが日本にも来て、ブルックリンスタイルができあがりました。

特徴的にはレンガやグリーンがあるとか、木目調の家具があるよねみたいな曖昧な話で、ルールベースでモデル化しようとするとなかなか困難なんですね。同じような部屋だけど「これはブルックリンじゃねーわ」「そうだよね」というのは、人間ではわかるけれども難しい。

さらにすごいうれしいというか、サービス冥利に尽きることなんですけど、新しい概念がどんどん生まれるんですね。ブルックリンスタイルを説明させていただいた理由として、来日した瞬間にRoomClipでも話題になりました。サビ加工とか、日本のDIY文化とすごいマッチして盛り上がるわけですよ。

そして、あるタイミングで、古いブリキのバケツを「男前やねぇ」って言い始める人が現れると、だんだんその「ブルックリンスタイル」に和風のDIYテイストが取り込まれていって、やがて「男前インテリア」という独自のスタイルができあがるんですね。それを見極められる人はプロ中のプロです。

(会場笑)

「いかにして巨人の肩に乗るか」に注力

ちなみに、Googleトレンドよりも若干早く流行り出しましたので、我々が流行の先端を行った思いはあります。こういう新しい概念って非常に複雑ですけれども、確かに存在しています。そういうものも、まさに深層学習だったらできるんじゃないかということで、無理やりがんばってみました。

これ、わかる人は「そんなの無理だろう」という一撃でわかると思うんですけれども、MNISTという手書きの文字を認識するレイヤーのモデルがあって、それを僕はまったく知識がなかったので、とにかくぶっこめばモデルを学習するんだろうということで20スタイルを放り投げました。

インテリアのスタイルは、実はすごいたくさんあるんですよ。これではきかないぐらいたくさんあるんですけれども、それぞれ1,000画像用意して、ぶっこめるだけぶっこむと、うーん、非常に微妙な状態になりましてですね……。

(会場笑)

実際にそのモデルを使って判定してみても、「おぉ……」みたいな。100枚の人間のテストでやると、適合率35パーセントということでやっぱりこけました。

確か2015年とか2016年の初頭だったと思いますが、この時点で僕はある意味深層学習というのはつらいとわかりました。やはりガチの路線が大事なんじゃないかということで、たぶんみなさんやられたと思うんですけれども、Wantedlyで募集要項を書き始めました。

(会場笑)

ただ、いろいろ大学の研究室と連携させていただいて、僕も勉強をちょこちょこ進めていくと、言葉は悪いですけれど、先端の研究者であってもけっこう恣意的な改善をしていることがわかりました。

例えば、深層学習の領域においては、少なくとも、層を入れる・入れない、パラメータ注入をする・しないなどでも、完璧なロジックが別にあるわけではないことがだんだん見え始めました。ということは、ガチの知識に到達するのもつらいし、その先に確実に成長できるラインがあるかもわからないんですね。

極端に言うと、人海戦術でやってる感があります。そうなると、ガチンコを攻める投資リスクが半端なく高くなってくるんですね。なので、「いかにして巨人の肩に乗るか」に注力するよりほかないです。ということで、ナイスな巨人をずっと僕は待ち続けました。

データ収集→読み込み→学習のモデルに集中

もう、TensorFlowでも簡単に使おうとすると足りないと。他のもっと使いやすいフレームワークが出ないかずっと待ち続けました。そこで、今の所たどり着いているところを言いますと、まずクラウドGPUはもう使いましょう。みなさんおすすめです。70万コアを自社で用意するのはきついので。あとで説明しますけれども、Xceptionとか、いわゆる偉い大学とか大きい企業が作った既存のモデル、学び済みモデルは使いましょう。さらに、TensorFlowはやっぱり使いましょう。

そして、ご存知の方はいっぱいいらっしゃると思いますけれども、インターフェイスとして優れているのが今「Keras」といわれるものがあり、これを使うことを推奨します。これがなかなか活躍してくれた事例を最後ちょこっと紹介させていただきます。

あれほどTensorFlowで叩きのめされて、実はChainerでもボコボコにされて、Caffeでも嫌われたんですけれども、最終的にKerasに愛されたな、と思った理由として、実は画像の読み込みとかラベル読みとかですら、正確にやろうとするとけっこう難しいんですよ。

本当に、データを集めて読み込ませて学習させてモデルをつくる、それだけに集中するためにKerasを選択しました。Kerasは触っていただければわかるとおり、本当はもうちょっとチューニングしなきゃいけないんですけれども、学習までの手続きがめちゃめちゃ少ないです。たぶんがんばれば40行ぐらいで学習開始できる。

学習中のログの吐き出しとか、モデルの形、hdf5とかの拡張子付きのモデルの吐き出しなどもとても簡単です。けっこうシンプルに扱えちゃうんですね。なのでKerasはすごいおすすめです。

もう1つのキーワードとして、転移学習を非常に進めたいと思っています。ゼロから深層学習のレイヤーを作ろうとするのは、ガチンコだったらいいんですけれども、サクッとやろうとしているなら、おそらくやめたほうがいいとすごく思います。ファインチューニングするか転移学習するかは、選択肢はあると思いますが我々は転移を選びました。

ディープラーニングで気にかけた4つのこと

基本的にはデータ構築とその応用のみに集中するために、学習しなかったらもう諦めるというぐらい、わかりやすくするために選択しました。だから層の追加とか改善という、PDCAを回せるのかに関して、「回せません」と答えることなど、気にすることは評価関数と最適化手法だけにとどめて、学習しなければ諦めがつくという状態にしておけば良いんではないかということで、このKerasと転移学習を使って浅はかにがんばっていきました。

負けたスタイル判定に再びチャレンジしにいくわけなんですけども、多少賢くなりましたので、まずリビングを学習させます。実は、Cloud Vision APIやRekognitionでも、リビングルームを判定することはけっこうできるんですね。

ただ、最終ページで述べたいと思いますが、実はリビングの定義は非常に曖昧なんですよ。それは廊下でもそうですし、先ほど「データセットを用意するのが肝だ」という話が何度も出ましたよね。ということは、誰かがその概念を定義しなきゃいけないんですね。「これはリビングである」「これはリビングじゃない」と。

とくにスタイルとかだったら、うちの社員40人にアンケートを取っても、割れるものが存在するんですよ。それをどこかで「こうだ」と言い切らなきゃいけないのが非常に苦しいところなんですけれども。

とりあえずリビングというものを判定するマシンを1個作りましょうということで、がんばりました。ここに書いてあるのはちょっと専門的に見えるんですけれども、要は、僕がこの転移学習というかディープラーニングをする時に気にしたことは、たった4つなんです。

どの学習済みモデルを使うのか。損失関数は何を使うのか。活性化関数は何を使うのか。最適化関数は何を使うのか。それくらいです。

まずどの学習済みモデルを使うのか。いろいろ使いましたけど、僕はGoogleを信頼してXceptionを使いました。Inceptionでも、VGGを使ってもいいと思います。

次に、最適化の関数は何であるべきか。これも少し専門的にはなりますけど、ぶっちゃけた話なんでもいいと思います。損失関数や活性化関数、学習済みモデル、最適化関数をどうするか。この4つだけをちょこっと勉強すれば、ある程度できちゃうというのがKerasのすごいところですね。

集めたデータを整理して、判断基準をつくる

がんばって9つに部屋を分類させました。廊下、部屋、風呂場、洗面所、トイレ、リビングルーム、キッチン、子供部屋。各1,000枚ぐらい。本当にたったの1,000枚ですよ。1,000枚を用意して、とりあえずぶん回すと、なんと18時間ぐらいで正答率93%を叩き出します。わりといいですよね。

こういうことを実現できたのも、P3インスタンスとか、いわゆるGPUインスタンスも、もうAWSから借り入れて使っています。

満を持してリビングが分類できるようになったので、まずリビングだけのデータをきれいにします。

けっこう重要なんですけど、ここでしっかりデータの基準を作るんですね。「機械が判断したリビング」が画像のベースになる。その上で、ユーザーさんが「ナチュラル」というタグを貼り付けている画像を収集したり、ユーザーさんが「男前」というタグを貼り付けている画像を収集したりして、教師データを作っていく。

そして、たった4つに限りました。先ほど言ったように、「ブルックリンスタイル」と「男前インテリア」、それから「ナチュラル」「カリフォルニアスタイル」のという4つが分類できるのかどうかというを試しました。これ、多少色がついてるのは、テスト段階なので人間でも定義が曖昧なやつもわざと含めてみました。

先ほど言ったように、「ブルックリンスタイル」というのは「男前インテリア」を生み出した親みたいなものなので、実は社内でもけっこう50/50で割れるんですね。その現象すらも学習するのかどうかを、がんばってやってみました。

とりあえずグルグル回すぞということで、18時間回したらそれなりにまたいい感じで、9割ぐらいの正答率をテストで出してくれますと。「悪くない」と。

(会場笑)

実際に先ほどと同じように100枚ぐらい適当に選んだ画像で、社内の人間と機械で判定の勝負というをやってみたところ、もちろん9割ぐらいの精度で当たるんですけれども、非常におもしろかったのは、人間が……。

この画像はユーザーさんが「男前」というタグを付けているんですね。それに対して、機械は「まぁ、そうだね」と。84パーセントの確率で「男前だね」と。ただ16パーセントぐらいは「ブルックリン混じってない?」という指摘をしてくるわけですね。

(会場笑)

ある程度のステップが整えば、エンジニア以外も利用できる

人間も実はしっかり割れるんですよ。ぜんぜん違うことを言い出してる人もいて、この人たちはサービスのことをよくわかってないんでしょう。

(会場笑)

ただ割れるということは……。これ以外は、「カリフォルニアスタイル」「ナチュラル」に関しては、9割ぐらいの断言を機械がしてくるんですけれども、しっかり「男前」と「ブルックリン」を迷ったのが非常におもしろかったです。

こちらの画像もそうですね。こちらは逆に、「私はブルックリンスタイルだ」ってユーザーさんは思ってそういうタグを付けている。ユーザーさんのタグ情報に沿って、やはり機械はそっちに傾くんですけれども、多少色を残すことが出てきて、人間と似たような振る舞いをしてくれることがわかってきました。

これをどうやってサービスに活かすかというはもうワンステップ必要にはなるんですけれども、少なくともこういうレイヤーのところまでは、わりと手を伸ばせばいけます。そこは日和らずに、本当にこれを丸パクリでいいと思うんですけど、KerasとTensorFlowとXceptionと、とりあえず回してみなさいと。そこから話を考えてみてもいいのかなと思っています。

実際にこれを用いて、実は裏ではいろいろなことをやろうとしています。本来インテリアスタイルってユーザーさんそれぞれあるわけじゃないですか。

たぶんみなさんそれぞれで本当はスタイルがあって、自分のスタイルを学んでくれる学習機があると本当は一番いいですよね。「あなたのスタイルっぽいですよ」ということを判定してくれるモデルがあるとか、今そういうものを裏で作ったりとか、そういうことがゴリゴリできるようになります。

あとはここまで整ってしまえば、他のエンジニアをエンハンスするのもけっこう楽なんですね。これ使ってこうやってEnterキーを押せば回すことに集中すればいいんです。

実はエンジニアじゃなくても、データを分類しておもしろいことをやろうという発想は、プロダクトやコミュニティを担当している人間のほうが良いアイデアが出ます。なのでそういう人たちにどんどん「難しくないよ」「Enterキーを押せば誰だってできるんだ」という話を社内でエヴァンジェっています。

データを整備していけば、プロダクトとして使える

最後に近づいてまいりましたけれども、今日お話した、僕がやったこと自体は非常に浅はかです。ただ転移学習を用いてそれっぽいことはできて、かけられるコストとしてもこのへんがちょうどいいのかなと思っております。

もちろんバジェットがあって、もっとゴリゴリ、コアバリューにしていくことをやっていっても、もちろんいいと思いますけれども。どちらかと言うとそれよりも、データをもう少し整備していくことでプロダクトで使える可能性をどんどん上げられるようになっていくのかなと考えております。

駆け足でしたけれども、最後に、今現在抱えている問題点について軽く触れますと、中盤で言ったリビングの定義の話じゃないですが、データがすごい恣意的になります。これが非常に最終的には厄介になってくると思っています。

要は、「誰が言った、何なんだ」という、「概念とは何か」みたいな、けっこう深い話に入っていくのが、最終的に一番乗り越えなきゃいけないところかなと思っていたところに、最近googleさんが作ったAlphaGo Zeroの論文が非常に衝撃的でした。アブストラクトはどこでも読めるので、Natureに載ってると思います。

これがすごかったのが、without humanデータで……。つまり、今までAlphaGoって、棋士のデータをベースに囲碁を学んでたんですけれども、入力データなしで囲碁を学び出したんです。詳細を読むとけっこう複雑なことが書いてあるんですけれども、そういうことをだんだんやり出せるようになっています。

概念すらも人間が教える必要がないとなるとさらにいいですよね。僕の次の浅はかな野望で言うと、外縁からきちんと機械が学んでいくという世界観にしたい。もはやデータ分類もしたくないので、とにかくデータをドコドコぶっこんで、ユーザーさんのアクティビティいろんな情報を突っ込むと、いつのまにか人間並みの判定をしてくれるイケメンが出てくることを次はどんどん期待して待っています。「巨人、期待してますよ」という感じですね(笑)。

まずはアナログ作業を機械化することから考えてみる

我々がやる可能性ももちろんあると思います。できたら非常にうれしいと思っています。本当に最後の最後のまとめですけれども、知恵と工夫でがんばればなんとかできます。深層学習であっても、わりとできるところまでは来ています。

一部に関しては深い知識を追いかけてもいいと思ってます。機械学習系はきちんと知らなければ使い勝手が悪いものというがあるので、それに関してはコストをかけてもいいかなと思っていますが、深層学習に関してはけっこう慎重になったほうがいいと正直思っています。

小さい会社で真面目にこれを突き詰め始めると、けっこうなコストがかかったりする割には転用のところの知恵が足りなくてミスる、みたいなことはあるかなと思っています。

データがすごく重要になります。なので早めに整理したり、データをすぐに出せる状態にしたり、それに関しては今から直ちにやるべきだと思います。

これはちょっとした工夫ですけれども、人間がやってることを代替するというのをまずやってみると非常に想像つきやすいかなと思います。今やっている作業がほぼルールだなと思ったら、それを機械化できないかと発想していくと、だんだん概念的なところまでモデル化しようという思えるかなと思います。以上になります。

最後の最後で、実はCloud ML Engine は本当にすばらしいので、いちいちP3インスタンスを立ち上げて、夜中にストップしてということをやらなくて済みますという。Jupyterから直接ボーンと送れるので、ぜひこれは使ってみてください。

最後の最後に足しちゃうんですけれども、エンジニアが欲しいので……(笑)。

(会場笑)

樽石さんが最後に「エンジニア募集」って言ってたので、それもありなんだと思って付け加えました。積極的に募集してますので、ぜひよろしくお願いいたします。ご清聴ありがとうございました。

(会場拍手)