ブログを綴るということ

去年取り組んでいた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氏のブログ記事を改めて読み、インスパイアされたので綴っておく。

medium.com

なぜブログを書くのか?

Rachel氏の投稿には、ブログ記事を書くことによって期待できる効果についてまとめられている。

その内容はというと、

  • とにかくブログを始めよう。ブログは学んだ知識を体系化し、自身の理解を促す。新しいアイデアを生み出すことに役立つ。
  • ブログは履歴書にもなり、多くの人と繋がれるきっかけをつくる。
  • 結果として、仕事のオファーや講演依頼を受けるようなこともある。
  • email等で良く飛んでくる質問に対する答えを書いておくことで、同じ質問が来たときにかかる二度手間を省くことができる。

というもので、。
 
実際にFast.aiを受講した人の中でも優れたブログ記事を書き上げている人が多数存在するらしい。
このようにブログは学習の場であると同時に、自身の成果や考えを自由に発信できる場であると言える。

とはいえ、そんなことは今更言われなくてもわかっているけれど、
書くことが思いつかなかったり、書くのが面倒くさくなったりと、続けられない理由ばかりが出てきてしまう。

ブログを書く上でのアドバイス

ブログ執筆を強く勧めるRachel氏も、書くネタもなければ、書くこと自体を苦手と捉えていて、最初はなかなか始められなかったそうだ。

そんな彼女からの、自身の経験を基にしたブログを綴っていく上でのアドバイスも、上述した記事の中で読者へのメッセージとして記されていた。

  • 自分の気に入ったブログ記事やニュース記事を集め、それらのリンクをリスト化する。
  • そして、特に重要と感じた部分を要約したり、強調したりして、サマリーを作る。
  • 学会・講演会や勉強会に参加した場合、そこで学んだことを要約する。
  • 完璧主義にならない。クオリティにこだわりすぎず、スピーディーな投稿を心がける。
  • 自分と同レベルの他の初級〜中級者が記事を読んだときに、その読者の理解を促すきっかけとなる。専門家はそのトピックに最初に触れた時、どのように理解に苦しんだのかを覚えていないので、専門家すぎる人より、ちょっと理解が進んだ程度の人が書いた記事のほうが、受け入れられやすかったりする。
  • 怒りや憤りを感じたら、なぜそう感じるかを言葉で説明してみる。


僕はこれまで自分の興味や関心を、思い立ったときに一貫性なくブログに綴ってきたが、例えば最近では機械学習ディープラーニング周辺の勉強を余暇の時間におこなっているので、学びのアウトプットの場としてもっとブログを活用していくべきと感じた。
(というか、書くことで学んだことを定着させるという学習スタイルをちゃんと確立したほうがいいと感じた。)

Remove all ads

メモツールについて

Evernoteが1年半ほど前に無料版で2台までと利用が制限されてしまって以来、

しっくりくるメモアプリ探しを続けている。

 

ツールはあくまでツール。当たり前だけども何をやりたいのかを明確にすることは必要。

そもそもメモアプリの機能は淘汰されたり、サービスが中止になったりすることもありうるので、状況に応じてすぐに切り替えられる柔軟性も大事。フィロソフィーを持つというか。

 

とはいえ、使ってみることでアイデアが湧いてくると思うので、難しいことは考えすぎずに、色々と試している。

そんな自分のメモアプリを取り巻く状況について、まとめてみたい。

 

Evernote

以前は有料会員になるくらいのEvernoteヘビーユーザーだった。

取扱説明書や仕事に使えそうな資料などpdfは何でも送っていたし、気になったWebページのクリップ保存やToDoリスト、レシピメモに至るまで、メモというメモはEvernoteで管理していた。

残念ながら今はすっかり利用頻度が減ってしまっている。

昔はなくなったら困ると思っていたが、無くても普通に生きていけることが証明されてしまった。

 

OneNote

Evernoteの代替ツールの筆頭として、まずはEvernoteとの併用、その後の移行を試みたが失敗。

OneNoteEvernoteよりも動作が重い上、同期がうまくいかないといった使い勝手の悪さ、さらにはOffice 365の年会費を払わないとOneDriveの容量が確保できないなど、いろんな障壁を感じてしまって使いこなせなかった。

ただ、ノートを簡単に切り替えられるタブ機能は気に入っている。

 

Keep

タブなりノート間を切り替える機能が少なく不便な印象を受け、最初は少し毛嫌いしていた。

しかし、書いたメモをポストイットの様にホワイトボードへ貼っていくような感覚は視覚効果が高く、使いやすい。また、テキストメモなので、動作も軽く、同期も速い点はかなりポイントが高い。

ラベルを付けておけば簡単にフィルタリング出来るので、数が増えていっても

一番のポイントはToDoリストとGoogle Calendarとの連携がシームレスにおこなえること。

Gmail含め、Googleのエコシステムの中で完結させることが、なんだかんだ一番便利なのかもしれない。

 

Pocket

Evernoteでやっていた、気になるWebページをクリップし「あとで読む」ことについては、Pocketへ移行している。

EvernoteのWebクリップにはそこそこ時間がかかったのに対し、Pocketは一瞬なので重宝している。

また、スマホからでもストレスなくクリップできるので、最近は使用頻度がかなり高い。

 

Slack

メモツールというよりコミュニケーションツールだが、あらゆる情報を一つのプラットフォームへ集約するという点では有用と考え、一人Slackを開始。流行りのツールなので、触って慣れてみたかったというのもある。

トピックに応じてチャンネルを分ける機能や、ソースコードを埋め込める機能が気に入っている。

プログラミングや機械学習関係で気になったことはメモしたりもするが、どちらかと言うとRSSのFEEDを読み込んだり、関心の高いグループに参加して情報を取ったりという使い方がメイン。

 

最近では、下3つのアプリ・サービスを併用して使うのが自分の中で主流。

Remove all ads

再現率と適合率

検索システムや検査などの識別問題でよく使われる「再現率」と「適合率」。

教科書に書かれている説明でなんとなく理解はしているものの、ふと思い出そうとしたときにどっちがどっちだったか曖昧になることが多い。

そこで、理解を深めることを目的に、わかりやすくまとめられている記事を探してみた。

 

mathwords.net

zellij.hatenablog.com

 

まず教科書上の定義からすると、以下の通りとなる。

  • 再現率(Recall)= 真陽性(True Positive)/ (真陽性+偽陰性(False Negative))
  • 適合率(Precision) = 真陽性(True Positive)/(真陽性+偽陽性(False Positive))

 

分子はどちらとも同じで、分母の一部が偽陰性偽陽性かが異なるだけ。ただ、数式中の記号をそのまま読み上げても、やっぱりイメージが湧かない。

そこで、参考記事の例を拝借し、病気の検査、犬の写真検索で言い表してみると、

  • 再現率:病気の人のうち、検査により本当に病気である人を発見できる確率。あるいは、犬の写真のうち、検索により犬の写真を正しく発見できる確率。
  • 適合率:検査により陽性反応が出たとき(検査結果)、それが本当に病気である確率。あるいは、検索により犬の写真が見つかったとき(検索結果)、それが本当に犬の写真である確率。

となり、実世界でこれら指標がどのような場面で適用されうるかも含め、少しクリアになった気がする。

 

ちなみに再現率と適合率はトレードオフの関係にあるので、その両方を加味して性能を評価するために、両者の調和平均(逆数の和の逆数×2)をとったF値が使われるケースもある。

Remove all ads

Floydhubのセットアップから基本的な使い方まで

前回の投稿で、FloydHubというクラウドサービスへたどり着き、GPUを試すようになるまでの過程を綴ってみた。

nami3373.hatenablog.com

今回は、FloydHubの利用方法について、簡単にまとめてみた。

セットアップの流れ

まずは以下のサイトへアクセスし、アカウント設定をおこなう。
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」に取り組んでいる。

course.fast.ai

このコースでは定番の犬猫分類などを扱ったりするのだが、私は手持ちのMacBook Pro上でプログラムを走らせるために、オリジナルのデータからいくらか画像データを抽出した小規模なデータセットで課題に取り組んでいた。

しかしコースが進むにつれ、Kaggleの過去コンペで使われたデータセットを扱う課題が出てくるなど、CPUで処理していては何日かかるかわからないようなタスクに対処するため、GPU環境を利用してみることにした。

AWSGPUを動かす

そこで、fast.aiが推奨しているAWSAmazon Web Service)でGPUNVIDIA 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の使い方については、次回の記事で少しばかりまとめてみたい。

Remove all ads

Chromebookは今後盛り上がるのか?

Chromebookを購入してからおよそ半年が経つが、動作の軽さ、電池のもち、キーボード付属といった点から使い勝手がよく、2〜3万円で買える端末としては十分だと感じている。

nami3373.hatenablog.com


しかし、日本語でChromebookについて書いている記事やブログを探しても、大した数が引っかからないのが現状で、相変わらず日本での注目度が高まっていないことが伺える。出荷数が年々伸びているとはいえ、その殆どが教育機関向けらしいので、小売店で見かける機会は正直多くない。
世の中スマホさえあれば事足りるという人が増えているようだが、個人的にはスマホの小さい画面だとできることに限界があるし、タブブラウザの使いにくさや文字の打ち辛さなどから、それだけでは不十分と感じてしまう。

じゃあ、使い慣れたWindowsMacを使えばそれで済むのでは?、という意見もきっとあるだろう。けれども、プライベートでマイクロソフト・オフィスとか業務で使うようなアプリケーションを使う場面はそれほど多くないし、正直ブラウザ(Chrome)さえ開ければことが済む場面が非常に多いので、それなら最初からChromeしか入っていないパソコンの方がシンプルだし、やりたいことのほとんどが実現できるんじゃないか、ということ。


複数の端末を所持しているが、それぞれの端末でおこなっていることをなんとなく棚卸ししてみた。
スマホiPhone):LINEやSMSのやり取り、写真の撮影・管理、SNSInstagramTwitter)のチェック、電話、たまにゲーム
タブレットiPad):Webブラウジング、動画鑑賞(YouTube)、メールやスケジュールの閲覧、雑誌の閲覧、RSSリーダーやメモアプリの使用、音楽鑑賞(Spotify
電子書籍リーダー(Kindle):電子書籍の閲覧
・メインPC(Macbook):プログラミングでの高度な処理、音楽鑑賞(iTunes)、楽曲制作(Ableton Live)、Slingbox鑑賞
・サブPC(Chromebook):WebブラウジングRSSリーダーのチェック、動画鑑賞(YouTube)、ブログの作成、音楽鑑賞(Spotify


ということで、リアルタイムなやり取りや写真の管理という用途では持ち運びに優れたiPhone、Webからの情報インプットにはiPadChromebookを状況に応じて使い分け、アウトプット(タイピング)要素が強くなってくるとややChromebookよりになる、という感じ。MacbookProの出番は、ややヘビーでクリエイティブな作業をするときに限られてきている。

今年は2-in-1のリリースが多いのと、Androidアプリ対応機種の幅が広がることから、日本でも益々盛り上がってくれることを期待する。

www.techradar.com

グーグルに学ぶディープラーニング

少し前に読了した「グーグルに学ぶディープラーニング」。
分量はさほど多くなくさらっと読んでしまった本なので、あまり頭に残っていないのではと危惧し、振り返ってみることにした。

グーグルに学ぶディープラーニング

グーグルに学ぶディープラーニング

ディープラーニングの定義

前回の記事でも少し触れたが、ディープラーニング機械学習の一部である。では、機械学習はどんなものかというと、本書に書かれている定義によると、
「機械が答えを出すための手法を、機械が自動的に膨大なデータから学習してモデルを作る」ということ。ここでいうモデルとして、決定木や機能推論、ニューラルネットワークに加え、ディープラーニングが代表的な手法として挙げられている。機械学習の仕組みは、本書の例えにある通り子どもが知識を獲得していく過程を想像するとイメージがつかみやすい。
これに対してディープラーニング(深層学習)は、「複数の層の処理を重ねて複雑な判断をできるようにする技術」とあり、計算の量が膨大となるのが特徴であると書かれている。

なお、本書は「ディープラーニング機械学習の一部である」ことを強調しているために触れられていないようだが、私の理解では従来の機械学習ディープラーニングとの大きな違いの一つとして、前者では特徴量の抽出・設計作業を人間がおこなっているのに対して、後者では特徴を自動的に抽出して学習する、というものがある。
特徴量の抽出とは、例えば何かの動物を認識する場合、入力されたデータから身長、体重、顔の形、毛の長さといった特徴を数値化する作業のことを指す。これは職人芸と揶揄されることもある領域であり、機械学習の精度は特徴量抽出の良し悪しに左右されることも多い。ディープラーニングではこうした特徴量抽出の手間が省けるため、画期的な技術と見なされているように思われる。

ディープラーニング活用事例

最初に出てくる例が「Google Home」という音声認識自然言語処理機能を活用した端末であり、日々の情報収集やエンターテイメントの利用、家電類のコントロールを可能にするもの。この分野ではAmazon音声認識サービス「Alexa」を搭載したEchoという競合が存在するので、今後両者、はたまた第三者がどのように発展していくのか、興味深いところである。

次に紹介されているのは自動運転技術であり、この分野に関しては日本の自動車メーカーも大いに関係してくるということで、ニュース記事を目にすることも多い。

その次のデータセンターでの省エネ化事例も興味深く、設備運転の最適化にディープラーニングが活用されており、電力使用量の15%を削減可能にしたとのこと。

将来展望

企業での活用事例などは割愛して、最後に今後の展望について少しだけ触れてみたい。
ディープラーニングはたくさんのデータを必要とする「データハングリー」な技術であるが、少ないデータでの画像認識やノイズが含まれたデータから有意義な情報を取り出すといった課題に取り組んでいくことや、複数の分野の専門知識を融合させた新しいアプローチ(例えば動画認識)が必要になることも触れられていた。「AIの民主化」をミッションの一つとして掲げるグーグルが、今後こうした課題に対してどのように取り組み、どんなサービスを生み出していくのか、引き続き注視していきたい。