Special applications: Face recognition & Neural style transfer
CouseraのDeepLearningのコース受講メモ. CNNのコースの最後
Face Recognition
What is face recognition?
face recognitionとして扱う問題は大きく分けて2つあり,顔認証と顔認識である.
顔認証はカメラで撮った顔画像とIDを元に,提示されたIDの所有者がその顔の人かどうかを判定する. IDを元にシステムから顔画像を持ってきて,撮影された顔がシステムから持ってきた画像と同一人物かそうでないかを判定する. 撮影された画像1に対して,システムが持っている画像1が正しいかを判定するタスクであり,後述の顔認識と比べると比較的簡単.
顔認識は,カメラで撮った画像が,システムに格納されているどの人物かを当てる.顔認証とは異なり,IDは存在しない. 撮影された画像1に対して,システムが保持するK人の顔画像と比較し,K+1(いずれでもないを含める)にクラスわけする. 顔認識は顔認証に比べて難しい.
One Shot Learning
従業員の入退ゲートの制御にシステムを用いたいが,そのシステムに組み込むモデルの学習に使えるデータは多くないはず.とある従業員の顔画像なんて1つしか得られないこともある.そのため,通常のCNNだと教師データが足りずにうまく動作しない.
これをうまくいかせるために,考え方を変える. d(image1, image2)=画像がどの程度異なるかを出力する関数を学習させることで,これを実現する. d(A,B)は大きな値を,d(A,A')は小さな値を出力するような関数を学習させておくことで,システムが保持する従業員の写真と,撮影した写真を比較してその二つが同一人物であるかどうかの評価値が得られる.
関数dの学習は必ずしも識別したい従業員の写真がなくても可能で,学習済みのモデルを新たな従業員に適用してもうまく動作する.
具体的な方法を次の章で説明する.
Siamese Network
CNNで得られる層の途中の表現を取り出して,それを特徴量としてエンコーディングされたベクトルと呼ぶ(図1).
このエンコーディングされた特徴量を比較したい画像についてそれぞれ計算し,その距離(L2ノルム)を計算することでどの程度似ているかを明らかにする(図2).
同じ人の画像であればL2ノルムは小さく,異なる人の画像であればL2ノルムは大きくなる.
Triplet Loss
特徴量を適切にエンコーディングできるCNNはどのように学習するべきか?を説明する.
学習のための損失関数としてTriplet損失を使う. Tripletとは「3つ」のという意味で,認識対象の画像(Anchor)と認識対象と同一人物の画像(Positive)と異なる人物の画像(Negative)の3つのセットを用いて定義される損失である.
Triplet損失を図3に示す.
左辺のノルムは「同一人物の画像をエンコーディングした際のL2ノルム」であり,右辺が「異なる人物の画像をエンコーディングした際のL2ノルム」である. このノルムについて「同一人物の画像をエンコーディングした際のL2ノルム」が「異なる人物の画像をエンコーディングした際のL2ノルム」よりα以上小さくなるようにするという制約である.なおαはhyper-parameterである.
これを規範としてCNNのモデルを学習し,エンコーディングのためのネットワークを学習する.
最終的にはこのモデルを用いて入力と比較対象をエンコーディングし,そのL2ノルムが閾値を越えなければ同一人物であると判定したりする.
Face Verification and Binary Classification
手動で閾値を決める代わりに,エンコーディングされた特徴量ベクトルを用いてロジスティック回帰で判定するような方法もある.
Neural Style Transfer
What is neural style transfer?
とある画像を,別の画像のスタイルに変換して描写するタスクのことをneural style transferという.
撮影した画像を,例えばゴッホの絵画っぽくすることができたりする.
What are deep ConvNets learning?
neural style transferはCNNのモデルのとある特徴を活用して実現されている. ここではまず,その特徴を説明する.
CNNのネットワークについて,浅い層と深い層では学習する内容にどんな違いがあるのか?という特徴だ.
浅い層では,画像のプリミティブな特徴(例えばエッジや平面など)を学習する.
深い層ではそれらを組み合わせてより複雑な特徴(例えば人の顔や車の形など)を学習する.
簡単なイメージを図4に示す.
これらの特徴を用いて.neural style transferが実現される.
Cost Function
neural style transferは以下の手順で行われる.
まず,入力画像C(変換したい画像)とスタイル画像S(こういうスタイルにしたいと思った画像)の2つをえる.次に,出力画像G(入力画像をスタイル画像のスタイルに変換した画像)の候補としてランダムに生成された画像を作る.
次に,ランダムに生成された画像と入力画像,スタイル画像を比較し,後述するコスト関数を計算する.
さらに,勾配法を用いて,コストを下げるようにランダム画像を更新する.
定められた学習回数だけランダム画像を更新し続けて,最終的に出力画像をえる. この時,出力画像はランダムに生成されてから,コストを下げる方向に更新され続け,結果として入力画像に近く,スタイル画像のスタイルに近い画像となる.
この時のコスト関数を図5に示す.
JContentとJStyleについては次の章とその次の章で説明する.
αとβはhyper-parameterである.
ランダム画像は勾配法を用いて図6のように更新される.
Content Cost Function
JContentについて.
JContentはすでに学習されているCNNに入力画像Cと出力画像Gを入力し浅すぎず深すぎないレイヤーのアクティベーションを用いて計算する(図7).
比較的浅いレイヤーのアクティベーションを選んでいるため,プリミティブな特徴(エッジが立っているとか平面であるとか)が選択的に使われている.そのためこの値が小さければ,CとGは「同じようなものが写っている」ということができる.
Style Cost Function
次に,出力画像Gのスタイルをスタイル画像Sに近づけるためのコスト関数について説明する.
これには,スタイル関数Gkkを用いる. スタイル関数はCNNの畳み込み層について,チャネル方向に相関を計算したものである(図8).
これは,異なる特徴(エッジが立っていたり平面だったりなど)がいかに同時に現れたり同時には現れなかったりするかといった情報であり,大まかにいうと画像のスタイルを代表する値になる.
このスタイル関数を用いて,レイヤーlでのJStyleを図9と表す.
さらに,JStyleは各レイヤーで得られたJStyleを任意に加重して足し合わせて使うことができる(図10).
λは任意の加重の値でありhyper-parameterである.
これがJStyleの定義である.
このJStyleと図7のJContentを用いて図5のコスト関数を計算することで,主力画像Gに対する勾配法を実行することができ,これによって画像Cをスタイル画像Sに似せた出力画像Gが得られるわけである.
1D and 3D Generalizations
これまで2次元の画像についてCNNを見てきたが,1Dや3Dなどのデータに対してもCNNを適用することは可能.詳細は割愛.
おわり.
Object detection
CouseraのDeepLearningのコースの学習メモ. CNNの第3週目. https://www.coursera.org/learn/convolutional-neural-networks/home/week/3
Object Localization
これまでは画像認識のタスクにチャレンジしてきた. 今週はlocalizationとdetectionのタスクにチャレンジする.
localizationは単数の物体を認識した上でその位置を検出する. Detectionは複数の物体を見つけてその位置を検出するといったことをする.
図1にイメージを示す.
ここで,bx,byは検知したい物体の中心座標を示し,bhとbwは物体の縦幅と横幅を示す(図2).
このタスクにおいて,教師のラベルは図3のように表すのが一般的である.
pcは物体が存在するかしないかを示す確率をさす.また,cnはそれぞれnクラスのフラグである. c1=歩行者,c2=車,c3=バイクだとすると,車が存在するときは図4のaのような教師データに,何も存在しないときはbのようなデータになる.
ここで?はどんな数値であっても気にしないのでどうでもいいよということを示す. つまり,物体がないときは,bx,byやcnなどはどんな値を取っていても無視することを意味している.
Landmark Detection
これまでは画像の中から特定の物体の位置を見つけていた. 表情認識や姿勢認識をするために,画像の中からあらかじめ定められた特徴点を見つけたいというタスクがある. 例えば,顔画像の中から,目尻と目頭を見つけたいといったようなタスクがある.
このような画像の中から特定の特徴点を見つけるタスクをランドマーク検出とよぶ.
図5にランドマーク検出のイメージを示す.
Object Detection
画像の中から複数の物体の位置を検出するタスクを考える.
例えば画像の中から車を検出したい場合,一つの方法として図6に示すようなネットワークを考える.
トレーニングセットとして認識対象(ここでは車)を切り出した画像を正解の教師データとして用意し,これを正しく判定できるようにネットワークを学習する.
そのネットワークを用いてSlidingWindowDetectionをすることで画像の中から車の位置を検出することができる(図7).
だが,この方法は計算コストが大きく,時間がかかるという問題を抱えている.
次の章ではこれを畳み込みによる実装に変換することで,計算量を大きく削減する.
Convolutional Implementation of Sliding Windows
前述の通り,SlidingWindowDetectionを効率化する.
そのためにまず,FC層を畳み込み層で表現する方法を学ぶ必要がある.
FC層を畳み込み層で表現するには
図8のようなFC層を持つネットワークを考える.
このFC層を畳み込み層で表現するには,図9のようにしてあげれば良い.
つまり入力と同じ大きさのフィルタを用いることで,全結合が表現できるわけである.
Sliding Windowを効率化する
SlidignWindowのサイズが14×14×3だとすると,学習する対象のネットワークは図10(学習するネットワーク)のように表せる.
これを,検知したい画像(16×16×3とする)にそのまま適用すると図10(検知するネットワーク)のように表せる.
ここで,最終的に得られた出力が,実はそれぞれのSlidingWindowを計算した結果になる(図11).
Bounding Box Predictions
SlidingWindowより精度の高い方法としてYOLOアルゴリズムというものがある.
まず,YOLOアルゴリズムでは,学習対象のデータをいくつかの格子に切り分ける. 切り分けた格子にそれぞれ,ラベルをつける.
検知対象がc1=歩行者,c2=車,c3=バイクだとして,格子の数を3×3とすると図12のように表せる.
ここで,格子にまたがって物体が存在するケースがありえるが,その際は,物体の中心点はどの格子にあるか?でラベルづけをする.
YOLOアルゴリズムでは図13のように,画像を入力にとって,上記のラベル(今回の例では3×3×8)を推定するネットワークの学習を行うわけである.
この方法は格子に1つの物体のみが存在するときに動作する.
Intersection Over Union
検知がうまくいっているか評価する方法について述べる.
検知がうまくいっているかどうかについてはIoU(Intersection over Union)という尺度を用いて評価する.
図14のように検知領域と正解領域があったとする.
この場合に,検知された領域と正解領域を足し合わせた広さをUnionと呼び,検知された領域と正解領域が重なっている広さをIntersectionとよぶこととする. IoUは図15のように表せる.
つまり,正しく検知された領域が検知領域と正解領域を合わせた広さに対してどの程度あるのか?という尺度である.
一般的には,この尺度が0.5以上であれば検知が成功したとして評価することが多い.
Non-max Supperession
物体検知の際に,1つの物体に対して複数の領域が得られることがよくある. その中から十分に正しそうなものを残して他のを除外してあげる必要がある.
そのアルゴリズムがNon-max Supperessionである.
前章で述べたラベルの定義から,ラベルは検知領域についての情報と物体が存在する確率を持っている. まず,この物体が存在する確率が閾値より小さいものは,誤検知であるとみなして削除する. 次に,全ての領域の中から物体が存在する確率が最も高いものを見つける. その選ばれた領域と閾値以上の割合で重なっている領域はこれを除外する(IoRで0.5以上のものは削除するなど). その状態で再度物体が存在する確率が最も高い領域を見つけ,重なっている領域を削除するという動作を繰り返す.
その結果,重なっているものがなくなった時点で操作は完了し,不要な領域は削除された状態が得られる.
Anchor Boxes
1つのセグメントに複数の物体がある場合には,これまで議論してきたアルゴリズムは動作しない.これを動作させるためにAnchorBoxesというアイディアを見ていこう.
AnchorBoxesは,AnchorBoxというものを用意しておき,教師データ作成の際に用いる. AnchorBoxが図16に示す2つだとする.
この時,画像をラベリングすると図17のようなイメージになる.
つまり,画像の中のラベルづけ対象がAnchorBox1の形に近い場合はラベルの上半分に,AnchorBox2の形に近い場合はラベルの下半分としてラベルづけがされるわけである.
図17の例では歩行者はAnchorBox1の形に近しいため,ラベルの上半分に現れるし,車はAnchorBox2の形に近しいため,ラベルの下半分に現れる.
これはAnchorBoxが2つの時の例だが,一般化するとラベルは図18のような形になる
YOLO Algorithm
YOLOアルゴリズムについてまとめる.
Training
学習データは複数の格子に分けられ,それぞれの格子についてラベルが作成される. ラベルはアンカーボックスの数と分類したいクラス数に依存し,図19のようになる.
これを正解データとして教師データの画像が入力され,正解データを出力するようにネットワークが学習される.
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に示す.
約6万のパラメータがある,比較的小さいネットワーク.
図1を見るとわかるが,nHとnWといった縦横は層を超えるごとに小さくなっていき,nCといったチャネル数は増えて行くようにネットワークを構築することが一般的に取られる手法であり,設計時のガイドラインとなる.
AlexNet
画像認識で高い精度を出したネットワーク. 大体6千万パラメータがある中堅クラス.
図2にネットワークを示す.
VGG-16
これまで見てきたように,hyperparameterがとても多い. hyperparameterのチューニングをほとんどしないで良いために,畳み込み層を3×3でstrideを1,sameパディングとして,マックスプーリング層のフィルタサイズを2×2でstrideを2と固定して用いるネットワークとしてVGGがある.
チャネル数も64=>128=>256=>512=>512とリーズナブルに選択されている.
図3にネットワークを示す.
1億3800万ほどのパラメータがある非常に大きなネットワークになる.
ResNets
Residual block
ResNetはResidualBlock(残差ブロック)層を用いたネットワークである. まずは残差ブロックの説明から.
残差ブロックのイメージを図4に示す.
通常のネットワークにショートカットする線を足したものを残差ブロックと呼ぶ.
これを行うと,レイヤーを深く深くして行くことができるという利点がある.
ResNetではなく通常のネットワークにおいて,レイヤーを深くして行くと,理論的にはトレーニングセットに対するエラーは単調減少するはずだが,実際には勾配消失を起こしてしまい,単調減少にならない. これが,ResNetを用いると解決でき,単調減少するようにできる.
これによって,レイヤーを深くすることで精度を高めたいという狙いを実現できる可能性が高まる.
レイヤー数とトレーニングセットに対する誤差のイメージを図5に示す.
ではなぜこんな特徴になるのか? 次の章で見て行く.
Why ResNets work
Residual blockを数学的に記載すると図6のように示せる.
ここで,勾配が仮に消失して0になっていた場合,図7のように数式が展開できる.
つまり,勾配が消失して0になってしまうという最悪の状態であっても,その層がなかった場合と変わらない予測が可能になるわけである. 最悪のケースにまでいかない場合はモデルが意味のある知見を学び,それを持ってトレーニングセットに対するエラーが減少するのである.
Networks in Networks and 1 by 1 Convolutions
フィルタサイズが1のフィルタをかける. なんの意味があるのだろうか?
inputが1チャンネルだった場合は,ただ単に定数倍するだけで,意味はない. inputがNチャンネルになった場合は,チャネルにまたがってフィルタをかけ,それらを足し合わせるという動きになる.
つまり,チャネルにまたがってニューラルネットワークのような計算をしてくれる.
さらに1×1のフィルタを複数チャネルかけることによって,inputのチャネル数を所望のチャネル数に増減させることが簡単にできる.
プーリングでは縦横のサイズを調整できるがチャネル数は調整できなかった. 1×1のフィルタは縦横のサイズは調整できないがチャネル数を調整できる方法と言える.
Inception Network Motivation
CNNのパラメータはたくさんある. フィルタサイズをどうするのか,Maxプーリングをするのか. 選ぶのが大変だ.だったら,全部やってしまえばいいじゃないかというのがInception Networkのモチベーションである.
InceptionNetworkでは,異なるフィルタをかけたものを1つのoutputにまとめる. 図10のようなイメージで動く.
これをすることで,hyperparameterの選択が不要になる. が,これは計算量が膨大になる.とてもとても大きい数になる.
これを解決するために,1×1フィルタを使った中間層(ボトルネック層と呼ぶ)を設けて計算量の削減を行う(図11).
こんなことして性能に影響は出ないのか?と不安になるが,性能には大きく影響が出ないことがわかっており,有意義な手法となっている.
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に示す.
More Edge Detection
縦方向のエッジだけでなく,フィルタの形によってはいろんなエッジを検出できる.
例えば図2のフィルタでは横方向のエッジを検出することが可能.
このように,フィルタの形によって検出できる特徴は異なる.
CNNでは,フィルタの各値をパラメータとして,画像の情報をよりよく表せるように学習を行う.
Padding
図1の例のように,畳み込みを行うと,画像が縮退する. フィルタをたくさんかけると画像がどんどんどんどん小さくなってしまう. これをコントロールするために,Paddingという技術がある. また,畳み込みを行う際に,左上のピクセルは畳み込みの計算時に1度しか活用されないが,中央のピクセルはフィルタの大きさ分だけ活用されるということもあり,画像の端っこの情報がうまく活用できていない.これもPaddingによって解決できる.
Paddingとは,畳み込みを行う前に,元の画像の淵にピクセルを埋めてしまうことを示す. 元の画像の外堀にPadding量の分だけピクセルを追加してあげる.この時,ピクセル値は0にするのが一般的.Paddingのイメージを図3に示す.
図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で表せる.
なお,畳み込み後のサイズは整数にならないケースもある.その場合は切り捨てる.
つまり,ストライドsで大きさfのフィルタをかけていき,もしもパディング量pでパディングされた画像からフィルタがはみ出す場合は計算を行わずに次に行くというようなフィルタのかけ方を行う.
Convolutions Over Volume
今までは2Dの例を見てきた. 画像を扱う際には,カラーチャネルがあるのでカラーチャネル(R/G/B)を含めた3D(縦×横×チャネル)の例を見て行く.
3Dの場合,畳み込みするフィルタも同じチャネル数が必要になる. 畳み込みは全てのチャネルについて透過的に実施され,最終的に得られるのは1チャネルの結果となる.
つまり,図5のようなイメージになる.
さらに,フィルタを複数かける例を考えると,図6のように最終的な出力も3D(たて×よこ×フィルタ数)になる.
この,フィルタ数(nC)のことを,チャネル数と呼ぶことにする.
One Layer of a Convolutional Network
CNNの1レイヤーサンプルを図7に示す.
ここで,学習対象となるパラメタの個数は,Wの総数(3×3×3)とバイアス1を足した28個になる. さらにフィルタが2個だとすると,それぞれにバイアスが必要なので,28×2の56個が総数である. これらのフィルタを画像の全ての部分に共通して使って行く.後述するが,この特徴によりCNNは比較的学習対象のパラメータが少なく,過学習を起こしにくいという特徴がある.
CNNで用いる表記を図8にまとめる.
Simple Convolutional Network Example
CNNでは,3つのレイヤーを組み合わせることができる.
- 畳み込み層
- プーリング層
- 総結合層
Pooling Layers
プーリング層では計算量を減らすことと,特徴量をロバストにすることの2つが実現できる. プーリングには最大プーリングと平均プーリングの2つがある.
最大プーリングの計算イメージを図9に示す.
このように,フィルタ範囲内の最大値を返すものが最大プーリングである. 最大値を返すフィルタなので,学習するべきパラメータを持たないという特徴がある.
平均プーリングは,その名前の通り,平均値を返す.
プーリングはチャネルごとに計算され,チャネル数方向への縮退は起こらない.
Maxプーリングは実用的に効果が確認されており,よく使われる技術である.
CNN Example
これまで見てきたものをまとめて,CNNのサンプルを図10に示す.
ここで,レイヤーの数え方には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のように,とある層は直前の全ての層の計算結果ではなく,一部の層の計算結果からのみなる.
これにより,計算コストが少なく,過学習を起こしにくいという特徴が生じる.
SCDVについて学んだ
文章を数学的に扱いやすい形に変える方法の一つであるSCDVについて学んだ。
SCDVとは
ドキュメントを数学的に扱うことのできるような形に変換する方法のひとつで、Sparse Composite Document Vectorのこと。 他の方法に比べて変換後の形が小さくて扱いやすかったり、変換後の値を文章分類などに扱った際に精度が高いといった利点がある。
アルゴリズム
3つのパートに別れる。
Word Vector Clustering
まず、あつめてきたドキュメントから、単語を抜き出して、ボキャブラリセットを作る。 このとき、ボキャブラリセットには~の単語が含まれる。
これらについて、SGNS]によるWord2Vecを行い、各単語~についての単語ベクトルを求める。ここで、ベクトルの長さをとする。
さらに、これらをガウス混合モデルを用いて、K個のクラスタに分類する。 Kをいくつにするかは任意で、SCDVのパラメータになっている。
分類した各クラスタについて、各単語モデルがクラスタに所属する確率を、全ての単語・全てのクラスタについて計算する。
Document Topic-Vector Formation
単語ベクトル~に、各単語モデルがクラスタに所属する確率を掛け合わせたものを、単語-クラスタベクトルと呼ぶ。
単語-クラスタベクトルを、すべてのクラスタ(k=1...K)について並べた行列を考える。
]
これに、という値(ドキュメント内部で単語がどれだけ珍しいかを表す数値)を掛け合わせたものを単語-トピックモデルと呼ぶ。
]× IFD(w_i)
なお、はの行列である(長さのベクトルを個横に並べて、実数を掛け算しただけなので)。
このを、特定のドキュメントに出てくる単語の分だけ足し合わせた値を文章ベクトルと呼ぶ
Sparse Document Vecotrs
得られたをスパース(ほとんどの要素が0で、残り数少ない要素のみが値を持つ状態)にするために、閾値を下回る要素については0に値を変換する。
こうして得られたものを、SCDVによる文章ベクトルとよぶ。
さいごに
このベクトルを用いて、文章分類などを行うと、他の方法に比べて精度がよい。
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のアプローチではそれができない. データ量が十分にあれば手作りの特徴量は不要になるので問題ないが,データ量が得られないとこれが問題になる.
データ量はかなり大事な要素である.