Narrow Artificial Intelligence – nibuiroフラグメント β

Category Narrow Artificial Intelligence

機械学習とAGIと漁夫の利

18Mar2019: きっとテンション高かったのですよ、えぇ。


Google, Facebook, MIT は果たして、AGIを実現しうるでしょうか。


AGIへの礎の様な匂いを醸し出す論文

Date Organization Title
15 Oct 2014 (v1) Facebook AI Research Memory Networks
6 Nov 2016 (v1) DeepMind Learning to Perform Physics Experiments via Deep Reinforcement Learning
2 Dec 2016 (v1) DeepMind Overcoming catastrophic forgetting in neural networks
20 Mar 2017 OpenAI Domain Randomization for Transferring Deep Neural Networks from Simulation to the Real World
21 Mar 2017 (v1) OpenAI One-Shot Imitation Learning
5 Jun 2017 DeepMind A simple neural network module for relational reasoning
22 Jun 2018 (v1) MIT Dense Object Nets: Learning Dense Visual Object Descriptors By and For Robotic Manipulation
12 Sep 2018 DeepMind Multi-task Deep Reinforcement Learning with PopArt
6 Nov 2018 OpenAI Concept Learning with Energy-Based Models
16 Nov 2018 (v1) Google AI Grasp2Vec: Learning Object Representations from Self-Supervised Grasping](https://arxiv.org/abs/1811.06964)

 安直に機械学習陣営の狙いを考え「行動主義かよ( ´∀` )」と思ってしまったものです。ですが、Googleともあろう企業とその陣営の方針がそんな訳ないでしょう。企業であるからして売り物として使えるものを研究開発することが第一目標である筈です。その過程で、彼らは恐らく「数学によって記述可能な事象」を開拓しているのではないかと思えます。そうしておけば来るべき思考の「原理」が解かれた時、それらの記述知識は間違いなく役に立つでしょう。つまり彼らは現在、前提としてヒトの思考原理は不可侵領域であるとして虎視眈々とそれが解かれるときに備えているのでは、と考えます(笑)。陰謀論乙、ですね。

 成果を求められているのですよ、彼らは。
 ニュース読むより論文漁るほうがいい夢見れますよっ。

2018 深層学習系deポイント高い寄せ集め

2018年終わりですね~.
 一年通してDNNによる音声合成開発の成果が多く発表された年ではないですか?音楽系で言えば, UNetによる音源分離でしたり, Transformerによるピアノソロ生成でしたり, 精度上がりましたよね~.
 分野開拓?的にはGraphConvの研究が進んでいます. そして, 応用による化学分野への適用. 世界は加速しイイ感じに加速していますね♪
 あとはー, 情報, チュートリアルが随分と豊富になっていますねー. んでんで, ソフトウェアへの組み込み, エッジコンピューティングへの適用なども進んでいますよねー. TensorFlow Lite for Microcontrollersとか(極端).

 読者層はCVPRとかACLとか完全読破する実力も気力も時間もないけどそれとなく最新研究とか良い資料とか知っておきたいな. という中間層.というか私がそんなモンかなー, なんて.

 それではいってみよー.


NLP

 いやー, 「同時に6紙がSOTAを報告!?!?」 – @_Ryobot とか. 荒れていた?ようですね.にしても, りょぼっとさんの絵は可愛い.
 というかpiqcyさんの記事が高品質.


GAN

まとめのまとめになっていますね…^^;
下記の他にもオモロイのありますんけど.

  • テキストから画像を生成するGANまとめ
  • GoodfellowさんのGANのオススメ論文10選まとめ (2018/02)
  • InfoGAN
    GANの生成べクトルに任意の特徴を表現する隠れ符号を埋め込み生成される画像に任意の特徴が含まれるように制御するというもの.
  • Photo Wake-Up
    たった1枚の写真から3Dモデルを生成する。ヒト型であればある程度崩れていても可。ワシントン大学の研究チームが開発。

  • Twitter

    • BigGANがImageNetの画像生成に成功〜!!チャネル数とバッチサイズを上げるのが重要で,直交正則化をジェネレータに適用し,zのサンプリング範囲を決めて範囲外を切り捨てるTruncation Trickによって多様性と高品質を実現
      Inception Score: 前SOTA 52.52 → 166.3 – [@_Ryobot]

      異なる分野でも正直に効果出そうだなーなんて.

RL

  • A (Long) Peek into Reinforcement Learning
    初心者が強化学習分野に入門しやすいよう書かれた解説記事です.

  • Twitter

    • DQNやA3C等の論文の筆頭著者として知られるMnih氏や,AlphaGoの開発者David Silver氏,分散深層強化学習で革新的な論文を出し続けているHado van Hasselt氏など,正真正銘の超一流研究者による講義動画 – [@learn_learning3]
      https://www.youtube.com/playlist?list=PLqYmG7hTraZDNJre23vqCGIVpfZ_K2RZs

    • Rainbowの亜種であるAPE-Xに, RNNを組み込むことでパフォーマンスを劇的に改善した研究. 任意の状態から学習を行う場合RNNの初期値をどうするかという問題があるが, RNNの状態もとっておく, RNNの状態を作るための初期ステップ(burn-in)を取っておくという対策を行っている
      https://openreview.net/forum?id=r1lyTjAqYX


GraphConv

  • Deep Graph Library (DGL)
    グラフニューラルネットを容易に構築することができるライブラリ.
    GraphConv, TreeLSTMなどの実装が提供されている. バックエンドはPyTorch(+MXNet/Gluon).

Clustering

ちょっと違うですけど, まぁ, まぁ.

  • Deep Clustering
    未学習のCNNに画像突っ込んで下層の出力をkmeansしたら分類できた. という話. おもしろい.

  • UMAP
    tSNEよりムチャ速い上に精度高い. PCA-UMAPなんてのも開発された.


つ か れ た.
マルチモーダル系とかFM系は別記事で書くと思います. よ?

深層学習のちょっとした疑問を解決する

Q. パラメータ(ノード)数って多いほうがいいの?どうなの?

A.
NNはパラメータ数が多い方が汎化性能が高い現象がみられる。reluを使った多層のNNで重みに弱い正則化を適用しクロスエントロピー損失を使った時の解は正規化マージン最大化に対応し、少なくとも2層の時は隠れ層の幅が大きいほどマージンが大きくなり汎化することが示せる。https://arxiv.org/pdf/1810.05369
@hillbig

Q. BatchNormalizationってどういう効果?

A.
・BatchNormで共変量シフトを抑えるよ派(Ioffe派)
・BatchNormは勾配の曲率を滑らかにするよ派(Santurkar派)
・BatchNormは曲率を単純化するよ派(Kohler派)
・BatchNormなんてなくても収束するよ派(原理主義・過激派)
・BatchNormを使いたくても商用利用できないよ派(営利企業派)
@HITStales

Q. Dropoutってどうなの?(多義的)

A.
ResNetにおいて、ノードは一つだけで十分ではないかという研究。実験により全結合より単一ノードの方が決定境界を上手く学習することを確認。Dropoutがなぜ有効なのか?の証左にもなっているというhttps://arxiv.org/pdf/1806.10909
@icoxfog417
正則化の手法としてよく使われるDropoutとBatch Normalizationは、併用するとパフォーマンスの悪化が起こることがあるが、その原因について検証した研究。悪化の理由として、Dropoutを行うことで学習時と評価時で分散が変わってしまう一方、Batch Normalizationは学習で得られた分散を評価時もキープしてしまうため齟齬が生じることが原因と指摘された。https://arxiv.org/pdf/1801.05134
@icoxfog417

後者につきましては、Kaggleにおいても実際にそうであることを報告しているDiscussionがありましたね。

DenseNet

DenseNet

Point

 すべてのレイヤを直接接続することによって、

  • 勾配消失の削減
  • 特徴伝達の強化
  • 特徴の効率的な利用
  • パラメータ数の削減
  • 正則化効果の期待

を実現している。すなわち、各レイヤへの入力は以前のすべてのレイヤから与えられ、直接接続数は$\frac{L(L+1)}{2}$となる。

What’s different from Resnet ?

$$x_l=H_l(x_{l-1})+x_{l-1}$$
 Resnetにおいてレイヤlの出力はレイヤl-1の出力にレイヤl-1の非線形変換を加えたものでチャンネル数(depth)は一定だが、
$$x_l = H_l([x_0,x_1,\cdots,x_{l-1}])$$
DenseNetにおいてはレイヤlの出力はレイヤ$0,\cdots,l-1$の出力をチャンネル方向に連結したものとなる。こうしてみると全くもって異なることが明白になる。

What’s Dense block

 難しいことはなく…実装しようとするとPadding祭りになったりするのだが、BN-ReLU-Conv(1 x 1)-BN-ReLU-Conv(3 x 3)から成るレイヤをトップ画像の様に密結合させたもの。このレイヤ毎のチャンネル(depth)増加数を$k$をgrowth rateと呼んでいる。

DenseNet Families

 で、「DenseNet-B」?「DenseNet-C」?「DenseNet-BC」? 何よソレ。という話なんだがね?

Bottleneck layers.
Although each layer only produces k output feature-maps, it typically has many more inputs. It has been noted in [37, 11] that a I x I convolution can be introduced as bottleneck layer before each 3×3 convolution to reduce Lhe number Of input feature-maps, and Lhus 10 improve computational efficiency. We find this design especially effective for DenseNet and we refer to our network with such a bottleneck layer, i.e., to the BN-ReLU-Conv(l x 1)-BN-ReLU-Conv(3 x 3) version of H_l, as DenseNet-B. In our experiments, we let each 1 x 1 convolution produce 4k feature-maps.
Compression.
To further improve model compactness, we can reduce lhe number Of feature-maps al transition layers. If a dense block contains m feature-maps, we let the following transition layer generate 19m] output feature-maps, where O < 9 1 is referred to as the compression factor. When 0 — 1, the number of feature-maps across transition layers remains unchanged. We refer the DenseNet with 0 < 1 as DenseNet-C, and we set 0 = 0.5 in our experiment. When both the bottleneck and transition layers with O < 1 are used, we refer to our model as DenseNet-BC.

(θがOやら0やらになっていたり、他にもいろいろと間違いあるので気を付けて)

  • DenseNet-B
     特徴マップ数の削減、計算の効率化のためConv(3 x 3)レイヤの前にBottleneck layerとして、Conv(1 x 1)レイヤを導入した。これはチャンネル方向での圧縮操作(和)となる。
  • DenseNet-C
      DenseBlockがm個の要素を持つ特徴マップを出力する場合、より簡潔に表現するために$0 < θ\leq 1$のもと、$\lfloor θm \rfloor$に要素数を削減するためTransition layerとして、BN-ReLU-Conv(1 x 1)-AvgPool(2 x 2, stride 2)から成るレイヤをを導入した。
  • DenseNet-BC
     上記二つの工夫を取り入れた版。

Performance


よさげ。


実装:
https://github.com/sheep02/2D_DenseNet_Keras.git
 これ自体の動作確認はしていないのですが、これをもとに別のモデルを組みましたので恐らく動作します。


Reference:

NN構築の失敗談

逐次更新…(笑 えない。

Pytorch

ResidualNet

RuntimeError: Given groups=1, weight of size [16, 3, 3, 3], expected input[30, 16, 101, 101] to have 3 channels, but got 16 channels instead

 BCHW: ネットワークの頭、中間のレイヤでsumの操作を加えるときにショートカット側で畳み込みしておかないとチャンネル数(フィルタ数)が合わずにエラーが吐かれる。
 

ValueError: Target and input must have the same number of elements. target nelement (16384) != input nelement (65536)

 BCHW: ネットワークの出力がターゲットのサイズと合致していないと吐かれる。適当なサイズ/数でPoolingするなどしてダウンサンプリングする。

Keras (TF backend)

DenseNet-BC

TypeError: __init__() got multiple values for argument 'axis'

 BHWC(恐らく): 畳み込みレイヤの出力をConcatenateを用いて連結させようとしたところ吐かれた。詳細は確認していないがconcatenateを代用することで解決。
 

ValueError: Negative dimension size caused by subtracting 2 from 1 for 'pool4/AveragePooling2D' (op: 'AveragePooling2D') with input shapes: [?,1,1,64]

 BHWC: Transition layerを含むDense blockを重ねすぎて(プーリング層を入れすぎて)吐かれた。Dense block(本質的にはプーリング層)を減らして解決。Dense blockをさらに重ねたければDenseNet-Bを採用すべし。
 

Tensorflow 1.0をかじる

プリセットを利用する


tf.estimator

 抽象度の高いAPI。 高位の機械学習APIともいう。 データの入力には下記のfeature-columnsを用いる。
 このクラスは以下を内包している。

  • BaselineClassifier: A classifier that can establish a simple baseline.
  • BaselineRegressor: A regressor that can establish a simple baseline.
  • BestExporter: This class exports the serving graph and checkpoints of the best models.
  • BoostedTreesClassifier: A Classifier for Tensorflow Boosted Trees models.
  • BoostedTreesRegressor: A Regressor for Tensorflow Boosted Trees models.
  • DNNClassifier: A classifier for TensorFlow DNN models.
  • DNNLinearCombinedClassifier: An estimator for TensorFlow Linear and DNN joined classification models
  • DNNLinearCombinedRegressor: An estimator for TensorFlow Linear and DNN joined models for regression.
  • DNNRegressor: A regressor for TensorFlow DNN models.
  • Estimator: Estimator class to train and evaluate TensorFlow models.
  • EstimatorSpec: Ops and objects returned from a model_fn and passed to an Estimator.
  • EvalSpec: Configuration for the “eval” part for the train_and_evaluate call.
  • Exporter: A class representing a type of model export.
  • FinalExporter: This class exports the serving graph and checkpoints in the end.
  • LatestExporter: This class regularly exports the serving graph and checkpoints.
  • LinearClassifier: Linear classifier model.
  • LinearRegressor: An estimator for TensorFlow Linear regression problems.
  • ModeKeys: Standard names for model modes.
  • RunConfig: This class specifies the configurations for an Estimator run.
  • TrainSpec: Configuration for the “train” part for the train_and_evaluate call.
  • VocabInfo: Vocabulary information for warm-starting.
  • WarmStartSettings: Settings for warm-starting in Estimators.

tf.feature-columns

 estimatorへ入力する特徴列(データ)の定義。特徴列の型、サイズ、構造を定義し、生成する。

オリジナルモデルを構築する


tf.Variable

 重みやバイアスといった学習対象の変数を格納する。

  • Weight (W)
  • Bias (B)

tf.placeholder

 学習に必要なデータを供給する。テストデータの入力の際はnumpy行列をそのまま渡す。

  • train_x
  • train_Y

 
参考:
・https://towardsdatascience.com/deploy-tensorflow-models-9813b5a705d5
・https://www.kaggle.com/liampetti/deep-neural-network-using-tensorflow
・https://www.kaggle.com/fuzzyfroghunter/getting-started-with-tensorflow
・https://stackoverflow.com/questions/41116782/tensorflow-how-to-get-prediction
・https://stackoverflow.com/questions/36693740/whats-the-difference-between-tf-placeholder-and-tf-variable

集団学習(ensemble learning)

集団学習(ensemble learning)

 ここでは主に異なるアルゴリズムのアンサンブルを行うスタッキング(stacked ensembling)とその一種と考えられるブレンディング(Blending)を紹介します。と言っておいてなんですが辻褄合わせの結果をご覧ください、といったところ。
 bagging、boostingなどはここでは扱いません。
 

アンサンブル

 複数の予測値のランク平均、平均、幾何平均などをとる

スタッキング

 メタアンサンブリングとも呼ばれる。それぞれ学習器から得られた予測値を「n次元メタ特徴」とし、それらを用いて分類/回帰を任意の回数だけしていく。3次は見たことがないので効果が得られないのだろう。

ブレンディング

 ブレンディングというのはNetfixコンペの優勝者によって提唱された言葉。ブレンディングはスタッキングの一種と考えられる。これはスタッキングに極めて近いが僅かに異なり、情報欠如のリスクが少ない。いくらかの研究者は スタッキングと ブレンディングを互換的に用いる。
 スタッキングよりもブレンディングのほうがテスト性能が良いこともあれば逆もまた然りということ?
 以下にアルゴリズムを示す。

  1. 単純にトレーニングセットを分ける。
  2. 多くのモデルで学習を行いバリデーションをそれぞれ行う。そしてこれらの予測値を用いて、重み付平均、線形回帰、などの任意のアルゴリズムで性能が最大になるものを見つけ出す。
    (ここで汎化性能を目指してもいいかもしれないが単純な手法なので単純に精度を高めればいいはず。)
  3. テストデータに適用する。

“Blending and Stacking”

“Blending and Stacking”というワードをちらほら見た方もいると思いますが、これは「ブレンドして積み重ねていこー」a.k.a.スタッキングかと。

“Stacked Generalization”

そして、アイキャッチ画像で行っていることはアンサンブルで減次、減次、ブレンディングで汎化、といったところだろう。


参考:
・http://forums.fast.ai/t/difference-between-stacking-vs-blending/1727
・https://www.quora.com/What-are-examples-of-blending-and-stacking-in-Machine-Learning
・https://github.com/MLWave/Kaggle-Ensemble-Guide
・https://en.wikipedia.org/wiki/Ensemble_learning