では書きます。
#Adversarial Examples
人の目ではわからないごくわずかな摂動(変化)を加えただけで結果が大きく変わるデータ、生成手法を指します。
自動運転やセキュリティでは影響がとても大きく、対策はDefensive Distillation(蒸留を使う手法)、Gradient Masking(最後の出力だけ渡す手法)がありますとても難しいです。
下図がAdversarial Examplesの例です。
引用:https://elix-tech.github.io/ja/2017/10/15/adversarial.html
次に手法の紹介をします。
##FGSM
高速に生成できますが、特定のクラスへの誘導ができない手法
##JSMA
任意のクラスに誤認識できる手法。
##Blackbox Attack
モデルそのもの(oracle)が入らなくても攻撃できる手法の総称。
#深層学習ライブラリ
##フレームワークランキング
シェア1位:Tensorflow(+Keras)
シェア2位:PYTORCH(Chainerを参考にして作った)
です。
##開発環境、ライブラリ
画像:OpenCV
文章の前処理:gensim
コンテナ(仮想環境):docker
形態素解析:Mecab,Juman++
サブワード:SentencePiece
フレームワークの互換性を持たせる(アプリにDeployできる):ONNX
などなど
#軽量化技術
スマホなどにモデルを載せる場合も含め、Deep Learningでは基本的にサイズを小さくしたい。
そこで軽量化や、早くなる技術を紹介します。
##量子化
通常DeepLearningではfloat32で計算していますが、これを1bitで計算できれば容量は1/32でかつビット演算で計算できるので高速化ができます。
つまり容量のbit数を下げる手法を指し、1bitの場合binarization(2値化)といいます。
1bitの内積計算はXNOR(掛け算)+POPCNT(CPUの命令で足し算)でできるので数十倍の高速化が見込まれています。
###BinaryConnect
確率p(σ(w))で+1,1-p(σ(w))で-1にする手法。
なぜかうまくいきます。(正則化として寄与するらしいです)
###Binarized Neural Networks
活性化関数も二値化する手法。
ですがこの場合勾配も計算できなくなってしまいます。
そこで以下の関数(STE:Strate Threw Estimator)を用いて計算します。
引用:https://developer.smartnews.com/blog/2017/03/neural-network-quantization/
##蒸留
大きいモデル(教師モデル)の出力を教師データにして別のモデル(生徒モデル)を学習させる手法。
生徒モデルは教師モデルと同じサイズか小さいサイズで行い、性能の向上やサイズの削減などが見込まれます。
なぜ性能が向上するのか、教師モデルでは正解データを0と1(Hard Target)でしか受け取れませんが、生徒モデルでは犬0.09,猫0.91(Soft Target)のようにクラス間の類似度を正解データとして受け取れるのでモデルの性能が上がるからです。
引用:http://ai.deepx.co.jp/2018/09/25/%E8%92%B8%E7%95%99-%E7%AC%AC2%E5%9B%9E/
##プルーニング(pruning 枝刈り)
重みが小さいものを0にする手法。
学習とpruningを繰り返すと小さいモデルでも性能を維持できます。
#分散処理
大きなモデルを複数のプロセスで計算する手法を分散処理といいます。
分散処理ではデータ並列とモデル並列という2通りのアプローチがあり、
データ並列では、全プロセスに同じモデルのコピーして訓練することでバッチサイズをプロセス数倍し、学習を高速化させる手法です。例えばImageNetもあげられます。
一方でモデル並列では、1つのモデルを分割して複数のプロセスに配置し、全プロセスで協調して1つのモデルを訓練する手法です。例えば超解像度を入力とするCNNなど、1プロセス上に載りきらないサイズのモデルを訓練したい場合に用いられます。
引用:https://tech.preferred.jp/ja/blog/model-parallelism-in-dnn/
##GPU
DeepLearningの演算で使うハードウェア、並列処理が得意です。
参考文献
https://tech.preferred.jp/ja/blog/model-parallelism-in-dnn/