DeepLearning講座(第5回)を受けてきたよ
6/8にDeepLearning講座の第5回目を受けてきました。この講座も折り返し地点。ちゃんとアウトプットして身につけようと思います。
ResNetのおさらい
ResNetはCNNにショートカットをつけたもの。でこれにより、性能を大きく向上させtました。今やCNNといえばResNet。
ResNetの何がすごいのか
CNNは層数を多くすれば多くするほど良いと言われていますが、層を大きくしてしまうと勾配消失したり、特徴が後ろの層まで伝わってくれなかったりして、性能が悪化してしまいます。例えていうなら、大人数の伝言ゲームをしたときに、最初と話が全く変わってしまったような感じです。
それを回避するために、ショートカットをつけて「変えて欲しくないから処理をしない」ということをしています。多層のネットワークになると、最後の方は何もすることがなくなってしまうので、「何もすることがないときには何もしない」ということをするわけです。
ショートカットがない場合は、重みを掛けています。少しでも変化がある場合は重みを少なくすればいいのですが、変化が無い場合の処理(恒等写像)が難しいのです。(単純に0を掛けてしまうとおかしなことになってしまいます。)
ResNetでは「入力と本来の出力の差(残差)」を学習しているのです。
LSTMのおさらい
時系列処理では、過去のデータが現在の状態に影響を与えています。RNNでも時系列処理ができるのですが、「過去の情報のなかで忘れたくないものを覚えておく」ということが難しいので、LSTMを使うのが一般的です。
LSTMのフローは以下の通りです。
- 忘却ゲートで、メモリセルから不要な情報を消去する
- 入力ゲートで、必要な情報をメモリセルへ入力する
- 出力ゲートで、必要な情報をメモリセルから出力する
図解すると、以下のようになります。
TensorFlowを使ってLSTMの実装を行いました。LSTM用の便利なライブラリもあるけれど、勉強のためにあえてスクラッチで実装しました。
忘却ゲート
入力値と再帰入力(前の時間の出力)に活性化関数(σ:Sigmoid)をかけたものとメモリセルにあるものを掛け合わせて、メモリセルの中身を忘却させているので、このような式になります。
忘却ゲート = 活性化関数 × ( 入力値 × 入力値の重み + 再帰入力 ×再帰入力の重み + バイアス)
忘却ゲートを通過した後のメモリセルは以下のようになります。
メモリセル × 忘却ゲート
入力ゲート
入力ゲートでは、入力値と再帰入力へ活性化関数をかけたもの(下の図の①)と入力値と再帰入力へtanhをかけたもの(下の図の②)を掛け合わせてメモリセルに足しています。
入力ゲート = (活性化関数 × ( 入力値 × 入力値の重み + 再帰入力 ×再帰入力の重み + バイアス))× (tanh × ( 入力値 × 入力値の重み + 再帰入力 ×再帰入力の重み + バイアス))
メモリセル = 入力ゲート+ メモリセル(忘却ゲート通過後)
出力ゲート
出力ゲートでは、入力値と再帰入力へ活性化関数をかけたもの(下の図の①)とメモリセルへtanhをかけたもの(下の図の②)を掛け合わせて出力を行なっています。
出力ゲート = (活性化関数 × ( 入力値 × 入力値の重み + 再帰入力 ×再帰入力の重み + バイアス))× (tanh × ( 入力値 × 入力値の重み + 再帰入力 ×再帰入力の重み + バイアス))
出力値 = 出力ゲート×メモリセル(入力ゲート通過後)
ライブラリ使うと、簡単なんですけどね・・・。
GAN
GANとは、Generative Adversarial Networkの略で画像生成でブレークスルーを達成した仕組みです。とても難しい(そのわりにうまくいかない)ので、あまり深くは触れないとのことです。
GeneratorとDiscriminatorがあり、学習した画像を元にGeneratorで生成した画像をDiscriminatorが「生成した画像かどうか判断する」という処理を繰り返して精度を上げていきます。
つまりGeneratorはDiscriminatorに「作り物であることがバレないような画像」を生成し、Discriminatorは「本物に近い作り物の画像を見抜く」ということをしているわけです。