くじら公園

プログラミングなど学んだことについて書きます

読書メモ〜『情報検索の基礎』 第1章

以前購入して積読してしまっていた情報検索の基礎を最近読み始めたのでそのメモです。


『情報検索の基礎』はタイトル通り、検索エンジンを実現するために必要となる基礎知識が網羅的に記載されている本で、扱われている内容は、逆インデックスやインデックスの圧縮から、tf-idf、k近傍法やSVMなどの分類手法、クラスタリングなど広範に及びます。どちらかというと、古典的ないわゆるプログラミングの教科書に近いスタイルで記述されており、各章は文章と若干の数式、特定の言語に依らない疑似コードによる説明と演習問題で構成されています。

個人的には前述の通り、情報検索が網羅的に記述されている点、教科書的なスタイルで記載されている点に加えて、各章の分量が多すぎず少なすぎないため、リズム良く取り組める点にとても勉強意欲をそそられました。

あくまで説明は文書と疑似コードに限られるので、実際に自分で作って動かして結果を目で見てみたい人間としては、各章の重要箇所については自分で実装してみたくなります。これは実際に実装してみた際のメモです。


第1章は引き続く章へのポインターなのでこの時点で実装できる項目はそれ程ないのですが、実装して動かしてみるというリズムを掴むために、いくつか実装してみました。

論理検索モデル

用語と文章の関係(term-document)からなる結合行列をつくって、Brutus AND Caesar AND NOT Calpurnia のようなクエリーに対応するドキュメントを検索します。

教科書に習って、"The Shakespeare Collection"にを題材にしました。データとしてはこちらのリポジトリを利用させて頂きました。

utils.create_incidence_matrix は、データのパスを引数に取り、pandas.DataFrame型で結合行列を返却します。

第1章の後半で、この結合行列はより疎な逆インデックスに置き換えられるため(という言い訳を理由に)実装はかなり雑です。

まぁこんな適当な実装で、とりあえず教科書のこの部分については再現できる。

実際の問合せは以下の通り、Pandas便利。

# `Brutus AND Caesar AND NOT Calpurnia`という質問に答える
In: matrix.loc['Brutus'] & matrix.loc['Caesar'] & (~matrix.loc['Calpurnia'])

Out: 
Antony and Cleopatra    1
Hamlet                  1
Julius Caesar           0
Macbeth                 0
Othello                 0
The Tempest             0
dtype: int64

CourseraのAndrew Ng氏によるDeep Learning Specializationを受講して

Nextremer Advent Calendar 2017 22日目の記事です。

今年の10月からcourseraDeep Learning Specializationを受講しています。本COURSEを受講した感想と受講する上での注意点などについて記載したいと思います。

f:id:p-baleine:20171222202558j:plain
COURSE 4までの修了証

Deep Learning SpecializationはMachine Learningコースを提供するAndrew Ng氏、および氏が創設したdeeplearning.aiが提供する深層学習に関する一連のCOURSEです。以下の5つのコースから構成されており2017/12/22現在COURSE 4まで公開されています。COURSE 5は2017/12中の公開予定となっています。

  • COURSE 1: Neural Networks and Deep Learning
  • COURSE 2: Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization
  • COURSE 3: Structuring Machine Learning Projects
  • COURSE 4: Convolutional Neural Networks
  • COURSE 5: Sequence Models

タイトルから推測できるとおり、深層学習の基礎から画像・自然言語処理への深層学習の適用について学ぶことができ、特に現実問題への深層学習の適用やそういったプロジェクトの遂行を意識した内容となっています。また、Geoffrey Hinton氏、Yoshua Bengio氏、Ian Goodfellow氏など深層学習を牽引する人物へのインタビュー動画が含まれており、Andrew Ng氏と彼らのラフなインタビューは、普段国際会議等で登壇する際とは若干異なる彼らの一面を見ることができ、とても面白かったです。たまたまGeoffrey Hinton氏がCapsNetについて熱く語っている動画を見た数日後にarXiveでDynamic Routing Between Capsulesが公開され、とても興奮してしまいました。インタビューの詳細についてはHeroes of Deep Learningにて後述します。

受講料について

Deep Learning Specializationは名前の示す通りcoursera上でSpecializationと呼ばれる受講形式に分類されます(Machine Learningコースとは異なる)。Specializationは特定のトピック-今回でいえば「深層学習」に関する一連のCOURSEから構成されます。Specializationには受講料の支払い方についていくつかの種類があるらしく、Deep Learning Specializationはsubscriptionと呼ばれる方法での支払いとなります。subscriptionは毎月受講料を払う形式であり、そのSpecializationに含まれる全COURSEを早く修了すればその分必要となるお金が少なくなる仕組みになっているそうです。Deep Learning Specializationの場合は公式の見積もりで1 COURSE平均凡そ3~4週間のCOURSE 5つから構成されており、また一か月あたり凡そ5 USDとなるため単純計算では合計25 USD要します。実際に受講してみて要した時間については後述します。

12/22時点で本SpecializationのCOURSE 5: Sequence Modelsはまだ公開されておらず、COURSE 4まで終えた場合はそのままsubscribeしていると無駄にお金を支払うことになります。この場合一度subscriptionをキャンセルしてCOURSE 5が公開された際に再度subscribeするようヘルプの方で示唆されています。キャンセルしても取得した修了証やCOURSEの進捗は保存されているため再度subscribe時にレジュームできる仕組みになっているそうです。

私は過去Machine Learningコース受講時に修了証取得のため本人確認情報の登録等手続きを完了していたため、今回は単に本COURSEへの登録手続きのみを行いました。まだ本人確認情報の登録が済んでいない場合はyubessyさんのCoursera の機械学習コースを完走して修了証を取得した話がとても参考になります。

Deep Learning Specializationの受講対象者について

公式では前提知識としてPythonのプログラミングスキルがあげられており、また持っていると望ましい知識として行列・ベクトル計算や機械学習への理解があげられています。

個人的に受講した上での感想としては、極端ですが、Machine Learningコースを修了しており、Pythonの基礎がわかっていれば本COURSEを難なく受講できると思います。また、Machine Learningコースと同等の機械学習に関する基礎的な知識と、Pythonに限らず何かしらのプログラミング言語に関する経験が多少あれば、足りない知識を自身で補完しつつ本COURSEを完走することは難しくないと思います。

良い点・悪い点双方だと思いますが、本COURSEの修了条件に含まれる宿題のPrograming Assignmentsの敷居がMachine Learningコースと比べて若干低く、根気良く取り組めば全COURSEの受講も容易と思います。

2017/12/22時点で全5 COURSEのうち最初のCOURSEまでしか有志による字幕の日本語への翻訳が間に合っていないため、COURSE 2以降を受講する場合には英語のリスニングとリーディング能力が求められます。ただし、基本的にビデオ講義やフォーラム、そのほかのリソース含めてスラング等を用いないなるべく平易な文章となるよう意識されており、また例外なくビデオ講義には英語のsubtitleがついているため、高校卒業レベルの英語能力があれば受講可能かと思います。Specializationには1週間のトライアル期間が設けられているため、まず日本語の字幕をオフにして受講し継続可能か判断してみると良いかと思います(ただし受講時にクレジットカード番号の登録が求められるため、トライアル期間内にキャンセルする場合はキャンセル手続きを忘れず行うよう注意してください)。

以上から本Specializationは、深層学習に興味があり、基礎的な機械学習及びプログラミングの知識と高校卒業レベルの英語能力があれば受講可能であり、また後述しますが深層学習の基礎知識と画像・自然言語処理への適用に加えて、他の教材では多く語られない現実問題への適用―つまり実際の業務へ適用する際のノウハウが多く学べるという点も踏まえて、普段深層学習を業務で利用している人にとっても非常に有益であると考えています。ただし、公式の見積もりでは5ヶ月、私の実測でも2ヶ月強を要するため例えば新入社員の研修等に採用する場合はこの点は考慮する必要があると考えています。

各COURSEの内容について

公式では各COURSEは一週間辺り凡そ5時間で合計凡そ3~4週間要する見積もりとなっています。COURSE 4のみ実測を怠ってしまいましたがそれ以外のCOURSEについて、公式の見積もり通り1 COURSE辺り凡そ15時間を要しました。時間に余裕のある方であれば1日4時間程度割くことで1週間で1 COURSE、5週間で全COURSEを履修することも可能だと思います(実際自分もCOURSE1と2については合わせて2週間程度で終えることができました)。

各COURSEは凡そ3~4週の講義から構成され、各週は1時間強のビデオ講義とクイズ、およびjupyter notebookを用いたプログラミングの実習(Programing Assignments)から構成されています(週によってはPrograming Assignmentsがない場合もあります)。クイズはビデオ講義を受けての10問程度の選択式問題からなっています。Programing Assignmentsはやはりビデオ講義を受けて、Pythonにてプログラミングを行う実習となっており、COURSEによりnumpyのみを用いたニューラルネットワークの実装や、TensorFlowKerasを用いた実装の実習が用意されています。TensorFlowやKerasなど複数の深層学習向けフレームワークが登場して最初戸惑いましたが、講義を通して実際のプロジェクトに深層学習を適用する場合はまずオープンソースの実装を試してみることが推奨されているため、いろいろなフレームワークを触れることに対する抵抗感を軽減することもその理由に含まれているのかと思います。

COURSE 1: Neural Networks and Deep Learning

COURSE 1はニューラルネットワークと深層学習の導入という位置づけの内容でした。ロジスティクス回帰を順伝播・逆伝播アルゴリズムで理解・実装し(Week 2)、続いて浅い-2層ニューラルネットワークロジスティクス回帰を拡張する形で理解・実装し(Week 3)、さらに任意の数の隠れ層を持ったニューラルネットワークを実装してロジスティクス回帰とのパフォーマンスを比較する(Week 4)のが大まかな流れとなります。

受講期間の公式の見積もりは"4 weeks of study, 3-6 hours a week"となっており、実際に要した時間は凡そ13時間でした。

COURSE 1を通した感想としては、本コースは深層学習の初心者向けに入念に練られたビデオ講義とProgramming Assignmentsから構成されていて、多少のプログラミング経験があれば誰でも深層学習を体験できるようになっていました。

ビデオ抗議ではロジスティクス回帰及び浅いニューラルネットワーク、任意の隠れ層を持ったニューラルネットワークの順伝播、逆伝播のアルゴリズムが数式、および図式を用いて繰り返し提示されて、講義を終えるころには受講者がこれらを自然と理解できているようになっていました。逆伝播における微分計算については深い微分に関する知識は前提とされておらず、高校数学を忘れてしまっていても取り組めるように意識されているようでした。

Programming Assignmentsではビデオ講義の内容-ロジスティクス回帰~任意の数の隠れ層を持ったニューラルネットワークの順伝播と逆伝播の実装が課題でした。jupyter notebookを用いていて、問題の提示とそれに対するこちらの回答を自然に読むことができるようになっているのはとても好感を持ちました。(Machine Learningのときは、問題の提示がPDF、回答はoctaveスクリプトだったので、これらと比べるととてもスムーズに問題に取り組むことができました。)実装時はnumpyのみを用いており、特定の深層学習向けフレームワークは登場しません。またヒントが多く提示されているため、ビデオ講義を受けたうえでヒントを読み漏らさなければほぼ躓くことはありませんでした。

個人的には「なぜ深層学習が非線形関数を必要とするのか」や「どの活性化関数を選択すべきか」についての説明が直感的で面白かったです。

逆に平時、深層学習を用いている人にとっては少し退屈な内容になるかもしれません。

COURSE 2: Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization

COURSE 2はニューラルネットワークの各種正則化手法や最適化手法、ハイパーパラメーターチューニングなど学習を効率的に行うための手法とその理解が主な内容でした。Week 1で過学習とこれを避けるための正則化手法―L2正則化ドロップアウトや勾配爆発・消失問題について学び、続いてmomentum、RMSProp、Adam optimizationなど最適化手法を理解・実装し(Week 2)、最終週で落ち葉拾いとしてハイパーパラメーターチューニング、バッチ正則化、多クラス分類について学んだあと、以降のCOURSEで使用することになるTensorflowの基本について学ぶ(Week 3)のが大まかな流れとなります。

受講期間の公式の見積もりは"3 weeks, 3-6 hours per week"となっており、実際に要した時間は凡そ12時間でした。

COURSE 2は深層学習の初心者、および(私のような)普段TensorflowやChainerなどフレームワークを通してのみ正則化や最適化手法を利用している人間が、それらの直感的な理解をビデオを通して学び、またProgramming Assignmentsを通して実際に手を動かして体験できるようになっていました。

COURSE 1から引き続き一貫してモデル改善のイテレーション-Idea→Code→Experimentを効率的に回すことが成功への近道という主張が繰り返し提示され、COURSE 2はそのための各種手法を、ビデオ抗議で直感的に理解し、Programming Assignmentsで自分で実装し目で見てさらに理解を深めるという形式でした。

個人的には指数加重移動平均を学んだ後に、これをパラメーターの更新に適用するmomentum、momentumを拡張したRMSProp、momentumのアイデアとRMSPropのアイデアを合わせたAdam optimizerという一連の最適化手法の説明がわかりやすく面白かったです。また、RMSPropの生い立ちに言及しているときのAndrew先生の笑顔がみていてうれしかった:

One fan fact about RMSprop, it was actually first proposed not in on academic research paper, but in a Coursera course that Jeff Hinton had taught on Coursera many years ago.

COURSE 3: Structuring Machine Learning Projects

COURSE 3は機械学習システムの開発を効率よく進めるためのノウハウなどについての内容でした。COURSE 3の"About this course"には、本コースの内容は現時点でここでしか学べないものばかりであることが強調されていますが、COURSE 3を終えてみて、実際に機械学習を用いたシステムを開発する際の体系立てられたノウハウなど、他の教材ではあまり扱わない内容を学ぶことができました。

本コースは2週構成でした。Week 1ではまず深層学習システムを改善するときの戦略―複数の改善を見込めるアイデアがあるときに、最も有望なものから手をつけるために問題を解析することについて学んだ後、その解析の手段として、数値目標の設け方、human levelのパフォーマンスと学習データ、検証用データ、テスト用データに対するパフォーマンスの比較の仕方などを学びます。Week 2ではそのパフォーマンスを比較する際の方法の一つであるエラー分析の仕方から始まり、学習データと検証・テストデータが同じ分布から得られているかの検証方法などに加え、パフォーマンスの向上が見込める施策として転移学習、multi-task学習、End-to-end学習について学びます。本コースはプログラミングの宿題はなくクイズのみでした。ただしいつもの単発のクイズではなく特定のシナリオを想定したケーススタディとなっていました。

受講期間の公式の見積もりは"2 weeks of study, 3-4 hours/week"となっており、実際に要した時間は凡そ7時間でした。

COURSE 4: Convolutional Neural Networks

COURSE 4は畳み込みニューラルネットワークについての講義でした。Week 1で畳み込みニューラルネットワークの基本について学び、Week 2で畳み込みニューラルネットワークを効率よく利用する選択肢としてまずオープンソースの実装を利用してみることや、転移学習、データ拡張を学びました。またWeek 2のProgramming AssignmentはTensorflowではなくkerasを用いてResNetを実装するという内容でした。Week 3では物体検知について学びます。まずsliding windowによる古典的な実現手段について学び、その後sliding windowの畳み込みニューラルネットワークによる実装、及びYOLO(You only look once)について学びました。Programming Assignementの内容はYOLOの実装でした。最終週は顔認識とニューラルスタイル変換についての内容で、Programming Assignmentではこれらの両方を実装するという内容でした。

受講期間の公式の見積もりは"4 weeks of study, 4-5 hours/week"となっていました。本COURSEについては実際に要した時間の見積もりが出来ていませんが、時間的には凡そ公式の見積もり通りでした。

個人的に普段あまり画像関連を扱うことがなかったため、初めて知ることも多く楽しく受講できました。また本COURSEからProgramming AssignmentにTensorflowに加えてkerasが登場します。2つ以上のフレームワークを学習するのは、オープンソースとして公開されているモデルが既知のフレームワークで実装されているとは限らないなどを意図しているのかと推測しています。COURSE後半ではkerasとTensorflowの両方を適材適所で使い分けて実装する箇所が多く見られ、抽象度の高いkerasで実装できるところはkerasで実装し、より詳細な部分はTensorflowを利用するという使い分け方を学ぶことができました(但し、両方を使いこなすには両方のAPIを知っている必要もあると思います)。

Heroes of Deep Learning

特定のCOURSEの特定のWeekでは、"Heroes of Deep Learning"と呼ばれる深層学習で活躍する人々に対するインタビューを見ることができます(このビデオは全てOptionalとなっていました)。彼らが深層学習に取り組み始めたきっかけや、これから深層学習の世界に跳びこもうとする人たちへのアドバイスなどを聞くことができます。

英語のインタビューで完璧には理解できていませんが、簡単に各ビデオの内容について以下に記載します。

COURSE 1, Week 1: Geoffrey Hinton interview

Geoffrey Hinton氏とのインタビューの内容は、氏が高校時代に脳がどのように記憶を格納するのかということに興味を持ち、生理学や物理学など色々な学問を修めた後AIの道にすすんだこと、Hinton氏による過去数十年の深層学習における発明の中でもBoltzmannマシーンを最もexcitingだと思っていること、またCapsNetなどでした。またこれから深層学習の世界に飛び込もうとする人に対するアドバイスとして、何かしらの直感を元に開発を初めたら、誰かにその直感をナンセンスだと言われても自分の直感を信じて進むことを上げていました。

COURSE 1, Week 2: Pieter Abbeel interview

ロボティクスにおける深層学習の応用で有名なPieter Abbeel氏のインタビューでは、強化学習の今後について、スクラッチからの学習ではなく、過去に学習したことを別のタスクの学習にも再利用する手法への展望、またこれから深層学習の世界に飛び込もうとする人に対するアドバイスとして、TensorFlow、Chainer、Theano、PyTorchなど好きなフレームワークを用いて自分自身で試してみることを上げていました。

COURSE 1, Week 3: Ian Goodfellow interview

Ian Goodfellow氏のインタビューの内容は、神経科学を学んでいた時にAndrew氏のAIの講義を勧められ、この講義を受けてAIの道に進もうと決めたこと、やはりAndrew氏の講義でTAを務めていた時にBeliefNetの論文に興味を持ち、友達と冬休みをつかってGPUマシンを構築したこと、このときから深層学習に未来を見出したこと、GANを発明した経緯―友達とバーで生成モデルについて話したあと、自宅に返って一晩で最初のバージョンのGANを完成させたこと、Yoshua Bengio氏、Aaron Courville氏と書いているテキストについて、深層学習を始めるにあたり必要となる数学の基礎について詳解してあること、アドバイスとしてGithubかArXiveにコードや論文を公開することなどでした。

COURSE 2, Week 1: Yoshua Bengio interview

Yoshua Bengio氏のインタビューの内容は、注意機構が氏のニューラルネットワークに対する見方を変えたこと―これまでニューラルネットワークはベクトルからベクトルへの写像ができる機械と考えていたものが、実際には注意機構によっていかなるデータ構造も扱い可能だということ、教師なし学習について、アドバイスとして非効率に思えても、理解を深めるためにフレームワークを用いずに自分自身で実装を試みること、なぜ自分はそれをしているのか、なぜ人々はそれをしているのか考えることなどでした。

COURSE 2, Week 2: Yuanqing Lin interview

Yuanqing Lin氏のインタビューの内容は、氏が最初のImageNet Competitionの勝者であること、アドバイスとしてオープンソースフレームワークからはじめてみることなどでした。又National Deep Learning Research Labについての言及があり、そのミッションは巨大な深層学習プラットフォームを構築すること、このプラットフォームは深層学習フレームワークと巨大な計算リソースと大量のデータを提供し、利用者はこのプラットフォーム上で研究や開発、またアプリケーションの提供もできるようなものを目指していることなどが語られていました。

COURSE 3, Week 1: Andrej Karpathy interview

Andrej Karpathy氏のインタビューの内容は、ImageNetのデータセットに対する人のベンチマークを自身で計測したことについて、氏が講師を務めたスタンフォード大学での授業Convolutional Neural Networks for Visual Recognitionについて、人工知能の将来の展望について2つの方向性―一つは特定領域に適用される人工知能でもう一つはAGIと考えていること、アドバイスとして、はじめはフレームワークなどを用いずに自分で実装してみて根底の概念を理解することなどでした。

COURSE 3, Week 2: Ruslan Salakhutdinov interview

Ruslan Salakhutdinov氏のインタビューの内容は、制約ボルツマンマシンについて、教師あり学習・教師なし学習・生成モデルについて、またアドバイスとして、新しいこと、発明を試みることを恐れずに異なることに挑戦してみることなどでした。

最後に

Deep Learning Specializationは深層学習の初心者からある程度経験のある人にまで有益なコースで、深層学習の基礎から画像・自然言語処理への深層学習の適用、特に現実問題への深層学習の適用やそういったプロジェクトの遂行方法について学ぶことができます。若干文量が多めですが、深層学習で活躍する人々へのインタビューも含めて一見の価値があると思います。

2017/12/22時点でCOURSE 5がまだ始まっていませんが(元々11月中公開だったのが延期されて今12/29開始予定になっています)、こちらも受講できたら本記事を更新しようと思っています。

以下は各コースを受講した時のメモです(内容が本記事とかぶっている箇所があります):

Deep Learning Specialization(Coursera) - Course 3のメモ

CourseraDeep Learning Specializationの受講メモです。Deep Learning SpecializationはMachine Learningコースを提供するAndrew Ng氏、および氏が創設したdeeplearning.aiが提供する深層学習に関する一連の講義です。以下の5つのコースから構成されています。

  • COURSE 1: Neural Networks and Deep Learning
  • COURSE 2: Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimizationw
  • COURSE 3: Structuring Machine Learning Projects
  • COURSE 4: Convolutional Neural Networks
  • COURSE 5: Sequence Models

今回はCOURSE 3、Structuring Machine Learning Projectsを受講した際の備忘録的なメモです。Deep Learning Specialization全体を受講したうえでのまとめは別途記載する予定です。


COURSE 3: Structuring Machine Learning Projects

COURSE 3は機械学習システムの開発を効率よく進めるためのノウハウなどについての内容でした。COURSE 3の"About this course"には、本コースの内容は現時点でここでしか学べないものばかりであることが強調されていますが、COURSE 3を終えてみて、実際に機械学習を用いたシステムを開発する際の体系立てられたノウハウなど、他の教材ではあまり扱わない内容を学ぶことができました。

本コースは2週構成でした。Week 1ではまず深層学習システムを改善するときの戦略―複数の改善を見込めるアイデアがあるときに、最も有望なものから手をつけるために問題を解析することについて学んだ後、その解析の手段として、数値目標の設け方、human levelのパフォーマンスと学習データ、検証用データ、テスト用データに対するパフォーマンスの比較の仕方などを学びます。Week 2ではそのパフォーマンスを比較する際の方法の一つであるエラー分析の仕方から始まり、学習データと検証・テストデータが同じ分布から得られているかの検証方法などに加え、パフォーマンスの向上が見込める施策として転移学習、multi-task学習、End-to-end学習について学びます。本コースはプログラミングの宿題はなくクイズのみでした。ただしいつもの単発のクイズではなく特定のシナリオを想定したケーススタディとなっていました。

受講期間の公式の見積もりは"2 weeks of study, 3-4 hours/week"となっており、実際に要した時間は凡そ7時間でした。

以下メモです(ただメモを張り付けているだけなので、体裁が崩れていたらすみません…):

Week 1

ビデオ3時間、クイズ30分

内容

ビデオ
  • Introduction to ML Strategy
    • Why ML Strategu?
      • When trying to improve a deep learning system, you often have a lot of ideas or things you could try. And the problem is thatif you choose poorly, it is entirely possible that end up you spending six months charging in some direction only to realize six months that didn't do good.

      • ML strategies: Waysof analyzing a machine learning problem that will point you in the direction of the most promising things to try.

    • Orthogonalization
      • They're very clear-eyed about what to tune in order to try to achive one effect.

      • 画面を調節するためのノブ(knob)がいくつかついている古いテレビによるアナロジー
        • So in this context, orthogonalization refers to that the TV designers had designed the knobs so that each knob kind of dose only one thing. And this makes it muche eisier to tune the TV.

        • 例えばあるノブが画面の縦比と横比の両方を調節するものである場合と、縦比と横比を調節する別個のノブが用意されている場合を比べると、後者の方が画面を調節しやすい、これがOrthogonalization
      • 車によるアナロジー、普通の車はノブとしてハンドルとアクセル(とブレーキ)がある、架空の車として方向と速度を一変に調節できるジョイスティックを二つ持った車を想定すると、普通の車と架空の車のどちらが御するのが容易?
        • 縦軸速度、横軸方向の二軸のチャート、軸方向にだけ制御できる方が全体としての制御が容易
      • MLの文脈で考えてみる
        • Chain of assumption in ML
          • Fit training set well on cost function
          • Fit dev set well on cost function
          • Fit test set well on cost function
          • Performs wekk in real world
        • 上記4つの問題・ステップで取り組むのがOrthogonalization、逆に言えばこれらを混ぜると制御が難しくなる
        • Early stopping: Orthogonalizationに反する
          • This is one knob that is less orthogonalization, because it simultaneously offers two things: * > It offers how well you fit the training set. * > It improves dev set performance.

  • Setting up your goal
    • Single number evaluation metric
      • PrecissionとRecallの例
        • 二つ以上の指標を用いるより一つの指標を用いた方が効率的、この場合はF値を使うべし
        • Dev set + Single real number evaluation metric -> Speed up iterating

    • Satisficing and Optimizing metric
      • 猫分類器の例、accuracyとrunning timeを向上させたいとする
      • この場合はさっきみたいに二つの指標を一つに組み合わせるする代わりに以下のとおり指標を設定する
        • maximize accuracy

        • subject to runningTime < 100ms

      • accuracyがoptimizing metric、running timeがsatisficing metric
      • N metrics: 1 optimizingとN - 1 satisficing(threshold)
    • Train dev/set distribution
      • Choose a dev set and test set to reflect data you expect to get in the future and consider important to do well on.

    • Size of dev and test set
      • Set your test set to be big enough to give high confidence in the overrall performance of your system.

    • When to change dev/test sets and metrics
      • 猫分類器の例
        • Metric: classification error
        • Algorithm A: 3% error, B: 5% error
        • でもAはポルノ画像を猫と間違えてしまう
        • Metricを変更する
          • 元のError: (1 / m{dev}) \sum{i}^m{dev} I {y{prod}^{(i)} \neq y^{(i)}}
          • 改善後のError: (1 / m{dev}) \sum{i}^m{dev} w^{(i)} I {y{prod}^{(i)} \neq y^{(i)}}
            • w^{(i)} = 1 if x^{i} is non-porn else 10
        • これもorthogonalization
          • So far we've only discussed how to define a metric to evaluate classifiers.

          • Worry separately about how to do well on this metric.

      • So my recommendation is, even if you can't define the perfect evaluation metric and dev set, just set something up quickly and use that to drive the speed of your team iteration. And if later down the line you find out that it wasn't a goode one, you have better idea, change it at that time.

  • Comparingto human-level performance
    • Why human level performance?
      • First is that because of advance in DL ML algorithmsare are suddenly working much better and so it has become much more feasible in a lot of application areas for ML algorithms to actually become aompetitive with human-level performance.

      • Second, it turns out that the workflow of designing and building a ML system, the workflow is much more efficient when you're trying to do something that humans can also do.

      • Bayes optimal error: パフォーマンスの理論的な上限値; the very best theoretical function for mapping from x to y
      • 試行するうちにaccについてhuman-levelよりは向上してもBayes errorは越えられない
      • MLがhuman levelより悪いときは:
        • Get labeled data from humans.
        • Gain insight from manual error analysis.
          • Why did a person get this right?
        • Better analysis of bias/variance.
    • Avoidable bias: Human level error as a proxy for Bayes error
      • 猫分類の問題
        • Human: 1%, Training: 8%, dev: 10%のとき、8 - 1 = 7がAvoidable bias、biasにfocusする
        • Human: 7.5%, Training: 8%, dev: 10%のとき、8 - 1 = 05がAvoidable bias、varianceにfocusする
    • Understanding human-level performance
      • レントゲン診断の分類器を作るとき、human levelが以下の場合Bayes errorhはどれ?
        1. Typical human: 3%
        2. Typical doctor: 1%
        3. Experienced doctor: 0.7%
        4. Teams of experienced doctors 0.5%
      • 答えは4、Baues errorは0.5%だから
      • Having an estimate of human-level performance gives you an estimate of Bayes error. And this allows you to more quickly make decisions as to whether you should focus on trying to reduce a bais or trying to reduce the variance of your algorithm.

    • Surpassing human level performance
      • Online ad, recommendation, load approval等structured dataに対してはすでにMLは人を凌駕している
        • これらは人には見切れないほどのデータがある
      • Not natural, perception problemsは逆に人が得意
Case Study

今回のExerciseは架空の町のために空を飛んでいる鳥を検知するアルゴリズムを開発するというシナリオで、ビデオ講義で魏トンされたような状況に面した際にどう振る舞うのが適切かを問う形式のクイズになっていた。

所感

  • ビデオが中心なのでいつもより時間がかかった
  • 機械学習や深層学習のテクニックや知識を教えてくれる教材は多くあるけれど、このコースのようにそれらテクニックや知識を持っている上で実際に深層学習を用いたシステムを開発する時のノウハウについてこのように体系立てて学べるリソースは他に思い当たらない

Week 2

ビデオ2時間、Case Study 1時間

内容

ビデオ
  • Error Analysis: Manually examining mistakes that your algorithm is making, can give you insights into what to do next.
    • Look at dev examples to evaluate ideas
      • 例として猫分類器を考える、分類器が犬の写真を誤って猫と分類した。90% acc, 10% err
        • Should you try to make your cat classifier do better on dogs?

        • Error analysis:
          1. Get ~100 mislabeled dev set examples
          2. Count up how many are dogs
        • 結果、5%が犬だった→犬問題に取り組むことで10%のerrを9.5%にできる
      • ceiling(天井)を見つける
        • Upper bound on how much you could improve performance by working on the dog problem

      • Evaluate multiple ideas in parallel
        • 猫分類のideaとして例えば犬を間違える、ライオンとかを間違える、ぼやけた画像を間違える、インスタの画像で間違えるの四つの問題―改善案があるときに、スプレッドシートを開いて画像100枚についてこの四つの問題のどれを被っているか一覧にして、四つのそれぞれが何割くらい発生しているか確認する
    • Cleaning up incorrectly labeled data
      • If you find that your data has some incorrectly labeled examples, what should you do?

      • DL algorithm are quite robust to random errors in the training set. * > If the errors are reasonably random, then it's probably okay to just leave the errors.

      • They are less robust to systematic errors.

      • dev/test setのときは前述のスプレッドシートに"Incorrectly labeld"という問題も加えて吟味する、例えば
        • Overroll dev set error: 10%, errors due incorrect labels: 6%
          • →0.1 * 0.06 * 100でこれを改善することで10%のerrを9.4%に改善できると見積もることができる
        • Goal of dev set is to help you select between two classifiers A and B.

        • もしdev setのIncorrectly labeled dataの割合が大きいときはこの本来の目的を達成できない可能性がある
    • Build your first system quickly, then iterate. 1. Setup dev/test set and metric 2. Build initial system quickly 3. Use bias/variance analysis and error analysis to prioritize next steps

  • Mismatched training and dev/set set
    • Training and testing on different distributions
      • 猫分類器の例、Data from webpagesが200000枚、Data from mobile app(より実環境に近いデータ)が10000枚のとき
        • Option 1: 2つのデータを合わせてシャッフルし、train dev/testに分ける
          • メリット: train, dev/test set from the same distribution
          • デメリット: dev setの多くがwebpage由来
          • So remember that setting up your dev set is telling yout team where to aim the target. And the way you're aiming your target, you're saying spend most of the time optimizing for the web page distribution of images, which is really not what you want.

        • Option 2: trainはweb 200000 + app 5000、devはapp 2500、testはapp 2500
          • こちらのほうがOption 1より推奨される
          • You're telling your team, my dev set has data uploaded from the mobile app and that's the distribution of images you really care about, so let's try to build a ML system that does really well on the mobile app distribution of images.

    • Bias and variance with mismatched data distributions
      • 猫分類器の例、人が分類すると凡そ0%のerr、学習時のerrは1%、devに対するerrが10%のとき、これはvariance problem?
      • 可能性として、training and dev data comes from a different distributions
      • this just refrects that the dev set contains images that are much more difficult to classify accurately.

      • 対策、もう一つデータセットを準備: Training-dev set, same distribution as training set, but not used for training.
      • 再度比較してみたとき、human: 0%, training err: 1%, training-dev err: 9%, dev err: 10%だったらvariance problem
      • 再度比較してみたとき、human: 0%, training err: 1%, training-dev err: 1.5%, dev err: 10%だったらdata mismatch problem
      • 再度比較してみたとき、human: 0%, training err: 10%, training-dev err: 11%, dev err: 12%だったらavoidable bias problem
      • 再度比較してみたとき、human: 0%, training err: 10%, training-dev err: 11%, dev err: 20%だったらavoidable bias problem + data mismatch
      • まとめ
        • Human level <-> Training set err: avoidable bias
        • Training set err <-> Training-dev set err: variance
        • Training-dev set err <-> Dev set err: data mismatch
        • Dev set err <-> Test set err: degree of overfitting to the dev set
      • より一般的なタスクに対する分類器と比較してみるのも一手
        • 例えば車のReaview mirrror speech recognitionを開発している時に、General speech recognitionの分類器と上記四つの尺度で比較してみる
    • Adressing data mismatch
      • Carrying out manual error analysis to try to understand difference between training and dev/test sets.
      • Make training data more similar; or collect more data similar to dev/test sets.
      • データをaugumentするのは手の一つだが、合成データにoverfitしてしまう危険性は含まれている
  • Learning from multiple tasks
    • Transfer learning
      • One of the most powerful ideas in DL is that sometimes you can take knowledge the NN has learned from one task and apply that knowledge to a separate task.

      • pre-trainingとfine-tuning
      • So, when does transfer learning make sense? Transfer learning makes sense when you have a lot of data for the problem you're transfering from and usually relatively less data for the problem you're transfering to. * Task A and B have the same input x. * You have a lot more data for Task A than Task B. * Low level features from A could be helpful for learning B.

    • Multi task learning
      • 例として、写真に車、標識、信号機、...が写っているか検知したい
      • 出力層に検知したいオブジェクトの数だけ(例えば4)ユニットを並べる
      • 損失関数: \sum{i=1}^m \sum{j=4} L(\hat{y}_ji, y_ji)
        • Lは通常のlogistic loss
        • unlike softmax one image can have multiple labels

      • If some of the earlier features in NN can be shared between these different types of objects, then you find that training one NN to do four things results in better performance thant training four completely separate NN to do the four tasks separately.

      • When multi-task learning makes sense? * > Training on a set of tasks that could benefit from having shared lower-level features. * > Usually amount of data you have for each task is quite similar. * > Can train a big enough NN to do well on all the tasks.

      • Multi-task learning enables you to train one NN to do many tasks and this can give you better performance than if you were to do the tasks in isolation.

  • End-to-end deep learning
    • Briefly, there have been some data processing systems or learning systems that require multiple stages of processing, and what E2E DL dose, is it can take all those multiple stages and replae it usually with just a single NN.

    • Pros and cons of E2E DL
      • Pros:
        • Let the data speak
          • (音声認識器の音素(phoneme)を例にとって) I think that phonemes are an artifact created by human linguist. And if you let your learning algorithm whatever representation it wants to learn rather than forcing your learning algorithm to use phonemes as a representation, then its overall performance might end up being better.

        • Less hand-designing of components needed
      • Cons:
        • May need large amount of data.
        • Excludes potentially useful hand-designed components.
          • When you have a ton of data it's less important to hand design things. But when you don't have much data, then having a carefully hand-designed system can actually allow humans to inject a lot of knowledge about the problem into an algorithm deck and that should be very helpful.

    • Key question: Do you have sufficient data to learn a function of the complexity needed to map x to y?
Case Study

自動運転を例に取ったクイズ

Deep Learning Specialization(Coursera) - Course 2のメモ

CourseraDeep Learning Specializationの受講メモです。Deep Learning SpecializationはMachine Learningコースを提供するAndrew Ng氏、および氏が創設したdeeplearning.aiが提供する深層学習に関する一連の講義です。以下の5つのコースから構成されています。

  • COURSE 1: Neural Networks and Deep Learning
  • COURSE 2: Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimizationw
  • COURSE 3: Structuring Machine Learning Projects
  • COURSE 4: Convolutional Neural Networks
  • COURSE 5: Sequence Models

今回はCOURSE 2、Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimizationwを受講した際の備忘録的なメモです。Deep Learning Specialization全体を受講したうえでのまとめは別途記載する予定です。


COURSE 2: Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimizationw

COURSE 2はニューラルネットワークの各種正則化手法や最適化手法、ハイパーパラメーターチューニングなど学習を効率的に行うための手法とその理解が主な内容でした。Week 1で過学習とこれを避けるための正則化手法―L2正則化ドロップアウトや勾配爆発・消失問題について学び、続いてmomentum、RMSProp、Adam optimizationなど最適化手法を理解・実装し(Week 2)、最終週で落ち葉拾いとしてハイパーパラメーターチューニング、バッチ正則化、多クラス分類について学んだあと、以降のCOURSEで使用することになるTensorflowの基本について学ぶ(Week 3)のが大まかな流れとなります。

受講期間の公式の見積もりは"3 weeks, 3-6 hours per week"となっており、実際に要した時間は凡そ12時間でした。

COURSE 2は深層学習の初心者、および(私のような)普段TensorflowやChainerなどフレームワークを通してのみ正則化や最適化手法を利用している人間が、それらの直感的な理解をビデオを通して学び、またProgramming Assignmentsを通して実際に手を動かして体験できるようになっていました。

COURSE 1から引き続き一貫してモデル改善のイテレーション-Idea→Code→Experimentを効率的に回すことが成功への近道という主張が繰り返し提示され、COURSE 2はそのための各種手法を、ビデオ抗議で直感的に理解し、Programming Assignmentsで自分で実装し目で見てさらに理解を深めるという形式でした。

個人的には指数加重移動平均を学んだ後に、これをパラメーターの更新に適用するmomentum、momentumを拡張したRMSProp、momentumのアイデアとRMSPropのアイデアを合わせたAdam optimizerという一連の最適化手法の説明がわかりやすく面白かったです。また、RMSPropの生い立ちに言及しているときのAndrew先生の笑顔がみていてうれしかった:

One fan fact about RMSprop, it was actually first proposed not in on academic research paper, but in a Coursera course that Jeff Hinton had taught on Coursera many years ago.

また(これは私が不勉強なだけですが)最近の潮流として、学習時に問題となるのはlocal optimaではなくsaddle pointsを抜け出すのに時間がかかることと考えられていることや、ハイパーパラメーターの探索時はグリッド探索よりrandom samplingが有効であるなど、本COURSEが割と新鮮(公開が3ヶ月前)であるがゆえに新しく学ぶことが多かったです。

以下メモです(ただメモを張り付けているだけなので、体裁が崩れていたらすみません…):

Week 1

2017/10/09

ビデオ+クイズで3時間。Programming Assignmentsで2時間

内容

ビデオ
  • Train / Dev / Test sets
    • Intuiton from one domain or from one application area often do not transfer to other application areas.

    • devset: たくさんの異なるモデルの中でどれが手元のdevsetに対し最も良いパフォーマンスを呈するか検証するために用いる
    • testset: 最終的なモデルを評価する、手元のアルゴリズムがどれくらい上手く機能するかunbiasedな見積もりを得るために用いる
  • Biase / Variance
    • high bias: under fitting
      • より大きなネットワークを用いる
      • もう少し長く学習する
      • (別のNNアーキテクチャを模索する)
    • high variance: overfitting
  • Regularization
    • L2 Regularization
      • ロジスティック回帰の場合
        • 正則化項: lambd / (2m) \norm{w}_22 = lambd / (2m) WTW
      • Neural Networksの場合
        • 正則化項: lambd / (2m) \sum_{l=1}^L \norm{w^[l]}^2
          • \norm{w^[l]}^2はForbenius normと呼ばれる
          • wは(n^[l], n^[l-1])だから\norm{w^[l]}^2 = \sum{i=1}^{n^[l-1]} \sum{i=j}^{n^[l-1]} (w_{ij}^[l])2
          • 逆伝播のときは正則化項の微分を忘れずに
      • 正則化項は、wが大きくなりすぎることに対しペナルティを課す
        • lambdを大きくすると更新後のwは0に近づく
        • 直感的には、正則化することでより小さなネットワークとなる
        • もう一つの直感的な捉え方として、活性化関数にtanhを仮定する、tanhは0付近で勾配が線形に近づく→underfittingされる
  • Dropout
    • inverted dropout
      • keep_probの確率でランダムにユニットをzero outした上で、残ったユニットをkeep_probで除算する
        • 例えば a3 /= keep_prob
        • to keep exptected values of a3.

        • これをしとかないとtestデータに対する予測をするときに苦労することになる
          • 「学習時はkeep_probでdropoutしたけどtest時はdropoutしないのでaの値をスケールして…」とか悩まないために
    • Why dose dropout work?
      • Can't rely on any one feature, so have to spread out weights

  • Other regularization methods
    • Data augumentation
    • Early stopping
      • 初期値はwは0に近い、学習が進むとwは大きな値となる、この間で学習を止める
      • Orthogonalization
        • early stoppingはoptimizationとnot overfitの2つを別個に考慮することができない
  • Normarizing inputs
    • 平均ひいて、分散で除する
  • Vanishing / exploding gradiendts
    • a very deep neural network your derivatives of your slopes can sometimes get either very big or small.

    • w > I(単位行列)→深いネットワークでは活性化関数の結果が爆発してしまう→勾配も爆発
  • Weight initialization
    • Vanishing / exploding gradiendtsに対処するための手段の一つ
    • z1 = w_1x_1 + w_2x_2 + \cdots + w_nx_n(nはユニット数)
    • var(w_i) = 1/nだと嬉しい
    • なので、w^[l] = np.random.randn(shape) * np.sqrt(1 / n^[l-1])
      • l-1なのは入力される特徴量(ユニット数)でスケールしたいから
      • ReLUだと、np.sqrt(2 / n^[l-1])が良いらしい
      • Xavier initialization: np.sqrt(1 / n^[l-1])
  • Numerical approximation
  • Gradient check
Programming Assignments

所感

  • inverted dropoutの名前と理由は始めてしった
  • Programming Assignmentsが、実際に各手法を実装して結果を見比べるという内容で理解しやすかった

Week 2 - Optimization algorithms

2017/10/13 ビデオ2時間

2017/10/16 ビデオ+クイズ1時間、Programming Assignment 0.5時間

内容

ビデオ
  • Mini batch gradient descent
    • You can get a faster algorithm if you let gradient descent start to make some progress before you finish processing your entire examples.

    • Epoch: A single pass through the training set.
  • Understanding mini-batch gradient descent
    • Batch gradient descentの学習曲線は、イテレーション毎にコストが必ず減少していく
    • mini-batch gradient descentの学習曲線は、減少傾向にあるけれどノイズが含まれる
    • Choosing your mini-batch size
      • mini-batch size m: Batch gradient descentと同じ
        • too long / iteration
      • mini-batch size 1: Stochastic gradient descent
        • Lose speedup from vectorization
      • 2つの間をmini-batch sizeとして選択する
      • Because of the way computer memory is layed out and accessed, sometimes your code run faster if your mini-batch size is power of 2.

  • Exponentially weighted averages
    • v_t = \beta v_{t-1} + (1 - \beta) \theta_t
      • beta = 0.9のとき、1/(1-0.9) = 10、10回分を通して平均している
      • betaを大きくするとより平滑化される
    • \theta_tのプロットに、exponentially decayng functionをかけ合わせる
    • 実装時はv(v_{\theta})を使いまわす
      • v is computing exponentially weighted average over the parameter theta

  • Bias correction in exponentially weighted averages
    • v_t = \beta v_{t-1} + (1 - \beta) \theta_t、tが小さい範囲で本来の値との剥離が大きい
    • 対策としてv_tを1-\betatで除した値を用いる
  • Gradient descent with momentum
    • The basic idea is to compute an exponentially weighted decay of your gradients, and then use that gradient to update your weights instead.

    • v{dw} = \beta v{dw} + (1 - \beta) dW
    • W := W - \alpha v_{db}
    • smooth out the steps of gradient descent

  • RMSprop; root mean square prop
    • s{dw} = \beta s{dw} + (1 - \beta) dW2
    • W := W - \alpha (dW / s_{dw}^{1/2} + \epsilon)
    • One fan fact about RMSprop, it was actually first proposed not in on academic research paper, but in a Coursera course that Jeff Hinton had taught on Coursera many years ago.

  • Adam optimization: Adaptive momentum estimation
    • v{dw} = \beta_1 v{dw} + (1 - \beta_1) dW; momentumと一緒
    • s{dw} = \beta_2 s{dw} + (1 - \beta_2) dW2; RMSpropと一緒
    • v^{corrected}{dw} = v{dw} / (1 - \beta_12); bias correction of v_{dw}
    • s^{corrected}{dw} = s{dw} / (1 - \beta_22); bias correction of s_{dw}
    • W := W - \alpha (v^{corrected}{dw} / s^{corrected}{dw}^{1/2} + \epsilon)
  • Learning rate decay
    • Slowly reduce your learning rate over time

    • \alpha = 1 / (1 + decay_rate * epoch_num) * \alph_0
  • The problem of local optima
    • Most points of zero gradients are not local optima

    • Most points of zero gradients in a cost function are saddle points.

    • 最近は、次元数が大きい場合、local optimaのような箇所はむしろ稀であり、saddle pointsのような箇所が多く在ると考えられている
    • One of the lessons we learned in history of deep learning is that a lot of our intuitions about low-dimensional spaces, they really don't transfer to the very high dimensional spaces that any other algorithms are operating over.

    • It turns out that plateaus can really slow down learning and plateua is a region where the derivative is close to zero for a long time.

Programming Assignments
  • mini-batchを実装
  • momentumを実装
  • adamを実装
  • 上記3つを比較、adamは明らかにmini-batchとmomentumを凌ぐ

所感

  • momentum、RMSprop、Adamの一連の説明が分かりやすかった
  • AdamやRMSpropは普段tensorflow等を通して利用しているだけなので、今回始めて実装してみて勉強になった

Week 3 - Hyperparameter Tuning, Batch Normalization, Multi-class Classification, Introduction to programming frameworks

2017/10/17 ビデオ2時間40分、Programming assignment 40分

内容

ビデオ
  • Hyperparameter tuning
    • how to systematically organize your hyperparameter tuning process.

    • 重要度: \alpha > \beta, #hidden units, #mini batch size > #layers, learning rate decay > \beta_1, \beta_2, \epislon(Adam)
    • Try random value. Don't use grid
      • it's difficult to know in advance which hyper parameters are going to be the most important for your problem. And some hyperparameters are actually much more important than others.

      • sampling at random rather than in the grid shows that you are more richly exploring set of possible values for the most important hyperparameters, whatever they turn out to be.

    • Corse to fine sampling schema
      • ランダムにパラメーターを選択して学習して、よりものについてズームインしてもう一度探索する
    • Using an appropriate scale to pick hyperparameters
      • layers: uniform sampling

      • learning rate \alpha: log scale sampling
        • 0.0001~0.001、0.001~0.01の間についての探索に同等のリソースを割く
      • exponentially weighted decay \beta: log scale sampling
        • when beta is close to 1, the sensitivity of the results you get changes even with very small changes to beta.

    • Hyperparameters tuning in practice: Pandas vs Caviar
    • cross-fertilization: 画像の領域で開発されたResNetがSpeech等でも良い成績を達成するようなことを言う
    • hyperparameters, i've seen that intuitions do get stale. * 同様のことはhyperparametersの探索では稀

    • Babysitting one model: 学習が複数実に渡る場合、日毎に学習経過に合わせてパラメーターを返る探索の仕方
      • データが大きい、リソースが少ない時の手法
      • パンダ、子供一匹を大事に育てる
    • Training many models in parallel
      • キャビア、子供いっぱいを一度に育てる、どれかがうまくいく
  • Batch Normalization
    • BN makes your hyperparameter search problem much easier, BN makes the neural network much robust to the choice of hyperparameters and enables you to much more easily train even very deep network.

    • inputの正規化は学習を高速化する
      • 正規化する前と正規化した後の2パラメーターの等高線の図
    • can we normalieze a^[l-1] so as to train W^[l], b^[l] faster? * inputの正規化の考えを隠れ層に適用する

    • Implementing Batch Normalization
      • Given some intermediate values in NN z^{(1)}, z^{(2)}, ..., z^{(m)}
        • \mu = \sum_i z^{(i)} / m
        • \sigma2 = \sum_i (z^{(i)} - \mu)2
        • z^{(i)}_{norm} = (z^{(i)} - \mu) / sqrt(\sigma2 + \epsilon)
        • \tild{z^{(i)}} = \gamma z^{(i)}_{norm} + \beta
      • \gammaと\betaは学習するパラメーター
        • 平均0、分散1が常に裁量とは限らない
      • BNだとb^[l]は要らない
        • BN zeros out the means of z^[l] values in the layer there's no point having this parameter b^[l] and instead is sort of replaced by \beta-[l].

    • Why dose BN work?
      • covariate shift: 学習時と予測時のデータの分布が異なると予測はうまくいかない
      • if the distribution of X changes, then you might need to retrain your learning algorithm.

      • 5層ネットワークを想定して、3番目の層の視点で考えてみる
        • job of the third hidden layers is to take these values(a[2]) and find a way to map them to \hat{y}. The network also adapting parameters W^[2], b^[2], W^[1], b^[1] and so as these parameters change, the values a^[2]also change.

        • a^[2]は毎回変化する→3層目がcovariate shift problemを被る
        • so what BN dose, it reduce, the amount that the distribution of these hidden unit values shifted around.

        • But really don't turn to BN as regularization. Use it as a way to normalize your hidden unit activations and therefore speed up learning.

    • BN at test time
      • testするときはexampleの数は1、\muと\sigma2はどのような値を用いる?
        • estimate using exponentially weighted average across mini-batch; \mu^{{1}[l]}
  • Multi class Classification
    • Softmax regression: generalization of logistic regression
    • C: #classes, output layerのunit数
      • what is the probability of each of these c classes; P(C = c|X)

      • t = exp(z^[l])
      • a^[l] = exp(z^[l]) / \sum_j t_j
    • hardmaxは要素が一つだけ1になっているベクトルを出力する処理
Programming Assignments
  • tensorflowの基本

所感

  • 最近はGrid探索よりランダムにサンプリングしたhyperparameterの組み合わせでtuningするらしい
    • Week 2のThe problem of local optima-最近は学習を遅延させる原因はlocal optimaではなくsaddle pointsにあると考えられている、と同様に最近のNN界隈の理解が学べるのが楽しい
  • 入力の正規化と対比させて説明されるBNがわかりやすい

Deep Learning Specialization(Coursera) - Course 1のメモ

CourseraDeep Learning Specializationの受講メモです。Deep Learning SpecializationはMachine Learningコースを提供するAndrew Ng氏、および氏が創設したdeeplearning.aiが提供する深層学習に関する一連の講義です。以下の5つのコースから構成されています。

  • COURSE 1: Neural Networks and Deep Learning
  • COURSE 2: Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization
  • COURSE 3: Structuring Machine Learning Projects
  • COURSE 4: Convolutional Neural Networks
  • COURSE 5: Sequence Models

今回はCOURSE 1、Neural Networks and Deep Learningを受講した際の備忘録的なメモです。Deep Learning Specialization全体を受講したうえでのまとめは別途記載する予定です。


COURSE 1: Neural Networks and Deep Learning

COURSE 1はニューラルネットワークと深層学習の導入という位置づけの内容でした。ロジスティクス回帰を順伝播・逆伝播アルゴリズムで理解・実装し(Week 2)、続いて浅い-2層ニューラルネットワークロジスティクス回帰を拡張する形で理解・実装し(Week 3)、さらに任意の数の隠れ層を持ったニューラルネットワークを実装してロジスティクス回帰とのパフォーマンスを比較する(Week 4)のが大まかな流れとなります。

受講期間の公式の見積もりは"4 weeks of study, 3-6 hours a week"となっており、実際に要した時間は凡そ13時間でした。

COURSE 1を通した感想としては、本コースは深層学習の初心者向けに入念に練られたビデオ講義とProgramming Assignmentsから構成されていて、多少のプログラミング経験があれば誰でも深層学習を体験できるようになっていました。

ビデオ抗議ではロジスティクス回帰及び浅いニューラルネットワーク、任意の隠れ層を持ったニューラルネットワークの順伝播、逆伝播のアルゴリズムが数式、および図式を用いて繰り返し提示されて、講義を終えるころには受講者がこれらを自然と理解できているようになっていました。逆伝播における微分計算については深い微分に関する知識は前提とされておらず、高校数学を忘れてしまっていても取り組めるように意識されているようでした。

Programming Assignmentsではビデオ講義の内容-ロジスティクス回帰~任意の数の隠れ層を持ったニューラルネットワークの順伝播と逆伝播の実装が課題でした。jupyter notebookを用いていて、問題の提示とそれに対するこちらの回答を自然に読むことができるようになっているのはとても好感を持ちました。(Machine Learningのときは、問題の提示がPDF、回答はoctaveスクリプトだったので、これらと比べるととてもスムーズに問題に取り組むことができました。)実装時はnumpyのみを用いており、特定の深層学習向けフレームワークは登場しません。またヒントが多く提示されているため、ビデオ講義を受けたうえでヒントを読み漏らさなければほぼ躓くことはありませんでした。

個人的には「なぜ深層学習が非線形関数を必要とするのか」や「どの活性化関数を選択すべきか」についての説明が直感的で面白かったです。

逆に平時、深層学習を用いている人にとっては少し退屈な内容になるかもしれません。COURSE 2以降でより発展的な講義となるようで、来週から取り組んでまた感想を記載するつもりです。

以下メモです(ただメモを張り付けているだけなので、体裁が崩れていたらすみません…):

Week 1

2017/10/02

最後に10問のクイズに正解するまでに1時間40分要した。Geoffrey Hinton氏のインタビュービデオ(40分)はこれから。

内容

  • Waht is a neural network?
  • Supervised Learning with Neural Networks
    • 教師あり学習のニューラルネットワークとは何か
    • Standard Neural Networks、CNNs、RNNsの紹介、各々はどういった領域で用いられるかについて
  • Why is Deep Learning taking off?
    • ニューラルネットワーク自体は何十年も前から存在するが、なぜ今になってこれほどまでに用いられるようになってきたのか?
    • 横軸データサイズ、縦軸パフォーマンスの図
      • SVMやロジスティック回帰など従来の手法は、データサイズが大きくなったときにパフォーマンスが頭打ちされる」
      • ニューラルネットワークはそのネットワークを大きくすればするほど、またデータサイズを大きくすればするほどパフォーマンスが向上する
      • 近年コンピューターの発展で大量のデータが得られるようになった
      • 上記点から近年ニューラルネットワークが多く用いられるようになってきた
    • ディープラーニングをスケールする要素、Data、Computation、Algorithms
      • AlgorithmsもComputationを促進するようなものがインパクトが大きかった
        • 活性化関数ReLUはsigmoidと比較して勾配計算が高速になり結果として学習時間を短くするもので大きなインパクトを与えた
      • 結局計算時間の短縮が鍵となる
        • ニューラルネットワークを適用する作業は直感に基づいた作業となることが多い
          • Ideaに対してCodeを書いてExperimentして、そこから得られた新しいIdeaで再度このサイクルを回していく作業
          • 一回のイテレーションに要する時間が短ければ短いほど成功に近づける
  • About this Course

所感

  • 日本語の字幕は個人的に苦手なので、英語の字幕でビデオを見た
  • 字幕の表示タイミングがビデオによって違った
    • 「Why is Deep Learning taking off?」では、より自然に字幕が表示されるように鳴っていたけど、ビデオ下部に表示される字幕全文が逆に読みにくくて(文章の切れ間がどこだか分かりにくい)少し困った

Week 2

2017/10/03

まだ途中多分100分くらい

2017/10/04

Python and Vectorizationから、150分

Explanation of logistic regression cost functionとHeros of Deep Learningはまだ

内容

Logistic Regression as a neural network(Video)
  • 二値分類を解くアルゴリズムとしてロジスティック回帰の紹介
  • ロジスティック回帰のCost function
    • 学習データの一つのexampleの誤差を計算するのがLoss function
    • パラメーターを引数にとり全ての学習データの誤差の平均を算出するのがCost function
  • 勾配降下法の紹介
  • 微分について簡単におさらい
  • 計算グラフの紹介
    • f = 3(z + bc)という簡単な数式を例に順伝播と逆伝播を説明
  • ロジスティック回帰の計算グラフ
    • 後のことを考えてあえて計算グラフでロジスティック回帰を表現する
Python and Vectorization(Video)
  • numpyを利用したvectorizationについて
  • vectorizationでロジスティック回帰の順伝播を実装してfor文をなくし効率的な処理とする
  • vectorizationでロジスティック回帰の逆伝播を実装してfor文をなくし効率的な処理とする
  • numpyのbroadcastingについて
  • jupyterについて

Programming Assignments

  • numpyの基礎、reshapeとかbroadcastingについて
  • ロジスティック回帰を順伝播と逆伝播のアルゴリズムで実装する
  • 今回はnumpyで実装
  • タスクは、32 x 32の画像がネコの画像か(1)ネコ以外の画像か(0)の二値分類

所感

  • ビデオが長い
  • 計算グラフとその逆伝播の説明(Derivatives with a Computation Graph)は分かりやすかった
  • Derivatives with a Computation Graphは途中から字幕のズレが酷く字幕は無視した
  • Programming Assignmentsは初回故か簡単だった
  • ロジスティック回帰を順伝播と逆伝播のアルゴリズムで実装するのは導入としてとても分かり易い
  • jupyterさまさま、前のmachine learning(テキストはPDF)と比べてjupyterだとexerciseとテキストが一緒に読めてやりやすい

Week 3

2017/10/05

ビデオ8つ、2時間半

後半ビデオ3つで1時間、クイズとassignmentでたぶん1時間半、上と合わせて5時間

内容

  • Week 2のロジスティック回帰を拡張する形でニューラルネットワークの紹介
    • 例えば入力が3次元、4ユニットの隠れ層を1層持つ2層ニューラルネットワークの場合、隠れ層はそれぞれ別のパラメーターを持った4つのロジスティック回帰ユニットと考えることができる
  • ニューラルネットワークのvectorization
    • W^[1]は各ユニットのwを転置したものを水平方向にスタックしたもの; [1]は1層目を表す、(j, n_x); jは隠れ層のユニット数
    • Xは各training exampleのベクトルを垂直方向にスタックしたもの、(n_x, m)
    • Z^[1] = W^[1]X、A^[1] = G(Z^[1])、いずれも(j, m)
    • W^[2]、(1, j)
    • Z^[2] = W^[2]A^[1]、A^[2] = G(Z^[2])、いずれも(1, m)
  • 活性化関数について
    • sigmoidは基本的には二値分類の出力層以外では使わない
    • tanhは平均が0であるという点でsigmoidより優れている、但し入力が大きく/小さくなったときにその勾配が0に近づくため勾配降下法が遅くなるという欠点がある
    • ReLUは多くの場合最も良い選択肢、入力が0より大きい場合に勾配が1となるため学習が早い
    • ReLUの亜種としてLeaky ReLU、使っている人を見るのは稀
  • ニューラルネットワークに活性化関数が必要となる理由
    • 以下の2層ネットワークについて
      • z^[1] = W^[1]x + b^[1]
      • a^[1] = g^1 = z^[1]
      • z^[2] = W^[2]a^[1] + b^[2]
      • a^[2] = g^2 = z^[2]
    • もし活性化関数Gを取り除く/活性化関数Gとしてlinear活性化関数(identity)を使った場合:
      • a^[1] = z^[1] = W^[1]x + b^[1]
      • a^[2] = z^[2] = W^[2]a^[1] + b^[2] = W^2 + b^[2] = (W^[2]W^[1])x + (W^[2]b^[1] + b^[2]) = W'x + b'
      • 入力に対する単なる線形関数となる
      • どんなに層を深くしても結局この最後の線形関数を計算しているだけ→いかなる隠れ層ももっていないネットワークになってしまう
    • 回帰問題を扱う時の出力層に対しては活性化関数としてlinear活性化関数を用いることがある
  • 活性化関数の微分について
  • ニューラルネットワークの逆伝播について

Programming Assignments

所感

  • 日本語の字幕がここらへんからなくなっていた
  • Machin learningのときもそうだけど、基本的に受講者に数学の知識は求めないスタイルで、微分の計算式も初めから答えが紹介される
  • なんだかんだ言って深層学習を網羅的に扱った教科書は青本しか読んでいないので、なぜ活性化関数が必要なのかなどは勉強になった
    • 現時点ではすごく初心者向けと感じる部分もあるが、Andrew先生の観点で大事なところは詳しく教えてくれるので現時点でも得るものは結構ある
  • Programming Assignments、Week 2もそうだけど、forward、compute_cost、backword、update_parametersの4つにプログラムを分類するスタイルはわかりやすい
    • モデル(forward、backword)とコストの計算(compute_cost)、パラメータ-の更新(update_parameters)は明確に分離しやすい
  • やはりnumpyでforward、backword書くのは楽しい、assignmentsだとヒントが多すぎるので、scratchで書きたくなってきた

Week 4

2017/10/07

ビデオ1時間20分、programming assignments1時間30分

内容

  • これまでのまとめ
  • このコースでの記法の整理
  • なぜ深い表現(deep representation)なのか?

    • 例えば人の顔の検知器の場合、頭のほうの層は特徴検知器/edge検知器、お尻の方の層はより複雑な関数を表している
    • Circuit theory
    • But when I'm starting out a new problem, I'll often really start out with neuro-logistic regression then try something with one or two hidden layers and use that as hyper parameters.

  • ForwardとBackward整理
  • ハイパーパラメーターについて
  • 深層学習と人の脳のアナロジーについて   深層学習のforwardとbackwardの仕組みについてよく"It's like a brain."と言及されることがある     これは実際には単純化しすぎた説明だ
    • So when I think of deep learning, I think of it as being very good and learning very flexible functions, very complex functions to learn X to y mappings.

Programming Assignments

所感

  • ForwardとBackwardの図がわかりやすかった
  • Programming exersice、猫分類器の作成において、2層より5層のほうが制度が良かった、隠れ層を増やすと過学習しやすいわけでもない

出力する理由

 もっと世間に自分の文章なりを出力すべきだと思っている。

 理由は短絡的には、「プログラマーはアウトプットすべし」という世間の意見があるから。でももう少し、自分の文脈でなぜ出力すべきと考えるのか考えてみる。

 最近会社の採用活動の一環で他人のSNS等をいくつも読む機会があった。当然だけれど出力の少ない人の人となりだったり、能力はわかりづらかった。またこれは今回初めて学んだことだけれど自分は、兎に角出力する人を他の人より相対的に高く評価するようだった、この場合の「兎に角」は中途半端な出力ではなく本当に色々なSNSにこれでもかというくらい自分自身の色も含めて出力することを指している。以上を踏まえると、より多く出力することで他人はその人の人となりや能力を把握しやすくなり、また兎に角出力することで、自分と似通った価値観の人間に興味を持たれる可能性があるということがわかる。

 ではなぜ積極的に出力することで、他人から自分の人となりや能力を把握しやすい状態にすべきなのか?また、なぜ自分と似通った価値観の人間が興味を持つ状態にすべきなのか?そうすることで誰がどんな利益を得るのか?

 まずわかりやすいところで自分が得られる利益として、自分の人となりや能力に価値を感じてくれる他人と接点を持つ可能性を上げることができる。そういった他人との接点が増えれば、例えば自分が所属する会社の採用活動時の候補者を推薦できるかもしれないし、例えば自分が転職するときの相談役になってもらえるかもしれない。もっと単純に自分の人となりや能力に価値を感じてくれる他人と楽しく話をする機会も増えるだろう。

 自分が所属する会社が得られる利益としては、前述のとおり採用時に社員の知り合いというきっかけで候補を得ることができる。前提としてその社員を会社が信頼できていることが条件となるが、これを満たしている場合その社員の知り合いをもし雇えた場合の会社としての利益が、見ず知らずの人間を雇えた場合と比べて見えやすいのは一つ利点だと思う。ただ社員が積極的に出力することの副次的な効果として、その社員が転職を行いやすい状況にある可能性はある、前述のとおり積極的に出力することでその社員は転職するときの相談役を多く得ている可能性があるからだ。だけれど、いざ転職しようと思ったときにうまく運べない社員よりも、相談役を通して本人にとってより魅力的な会社に転職してしまう社員のほうがもしかしたら価値はあるのではないか?他社が欲しいと思う社員はそれだけ市場価値が高いのだし、そういった社員を抱えている会社ははたから見て魅力的な会社なのではないか?もしこの疑問が間違っていなければ、積極的に出力する社員がいて、その社員は他社からの引き抜きも多いが、そういう社員がいるからこそ魅力的に見える会社に応募してきてくれる人も増えると予想できる。

 僕は今の会社も好きだし、過去に勤めた会社も全部好きだけど、なぜそうするのかを自分で説明できない状態にいたくない。これまで全くと言っていいほどできていないけれど、もっと世間に自分の文章なりを出力すべき理由については上記のとおり自分の中で整理ができたので、これからはこのブログかはたまたそれ以外の場所で積極的に出力していこうと思う。…「思う」は決断の結果として弱すぎるので、少なくとも週に一回はこのブログを更新することを目標にしたいなぁ

Promiseアンチパターン

Promise Anti-patternsを翻訳させて頂きました。著者のtaoofcodeから許可を頂いて翻訳、投稿しています。



Promiseは一度理解してしまえば簡単だが、いくつか頭を抱えさせるパターンがある。ここにあるのは私が経験したいくつかのアンチパターンだ。

ネストされたPromise

君は複数のPromiseをネストする:

loadSomething().then(function(something) {
    loadAnotherthing().then(function(another) {
                    DoSomethingOnThem(something, another);
    });
});

君がこれをする理由は、両方のPromiseの結果で何かをする必要があるからだ。then()は一つ前のPromiseの結果しかコールバックに渡せないのでここでチェインを用いることはできない。

だが、君がこうする本当の理由は君がall()メソッドを知らないからだ。

修正は:

q.all([loadSomething(), loadAnotherThing()])  
    .spread(function(something, another) {
        DoSomethingOnThem(something, another);
});

よりシンプルになった。q.allによって返されるPromiseは、2つのPromiseの結果の配列として解決されてthen()に渡される。spread()メソッドはこの配列をコールバックの仮引数に対して分配する。

壊れたチェイン

君は以下のようなコードを書く:

function anAsyncCall() {  
    var promise = doSomethingAsync();
    promise.then(function() {
        somethingComplicated();
    });

    return promise;
}

ここでの問題はsomethingComplicated()メソッドの中で発生したエラーを捕まえることができないことだ。Promiseはチェインされることを意図されて作られている、そのためそれぞれのthen()呼び出しは新しいPromiseを返却する。次のthen()はこの新しいPromiseに対しコールすべきだ。一般的に最後のコールはcatch()にする、そうすればチェインのどこで発生したエラーでもcatch()の中でハンドルできる。

上のコードでは君が最後のthen()の結果の代わりに最初のPromiseを返した時点でチェインが壊れている。

修正は:

function anAsyncCall() {  
    var promise = doSomethingAsync();
    return promise.then(function() {
        somethingComplicated()
    });   
}

常に最後のthen()の結果を返すべきだ。

コレクションのバカ騒ぎ

君の手元には要素の配列があり、要素個々に対し何かを非同期に実行したいとする。君は再帰を用いた以下のようなコードを書いている自分に気付く。

function workMyCollection(arr) {  
    var resultArr = [];
    function _recursive(idx) {
        if (idx >= resultArr.length) return resultArr;

        return doSomethingAsync(arr[idx]).then(function(res) {
            resultArr.push(res);
            return _recursive(idx + 1);
        });
    }

    return _recursive(0);
}

あぁ、なんて非直感的なコードか。問題はいくつチェインすることになるか分からないときのメソッドのチェインの仕方にある。map()reduce()を思い出そう。

修正は:

q.allはPromiseの配列を引数にとり、結果の配列に解決してくれる。q.allを使えば以下のように、簡単に非同期呼び出しをそれらの結果にマップできる:

function workMyCollection(arr) {  
    return q.all(arr.map(function(item) {
        return doSomethingAsync(item);
    }));    
}

再帰を使った(非)解決策と違って、このコードは全ての非同期呼び出しを並列に開始する。当然、時間的により効率的だ。

もしPromiseを連続に実行する必要があれば、reduceを使う。

function workMyCollection(arr) {  
    return arr.reduce(function(promise, item) {
        return promise.then(function(result) {
            return doSomethingAsyncWithResult(item, result);
        });        
    }, q());
}

最高に綺麗なコードではないけれど、間違いなくより綺麗なコードだ。

ゴーストPromise

非同期に何かをするメソッドと、同期に処理するメソッドがある。君は2つのコードを一貫して処理するために、その必要がないときでもPromiseを作成する。

var promise;  
if (asyncCallNeeded)  
    promise = doSomethingAsync();
else  
    promise = Q.resolve(42);

promise.then(function() {  
    doSomethingCool();
});

最悪のアンチパターンというわけではない、しかし絶対的に分かりやすい方法があるー「値かPromise」をQ()でくるめば良い。このメソッドは値かPromiseを引数にとって適宜処理する。

Q(asyncCallNeeded ? doSomethingAsync() : 42)  
    .then(
        function(value){
            doSomethingGood();
        })
    .catch( 
        function(err) {
            handleTheError();
        });

注釈:私は最初ここでQ.whenを使う方法を提示した。ありがたいことにKris Kowal*1がコメントでこれを訂正してくれた。Q.whenではなく、Q()を使うーこちらのほうがより明快だ。

過度に鋭利なエラーハンドラ

thenメソッドは引数を2つとる、fulfilledハンドラとrejectedハンドラである。君は以下のようなコードを書くかもしれない:

somethingAsync.then(  
    function() {
        return somethingElseAsync();
    },
    function(err) {
        handleMyError(err);
});

このコードの問題はfulfilledハンドラの中で発生したエラーがエラーハンドラに渡されないことだ。

修正は、別のthenの中でエラーハンドリングするようにすれば良い:

somethingAsync  
    .then(function() {
        return somethingElseAsync();
    })
    .then(null,
        function(err) {
            handleMyError(err);
        });

またはcatch()を用いて:

somethingAsync  
    .then(function() {
        return somethingElseAsync();
    })
    .catch(function(err) {
        handleMyError(err);
    });

こうすればチェインの中で発生したどんなエラーでもハンドリングされる保証がある。

忘れられたPromise

君はPromiseを返却するメソッドを呼び出す。でも君はこのPromiseのことを忘れて君自身のPromiseを作成する。

var deferred = Q.defer();  
doSomethingAsync().then(function(res) {  
    res = manipulateMeInSomeWay(res);
    deferred.resolve(res);
}, function(err) {
    deferred.reject(err);
});

return deferred.promise; 

このコードはPromiseの効果ーシンプルであることを全く利用できていない。たくさんの無意味なコードが記述されている。

修正は、単純にPromiseを返却するようにする。

return doSomethingAsync().then(function(res) {  
    return manipulateMeInSomeWay(res);
});

*1:Qの作者