Month: 8月 2017

「ゼロから作るDeep Learning」輪読会を開催しました

AI班で8月7日〜10日にかけて「ゼロから作るDeep Learning」の輪読会を行いました。
全員が自分で読んできて、各自の担当範囲をスライドでまとめて発表するという形式で開催しました。
時間の都合で実装はできませんでしたが、コードを読むだけでも理解が深まったので良い本だったと思います。

dlscratch

深層学習の初心者がほとんどでしたが、一冊読んだことで概観が分かってくれたと思います。
誤差逆伝播法やCNNなどは初めてだと分かりにくいかと思いましたが、本の解説が分かりやすいこともあり順調に進めることもできました。
分からないところを輪読会で質問しあって解決できたことも多くあったので、この形式は良かったと思います。

今後は三田祭に向けてTensorflowを用いた実装の勉強をして行く予定です。

REINFORCE Algorithm でジャンプアクションを学習させてみた

こんにちは. TRSasasusu です.今回は前回に引き続き強化学習の話です.

スクリーンショット 2017-08-07 4.17.50

前回のQ学習は行動価値関数を更新していくことで学習を進めましたが,今回の REINFORCE Algorithm は直接方策を更新していくことで学習を進める方策勾配に基づくアルゴリズムの一種です.

方策勾配に基づく強化学習は状態空間や行動空間が連続であっても取り扱うことができます.ですが,なんとなく連続な状態空間における離散的な行動空間を持つ問題をやってみました.具体的には,ジャンプで穴を飛び越えることを学習していきます.ジャンプするのが早すぎてもタイミングが合わず落ちますし,ジャンプしなくてももちろん落ちます.行動はジャンプするかしないかで,横方向への移動に関しては自動で右へ一定の早さで進ませます.穴との距離と方策の確率モデルのパラメータの関係式をソフトマックス関数に入れ,これを計算して勾配を求めてパラメータを更新しました.


$$ \nabla_{\theta}J(\theta) = \sum^M_{m=1}\sum^T_{t=1}(R^m_t – \overline{b})\nabla_{\theta}\log{\pi_{\theta}}(a^m_t|s^m_t) $$
$$ \theta_{t+1} = \theta_t + \eta\nabla_{\theta}J(\theta) $$

また,報酬については,ジャンプしたら減点(疲れるから),落ちたら大きく減点,穴を越えたら大きく加点という形にしました.

結果は以下のようになりました.

実際にプログラムを動かしてみると,パラメータとしては初期値に関わらずジャンプアクションができそうな値になるのですが,うまくいかない場合も散見されました.REINFORCE Algorithm よりも工夫された手法もあるのでそちらに変更するのも良さそうです.

ところで, REINFORCE Algorithm ってすごく調べづらいのですが… そもそも強化学習は Reinforcement Learning なのでこちらばかり出てきますね.

あと,未だに上に挙げた式でベースラインを引いて良い理由がわからないので,誰か教えてください.

迷路にQ学習を使ってみた

お久しぶりです.ユーザ名を今回から Twitter に合わせて TRSasasusu にしました.

スクリーンショット 2017-08-03 4.06.12

記事にできるような活動があまりできなかったため,気がついたら前回の何か作った系の投稿から7ヶ月も経ってしまいました.今回の投稿は去年UMU氏が投稿したものを大いに参考にしています.(というか,ほぼ同じ.違う点は迷路が大きくなったことくらい)

Q学習は


$$ Q(S_t, A_t) = Q(S_t, A_t) + \alpha(R_{t+1} + \gamma \max_{a’ \in A(s’)} Q(S_{t+1}, a’) – Q(S_t, A_t)) $$

に従って行動価値関数を更新します.そもそも行動価値関数とは,といったことはこちらもUMU氏がまとめてくださっています.ありがとうございます.

方策決定には ε を固定した ε-greedy 法を用いています.これにより局所解を抜け出せるようにします.パラメータについては,


$$ \varepsilon = 0.1 $$
$$ 学習率\ \alpha = 0.1 $$
$$ 割引率\ \gamma = 0.9 $$

としています.

やっぱり途中で戻ったりするようになってしまいますね…何ででしょうね.

あと,Pygame 便利ですね.

今回のスクリプト(q_maze2.py, moyf/ml/rl/q.py)

2017年度Blender講習会総括

どうも、初投稿です。

KCSでは今年の4月から5月に掛けて新入生向けの講習会を多数開きました。この講習会は、ある意味KCSの目玉ですので、しっかりとやっていかねば。責任感割と重大でした。

反省も兼ねて今年の講習会の総括を行います。

 

講習会について

講習会は概ね以下のような流れに沿って行いました

  1. 簡単な動物(ペンギン)のモデリング
  2. テクスチャペイントやマテリアルの編集
  3. レンダリング設定など

うねうね

(製作途中図)

Blenderは特にモデリング作業において、覚えるべき操作やショートカットが沢山あるのでまずはそこに重点を置いて講習会を行うようにしました。講習会は教室を借りて行うことが多いため、教室前方にある白板などを活用しました。反省としてはやはり、いちいちテキストを参照していてはどうしても効率が悪くなってしまいがちですので早見表のようなものを作った方が良いという点です。

中間期間はめっきり人が減ってしましましたが残った人に対して以下のような講習を行いました

  1. 人体モデリングの手法
  2. メッシュの流れ(トポロジー)を意識したモデリング

人体モデリングは独学でやるにはかなり敷居の高い分野だと個人的には感じております。そのため、そのイロハを教えることができたのはとても良かったです。来年度も継続して行っていきたいものです。

 

Blender講習会は毎週火曜日に行いました。最初は10人程度集まっておりましたが、どうも放課後ということで都合の付きづらいことが多いらしく参加者全員集まるという機会はほとんどありませんでした。また、五月中旬は中間試験のためめっきり数を減らしました。こればかりは、毎年の傾向で対処の難しい課題ですね…。どうにかして改善していきたいですが。

講習会の内容としては、自作のテキストを使って簡単なシーンを作ってレンダリングするというものでした。テキストこそ70ページを超える内容でしたが正直伝えたいことは3割程度しか載せられませんでした。時間と語彙力が沢山ほしい次第です。

講習会の形式としては、軽く講義を行ったあと、各自の自習を行う形式でした。少人数の講習会であったため、TAの手が足りないといった事態は避けられましたが、テキストの内容をもっとわかりやすく書いていれば、質問も減ると感じたのでフィードバックとして改善していきたいです。

 

また、KCSでは内部のSNSとしてSlackを活用しています。そこで、講習会で行った内容などを共有するなどしました。他愛のない談笑も行ったりしています。

談笑の図

上図…他愛のない談笑の一例

テキストについて

自作のテキストを用いました。このテキストは技術書典2への出展を兼ねていたため誤字誤植等が無いよう最大限細心の注意を払って制作を行いました。しかし、主に自分の知識不足が原因ですが様々な改善点などが見つかりました。人に教授する目的で自分の知識も向上できる、知識確認と向上の良い機会だとつくづく感じました。

また、個人的に所有していた以下の市販の本も参考資料として使用しました。

MikuMikuDanceキャラクターモデルメイキング講座―Pさんが教える3Dモデルの作り方

Blender 2.7ガイド&3DCG基本作品制作

講習会自体には関係ありませんが講習会途中に出版されたBlender標準テクニック ローポリキャラクター制作で学ぶ3DCGも非常に充実した内容で、今後の講習会に生かしていきたい内容が多い印象でした。(もっと早く出版されていれば…!)

その他

食事したいですね。1対1で話をした方が捗りますし。

 

関係ないですが、代表のお金で焼肉が食べたいです。

2017年AI講習会総括

こんにちは。さんこです。

Unity講習会に続いて、AI講習会についても反省をします。

今年のAI講習会は機械学習の基礎から深層学習の入門を行いました。

全体の内容について

機械学習の基礎の基礎を知っておくことは重要だと思うのですが、やはり初めから数学的な話をするのはつまらなかったかなと思いました。
次年度以降は機械学習の基礎の部分は本当に軽くやるくらいが良いかもしれないですね。

テキストについて

「ITエンジニアのための機械学習理論入門」という本を参考にして書きました。
基礎の基礎の内容にとどめつつ、機械学習の概観が掴めるようにしたつもりです。
演習問題も少しですがつけて、Pythonと機械学習の実装の練習としました。

反省としては、量が多かったと思います。
入門講習会で欲張りすぎないほうが良いですね。
実装を増やしたほうが楽しめたと思います。

講習会について

人数は新入生だけだと最初の10人から最後は5人程度まで減りました。
少し込み入った話を急いでしすぎたと思います。
5限後ということで眠そうな人が多かったですね。
僕も眠かったです。

基本的に講義が中心になってしまったのも良くなかったです。
講義を聞くのは意外と疲れますよね。
僕も疲れました。
講義形式が効率が良い気もしなかったので、割り切って自分で本を読む時間を取ってもよかったかもしれないです。

その他

たまにはみんなでご飯を食べるのも良いと思います。

まとめ

  • 内容は少なくて良い
  • 自習形式で良い

2017年Unity講習会総括

こんにちは。はじめまして。
mo-takusanです。

KCSは今年度、4月から6月にかけて主に新入生に向けて様々な講習会を開きました。
本記事ではその中でもUnity講習会について、反省などをつらつらと書いていきます。

まあ大抵の人は興味ないかと思われますが、こういうの書かないと何も活動していないように見えますしね…

さて今年度のUnity講習では、以下のような簡単なアスレチックゲームを作成することを目標に取り組みました。

2017-08-01_12h03_34

ぶっちゃけ公式チュートリアルの「玉転がし」の延長です。非常に単調なゲームでしたが、それだけにUnityの基礎はだいたい抑えられたと思います(Instantiateとか抜けているのは本当に痛手でしたが…)。

前置きはこのくらいにして順番に反省していきたいと思います。

テキストについて

今回は技術書展2への出展も兼ねていたのでできるだけ 丁寧、読みやすい、網羅的 になるように心がけました。
また、要所要所に課題を付け、今まで習ったことを復習できる機会も作ることを意識しました。これは、テキストをできるだけ細かくに書いた分、「読めばわかる」という感じにはなった(と思う)のですが、逆に、考えて取り組まなくなる恐れがあったためです。実際新入生は苦労していた様子でしたが、上級生が手伝いながらこなしていました。

もちろん反省点もありました。まず一つは誤字が多かったことです。もちろん仕方のないことではあるのですが、スクリプト部分での誤字は致命的でした。もう一つはコード上の欠陥によって、正しく作成しても動かなかったことです。これはもう悪夢。急いで作成し直しました。
あれもこれも結局はデバッグ不足が原因でした。実は「これで動くだろ」という安直な考えで一度も試すことなく書いた部分がいくつかあり、そこが見事にバグったのです。これデバッグ以前の問題では…

講習会について

初めから最後まで10人満たない程度の人数で活動しました。人数があまり減らなかったのは良かったのですが、もっと集まると思っていたので(昨年は30人であったため)、宣伝が足りなかったのかもしれません…。

さて講義の進め方ですが、本講習会は自学自習形式を取りました。講義の流れはこんな感じでした。

 

軽い挨拶

今日のポイント

自習(適宜質問)

今日のまとめ

 

一年生にとってどうだったかは後程アンケートを作成しようと思いますが、個人的には良かったです。というのもこの講習会というのはサークルとして必須なのですが、その性質上、上級生は恩恵を受けづらいのです。そのため、毎度講義形式をとるとリソース不足に加えて、モチベーションの低下が著しくなってしまいます。もちろんいくら用意が少なくて済むからと言って「今日のポイント」や「今日のまとめ」をその場で作成するのはやめましょうね。さらに自習形式にして、必要な時に質問をしてもらったため、新入生も多分自ら学ぶ姿勢になりました。あと質問によって新入生と一対一で会話できたので楽しかったです(小並感)。

さらに、5月の中ごろからはまとめの内容をSNSで共有することを始めました。内容はこんな感じ

本日は4章をやりました
☆コルーチン
Updateメソッドによる更新から外れた処理をしたいときに使用するもの
IEnumrator メソッド名(引数){
処理
yield return ~
処理
}
のように記述する。
~の部分には以下のような記述が可能
null…次のフレームに処理を行う
new WaitForSeconds(t)…t秒後に処理を行う
☆レイ
あるオブジェクトから見えない光線を飛ばし衝突したオブジェクトの情報を得るもの
今回は以下のような記述をしてメインカメラからレイを飛ばしてクリックしたオブジェクトの情報を得るようにした
①Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
->MainCameraというタグのついたカメラからレイを作成する
②RaycastHit hit;
->光線が衝突したオブジェクトの情報を入れる変数の定義
③if(Physics.Raycast(ray, out hit)){処理}
->Raycast->衝突した場合trueを返すメソッドで衝突したオブジェクトの情報をhitに入れる

これは、毎回フルメンバーで講習会を行うことができないので、来れなかった人たちが復習しやすいようにするためです。
ただこれも毎回はできていませんでしたね…。モチベーション維持って難しい。

 

その他

そんな中でも一番悔やまれるのが講習会後の食事会でした。初めて企画した際には思いのほか集まってうれしかったのですが、何も考えずに店に直行したら人数多すぎて見事にはじき返されました。人数が決まったらその時点で店に予約を入れるだけでも全然違うと思います。

まとめ

とにかく来年度に向けて気を付けてほしいことを最後にまとめておきます。

  • デバッグはしっかりする
  • その日の講習会でやる内容はあらかじめ決めておく
  •  食事会は計画的に

うーん、割と考えればわかりそうですが、当事者になってみるとうまくいかないものです。できればワンマンで行うのではなく、みんなで一つの講習会ができるといいですね。

 

最後に

本講習会で使用したテキストはここにあります。気になる人は見てみてください。