The King's Museum

ソフトウェアエンジニアのブログ。

Coursera: Convolutional Neural Networks を修了したよ

Coursera: Deep Learning SpecializationCourse 4: Convolutional Neural Networks を修了しました。

f:id:hjm333:20180522131500p:plain

内容としては次の通り。

  • Convolutional Neural Network (CNN)
    • Convolution
    • Edge Detection
    • Padding & Stride
    • Pooling
  • Network Architecture
    • LeNet-5
    • AlexNet
    • VGG 16
    • ResNet
    • Inception Network
  • Object Detection: YOLO Algorithm
    • Object Localization
    • Sliding Windows
    • Intersection Over Union (IOU)
    • Non-max Suppression
    • Anchor Box
  • Face Recognition
    • Verification vs Recognition
    • One Shot Learning
    • Siamese Network
    • Triplet Loss
  • Neural Style Transfer
    • Content Cost Function
    • Style Cost Function

こうやって書いてみると四週間でなかなか頑張ったじゃないか、という感じ。 かといって毎週毎週量が多くて大変、ということはなく、楽しく勉強できたなーって思った。

ただ、今回のコースは今までと違って「さわりだけ押さえておく」って感じで、実務で使いたければもう少し勉強しないとだめかなーって印象。 でも、その「もう少し勉強するための下地」は身についた感じがあって、あとは必要に応じて教科書とか論文を読めばなんとかなりそう。

次は最後のコースで RNN。いろいろの都合で6末開始になりそうだなぁ。

Coursera: Structuring Machine Learning Projects を修了したよ

Coursera: Deep Learning SpecializationCourse3: Structuring Machine Learning Projects を修了しました。本当は1ヶ月くらい前に終わってたけど…。

f:id:hjm333:20180503081311p:plain

内容としては次の通り。

  • Machine Learning Strategy
  • Orthogonalization
  • Evaluation Metrics
  • train/dev/test distribution
  • Comparing human level performance
  • Error Analysis
  • Transfer learning/Multi-task learning
  • End-to-end deep learning

今回のコースはかなり実践的な内容で「AI プロジェクトはこうやって進めましょう」というような話がメイン。こういう実践的な内容はこの講義でしか受けられないんじゃないかなーと思った。

単一の Metrics を設定するとチームパフォーマンスが高まる、プロジェクトは iterative だからからシンプルなモデルをまずは実装しましょうとか、最初に Error Analysis をしましょう、とか。AI プロジェクトに限らないといえばその通りだけど。

Deep Learning はハイパーパラメータが特に多い中で、どのハイパーパラメータがどの Metrics を改善・悪化させるかを意識するのはとても重要。この講義ではそれを昔のテレビのチューニングノブに例えていた。複数のノブを同時に操作してしまうと、何が起きているか分からなくなってしまうので、どのノブがどんな影響を持っているか正しく把握して、それぞれ個別に操作していきましょう、という話だった。

Dependencies - The Twelve-Factor App

12 Factor App シリーズ。2個目は依存関係の管理について。

Dependencies: The Twelve-Factor App

パッケージマネージャ

12 Factor app は決してライブラリに暗黙的に依存しません。

プログラミング言語にはライブラリを管理するためのパッケージマネージャが存在します。

システムワイド (site-package) にもインストールできますし、app を含む特定のディレクトリだけにインストールすることも可能です (vendoring or bundling) が、決して site-package にインストールするようなことがあってはいけません。

ツールへの依存

OS 側のツールにも暗黙的に依存してはいけません。

たとえば暗黙的な ImageMagick や curl の存在には依存してはいけません。 すべてのシステムに存在することや適切なバージョンが存在することを保証できないからです。

もし、ツールが必要であれば明示的に依存関係を書かなければなりません。

依存関係宣言と依存関係分離

すべての依存関係は依存関係宣言を使って明示的に宣言されます。 また、app の実行時には依存関係分離ツールを使って依存関係がシステムに漏れ出さないようにしなければなりません。

これは開発環境にもプロダクション環境にも適用されます。

具体例

Ruby では依存関係宣言のために Gemfile を利用し、依存関係分離のために bundle exec を利用します。

Python では依存関係宣言のために Pip を利用し、依存関係分離のために Virtualenv を利用します。

たとえ C 言語であっても依存関係宣言に Autoconf を利用し、依存関係分離のために静的リンクを利用できます。

たとえツールが何であろうと、依存関係宣言と依存関係分離はは常に一緒に行う必要があります。

macOS High Sierra で "macOS could not be installed on your computer" が出たときの対処法

macOS High Sierra の更新に失敗してしまい、次のようなメッセージがでて OS が起動できなくなった。

macOS could not be installed on your computer

再起動しても同じエラーで起動できない。 これはまずい。。。

起動する

まず「起動できない」という状況を打破したい。 次の記事を参考にして通常起動できるようにした。

http://sublimelife.hatenablog.com/entry/2017/12/15/103447

ただ、この方法は単に更新をスキップしているだけなので、このままだと最新の High Sierra にいつまでも更新できない。。。

きちんと更新する

最新の状態にならないのは困るなぁと思い少し調べると、

Apple のサイトから手動で dmg を落としてきて更新するとうまくいくよ

という報告を発見。

今回は High Sierra 10.13.4 への更新に失敗していたので、次のサイトから 10.13.4 の Combo Update dmg をダウンロードして更新したらうまくいきました。

https://support.apple.com/kb/DL1959?locale=ja_JP

きっと、この方法ではうまくいかないケースもあるのだろうけど、同じような事態に遭遇している人たちの一部にでも役に立てば…。

Codebase - The Twelve-Factor App

12 Factor App シリーズ。最初はコードの管理について。

Codebase: The Twelve-Factor App

バージョン管理システム

12 Factor App は常に Version Control System で変更をトラックしています。 このリビジョンのデータベースは Code Repository と呼ばれ、単に Repo と呼ばれることもあります。

Codebase は一つの Repo に相当し、Codebase と app は1対1の関係を持ちます。

もし、複数の Codebase を持つのであればそれはもはや一つの app ではありません。 それはなんらかの分散システムとなります。

ただし、分散システムを構成する一つ一つのコンポーネントは app として扱うことができ、それら一つ一つは 12 Factor App に適合することができます。

複数の app が同じソースコードを共有していることは 12 Factor App 違反です。 その場合、共通のコードをライブラリとして切り出し、依存関係を管理するようにするべきです。

複数の deploy

一つの Codebase が一つの app である一方、一つの Codebase に対して複数の deploy は可能です。 この場合、deploy は app が動作する一つのインスタンスだと考えます。

deploy には production や staging 環境などが考えられます。また、ローカル環境での開発も deploy の一つだと考えることができます。

Codebase は app と1対1てあるため、すべての deploy において Codebase は同一である必要があります。しかし、それらで違うリビジョンがデプロイされることはありえるでしょう。

Introduction and Background: The Twelve-Factor App

サーバーアプリケーションの開発において The Twelve-Factor App という考え方があるのをつい最近知った(いまさら感がすごい)。

勉強がてら記事にしておこうと思う。

まずは Twelve-Factor App の Introduction と Background から・・・

The Twelve-Factor App

12factor.net

INTRODUCTION

The Twelve-Factor app は「サービスとしてのソフトウェア(software-as-a-service)」を構築するための方法論です。

サービスとしてのソフトウェアは次のような特徴を持ちます。

  • プロジェクトに新たに参加する開発者のコストを最小化するため、セットアップ自動化には宣言的なフォーマットを使う
  • OS への依存関係を明確化し、実行環境に関して最大限のポータビリティを提供する
  • サーバーやシステム管理の必要性を事前に省くために、モダンなクラウドプラットフォームへのデプロイを最適化する
  • 最大限の機敏性をもつ CI のために、開発環境とプロダクション環境の差違を最小化する
  • ツール、アーキテクチャ、開発プラクティスに大きな変更を加えることなしにスケールできる

どのような言語で書かれていても、どのようなバックエンドサービスとの組み合わせでも問題ありません。

BACKGROUND

このドキュメントの起草者は直接的、または間接的にさまざまなアプリケーションの開発やオペレーションを目にしてきました。

そこで目にした問題を提起し議論するために共通の語彙を与え、問題を解決するための概念的な解決策を提示するることがこのドキュメントの目的です。

感想

Introduction と Background はそんなに大したこと書いてないと思った。

じゃあ、どうやってこれらを実現していくか、っていうのが大事なわけで、それを説明したこのあとの12個の Practice がこのドキュメントの面白いところだと思う。

ここ数ヶ月 Docker 関連でサーバーサイドをいじっているが、自分なりに「こういう方法論で作るのがベストなんじゃないかな」と思っていることが、そのまま出てきたりしたので、もっと早くに出会っていれば、、、と思った。

Coursera: Improving Deep Neural Networks を修了したよ

Coursera: Deep Learning SpecializationCourse 2: Improving Deep Neural Networks を修了しました。

f:id:hjm333:20180323230238p:plain

学んだ内容は次の通り。

  • Train/Dev/Test set
  • Bias/Variance
  • L2 Regularization
  • Dropout
  • Normalizing
  • Mini-Batch Gradient Descendant
  • Momentum, RMSprop, Adam Optimization
  • Tuning hyper parameter
  • Batch Normalization
  • Soft-max
  • Tensorflow

Course1 は Deep Neural Network のイメージを掴むための基礎講義だったけど、Course 2 は学習時に使われている最適化アルゴリズムの紹介がメインだった。

DNN はパラメータ Wb で定義されるわけだけど、学習でそれらを決めるためには、

  • ネットワークの深さ
  • 各層のユニット数
  • 学習率
  • 減衰率
  • バッチサイズ
  • 学習回数
  • 最適化アルゴリズムとそのパラメータ

という、パラメータ Wb を決定するハイパーパラメータを決定する必要がある。

結局、これらのハイパーパラメータを「どうやって、どの値にするか」が勝敗を決める、という感じですね。

Course1 で DNN の全体像をきちんと掴んでいたおかげで、それぞれのアルゴリズムやテクニックがどこに効いてくるかがとても分かりやすかった。 やはり Andrew 先生の講義で間違いなかった…(比較対象はないけど)。

(c) The King's Museum