ITと哲学と

IT系エンジニアによる技術と哲学のお話。

Object detection

CouseraのDeepLearningのコースの学習メモ. CNNの第3週目. https://www.coursera.org/learn/convolutional-neural-networks/home/week/3

Object Localization

これまでは画像認識のタスクにチャレンジしてきた. 今週はlocalizationとdetectionのタスクにチャレンジする.

localizationは単数の物体を認識した上でその位置を検出する. Detectionは複数の物体を見つけてその位置を検出するといったことをする.

図1にイメージを示す.

f:id:masamasah:20180917143557j:plain

ここで,bx,byは検知したい物体の中心座標を示し,bhとbwは物体の縦幅と横幅を示す(図2).

f:id:masamasah:20180917143608j:plain

このタスクにおいて,教師のラベルは図3のように表すのが一般的である.

f:id:masamasah:20180917143618j:plain

pcは物体が存在するかしないかを示す確率をさす.また,cnはそれぞれnクラスのフラグである. c1=歩行者,c2=車,c3=バイクだとすると,車が存在するときは図4のaのような教師データに,何も存在しないときはbのようなデータになる.

f:id:masamasah:20180917143629j:plain

ここで?はどんな数値であっても気にしないのでどうでもいいよということを示す. つまり,物体がないときは,bx,byやcnなどはどんな値を取っていても無視することを意味している.

Landmark Detection

これまでは画像の中から特定の物体の位置を見つけていた. 表情認識や姿勢認識をするために,画像の中からあらかじめ定められた特徴点を見つけたいというタスクがある. 例えば,顔画像の中から,目尻と目頭を見つけたいといったようなタスクがある.

このような画像の中から特定の特徴点を見つけるタスクをランドマーク検出とよぶ.

図5にランドマーク検出のイメージを示す.

f:id:masamasah:20180917143639j:plain

Object Detection

画像の中から複数の物体の位置を検出するタスクを考える.

例えば画像の中から車を検出したい場合,一つの方法として図6に示すようなネットワークを考える.

f:id:masamasah:20180917143650j:plain

レーニングセットとして認識対象(ここでは車)を切り出した画像を正解の教師データとして用意し,これを正しく判定できるようにネットワークを学習する.

そのネットワークを用いてSlidingWindowDetectionをすることで画像の中から車の位置を検出することができる(図7).

f:id:masamasah:20180917143701j:plain

だが,この方法は計算コストが大きく,時間がかかるという問題を抱えている.

次の章ではこれを畳み込みによる実装に変換することで,計算量を大きく削減する.

Convolutional Implementation of Sliding Windows

前述の通り,SlidingWindowDetectionを効率化する.

そのためにまず,FC層を畳み込み層で表現する方法を学ぶ必要がある.

FC層を畳み込み層で表現するには

図8のようなFC層を持つネットワークを考える.

f:id:masamasah:20180917143711j:plain

このFC層を畳み込み層で表現するには,図9のようにしてあげれば良い.

f:id:masamasah:20180917143723j:plain

つまり入力と同じ大きさのフィルタを用いることで,全結合が表現できるわけである.

Sliding Windowを効率化する

SlidignWindowのサイズが14×14×3だとすると,学習する対象のネットワークは図10(学習するネットワーク)のように表せる.

f:id:masamasah:20180917143731j:plain

これを,検知したい画像(16×16×3とする)にそのまま適用すると図10(検知するネットワーク)のように表せる.

ここで,最終的に得られた出力が,実はそれぞれのSlidingWindowを計算した結果になる(図11).

f:id:masamasah:20180917143743j:plain

Bounding Box Predictions

SlidingWindowより精度の高い方法としてYOLOアルゴリズムというものがある.

まず,YOLOアルゴリズムでは,学習対象のデータをいくつかの格子に切り分ける. 切り分けた格子にそれぞれ,ラベルをつける.

検知対象がc1=歩行者,c2=車,c3=バイクだとして,格子の数を3×3とすると図12のように表せる.

f:id:masamasah:20180917143859j:plain

ここで,格子にまたがって物体が存在するケースがありえるが,その際は,物体の中心点はどの格子にあるか?でラベルづけをする.

YOLOアルゴリズムでは図13のように,画像を入力にとって,上記のラベル(今回の例では3×3×8)を推定するネットワークの学習を行うわけである.

f:id:masamasah:20180917143909j:plain

この方法は格子に1つの物体のみが存在するときに動作する.

Intersection Over Union

検知がうまくいっているか評価する方法について述べる.

検知がうまくいっているかどうかについてはIoU(Intersection over Union)という尺度を用いて評価する.

図14のように検知領域と正解領域があったとする.

f:id:masamasah:20180917143918j:plain

この場合に,検知された領域と正解領域を足し合わせた広さをUnionと呼び,検知された領域と正解領域が重なっている広さをIntersectionとよぶこととする. IoUは図15のように表せる.

f:id:masamasah:20180917143928j:plain

つまり,正しく検知された領域が検知領域と正解領域を合わせた広さに対してどの程度あるのか?という尺度である.

一般的には,この尺度が0.5以上であれば検知が成功したとして評価することが多い.

Non-max Supperession

物体検知の際に,1つの物体に対して複数の領域が得られることがよくある. その中から十分に正しそうなものを残して他のを除外してあげる必要がある.

そのアルゴリズムがNon-max Supperessionである.

前章で述べたラベルの定義から,ラベルは検知領域についての情報と物体が存在する確率を持っている. まず,この物体が存在する確率が閾値より小さいものは,誤検知であるとみなして削除する. 次に,全ての領域の中から物体が存在する確率が最も高いものを見つける. その選ばれた領域と閾値以上の割合で重なっている領域はこれを除外する(IoRで0.5以上のものは削除するなど). その状態で再度物体が存在する確率が最も高い領域を見つけ,重なっている領域を削除するという動作を繰り返す.

その結果,重なっているものがなくなった時点で操作は完了し,不要な領域は削除された状態が得られる.

Anchor Boxes

1つのセグメントに複数の物体がある場合には,これまで議論してきたアルゴリズムは動作しない.これを動作させるためにAnchorBoxesというアイディアを見ていこう.

AnchorBoxesは,AnchorBoxというものを用意しておき,教師データ作成の際に用いる. AnchorBoxが図16に示す2つだとする.

f:id:masamasah:20180917143940j:plain

この時,画像をラベリングすると図17のようなイメージになる.

f:id:masamasah:20180917143950j:plain

つまり,画像の中のラベルづけ対象がAnchorBox1の形に近い場合はラベルの上半分に,AnchorBox2の形に近い場合はラベルの下半分としてラベルづけがされるわけである.

図17の例では歩行者はAnchorBox1の形に近しいため,ラベルの上半分に現れるし,車はAnchorBox2の形に近しいため,ラベルの下半分に現れる.

これはAnchorBoxが2つの時の例だが,一般化するとラベルは図18のような形になる

f:id:masamasah:20180917144002j:plain

YOLO Algorithm

YOLOアルゴリズムについてまとめる.

Training

学習データは複数の格子に分けられ,それぞれの格子についてラベルが作成される. ラベルはアンカーボックスの数と分類したいクラス数に依存し,図19のようになる.

f:id:masamasah:20180917144013j:plain

これを正解データとして教師データの画像が入力され,正解データを出力するようにネットワークが学習される.

Prediction

認識対象の画像が学習されたネットワークにinputされる. 得られた結果に対してnon-max supressionを行うことで誤検知されたデータを取り除き,所望の物体検出結果を得ることができる.

non-max supression

まず,物体が存在する確率が閾値を下回っているものについては除外する. 次に,物体が存在する確率が最大の領域を選択し,その領域と閾値以上のIoUがある領域を削除する. その状態で次に物体が存在する確率が大きい領域を選択し,同様に閾値以上のIoUがある領域を削除する. これを繰り返し,重なっている領域がなくなった時点で所望の結果を得ることができる.

Deep convolutional models: case studies

CouseraのDeeplearningのコースの学習メモ.

Case studies

今週はケーススタディを見て行く.

Why look at case stduies?

ネットワークを構築する上で,ほかの誰かが作ったネットワークのアイディアを知ることはとても有益だし,そのまま活用することもできる.

今回はComputerVisionの分野で成功を納めてきたネットワークを見て行くが,ComputerVisionの分野以外でも考え方などすごく参考になる部分があるので,ケーススタディは大切.

今週は

  • LeNet-5
  • AlexNet
  • VGG
  • ResNet
  • InceptionNet

を実例として見て行く.

Classic Networks

LeNet-5

これは,手書き文字の分類(グレースケール)の識別で大きな効果を発揮したネットワーク. ネットワークを図1に示す.

f:id:masamasah:20180915171847j:plain

約6万のパラメータがある,比較的小さいネットワーク.

図1を見るとわかるが,nHとnWといった縦横は層を超えるごとに小さくなっていき,nCといったチャネル数は増えて行くようにネットワークを構築することが一般的に取られる手法であり,設計時のガイドラインとなる.

AlexNet

画像認識で高い精度を出したネットワーク. 大体6千万パラメータがある中堅クラス.

図2にネットワークを示す.

f:id:masamasah:20180915171901j:plain

VGG-16

これまで見てきたように,hyperparameterがとても多い. hyperparameterのチューニングをほとんどしないで良いために,畳み込み層を3×3でstrideを1,sameパディングとして,マックスプーリング層のフィルタサイズを2×2でstrideを2と固定して用いるネットワークとしてVGGがある.

チャネル数も64=>128=>256=>512=>512とリーズナブルに選択されている.

図3にネットワークを示す.

f:id:masamasah:20180915171914j:plain

1億3800万ほどのパラメータがある非常に大きなネットワークになる.

ResNets

Residual block

ResNetはResidualBlock(残差ブロック)層を用いたネットワークである. まずは残差ブロックの説明から.

残差ブロックのイメージを図4に示す.

f:id:masamasah:20180915171929j:plain

通常のネットワークにショートカットする線を足したものを残差ブロックと呼ぶ.

これを行うと,レイヤーを深く深くして行くことができるという利点がある.

ResNetではなく通常のネットワークにおいて,レイヤーを深くして行くと,理論的にはトレーニングセットに対するエラーは単調減少するはずだが,実際には勾配消失を起こしてしまい,単調減少にならない. これが,ResNetを用いると解決でき,単調減少するようにできる.

これによって,レイヤーを深くすることで精度を高めたいという狙いを実現できる可能性が高まる.

レイヤー数とトレーニングセットに対する誤差のイメージを図5に示す.

f:id:masamasah:20180915171941j:plain

ではなぜこんな特徴になるのか? 次の章で見て行く.

Why ResNets work

Residual blockを数学的に記載すると図6のように示せる.

f:id:masamasah:20180915171953j:plain

ここで,勾配が仮に消失して0になっていた場合,図7のように数式が展開できる.

f:id:masamasah:20180915172005j:plain

つまり,勾配が消失して0になってしまうという最悪の状態であっても,その層がなかった場合と変わらない予測が可能になるわけである. 最悪のケースにまでいかない場合はモデルが意味のある知見を学び,それを持ってトレーニングセットに対するエラーが減少するのである.

Networks in Networks and 1 by 1 Convolutions

フィルタサイズが1のフィルタをかける. なんの意味があるのだろうか?

inputが1チャンネルだった場合は,ただ単に定数倍するだけで,意味はない. inputがNチャンネルになった場合は,チャネルにまたがってフィルタをかけ,それらを足し合わせるという動きになる.

f:id:masamasah:20180915172018j:plain

つまり,チャネルにまたがってニューラルネットワークのような計算をしてくれる.

さらに1×1のフィルタを複数チャネルかけることによって,inputのチャネル数を所望のチャネル数に増減させることが簡単にできる.

プーリングでは縦横のサイズを調整できるがチャネル数は調整できなかった. 1×1のフィルタは縦横のサイズは調整できないがチャネル数を調整できる方法と言える.

f:id:masamasah:20180915172029j:plain

Inception Network Motivation

CNNのパラメータはたくさんある. フィルタサイズをどうするのか,Maxプーリングをするのか. 選ぶのが大変だ.だったら,全部やってしまえばいいじゃないかというのがInception Networkのモチベーションである.

InceptionNetworkでは,異なるフィルタをかけたものを1つのoutputにまとめる. 図10のようなイメージで動く.

f:id:masamasah:20180915172040j:plain

これをすることで,hyperparameterの選択が不要になる. が,これは計算量が膨大になる.とてもとても大きい数になる.

これを解決するために,1×1フィルタを使った中間層(ボトルネック層と呼ぶ)を設けて計算量の削減を行う(図11).

f:id:masamasah:20180915172054j:plain

こんなことして性能に影響は出ないのか?と不安になるが,性能には大きく影響が出ないことがわかっており,有意義な手法となっている.

Inception Network

前の章のブロックを積み重ねたのがInceptionNetworkである.

Practival advices for using ConvNets

Using Open-Source Implementation

たくさんの種類のアーキテクチャを見てきたが,どれも複雑で,パラメータの設定などとても大変になる. アプリケーションに応用するためには,自分でここらへんの設定をするのではなく,GitHubとかに上がっているオープンソースの実装を活用すると良い.

GitHubからCloneしてくる方法とかの説明なので割愛.

Transfer Learning

ソースコードだけではなく,学習済みのモデルなんかもネットには上がっている. このモデルを使って転移学習をすることで,特定タスク向けのデータが少なかったとしても,精度の高い分類器を作れる可能性が広がる.

転移学習をする際に,どこからどこまでを学習済みのモデルを使って,どこからをFineTuningしていけば良いかは,持っているデータの量による.

データが少なければ最終層だけをFineTuningするなど,できるだけ深い層まで学習済みモデルで固定してしまう.

データ量が増えるにつれて,固定する層を減らし,深い層を学習するように調整して行く.

もしも大量のデータがあるのであれば初期値に学習済みモデルを使って,後は全て学習を進めて行くようなことも可能である.

データ量に応じた意思決定が必要になる.

Data Augmentation

データ拡張を行うことでデータ量を増やすことができる. 細かい話は割愛.

State of Computer Vision

ComputerVisionの研究から得られた知見を共有する.

まず,機械学習のモデルを育てる上で,2つの知識をシステムにinputする必要がある. 1つがラベル付きの教師データで,もう1つが人が手動で調整した特徴量である.

片方が多かったり優れていたりすれば,もう片方は少なくて良い. ラベル付き教師データが大量にあれば,人の調整した特徴量はなくても良い.

教師データが少なければ,必然的に人の調整した特徴量が必要になる. データが少ない際には,データ拡張や転移学習を行うことでデータ量を増やすことができる可能性があり,有力なオプションとなる.

また,可能であればオープンソースの実装を使うのは良い判断である. 論文で言われている構造やオープンソースで実装されているもの,公開されているモデルなどのデータをうまく使ってアプリケーションを構築しよう.

Osaka Mix Leap Study 特別編 - CTO Night KANSAI

Osaka Mix Leap Study 特別編 - CTO Night KANSAIに参加させていただいた.

【増枠】Osaka Mix Leap Study 特別編 - CTO Night KANSAI - connpass

うちにはCTOという役職はないが聞いたことはあるなー程度の知識であり,CTOという役割自体にはあまり興味がなかったが,ブレイクアウトセッションの「死の谷の先へ」に強く惹かれたので行ってみた.

結論から書くと,面白い話を聞けたし,CTOという職業自体に強く興味を持つようになったので,行ってよかったと思っている.

運営いただいたヤフーさんありがとうございました.

死の谷の先へ 〜 Yahoo!路線 混雑予測リリースまでの道程 〜

はじめに,今回の目的だったブレークアウトセッションを聴講した.

募集サイトにあった概要はこんな感じ.

研究開発の成果が具体的な事業化・製品化に結びつかないことが多々あるのですが、この研究開発と事業化の間にあるギャップを”死の谷”と呼びます。 路線サービスではその死の谷を乗り越え、研究成果をサービスの新機能(異常混雑予報)としてリリースすることができました。 しかし、そこまでの道程は決して平坦ではありませんでした。 今回は案件を通じて実際に経験した死の谷に焦点を当てながら、企画からリリースに至るまでの経緯を話したいと思います。 新しいことに挑戦したい、今まさに挑戦しようとしている方の参考になれば幸いです。

受講前に期待していた内容

これから自分がぶち当たることになるかもしれない死の谷について学んで,心構えを作る.

問題が起きた時に解決できるように,これは自分に固有の問題ではないと思えるように知っておきたい.

結論

期待していた内容が達成できたので,すごく満足感が高かった.

事例の中で3つの死の谷を乗り越えた体験談をお話ししてくれた. 3つとは以下の通り.

  • 共同研究開始時点
  • 担当者退職時点
  • 製品開発時点

特に共同研究開始時点と製品開発時点はリソースの確保という共通項があった.これを解消するためにどんな戦略をとったのか?というお話.

小さく初めて,成果が出そうであればそれを持って上司と相談する.製品化においても一度で全てをやりきろうとせずに,小さく作って大きく育てて行くリーンの考え方を持って行動する.

今となってはいろんな本でも見かけるし,定石的な進め方に感じるが,これを3年前から実践されていたというところがポイントなのかもしれない.

以前読んだ【「事業を造る人」の大研究】で言われているような内容を実践者から直接聞けた感じで,過去の読書体験が実践例と結びついた.

読書メモはこちら.http://masamasa.hatenadiary.jp/entry/2018/05/06/112624

いかに周囲の協力を得ていくか,賛同を得ていくかというのが悩みポイント.

質疑応答の中でも「モチベーションを保つために必要なことは?」に対して「時流が味方してくれたのでモチベーションが保ちやすかった」と回答されていた.それくらい周囲の賛同は大事なこと.

以下感想だが,いかにその時流を自分から作り出すか?もしくは見出すか?はたまたコントロールするか?という点については,僕自身まだわかっていない. どこかで真剣に考えないといけない自分の課題だなと思っている.

パネルディスカッション

エンジニアというキャリアの「魅力」と必要な「覚悟」は?

新しいものを生み出してユーザーに使ってもらうことが魅力というのが全体として共通していた.

覚悟についてもその裏返しで,エンジニアが新しいものを生み出し続けるから業界全体の変化し続けるスピードが早いわけで,キャッチアップするために学び続ける覚悟が必要というお話だった.

みんなが新しいものを作り続けることが原因で,みんながキャッチアップ大変って思ってるところがなんかこう,面白いと思った.

エンジニアリングは沼なのかもしれない.

エンジニアに向いている人とは?

魅力と覚悟に紐づいた話が多かった.

新しいもの好きで,キャッチアップして行くような人. モノづくりが好きで,それを使ってもらうことに喜びを感じる人たち.

向いている人っていうか,今エンジニアやってる人ってこういう人たちだよねーって言い換えても成立するようなお話.

CTOの役割とは?

業界の状況や会社のステージによってCTOの役割は様々だけど,技術って根っこがあった上でなんかする人たちって印象だった.

技術的な知見に基づいて,ビジネスについていろんなことを決めたり,ステークホルダーに説明したりする人たちって感じなのかな.

個人的に共感したのはヤフーのCTOの方がおっしゃっていた「非技術系の経営層に技術的な内容を理解してもらうためには,銀の弾丸なんてなくて,1on1で丁寧に説いて行く必要がある」という点だった.

正直,CTOは組織構造の上の方の人たちなので,その人たちの悩みとか仕事内容とか聞いても自分のスコープから外れてるんだろうなと思っていた.

けど,これは共感できる悩みだった.自分が感じている課題みたいなものを一個一個倒していった先にCTOというキャリアがあるのかもなーと漠然と思えた.

CTOの次のキャリアは?

みなさん共通していたのは学び続ける姿勢だった. 色々と熱い話だった.

最近,LIFE SHIFT的な話がそこかしこで聞こえてくる. もはや合意された未来予想図になってるんだろうなという印象を強めた.

流し読みしかしてないので,もう一度読み直したほうが良いかも.

質疑「CTOなのですが、部下の方が技術知識があるようになってきて自信がなくなってきました。どうしたらいいでしょうか。。」

CTOが常にトップである必要はないし,CTOが組織のキャップになってはよくない. そもそもCTOの役割としてエンジニアリング組織をマネージするってのもあるので,部下が育っているのはとても喜ばしいこと.

というのが一致していた回答だった.

が,個人的にはぽろっと出てきた「僕は負けたくないから勉強しますけどね」が印象的だった.ぽろっと出てきた言葉だけど,なんか凄みを感じた.

おわり.

Foundations of Convolutional Neural Networks

CouseraのDeepLearningのコースを受けている際の講義メモ.

https://www.coursera.org/learn/convolutional-neural-networks/home/week/1

今週はConvolutional Neural Networksということで画像の処理なんかによく使われるCNNのお話.

Coumputer Vision

コンピュータビジョンはDeepLearningによってかなり大きく進展した分野. 画像に写っているものを識別するような画像認識,画像から物体がどこにあるかを検知する物体検知,ある画像を別の画像のスタイルに変換するNeural Style Transferと言ったタスクがある.

画像は大変大量の情報を持つため,通常のニューラルネットを用いようとするととても大きなInputになる.これは計算コストの増大やOverfittingのリスクなどを引き起こす. CNNはこの問題に対してアプローチしている.

Edge Detection Example

CNNの前に,画像処理の分野でよく行われる,エッジ検知を見ていこう.

所望の画像に対して,特定のフィルタをかけると,どこにエッジがあるかを検出することができる. フィルタをかける処理のことを畳み込みと呼ぶ.

縦方向のエッジを検知するためのフィルタと,そのフィルタによってエッジが検知されている例を図1に示す.

f:id:masamasah:20180910220426j:plain

More Edge Detection

縦方向のエッジだけでなく,フィルタの形によってはいろんなエッジを検出できる.

例えば図2のフィルタでは横方向のエッジを検出することが可能.

f:id:masamasah:20180910220441j:plain

このように,フィルタの形によって検出できる特徴は異なる.

CNNでは,フィルタの各値をパラメータとして,画像の情報をよりよく表せるように学習を行う.

Padding

図1の例のように,畳み込みを行うと,画像が縮退する. フィルタをたくさんかけると画像がどんどんどんどん小さくなってしまう. これをコントロールするために,Paddingという技術がある. また,畳み込みを行う際に,左上のピクセルは畳み込みの計算時に1度しか活用されないが,中央のピクセルはフィルタの大きさ分だけ活用されるということもあり,画像の端っこの情報がうまく活用できていない.これもPaddingによって解決できる.

Paddingとは,畳み込みを行う前に,元の画像の淵にピクセルを埋めてしまうことを示す. 元の画像の外堀にPadding量の分だけピクセルを追加してあげる.この時,ピクセル値は0にするのが一般的.Paddingのイメージを図3に示す.

f:id:masamasah:20180910220453j:plain

図3の斜線部分がPaddingで0埋めされた領域であり,どのくらい埋めるかはPadding量で決まる. Padding量が1だったら上下左右に1ピクセル追加するし,2だったら2ピクセル追加する.

Pagging量が0の場合をValidパディングと呼び,Padding量が「Paddingした結果,フィルタを畳み込んだ際に得られる画像の大きさが畳み込み前と変わらない」場合をSameパディングと呼ぶ.

なおパディング量をpと表記する.

Strided Convolutions

これまで,畳み込みは元の画像に対してフィルタを1つずつずらして行う想定で進めてきた. 実際には,これを1つではなく,2とか3とかずらすこともある.

このずらす幅のことをストライドと呼ぶ.

ストライドをsと表記した時,畳み込み後に得られる画像の大きさは,パディング量pを用いて図4で表せる.

f:id:masamasah:20180910220505j:plain

なお,畳み込み後のサイズは整数にならないケースもある.その場合は切り捨てる.

つまり,ストライドsで大きさfのフィルタをかけていき,もしもパディング量pでパディングされた画像からフィルタがはみ出す場合は計算を行わずに次に行くというようなフィルタのかけ方を行う.

Convolutions Over Volume

今までは2Dの例を見てきた. 画像を扱う際には,カラーチャネルがあるのでカラーチャネル(R/G/B)を含めた3D(縦×横×チャネル)の例を見て行く.

3Dの場合,畳み込みするフィルタも同じチャネル数が必要になる. 畳み込みは全てのチャネルについて透過的に実施され,最終的に得られるのは1チャネルの結果となる.

つまり,図5のようなイメージになる.

f:id:masamasah:20180910220518j:plain

さらに,フィルタを複数かける例を考えると,図6のように最終的な出力も3D(たて×よこ×フィルタ数)になる.

f:id:masamasah:20180910220532j:plain

この,フィルタ数(nC)のことを,チャネル数と呼ぶことにする.

One Layer of a Convolutional Network

CNNの1レイヤーサンプルを図7に示す.

f:id:masamasah:20180910220544j:plain

ここで,学習対象となるパラメタの個数は,Wの総数(3×3×3)とバイアス1を足した28個になる. さらにフィルタが2個だとすると,それぞれにバイアスが必要なので,28×2の56個が総数である. これらのフィルタを画像の全ての部分に共通して使って行く.後述するが,この特徴によりCNNは比較的学習対象のパラメータが少なく,過学習を起こしにくいという特徴がある.

CNNで用いる表記を図8にまとめる.

f:id:masamasah:20180910220557j:plain

Simple Convolutional Network Example

CNNでは,3つのレイヤーを組み合わせることができる.

  • 畳み込み層
  • プーリング層
  • 総結合層

Pooling Layers

プーリング層では計算量を減らすことと,特徴量をロバストにすることの2つが実現できる. プーリングには最大プーリングと平均プーリングの2つがある.

最大プーリングの計算イメージを図9に示す.

f:id:masamasah:20180910220610j:plain

このように,フィルタ範囲内の最大値を返すものが最大プーリングである. 最大値を返すフィルタなので,学習するべきパラメータを持たないという特徴がある

平均プーリングは,その名前の通り,平均値を返す.

プーリングはチャネルごとに計算され,チャネル数方向への縮退は起こらない.

Maxプーリングは実用的に効果が確認されており,よく使われる技術である.

CNN Example

これまで見てきたものをまとめて,CNNのサンプルを図10に示す.

f:id:masamasah:20180910220621j:plain

ここで,レイヤーの数え方には2つの流派がある. まず一つ目は,畳み込み層やプーリング層をそれぞれ1レイヤーとして数える方法である. もう一つ目は,学習すべきパラメータを持つもののみをレイヤーとして数える方法で,その場合はプーリング層はカウントしない. 本講座では後者の数え方を採用している.

図10のように,CNNでは設定すべきHyperparameterが無数にある. アプリケーションを構築する上では,一から構造を考えるのではなく,論文などで研究者がうまくやっている方法を参考にして活用することがおすすめ. 一般的なガイドラインとしては,nHとnWは少しづつ小さくするように設定し,nCは少しづつ増えるように設定して行くと良い.最後に総結合層を持ってきて,結果をえるように設計する.

Why Convolutions?

CNNの利点は大きく2つ. パラメータ共有とスパース結合という特徴である.これらがあるので,過学習しにくく,計算コストも低い.

パラメータ共有

パラメータ共有とは,画像の全領域に共有した同じフィルタを適用するということである. 32×32×3の画像にフィルタをかけて,28×28×6に変換する処理を考える. CNNでは,フィルタはf=5でフィルタ数は6で良いので,バイアス合わせて156個の値からなる. これが通常のNNだと32×32×3×28×28×6+1個の値からなるフィルタが必要であり,とてもじゃないが計算しきれない.

画像の処理などは特に,エッジ検出など基本構造を検出するためのフィルタは,画像の一部だけでなく全体で有用であるという特徴があるため成り立っている.

スパース結合

とある層のとあるピクセルは,直前の層の一部のピクセルとしか結合していないということをスパース結合であるという. 図11のように,とある層は直前の全ての層の計算結果ではなく,一部の層の計算結果からのみなる.

f:id:masamasah:20180910220635j:plain

これにより,計算コストが少なく,過学習を起こしにくいという特徴が生じる.

SCDVについて学んだ

文章を数学的に扱いやすい形に変える方法の一つであるSCDVについて学んだ。

SCDVとは

ドキュメントを数学的に扱うことのできるような形に変換する方法のひとつで、Sparse Composite Document Vectorのこと。 他の方法に比べて変換後の形が小さくて扱いやすかったり、変換後の値を文章分類などに扱った際に精度が高いといった利点がある。

アルゴリズム

3つのパートに別れる。

  • Word Vector Clustering
  • Document Topic-Vector Formation
  • Sparse Document Vecotrs

Word Vector Clustering

まず、あつめてきたドキュメントから、単語を抜き出して、ボキャブラリセット Vを作る。 このとき、ボキャブラリセットにはw_1~w_Vの単語が含まれる。

これらについて、SGNS]によるWord2Vecを行い、各単語w_1~w_Vについての単語ベクトル \vec{wv_i}(i=1...V)を求める。ここで、ベクトルの長さをdとする。

さらに、これらをガウス混合モデルを用いて、K個のクラスタに分類する。 Kをいくつにするかは任意で、SCDVのパラメータになっている。

分類した各クラスタC_kについて、各単語モデルw_iクラスタC_kに所属する確率p(C_k|w_i)を、全ての単語・全てのクラスタについて計算する。

Document Topic-Vector Formation

単語ベクトルw_1~w_Vに、各単語モデルw_iクラスタC_kに所属する確率p(C_k|w_i)を掛け合わせたものを、単語-クラスタベクトル \vec{wcv_{ik}}と呼ぶ。

 \vec{wcv_{ik}} = w_i \times p(C_k|w_i)

単語-クラスタベクトル \vec{wcv_{ik}}を、すべてのクラスタ(k=1...K)について並べた行列を考える。

 [\vec{wcv_{i1}}, ... ]

これに、IDF(w_i)という値(ドキュメント内部で単語w_iがどれだけ珍しいかを表す数値)を掛け合わせたものを単語-トピックモデル \vec{wtv_i}と呼ぶ。

 \vec{wtv_i} =[ \vec{wcv_{i1}}, ... ]× IFD(w_i)

なお、 \vec{wtv_i}d \times Kの行列である(長さdのベクトルをK個横に並べて、実数を掛け算しただけなので)。

この \vec{wtv_i}を、特定のドキュメントD_nに出てくる単語の分だけ足し合わせた値を文章ベクトル \vec{dv_{D_n}}と呼ぶ

 \vec{dv_{D_n}} = Σ {\vec{wtv_i}}

Sparse Document Vecotrs

得られた \vec{dv_{D_n}} をスパース(ほとんどの要素が0で、残り数少ない要素のみが値を持つ状態)にするために、閾値を下回る要素については0に値を変換する。

こうして得られたものを、SCDVによる文章ベクトル \vec{SCDV_{Dn}}とよぶ。

さいごに

このベクトルを用いて、文章分類などを行うと、他の方法に比べて精度がよい。

ML Strategy(2)

CouseraのDeepLearningのコースの受講メモ.

機械学習プロジェクトを進めて行くための戦略についてpart2.

Error Analysis

エラーを手動で分析してより良いモデルに育てて行くための知見をえる.

Carring out error analysis

モデルの能力が,人の能力に届かない範囲では,手動によるエラー分析が有効. モデルが分類に失敗したものを人がチェックして,どんな時に失敗しているかを分析する.

例えば,猫画像判定のアプリを考える.

猫画像判定システムの精度が90%あり,10%のエラーが残っているとする. エラーの中から1つの画像を見てみると,犬の画像を猫として判定していた. 犬の画像を大量に教師データとして取り入れると,この問題は解決できる可能性があるが,この問題に時間をかけることが有意義かどうか?

これに答えるのがErrorAnalysisである.

誤判定した中から,100サンプル程度ランダムに取り出して,その中に犬の画像がどれくらい含まれているかを見てみる.その結果,100個中2個であれば,これを改善したとしてもあまり効果はない. 100個中80個が犬であればこれを解決することはモデルの精度向上に大きな影響を及ぼすだろう.

このように,取り組むべき問題がクリアできた時,最大でどの程度精度が改善するか?といった指標をceilingと表現する.

Cleaning up incorrectly labeled data

全てのラベルが正しいわけではない.ラベルづけにミスっているケースもある. ラベルにミスが含まれていることがわかった時,これを付け直すか?という問題.

基本的に,DeepLearningなどのアルゴリズムは,ランダムなトレーニングセットのエラーに対しては堅牢なので,あまり気にする必要はない.エラー率があまりにも大きくて,データ数が少ないような場合は問題になるが,十分なデータがあり,許容できるエラー率であればモデルの精度に大きな影響はない.

Dev/TestセットにおけるエラーについてはErrorAnalysisをしてその影響を確認できる. 例えば,モデルの精度が90%でエラー率が10%のモデルについて,ラベルミスが0.6%であればそれは問題ないと言える. もしもこれが,モデルの精度が98%でエラー率が2%の状態で,ラベルミスが0.6%あると,問題になるケースがある. パラメータチューニングの際に,A(誤差率2.1%)とB(誤差率1.9%)の比較をしてどちらを採用するか決めなくてはいけないが,この際に,ラベルミスが0.6%あると,どちらがより良いパラメータなのかということを正しく判断できなくなるためである.

この場合は,Dev/Test双方のラベルづけを再度行う必要がある. なお,Dev/Testは同じ源からデータを得たいので,ラベルを修正するのであれば双方について同時に行うこと.

Build your first system quickly, then iterate

MLシステムを作る上では,まず簡単に作って,ブラッシュアップして行くような進め方が良い. まず,簡単に作って,その後にDev/Testセットを作ってメトリクスを決め,Bias/Variance AnalysisとErrorAnalysisを行って次に行うべき方向性を決める.

Mismatched traiging and dev/test set

Training and testing on different distributions

実際にシステムを動作させる環境から得られるインプットの他にも,例えば画像認識などのタスクであればネット上から画像をダウンロードしてきてそれを教師データとして活用することも可能になる.

その場合に教師データとDev/Testデータをどのように作って行ったら良いかというお話.

全部混ぜて,そこから教師データとDevデータとTestデータに分けるような方法はあまりよろしくない. 特にDevデータとTestデータはパラメータチューニングの際の意思決定に使われるものなので,可能な限り実環境で得られるデータに近しい必要がある.

なので,まずは必要なだけのDevデータとTestデータを可能な限り実環境から得られるデータで構成してしまう.そしてあまりのデータとネットから落としてきたデータを一緒に教師データとして扱うといった方法が良い.Dev/Testはあくまで同じ源から得られるようにしたいので注意.

Bias and Variance with mismatched data distributions

Bias/Variance Analysisを行う際に,データソースの違いが気になる.

例えば,HumanLevelのエラー率が0%だとして,TrainingErrorが1%でDevErrorが10%のシステムがあるとする. 一見するとHighVarinaceの問題のようにも見えるが,TrainingSetとDevSetが別の情報源からきているとすると,その影響がどの程度なのか?という疑問が持ち上がる.

これを解決するために,新たに「Training-Dev」というデータセットを作成する. これは,Trainingセットと同じ源から得られたデータのうち,学習には使われないデータのこと. Trainingセットを作った後で,そこからランダムに一部のデータをTraining-Devセットとしてあげると良い.

TraingErrorが1%でTraining-DevErrorが9%でDevErrorが10%だとすると,これはHigh Varianceの問題である.

TraingErrorが1%でTraining-DevErrorが1.5%でDevErrorが10%だとすると,これはデータミスマッチの問題である.

TraingErrorが10%でTraining-DevErrorが11%でDevErrorが12%だとすると,これはHigh Biasの問題である.

TraingErrorが10%でTraining-DevErrorが11%でDevErrorが20%だとすると,これはHigh BiasでかつHigh Varianceな問題である.

Addressing data mismatch

データミスマッチの問題にどうアプローチしていくか,確実な方法はないが,試すべき方法はある.

まずはErrorAnalysisを行って,TraingデータとDevデータの違いを探してみる. 例えばDevデータはよりノイズが強いとかそんな情報がわかるとよい.

これがわかったら,TrainingデータをよりDevデータに近づけるための努力を行う. いくつか方法はあるが,例えばDevデータと同じ環境でデータを大量に確保するとか,データ合成を行って擬似的にTrainingデータをDevデータに近づけるなどする.

データの確保は難しいケースが多いので,データ合成は手軽に試せるのでおすすめ.

データ合成する際には,合成するデータのバリエーションに注意が必要で,バリエーションが少ないとoverfittingを引き起こしてしまうリスクがある点に注意すること.

Learning from multiple tasks

Transfer learning

転移学習について.

同一のインプットを受けて,異なるタスクを行うモデルを効率よく学習するための仕組みとして転移学習は有効.

例えば,画像をインプットに,猫を判別するようなタスクがあったとする. このために,画像を大量にインプットし,モデルを学習する. この学習したモデルの浅い層は画像のエッジを検出したり,平面を検出したりといったプリミティブな表現を獲得している.深い層ではこれを活用して猫の顔を認識するような動きになる.

このモデルを,例えば画像をインプットに骨折しているかどうかを判定するようなタスクに応用することができる. 浅い層はそのまま用いて,深い層を再度学習させることで,骨折を判定させるモデルに転移する.

骨折診断するための画像郡であっても,猫の画像を判定するための画像郡であっても,画像としてのプリミティブな特徴は変わらないことから,こんなことができるわけである.

はじめに,浅い層を学習する過程をpre-trainingと呼ぶ. 次に深い層を学習させる過程をFineTuningと呼ぶ.

転移学習は以下の条件の時に効果を発揮する.

  • タスクAとタスクBが同じinputを持つこと(双方画像であるとか)
  • タスクBよりタスクAのデータが大量に存在していること.Aが少ないとあまり効果がない
  • タスクAの学習で得られた低レイヤーの特徴がタスクBにおいて有用であること

Multi-task learning

複数のタスクを同時に行うモデル. 車載カメラにおいて,「歩行者を検知する」「標識を検知する」と言ったタスクを,それぞれ個別のモデルではなくまとめて1つのモデルで行うようなイメージ.

こうすることで低レイヤーを共通して使いまわせるため,効率が良い. 4つのタスクを1つのモデルで実現したいとした時,教師データの正解データとして,必ずしも各教師全てに4つの判定結果が入っている必要はない.

「歩行者の検知」「標識の検知」「信号の検知」「別の車の検知」の4タスクを実施したいとして,とある教師データの正解が「歩行者の検知:yes」「標識の検知:no」「信号の検知:?」「別の車の検知:?」と言ったようにデータに欠損が生じていた場合は,?については無視してあげれば良いので,学習に用いることは可能である.

Multi-task Learningは以下の条件の時に効果を発揮する.

  • 低レイヤーが共通して使いまわせること
  • 各タスクのデータ量が同じくらいであること
  • 十分に大きなネットワークを学習させられること

実践的には,転移学習はたくさん使われているケースがあるが,Multi-taskLearningが使われるケースはあまりない.

End-to-end deep learning

What is end-to-end deep learning?

音声の自動書き起こしタスクを考える.

これまでの世界では,音声をまず,音声特徴に変換し,それをもとに音素を割り出し,さらにそこから単語を得てそれを元に書き起こし結果を得ると言ったpipeLineタスクを行っていた.

これを,直接音声の波形から書き起こし結果をえると言ったものがEnd-to-end DeepLearningである.

データ量が十分に大きい時にはこのアプローチが可能になる.データ量がそこまで大きくないときはEnd-to-endは難しいため,タスクの分割を検討する必要がある.

例えば,画像認識のよる入室管理システムのようなものを作る時,画像全体から特定の人が写っているかを識別するのはなかなか難しい. そこで,まずは顔がある場所を反転し,その顔がある場所の中から特定の人物かどうかを判定するようなタスクを行う.

こうすることで,困難な問題が2つのステップに分割される.

Whether to use end-to-end deep learning

End-to-endの利点と欠点は以下の通り.

利点

手作りの特徴量が不要であり,データを食わせればなんとかなる.

欠点

データが大量に必要になる. 機械学習のプロジェクトにおいて,手作りの特徴量をモデルに注入することは精度をあげるためにかなり有効なアプローチだが,End-to-endのアプローチではそれができない. データ量が十分にあれば手作りの特徴量は不要になるので問題ないが,データ量が得られないとこれが問題になる.

データ量はかなり大事な要素である.

ML Strategy (1)

この週と次の週では機械学習プロジェクトを進めていくための戦略について説明する.

Why ML Strategy

MLプロジェクトを進めていくための戦略がなせ必要なのか?

モデルの精度が例えば90%であるとした時,それをさらに改善するためにどんなことをしたらより改善できるのか?という判断を適切に行えることはプロジェクトの効率や進捗に大きく影響する.

そのため,この週と次の週で話される戦略を理解し,活用することが大切になる.

Orthogonalization

日本語でOrthogonalizeationは直交という意味. 機械学習プロジェクトにおけるモデルの調律時に意識すると良い考え方として「Orthogonalization」がある.

これは,1度に1つのものを変えてみるということ.

まず調律においては,はじめに「教師データによりよくフィットするように」という点に絞って調律を行う.次に「バリデーションセットによりよくフィットするように」という点に絞って調律を行う.

同時に双方を満たすように調整するのではなく,それぞれ独立して調律を行うことが効率的な進め方につながる.この考え方をorthogolanizationという.

Single number evaluation metric

調律を行う際には,例えば分類制度や処理時間など,複数の指標を最適化しようとして調律すると行った戦略が考えられるが,より効率的な調律を進めるためには,1つの調律するための指標を決めてそれを追い求めるほうが効率が良い.

どのように1つの指標を決めるかについては後ほどの授業で述べるが,例えばF1Scoreなどがある.

Satisficing and Optimizing metric

モデルのパラメータのセットから,最適なものを見つけたい. その際に,複数のメトリクスがあると意思決定が難しいことがある.

例えば,(F1Score,処理時間)がA(90%, 80ms),B(92%, 95ms),C(95%, 1500ms)だとする. この時, F1Scoreだけに着目すると最適なのはCだが,処理時間の観点に着目すると最適なのはBとなる.

さらにメトリクスが増えて,N個になった時,適切な判断を下すのは難しい.

これをうまく扱うための方法として「1つを最適化対象として,他のN-1は制約条件とする」という考え方がある.

例えば,F1Scoreを最適化対象として,処理時間は制約条件とするような考え方である. 「処理時間は100ms以下であること」という制約を課し,その条件下でF1Scoreを最適化するものが良いパラメータセットであると考える.

すると先ほどの例は処理時間が制約条件に収まり,F1Scoreが最適なBがベストな選択であると判断できる.

Train/dev/test distributions

特にDevセットとテストセットについては,同様の発生源からデータを得るようにすることが大切になる. トレーニングセットを使い,パラメータを決めて学習したモデルを,Devセットで評価して,最適なパラメータに調整していく.その際に,Devセットとテストセットがかけ離れていると,その調整が全く意味をなさなくなってしまう. これを避けるためにも,Devセットとテストセットは同一の発生源からデータを取得できるように心がけるほうがいい.

Size of the dev and test sets

データ総量がそんなに大きくなかったこれまでの世界では,教師データとして総量の60%を,Devセットとして20%,テストセットとして20%を使うようなバランスが多かった.

近年,扱えるデータ量の増加に伴って,母数が増えたので,総量の20%をDevとテストセットに使う必要は必ずしもなくなった. 最近では98%を教師データとして使い,残り1%づつをDevセットやテストセットとして扱うケースもある.

さらに,テストセットは最終的なシステムのパフォーマンスを推定するためのものであり,最終的なシステムのパフォーマンスの推定が不要であれば,テストセットを用意しないという選択もありうる.

When to change dev/test/ sets and metrics

メトリクスがモデルの「良さ」を直接的に反映していないことがわかったら,メトリクスを変更する必要がある.

例えば,誤差1%で動くがミスした際に大きな事故がつながるAモデルと,誤差5%で動きミスしたとしても事故には繋がらないBモデルがあるとする.

メトリクスを誤差率にすると,モデルAの方が良いように見えるが,実際には事故が起きると様々な損害につながるため,メトリクスとしては誤差率だけでなく,事故の大きさのようなものも含むべきである.

このようなことが後から判明したら,そのタイミングでメトリクス自体を変更する必要がある.

Why human-level performance?

機械学習によるタスクの精度は近年向上してきており,人の能力と戦えるレベルに進化してきた. 分野によっては人の能力を超えるような成果も出始めている.

機械学習の分野では,人の能力に比べてモデルの精度がどの程度か?という問いが,重要な指標として扱われている. 機械学習のモデルの到達可能な最大精度を見積もるために,人の能力が活用できるからである.

到達可能な理想的な最大精度に達した際に残る誤差をBayesOptimalErrorと呼ぶ. 人のパターン認識力や識別力はとても高く,BayesOptimalErrorと人間の限界値は近しい.

そのため,モデルが到達可能な精度として,人の識別能力がBayesOptimalErrorを間接的に示す指標として扱われるのである.

さらに,別の観点からは,人の能力限界までは,人が教師データを作成できるので,学習に用いる教師データを増やすことが容易いということや,人の能力限界までは,モデルがどのような条件の時に失敗しやすいかを人が理解できるので,最適化しやすいため,人の能力限界までモデルの精度をあげることは,それ以上に引き上げることに比べるとやりやすい.

そのため,図1のような投資する時間とモデルの精度の関係が描ける.

f:id:masamasah:20180827201650j:plain

Avoidable bias

過去の章で,モデルの性能を評価する指標としてバイアスとバリアンスについて考えた. 過去の章で説明したバイアスとバリアンスはHumanLevelError(≒BayesOptimalError)が0であるとして計算したもので,実際は異なる.

バイアスは教師データについての誤差率から,HumanLevelError率を引いた値として定義される.バリアンスは,バリデーションセットデータについての誤差率から教師データについての誤差率を引いた値として定義される.

例えば,HumanLevelErrorが1%で,教師データに対する誤差率が8%,バリデーションセットデータに対する誤差率が10%だとすると,バイアスが7%でバリアンスが2%なので,Highバイアスな状態であると言える. これが,HumanLeverErrorが7.5%のような場合は,バイアスが0.5%でバリアンスが2%なので,Highバリアンスな状態であると言える.

このように,HumanLevelErrorは誤差率の分析を行う上でも重要な指標となっている.

Undrstanding human-level performance

HumanLevelErrorとは具体的にどうやって計算したら良いのか? 例えば以下のような状態を考える.

Task:画像による骨折診断 * 一般的な人の誤差率:1% * 一般的な専門家の誤差率0.5% * エキスパートな専門家の誤差率0.4% * エキスパートな専門家のチームによる誤差率0.3%

この場合は,BayesOptimalErrorはエキスパートな専門家チームによる誤差率0.3%よりも低いと見積もるのが正しい.

Supassing human-level performance

近年では,分野によっては人の能力を超えるような成果が出始めている.

広告配信やレコメンドシステムなど,構造化されたデータを扱うようなタスクの場合に,モデルが人を超えることが増えてきている. 人は構造化データの処理があまり得意ではなく,機械はそれが得意だからである.

構造化されていないような,画像認識や音声認識などの分野においては,一般的には人の能力を超えることは難しいが,近年は扱えるデータ量が増えてきたこともあり,少しずつ人の能力を超えるモデルが出てきている.なので,モデルが人を超えることは不可能ではないので,チャレンジする価値がある.

Improving your model performance

ここまでの内容をまとめて,モデルのパフォーマンスを向上させて行くためのプロジェクトの進め方ガイドラインを示す.

教師データにフィットさせる

まずは,モデルを十分に教師データにフィットさせることを考える. これは,バイアスを下げることを意味する.

モデルのネットワークを大きく,深くしたりする必要があるかもしれないし,学習期間をもっと伸ばす必要があるかもしれない.学習を効率良く進めるために最適化アルゴリズムを変える必要があるかもしれないし,CNNやRNNなど別のネットワークアーキテクチャを試すべきかもしれない.

バリデーションセットにフィットさせる

十分に教師データにフィットしたら,次はバリデーションセットにフィットさせる. つまり,バリアンスを下げる.

もっともっとたくさんの教師データを集めて学習させることでこれが達成できるかもしれない. 正則化(L2正則化やDropOut)することで解決できるかもしれないし,データを水増しするためにデータ拡張を行う必要があるかもしれない. CNNやRNNなど別のアーキテクチャを選択することで解決できるかもしれない.

この2つのステップを,一度に片方にだけ集中して行い,反復させることで効率良くモデルが育って行く.