再現率と適合率
検索システムや検査などの識別問題でよく使われる「再現率」と「適合率」。
教科書に書かれている説明でなんとなく理解はしているものの、ふと思い出そうとしたときにどっちがどっちだったか曖昧になることが多い。
そこで、理解を深めることを目的に、わかりやすくまとめられている記事を探してみた。
まず教科書上の定義からすると、以下の通りとなる。
- 再現率(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アプリ対応機種の幅が広がることから、日本でも益々盛り上がってくれることを期待する。
グーグルに学ぶディープラーニング
少し前に読了した「グーグルに学ぶディープラーニング」。
分量はさほど多くなくさらっと読んでしまった本なので、あまり頭に残っていないのではと危惧し、振り返ってみることにした。
- 作者: 日経ビッグデータ
- 出版社/メーカー: 日経BP社
- 発売日: 2017/01/26
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
ディープラーニングの定義
前回の記事でも少し触れたが、ディープラーニングは機械学習の一部である。では、機械学習はどんなものかというと、本書に書かれている定義によると、
「機械が答えを出すための手法を、機械が自動的に膨大なデータから学習してモデルを作る」ということ。ここでいうモデルとして、決定木や機能推論、ニューラルネットワークに加え、ディープラーニングが代表的な手法として挙げられている。機械学習の仕組みは、本書の例えにある通り子どもが知識を獲得していく過程を想像するとイメージがつかみやすい。
これに対してディープラーニング(深層学習)は、「複数の層の処理を重ねて複雑な判断をできるようにする技術」とあり、計算の量が膨大となるのが特徴であると書かれている。
なお、本書は「ディープラーニングが機械学習の一部である」ことを強調しているために触れられていないようだが、私の理解では従来の機械学習とディープラーニングとの大きな違いの一つとして、前者では特徴量の抽出・設計作業を人間がおこなっているのに対して、後者では特徴を自動的に抽出して学習する、というものがある。
特徴量の抽出とは、例えば何かの動物を認識する場合、入力されたデータから身長、体重、顔の形、毛の長さといった特徴を数値化する作業のことを指す。これは職人芸と揶揄されることもある領域であり、機械学習の精度は特徴量抽出の良し悪しに左右されることも多い。ディープラーニングではこうした特徴量抽出の手間が省けるため、画期的な技術と見なされているように思われる。
ディープラーニング活用事例
最初に出てくる例が「Google Home」という音声認識、自然言語処理機能を活用した端末であり、日々の情報収集やエンターテイメントの利用、家電類のコントロールを可能にするもの。この分野ではAmazonの音声認識サービス「Alexa」を搭載したEchoという競合が存在するので、今後両者、はたまた第三者がどのように発展していくのか、興味深いところである。
次に紹介されているのは自動運転技術であり、この分野に関しては日本の自動車メーカーも大いに関係してくるということで、ニュース記事を目にすることも多い。
その次のデータセンターでの省エネ化事例も興味深く、設備運転の最適化にディープラーニングが活用されており、電力使用量の15%を削減可能にしたとのこと。
人工知能ブームを捉えてみる
最近、やたらとAI、人工知能というキーワードが流行っており、ニュース記事や雑誌でもその文字を目にすることが多くなっている。まさにブーム。専門家の方々によると、今のブームは第三次ブームということらしい。僕は人工知能の研究者でもなんでもないが、近い将来、ますます人の生活に入り込み、多大な影響を及ぼすであろうこの分野の動向を捉えたいという動機から、文献や各種記事に目を通すようにしている。
さて、第三次ブームを牽引しているのはディープラーニング(深層学習)という技術である。この技術が登場して以来、画像や音声認識精度の目覚ましい向上が見られ、Facebookにアップされた写真から自動で顔が認識されることや、Googleの翻訳サービスが海外旅行や出張でもある程度使えるレベルにまでパワーアップしていることなど、身近なサービスを通じてディープラーニングが広く浸透してきていることが感じられる。
また、一年ほど前であるが、Google DeepMindの開発したAlphaGoが囲碁の世界チャンピオンを倒したことも象徴的な出来事であった。囲碁AIの勝利はディープラーニングの汎用性を示すとともに、「コンピュータ vs 人間」の構図の中で、しばらくは人間に追いつけないであろうと言われていた領域にコンピュータが一気に侵略してきた、という印象を与え、人工知能の新たな時代の到来がメディアを伝じて一斉に世間へ広まることとなった。
シンギュラリティ(技術的特異点)という言葉も聞く機会が増えているが、機械がほんの僅かでも人間の知能を超えるような状態に達すれば、自ら学習し続けることで、人間が追いつけない領域へ入っていってしまうことが懸念されている。これに対しては賛否両論様々な意見があり、機械の暴走を危惧する声や、特定の分野はありうるとしても、あらゆる分野で人間を超えることはない、などの声が挙がっている。
一方で、5年ほど前にブームとなったスマートにはじまり、ビッグデータ、IoT、AIと、進歩している技術をメディアは一緒くたに扱いがちなことが多い。そのために、実は以前からある技術・商品なのに「AI家電」として新たに紹介されることがあるなど、新たなラベルで焼き増しされているだけの技術に気をつける必要がある。たとえば、生活家電がネットワークにつながり、センサーがデータを提供したり制御したりということは以前から存在していたが、ディープラーニングの出現によって大きく変わったことがあるかと聞かれても、特段そのようなことはないように思われる。
広義の人工知能は非常に汎用性が高いため、良いように使われがちだが、メディアの作り出すブームに惑わされすぎないよう、しっかりと本質を見極める必要がある。
プログラミングを学ぶ上で心がけるべきこと
多少入門書を読んだり、CourseraをはじめとするMOOC (Massive Open Online Course) を履修したりして学んではきたが、ここでは、プログラミング(python)初心者として読んでよかった本・受講してよかったコースの紹介ではなく、僕が重要だと感じた心構えや意識といった観点から、記事を綴っていきたい。
共に学ぶ仲間の存在を感じること
プログラミングに限らず何か新しいことを始める上で重要だと思うのは、自分と似たような立場で同じように取り組んでいる人の存在を知り、刺激を受けることだと思う。自分の場合は大学院の講義がそれにあたり、宿題の締切があるからきちんと取り組むという姿勢が保てたし、わからないことがあれば経験値の高い他の学生や教授に質問して、教えてもらっていた。
ただし、こういうふうに書くと、教室における対面授業が最も有効で手っ取り早い手段のようにも聞こえるが、必ずしもそうではない。なぜなら、自分が受講した上記の講義は、機械学習の理論的な部分が主であり、Rとpythonの使い方については触りの部分を少しやっただけであったため、講義を最後まで履修することには価値があるが、そこで満足してそこから継続して学びを続けたり発展的な学習をしない限り、本当の意味での知識やスキルは定着していかないのだと思う。
逆にMOOCなどのオンライン講座を受講する形であっても、Forumを活用して他の受講者に質問したり回答を返したりすることで仲間の存在を感じることができるし、その気になれば形式は何だっていいと思う。ちなみにオンライン講座の利点として僕が感じていることの中には、対面と違って期中での受講開始が可能であることや、講義を受けるにあたって場所や時間を選ばないこと、最新・最先端の知識を学べることなどがある。
実際に手を動かしてみること
Googleで「python 入門」と検索すると非常にたくさんの結果が返って来て、pythonの使い方を紹介してくださっている様々なBlogや個人ページにたどり着くことができる。しかもその多くを無料で閲覧することができるため、非常にありがたいことに、情報は取ろうと思えばいくらでも簡単に入手可能である。しかし、与えられた情報をただ漠然と眺めていても何も身につかない。もちろん優れたコードを読み参考にすることで、より簡潔で美しいコードが書けるようになるかもしれないが、それ以前に重要なのは、人の書いたコードを真似るだけでもいいから、実際にコードを自分で書いてみて、コンピュータ上で動かし、何が起こるのかを自分の目で確かめることだ。これはスポーツをすることや楽器を演奏することと同じで、よほど特異な才能でもない限り、ギターの譜面をじっと眺めただけで、初心者がいきなりギターを演奏できるようにはならない。譜面を追いかけながら一つ一つ音を鳴らし、体に覚え込ませることで、上達していくものである。
次に、人の書いたものを真似することの有効性について、「新しいアイデアは既存要素の組み合わせによって実現される」というジェームス・ヤングの言葉を踏まえて考えてみる。新しいアルゴリズムやプログラミングにより実現される新たなサービスは、既存のコードを新しく組み直したものにすぎない、とも言えるため、人が書いたものを真似してどんどん試し、「こう入力すればこんなアウトプットが出る」という経験をたくさんストックしておくことは、非常に有用なことである。必要に応じて引き出しを開けて組み合わせていくことで、新しい価値を生み出すことができる。このとき、必ずしもコードをすべて記憶しておく必要はないと思う。こういうことをする場合にはあの本を参照すればいいとか、Stack overflowのあの回答に書いてあったなとか、必要な情報にすぐにアクセスできるようにさえしておけば事が足りるんじゃないかと感じている。
- 作者: ジェームス W.ヤング,竹内均,今井茂雄
- 出版社/メーカー: CCCメディアハウス
- 発売日: 1988/04/08
- メディア: 単行本
- 購入: 91人 クリック: 1,126回
- この商品を含むブログ (378件) を見る