コンピューターの勉強会・研修ネタ

コンピューターの勉強会・研修ネタ

 コンピューターの勉強会や研修の元になりそうなネタの話を書きます。

Amebaでブログを始めよう!
第一回 準備編 numpy,matplotlib
 行列計算と可視化

第二回 機械学習 pandas,scikit learn
 機械学習の一連の流れ

第三回 ディープラーニング kerasまたはPyTorch
 ディープラーニングの流れとモデルの作り方
 (MLP,CNN,RNN,LSTM)

第四回 ネットワーク分析 networkx,python-louvain
 中心性、クラスタ分析、構造的空隙(拘束度)は自分で計算?
 http://cogpsy.educ.kyoto-u.ac.jp/personal/Kusumi/datasem07/nakamoto.pdf


第五回 自然言語処理 Janome,gensim(場合によってはBeautifulSoup)
 形態素解析、LDA,などなど(場合によってはWebデータから)

というところでしょうか・・・
時間があったら、ぞれぞれについて、詳しく書いてみたいところです。
前に
OpenCVとScikit-learnとPyTorch・Kerasの使い分け
https://ameblo.jp/smeokano/entry-12526090552.html
を書いたとき出てきた図の「出力」 のところがキーワードが飛びすぎていて、誤解されそうなので、今回、その部分、つまり

PIDの古典・現代制御から強化学習、深層強化学習(DQN,R2D3)までの出力制御のトレンド
を書いてみました。上記の図の出力のところを90度倒して、さらに細かく書くと、こんな感じになります。

以下順に説明しますね。

■AIを使わない制御
 例えば、ラジコンカーをここで走らせて100m先で止まることを考えます。
 ここでSW-ON,100m先で(何らかの手段で)SW-OFFすればよいように思えます。

 このようにSW-ON,SW-OFFの切り替えにより、処理を制御していくのが「バチバチ制御」で
 このような制御を実現する場合、ただSW-ON/OFFをする順番を書けばいいことになります。
 →このSW-ON/OFF制御がシーケンス制御

 しかし、上記のように100m過ぎたところでOFFにしても手遅れです。
 実際には車はスピードついているので、すぐに止まりません。
 つまり、速度や摩擦までも考えて、SW-OFFしていかなければいけません。
 さらにその場合、現在どのように走っているかの情報が必要です。
 このような、自動運転(自動制御)するために、
 現在のフードバックを受けながら(フィードバック制御)
 位置、速度、摩擦を計算しながら(伝達関数で)モデル化し、制御するのがPID制御です。

 ただ、PID制御は外乱に弱く、などいろいろな点を改良し、(伝達関数ではなく)状態方程式で
 制御していくのが現代制御です。

 この古典制御・現代制御で「モデル化できるものの制御」は、まず可能であると考えてよいと思います。
 →AIいらない?

 ちなみに、PWM制御というのは、この話とは全く違い、12V固定出力の時、8V出すには
 ・・・平均したら8Vになるように出力制御する方法です。


■ディープラーニングを使わないAIっぽい制御
 としては、ファジイ制御、これにニューロを加えたニューロ&ファジイ制御があるのですが、
 ここでの話とは関係ないので省略します。

 強化学習というのがあります。これは状況(環境)Sを認知し、その認知結果に応じて行動aを行うように意思決定する
 システムを構築して、制御を行うものなのですが、その環境から行動までのモデルを作れるかどうかで解法が異なります。

 モデルが作れる場合
 (古典・現代制御で作ればいいじゃんというツッコミは至極全うだけど、ここではおいといて)
   →動的計画法という手法で溶きます:今日の話に関係ないので省略
 
 モデルが作れない場合:
  テキトーに動いてその結果から考えるという→モンテカルロ法と
  価値関数を最大化するように努力するTD学習があります。
  そしてTD学習の中でも、
    方策を直接探しに行く方策ベースの方法:手法として方策勾配法を使う
    価値を中心に考える価値ベースの方法と
      このうち、(話が長くなって、わかんなくなってきたと思うので理屈省略)
        方策オン型のSarsaと
        方策オフ型のQ学習
    その両方を合わせた方法:手法としてActor-Critic法があります。

 つまり、ディープラーニングでいうQ学習とは、
 モデルを作らなくていい(モデルフリー)なとき、TD学習の中の方策オフ型の一つの手法
 となります(まだ、ディープラーニング出てきません)


■ディープラーニングを使った強化学習による制御
 上記のQ学習をディープラーニングのCNNを使って行ったのがDQNになります。
 ただ、CNNを直接使うと、(隣接するデータを使うが、それには相関があるので)
 局所最適解に陥りやすいため、バッチを用いてその中から取り出したものを利用するという
 「経験再生」を行うところが特徴です。

 このDQN、いろいろ問題があります。たとえば、Qの値を求めるのに、値の一番いいやつ
 をとってくる→いいかっこしいになる(過大評価になる)のでそれを抑えるDouble DQN(DDQN)
 などです。DQN+6つの工夫たちを集めたものがRainbowです。

 あたりまえですけど、これ、分散させて並列処理させると早くなります。
 これがGOLIRA,APE-Xです。

 一方、CNNだけでなく、RNNも利用する(実際にはLSTM)もあります。
 DRQNがあります。

 そして、このRNNと並列処理を合わせたものがR2D2,
 R2D2に人間によるデモデータを加えて学習させたものがR2D3になります。


 また、上の表では出てきていませんが、前の章で、Actor-Criticがでてきました。
 これを深層学習で実装したのがA3Cになります。

 また、方策勾配法の深層学習実装としてはREINFORCEになります

 ※実は複雑に入り混じっているが、説明の便宜上、キャッチコピー的に、性質のつよいものに
  割り当てた


【参考サイト・この後は】

参考にしたサイトは、以下のサイト

これから強化学習を勉強する人のための「強化学習アルゴリズム・マップ」と、実装例まとめ
https://qiita.com/sugulu/items/3c7d6cbe600d455e853b

深層強化学習アルゴリズムまとめ
https://qiita.com/shionhonda/items/ec05aade07b5bea78081

上のサイトと下のサイトの間に、1年の差があります。
1年間でどれくらい世の中が進むかがわかると思います。

この後見るとすると、上記の話を詳細に説明している本があるみたいです
(みたいです→まだ読んでないですけど・・・買ってはあります)

現場で使えるPython深層強化学習入門
https://www.seshop.com/product/detail/22970

上記で描いた内容が詳しく載っているみたい(ソースコードもついて)

pythonでAI系をやると、
  OpenCV
  Scikit-learn
  PyTorch(またはKeras)
が出てくるけど、この使い分けとか、疑問に持つ人もいそうなので、述べておきます。

まず、Aiっぽいことをやるとき、第二次AIブームの終わりから今までに、
大きく3つのトレンドがあった。これに当てはめて説明すると、上記のモジュール
の違いがすっきり判ると思う。

あ~ちなみに、このトレンドはSES2019の自分の発表の中に出てきて、
その資料はslideshareにあがっている

機械学習によるモデル自動生成の一考察 ー 決定表と決定木によるアプローチ - https://www.slideshare.net/michitarookano/ss-170001136

の16枚目の資料。ここでは、それを再掲。


ここでは、話を簡単にするため、画像について考えます。

■OpenCV画像処理に使う(機械学習関係ない)

 画像処理の世界で、AIっぽいこと、つまり画像認識をはじめにやっていたことは、
 テンプレートマッチングという手法だった。
 このテンプレートマッチングは、テンプレート画像と似た画像を見つけるというもの。
 ここに機械学習は必要なく、こういう画像処理の世界にOpenCVは使われる。

 実際、テンプレートマッチングを行うOpenCVの関数はある。

テンプレートマッチングの原理・計算式・例題(SAD, SSD, NCC)
https://algorithm.joho.info/image-processing/template-matching-sad-ssd-ncc/


■Scikit-learn 統計的機械学習(特徴量+判別)に使う

その後、特徴量を出してきて、その特徴量から、対象物であるかどうかを判断するという
手法が出てきた。
この代表的な特徴量がSIFTやHaar-like(はーるらいく)。
画像から抽出した上記徳亮量をもとに、対象物であるかどうかを判断するところに
統計的機械学習を使う。

この判別で使われるのは主に2種類。線形判別とSVM。これらは判別の仕方がとっとちがう。

SVMは、AかBか判別する境界線(サポートベクター)を直接探すのに対し、
線形判別は、まず分散が最大となる線を探す。境界線は、その分散最大の線に直交する
ことから求める。

しかし、いずれにしても、データをもとに行う統計的機械学習で、これらはScikit-learnを使う

結局:特徴量+判別を行う場合、
 Haar-like+SVMのような、
・OpenCVで画像処理して特徴量を出し、
・Scikit-learnで統計的機械学習による判別を行う

という形で作る。このうち、SVMがディープラーニングが出るまで最強だった。


■PyTorch(Kerasも) ディープラーニングに使う
ディープラーニングのソフトを作るのに、PyTorchやKerasを使う。

ただ、ディープラーニングが出てくると、特徴量を出す必要がなくなった。
とはいえ、画像処理は必要なので、画像処理部分(拡大縮小・減色、ノイズ修正等)
をOpenCVで書く。

そのあとのデータ整理にScikit-learnを使うと便利なこともあり、使ったりする。

ただ、ディープラーニングのモデルは、ふつうPyTorchやKerasを使う。


■このほかのライブラリたち。

TensorFlowPyTorchやKerasよりも低レベルなテンソル(実質行列)を
操作するにに使う。最近Keras風に書けるようにもなった。

numpyはもっと基本的な配列を操作するもの。
pandasはデータ解析。欠測値操作などに・・・使うかなあ(^^;)
→Scikit-learnとかぶってる

matplotlabはグラフ表示用。たいてい使う。

こんな感じです。こちらからは以上です。