-
Notifications
You must be signed in to change notification settings - Fork 0
DNET_DeepLearning
- 戻る(人工知能(AI))
- 機械学習(machine learning)
- 深層学習(deep learning)
- 強化学習(Reinforcement Learning)
- 生成系AI(Generative AI)
深層学習(deep learning)について纏める。
-
第3次人工知能ブーム(人工知能(AI)の該当節を参照)での人工知能
-
教師あり学習(機械学習(machine learning)の該当節を参照)を主体とする。
-
人間の神経回路を真似した学習モデルを多層化した学習モデル。
-
多層構造のニューラルネットワークを用いた機械学習で、
この多層化により、より複雑なルールやパターンを見つける事ができる。 -
以下を基にしたアルゴリズムが実装されたもの。
- 脳、特に視覚野の研究
- 「たった一つの学習理論(One Learning Theory)」
- ブルーノ・オルスホーゼン教授
によるスパース・コーディング理論
-
-
ニューラルネットワークを多層(深層は3層以上)にして、
誤差逆伝播法(バックプロパゲーション)
と呼ばれる方法を用いて学習 -
多層構造のニューラルネットワークに画像などのデータを入力すると、
情報が第1層からより深くへ伝達されるうちに、各層で学習が繰り返される。 -
機械学習と同じ様な事が出来るが、分布を学習するのではなく超平面的なモノの近似を行う。
-
観測データから本質的な情報を抽出した特徴、潜在表現、内部表現(低次元表現、特徴ベクトル表現)を学習する。
-
以下の強みと弱みがある。
-
特徴量(機械学習(machine learning)の該当節を参照)の自動抽出とパラメタの自動調整がされる。
-
超平面的なモノの近似によって非構造化データの処理に強い。
超平面的なモノの近似なので、
-
必要となる学習データの数が膨大になる。
-
パラメタの数に依存
(パラメタ数は以下に依存)- 層の深さ
- 層の幅
-
「バーニーおじさんのルール」では、
ニューラルネットワークの重みパラメタの数に対して、
最低その10倍以上の訓練データが必要となると言われている。-
必要に応じて「データ拡張(data augmentation)」
(ニューラルネットワークの該当節を参照)する。 -
データ量が少なすぎる場合は、深層学習以外のアプローチを検討。
(とは言え、非構造化データの場合は深層学習が必要になる)
-
-
-
この結果、計算量も膨大になる。
-
また、
-
結果の解釈ができない。
(ブラック・ボックス。Azure Machine Learningのアルゴリズム・モデルの該当節を参照) -
過学習を起こし易い(ニューラルネットワークの該当節を参照)。
-
チューニングも難しい。
などの問題もある。
-
移行メモ(正誤): 元ページは「層の深」で語が切れていたため「層の深さ」に補った。
構造化データも対象にできるが、機械学習と比べ、優位性はそれほど高くない。
(データサイエンス力の該当節を参照)
機械学習では精度が出なかった非構造化データを対象にできる。
が、特に非構造化データのベクトル化の方法がポイントになる。
フロントオフィス業務で画像認識を使うケースが多い
(AIの活用例の該当節を参照)。
上記を使った異常検知など。
- 老朽化診断
- 品質管理、不良品検品(不良品を認識して弾く)
※ 参考:AIの歴史(人工知能(AI)の該当節を参照)
以下、ニューラルネットワーク系の項目は ニューラルネットワーク、
CNN 系の項目は 畳み込みニューラルネットワーク(CNN)の該当節を参照。
| 年 | 出来事 |
|---|---|
| 1943 | ニューラルネットワークの基礎 |
| 1951 | 世界初のニューラルネットワーク学習マシン(SNARC) |
| 1957 | パーセプトロン |
| 1979 | 福島邦彦によってCNNのネオコグニトロン提唱。 |
| 1982 | ホップフィールドネットワーク |
| 1985 | ボルツマンマシン |
| 1986 | 誤差逆伝播法(バックプロパゲーション)の再発明、以後定着 |
| 1989 | ネオコグニトロン + バックプロパゲーション = LeNet |
| 1998 | LeNet-5 |
移行メモ(正誤): 元ページの「SNACR」「ポップフィールドネットワーク」は
それぞれ「SNARC」「ホップフィールドネットワーク」の誤記と判断し修正した。
- オートエンコーダー(ニューラルネットワークの該当節を参照)
- トロント大学のジェフリー・ヒントンが深層学習ブームの
火付け役となったDeep Belief Network(DBN)を発表
画像認識(CNN)大規模画像認識競技会(ILSVRC)が始まる。
-
ILSVRC
ジェフリー・ヒントン率いるSuperVision(チーム名)
のAlexNet(CNNアーキテクチャ名)が圧倒的な勝利を収めた。 -
Googleの猫
- 教えることなく(機械学習(machine learning)の該当節を参照)、AIが自発的に猫を認識することに成功した。
- AIは画像内の特徴を認識し自発的に分類できるようになった。
-
ILSVRC
-
GoogLeNet(Google)
分類、検出部門で優勝 -
VGGNet(オックスフォード)
分類部門で2位
-
-
ILSVRC
- Microsoft ResearchのResNetが、初めて人間のエラー率 5% を上回る精度を達成。
- ≒ 機械が目を獲得した。機械のカンブリア爆発(飛躍的進化)が予測された。
以下はいずれも 言語処理(AI)の該当節を参照。
- Transformer
- ELMo
- GPT-n
- BERT
-
ILSVRC
- EfficientNetが効率的なスケールアップ規則の採用で、
当時、パラメタ数を大幅に減少させ最高水準の精度を上回る。
- EfficientNetが効率的なスケールアップ規則の採用で、
機械学習との違い
階層的な特徴量の学習が、機械学習と決定的に異なる点。
ベイズ統計との違い
-
ベイズ法はトップダウン方式
AIが類例を認識すれば、様々なパターンに対応できるようになる。 -
深層学習はボトムアップ方式
- AIが生データで学習して成長していく。
- 大量のデータが必要で、類似問題しか解けない。
- GAN(敵対的生成ネットワーク)(ニューラルネットワークの該当節を参照)で弱点を補う。
以下はいずれも ニューラルネットワークの該当節を参照。
-
ディープニューラルネットワーク(DNN)
-
順伝播型ニューラルネットワーク(FNN)
-
- 長短期記憶ニューラルネットワーク(LSTM)
- Encoder-Decoder と Sequence-to-Sequence
-
生成モデル系のニューラルネットワーク
- 自己符号化器(AE:オートエンコーダ)
- 敵対的生成ネットワーク(GAN)
- 自然言語処理(NLP)モデル(言語処理(AI)の該当節を参照)
-
深層Qネットワーク(DQN)
-
制限ボルツマン・マシン(RBM)
-
多機能で汎用的
- OSのサポート
- 仮想化
- 命令実行順番変更
-
複雑で連続的な処理が得意で早い。
-
浮動小数点数の計算回数であるFLOPSは低い。
-
もともとグラフィックス計算のためのプロセッサ
-
比較的低性能のユニット・コアを大量に積んだ並列的な処理が得意。
-
CPUに対して浮動小数点数の計算回数であるFLOPSは高い。
-
深層学習は並列処理に向いた単純な行列演算が多く高速化が期待できる。
-
GPUの計算戦略
-
CPU⇔GPU通信回数の削減
- はじめに全てのデータを送信する。
- 計算を済ませて結果をCPU側に送り返す。
-
並列数をふやす
- ユニット・コアへ効率よく計算タスクを分配し、並列数の大きい計算を行う
- M×N行列AとN×K行列Bのドット積=M×K行列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 |
- 教科書学習ではあまり取り上げられないが、実践で重要になるのは、GPUメモリについて。
- GPUには「演算コア」と「専用メモリ (VRAM)」があり、深層学習のデータやパラメタは主にVRAMに置かれる。
- つまり「モデルを動かすのに必要な全データ + 勾配計算用の一時領域」がメモリを圧迫する。
- 問題(モデルが大きすぎて載らない/バッチサイズ制約/推論時でもメモリ不足)
- 対策(Mixed Precision Training、Gradient Checkpointing、バッチ分割、パラメタオフロード、量子化)
- また、計算を極限まで早くする方法として、次に考えられたのがGPU分散処理(コレは教科書に出る(笑))。
Google社が開発した、テンソル(NumPyの該当節を参照)計算処理に
最適化された特定用途向け集積回路(ASIC)
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などでプログラムを書いて実行
- Python
- R言語
- MILAのOSS(3条項BSD)で2007年に初版リリース
- 2017年以降、メンテナンス・フェーズ
Python(コンパイラ、ライブラリ)
Numpyのように計算手続きを記述するのではなく、数式そのものを記述。
-
このことによって、計算対象となる行列等の実体のプログラム内での
引き回しを考える事なく、最適化やGPUによる高速化の恩恵が受けられる。 -
また、微分を (数値的ではなく) 解析的に実行する事が出来る
(DS:数学的基礎 - 微分・偏微分の該当節を参照)。
Yangqing Jiaら当時Berkeleyのメンバーが中心に2013年頃
開発したOSS(BSD)のディープラーニングフレームワーク
- Convolutional Architecture for Fast Feature Embedding.
- 前身はDeCAF (Deep Convolutional Activation Feature)
C++で実装、Pythonのインターフェイスあり。
- コードを書かなくても設定ファイルだけで動かせる
- 容易に拡張できるコード設計
- PythonとMatlabからも使える
- 高速(C++実装、GPUをシームレスに使い分け)
- Githubの活発な開発コミュニティ
- 画像認識向き
- 画像分類
- シーン認識
- 物体検出
- 領域分割
- Caffeで始めるディープラーニング
https://www.slideshare.net/KotaYamaguchi1/caffe-71288204
- 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に比べて優勢に。
-
Chainer - Wikipedia
https://ja.wikipedia.org/wiki/Chainer -
ディープラーニングフレームワークChainerの紹介と⾃動チューニングへの期待
http://atrg.jp/ja/index.php?plugin=attach&pcmd=open&file=20151225-ATTA-oono.pdf&refer=ATTA2015 -
PFN、深層学習フレームワークを自社開発の「Chainer」から「PyTorch」に切り替え - PC Watch
https://pc.watch.impress.co.jp/docs/news/1222796.html
(Microsoft Cognitive Toolkit)
- 2015年にMicrosoftからリリース。
- 2016年にMITライセンスでGitHubに公開。
C++、Python、.NET、BrainScript
- リソース効率が良い。
- ONNXを初めてサポート
- コミュニティ発展が課題
- Microsoft Cognitive Toolkit - Wikipedia
https://ja.wikipedia.org/wiki/Microsoft_Cognitive_Toolkit
- PyTorch(専用項を設けた。)
- TensorFlow(TensorFlow・Kerasの該当節を参照。専用項を設けた。)
- Keras(同上)
専用項を設けた。
-
計算を高速化する手法
-
学習後、ニューラル ネットワークの
- レイヤー間の繋がりを切り、
- (重要度の低い重みの一部を0にする(疎行列化する)ことでノードを削減し)
- パラメタ(エッジとノード)数を削減
-
パラメタ削減後、再学習して精度を保つ。
-
2種類のアプローチ
-
ニューロン単位でニューロン毎の重要度に基づきニューロンを削減
- L2正則化を加えて学習後に、絶対値が小さい重みを0にする。
- CNNでは難しい(ニューロン削減後も構造保持が必要)。
-
チャネル単位でチャネルを生成するフィルタ単位で削減
- 各層のフィルタの重みの絶対値の総和が小さいものから各層の削減率分、削減
- 以下にチャネル単位のプルーニングの代表的な2つのモデル
・Network Slimming:各チャネルの出力を scaling する変数γを導入し、学習後、γ値が小さいチャネルを削減
・Channel Pruning と ThiNet:特徴マップの誤差が最小となるチャネルを削除。
-
-
概要
- 計算リソースを軽量化し精度も向上するモデル圧縮の1つ。
- 一度訓練した大規模なモデルが得た知識を別の軽量なモデルに継承する。
-
詳細
-
教師モデルの推論結果を生徒モデルの訓練データに使用することで汎化した性能を示す。
- soft target loss(教師モデルの推論結果との差)
- soft target loss(教師モデルの推論結果との差)& hard target loss(教師データとの差)
-
敵対的攻撃に対して頑健なモデルが得られるという性質がある。
-
データ拡張して教師モデルに入力、アンサンブル(平均)した結果を
生徒モデルの訓練データに使用すれば、精度向上を図る事ができる。
(半教師あり学習(機械学習(machine learning)の該当節を参照)と異なりラベルなしデータ活用の意図はない。)
-
例えば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を複数用いてより高速な計算を可能にする。
-
ただ、GPUを2つ用意すれば2倍で計算が可能と言う事ではない。
-
以下のような工夫が必要になる。
- 同じ精度を出すためのアルゴリズム上の工夫
- ハードウェアと高速にやりとりができるようなシステム構築
-
分散深層学習の並列化の二つの代表的な手法(同期・非同期)
-
同じモデル計算の機構を複数のGPU上に構築し、データを分散させて計算し、統合を図る。
-
各GPUにおいて異なるパラメタが訓練されるので、結果を合わせて最終的な学習済みモデルを得る。
-
結果を合わせるモデルの統合方法については、以下の2つが有名。
-
非同期型更新
- 勾配計算後、勾配をパラメタ・サーバに送信し平均などの補正済み勾配を受けパラメタ更新。
- 最後に計算が終わったGPUだけが正しいバッチ・サイズで計算でき全体の精度が落ちる。
- 新しいモデルのパラメタが古い勾配情報で計算されてしまう恐れがある。
-
同期型更新
- 勾配計算後、全ノードの結果を共有し平均などの補正済み勾配を受けパラメタ更新。
- バッチ・サイズが一律になるが、同期の待ち時間や、ボトルネックが発生し得る。
-
-
アーキテクチャ
- モデルを幅で分割して、別々のGPUを割り当てる。
- モデルを深さで分割して、別々のGPUを割り当てる。
- 一般的に幅で分割した場合の方が境界超え回数=通信回数が増える。
-
トレードオフ
- メリット:正しいバッチ・サイズで計算できる。
- デメリット:分割した境界を超える度に通信が発生。
ビジネス インテリジェンス(BI)の該当節を参照。
- コンテンツへのリンク - OSSコンソーシアム
https://www.osscons.jp/joho108j0-537- 機械学習・深層学習についてのレポート
https://1drv.ms/p/s!Amfs5caPP9r5jh-m6pIMwKgDln1N - 機械学習・深層学習についてのNotebook
https://github.com/OpenTouryoProject/DxCommon/tree/master/Notebook/path
- 機械学習・深層学習についてのレポート
- ディープラーニング
https://ja.wikipedia.org/wiki/ディープラーニング - Python
https://ja.wikipedia.org/wiki/Python - NumPy
https://ja.wikipedia.org/wiki/NumPy - Matplotlib
https://ja.wikipedia.org/wiki/Matplotlib
- 最近、Neural Network Console の動画がやたら充実している件
https://qiita.com/jun40vn/items/052d9836035ed1c4933e
- そうだったのか!可視化して理解するディープラーニング
https://www.youtube.com/watch?v=RJu4DeU1me8
-
G検定対策(G検定:試験対策の該当節を参照)
-
ディープラーニング(≒ DNN入門)
-
PART0:初心者のための前準備
https://www.youtube.com/watch?v=9f-y8ux_6ck -
PART1:順伝播(入力層~中間層の仕組み)
https://www.youtube.com/watch?v=i0JIaEDGSCE -
PART2:順伝播(出力層と誤差計算)|softmax & cross entropy
https://www.youtube.com/watch?v=HF9gMDMuN8k -
PART3:誤差逆伝播|バックプロパゲーション|チェインルール
https://www.youtube.com/watch?v=QddzS4gONXs -
PART4:kerasでの実装|Google Colaboratoryで演習
https://www.youtube.com/watch?v=HQo4N1R61yw
-
-
RNN入門(再帰型ニューラルネットワーク(RNN)の該当節を参照)
-
CNN入門
-
機械学習概論
-
1-1. 人工知能と機械学習
https://www.youtube.com/watch?v=-eea-vsx-Qs -
1-2. 機械学習の分類
https://www.youtube.com/watch?v=oWnquePWiuA -
1-3. 機械学習の流れ
https://www.youtube.com/watch?v=wwT64eZvYkE -
1-4. データの分割
https://www.youtube.com/watch?v=xBuwXzixuNc -
1-5. 過学習と交差検証
https://www.youtube.com/watch?v=aGAnu3DeF1k -
2-1. 精度評価指標 混同行列, 正解率, 精度, 再現率, F値, 決定係数, RMSE, MAE
https://www.youtube.com/watch?v=vFCPQy-Gcj8 -
2-2. 代表的な機械学習手法
https://www.youtube.com/watch?v=Omf4GMV-CnQ -
2-3. データの質と量
https://www.youtube.com/watch?v=-TuY3t2ZbMs -
線形回帰
- 1.最小二乗法と勾配法、2.線形回帰を使った課題
https://www.youtube.com/watch?v=nQVmc_JgCxQ - 3.Ridge回帰とLasso回帰、4.Lasso回帰を使った課題
https://www.youtube.com/watch?v=CXf2sz5lvng - 5.ロジスティック回帰、6.ロジスティック回帰を使った課題
https://www.youtube.com/watch?v=JQGS2JfRt3Q
- 1.最小二乗法と勾配法、2.線形回帰を使った課題
-
-
ニューラルネットワーク
-
CNNに絞った内容(畳み込みニューラルネットワーク(CNN)の該当節を参照)
-
深層学習 ディープラーニングの世界
https://www.youtube.com/playlist?list=PLhDAH9aTfnxKXf__soUoAEOrbLAOnVHCP- vol. 1 ディープラーニングとは関数近似器である
https://www.youtube.com/watch?v=SyWwoMpP_P4 - vol. 2 学習 - なぜ必要なのか?何をするのか?
https://www.youtube.com/watch?v=RLlTmbyJORM - vol. 3 関数 - なぜ「深さ」が AI を生み出しているのか?
https://www.youtube.com/watch?v=Mw4j4yPsFtg - vol. 4 全結合層 - それはいちばん大事な部品のお話
https://www.youtube.com/watch?v=FYDJ439Va_Y - vol. 5 畳み込み層の本当の意味、あなたは説明できますか?
https://www.youtube.com/watch?v=vU-JfZNBdYU - vol. 6 プーリング層 - シンプルだけど大きな役割を担う層
https://www.youtube.com/watch?v=MLixg9K6oeU - ...
- vol. 1 ディープラーニングとは関数近似器である
-
カサゴ3点
-
分析
-
数学
- 線型代数基礎シリーズ
https://www.youtube.com/playlist?list=PLhDAH9aTfnxKfmufxF59vaZECZJD5j6rd - ベイズ統計
https://www.youtube.com/playlist?list=PLhDAH9aTfnxIU4Hd1G1UdIVzHpgKfyEnw - 週末微分幾何
https://www.youtube.com/playlist?list=PLhDAH9aTfnxLbldij-bqLXHTahD5DPv3T - 確率微分方程式
https://www.youtube.com/playlist?list=PLhDAH9aTfnxIhf-iRKYTVOSXPqDGgfRFP
- 線型代数基礎シリーズ
-
AIのふわふわした話
https://www.youtube.com/playlist?list=PLhDAH9aTfnxI_vbIwZQvnu8250ZVVQfNO -
単発動画
-
つまみぐい
- https://www.youtube.com/@yuky_az
- https://www.youtube.com/@yuky_az/playlists
- https://github.com/yukinaga
※ プロモーション動画の比率が高い。
- https://www.youtube.com/@NeuralNetworkConsole
- https://www.youtube.com/@NeuralNetworkConsole/playlists
-
【機械学習】深層学習(ディープラーニング)とは何か
https://www.youtube.com/watch?v=s5_Pk3CjhNA -
絶対に理解させる誤差逆伝播法【深層学習】
https://www.youtube.com/watch?v=0itH0iDO8BE
-
Pythonで学ぶディープラーニングの理論と実装(ニューラルネットワークの該当節を参照)
-
自然言語処理編(言語処理(AI)の該当節を参照)
-
機械学習(機械学習(machine learning)の該当節を参照)
-
KDDI-RA-201405-01-PRT.pdf
https://rp.kddi-research.jp/download/report/RA2014005-
脳科学の世界には
「One Learning Theory(たった一つの学習理論)」
と呼ばれる仮説がある。 -
それは「視覚野」、「聴覚野」、「感覚野」など、大脳皮質の異なる領域が、
実は同一の認知機構に従って動作している、とする仮説である。 -
これが正しければ、視覚野の認知機構に基づくスパース・コーディングは、
単に画像認識のみならず、例えば聴覚(つまり音声認識)など他の分野にも応用できる。
-
-
入力の一部または全体を、辞書に含まれる要素の組み合わせで表現しようというもの。
-
スパースなデータ表現とは、
- データを表現するための辞書を用意し、
- その要素のできるだけ少ない組み合わせでデータを表現すること。
-
参考
- 【スパースコーディング】スパースなデータ表現の利点 - Qiita
http://qiita.com/IshitaTakeshi/items/5ff69d62b902446d1473
- 【スパースコーディング】スパースなデータ表現の利点 - Qiita
Tags: 移行, サービス, DX, AI, 深層学習, 開発基盤
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。