「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
深層学習(deep learning)について纏める。
- 人間の神経回路を真似した学習モデルを多層化した学習モデル。
特徴 †
- 多層構造のニューラルネットワークに画像などのデータを入力すると、
情報が第1層からより深くへ伝達されるうちに、各層で学習が繰り返される。
- 機械学習と同じ様な事が出来るが、分布を学習するのではなく超平面的なモノの近似を行う。
- 観測データから本質的な情報を抽出した特徴、潜在表現、内部表現(低次元表現、特徴ベクトル表現)を学習する。
強み †
弱み †
超平面的なモノの近似なので、
- 「バーニーおじさんのルール」では、
ニューラルネットワークの重みパラメタの数に対して、
最低その10倍以上の訓練データが必要となると言われている。
- データ量が少なすぎる場合は、深層学習以外のアプローチを検討。
(とは言え、非構造化データの場合は深層学習が必要になる)
などの問題もある。
対象 †
構造化データも対象にできるが、機械学習と比べ、優位性はそれほど高くない。
機械学習では精度が出なかった非構造化データを対象にできる。
が、特に非構造化データのベクトル化の方法がポイントになる。
目視作業の自動化 †
フロントオフィス業務で画像認識を使うケースが多い。
異常検知の自動化 †
上記を使った異常検知など。
- 老朽化診断
- 品質管理、不良品検品(不良品を認識して弾く
歴史 †
※ 参考:AIの歴史
1943 †
ニューラルネットワークの基礎
1951 †
世界初のニューラルネットワーク学習マシン(SNACR
1957 †
パーセプトロン
1979 †
福島邦彦によってCNNのネオコグニトロン提唱。
1982 †
ポップフィールドネットワーク
1985 †
ボルツマンマシン
1986 †
誤差逆伝播法(バックプロパゲーション)の再発明、以後定着
1989 †
ネオコグニトロン+バックプロパゲーション=LeNet
1998 †
LeNet-5
2006 †
- オートエンコーダー
- トロント大学のジェフリー・ヒントンが深層学習ブームの
火付け役となったDeep Belief Network(DBN)を発表
2010 †
画像認識(CNN)大規模画像認識競技会(ILSVRC)が始まる。
2012 †
- ILSVRC
ジェフリー・ヒントン率いるSuperVision?(チーム名)
のAlexNet(CNNアーキテクチャ名)が圧倒的な勝利を収めた。
- Googleの猫
- 教えることなく、AIが自発的に猫を認識することに成功した。
- AIは画像内の特徴を認識し自発的に分類できるようになった。
2014 †
2015 †
- Microsoft ResearchのResNetが、初めて人間のエラー率 5% を上回る精度を達成。
- ≒ 機械が目を獲得した。機械のカンブリア爆発(飛躍的進化)が予測された。
2017-18 †
2019 †
- EfficientNetが効率的なスケールアップ規則の採用で、
当時、パラメタ数を大幅に減少させ最高水準の精度を上回る。
違い †
階層的な特徴量の学習が、機械学習と決定的に異なる点。
- ベイズ法はトップダウン方式
AIが類例を認識すれば、様々なパターンに対応できるようになる。
詳細 †
生成モデル系のニューラルネットワーク †
CPU、GPU、TPU †
CPU †
- 複雑で連続的な処理が得意で早い。
- 浮動小数点数の計算回数であるFLOPSは低い。
GPU †
- もともとグラフィックス計算のためのプロセッサ
- 比較的低性能のユニット・コアを大量に積んだ並列的な処理が得意。
- CPUに対して浮動小数点数の計算回数であるFLOPSは高い。
- 深層学習は並列処理に向いた単純な行列演算が多く高速化が期待できる。
- CPU⇔GPU通信回数の削減
- はじめに全てのデータを送信する。
- 計算を済ませて結果をCPU側に送り返す。
- 並列数をふやす
- ユニット・コアへ効率よく計算タスクを分配し、並列数の大きい計算を行う
- MN行列AとNK行列Bのドッド積=MK行列Cを計算する場合、MユニットKコアをフル稼働させて一度に処理。
ユニット¥コア | C1 | C2 | C... | CK |
U1 | c11 | c12 | c1... | c1k |
U2 | c21 | c22 | c2... | c2k |
U... | c...1 | c...2 | c... | c2k |
UM | cM1 | cM2 | cM... | cMk |
- また、計算を極限まで早くする方法として、次に考えられたのが分散処理。
TPU †
Google社が開発した、テンソル計算処理に最適化された特定用途向け集積回路(ASIC)
GPGPU †
GPGPU(general purpose GPU)
- グラフィック以外の目的での使用に最適化(汎用化)されたGPU
- GPUの演算資源をグラフィックス計算以外の目的に応用する技術
開発環境 †
GPGPU制御を行う開発環境
- 外部からの制御がないと動かないため複雑な処理はできない。
GPUに対して命令を行うソフトウェアをインストールしてGPUを制御する。
- GPUのメモリへのデータの転送
- GPUのコアに対しての演算命令
- CUDA
NVIDIA社のGPUでは、CUDAという深層学習用開発環境
が整えられていて、計算用の関数などが使用できる。
- cuDNN
TensorFlow?・Keras、PyTorchの下位スタックで動く。
更に下位スタックで、前述のCUDAが動作する。
- 開発環境構築手順
- GPUをインストール
- CUDAをインストール
- cuDNNをインストール
- GPUに対する各種設定
- GPU対応TensorFlow?・Kerasなどでプログラムを書いて実行
その他 †
言語・ライブラリ †
言語 †
R言語 †
ライブラリ †
フレームワーク †
Theano †
- MILAのOSS(3条項BSD)で2007年に初版リリース
- 2017年以降、メンテナンス・フェーズ
言語 †
Python(コンパイラ、ライブラリ)
特徴 †
Numpyのように計算手続きを記述するのではなく, 数式そのものを記述.
- このことによって, 計算対象となる行列等の実体のプログラム内での
引き回しを考える事なく, 最適化やGPUによる高速化の恩恵が受けられる.
参考 †
Caffe †
Yangqing Jiaら当時Berkeleyのメンバーが中心に2013年頃
開発したOSS(BSD)のディープラーニングフレームワーク
- Convolutional Architecture for Fast Feature Embedding.
- 前身はDeCAF (Deep Convolutional Activation Feature)
言語 †
C++で実装、Pythonのインターフェイスあり。
特徴 †
- コードを書かなくても設定ファイルだけで動かせる
- 容易に拡張できるコード設計
- PythonとMatlabからも使える
- 高速(C++実装、GPUをシームレスに使い分け)
- Githubの活発な開発コミュニティ
- 画像認識向き
参考 †
Chainer †
- 2015年に株式会社Preferred Networks(PFN)からリリース。
- 2019年12月5日、PyTorchに順次移行すると発表。
言語 †
Python
特徴 †
特⻑:様々なNNを直感的に記述可能
- NNの構築をPythonのプログラムとして記述
- CuPy?によるCPU/GPU agnosticなコード記述
- 動的なNN構築(Define-by-Runの独自コンセプト)を採用
- しかし入力データによって計算グラフの構造が変化するRNNなどCNN以外のニューラルネットワークが台頭し、
- ニューラルネットワークの構造を柔軟に制御できるDefine-by-Runが、Define-and-Runに比べて優勢に。
参考 †
CNTK †
(Microsoft Cognitive Toolkit)
- 2015年にMicrosoftからリリース。
- 2016年にMITライセンスでGitHubに公開。
言語 †
C++、Python、.NET、BrainScript?
特徴 †
- リソース効率が良い。
- ONNXを初めてサポート
- コミュニティ発展が課題
参考 †
Facebook(Meta)の †
専用項を設けた。
Googleの †
専用項を設けた。
専用項を設けた。
専用項を設けた。
開発・運用環境 †
モデルの軽量化 †
プルーニング †
- 学習後、ニューラル ネットワークの
- レイヤー間の繋がりを切り、
- (重要度の低い重みの一部を0にする(疎行列化する)ことでノードを削減し)
- パラメタ(エッジとノード)数を削減
- ニューロン単位でニューロン毎の重要度に基づきニューロンを削減
- L2正則化を加えて学習後に、絶対値が小さい重みを0にする。
- CNNでは難しい(ニューロン削減後も構造保持が必要)。
- チャネル単位でチャネルを生成するフィルタ単位で削減
- 各層のフィルタの重みの絶対値の総和が小さいものから各層の削減率分、削減
- 以下にチャネル単位のプルーニングの代表的な2つのモデル
・Network Slimming:各チャネルの出力を scaling する変数γを導入し、学習後、γ値が小さいチャネルを削減
・Channel Pruning と ThiNet?:特徴マップの誤差が最小となるチャネルを削除。
蒸留 †
- 概要
- 計算リソースを軽量化し精度も向上するモデル圧縮の1つ。
- 一度訓練した大規模なモデルが得た知識を別の軽量なモデルに継承する。
- 詳細
- 教師モデルの推論結果を生徒モデルの訓練データに使用することで汎化した性能を示す。
- soft target loss(教師モデルの推論結果との差)
- soft target loss(教師モデルの推論結果との差)& hard target loss(教師データとの差)
- 敵対的攻撃に対して頑健なモデルが得られるという性質がある。
- データ拡張して教師モデルに入力、アンサンブル(平均)した結果を
生徒モデルの訓練データに使用すれば、精度向上を図る事ができる。
(半教師あり学習と異なりラベルなしデータ活用の意図はない。)
量子化 †
例えばLLMのBERTでは、600MBぐらいがパラメタになる…モバイルやIoTでは難しい。
- パラメタの精度に落とすことでモデルサイズを削減
- 浮動小数点を64 bit → 32 bit
- 深層学習用のBf16(符号:1、指数:8、仮数:7)
- 対象
数値表現されるモノが対象となる。
- パラメタ(重みとバイアス)
- アクティベーション(活性化関数の出力)
- その他、入力値、勾配、エラーなど
- 二値化
- BinaryConnect?:パラメタを二値化
- BinaryNet?:パラメタとアクティベーションを二値化
- XNOR-Nets:パラメタとアクティベーション、入力値も二値化
- 三値化
Ternary Weight Networksなどがあり、-1, 0, 1と0を含んだ値を使える。
- DoReFa?-Net
・ビット長のみハイパー・パラメタ
・パラメタとアクティベーション、勾配も量子化
- Quantized Neural Networks
勾配計算も量子化する手法
分散処理 †
- ただ、GPUを2つ用意すれば2倍で計算が可能と言う事ではない。
- 以下のような工夫が必要になる。
- 同じ精度を出すためのアルゴリズム上の工夫
- ハードウェアと高速にやりとりができるようなシステム構築
- 分散深層学習の並列化び二つの代表的な手法(同期・非同期)
データ並列(Data parallel) †
- 同じモデル計算の機構を複数のGPU上に構築し、データを分散させて計算し、統合を図る。
- 各GPUにおいて異なるパラメタが訓練されるので、結果を合わせて最終的な学習済みモデルを得る。
- 結果を合わせるモデルの統合方法については、以下の2つが有名。
- 非同期型更新
- 勾配計算後、勾配をパラメタ・サーバに送信し平均などの補正済み勾配を受けパラメタ更新。
- 最後に計算が終わったGPUだけが正しいバッチ・サイズで計算でき全体の精度が落ちる。
- 新しいモデルのパラメタが古い勾配情報で計算されてしまう恐れがある。
- 同期型更新
- 勾配計算後、全ノードの結果を共有し平均などの補正済み勾配を受けパラメタ更新。
- バッチ・サイズが一律になるが、同期の待ち時間や、ボトルネックが発生し得る。
モデル並列(Model parallel) †
- アーキテクチャ
- モデルを幅で分割して、別々のGPUを割り当てる。
- モデルを深さで分割して、別々のGPUを割り当てる。
- 一般的に幅で分割した場合の方が境界超え回数=通信回数が増える。
- トレードオフ
- メリット:正しいバッチ・サイズで計算できる。
- デメリット:分割した境界を超える度に通信が発生。
ハード・システム基盤 †
その他 †
MobileNet? †
スマホ用CNNで、ボトルネックの畳み込みの分割で計算量を減らす。
- CNNはパラメタ数が多過ぎるのでパラメタ数削減を考える。
- 空間方向とチャネル方向の畳み込みを別々に行いパラメタの数を減らす。
- 各チャネルを独立に畳み込み、チャネル方向を大きさ1のカーネルを用いて畳み込み。
- パラメタ数 = FH*FW*FN*CH → = FH*FW*CH + 1*1*CH*FN = FH*FW*CH + CH*FN
学習済モデル †
- TensorFlowHub?
デプロイ可能なトレーニング済み機械学習モデルのリポジトリ
ファースト・ステップ †
ランタイム・ライブラリ †
アルゴリズム †
参考 †
Wikipedia †
Qiita †
YouTube? †
某处生活_LiveSomewhere? †
t-uesugi/videos †
AIcia Solid Project †
AI教室 AIRS-Lab †
※ プロモーション動画の比率が高い。
AGIRobots †
※ https://agirobots.com/
Neural Network Console †
予備校のノリで学ぶ「大学の数学・物理」 †
ゼロから作るDeep Learning †
フレームワーク編 †
https://www.oreilly.co.jp/books/9784873119069/
強化学習編 †
https://www.oreilly.co.jp/books/9784873119755/
農学情報科学 †
https://axa.biopapyrus.jp/
深層学習 †
https://axa.biopapyrus.jp/deep-learning/
用語 †
One Learning Theory †
- 脳科学の世界には
「One Learning Theory(たった一つの学習理論)」
と呼ばれる仮説がある。
- それは「視覚野」、「聴覚野」、「感覚野」など、大脳皮質の異なる領域が、
実は同一の認知機構に従って動作している、とする仮説である。
- これが正しければ、視覚野の認知機構に基づくスパース・コーディングは、
単に画像認識のみならず、例えば聴覚(つまり音声認識)など他の分野にも応用できる。
スパース・コーディング †
- 入力の一部または全体を、辞書に含まれる要素の組み合わせで表現しようというもの。
- スパースなデータ表現とは、
- データを表現するための辞書を用意し、
- その要素のできるだけ少ない組み合わせでデータを表現すること。