ぱたへね!

はてなダイアリーはrustの色分けができないのでこっちに来た

ゼロから作るDeep Learning④

ゼロから作るDeep Learning④が良かったので紹介します。

www.oreilly.co.jp

本の紹介文に「読者はコードを通してハッとする気づきを数多く得られるでしょう。」とある通り、Pythonのコードを見ながらなるほどと思うところが沢山ありました。

内容

①~③はほぼDeep Learningでしたが、今回のテーマは強化学習です。全体としてはDeep Learningの部分は少なく、③で作ったDeZeroもさらっと使いこなす感じです。DQNから始まるDeep Learning系列の強化学習の解説に期待すると、なかなか最後まで読み切れないかもしれません。

この本の良いところはDQNに行くまでの従来の強化学習について、分かりやすいコード付きで解説されていることです。特に6章は素晴らしく、僕にとっては6章だけでもこの本を読んで良かったと思っています。

強化学習について書かれた本は数式がいっぱいでてきて良く分からない本か、Python使ってOpenAI Gymを動かしてみましょう的な本が多く、DQNに至るまでの所をPythonでやさしく説明している本はこの本が初めてだと思います。

6章までの内容

1章でバンディット問題を題材に強化学習の用語の整理をします。マルコフ過程、ベルマン方程式と理解を深めたていきます。その後Pythonで3x4のグリッドを使った環境を用意します。

ちょっと雰囲気だけ紹介。この盤面で左上から右に行くための方策を計算しています。

4章の動的計画法、5章のモンテカルロ法、6章のTD法と環境側は全く変えずに、いろいろなAgentを作りながら違いを見ていきます。強化学習の学習の肝は、何をどのタイミングで更新するかです。各手法の構成が同じソースコードを比較することで、各手法の更新のタイミングや、それに使う変数が比べられて、本文の説明と合わせると理解がしやすくなっています。ここにハッとする気づきがいっぱいありました。

7章以降

7章からはDeep Learningに入って、DQNから、Double DQN、REINFORCE、Actor-Critic等、最近の強化学習がどのように進化したのかがソースコード付きで分かる構成になっています。経験再生は知識として知っていましたが、実際にコードを見てみるとちょっと間違って理解していたところもあり、やっぱり動くコードで理解しないと駄目だなと感じました。

こんな人にお勧め

  • Deep Learning以前の強化学習もちゃんと動かして理解したい人
  • 強化学習の論文をちゃんと読めるようになりたい人
  • 自分で強化学習の環境を作りたい人

数式と解説とソースコードがバランス良く出てくるので、上の条件に当てはまる人にお勧めします。

Modern Robotics: Mechanics, Planning, and Control

CourseraのModern Robotics: Mechanics, Planning, and Control Specializationを終えました。

www.coursera.org

一応、これの続きです。

natsutan.hatenablog.com

どんなコース

4週×6コースで半年かけて、ロボティクスの数学を学ぶコースです。

教科書はこの本です。何度も読み返すので紙の本が良いと思います。僕は最初にKindleを買って、途中で紙の本も買いました。(結構お高い)

www.amazon.co.jp

講義自体はあまり動画の説明は詳しくなく、基本的にはこの教科書をひたすら読んでいきます。易しめのCourseraコースですと動画だけである程度行けるのですが、このコースは教科書がメインで動画がサブです。最終的には500ページある分厚い教科書を全部読むことになります。大学一年生の力学の知識は必要です。(力学の知識には微積分が当然含まれます)

3コース目までがロボティクスの基礎で、全く面白くなく、よくわからない行列や微積の計算をさせられます。4コース目の軌道計画の所がちょっと面白くなり、5コース目のロボットマニピュレーションはまた訳分からなくなりました。最後6コース目で、習ったことを全て使ってロボットシミュレータを動かします。

課題はプログラミング有りで、Python、Matlab等が推奨されていますが、プログラミング言語自体に制限は無いのでC++でやっている人もいました。

6コース目の最終課題は自分で理想的な軌道を計算し、タイヤに角速度を与えたときのロボットの動きを計算します。シミュレータでロボットを動かすと言うよりは、ロボットの動きを自分でシミュレートし、その結果をシミュレータで見るような感じでした。

後に続く人の為に勉強時間を計測したところ、6コースのトータルで128時間でした。

辛いところ

力学の英語表記が慣れなくて苦労しました。 というのはジャブで、本当に辛いのはコースが進むにつれて過疎化して行くところです。

Courseraは詰まるところがだいたいみんな同じなので、Forumを見ると「もうこれ答えじゃん」みたいな情報があるんですよね。2コース目くらいはそんな感じなのですが、だんだん人が脱落して精鋭化されいくのかコースが進むにつれてForumの投稿が減ります。自分が分からない所の質問が1年前にあり、そのまま1年放置されているという状況がざらでした。

課題のpeerレビューも辛く、とにかく人がいないのでレビューを受ける事ができず先に進めない状態でした。とりあえずForumを見るとPlease Reviewと書かれているのが3ヶ月前で絶望したりしています。実際コース5、コース6は提出してから二週間くらいは次の人が現れず、なかなかGradeが出ませんでした。

最終成果

いまいち良く分かってないのでこれが限界でした。数式通りの実装した結果です。 理想の軌道はアームの先だけ計算した後、ヤコビアンやらなんやら計算して、なんでこれでロボット本体とロボットアームが連携して上手く動くのかがさっぱりわかりません。

youtu.be

一応レビューの最低基準はクリアーしていたようで、なんとかGradeでました。やったー。

coursera.org

全体を通して6コースやりきった感はあるのですが、正直良く分かってないので面白く無い。 シミュレータを使って数式とロボットの動きの理解を合わせるところは、もう少しステップきざんでも良かったのではと思います。 教科書が500ページあるとはいえロボティクスの基礎の部分でも範囲は非常に広く、全体的には浅く広くになっていて詳しく知りたい時には別の本が必要になります。

というわけで、もう一回勉強し直し。

Rustでthe trait bound `ImageBuffer<Rgb<u8>, Vec<u8>>: image::image::GenericImage` is not satisfied

Rustでimageprocを使って画像処理に挑戦したときにはまったのでメモ。

ソースはこんな感じで、ファイルを開いてちょっと画像処理に挑戦してみました。

   let mut img_work = image::open(input_image_path).unwrap().to_rgb8();
   draw_filled_circle_mut(&mut img_work, (100, 100), 5, Rgb([255,0,0]));

buildしようとするとこのようなエラーがでて進みません。 検索しても良く分からない状態でした。

error[E0277]: the trait bound `ImageBuffer<Rgb<u8>, Vec<u8>>: image::image::GenericImage` is not satisfied
  --> src/chap2/lsm.rs:41:5
   |
41 |     draw_filled_circle_mut(&mut img_work, (100, 100), 5, Rgb([255,0,0]));
   |     ^^^^^^^^^^^^^^^^^^^^^^ the trait `image::image::GenericImage` is not implemented for `ImageBuffer<Rgb<u8>, Vec<u8>>`
   |
   = note: required because of the requirements on the impl of `Canvas` for `ImageBuffer<Rgb<u8>, Vec<u8>>`

Cargo.tomlはimageとimageprocの最新を指定しています。

[dependencies]
image = "0.24.1"
imageproc = "0.22.0"

どうもこの2つのバージョンが合っていないようですが、どう合わして良いのかわからず手こずりました。

まずは、Cargo.tomlからimageを消しimageprocだけでbuildしてみました。

[dependencies]
imageproc = "0.22.0"

実行結果

natu@Honoka:~/q/myproj/d3cv_handbook$ cargo clean
natu@Honoka:~/q/myproj/d3cv_handbook$ cargo build
   Compiling autocfg v1.1.0
   --- 省略 ----
  Compiling num v0.3.1
   Compiling image v0.23.14
   Compiling imageproc v0.22.0

この時にインストールされたバージョンのimageをCargo.tomlに指定すれば、上のソースが上手く動きました。

[dependencies]
#image = "0.24.1"
image = "0.23.14"
imageproc = "0.22.0"

超初級から話せる中国語声出しレッスン

90日完走したので報告。

www.amazon.co.jp

忙しくて中国語の勉強時間は取れないけど、勉強は止めたくないな人にお勧めです。

内容は1日3文の短い中国語を聞いたり読んだり書いたりする本です。5日間のテキストと、2日間の復習で構成されています。それを90日繰り返します。

1日分はだいたい30分以内で終わるし、音声をいつでも聞ける状態にしておけば、出張中でも続けられます。NHKのラジオ講座のように途中から急激に難易度が上がることも無く、少しは難しくなってるけど最後までやりきれました。

3ヶ月くらい前から、仕事がめちゃ忙しくなるな~というのが分かっていて、出張も増えるし気楽に勉強が続けられるテキストを探していたらちょうど良いのが見つかりました。文法の説明は無いのでこれでメキメキ中国語が分かるようになるような本では無いですが、他の勉強で同じような例文が出るとこれだ!ってなるので力になると思います。僕の場合は、NHKのラジオ講座で得や多が出てきたときに、あの例文の良く分からなかった所はこれかと勝手に伏線回収されていきました。実用的だけで無くそういう観点からも例文選ばれていると思います。

今なら、ツイッターで毎日頑張っている人もいるし、#中国語声出しレッスン のタグを付けると先生からイイネがついたりするので、独学感が少なく最後までやりやすいと思います。

f:id:natsutan:20220212163842j:plain

キュアブロッサムと完走記念。

Modern Robotics: Mechanics, Planning, and Control Specialization

去年から仕事でロボティクスに関わるようになり、いつまでも素人では駄目だと思いCourseraのコースで勉強することにしました。

www.coursera.org

全部で6コースあり、難易度が中級で結構ヘビーです。

動画は短く、勉強の大半は先生が書いた教科書を読んで勉強します。教科書もほぼ飛ばすこと無く、前から順番に全ページ読んでいます。quizの設定値が教科書に載っていることもあり教科書は必須です。

勉強しながら良く分からないことばかりで日本語の教科書を買いあさって補完するつもりでしたが、ロボティクスには流派がある気がしていてこの先生の教え方を日本語で説明している本はありませんでした。今までの経験から言うと、理解してから読むとああ同じ事言ってるなって感じるパターンだと思います。 ロボティクス自体が、表現の次元を増やして冗長性を持つテクニックを常用しており、その冗長性の持ち方が複数ある感じです。分かりやすいところでは、角度(向き)の表現がクオータニオンかロールピッチヨーの複数の表現があって、そういうのが角度以外の所でもある雰囲気です。いったん全コース終わった後、また別の本で勉強し直さないといけない感じがしています。

年末やっていて感じたことをまとめます。

教科書は紙の本が良い

数式を見直す事が多く行ったり来たりします。少し前の章のロボットの設定が出てくることもありKindleだと厳しかったです。地味に紙の本の方が版が新しいので、その意味でも紙をお勧めします。

章末をチェック

章末にサマリーがあってこれが良くまとまっています。Kindleで順番にquizに挑戦していると忘れがちですが、サマリーを見てからquizに望むと結構簡単に解けるときがあります。また、練習問題を解くために先生が用意してくれた便利関数の説明もあります。quizによっては、これ自力で実装するの難しい・・・って問題もその関数を使うだけでクリアー出来るのが多いです。一回は眼を通しましょう。

分からなくなったら戻ろう

12月頭にヤコビアンの所で完全に詰まってしまい、分かるところまで戻ってブログにまとめていったのが効きました。順を追って数学から説明する本なので、初見では何のためにやっているのか分からないことが多いです。いったん進められるところまで進めて、駄目だと感じてから遡って勉強するのも良いと思います。

実績

6コース中2コースまで完了しました。昨年の間に3コース終わらせたかったのですが、予想以上に難しかったです。

coursera.org

coursera.org

Modern Robotics: Mechanics, Planning, and ControlのBodyヤコビアン

教科書から分かったところだけをまとめています。

教科書はこの本です。

www.amazon.co.jp

今回はBody Jacobian

この記事のSpaceヤコビアンを置き換えるだけ。

natsutan.hatenablog.com

 [ \nu_{s} ] =\dot T T^{-1} 

に対応するのがこの式になります。

 [ \nu_{b} ] =T^{-1}\dot T  

ここから

 T(\theta)  = Me^{[B_1] \theta_1}e^{[B_2] \theta_2} \cdots e^{[B_n] \theta_n} 

を使って最後はこう。

  \nu_{b}  =  \begin{bmatrix} J_{b1} & J_{b2} & \cdots & J_{sn} \end{bmatrix}  \begin{bmatrix} \dot \theta_1 \\ \vdots \\ \dot \theta_n \end{bmatrix}  = J_b(\theta) \dot \theta 

エンドエフェクタの座標系におけるツイストはbodyヤコビアンと各θの速度で表現できるを示しているで良いのかな。 上の式に出てくるB1,B2を並べた物がBLIST。これとθからボディヤコビアンを計算する関数が、JacobianBody(Blist,thetalist) 。

最初にかかげた目標の半分くらいはできた。

natsutan.hatenablog.com

Modern Robotics: Mechanics, Planning, and ControlのSpaceヤコビアン

教科書から分かったところだけをまとめています。

教科書はこの本です。

www.amazon.co.jp

今回はSpace Jacobian

Forward Kinematics おさらい

natsutan.hatenablog.com

FKをPoE形式で表現するとこのようになります。

 T = e^{[S_1]\theta_1}e^{[S_2]\theta_2} \cdots e^{[S_n]\theta_n}M 

Space Jacobian

Twistの式

 [ \nu_{s} ] =\dot T T^{-1} 

に上のTを代入すると

 [ \nu_{s} ] = [S_1]  \dot \theta_1 + e^{[S_1] \theta_1} [S_2] e^{-[S_1] \theta_1} \dot \theta_2 \cdots  

この複雑な式が、adjoint mappingの意味からこうなります。 natsutan.hatenablog.com

  \nu_{s}  = S_1 \dot \theta_1 + Ad_{e^[S_1]\theta_1}(S_2)\dot \theta_2 \cdots 
  \nu_{s}  = J_{s1} + J_{s2}(\theta)\dot \theta_1 + \cdots + J_{sn}(\theta)\dot \theta_n 

これを行列表現にしたときのヤコビアンがSpaceヤコビアンです。

  \nu_{s}  =  \begin{bmatrix} J_{s1} & J_{s2} & \cdots & J_{sn} \end{bmatrix}  \begin{bmatrix} \dot \theta_1 \\ \vdots \\ \dot \theta_n \end{bmatrix}  = J_s(\theta) \dot \theta 

この後、教科書にいろいろ書いてあるのですが、結局の所こういうことだと思います。

  J_s(\theta)  =  \begin{bmatrix}  \omega_{s1} &  \omega_{s2 } & \cdots  & \omega_{sn} \\ - \omega_{s1} \times q_1 & - \omega_{s2} \times q_2 & \cdots & - \omega_{sn} \times q_n \end{bmatrix}    

実際の例

教科書Example 5.3から

f:id:natsutan:20211219000652p:plain
Figure 5.8

RRPRRRのチェインです。

上の式にあてはめると、

  • q1がSの原点なのでq1=0、ωs1×q1も0
  • θ3は回転しないからω3は0, twistのリニアな速度はv3
  • q4, q5, q6の座標は同じqw

これらを合わせてこうなります。

  J_s(\theta)  =  \begin{bmatrix}  \omega_{s1} &  \omega_{s2 } & 0  & \omega_{s4 } & \omega_{s5} & \omega_{s6} \\ 0 & - \omega_{s2} \times q_2 & v_{s3} & - \omega_{s4} \times q_w  & - \omega_{s5} \times q_w  & - \omega_{s6} \times q_w \end{bmatrix}    

FKを微分をせずに直接ヤコビアンが計算出来るのがメリットです。

Spaceヤコビアンを計算するために出てくるS1,S2が分かればSpaceヤコビアンは計算で出せるはず。 Spaceヤコビアンを計算するためのSのリストがSLIST、関数JacobianSpace(Slist, thetalist)にSとθを与えるとSpaceヤコビアンが返ってくる。

分かってきた。