機械学習や人工知能、AI関連分野を取り巻く情勢
機械学習や人工知能、AI関連の記事で気になったものをピックアップし、Google Keepにメモする習慣をつけている。
メモに残す記事の数はだいたい一日2、3件。
(日本語英語問わずチェックしているが、ひと目見た時の情報量の多さから、日本語記事をメモに残しがち)
一ヶ月半強分のメモが貯まってきたので、どんな記事に興味を示す傾向があるのか、少し振り返ってみたい。傾向としては大きく以下の2つに分かれるようだ。
1.企業の活用事例
私自身が企業人であることから、世の企業がどんな風に新たな技術を取り込み、どんな商品やサービスを打ち出そうとしているのか、ビジネスを生み出そうとしているのかに関心を示すのは、自然なことと言える。
たとえば警察が犯罪の発生を予測するためにAI導入するとしているとか、製造業が不適合品の発見に予測モデルを適用しようとしているとか、そういう類のもの。
2.大企業の出資事例、ベンチャー企業の調達事例
時代の流れに乗りたい大企業は、自社で新たに技術を確立しようにも時間やお金がかかるし、そもそもそういったことができる人材が不足しているため、所謂オープン・イノベーション的なことを実現すべく、他社とのアライアンスや出資、さらにはM&Aをおこなうことが多い。
そもそもこうした背景には、今のAIブームのスピード感に付いていくためには、一から人を育成し事業を育てていても時間がかかるため、どんどん取り残されていくリスクが生じることがある。
他にも、世界の上場企業の中には、手元に膨大なキャッシュが積み上がっている一方で、有望な使い道が見つからないという「金余り」の状況が見受けられたりする。こうした背景から企業が投資先を積極的に探しているという事情も、ベンチャー企業への出資を後押ししていると言える。
一方のベンチャー企業側は、事業を拡大していく上で資金調達は必要なポイントなので、理想的なパートナーが見つかれば、出資を受け入れることを選択する。
日本国内でも数十億円規模の大型調達がちらほらと出ており、昨年末からの出来事を振り返っても、プリファードインフラストラクチャーの調達や、少し毛色は異なるが、FOLIOの調達案件などが話題となった。
こんな感じで引き続きアンテナを張って記事をチェックしていきたい。
ブログを綴るということ
去年取り組んでいたDeep LearningのMOOC (Massive Online Open Course) 、Fast.ai。
fast.ai · Making neural nets uncool again
ここではDeep Learningの概念や実装上の具体的な手法を学ぶとともに、学習を続けていく上でのマインドセットも鍛えられた。
(ちなみに、Fast.aiは昨年半ばから第二期に入っており、現在のフレームワークは、第一期に使われていたKeras (+ Theanoをbackend) から、PyTorchをベースとするfast.aiライブラリへ移行している。)
そんなFast.aiをJeremy氏と共に運営しているRachel氏のブログ記事を改めて読み、インスパイアされたので綴っておく。
なぜブログを書くのか?
Rachel氏の投稿には、ブログ記事を書くことによって期待できる効果についてまとめられている。
その内容はというと、
- とにかくブログを始めよう。ブログは学んだ知識を体系化し、自身の理解を促す。新しいアイデアを生み出すことに役立つ。
- ブログは履歴書にもなり、多くの人と繋がれるきっかけをつくる。
- 結果として、仕事のオファーや講演依頼を受けるようなこともある。
- email等で良く飛んでくる質問に対する答えを書いておくことで、同じ質問が来たときにかかる二度手間を省くことができる。
というもので、。
実際にFast.aiを受講した人の中でも優れたブログ記事を書き上げている人が多数存在するらしい。
このようにブログは学習の場であると同時に、自身の成果や考えを自由に発信できる場であると言える。
とはいえ、そんなことは今更言われなくてもわかっているけれど、
書くことが思いつかなかったり、書くのが面倒くさくなったりと、続けられない理由ばかりが出てきてしまう。
ブログを書く上でのアドバイス
ブログ執筆を強く勧めるRachel氏も、書くネタもなければ、書くこと自体を苦手と捉えていて、最初はなかなか始められなかったそうだ。
そんな彼女からの、自身の経験を基にしたブログを綴っていく上でのアドバイスも、上述した記事の中で読者へのメッセージとして記されていた。
- 自分の気に入ったブログ記事やニュース記事を集め、それらのリンクをリスト化する。
- そして、特に重要と感じた部分を要約したり、強調したりして、サマリーを作る。
- 学会・講演会や勉強会に参加した場合、そこで学んだことを要約する。
- 完璧主義にならない。クオリティにこだわりすぎず、スピーディーな投稿を心がける。
- 自分と同レベルの他の初級〜中級者が記事を読んだときに、その読者の理解を促すきっかけとなる。専門家はそのトピックに最初に触れた時、どのように理解に苦しんだのかを覚えていないので、専門家すぎる人より、ちょっと理解が進んだ程度の人が書いた記事のほうが、受け入れられやすかったりする。
- 怒りや憤りを感じたら、なぜそう感じるかを言葉で説明してみる。
僕はこれまで自分の興味や関心を、思い立ったときに一貫性なくブログに綴ってきたが、例えば最近では機械学習やディープラーニング周辺の勉強を余暇の時間におこなっているので、学びのアウトプットの場としてもっとブログを活用していくべきと感じた。
(というか、書くことで学んだことを定着させるという学習スタイルをちゃんと確立したほうがいいと感じた。)
メモツールについて
Evernoteが1年半ほど前に無料版で2台までと利用が制限されてしまって以来、
しっくりくるメモアプリ探しを続けている。
ツールはあくまでツール。当たり前だけども何をやりたいのかを明確にすることは必要。
そもそもメモアプリの機能は淘汰されたり、サービスが中止になったりすることもありうるので、状況に応じてすぐに切り替えられる柔軟性も大事。フィロソフィーを持つというか。
とはいえ、使ってみることでアイデアが湧いてくると思うので、難しいことは考えすぎずに、色々と試している。
そんな自分のメモアプリを取り巻く状況について、まとめてみたい。
Evernote
以前は有料会員になるくらいのEvernoteヘビーユーザーだった。
取扱説明書や仕事に使えそうな資料などpdfは何でも送っていたし、気になったWebページのクリップ保存やToDoリスト、レシピメモに至るまで、メモというメモはEvernoteで管理していた。
残念ながら今はすっかり利用頻度が減ってしまっている。
昔はなくなったら困ると思っていたが、無くても普通に生きていけることが証明されてしまった。
OneNote
Evernoteの代替ツールの筆頭として、まずはEvernoteとの併用、その後の移行を試みたが失敗。
OneNoteはEvernoteよりも動作が重い上、同期がうまくいかないといった使い勝手の悪さ、さらにはOffice 365の年会費を払わないとOneDriveの容量が確保できないなど、いろんな障壁を感じてしまって使いこなせなかった。
ただ、ノートを簡単に切り替えられるタブ機能は気に入っている。
Keep
タブなりノート間を切り替える機能が少なく不便な印象を受け、最初は少し毛嫌いしていた。
しかし、書いたメモをポストイットの様にホワイトボードへ貼っていくような感覚は視覚効果が高く、使いやすい。また、テキストメモなので、動作も軽く、同期も速い点はかなりポイントが高い。
ラベルを付けておけば簡単にフィルタリング出来るので、数が増えていっても
一番のポイントはToDoリストとGoogle Calendarとの連携がシームレスにおこなえること。
Gmail含め、Googleのエコシステムの中で完結させることが、なんだかんだ一番便利なのかもしれない。
Evernoteでやっていた、気になるWebページをクリップし「あとで読む」ことについては、Pocketへ移行している。
EvernoteのWebクリップにはそこそこ時間がかかったのに対し、Pocketは一瞬なので重宝している。
また、スマホからでもストレスなくクリップできるので、最近は使用頻度がかなり高い。
Slack
メモツールというよりコミュニケーションツールだが、あらゆる情報を一つのプラットフォームへ集約するという点では有用と考え、一人Slackを開始。流行りのツールなので、触って慣れてみたかったというのもある。
トピックに応じてチャンネルを分ける機能や、ソースコードを埋め込める機能が気に入っている。
プログラミングや機械学習関係で気になったことはメモしたりもするが、どちらかと言うとRSSのFEEDを読み込んだり、関心の高いグループに参加して情報を取ったりという使い方がメイン。
最近では、下3つのアプリ・サービスを併用して使うのが自分の中で主流。
再現率と適合率
検索システムや検査などの識別問題でよく使われる「再現率」と「適合率」。
教科書に書かれている説明でなんとなく理解はしているものの、ふと思い出そうとしたときにどっちがどっちだったか曖昧になることが多い。
そこで、理解を深めることを目的に、わかりやすくまとめられている記事を探してみた。
まず教科書上の定義からすると、以下の通りとなる。
- 再現率(Recall)= 真陽性(True Positive)/ (真陽性+偽陰性(False Negative))
- 適合率(Precision) = 真陽性(True Positive)/(真陽性+偽陽性(False Positive))
分子はどちらとも同じで、分母の一部が偽陰性か偽陽性かが異なるだけ。ただ、数式中の記号をそのまま読み上げても、やっぱりイメージが湧かない。
そこで、参考記事の例を拝借し、病気の検査、犬の写真検索で言い表してみると、
- 再現率:病気の人のうち、検査により本当に病気である人を発見できる確率。あるいは、犬の写真のうち、検索により犬の写真を正しく発見できる確率。
- 適合率:検査により陽性反応が出たとき(検査結果)、それが本当に病気である確率。あるいは、検索により犬の写真が見つかったとき(検索結果)、それが本当に犬の写真である確率。
となり、実世界でこれら指標がどのような場面で適用されうるかも含め、少しクリアになった気がする。
ちなみに再現率と適合率はトレードオフの関係にあるので、その両方を加味して性能を評価するために、両者の調和平均(逆数の和の逆数×2)をとったF値が使われるケースもある。
Floydhubのセットアップから基本的な使い方まで
前回の投稿で、FloydHubというクラウドサービスへたどり着き、GPUを試すようになるまでの過程を綴ってみた。
今回は、FloydHubの利用方法について、簡単にまとめてみた。
- セットアップの流れ
- ローカル上でのプロジェクトソースコードの準備
- FloydHubでJupyter Notebookを使う
- データセットのアップロード
- アップロードしたデータの呼び出し
- プロジェクトおよびデータセットの消去について
- まとめ
セットアップの流れ
まずは以下のサイトへアクセスし、アカウント設定をおこなう。
Floyd Zero Setup Deep Learning
アカウントが取れたら、pipを使ってCLIをインストールする。
$ pip install -U floyd-cli
その後、以下のコマンドでログインを入力するとWebブラウザでマイページへ移動する。
表示されたトークンをコピペすることでログインが完了。
$ floyd login
ローカル上でのプロジェクトソースコードの準備
使いたいソースコードがある場合は、cdで該当フォルダへ移動、
特にない場合は、チュートリアルにあるRNNなんかをgitからローカルへレポジトリする。
※以下、例としてチュートリアルから抜粋。
$ git clone https://github.com/floydhub/tensorflow-examples.git
$ cd tensorflow-examples/3_NeuralNetworks
新しいプロジェクト開始時はinitコマンドを使って定義する必要があり、以下のように入力する。
$ floyd init <プロジェクト名>
FloydHubでJupyter Notebookを使う
初期設定が終わったら、floyd runを使っていよいよ実行。
Pythonファイルをそのままサーバー上で走らせることも可能だが、
インタラクティブに作業が進められるJupyter Notebookの使い勝手が良いため、
個人的には--mode jupyterを加えてJupyterを立ち上げるのがオススメ。
具体的には、以下のようにコマンドを入力する。
$ floyd run \ --mode jupyter \ --env theano:py2 \ --gpu
モードの次に--envを加えているが、これによりディープラーニングのフレームワークやPythonのバージョンを指定することができる。
上記の例の場合、TheanoとKeras 1.2.2をPython2環境で用意してくれる。
その他、詳しくは以下をご参照のこと。
Environments - FloydHub
また、runコマンドの最後に--gpuを加えているが、これによりGPUサーバーを使えるようになる。
GPUを必要としない作業を低コストで実行したい場合は、これを--cpuへ変更することで、CPUサーバーが利用可能。
ちなみに17年7月1日現在、GPUのコストは1時間あたり$0.4で、CPUはその10分の1の$0.04。
データセットのアップロード
データを新たにアップロードしたいときは、プロジェクトのときと同様に、initを使って初期設定をする必要がある。
$ floyd data init <ファイル名>
続けて以下を入力するとアップロードが開始される。
$ floyd data upload
アップロードが完了するとID名が発行されるため、以降呼び出すときはそのID名を使用する。
アップロードしたデータがzipファイルであるとき、
以下のコマンドを使うとJupyterを立ち上げることなく、CPUサーバー上で解凍してくれる。
$ floyd run --cpu --data <ID名> "unzip /input/<ファイル名>.zip -d /output"
なお、ローカルからアップロードするのではなく、どこかweb上のサーバーから直接Floydサーバーへダウンロードすることもできる。
この場合、floydでJupyter Notebookを立ち上げたあとTerminalを起動し、
wgetコマンドなどを使って指定したURLからデータをダウンロードすればよい。
アップロードしたデータの呼び出し
既にアップロードをし、IDを取得したデータを別のプロジェクトで使いたい場合は、
次のようにrunコマンドの中でデータのIDを指定すればよい。
$ floyd run \ --mode jupyter \ --data <ID名>\ --env tensorflow-1.0:py2 \ --gpu
なお、プロジェクトファイルはoutputディレクトリにあるが、読み込んだデータはinputにある点に注意する必要がある。
そのため、ファイルパスを../inpu/で指定する必要がある。
プロジェクトおよびデータセットの消去について
同じプロジェクトでも立ち上げる度に新しいバージョンが作成され、
モジュール及びアウトプットの数が不必要に増えてしまうことがある。
そのため、ストレージの容量を減らしたいときは、少々面倒だが以下のようなコマンドを実行することになる。
なお、消去したい対象が複数あるときは、IDを続けて足していけば、一行でまとめて処理することが可能。
・プロジェクトを消去するとき
$ floyd delete <ID名>
・データセットを消去するとき
$ floyd data delete <ID名>
まとめ
プロジェクトの数が増えてくると管理が煩雑になることもあるが、
コマンドがシンプルだったり、ポータルサイトが使いやすかったり、
なにより100時間分の無料利用がついてきたりするので、手を動かしながらDeep Learningを学ぶ場として重宝しています。
Deep LearningとGPU環境
ちょっと前からfast.aiの提供するディープラーニングのオンラインコース、「Practical Deep Learning For Coders」に取り組んでいる。
このコースでは定番の犬猫分類などを扱ったりするのだが、私は手持ちのMacBook Pro上でプログラムを走らせるために、オリジナルのデータからいくらか画像データを抽出した小規模なデータセットで課題に取り組んでいた。
しかしコースが進むにつれ、Kaggleの過去コンペで使われたデータセットを扱う課題が出てくるなど、CPUで処理していては何日かかるかわからないようなタスクに対処するため、GPU環境を利用してみることにした。
AWSでGPUを動かす
そこで、fast.aiが推奨しているAWS(Amazon Web Service)でGPU(NVIDIA Tesla K80)が使用できるp2インスタンスをしばらく試してみることに。
MacBook ProのCPUに比べて圧倒的に早い処理速度を体感することができたが、気になるのはそのコスト。
課金は1時間あたり$0.90であり、しかも立ち上げる度に課金されてしまうため、うまくいかなくて短時間に何度も再起動を繰り返していると、その分コストが跳ね上がる。
インスタンスもさることながら、更に厄介なのがストレージであるEBS(Elastic Block Store)。
fast.aiのチュートリアルに沿っていくと128 GBのストレージが出来上がり、インスタンス動作の有無や保存データの量にかかわらず、ストレージの維持だけで月$12.8もかかってしまう。
結果、ちょこちょことAWS上で作業するだけで、軽く月$30〜$40は超えてしまう。趣味の延長で使うには、お財布にやさしくない。
FloydHubとの出会い
もっと安く、手軽にGPUを触る方法はないものかとあれこれ調べていたところ、FloydHubと呼ばれるDeep Learning専用のサービスを発見した。
Floyd Zero Setup Deep Learning
単価は1時間あたり$0.40とAWSの半分以下、ストレージも保存量に比例して課金されるということで、ライトユーズに適している。
さらに嬉しいことに、最初の100時間は無料で利用できるということで、気持ちに余裕がもてる。
良いサービスだと思うので、これからも大きなトラブルなく、安定的に稼働し続けてほしい。
FloydHubの使い方については、次回の記事で少しばかりまとめてみたい。
Chromebookは今後盛り上がるのか?
Chromebookを購入してからおよそ半年が経つが、動作の軽さ、電池のもち、キーボード付属といった点から使い勝手がよく、2〜3万円で買える端末としては十分だと感じている。
しかし、日本語でChromebookについて書いている記事やブログを探しても、大した数が引っかからないのが現状で、相変わらず日本での注目度が高まっていないことが伺える。出荷数が年々伸びているとはいえ、その殆どが教育機関向けらしいので、小売店で見かける機会は正直多くない。
世の中スマホさえあれば事足りるという人が増えているようだが、個人的にはスマホの小さい画面だとできることに限界があるし、タブブラウザの使いにくさや文字の打ち辛さなどから、それだけでは不十分と感じてしまう。
じゃあ、使い慣れたWindowsやMacを使えばそれで済むのでは?、という意見もきっとあるだろう。けれども、プライベートでマイクロソフト・オフィスとか業務で使うようなアプリケーションを使う場面はそれほど多くないし、正直ブラウザ(Chrome)さえ開ければことが済む場面が非常に多いので、それなら最初からChromeしか入っていないパソコンの方がシンプルだし、やりたいことのほとんどが実現できるんじゃないか、ということ。
複数の端末を所持しているが、それぞれの端末でおこなっていることをなんとなく棚卸ししてみた。
・スマホ(iPhone):LINEやSMSのやり取り、写真の撮影・管理、SNS(InstagramやTwitter)のチェック、電話、たまにゲーム
・タブレット(iPad):Webブラウジング、動画鑑賞(YouTube)、メールやスケジュールの閲覧、雑誌の閲覧、RSSリーダーやメモアプリの使用、音楽鑑賞(Spotify)
・電子書籍リーダー(Kindle):電子書籍の閲覧
・メインPC(Macbook):プログラミングでの高度な処理、音楽鑑賞(iTunes)、楽曲制作(Ableton Live)、Slingbox鑑賞
・サブPC(Chromebook):Webブラウジング、RSSリーダーのチェック、動画鑑賞(YouTube)、ブログの作成、音楽鑑賞(Spotify)
ということで、リアルタイムなやり取りや写真の管理という用途では持ち運びに優れたiPhone、Webからの情報インプットにはiPadとChromebookを状況に応じて使い分け、アウトプット(タイピング)要素が強くなってくるとややChromebookよりになる、という感じ。MacbookProの出番は、ややヘビーでクリエイティブな作業をするときに限られてきている。
今年は2-in-1のリリースが多いのと、Androidアプリ対応機種の幅が広がることから、日本でも益々盛り上がってくれることを期待する。