最近何やらSONYさんのNeural Network Consoleのyoutube動画が充実してると耳にしました(目にした?)。
youtubeチャンネルはこちら。
今回はDNNの復習も兼ねて視聴してみたので、そのメモです。
tl; dr;
- 百聞は一見に如かず、動画見ましょう。
Deep Learning入門
再生リストはこちらです。
今Deep Learningに取り組むべき理由
こちらはDeep Learningの歴史に始まり、どのようなところに応用できるかについて紹介されます。 DeepLearning は画像認識コンテストで注目され始め、現在では音声認識への応用、AlphaGoによる囲碁でのプロ棋士への勝利など、広範な領域で展開されていることがわかります。 高い精度で認識できる一方、今までの認識器をつくるプロセスと比較して、Deep Learningの開発プロセスが大きく異なり非常に簡単であり、専門でない技術者でも簡単に実装できます。
Deep Learningとは?
こちらでは、基本的なニューラルネットワークについての解説が行われています。
人工ニューロンは人間の神経細胞の構造を元にモデル化されています。 そして、この人工ニューロンの組み合わせによってニューラルネットワークが構成されています。
ニューラルネットワークには入力層、中間層、出力層がありこれらの間を電気信号が流れるようにデータのやり取りが行われます。 この処理を通じて、はじめネットワークの重みは乱数で与えるものの、「学習」というプロセスによって、事前に与えられた答えが出せるようにネットワークの重みをシステムが自動で調整していきます。
※ここでは学習にバックプロパゲーションについては詳しく触れません
Deep Learningでできること
ニューラルネットは画像だけではなく、自然言語処理、音声、ロボット制御などさまざまな範囲に応用されています。 画像についても、物体認識、Semantic Segmentation、画像変換と幅広く認識器をつくることができます。
機械翻訳にもニューラルネットワークが使われており、使用されるデータが画像から単語列になっています。これによって翻訳やチャットボットが実現されています。
画像や言語以外にもデータとしてベクトルがあれば使用できるため、不動産価値算定やジェスチャ認識、異常検知、ロボット制御にも利用できます。 要するに、ディープラーニングはいろんなことに活用できる汎用な技術です。
ニューラルネットワーク設計の基礎
ニューラルネットワークの層の考え方について紹介されています。 全結合層であるAffine層、Tanh層(活性化関数)が組み合わさって一つの人工ニューロンが構成されています。 活性化関数には現在では様々なものが登場しています。 最後にSoftMax層で出力の和を1に揃えたりします。
現在ではAffine層だけではなく畳み込み(Convolution)層が使われることが多いです。 Convolution層によって、画像の小さな区画に対する計算を画像全体にスライドして計算していく計算になります。 また、ダウンサンプリングとしてMax Poolingについても紹介されています。
最後の層は、Sigmoid関数、Softmax関数など、使用する関数を使い分けることで解きたい問題に合わせていきます。 また同様に最後の関数についても、LossもBinaryCrossEntropy、 SquaredErrorなど、こちらも使い分けます。
層数、ニューロン数を決める指針
中間層は解く問題に応じて都度設計するものです。 基本的には層が多いと精度は上がりますが、一方でリソースを大量に使うため、そことトレードオフになります。
ただ、セオリーは存在するのでそれに則って設計していくと、当てずっぽうにならずに済みます。 Resnet152の例を見ると、はじめ非常に大きなニューロンの数を使用し、ダウンサンプリングによって徐々にニューロンの数を減らしていきます。 このとき、画像の数を増やすことで、計算量を急激に減らさないように注意します。 この、逆三角形の計算量の分布を意識して設計していくと無駄なく設計を進められます。
ニューラルネットワークの多層化テクニック
ニューラルネットの層を増加させると学習の収束に時間がかかる、誤差が下がらない、という問題があります。 このような問題に大して、いくつかテクニックが提案されています。
まずはReLUを使うことがあります。tanh、sigmoidは学習が収束しにくいことがわかっているのでReLUが使われます。(多数応用あり)
バッチノーマライゼーションは、convolutionのあとに平均0、分散1に正規化する処理になります。これを行うことで、学習が安定することが知られています。
ResNetは、Skipコネクションを導入することで何も処理していない一部のデータを出力層に伝播し、加算します。これによって安定することも知られています。
ニューラルネットワーク学習の仕組み
ニューラルネットワークの学習は、システムとしてはネットワークの重みを表す変数を更新することを意味しています。 ミニバッチ勾配降下法によって、学習が行われます。 まずは、入力信号を出力し、答案と比較します。 このときの正解との差分(Loss)を算出します。 次に、Lossのネットワークの重みに対する比重を計算(微分)し、この量をネットワークにLossが小さくなるように加算していきます。 これを何度も繰り返して、ネットワークの重みを更新し、学習を実現しています。
動画では、ネットワークの更新量の計算方法であるバックプロパゲーションについても解説されています。
Recurrent Neural Networksとは?
通常のニューラルネットワークはフィードフォワードネットワークで、RNNはこれにループ(Recurrent)が加わるようになります。 この構造によってRNNは、入力データの並びを反映させることができます。 過去の文字の並びの情報を、次の文字を予測できたりします。 RNNでは、バックプロパゲーションは時間方向にも伝播していきます。
RNNは分類として、入力/出力が1 or manyかで分類できます。 これによって、音声認識や機械翻訳、映像認識などに使用されます。
Generative Adversarial Networks (GAN)とは?
画像生成に使用されるGANもニューラルネットワークの応用です。 画像認識とは逆に、数字を入力してその画像を生成するような場合に使用されます。
GANではGenerator(フェイク画像を作る)とDiscriminator(本物と偽物を見分ける)を対抗させることで学習します。 Generatorが生成した画像をDiscriminatorに入力、DiscriminatorでLossを計算し、その勾配をGeneratorまで伝播されるので、お互い学習が可能となっています。 これによって、画像だけを用意すればよく、あとは勝手にGenerator、Discriminatorが学習していきます。
Generatorは通常のCNNとは逆向きの流れになりますので、アップサンプリングが必要になります。 DiscriminatorはCNNと同様に、最後は2値分類によって正誤判定を行うようになります。
数式なしで理解するLSTM (Long short-term memory)
LSTM (Long short-term memory)はRNNの一種です。 RNNは時間方向にRecurrentの構造を持つことで、過去の情報を考慮したネットワークを構成することができました。 Delay層によってRecurrentを実現します。
通常のRNNでは長期の記憶の保持が難しく、これをLSTMでは解決します。 LSTMでは、毎時刻更新を行うDelay以外にも単純に加算するCell Stateがあり、長期記憶が可能になっています。
また、LSTMにはインプットゲートが用意されます。 これによって、Affine層に入力するかどうかを振り分けます。 逆に出力のコントロールにアウトプットゲートも用意されます。 これによって、LSTM自体の出力と一緒に、次の時刻に有用そうなデータをそのまま引き継ぐ役割を担います。 更に、フォーゲットゲートもあります。 これによって、長期記憶をずっと保持し続けるのではなく、破棄する機能を持ちます。 これらを組み合わせることで、安定して学習が可能になります。
Transfer Learning(転移学習)
転移学習は、すでに構築済みのモデルを使用して、別の問題を解くモデルに再利用することです。 一般的にデータが少ない場合には性能が出にくいため、このような技術を使うことで、少ないデータでも精度の向上が期待されます。
ニューラルネットワークでは、学習済みのネットワークの前半を使用し、後半を新しく作り変えることで実現します。 最終層だけの学習、あるいは全体含めて学習するfine tuningなどによって学習ができます。 転移学習では、データの類似性・関連性が精度向上のポイントになり、転移元のデータの質が転移先のモデルに大いに影響を与えることになります。
量子化によるニューラルネットワークのコンパクト化
DNNの高速化手法として量子化が行われることがあります。 ニューラルネットワークの計算には一般的には計算量が多くなるので、時間的・リソース的に使用が難しい状況があります。 これを回路規模を小さくできるとエッジデバイスで使用できたり、規模の大きなDNNを手元のPCで動かせたりして嬉しいことがあります。
そこでクオンタイズ(量子化)を行うことで、計算量を小さくすることができます。 浮動小数点演算ではなく整数演算で行うなどで、演算器が小さく済むので回路規模が小さくなったりします。
ビット数を単純に小さくすると、誤差が大きくなりすぎることがあります。 そこで、学習時に活性化関数に階段状の活性化関数を使用するなどして、学習時から量子化が可能になります。 ただし、階段状の活性化関数では、微分ができないので、ストレートスルーエスティメータを代用することで、微分計算を近似します。
その他、計算をコンパクトにする方法として、枝刈り、2値化ネットワーク、などのテクニックも提案されています。
感想
SONYさんに媚を売るわけではないですが、非常にわかりやすかったです。 びっくりしたのは、RNNやGAN、量子化まで動画になっていて、日本語の書籍でもここまで解説されているのなかなかないので、日本語でこれらを簡単に学ぶには非常に有用かと思います。 逆に、専門家になろうという方には、ちょっと簡単すぎるのでご注意ください。
個人的に英語が苦手、とくにヒアリングは結構苦手なので、日本語で体系的に教材が提供されているのはありがたい限りです。 文系で数学が苦手という方でも難しい数式はそれほど出てきませんので、わかりやすく仕組みを体系的に知りたい方には非常に良いと思います。 非常に勉強になりました。