ディープラーニングの性能向上について
県外の友人でもあるお客様、から、「入門系の記事に偏ってるんでないの~?」という「おたより」を頂きました。
AIの素養がある人材(*1)を2~3名集められる企業様で、社内のチームビルディングをして、あとは多くのことを自らでAIでやっていけるよう指導しますが、しばらくすると、AIはできるようになった、次にAIの性能をさらに上げたい、という事にみんななります。
ネットワークが同じでも、学習データの入れ替え、学習データ増加、ラベルの再構築等で、性能を上げることはできます。
その辺は、「データサイエンティスト」的な方向にはなります。その辺も大事なので、色々ためしてみてください。
自分のつくったAIは「自分の子供」とか「自分の分身」です。AI性能を上げるのが人の仕事ですぞ!
今年も新しいネットワークが次々と提案されていますが、WEBをググってそれを(無料で)取り入れることができます。
そこでググるキーワードはなに~?という質問になりますが、ここからは、私の情報は自分の好き(趣味、興味、お仕事)なものです、一般的なものではないかも・・です。
キーワード1「スパースモデリング」
これは、「全結合全能ネットワーク」の結合を減らし、自由度を下げ、学習データを減らし、性能を上げる、というものです。限られた内容から学習量が少ない段階でも比較的高い性能を発揮します。[スパース]とは、オペレーションズリサーチ、品質工学の大規模行列、あるいは科学技術計算で、0が多い行列をスパース・マトリックス(疎な行列)、といいました。狭いスパコン界の用語にも頻出するかもです。
「正則化」の発想を学習行列に適用して極端にしたもの+ランダムではないドロップアウト。通常DNNは「全能な全結合」なので、大量の組み合わせ量の重み学習のための学習データとトレーニングを大量に投入し学習。しかし、簡単なタスクに全能さ(全ての組み合わせ)は必要だろうか? 従来のオートエンコーダでは次元削減により性能をあげることができましたが次元が減るゆえの限界もあります、スパースは次元を減らさずに性能アップが可能なようです。(スパースの前に一度オートエンコーダも試してみよう。)
キーワード2「ガウス過程との組み合わせ」
すこし前に、「碁」や「将棋」のAIで、「古き良き世代のモンテカルロ」と「新しい世代のディープニューラルネットワーク」の組み合わせのAIが「性能」を発揮するようになりました。
モンテカルロは確率を取り入れた方法です。
ガウス過程の前に、「ベイズ線形回帰」を機械学習の視点から確率を取り入れる意義を見ておきます。
http://gihyo.jp/dev/serial/01/machine-learning/0012
現在「確率」の技法をディープニューラルネットワーク内部とくみあわせるて性能の高いAIを作っている人達がいます。
従来のネットワークも、シグモイドやソフトマックスを「出力段」に据えて、推論結果を確率に変換しています。ただ、内部の活性化関数としてはこれらの関数は学習上の問題があります。ディープニューラルネットワーク内部では私は使いません。
ディープラーニング内部に、この技法をとりこむイメージとしては、従来の活性関数ではなく、「学習」のときの入力と教師データが、確率的なものだよ(たまに間違いもあるよ)ということです。「白か黒かの微妙な教師データ」でも、ネットワークモデルが過学習をおこしにくいものができる、という特徴があるようです。この辺でモデルの推論性能が頭打ちになっている場合は、劇的な改善が見込めます。
数学がスキな方はこちらが参考にしてください。
https://www.ism.ac.jp/~daichi/lectures/H26-GaussianProcess/
実装は、すこし前まではツール類はまだ完全には揃っていませんでした。現在は、GPyTorchというライブラリがPythonで使えるようになっています。
[browser-shot url=”https://gpytorch.ai/” width=”600″ height=”450″]
GoogleさんのPyTorchなん?、と思ってしまうネーミングで紛らわしいですがGoogleさんとは無関係のようです。(Gはガウシアン。) Define by Runなライブラリにどんなものがあるか、とか、GPyTorchのスポンサーとか。
ぼんやりとした確率的でスパースな個人的な独り言でしたが、誰かのお役に立てれば幸いです。