Natural Language Processing & Word Embeddings
Introduction to Word Embeddings
CouseraのDeepLearningのコースの学習メモ. 今回は言語処理のためのモデルについて.
Word Representaion
Word Embeddingの方法は色々ある. 前週ではOne-hotなベクトル表現をみてきた.
One-hotな表現は,シンプルだが,有用性は低い.
例えば'I want a glass of orange juice.'というセンテンスを学習した上で,'I want a glass of apple ?.'の?を予測したい.
orangeとappleは似たような概念であり,文脈からもjuiceがきて欲しいが,単なるone-hotな表現ではorangeとappleが似た概念であることを表現できないため,難しい.
これを改良して,図1のように,特徴群に対する当てはまり度合いのようなものを定義してそのベクトルを扱うようにすると,似た者は似たようなベクトルになり,似ている概念を扱うことができるようになる.
特徴は高次元であり,可視化に向かないが,2次元(もしくは3次元)に圧縮できる技術であるt-SNEを活用して可視化すると,図2のように似た者が近くに集まるようになる.
Using word embeddings
どのように学習するかは後ほど学ぶが,Word Embeddingを活用する際には,転移学習の考え方が使える.
すでに大量のデータで学習された各単語のベクトル群がネット上にたくさんあるので,それを使って単語をベクトルにして,所望のタスクを解くといった方法が有用である.
Properties of word embeddings
One-hotな表現ではなく,前述のような表現方法を使うと,単語のアナロジーを解くことができる. どういうことかというと「Man->Womanの時,King->?」の?を予測することができる. 今,いくつかの特徴でベクトル化した各単語が図3のように与えられたとする.
この時,[tex: e{man} - e{woman}]を求めると]となる. これが左辺の関係性となる.
[tex: e{king}-e{?}]がこれと等しくなるものを求めると,が一番確からしいことがわかる.
このようにしてアナロジーを解くことができるわけである.
定式化すると,図4で表せる.
ここでは色々な種類があるが,コサイン距離やユークリッド距離が用いられる.
コサイン距離は図5のような値である.
Embedding matrix
ボキャブラリーVに含まれる単語全てを,特徴次元Dでベクトル化したセットをEmbedding matrix(E)と呼ぶ(図6).
Embedding matrixに単語αのOne-hotベクトルをかけると,単語αに対応するベクトルを取り出すことができる.
Learning Word Embeddings:Word2vec & GloVe
Learning word embeddings
Embedding matrixの学習の方法について.
いろんなアルゴリズムがあるが,近年はかなりこれがシンプルになってきている. シンプルすぎて,なぜそれがうまく動作するのかが直感的にわかりにくかったりもするので,まずはある程度の複雑さのあるアルゴリズムから始めて,よりシンプルなアルゴリズムでもうまく行くことを説明する.
(若干奇妙に思えるかもしれないが)Ebmedding matrixを学習するために,「単語を予測するタスク」を考える.
"I want a glass of orange ?."の?を予測する.
適当に初期化されたEを用いて図7のようなニューラルネットを構築する.
出力層はボキャブラリー数分のsoftmaxになっており,?が正解データであるjuiceになるように , , , , を学習して更新する.
大量のテキストデータに対して同様の学習を行うことで,所望のEを得ることができるわけである.
ここで,予測したい位置(?の位置)に対して,入力とする部分のことをContextと呼ぶ.図7の例では,Contextは文全てだった.
このContextを,直近4単語とか,前後の4単語,直近1単語や,直近ではなくとも近くにある1単語とするようなスタイルがある.
最後の,直近ではなくとも近くにある1単語とする手法が,Skip-gramと呼ばれるものであり,次章で説明する.
Word2Vec
skip-gram
まず,skip-gramのタスクを説明する. skip-gramは,Contextからtargetを求めるタスクである.
教師データとして'I want a glass of orange juice to go along with my cereal.'というセンテンスが得られたとする.
まず,教師データからランダムにContextを1つピックアップする(例えばorangeとしよう).
次に,targetを選ぶが,targetはcontextから見て,N単語以内にある単語のうちの1つである.
このcontextとtargetを1組として扱い,contextの単語が得られた際にtargetの単語を推定するタスクがskip-gramである.
Model
モデルを図8に示す.
contextの単語ベクトルをsoftmaxして,出てきた結果のなかでtargetとして出てきてほしい部分の値が大きくなるように学習する. この時,softmax関数は図9のように表せる.
図9の通り,分母でボキャブラリー数だけ足し算する必要があり,計算コストがかなり高いという問題がある.これを解決するために次の賞ではNegative Samplingを説明する.
Negative Sampling
Negative Samplingでは,contextの単語と,wordが1つ与えられて,さらにwordがtargetかどうかを表すフラグが与えられる.
これら3つの情報をもとに学習を行う.
例えば,教師データとして'I want a glass of orange juice to go along with my cereal.'が与えられたとする.Contextとして適当に単語が選ばれる(orangeとする). この時,targetとして,contextに近い中からランダムに1つをピックアップする(juiceとする). これらを1ペアとして[context:orange, word:juice, isTarget:True]として扱う.
さらに,isTarget:Falseのデータを作り出す. Falseのデータは,contextは固定にして,ボキャブラリーの中から適当にピックアップする.例えばsmallがピックアップされれば[context:orange, word:small, isaTarget:False]となる. ランダムにピックアップすると例えば,教師データに含まれる単語が選ばれるケース(例えばglassとする)もある. この場合での気にせずにFlaseのサンプルとして扱う.
さらにcontextを変えて教師データ群を作り出す.
これらのデータを使って,図10のモデルを学習する.
この時,ボキャブラリーから適当に作成されるFalseのデータは,contextのデータ1つに対して,教師データが十分に多ければ2~5個,少なければ5~20個程度にする.
Flaseのサンプルを適当に作って教師データとして学習を進めるのでNegative samplingと呼ぶ.
ボキャブラリー分のロジスティック回帰を計算することになるが,ボキャブラリー分のデータを使って毎回softmaxを計算するよりははるかに計算コストが低い.
GloVe word vectors
あまり多くは使われないがGloVeという手法もある. Global vectors for word representationの略.
(単語iがコンテキストjのもとで出てきた回数)を考えるモデル.
図11を最小化するように学習を行う.
この時の[tex: \theta{i}, e{j}]はシンメトリックな値であり同様の働きをする. なので,GloVeを行う際には,まず,それぞれをランダムに初期化し,学習を進めて最終的に[tex: e{w} = (e{w} + \theta_{w})/2]として平均値を用いる必要がある.
Applications using Word Embeggings
Word embeddingsを活用する例を紹介する.
Sentiment Classification
テキストからお気に入り度合いを5段階で分析するタスク.星の数を推測するようなもの. Word Embeddingを使うと,教師データが少なくても良い結果が得られる.
"The desert is excellent"で星4つの教師データが得られたとする. この時,図12のようにモデルを構築し,学習することができる.
なお,ここで,Eは大量のコーパスで学習されたwordEmbeddingである.
各単語ベクトルを平均して扱う方法であり,これは単語の出現順序を考慮しないことによる問題がある. "Completely lacking in good taste, good service and good ambience."という酷評であっても,平均すると"good"が多いので,かなりポジティブに解釈されてしまう.
これを防ぐためにRNNのモデルを使った方法がある(図13).
このようなモデルによって,かなり良い精度で星の数を推定することが可能になる.
Debiasing word embeddings
Embedding matrixは,当たり前だが,その学習に使ったコーパスのバイアスに含まれるバイアスを持ったまま学習される. 現状の様々な理由によって例えば"Engineer"という単語は"woman"よりも"man"に近いように学習されがち.
このような望まれないバイアスを是正する仕組みについて解説されている.
Recurrent Neural Networks
CouseraのDeepLearningのコースの講義メモ. 今週からSequence Modelsということで時系列データを扱う. 文章なんかもSequence Modelで扱う.
Why sequence models
RNNなどの時系列データを扱うためのモデルについて勉強する. 音声認識や楽曲生成,感情分析なんかがseruence modelのタスクとなる.
Notation
表記法について.
入力xとしてセンテンスを想定する. 入力x:「Harry Potter and Hermione Granger invented a new spell.」という感じのセンテンス.
この時,入力の要素をそれぞれと表す.一番後ろの要素は入力系列の長さを使ってと表す.
出力が例えば各単語が人名であるか?のフラグだとすると 出力:「1 1 0 1 1 0 0 0 0」と表せる. これをと表す.
ニューラルネットに入力を入れる際に,Harryという文字列はそのまま扱うことができないので,ベクトルに変換する必要がある. このための方法はいろいろある.
例えば,ボキャブラリーVを次のように考える.
]の転置
このボキャブラリーは入力の各要素が取りうる単語をひとまとめにしたベクトルであり,1番目が[a],4075番目にHarry,6023番目にPotter,100000番目にzooがくるとする.
この時,は次のようになる.
]
ここで,4075番目の要素が1であり,ほかの要素は0である. これは1番目の入力要素であるHarryがVocの中で4075番目だからである.
同様に,2番目の入力であるPotterはVocの中で6023番目なので,6023番目が1で他は0のベクトルになる.
Recurrent Neural Network Model
なぜ通常のニューラルネットが使えないのか
これまでのネットワークではInputとOutputのサイズが一定であることが前提だった.これが,センテンスや音声を入力とすると可変長になるため,これまでの仕組みでは扱えない.
さらに,とある箇所で学習した内容を他の箇所に使い回すことができないという問題もある.文の先頭にHarryがきていたら人名として認識されるのであれば,文の途中にHarryがきた場合でも同様に認識してほしいが,普通のニューラルネットワークではこれはできない(CNNであればこれは可能だが).
RNN
RNNのアーキテクチャを図1に示す.
ここで,縦長の箇所がニューラルネットワークであり,重みを共有した同じネットワークを常に使用する.
ここでポイントになるのが,の予測にだけでなくも使うことが大きな特徴である.
これによって現在より昔のデータを加味した推定を行うことができるようになる.
順伝播の計算式を図2に示す.
これを簡略化し,図3となる.
Backpropagation through time
各重みの学習はこれまで同様に誤差逆伝播で行う.
誤差は図4で表される.
この誤差を,逆伝搬するので,図5のようなイメージになる. 赤字が逆伝搬を示している.最終的な誤差から,逆方向に伝搬していく様子がわかる.
Different types of RNNs
これまでは入力と出力の要素数が等しい例をみてきた. これをMany-to-manyのパターンと呼ぶ.
他にも,Many-to-oneのパターンやOne-to-manyのパターン,Many-to-manyのパターンの亜種がある(図6).
Many-to-many Tx=Tyのパターン.単語の人名判定などに使われる.
Many-to-one Ty=1のパターン.センテンスから感情を分析したりするなどに使われる.
One-to-many Tx=1もしくは0のパターン.楽譜の自動生成とかに使われる.
Many-to-manyの亜種 Tx!=Tyだがそれぞれが1ではないようなパターン.言語の翻訳とかに使われる.
Language model and sequence generation
言語モデルとは
音声認識のタスクにおいて「The apple and pear salad.」という発話が会った時,①「The apple and pear salad.」なのか,②「The apple and pair salad.」なのか,音声からだと判断が難しい.
この時,言語の特性上①である確率が②である確率より高いので,①を採用すべきだということをやるために,確率P(センテンス)を求めることができるモデルを言語モデルという.
対象とする言語の大量のコーパスを用いてモデルを学習させる.
RNNを用いる
確率P(センテンス)はで求められる.
Many-to-manyモデルで,各値が求まるモデルを考える(図7).
P(Harry Potter and Hermione Granger invented a new spell.)を求める.
ここで,は,全てのボキャブラリに対して,センテンスが各単語で始まる確率をとなる.の単語「I」に相当する部分は他のものに比べて高い確率を示すだろう.「Harry」に相当する部分は逆にそんなに大きくはないかもしれない.
次に,Harryとして,Harryが与えられた時のボキャブラリVの各単語の確率を求める. これを最後まで繰り返すことで,各単語の出現確率が求まり,それらを掛け合わせることでP(センテンス)が求まるわけである.
Sampling novel sequences
学習した言語モデルを使って,センテンスの生成ができる.
学習したRNNから得られたの確率分布に従って,1単語を選び出す. その単語をとして入力し,を得る.さらにそこからに従って単語を選び出してに入力していく.ピックアプした結果が文の終端文字であるところまで進めると,最終的にセンテンスを生成できるわけである(図8).
Vanishing gradients with RNNs
RNNは系列が増えるに従ってどんどん深いネットワークになっていくので,勾配消失問題と勾配爆発問題が起きる. 勾配爆発の方は,勾配が閾値を超えたら調整するGradientClippingという技術を使うことでなんとかなるが,消失問題はそうもいかない.
これが起きると,RNNにおいては,時系列的に離れた情報は影響を及ぼしにくいという状態が起こる.
例えば「The cat which .... was full.」という文章の動詞部分は主語のcatが単数か複数かで異なる.主語が複数であれば「The cats which ... were full.」となるべきである.
これが,勾配消失問題により,離れた情報は影響を及ぼしにくいため,解決できない.
Gated Recurrent Unit
勾配消失問題を解決するためのRNNのシリーズとしてGated Recurrent Unit(GRU)とLong Short Term Memory(LSTM)がある. まずGRUについて説明する.
通常のRNNを細かく図示すると図9のようなイメージになる.
GRUとLSTMでは,メモリーセルcというものを考える. GRUではメモリーセルである.
GRUの単純化したモデルについてまずは説明する.
メモリセルを導入した順伝搬を図10に示す.
ここで,Γはゲート関数と呼ばれる.
ゲート関数が1であれば となる. ゲート関数が0であれば となり,メモリセルは更新されない. つまり,ゲート関数がメモリーセルに格納されている過去の情報を更新するか,保持するかを制御するような動きになる.
言い換えると,ゲート関数が0であれば記憶を保持し,1であれば過去の情報は忘れて新たな情報を記憶し直すということになる.
ここで,単純化したGRUのイメージを図11に示す.
「The cat which .... was full.」の例で言うならば,catの時点でゲート関数が1になり現在の情報を記憶して,主語が単数形であったことを記憶し続ける.wasの直前まで主語についての記憶があるので,間違いなくwas(wereではなく)を予測できるわけである.
これはあくまで単純化したもので,実際にの順伝搬は図12のようになる. ゲート関数が1つ増えている.
たくさんの研究者が試した結果,ゲート関数をもう一つ増やしたほうが精度が高かったため,こんな形に落ち着いた.
Long Short Term Memory
LSTMという手法の紹介. GRUとLSTMでどっち使うべき?というのは一概には言えない. LSTMの方が良いケースが歴史的には多いようだ.
なので,まずはLSTMを使ってみることがオススメ.ただ,GRUの方がシンプルではあるので,学習しやすいという利点がある.それによってより深い構造を取ることができたりもする.
LSTMの順伝搬を図13に示す.
この場合のイメージを図14に示す.
ΓuをupdateGate,ΓfをforgetGate,ΓoをoutputGateと呼ぶ.
Bidirectional RNN
これまでの枠組みでは,「過去のデータ」のみに依存していた. センテンス「He said, "Teddy bears are on sale!"」と「He said, "Teddy Roosevelt was a great President!"」の人名判断をしようとした時,過去のデータのみなので「He said」に従って「Teddy」を判定しなくてはいけない.これは不可能である.
なので,図15のような未来の情報にも依存するようなRNNも考案されている.
この時,順伝搬は図16のように表せる.これをBidirectionalなネットワークと呼ぶ.
これは通常のRNNの例だが,LSTMやGRUでも同様にBidirectionalなネットワークにできる.
Deep RNNs
これまで単層のRNNをみてきた. これらを縦に並べてDeepなネットワークを構築することが可能.
RNNやLSTMやGRUやBindirectionalRNNでも同様に積み重ねることができる. BindirectionalRNNは計算コストが高いのであまり深いのはみないが,可能は可能である.
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のように,とある層は直前の全ての層の計算結果ではなく,一部の層の計算結果からのみなる.
これにより,計算コストが少なく,過学習を起こしにくいという特徴が生じる.