ありまっくすのへっぽこ日記

アラフォーでへっぽこエンジニアをしております。へっぽこなりに頑張っています。

DeepLearning講座(第5回)を受けてきたよ

6/8にDeepLearning講座の第5回目を受けてきました。この講座も折り返し地点。ちゃんとアウトプットして身につけようと思います。

ResNetのおさらい

ResNetはCNNにショートカットをつけたもの。でこれにより、性能を大きく向上させtました。今やCNNといえばResNet。

f:id:ari_max:20180520205928p:plain

ResNet

ResNetの何がすごいのか

CNNは層数を多くすれば多くするほど良いと言われていますが、層を大きくしてしまうと勾配消失したり、特徴が後ろの層まで伝わってくれなかったりして、性能が悪化してしまいます。例えていうなら、大人数の伝言ゲームをしたときに、最初と話が全く変わってしまったような感じです。

それを回避するために、ショートカットをつけて「変えて欲しくないから処理をしない」ということをしています。多層のネットワークになると、最後の方は何もすることがなくなってしまうので、「何もすることがないときには何もしない」ということをするわけです。

ショートカットがない場合は、重みを掛けています。少しでも変化がある場合は重みを少なくすればいいのですが、変化が無い場合の処理(恒等写像)が難しいのです。(単純に0を掛けてしまうとおかしなことになってしまいます。)

ResNetでは「入力と本来の出力の差(残差)」を学習しているのです。

LSTMのおさらい

時系列処理では、過去のデータが現在の状態に影響を与えています。RNNでも時系列処理ができるのですが、「過去の情報のなかで忘れたくないものを覚えておく」ということが難しいので、LSTMを使うのが一般的です。

 

LSTMのフローは以下の通りです。

  1. 忘却ゲートで、メモリセルから不要な情報を消去する
  2. 入力ゲートで、必要な情報をメモリセルへ入力する
  3. 出力ゲートで、必要な情報をメモリセルから出力する 

図解すると、以下のようになります。

  • ht-1→再帰入力(前の時刻の出力)
  • Xt→入力値
  • Ct-1→前のメモリセル
  • Y→出力値
  • ht→次の再帰入力
  • σ→活性化関数(sigmoid)

f:id:ari_max:20180619194630p:plain

LSTM

 

TensorFlowを使ってLSTMの実装を行いました。LSTM用の便利なライブラリもあるけれど、勉強のためにあえてスクラッチで実装しました。

忘却ゲート

入力値と再帰入力(前の時間の出力)に活性化関数(σ:Sigmoid)をかけたものとメモリセルにあるものを掛け合わせて、メモリセルの中身を忘却させているので、このような式になります。

 忘却ゲート = 活性化関数 × ( 入力値 × 入力値の重み  + 再帰入力 ×再帰入力の重み  + バイアス)

忘却ゲートを通過した後のメモリセルは以下のようになります。

メモリセル × 忘却ゲート

入力ゲート

入力ゲートでは、入力値と再帰入力へ活性化関数をかけたもの(下の図の①)と入力値と再帰入力へtanhをかけたもの(下の図の②)を掛け合わせてメモリセルに足しています。

f:id:ari_max:20180622162923p:plain

入力ゲート = (活性化関数 × ( 入力値 × 入力値の重み  + 再帰入力 ×再帰入力の重み  + バイアス))× (tanh × ( 入力値 × 入力値の重み  + 再帰入力 ×再帰入力の重み  + バイアス))

 メモリセル = 入力ゲート+ メモリセル(忘却ゲート通過後)

出力ゲート

出力ゲートでは、入力値と再帰入力へ活性化関数をかけたもの(下の図の①)とメモリセルへtanhをかけたもの(下の図の②)を掛け合わせて出力を行なっています。

 

f:id:ari_max:20180622163302p:plain

出力ゲート = (活性化関数 × ( 入力値 × 入力値の重み  + 再帰入力 ×再帰入力の重み  + バイアス))× (tanh × ( 入力値 × 入力値の重み  + 再帰入力 ×再帰入力の重み  + バイアス))

出力値 = 出力ゲート×メモリセル(入力ゲート通過後)

ライブラリ使うと、簡単なんですけどね・・・。

GAN

 GANとは、Generative Adversarial Networkの略で画像生成でブレークスルーを達成した仕組みです。とても難しい(そのわりにうまくいかない)ので、あまり深くは触れないとのことです。

GeneratorとDiscriminatorがあり、学習した画像を元にGeneratorで生成した画像をDiscriminatorが「生成した画像かどうか判断する」という処理を繰り返して精度を上げていきます。

つまりGeneratorはDiscriminatorに「作り物であることがバレないような画像」を生成し、Discriminatorは「本物に近い作り物の画像を見抜く」ということをしているわけです。