Quantcast
Channel: ALBERT Official Blog
Viewing all 191 articles
Browse latest View live

小学校から「将来の夢」についてお手紙をいただきました。

$
0
0
こんにちは、ALBERT広報の鈴木です。

先日、小学校の生徒さんから当社宛にお手紙をいただきました。学校の「総合的な学習の時間」に将来の夢について学んでおり、「データサイエンティスト」という仕事の楽しいところや大変なところ、またどんな人がデータサイエンティストに向いているのかを知りたい、というものでした。

お手紙には当社のデータサイエンティスト(リサーチャー)から返事を書かせていただきましたが、今回このような貴重な機会をいただくことができ、データを扱う仕事に興味のある方、ALBERTに興味があるという方にもぜひ読んでもらいたいと思い、ご紹介させていただきます。

◆いただいたお手紙
授業で将来の夢について学ぶ時間があり、小学校6年生の方がデータサイエンティストについて知りたいと今回ALBERTに連絡をくれました。



◆質問へのお返事
こちらのお手紙をいただき、当社データサイエンティストでリサーチャーの山内から、「データサイエンティストの楽しいところ」「大変なところ」「どんな人がデータサイエンティストに向いていると思うか」について、以下のように回答しました。


————————————-

○○○○さん、はじめまして。
株式会社ALBERT(アルベルト)先進技術部の⼭内隆太郎といいます。今回はわたしのほうから○○さんの質問にお答えできればと思います。

○○さんのお⼿紙を読み終えたとき、最初に思ったのが「⾃分が返事を書いてよいのだろうか」ということでした。理由はふたつ。ひとつは、わたしの業務はいわゆる「データ分析」とは少し違うということ。もうひとつは、⾃分は⽬指してデータサイエンティストになったわけではないということです。ですから、データサイエンティスト志望の⼩学⽣に対して、なにか役に⽴つことを⾔えるだろうかと少し悩みました。

しかし考えてみれば、○○さんが⼤学を卒業して働きはじめるようになるのは早くて10年後なわけです(もちろん⾶び級するということも考えられますけれど)。わたしの記憶にある10年前の世界と現在の状況がまったく違っていることを思えば、おそらく10年後の状況もまったく違ったものになっているでしょう。そういう意味では、いまここで誰がどのような返答を書いたところで、10年後のデータサイエンティスト志望者に対する⾔葉としては、同じように的外れなものになるような気がします。それならば、あくまで現在のデータサイエンティストのひとつの実例として書く限りでは、⾃分が書いてもよいのかもしれない、そう思って筆を取った次第です。したがって、以下に書くことは 2021年現在における、ひとりの個⼈の考えです。それを念頭に置いたうえで、参考にしたりしなかったりして
もらえると幸いです。

そういうわけなので、ご質問に答える前に、まずは簡単に⾃⼰紹介させてください。わたしはいま28歳で、アルベルトで働きはじめて5年⽬になります。⼤学での専攻は哲学で、ウィトゲンシュタインという哲学者について研究(といっても⼤したものではないのですが)していました。哲学って⾔葉を聞いたことがあるでしょうか?⼀⾔で説明するのは難しいですが、そうですね、真理とか意味とかについて延々と考える、役に⽴たない学問の筆頭みたいなものです(半分冗談ですよ)。で、哲学専攻の学⽣がなぜいまデータサイエンスをやっているのかといえば、きっかけは些細なもので、学⽣時代に参加した読書会(みんなで集まって同じ本を読むという変なイベントです)で出会った アルベルトの社員に、「うちでアルバイトをしませんか」と誘われたのが始まりです。当時その⼈は「ディープラーニング」について多少なりとも知識のある⼈を探していて、わたしはその条件に合致したというわけでした。

ディープラーニングというのは、すでに名前を聞いたことはあるかと思いますが、多層ニューラルネットワークを利⽤した⼈⼯知能技術です。2010年代に急速に発展し、今では画像認識をはじめ⾃然⾔語処理やら⾃然科学やら多種多様な⽬的に応⽤されています。わたしがディープラーニングを知ったのはたしか 2014年のことで、興味本位で数学科の講義を受けていたときでした。その講義でディープラーニングの基本的な考え⽅を教わり、「これはたいへん⾯⽩い技術だ」と感動したわたしは、個⼈的に簡単な⼈⼯知能を作って遊ぶようになりました。それがアルベルトでのアルバイトに(読書会を介して)繋がったというわけです。縁というのは不思議なものだと思います。

そのころのアルベルトは社員数30⼈くらいの⼩さな会社で、ディープラーニングの専⾨家もほとんどいなかったので、何⼈かで⼿探りで最新の研究論⽂を読み、プログラムを書いて実験し、ということをやっていました。わたしもそこに投⼊され、論⽂を読んだり⼈⼯知能を実装したりするようになったのですが、これがなかなか⾯⽩い。毎⽇のように新しい論⽂が発表され、いままで出来なかったことができるようになっていく。しかもちょっとプログラムが書ければ⾃分でも試してみることができる。⼤学を出たあと何をして⽣きていくのかなんてまったく考えていなかったわたしですが(哲学なんぞをやってたくらいですからね)、案外こういうことを仕事にするのもいいんじゃないかと思うようになりました。そしていつの間にかアルベルトに就職し、気づけば4年以上経っていたというわけです。

そういう経緯で⼊社した⼈間なので、わたしの仕事はもっぱらディープラーニングに関わることでした。アルベルトには現在200⼈以上のデータサイエンティストが在籍しており、データ分析基盤の構築や収集したデータの統計解析などいくつものプロジェクトが進⾏していますが、そこで使われる技術や考え⽅はさまざまで、ディープラーニングはその⼀部にすぎません。また技術以外にも、どのようなお客さんを相⼿にするかとか、所属している部署などによっても、業務の在り⽅は変わってきます。とくにわたしは、最近ではお客さんのデータを解析する仕事から少し離れて、新しい⼈⼯知能アルゴリズムを作る仕事をしており(あまり順調ではないのですけど)、さらに少数派です。テーマは「三次元空間の意味と構造をどうやって⼈⼯知能に教えるか」というもので、膨⼤なデータの中から規則を⾒
つけたり予測をしたりというのがデータ分析の中⼼的内容だとするなら、ちょっと変わったことをしていることになります。この返事を書くのを少しためらったのはそういう理由からです。ですから、これから書く回答があまり⼀般的なものだと思われないように、回答者のバックグラウンドを開⽰しておくことにしました。もっと別の⼈の意⾒が聞きたい!ということであればアルベルトや他の会社にメールを出してみるとよいかもしれません。

将来を考える⼩学⽣からのメールということであれば、わりと返事が返ってくるのではないかと思います。返ってこなかったとすればそこはたぶんろくな会社ではないです。
たいへん前置きが⻑くなりましたが、ご質問に答えていきたいと思います。


① データサイエンティストで楽しいところは何ですか。
わたしはディープラーニングという考え⽅そのものがけっこう好きで、それに関わっていること⾃体が楽しいです。どこが好きかということを詳しく説明するのは難しいのですが、ざっくりと⾔うと、ディープラーニングについて知ることで⼈間の認知の仕組みについても知ることができる(気がする)ということでしょうか。わたしは⼦供のころから⼈間の知能や意識について関⼼があって、哲学を勉強したのもその延⻑でした。そういう意味では、昔から気になっていたことを紆余曲折経ながら今でも考えていることになります。⾃分の考えたいことを考えるというのは楽しいことです。これはまあ、あらゆる仕事に⾔える話でしょうが。

また実際に⼈⼯知能を作って学習させるのも楽しいです。ディープラーニングやデータ分析のためにはコンピュータをうまく利⽤する必要があります。⾼速なコンピュータを準備し、効率のよいプログラムを書かねばなりません。そこにはパズル的な⾯⽩さがあると思っています。綺麗なプログラムが書けると満⾜ですし、また、そうして苦労して実装した⼈⼯知能が想定通りに機能すると「してやったり」という気持ちになります。もちろんうまくいかない場合もあって、その場合は「なにくそ」となります。それはそれで楽しいです。

ところでアルベルトがなぜデータ分析や⼈⼯知能開発をやっているのかといえば、お客さんの抱える課題を解決し、それによって代価を得るためです。最近では少なくなりましたが、わたしもお客さんから要望を聞き、議論して、どのような⽅法で問題を解決できるか考えるという、コンサルティング的な仕事をすることがあります。課題を理解し、⼿持ちの技術でどうやって解決できるか整理し、具体的なアルゴリズムに落とし込む、これ⾃体なかなか楽しい仕事ですし、それによってお客さんが満⾜してくださったり、⾃分の作った⼈⼯知能が実際に世の中で使われるようなったりするのは、嬉しいことだと感じます。


② データサイエンティストで⼤変なところやつらいところは何ですか。
これはたぶんわたし以外のデータサイエンティストも同じではないかと思うのですが、作った⼈⼯知能やデータ分析システムが想定通りに機能しないと⼤変です。⼈⼯知能はプログラムを書けば出来上がるというものではなく、たくさんのデータで学習させて初めて動くようになるものです。ところが、どんなデータでもさばける万能な⼈⼯知能というものは存在せず(「汎⽤⼈⼯知能」と呼ばれる概念で、いまだに研究段階です)、解決したい課題やデータに合わせて⼀つ⼀つ設計してやる必要があります。しかも、実際に使い物になるかどうかは、作って動かしてみるまでは分かりません。⼈⼯知能開発やデータ分析にはそのような予測不可能性がつきもので、限られた期間の中でプロジェクトを遂⾏するとなるとかなりのプレッシャーがかかります。

またデータ分析業界は⾮常に移り変わりの速い領域です。数年前に登場した新⼿法がいまでは時代遅れで誰も使っていないなんてことがままあります。技術の進歩に遅れず付いていくためには、⽇々新しい技術や、あるいはそれらを理解するための基礎的な概念を勉強し続ける必要があります。すべてを理解することはとてもできないので、勉強する対象を選ぶ必要がありますが、⾃分の興味と社会的需要の間でバランスを取りながらやっていかねばなりません。とくにわたしの部署では研究開発をやっていますので、5年後を⾒据えてなにを勉強しなにを研究すべきか、いつも悩みながら働いています。


③ データサイエンティストはどんな⼈に向いていますか。
これはとても答えるのが難しいというか、責任を感じる質問です。ディープラーニングという狭い分野の中でさえ、ここ5年で求められる⼈物像は変わった感じがしますし、10年後どうなっているかは想像がつきません。なのであまり真に受けずに読んでください。まずデータサイエンスのいずれかの分野が好きであるということは重要だと思います。○○さんは「機械やAI、データ分析が好き」だと書かれていますから、その点では適性があるのではないでしょうか。ただ「好き」とひとことで⾔っても内実はいろいろで、個⼈的には「その対象に⻑時間関わっていても苦しくならない」という意味で好きであることが⼤切なのではないかと感じています。上で述べたように、データサイエンスを仕事にするということはデータサイエンスの進歩についていくということでもあり、そのためには継続的
に勉強を続けていかねばならないからです。たまに⾷べると美味しいお菓⼦であっても、毎⽇⾷べる主⾷にすることは出来ない場合があります。データサイエンティストに向いている⼈とは「データサイエンスを主⾷にできる⼈」なのではないか、というのがわたしの考えです。

それから、⾃分の考えを正確に他者に伝えられる⼈でしょうか。⼈⼯知能の研究開発にせよ、データ分析の成果をお客さんに納品するときにせよ、⾃分がどのように考えどのような⼿法を⽤いたか、そしてその結果はいかなるものであったか、その妥当性を他者に納得してもらわなければ、どれだけ優れた分析をしたところで意味がありません。いずれAI に置き換えられる⽇が来るのかもしれませんが、少なくとも現在の社会を動かしているのは⼈間なのです。データ分析の価値というのも、それがどれだけの⼈に理解され、意志決定に影響を及ぼしたかによって測られるべきでしょう。研究だって同じです。昔の偉い学者というものはだいたいみな⽂章が上⼿いのですが、そのことはきっと彼らの業績と無関係ではないでしょう。

どうも⼀般論的な回答になってしまいました。もう少し具体的な⼈物像を出せればと考えていたのですが、同僚たちの顔を思い浮かべてみても、共通する要素というのはあまり⾒当たりません。⼀定⽔準の学⼒があり、好奇⼼旺盛で、考えることが苦ではない。そのくらいでしょうか。

以上、わたしの狭く短い経験から、書けるだけのことを書いてみました。○○さんが将来のことを考えるうえで、ほんの少しでも参考になったならと思います。
それでは受験勉強(もうそろそろ本番でしょうか?)頑張ってください。お元気で。


株式会社ALBERT 先進技術部
⼭内 隆太郎
————————————-


いかがだったでしょうか。
データサイエンティストとはどんな仕事なのか、どのような人が向いているのかについて、そしてALBERTの雰囲気を少しでも知っていただく機会になれば幸いです。

ALBERTは日本屈指のデータサイエンスカンパニーとして、データサイエンティストの積極的な採用を行っています。また、データサイエンスやAIにまつわる講座の開催、AI、データ分析、研究開発の支援を実施しています。

・データサイエンティストの採用はこちら
・データサイエンスやAIにまつわる講座の開催情報はこちら
・AI、データ分析、研究開発支援のご相談はこちら

The post 小学校から「将来の夢」についてお手紙をいただきました。 first appeared on ALBERT Official Blog.


QT-Optの紹介とオフライン経験データに関する実験

$
0
0

はじめに

こんにちは、ストラテジックアライアンス部データアナリストの野島です。

今回は、Kalashnikov et al. の論文「QT-Opt: Scalable Deep Reinforcement Learning for Vision-Based Robotic Manipulation」 [1]について紹介します。この論文では、深層強化学習手法QT-Optを提案し、ロボットアームの把持で96%という高い把持成功率を達成しています。同じ問題を扱った先行研究Levine et. al. [2] の手法では把持成功率は78%となっており、20%近く成功率が向上しています。また、QT-Optでは、過去の経験データ(オフライン経験データ)を用いた学習により、Levine et. al. の手法と比較して、より少ない把持試行によるデータで成功率を向上させています。

最初にロボットへの期待と強化学習について概観したのち、QT-Optの論文、そして関連して行ったオフライン経験データに関する実験についても紹介していきます。

ロボットへの期待

人手不足が社会問題となっている昨今、様々な業界においてロボットの導入による自動化が注目を集めています。以前から、工場など製造業の現場では組み立てなどで産業用ロボットが活躍しており、製造業でのロボット活用は今後も高い需要が見込まれています。また、ロボットは私たちの生活においても、身近な存在になりつつあります。店舗の受付ロボットや、家庭でお掃除ロボットを利用したことがあるという読者の方も多いのではないでしょうか。ALBERTでもそういったロボット技術の需要を見越して、ロボットの把持や、ロボット自体に空間や物体を認識させる研究を進めています。

この記事では、これらの需要の中でもロボットの把持を取り上げます。把持は工場などでロボットが部品の移動や組み立てを行うときに、最も基本的な動作の一つです。また、私たちの身近で動作するロボットにも把持能力があれば、散らかった部屋での収納といったより複雑なタスクをロボットに任せることができるようになるでしょう。

さて、ロボットによる把持と一口にいっても、あらかじめ決まった物体だけを把持できればいいのか、それとも多種多様な物体に対して把持を行う必要があるのかでその難しさは変わってきます。後者の意味での把持をロボットが行うことができれば、ロボットの活躍の場はより広がっていくはずです。QT-Optの論文では、こうした多種多様な物体にも通用する把持能力の獲得に対して、強化学習によるアプローチを提案しています。

強化学習とロボット

QT-Optの論文の紹介に入る前に、ここでは、強化学習について簡単にまとめます。

強化学習とは

一言でまとめてしまうと、強化学習は、ある目標の達成に向けて、周囲の状況に応じた最適な行動方法を学習する機械学習の一分野です。と言っても、少し分かりにくいので、ゲームを例に強化学習を応用することで何ができるようになるかを説明します。

キャラクターを操作して、ゲーム終了時に獲得したトータルのポイントを競うゲームを考えてみます。ゲームの進行中にはプラスポイントをもらえるアイテムや、ぶつかるとマイナスポイントとなる障害物があるとしましょう。このゲームでの目標はもちろん、より高いトータルポイントを稼ぐことです。そのためには、できるだけアイテムは獲得しつつ、障害物は避けていく必要があります。アイテムと障害物の位置関係によっては、アイテムを諦めたり、ポイントがマイナスになっても障害物にあたる戦略が必要になるかもしれません。強化学習を用いることで、複雑にもなり得る最適なプレイ戦略を学習することができます。

強化学習の枠組み

前節では、機械学習分野における強化学習の位置づけとゲームへの応用を紹介しました。後の説明のため、ここでは強化学習の枠組みをもう少しフォーマルにまとめます。

強化学習では、ゲームの例でキャラクターにあたる操作対象を「エージェント」と呼び、「行動」選択の方法を学習します。ゲームでは、キャラクターはゲームの世界にいて、キャラクターをとりまく状況に合わせて操作を行っていきます。同じように、エージェントはある「環境」にいるとして、環境の「状態」を観測してから行動を選択します。エージェントの行動により状態が変化することもあり、状態の観測と行動選択を逐次的に繰り返していくという設定を強化学習では扱います。

次に、行動の適切さの指標として、強化学習では「報酬」と呼ばれるスカラー値を用います。報酬は行動の度に発生し、報酬の累積値を高める行動選択を強化学習では学習します。報酬は問題ごとに個別に設計する必要があり、ゲームの例ではポイントが報酬にあたります。

探索と学習

では、エージェントの行動をどのような方法で最適化していくのでしょうか。ここでは、多くの強化学習の手法に見られる「探索」によって得られたデータによる最適化について説明します。

強化学習では、教師付き学習と異なり、最初から学習のためのデータがあるわけではなく、環境の中でエージェントが自ら行動することで経験データを集めます。ここで、経験データとは、行動とその行動前後の状態、そしてその時に得られた報酬の組をさします。この経験データを集めるステップは「探索」と呼ばれ、こうして集めた経験データにより行動を最適化、すなわち「学習」を行っていきます。人間が何度もゲームをプレイして、その経験をもとに上達していくことを想像すると分かりやすいと思います。

強化学習の利点

ロボットアームで多種多様な物体の把持を行うときを例に、強化学習の利点を考えてみます。強化学習を用いない場合、把持対象の認識プログラムと把持対象ごとの動作プログラムを組み合わせて把持を実現するというのが一つのやり方です。こうした把持設計では、細かなパラメータの調整を伴うプログラムを複数作成することになり、個別のケースごとに煩雑な作業が必要となります。一方、強化学習を用いる場合、把持対象の認識(状態の観測)とロボットアームの動作(行動)を逐次的に行うことで把持を実現します。把持対象の認識と把持動作をまとめて強化学習に任せてしまうことができるため、それぞれ別個に設計するよりも最適な把持動作を期待できます。さらに、認識を何度も繰り返すため、想定外の状態にも対応可能な把持動作が期待されます。

強化学習の課題

強化学習の課題についても取り上げておきましょう。ここでは特に、ロボットに応用する際の課題を取り上げます。

強化学習ではエージェントの探索により集めた経験データで学習することに触れましたが、ロボット実機での探索には次のような問題があります。まず、探索には非常に時間がかかるという点です。一般に、強化学習では、満足のいく能力を持ったエージェントを学習するために膨大な経験データが必要となります。例えば、DQNと呼ばれる強化学習手法を提案した論文[3]では、Atariのゲームをプレイするエージェントを学習するのに5,000,000個程度の経験データを用いています。ゲームでは、高速にプレイするためのカスタマイズで探索にかかる時間は短縮できますが、例えばロボットアームによる把持では、一回の把持試行に数秒から数十秒かかってしまいます。さらに、パラメータチューニングのため何度か学習をやり直すことを考えると、強化学習の採用を躊躇してしまうほどの時間が探索には必要となります。また、何度も実機を動かす場合、探索の間にロボットが故障してしまう可能性が高く、ロボット実機による強化学習を困難にしています。

QT-Opt: Scalable Deep Reinforcement Learning for Vision-Based Robotic Manipulation

強化学習の課題を踏まえたうえで、ここからは、本題の一つ、Dmitry Kalashnikov et. al. の論文「QT-Opt: Scalable Deep Reinforcement Learning for Vision-Based Robotic Manipulation」[1]を紹介していきます。

論文の概要

前述したように、この論文では、ロボットアームによる多種多様な物体の把持を目指し、QT-Optと呼ばれる深層強化学習の手法を提案しています。

ロボットアームに強化学習を応用する際に問題となるのが、前節で触れた探索にまつわるコストです。QT-Optでは、過去の探索時の経験データ(オフライン経験データ)を活用する学習フローを取り入れることで探索の回数を削減します。実際、ロボットアーム実機を用いた実験により、先行研究と比べて少ない経験データ数にもかかわらず、より高い把持成功率を達成したことが報告されています。

以下で、論文の詳細を見ていきましょう。

論文の実験設定

実験では、KUKAのロボットアームと把持対象の物体が置かれているトレイを用意し、トレイ内の物体を把持する問題を考えます(図1左図)。ロボットアームの先端には、グリッパーと呼ばれる2本指が取り付けられており、この指を開いたり閉じたりすることで物を掴みます。ロボットアームの肩にはRGBカメラが取り付けられており、このRGBカメラによってロボットアームはトレイ内を観測できるようになっています。

把持を強化学習の問題として扱うために、実験ではRGBカメラから得られた画像をもとに状態を定義しています。効率的な学習のため、画像に加えて、グリッパーが開いているか閉じているかを示すバイナリ値とトレイからの高さの情報も状態に含めています。行動はロボットアームをどのように動かすかを示す制御コマンドで、グリッパーの移動方向と移動量、回転量、グリッパーを開くか閉じるか、そして把持動作を終了するか否かといった命令からなります。最後に、報酬は物体を把持出来たときに1、それ以外は-0.05と設定しています。ここで、-0.05は把持までの行動回数が多くなりすぎないようにするためのペナルティとなっています。

ロボットアームの学習時は、図1右図で示した多様な物体を用いて把持を行って得られた経験データを用います。一方、評価の際には、学習時とは異なる物体を用いることで、把持能力の汎化性能、すなわち未知の物体にも対応できる把持能力を獲得できているかを検証しています。
左図は実験に用いられたロボットアームとRGBカメラからの画像。右図は学習時の把持対象物体。
図1 (左図)実験に用いられたロボットアームとRGBカメラからの画像。(右図)学習時の把持対象物体。[1] Figure 2. より。

QT-Optで学習したモデルの性能

ここでは、QT-Optで学習したロボットアームの評価結果を見ていきます。

把持成功率は96%という値が達成されています。強化学習を用いないLevine et. al. [2] の手法では、把持成功率は78%であり、QT-Optを用いることで大きく性能が向上しています。また、先に触れたように評価では学習時とは異なる物体を用いているため、この96%という数字からは十分な汎化性能が得られていることも分かります。

把持能力の定性的な評価結果については、公開されている動画にまとめられています。この動画を見ると、ロボットアームがかなり柔軟な行動をできるようになっていることが分かります。この動画の前半では、物体同士が密着しており掴む箇所がない場合に、ロボットアームが物体の位置を一度ずらしてから把持を行う様子を見ることができます。また、動画後半(1:25 ~) では、把持対象のボールを途中で動かし、把持の邪魔をした時の様子が報告されています。ロボットアームは、邪魔をされても、もう一度把持を試みて無事にボールを掴むことに成功しています。把持という目標を設定することで、このような複雑な行動をも学習できてしまうというのは非常に興味深い点で、学習後のロボットアームの性能に感動し、上の動画を何度も再生してしまいました。

オフライン経験データを用いたQT-Optの学習

さて、ここからはQT-Optについての説明をまとめていきます。QT-Optは先行研究に対して、安定性・複雑なタスクへの対応力や並列処理の点で工夫を加えています。ですが、全てを説明するとかなり長くなってしまうので、メインのアイディアとなる「過去の探索時の経験データの利用」に焦点を絞ってまとめていきたいと思います。

QT-Optは、深層強化学習の体表的な手法であるDQNを拡張した手法となっています。QT-Optの説明に入る前に、まずはDQN[3]について説明しておきましょう。

DQNは、Q学習と呼ばれる手法をディープニューラルネットワークに一般化した手法です。DQNの大きな特徴の一つに、「経験リプレイ」という仕組みがあります。前に、強化学習では探索により経験データを集めて、その経験データから学習を行うと述べました。Q学習では、探索で集めた経験データを一度学習に用いると、すぐに捨ててしまいますが、DQNでは集めた経験データを一時的なバッファにためておき、学習時はそのバッファからランダムに選んだ経験データで学習を行います。この仕組みが経験リプレイで、多くの深層強化学習手法で経験リプレイやその改良版が用いられています。

さて、QT-Optではこの経験リプレイを、過去の学習時の経験データ(オフライン経験データ)にまで拡張しています。DQNでは、一時的に経験データをためておくだけで、バッファがいっぱいになったら過去の経験データは捨てていき、学習が終わった時にはバッファに残っている経験データを全て捨ててしまいます。一方、QT-Optでは、過去の学習時の経験データを捨てずにストレージにためておき、次の学習時の経験データとして用います。探索を新たに行うのは、学習の最終段階だけで、少量の経験データだけを収集します。

アイディアはとてもシンプルなのですが、探索が高コストなロボットでは、探索したデータを効率的に再利用できるこの仕組みは非常に重要な工夫となります。ここで気になるのが、この仕組みで(1)オフライン経験データを用いた学習が上手くいくのか、そして(2)オフライン経験データはどのように集めるのが良いか、という点です。(1)については、実際に96%という高い把持成功率を達成できていることから、上手く学習できているといえるでしょう。この把持成功率を達成したときの学習の流れはこの後でもう少し詳しく見ていきます。(2)については、続く節にて論文のAppendix C.1について触れようと思います。このAppendixでは過去の経験データの内訳が学習結果に与える影響が考察されています。

それでは、オフライン経験データを用いたQT-Optの学習の流れをまずは見ていきましょう。QT-Optの学習は、大きく2つのフェーズに分かれています。学習の初期には、あらかじめ収集した経験データを用いてオフライン強化学習を行います。96%の把持成功率を達成した最終的な学習では、人間がプログラムした動作から得られた経験データや把持成功率が50%を超えた学習モデルの経験データを用いており、把持試行としては58万回分の経験データを学習に利用しています。学習が一定の段階まで進むと次のフェーズに移り、学習中のエージェントによる探索も行います。ここで新たに集める経験データは、オフライン経験データと区別するためオンライン経験データと呼びます。このフェーズでは、オンライン経験データをオフライン経験データに加えながら学習をさらに進めていきます。オンライン経験データはオフライン経験データと比べて少ないため、学習に使用するオンライン経験データの割合を徐々に上げながら学習を行うことで過学習を防ぎます。最終的な学習では、このフェーズで2.8万回の把持試行を行っています。

さて、QT-Optによるロボットアームの学習ではトータルで60.8万回の把持試行を行っているわけですが、Levine et. al. [2]の手法では、78%の把持成功率を達成するのに90万回分の把持試行データを必要としています。Levine et. al. の手法と比べると、QT-Optは必要な把持試行回数を削減したうえで把持成功率を向上させることに成功しています。とはいえ、60.8万回というのは極端に少ない数字というわけではなく、経験データの収集には7台のロボットアームを用いて、4か月という時間がかかっています。経験データ数を削減できているとはいえ、まだまだ長大な時間がかかっている点は今後の課題のように感じます。

オフライン経験データの内訳と性能への影響

さて、オフライン経験データを用いることで、必要な探索回数を減らせるというのがQT-Optの重要なポイントですが、このオフライン経験データはどんなものでも良いと言うわけではなさそうです。論文のAppendix C.1 では、シミュレーション環境を用いた実験で、オフライン経験データの内訳の違いが学習結果に与える影響が考察されています。この実験では二つのエージェント\pi_{scripted}\pi_{eval}を用いて、経験データを収集し、それらでオフライン強化学習を行ったときの把持成功率を比較しています。\pi_{scripted}は人がプログラムしたエージェントで、xy方向に対してランダムにグリッパーを動かし、開いたままのグリッパーをトレイのある下側に移動させて、グリッパーを閉じ、元の高さまでグリッパーを戻すというエージェントです。\pi_{eval}はQT-Opt による学習で得られたエージェントを表します。ただし、\pi_{eval} はQT-Optで完全に学習したものではなく、この実験に用いられたエージェントはどちらも30%程度の把持成功率となっています。

実験結果は表1のようになっています。ここで、D_{scripted}D_{explore}はそれぞれ、\pi_{scripted}\pi_{eval}を用いて収集したオフライン経験データを表しており、使用する経験データ数に応じて4パターンの学習を行っています。

オフライン経験データの内訳と把持成功率をまとめた表。
表1 オフライン経験データの内訳と把持成功率。[2] Table 9 より。


表1の1段目と2段目が、D_{scripted}D_{explore} のそれぞれで、30 万個のオフライン経験データを利用した場合の把持成功率です。3段目と4段目が、2種類のオフライン経験データをミックスした場合の結果となっています。この結果を見ると、1つのエージェントで収集したオフライン経験データのみで学習した時(1段目と2段目)と比べ、2つのエージェントで収集したオフライン経験データで学習した場合の把持成功率が大きく向上していることが分かります。また、3段目と4段目を比較すると、オフライン経験データ数が多いほど把持成功率が高くなっています。

この実験結果からは、異なる性質を持つ複数のエージェントで収集したオフライン経験データを用いることが把持成功率の向上に役立つことが示唆されます。もう少し掘り下げて、論文では次のような考察がされています。\pi_{scripted} はある程度のランダム性は持つものの、グリッパーを閉じるまでは常にトレイのある下側にグリッパーを移動させるため、このエージェントによって集められる経験データは偏ったものになります。一方、\pi_{eval}はベストな性能ではないものの、トレイと逆方向にもグリッパーを移動でき、より多様な経験データを収集することが可能です。このAppendixでの実験結果と、前節で説明した学習フローによる結果を踏まえ、低い把持成功率のエージェントを用いた経験データからスタートしても、学習とデータ収集を繰り返していくことで、高い精度の把持成功率を得るのに十分な多様性を持つオフライン経験データセットが得られるだろうと述べられています。

実験

ここでは、QT-Optの論文、特に最後に紹介したAppendix C.1を踏まえて行った実験とその結果を紹介します。これまでにも述べたように、ロボット実機による探索は高コストであり、ロボットに強化学習を応用する際には、必要な経験データ数を抑える必要があります。その方法の一つが、QT-Optの論文で提案されたオフライン経験データを使用した学習法です。論文のAppendix C.1 からはオフライン経験データの収集手順の違いが、最終的な把持成功率に大きく影響することが分かります。これから紹介する実験では、シミュレーション環境を用いてオフライン経験データの収集手順の違いと把持成功率の関係を実際に確認してみました。

実験設計

今回の実験では、論文[4] で用いられているロボットアームのシミュレーション環境を用いました(Githubで公開されています[5])。細かい点ですが、実験を行いやすいようにコードのGitHubリポジトリのIssue [6] をもとに環境リセット時の挙動をカスタマイズしています。 このシミュレーション環境は、論文と同様に、トレイ内の物体を把持するタスクを扱います(図2)。QT-Optの論文と異なる部分として、状態はRGB画像のみ、行動はグリッパーの移動量の指示のみとなっています。物体に近づくと自動でグリッパーが閉じ、把持試行が終わるという少し簡略化された環境です。

実験に使用したシミュレータ環境。
図2 実験に使用したシミュレータ環境。[4] Fig. 1. より。
このシミュレーション環境には、学習用の把持対象の物体が900種類、評価用の把持対象の物体が100 種類用意されており、QT-Optの問題設定と同じように学習時と評価時で異なる物体が使用されます(図3)。

学習と評価用の把持対象物体。
図3 (a)学習用の把持対象物体、(b)評価用の把持対象物体。[4] Fig. 2. より。
使用するモデルのアーキテクチャとしては論文[1] と同一のものを利用しています。

実験では、論文のAppnedix C.1 と同じように、人手でプログラムしたランダムエージェント\pi_{scripted}とQT-Opt で学習したエージェント\pi_{eval}を用意し、それぞれで集めたオフライン経験データで学習を行った結果を比較しました。ここでランダムエージェントについては、論文[4] と同じ「random policy」を流用しています(実装は[7]で公開されています)。このエージェントは、xy方向にランダムにグリッパーを動かしながらグリッパーを下げていくという点でQT-Optの論文の\pi_{scripted}と似た設計となっています。ただし、このエージェントでは一定の確率でトレイとは逆方向の上側にもグリッパーを動かすように設計されています。

実験では、 ①「オフライン経験データ数によって把持成功率がどう変化するか」と、② 「オフライン経験データの内訳の違いによって把持成功率がどう変化するか」の2つの項目を検証するため、オフライン経験データセットとして次のA ~ Cの3種類を用意しました:
  • A: \pi_{scripted}による10,000回分の把持試行を行って集めた経験データセット
  • B: \pi_{scripted}による100,000回分の把持試行を行って集めた経験データセット
  • C: \pi_{scripted}による50,000回分の把持試行を行って集めた経験データセット + \pi_{eval}による30,000回分の把持試行を行って集めた経験データセット
データセットA vs データセットB が①に、データセットB vs データセットC が② に対応しています(時間の関係上、実験C は実験B と比べエピソード数が若干少なくなっています)。 \pi_{eval} は、データセットAで学習したモデル(実験の独立性を上げるため、次の結果で報告するモデルとは別のもの)を使っています。データ収集に用いたエージェントの把持成功率はそれぞれ、\pi_{eval}が39%、\pi_{scripted}は40%で、同程度の性能のものを用いています。

結果

以下の表では、オフライン経験データの内訳と学習後の把持成功率を示します。それぞれのデータセットで、オフライン学習を2回ずつ行い、学習後の評価用環境での把持成功率の平均値を求めています。

データセット\pi_{scripted}による把持試行回数\pi_{eval}による把持試行回数把持成功率
A10K039%
B100K062%
C50K30K70%
表2 オフライン経験データと学習後の把持成功率。


考察

データセットAとデータセットB で学習した結果を比較すると、オフライン経験データ数が多いほど把持成功率が高くなっています。検証項目①については、一つのエージェント\pi_{scripted}だけの結果ではありますが、経験データ数が多いほど良いというなんとなく予想できる結果となっています。

一方、データセットBとデータセットCで学習した結果を比較すると、実験Cの方がエピソード数は少ないにもかかわらず、データセットCで学習したエージェントの把持成功率が高くなっています。検証項目②については、2種類のエージェントによる経験データで学習した方が良いという論文Appendix C.1で期待されている通りの結果となりました。ただし、論文Appendix C.1の結果と比べ、データセットBとデータセットCの把持成功率の差はそれほど大きくありません。これは、環境の違いと\pi_{scripted}の設計の違いが影響していると思われます。特に、この実験で用いた\pi_{scripted}は、上方向の移動もランダムに発生するため、論文Appendix C.1 の実験と比べ、学習に有利となるようなオフライン経験データセットを\pi_{scripted}だけでも作れてしまったのではないかと予想しています。

まとめ

この記事では、深層強化学習手法QT-Optと関連して行った実験について解説しました。ロボット需要の高まりを考えると、認識と動作を一貫して扱え、複雑な行動方法について学習できる強化学習はロボットを多様な環境下に実投入していくための必須技術になっていくと思われます。一方、必要な経験データ量や経験データ収集のコストから、強化学習のロボット分野における成功例はあまり多くありません。今回紹介したQT-Optの論文[1] では、オンライン経験データに加えてオフライン経験データを有効活用することで、現実的な設定のもとで強化学習を成功させています。

実世界でのロボットによる探索コストを踏まえ、オンライン、オフライン経験データの両方を用いる強化学習手法はQT-Opt以降も発展しており、2021年のCoRLではAW-Opt[8]やOff2OnRL[9]など新しい手法も提案されています。こうした手法を取り入れていくことで、強化学習はよりロボットへ応用しやすい技術になっていくと期待しています。

紙面の都合上この記事では解説できませんでしたが、QT-Optでは確率的最適化アルゴリズムによる連続な行動空間のサポートや分散処理アーキテクチャなど、他にも興味深いアイディアが取り入れられています。興味がある方は直接論文を確認してみることをお勧めします。

ALBERTでは、様々な専門的バックグラウンドを持つリサーチャー・アナリストを募集しています。また、今回ブログで扱ったロボットや強化学習についても研究を行っており、お手伝いしていただけるアルバイトメンバーも募集しております。興味を持たれた方は採用ページから詳細をご確認ください。

参考文献

  1. D. Kalashnikov, A. Irpan, P. Pastor, J. Ibarz, A. Herzog, E. Jang, D. Quillen, E. Holly, M. Kalakrishnan, V. Vanhoucke, S. Levine. QT-Opt: Scalable Deep Reinforcement Learning for Vision-Based Robotic Manipulation. In Conference on Robot Learning, 2018.
  2. S. Levine, P. Pastor, A. Krizhevsky, and D. Quillen. Learning hand-eye coordination for robotic grasping with large-scale data collection. In International Symposium on Experimental Robotics, 2016.
  3. V. Mnih, K. Kavukcuoglu, D. Silver, A. Graves, I. Antonoglou, D. Wierstra, and M. Riedmiller. Playing atari with deep reinforcement learning. NeurIPS Deep Learning Workshop 2013, 2013.
  4. D. Quillen, E. Jang, O. Nachum, C. Finn, J. Ibarz, and S. Levine. Deep Reinforcement Learning for Vision-Based Robotic Grasping: A Simulated Comparative Evaluation of Off-Policy Methods. In 2018 IEEE International Conference on Robotics and Automation, pp. 6284-6291, 2018.
  5. https://github.com/google-research/google-research/tree/master/dql_grasping
  6. https://github.com/google-research/google-research/issues/14#issuecomment-475109307
  7. https://github.com/bulletphysics/bullet3/blob/master/examples/pybullet/gym/pybullet_envs/baselines/enjoy_kuka_diverse_object_grasping.py
  8. Y. Lu, K. Hausman, Y. Chebotar, M. Yan, E. Jang, A. Herzog, T. Xiao, A. Irpan, M. Khansari, D. Kalashinikov, and S. Levine. AW-Opt: Learning Robotic Skills with Imitation and Reinforcement at Scale. In Conference on Robot Learning, 2021
  9. S. Lee, Y. Seo, K. Lee, P. Abbeel, and J. Shin. Offline-to-Online Reinforcement Learning via Balanced Replay and Pessimistic Q-Ensemble, In Conference on Robot Learning, 2021

The post QT-Optの紹介とオフライン経験データに関する実験 first appeared on ALBERT Official Blog.

流れ星に全自動で願いを送る装置を作る

$
0
0
こんにちは。先進技術部でアルバイトをしている河田です。
流れ星に自動で願いを送る装置の試作品を作りました。
本記事では、作るまでの過程と作動の様子をお見せします。
なお、装置を動かすプログラムや装置の土台の3DモデルなどをGithubで公開しています。

はじめに

始まりは約3年前、ALBERT春インターンの打ち上げでした。
ちなみに、私はこのインターンに参加した後、今日に至るまでアルバイトとしてALBERTで様々な分野の研究をしています。
私は当時、大学の授業で画像から流れ星を識別する課題に取り組んでおり、打ち上げでその話をしていました。

すると、インターンを担当してくれた社員の山内さんから「自動で流れ星を検出して願いを送信してくれる装置があったら面白そうではないか?」という話が挙がりました。当時は面白いアイデアだなと思いはしましたが、まさか実現するとは思っていませんでした。

話が動いたのは半年前の雑談でした。私がなんとなく流れ星の話を出したところ、「せっかくだしやりましょう、この機会に!」ということになり、プロジェクトが始まったのでした。しかし、私は大学・アルバイトで画像識別をメインに研究しており、流れ星の方向を向き願いを送信する装置を作る方法など想像もつきませんでした。そこで、色々な方法を調査、模索しながらプロジェクトを進めることになりました。当初は完全にふざけた企画だと思っていたのですが、調べれば調べるほど様々な知識や技術が必要であることが分かってきました。

ここで、本プロジェクトの概要を述べます。

「流れ星が現れてから消えるまでに願い事を3回言うと願いが叶う」という言い伝えがありますが、本プロジェクトの目的はこれを全自動で行う装置を作ることです。

流れ星は一般的に、出現してから消えるまで約0.5秒[1]と言われています。仮に流れ星が見つけられたとしても、人間が0.5秒で瞬時に願い事を3回唱えるのはかなり無理があります。また、流れ星を見つけるためには街灯などの明かりのない場所に寝転んで夜空を見上げ、流れ星が流れるのをひたすら待たなければなりません。
先進技術部の山内さんが撮影した流れ星。
一般に販売されているカメラでも撮影することができる。
そこで、全自動で流れ星を見つけ、流れ星を追跡しながら高速で願いを送信できる装置の出番です。上記の背景から、できるだけ早く流れ星にレーザーを向け、正確に流れ星を追跡する仕組みが必要になります。

流れ星を自動で検出する既存手法として「流星電波観測」という方法があります[2]。これは、流れ星により電波が反射することを利用する方法です。正確には、流れ星が発光する際に周辺の大気が一時的に電離し、電子濃度が高くなることで電波が反射するのですが、いずれにしてもこの方法で流れ星を検出することができます。
また、この流星電波観測を使って実際に流れ星に願いを届けるプロジェクトが既に存在しています[3]。街のイルミネーションなどともコラボしており、非常にロマンチックで素敵な企画が多数行われているようです[4]。

ただ、流星電波観測では流星の正確な位置を掴むことができません。また、上記の「願いを届ける」というのも、流れ星を検知したタイミングで画面上に願いを表示するというような手法をとっており、直接流れ星に向けて願いを送っているわけではありません(なんだか理屈っぽいですね)。

そこで、本プロジェクトでは流星電波観測を使わずにカメラで流れ星を検出し、検知した流れ星に直接願いを送信することを考えます。 本プロジェクトでは、以下の方法で星に願いを送信します。
  1. 夜空をカメラで撮影し続けて流れ星を検出
  2. 検出した流れ星に向かってレーザーを照射
  3. 願い事を0/1の信号に変換し、それに合わせてレーザーを点滅させることで願い事を送信
流れ星はどんなデータ形式でも願いを受け取ってくれるはずなので、レーザーの点滅で願い事を表現します。また、どんなに小さな光でも願いはきっと届くはずなので、今回は一般的なレーザーポインターを使います。

レーザー光照射位置の動かし方

本装置にはレーザー光を流れ星に向ける仕組みが必要です。しかし、レーザーポインター本体を動かすとなると重量もあり、動かすのに時間がかかることが予想されます。
そこで、本プロジェクトでは「ガルバノミラー」[5]を使用します。ガルバノミラーとは簡単に言うとレーザー光を反射する鏡のことです。2組の鏡を適切に動かしてレーザー光を反射させることでレーザーポインター本体の位置を変えることなくレーザー照射位置を高速に動かすことができます。
ガルバノミラー(1枚の場合)。
レーザーポインター本体を動かすことなく、レーザー光照射位置を大きく動かすことができる。
今回は鏡をモーターで回転させることを考えます。モーターを制御するために、本プロジェクトでは「Arduino」というマイコンボードを使用します。Arduinoを使うことで、複数のモーターにそれぞれ命令を送って動かすことができます。
そこで、モーターの先端に鏡を取り付けてモーターを動かすことで、レーザーを反射する角度を調節することにします。
Arduinoを使って二つのモーターを制御している様子。
モーターの先端についている鏡を適切な位置にセットすることで、レーザー光を目的地に照射できる様になる。
ガルバノミラーをはじめとした色々な部品は、完成した精度の高いものが売られており購入することができるのですが、今回は基本的に1から作るという方針で進めました。

ARマーカーの追跡実験 〜ひとまず動かす〜

さて、いよいよ装置を作っていくのですが、いきなり屋外で流れ星を探してレーザーを照射するのは現実的ではありません。そこで、まずは下図の「ARマーカー」を流れ星と見立て、レーザー光がARマーカーを追跡する装置を作ることから始めます。ARマーカーはOpenCVにより画像から簡単に識別することができます。
ARマーカー。
これを紙に印刷して追跡する。
まずは鏡を1枚だけ使用して、レーザー光を横方向に動かすことを考えます。
カメラでARマーカーとレーザー光をそれぞれ検出し、二つの位置の差が縮まるようにモーターを動かしてレーザー光をARマーカーに近づけます。
なお、レーザー光は単純に撮影画像の明るい箇所を探すことで検出します。
カメラで撮影されたARマーカーとレーザー光。
二つの距離を小さくするようにレーザー光を動かす。
では、実験に移ります。まず、レーザー光を鏡で反射できるように、レーザーポインターと鏡を同じ高さにセットします。ARマーカーの位置に合わせて鏡が回転し、横方向にレーザー光の照射位置が動く仕組みです。
また、投影する壁が撮影できる位置にカメラをセットします。
各部品を設置した様子。なんだか”夏休みの自由研究感”が強い…。
ARマーカーを追跡した結果がこちらです。

第一段階としてはまずまずの結果になりました。ARマーカーの動きに合わせてレーザー光がARマーカーを追跡している様子が見て取れます。
一方で、ARマーカーを高速で動かすと、追跡するまでの遅延が顕著になります。流れ星は短時間しか見えないため、遅延はできるだけ減らしたいところです。
ARマーカーを高速で動かした場合。
レーザー光が追いつくまでに時間がかかっている。
さて、横方向に動かすことができたので、次は鏡を2枚使って2回反射させることで、縦方向にもレーザー光を動かすことに挑戦します。これにより、目標地点にぴったりとレーザーを照射できるようになるはずです。
各部品を設置。高さを合わせなければならないので箱やノートを使って調節
この日は晴れでレーザーが検出しにくかったため、部屋を暗くできる自宅の和室で実験。
レーザー光はまず上の鏡で1回反射し、その後に下の、2枚目の鏡で再度反射して壁に照射されます。下図の置き方をした場合、上の鏡がレーザー光の横方向の移動、下の鏡が縦方向の移動を担当することになります。
なお、1枚目の鏡で反射したレーザー光は2枚目の鏡でも反射する必要があります。そのため、二つの鏡が離れていると、上の鏡を動かせる角度が非常に小さくなってしまいます。そこで、広範囲にレーザー光を照射するためには1枚目と2枚目の鏡の距離をできるだけ近づける必要があります。
二つのモーターの位置関係とレーザー光の反射の様子。
二つの鏡はできるだけ近づけたいが、近づけすぎると鏡がぶつかる。
この実験でもARマーカーを追跡しますが、ARマーカーの中心にレーザー光を照射するとARマーカーの識別できなくなってしまいます。そこで、今後の実験ではARマーカーの左上を目標地点としてレーザー光を照射することにします。 実験の結果、レーザー光がARマーカーを正しく追跡していることが確認できました。
ARマーカーの左上を正しく追跡することができている。
しかし、これらの実験を通して様々な課題が浮かび上がってきました。
  • 1秒あたりの動作回数が少なく、遅延も大きい
    • この装置を動かすためには、「撮影→ARマーカーとレーザー光の検出→モーターの操作」と複数の段階を踏む必要があります。そのため、1秒あたりに命令を出せる回数が少ないという問題があります(1秒間に5回ほど)。また、各段階の処理に時間がかかるため、撮影してからモーターを動かすまでの遅延が大きいという問題もあります。
  • 各部品の位置を毎回調節しなければならない
    • 特にレーザーポインターや鏡の位置はレーザー光の照射位置に直接影響し、少しずれると目標地点に照射できなくなってしまいます。また、持ち運びにも大変不便です。将来的に屋外で使うことになった場合を考えると各部品を固定する必要があります。
  • レーザー光を検出して用いている
    • この実験ではARマーカーとレーザー光の位置を検出していましたが、最終的にはレーザーは夜空に向かって照射する予定であるため、レーザー光を観測することはできません。また、レーザー光は撮影画像の明るい場所を選んでいるだけなので、実験する日の条件によりカメラの絞りやゲインを都度調節する必要があります。
      さらに、撮影した画像における距離と実空間の距離は1:1で対応していません。例えば、カメラからの距離などによっても1ピクセルあたりの実空間での長さは変わります(カメラに近いほど大きく写る)。そのため、撮影画像における距離(ピクセル)の差から鏡を動かすと正確な目的地に到達するまでに時間がかかります。レーザー光が大きく動く場合を確認してみると、目標位置に向かう際に揺れる様な動きを見せながら徐々に動きが止まる様子が確認できます。これは、実空間での距離ではなく画像内の距離からモーターを動かしていることが原因です。
レーザー光がぐるぐる回りながら目標地点に近づいている。
これらの課題を解決するために改良を行いました。

ARマーカーの追跡実験 〜装置の改良〜

まず、1秒あたりの動作回数が少なく遅延も大きいという問題は、プログラムを「マルチプロセス化(非同期処理)」することで改善しました。具体的には、撮影と、ARマーカーなどの識別と、Arduinoに命令を送る処理をそれぞれ別プロセスで行うことで、各作業を待つ時間が短縮され高速に動く様になりました(1秒間に50〜60回ほど)。

また、3Dプリンターで装置の土台を作ることで、各部品を固定しました。 土台のモデリングを行う前に、紙にイメージを書いて大きさや形を決めていきました。
各土台のイメージ図
まず、モーターに取り付ける鏡を固定する土台を作りました。これまではセロテープでくっつけていただけだったのですが、3Dプリンターで土台を作ることで、モーターに対して正確に、垂直に固定することができました。土台の裏がわからボルトで固定しています。
鏡を固定する土台(鏡の背面の赤い部品)。
モーターの中心が鏡の反射面になるように、鏡の厚さも考慮して作成した。
次に、モーターやレーザーポインターの位置関係を固定する全体の土台です。これを作ることで部品の位置を調整する必要がなくなり、正確な位置に部品を置くことができるようになります。モーターやレーザーポインターは該当箇所に収めた後、ボルトで2カ所から押さえつけることでガタガタと細かく動くことがないようにしました。
装置全体の土台。
手前の細長い直方体の部分にレーザーポインターをセットしている。
ナットが入る穴を用意し、ボルトで2カ所から部品を壁に押し込むことで細かく動かないようにしている。
さらに、上のモーターにカメラを取り付けることで、全ての部品を固定できるようにしました。
カメラ、レーザーポインター、モーターの位置関係を固定。
モーターの回転数を決めるプログラムにも改良を加えました。これまでは撮影した画像に映ったARマーカーとレーザー光の位置の差をピクセル単位で計算して、その値を元にモーターを動かしていました。しかし、OpenCVを用いることで撮影されたARマーカーの実空間での距離(x, y, z)を取得できることを利用し、計算の仕方を改良しました。これはつまり、カメラからARマーカーまでの距離が○[cm]という風に計算できるということです。
実空間での距離が分かれば縦方向と横方向にそれぞれどの程度の角度でレーザーを照射すれば良いかが三角関数で計算できるので、そこからモーターのステップ数を簡単に計算することができます。
実空間での距離からモーターの回転量を決めることで、目標地点に到達するための必要ステップ数がぴったり計算することができるようになります。そのため、目標地点の周りをグルグルと回りながら近づく挙動をしなくなるはずです。

また、使用するデータはARマーカーの位置だけなので、レーザー光を検出する必要がなくなります。そのため、撮影画像にレーザー光が映らない夜空を想定した実験でもうまく動くことが期待できます。
加えて、わざわざ明るさの調整なども必要なくなりました。

しかし、カメラの位置とレーザーが反射する鏡の位置は厳密には異なります。また、取り付けたカメラの傾きなども影響してくる可能性があります。
そこで、カメラ座標系から装置座標系への変換行列をMLP(多層パーセプトロン)で表現して事前に学習し、より正確なレーザー照射を可能にしました。学習するパラメータは平行移動用の3個と回転用の3個、合計6個と非常に少ないので、学習もGPUを使わずに高速に行うことができます。

それでは、数々の改良を行った装置で、ARマーカーを追跡してみます。
先ほどの実験と同様、レーザー光は常にARマーカーの左上に照射するように設定しています。結果を見てみると、かなり高速でARマーカーを動かしているのにも関わらず、低遅延で正確に追跡できている様子が確認できます。
動作中のモーターの動き。
また、流れ星を高速で追跡できても、出現した瞬間に素早く流れ星にレーザー光を照射できなければ追える時間は短くなってしまいます。そこで、流れ星が出現した瞬間を再現するために、ARマーカーが出現した後どのくらい素早く目標地点に到達できるかを実験してみました。ARマーカーは一部を隠すと識別できなくなるため、指で上部を隠しています。
結果を見ると、かなり高速で目標地点までたどり着いていることが確認できます。また、改善前のように目標地点の周りをグルグル回りながら近づくのではなく、一回の命令で正確に目標地点に到達していることが確認できます。

流れ星を追う実験

さて、ここまではARマーカーを照射目的として追跡する実験をしてきましたが、実際に流れ星を追う場合はどのくらい正確に、素早くレーザーを照射できるのかが気になるポイントです。
そこで、Youtubeで流れ星の動画[6]を探してスクリーンに映し、その流れ星にレーザーを照射する実験を行いました。
実際に流れ星を検出するためには、雲や他の星の瞬きなどのノイズの影響があるため機械学習を用いる必要があると考えられます。しかし、今回はノイズの影響は考えずに前後のフレームの差分を取り、明るくなった部分を流れ星だと想定して実験を行います。流れ星の場合、画像から実空間でのx, y, z座標を求めることができませんが、スクリーンに映すことからz座標(カメラからスクリーンまでの距離)は確定しています。そこで、ARマーカーを使った事前学習の結果を用いて実空間でのx, y座標を計算します。

実験は下図の様に装置をセットして行いました。流れ星の光は弱く、これを明るさの差分で検出するため、完全に真っ暗にできる部屋で実験を行いました。レーザー光自身を検出しない様に、赤色の成分が強い光は検出しないように閾値を調整します。
スクリーンに映った流れ星をレーザーポインターで追跡する
流れ星の前に、画面にPCのカーソルを表示して、それをレーザー光で追跡する様子をお見せします。赤い光がレーザーポインターで照射しているレーザー光です。カーソルを低遅延で正確に追跡できていることが確認できます。
次に、速度と現れている時間が違う二つの流れ星を追跡した様子をお見せします。白い光が流れ星です。流れ星が現れた瞬間は光が弱く追跡することはできませんが、光が強くなるとレーザー光は瞬時に目標地点に移動し、その後は高精度に追跡できています。
この実験より、作成した装置を使うことで流れ星を高速、正確に追跡できることが分かりました。

今後の展望

本プロジェクトでは流れ星をレーザーで追跡する装置を作成しましたが、実は肝心の「願いを送る」部分が搭載されていません。願いを送る実験の準備は済ませているのですが、レーザーを点滅させる処理が増えると遅延が大きくなる可能性があるので、今回は割愛しました。
なお、レーザーを点滅させて信号を授受する事前実験では、”Hello world.”を表す96bitのデータの送信を、0.03秒で正しく行えていることを確認しています。今後、実際に使う段階まで本プロジェクトが進むのであれば、こちらの処理も必要になります。

また、今回の実験では考慮しませんでしたが、実際に装置を屋外で動かすことになった場合は雲や星の瞬きなどのノイズの影響も考えなければなりません。機械学習を用いるのであれば学習データが必要です。また、流れ星を検出するための適切なモデルも検討しなければなりません。

他にも、屋外かつ無人で使うのであれば、Jetson Nanoなどの低電力で動作する開発ボードを用いてPC無しで動かせるようにする必要があります。また、流れ星の移動方向の予測や照射位置の精度向上など、まだまだやれることは残されています。

失敗談、大変だったこと

ここでは、本プロジェクトを行う上での失敗談や大変だったことを記します。

電子工作の知識が皆無
最初につまずいたのは電子工作の部分でした。ジャンパ線の端子にはオスとメスの2種類があることが頭から抜けており、オスのジャンパ線のみを購入していたため、ひとまずセロテープでくっつけてなんとかしようとしました。全て自宅での作業になるため、何か部品が足りないとその都度商品を購入して自宅に送る申請を出す必要があり、関係者の皆さんには大変お手数をおかけしました。
セロテープでなんとかしようとした。
なんとかならなかった。
また、モーターを動かすためのドライバーには「はんだ付け」が必要でした。日頃から電子工作をされている方であれば、はんだごては家にあって普通に使えるものなのかもしれません。しかし、私の家にはなかったので会社ではんだごてを購入していただき、頑張ってはんだ付けしました。
意外な難関「はんだ付け」
はんだ付け前(左)とはんだ付け後(右)
・部品の破損
マイコンボードのArduinoやモータードライバーは過度な電圧を加えると、それが一瞬であっても破損してしまいます。今回作成した装置は命令系統の5V電圧とモーターを動かすための12V電圧が混在しているため、最新の注意を払っていたものの…破損してしまいました。2度。壊すたびに新しい部品を購入して送っていただかなければならないので、冷や汗を流しながら連絡することになったのでした。
なお、Arduinoは部品を交換して復活させることができました。

・Jetson Nanoを使ってみたかった
本研究ではPCにArduinoやカメラをつなげて実験をしていたのですが、屋外で長時間動かすことを想定した場合、PCを使うのは現実的ではありません。
そこで、当初はJetson Nanoという小型かつ低電力で作動する開発ボードを使うことを考えていました。
しかし、いざ使ってみようとすると必要なライブラリが入らなかったり、PCでは反応したカメラが反応しなかったり、様々な問題がありました。
わざわざJetson Nano専用のカメラ(e-CAM24_CUNX)を会社で買っていただいたりもしたのですが、OSを1から入れ直す必要があり、非常に時間がかかってしまったので結局今回は使いませんでした。

・3Dプリンター初心者
3Dプリンターの使い方も知らず、これも1から勉強することになりました。3Dプリントは非常に時間がかかるため、予め出社する社員の方に印刷をお願いして、後日取りに行くということもありました。ご協力ありがとうございました。
ボルトも3Dプリンターで作れるということを知り実際に作ってみたのですが、小さすぎたのか、密度の設定に問題があったのか、かなり脆いボルトができてしまいました。装置の鏡を固定する部分に刺したボルトは途中で折れて取れなくなってしまいました。
3Dプリンターで作成したボルト
折れたボルト
取り出せなくなったボルトの残骸が今も残っている

まとめと感想

本プロジェクトでは、全自動で流れ星を検出してレーザーで追跡し、願いを届ける装置の試作品を作成しました。実際に流れ星に願いを届けられるようになるまでには更なる改良が必要ですが、目的のものを作ることができました。

はじめは何もかも分からず全てが1からのスタートでしたが、やったことのない分野を勉強して新しい何かを学んだり作ったりするのは非常に楽しかったです。
今回のプロジェクトでは主にアルバイトの私が装置やプログラムの作成を行いましたが、社員の皆さんに大いに助けられてここまでやってくることができました。
部内にも専門家の方がいたわけではなかったのですが、相談や質問などに快く応じていただきました。また、私物の道具や本を貸していただくなど非常に協力的な体勢を取っていただき、スムーズに作業を進めることができました。
部外の皆さんにも大変助けられました。様々な商品を購入するたびに細かい手続きや自宅への送付の手間がありましたが、こちらも迅速に対応していただきました。ありがとうございました。

残念ながら私はこの流れ星のプロジェクトを最後にALBERTでのアルバイトを終了することになるのですが、3年間の長い期間で本当に色々勉強することができました。物体検出やセグメンテーション、クラス識別をはじめとした画像識別から、ロボットアームの操作やそのシミュレーション、ArduinoやJetson Nanoを用いた制御、3Dモデリングに至るまで、様々な知識・経験をALBERTでのアルバイトで得ました。週2回で細々と続けてきましたが、この経験が大学・大学院での研究にも大いに活きましたし、今後も活躍すると信じています。

もし、「この流れ星プロジェクトを引き継いでやってみたい!」という方がいらっしゃれば、是非こちらからアルバイトを申し込んでみてください。

また、ALBERTは日本屈指のデータサイエンスカンパニーとして、データサイエンティストの積極的な採用を行っています。興味を持っていただいた方は、採用ページもご覧ください。

参考

[1] “流れ星は – キッズ ギャラクシー”. 宇宙科学研究所.
https://www.isas.jaxa.jp/kids/faq/q_a/038.html

[2] “流星電波観測の歴史と仕組み”. 流星電波観測国際プロジェクト.
https://www.amro-net.jp/about-hro/hro1_j.html

[3] “Meteor Broadcaster”. Bascule.
https://meteorbroadcaster.com/

[4] “NIHONBASHI – 願いの森”. Bascule.
https://bascule.co.jp/work/negainomori/

[5] “ガルバノスキャナ AtoZ”. 株式会社 ティー・イー・エム.
https://www.tem-inc.co.jp/galvano/

[6] “ふたご座流星群2017“ (CC BYライセンス). nontan3458.
https://www.youtube.com/watch?v=rC7DMnIRErM

[7] “L6470デイジーチェーン接続のテスト“. 北の国から電子工作(仮).
http://spinelify.blog.fc2.com/blog-entry-81.html

いずれも2022/02/22に参照。

The post 流れ星に全自動で願いを送る装置を作る first appeared on ALBERT Official Blog.

「Heart Rate Modeling and Prediction Using Autoregressive Models and Deep Learning」の紹介

$
0
0
こんにちは、ストラテジックアライアンス部のStaffiniです。
2020年10月から、東京大学の大学院工学系研究科バイオエンジニアリング専攻で客員研究員として、計算疫学やヘルスケアのためのAIアプリケーション等を研究しています。

今回は、心拍数に対する異なる予測モデルを用いて分析を行い、『Sensors』 というジャーナルで2021年12月にパブリッシュされた論文「Heart Rate Modeling and Prediction Using Autoregressive Models and Deep Learning(自己回帰モデルとディープラーニングによる心拍数のモデリングと予測)」(https://www.mdpi.com/1424-8220/22/1/34 )を紹介します。

初めに

生理的機能の時系列は多くの要因に影響されて、急激に変化することもあるため、非線形性/非定常性だと思われています。その結果、心拍時系列は予測や取り扱いが困難とされることが多くあります。しかし、心拍変動の振る舞いは、心血管疾患や呼吸器疾患、気分障害などの基礎疾患を示すこともあります。このような特定の疾患の予防と制御のためには、心拍変動の正確なモデリングと信頼性の高い予測を用いて、良いパフォーマンスを発揮する適切なモデルを特定することが重要です。

長年にわたり、多くの研究が正確な心拍数予測のための様々なモデルを提案してきました。例えば、[1]は線形自己回帰(AR)モデルや線形自己回帰移動平均(ARMA)モデルの性能を非線形モデルやバイリニアモデルと比較し、予測には非線形手法を用いるべきと提案しました。ここでも、より最近の研究([2]-[3])ではフィードフォワードニューラルネットワークを検討し、[4]では心拍予測にAdam最適化アルゴリズムで学習したLSTMモデルを提案しています。これらの最近の研究は、高い粒度でデータを収集していましたが、単一のモデルを提案しており、単一の参加者と短い時間での検証のみでした。

このブログで紹介されている論文[5]では、粒度を低く(分単位のbeats per minute (BPM) 予測)しましたが、複数のモデルを比較し、12人の条件の異なる参加者で結果を検証しました。

論文の内容

この論文の参加者は東京にある5つの会社から募集されました。本研究では、対象者は介入群に属する者のみとしました。参加者には、心拍数をBPMで計測するウェアラブルデバイスFitbit Versa(Fitbit Inc.)を提供し、24時間装着してもらい、またライフスタイルや過去・現在の病歴に関するモバイルアプリを用いたアンケートにも回答してもらいました。母集団の分布をより正確に把握して、モデルのパフォーマンスをより良く評価するために、異なる特徴や心拍数行動を持つ12名の参加者を選びました。

現在までの疾患数、喫煙/飲酒習慣、運動習慣に関する情報は、研究開始時に実施したモバイルアプリベースの自己報告式アンケートによって抽出されました。一部、参加者が常時デバイスを装着していなかったため、記録されなかった心拍数の欠損値は、等間隔の時間グリッドを得るために、欠損データを線形補間しました。また、欠損値の補完を埋め込むコストを最小限にするため、欠損値が少ないことを12人の参加者を選択する基準としました。さらに、予測モデルの学習に用いたデータは、10日間に計測されたデータに限定しました(参加者1人あたり合計14,400回の観測)。興味がある方は、元の論文[5]に参加者の選び方とウェアラブルデバイスについての詳細な説明がありますのでご覧ください。

表1は、年齢、性別、病歴、喫煙/飲酒習慣、運動習慣を含む参加者の特徴をまとめたものです。
表1: 参加者の特徴。

収集したデータは、トレーニングとテストセットに80:20の割合で分割されました(すなわち、最初の8日間のデータをトレーニングに、最後の2日間のデータをテストに使用しました)。そして、分単位の心拍数予測に対して、複雑さを増す3つの異なるアーキテクチャ(AR、LSTM、ConvLSTM)のパフォーマンスを比較しました。

AR(自己回帰モデル)
次数{p}のARプロセスは、時刻{t}の時系列の値{X_t}を、その前の{p}個の実現値{X_{t-1}},{X_{t-2}},{...},{X_{t-p}}を用いて、以下の式に従ってモデル化します。

{X_t = \beta_0 + \sum_{i=1}^{p}\beta_i X_{t-i} + \varepsilon_t .}

ここで{\beta_0}はモデルの切片、{\beta_1, ..., \beta_p}は遅行値の係数、{\varepsilon_{t}\sim WN(0,\sigma^2_{\varepsilon})}であります。関心のある変数の実現値{X_t}は、{p}個の過去の実現値とノイズ項の線形結合を用いてモデル化されるので、ARプロセスは線形時系列のモデル化に特に有用です。

ARプロセスの適切な次数{p}を見つけるために、自己相関関数(ACF)や偏自己相関関数(PACF)の分析がよく使われます。我々の場合、検討したすべての参加者について、{p=3}が適切であることが確認されました。

LSTM(長・短期記憶)
LSTM [6]はRecurrent Neural Network(RNN)の一種で、情報の流れを制御できるメモリセルが存在するため、特に時系列予測などのシーケンス予測問題に適しているとされます。具体的には、各LSTMセルには、忘却ゲート(どの情報を破棄するかを決める)、入力ゲート(入力からどの値を用いて記憶状態を更新するかを決める)、出力ゲート(入力とメモリセルから何を出力するかを決める)の3つのゲートが存在します。ある時間ステップ{t}における方程式は以下の通りであります。

{F_t = \sigma(W_F x_t + U_F h_{t-1} + b_F),}
{I_t = \sigma(W_I x_t + U_I h_{t-1} + b_I),}
{\tilde{C_t} = tanh(W_C x_t + U_C h_{t-1} + b_C),}
{O_t =\sigma(W_O x_t + U_O h_{t-1} + b_O),}
{C_t = F_t \circ C_{t-1} + I_t \circ \tilde{C_t},}
{h_t = O_t \circ tanh(C_t).}

ここで、{F_t, I_t, O_t}はそれぞれ忘却ゲート、入力ゲート、出力ゲート、{\tilde{C_t}}はセル入力活性化ベクトル、{C_t}はセル状態、{h_t}は LSTM セルの出力ベクトル、{x_t}は LSTM セルへの入力ベクトルです。{W_., U_., b_.}はそれぞれ学習過程で調整する重み行列とバイアスベクトルのパラメータ、{\sigma}はシグモイド活性化関数、{\circ}は要素ワイズ積を表します。
データの複雑さと非線形性をよりよくモデル化するために、LSTMの層を互いに積み重ねることができます。この論文では、3層のLSTMアーキテクチャを使用しました。最初の隠れ層には 50 個のセルが含まれ、2 番目には 25 個、3 番目には 10 個のセルが含まれます。オーバーフィッティングを回避するため、各隠れ層の後にDropout[7]を適用しました(学習中に各セルをランダムにドロップする0.3の確率を適用しました)。また、Dropoutは最大ノルム正則化と組み合わせて、各隠れ層の重みとバイアスの両方のノルムが3以下になるように制約しました。この論文はシングルステップ予測に焦点を当てているので、出力層は単一の完全連結ニューロンから構成されています。最適化アルゴリズムとして、Adam [8]を使用して、学習率は0.001であり、これは実際にうまく機能することが示されています。隠れ層の活性化関数としては、LSTMで用いられる標準的な活性化関数であり、高速に収束できることが多い双曲線正接(tanh)を用いました。重みの初期化方式として、深層ネットワークによく効くGlorot uniform initializer[9]を各層に適用しました。モデルは2000エポック学習して、文献でしばしば示唆されるオーバーフィッティングを避けるための正則化の別の形態として早期停止を採用しました。

ConvLSTM(畳み込み長・短期記憶)
ConvLSTM [10]はLSTMアーキテクチャのバリエーションで、入力から状態、状態から状態への遷移に畳み込み演算を用いて、問題を時空間シーケンス予測問題として捉え直したものです。与えられた時間ステップ{t}におけるConvLSTMのセル方程式は以下の通りです。

{F_t = \sigma(W_F \ast x_t + U_F \ast h_{t-1} + V_F \circ C_{t-1} + b_F),}
{I_t = \sigma(W_I \ast x_t + U_I \ast h_{t-1} + V_I \circ C_{t-1} + b_I),}
{\tilde{C_t} = tanh(W_C \ast x_t + U_C \ast h_{t-1} + b_C),}
{O_t =\sigma(W_O \ast x_t + U_O \ast h_{t-1} + V_O \circ C_t + b_O),}
{C_t = F_t \circ C_{t-1} + I_t \circ \tilde{C_t},}
{h_t = O_t \circ tanh(C_t).}

ここで、すべての定義はLSTMの説明と同じです。演算子{\ast} は畳み込み演算を表して、{V_.}は学習に用いる別の重み行列です。
我々は2層のConvLSTMアーキテクチャを検討して、第1隠れ層は50セル、第2隠れ層は25セルとしました。出力層は1つの完全連結ニューロンで構成されました。LSTMのアーキテクチャと同じで、最適化アルゴリズムにAdam、隠れ層の活性化関数にtanh、重みの初期化スキームにGlorot uniform initializerを使用しました。ConvLSTMはLSTMと同じエポック数で学習して、早期停止を適用しました。

モデルの性能評価には、損失関数としては平均絶対誤差(MAE)と、大きな誤差をより大きく罰する二乗平均平方根誤差(RMSE)を選択しました。

{MAE =\frac{1}{n}\sum_{i=1}^{n}\left | \widehat{y_i} - y_i \right |,}
{RMSE =\sqrt{\frac{1}{n}\sum_{i=1}^{n}(\widehat{y_i} - y_i)^2.}}

ここで、{\widehat{y_i}}{y_i}はそれぞれ、{n}個の観測値に対する予測された心拍数値と真の心拍数値です。
ニューラルネットワークは、学習時に確率的な要素(重みの初期化など)を内在していることから、その結果は実行のたびに変化します。そのため、各ディープラーニングアルゴリズムは、各参加者について50回実行されました。
表2は、各モデルについて50回実行した平均値(および括弧内の標準偏差)を示しています。太字は、参加者ごとの最良の結果を示しています。
表2: 各モデルのMAEとRMSE。
表で報告された結果は、最もパフォーマンスの良いモデルがAR(3)モデルであることを示しています。結果はモデル間でほぼ同じでしたが、対応なし{t}検定により、12人の参加者全員について、MAEとRMSEに統計的に有意な差があることが確認されました(p < 0.01)。また、検出力分析により、対象者全員について高い統計的検出力(90%以上)が確認されました。
図1は、参加者1のテストセットにおいて、3つのモデルによって生成された分ごとのHR予測を示しています。
図1。参加者1名の予測結果。

考察

表2の結果から、3つのアーキテクチャ(AR(3)、LSTM、ConvLSTM)は同様の性能を示しましたが、線形ARモデルによる予測はLSTMとConvLSTMよりも統計的に有意に優れていることが分かりました。

得られた結果は、3つの考察を浮き彫りにしました。まず、{t}分の心拍数値は過去 3 分間の心拍数値と相関があって、この情報のみで正確に予測できます。他の参加者(無作為抽出)のデータを追加解析したところ、ACF/PACFプロットにおいて同じパターンが観察されました。第二に、分単位の心拍数予測は、計算負荷の高いツールを必要とせず、比較的容易にユーザーから心拍数情報を収集するウェアラブルデバイス(Fitbitなど)から抽出したデータを用いて行うことができます。第三に、より複雑なモデルは、わずかに悪い心拍数予測を生成しました。これは、1つ目の考察と一致して、心拍数の分単位の変化が合理的に線形過程とみなせることを示しています。

結論

この論文の目的は、分単位の心拍数予測に用いる3つの時系列予測モデルを比較して、心拍数行動のモデル化および予測の点で最も優れた性能を持つアーキテクチャを特定することであった。年齢、性別、ライフスタイルにかかわらず、個人の1分間の心拍数は、過去3分間の心拍数値に大きく依存して、1分ごとの心拍数変動は合理的に線形過程とみなせることが示唆されました。これらの知見は、ウェアラブルデバイスに比較的単純なモデルを実装することで、ユーザーに有用な情報を提供して、心拍数値の異常を監視して病気の発症リスクに対応できることを示唆しています。

最後に

この論文の拡張として、同じ3つのモデルを用いて、より長い期間(例えば、次の10分間)、多段階の予測を行って、モデルの相対的なパフォーマンスが変化するかどうかを観察することを検討しています。さらに、調査を進めることで、よりパフォーマンスの高いモデルが特定されられるかもしれません。

最後に、ALBERTでは一緒に切磋琢磨できるデータサイエンティストを募集しています!興味をお持ちいただいた方は、こちら(https://www.albert2005.co.jp/saiyo/?place=blog0711)までお問い合わせください。

参考文献

[1] Christini, D.J.; Bennett, F.H.; Lutchen, K.R.; Ahmed, H.M.; Hausdroff, J.M.; Oriol, N. “Application of linear and nonlinear time series modeling to heart rate dynamics analysis”. IEEE Trans. Biomed. Eng. 1995, 42, 411–415.

[2] Yuchi, M.; Jo, J. “Heart Rate Prediction Based on Physical Activity Using Feedforward Neural Network”. In Proceedings of the 2008 International Conference on Convergence and Hybrid Information Technology, Daejeon, Korea, 28–30 August 2008; pp. 344–350.

[3] Xiao, F.; Chen, Y.; Yuchi, M.; Ding, M.; Jo, J. “Heart Rate Prediction Model Based on Physical Activities Using Evolutionary Neural Network”. In Proceedings of the Fourth International Conference on Genetic and Evolutionary Computing, Washington, DC, USA, 13–15 December 2010; pp. 198–201.

[4] Luo, M.; Wu, K. “Heart rate prediction model based on neural network”. IOP Conf. Ser. Mater. Sci. Eng. 2020, 715, 012060.

[5] Staffini, A.; Svensson, T.; Chung, U.-I.; Svensson, A.K. “Heart Rate Modeling and Prediction Using Autoregressive Models and Deep Learning”. Sensors 2022, 22, 34.

[6] Hochreiter, S.; Schmidhuber, J. “Long short-time memory”. Neural Comput. 1997, 9, 1735–1780.

[7] Srivastava, N.; Hinton, G.; Krizhevsky, A.; Sutskever, I.; Salakhutdinov, R. “Dropout: A simple way to prevent neural networks from overfitting”. J. Mach. Learn. Res. 2014, 15, 1929–1958.

[8] Kingma, D.P.; Ba, J. “Adam: A Method for Stochastic Optimization”. arXiv 2014, arXiv:1412.6980. Available online: https://arxiv.org/abs/1412.6980

[9] Glorot, X.; Bengio, Y. “Understanding the difficulty of training deep feedforward neural networks”. J. Mach. Learn. Res. 2010, 9, 249–256.

[10] Shi, X.; Chen, Z.; Wang, H.; Yeung, D.Y. “Convolutional LSTM Network: A Machine Learning Approach for Precipitation Nowcasting”. arXiv 2015, arXiv:1506.04214. Available online: https://arxiv.org/abs/1506.04214

The post 「Heart Rate Modeling and Prediction Using Autoregressive Models and Deep Learning」の紹介 first appeared on ALBERT Official Blog.

書籍紹介『教えたくなるほどよくわかる 数学の基礎講座』

$
0
0
eyecatch

こんにちは。データコンサルティング部の飯田です。普段は自然言語処理に関する業務に携わっておりますが、このたび『教えたくなるほどよくわかる 数学の基礎講座』の監修を務めました。著者は、小さい子どもからオックスブリッジを目指す学生まで、幅広い生徒に数学を教えるクリス・ワーリング先生です。今回はこちらの書籍についてご紹介します。

book

教えたくなるほどよくわかる数学の基礎講座 | ニュートンプレス (newtonpress.co.jp)

日本ではあまり馴染みがないかもしれませんが、ワーリング先生は数学の面白さを紹介する本を何冊も書かれています。たとえばこちら。

From 0 to Infinity in 26 Centuries:
The Extraordinary Story of Maths by Chris Waring (goodreads.com)


「数学書なのだから、公式や定理が窮屈そうに並んでいるのだろうな」と思って手に取ってみると、最初の章が “Prehistoric Maths” – 「先史時代の数学」なのでびっくりします。そして続く章は “Stone Age” – 「石器時代」。考古学の参考書でしょうか?それとも歴史学?いいえ、数学の参考書です。数学と歴史、一見奇妙な組み合わせですが、ワーリング先生は型にはまった教え方にとらわれません。自由な発想で数学の楽しさを伝えてくれます。

たとえば、ALBERTの業務でもよく使う「相関」について取り上げてみたいと思います。その昔使った教科書では、ピアソンの相関係数の公式がページの中央に鎮座して、その脇にいくつかの例題と練習問題が添えられているだけでした。そこには公式の生まれた背景もなければ、先人たちが解こうと欲した問題もなく、不出来な学生だった私にとっては、どうにも味気ないものに思えました。授業で学んだときの印象は「いつかどこかで使うかもしれない、便利な道具」でしかなく、試験のあとには長らく思い出すこともありませんでした。

しかし『教えたくなるほどよくわかる 数学の基礎講座』では、ピアソンの相関係数が生まれるまでの経緯を交えて、とても印象的に教えてくれます。本書では、19世紀の統計学者であるフランシス・ゴルトンについて触れています。彼はチャールズ・ダーウィンのいとこであり、その著作『進化論』に影響を受けたのか、親のすぐれた特徴を子に引き継がせるメカニズムに興味を持っていたようです。ゴルトンが卓越していた点は、当時まだ「進化」も「遺伝」も整理されていなかったのにも関わらず、この現象を統計学的アプローチで解明しようと試みたことです。彼は「回帰」や「標準偏差」といった重要な概念を次々と考案していき、最後に相関係数のアイデアを教え子のカール・ピアソンに託しました。そしてピアソンは、師の期待に応えて相関係数の定式化に成功したのです……。以上、ピアソンの相関係数が生まれるまでの物語でした。もっとも現実の歴史はそこで終わらず、彼らの創始した優生学は多くの事件に関わり、やがてタブーにさえなるわけですが。

いかがでしょうか。私にはもう、相関を単なる分析のツールとしては見られません。関連したいくつもの歴史的な事実が連想されて、共分散と標準偏差とが映画のワンシーンのように思えます。もはや、試験がないからといって忘れることはないでしょう。


ワーリング先生はこうした世界史のような切り口だけではなく、色々な題材を用いて数学の面白さに気づかせてくれます。

相関についてもう一例挙げてみると、疑似相関を説明するのに https://tylervigen.com/ というWebサイトを紹介しています。こちらのサイトでは管理人のタイラー・ビゲン氏が疑似相関とみなすデータが公開されており、特にワーリング先生のお気に入りは「アメリカの原発のウラン貯蔵量」と「数学博士号の取得者」の疑似相関のようです。もちろん、原発にウランを運び込むことで博士号の取得者が増えるわけではありませんね。ちなみに私のお気に入りは「モッツアレラチーズの消費量」と「土木工学博士号の取得者」の疑似相関です。


本書を読み進めていくと「こうした教え方をしてくれる先生が、自分にもいたらよかったな」と思わずにはいられません。私が数学の面白さに気づくには多くの出会いが必要でしたし、それ以前の私にとって、数学とは大人になるための理不尽な通過儀礼に過ぎなかったのです。同じ思いをされて、数学にすっかり苦手意識を抱いてしまった方も少なくないのではありませんか。

そうした方にこそ、本書を読んでいただきたいと思います。数学は一見無機質で、拒絶感さえ与えるものですが、教科書には書かれていない物語を紐解いていくと、リアルな世界とのかかわりが具体的にイメージできるようになり、ぐっと距離が近づいてきます。

ちょっとしたエッセイを読むつもりで、この数学書を手に取ってみませんか。

最後にちょっと宣伝を。ALBERTは日本屈指のデータサイエンスカンパニーとして、データサイエンティストの積極的な採用を行っています。興味を持っていただいた方は、採用ページもご覧ください。

以上です。それでは、ごきげんよう。

The post 書籍紹介『教えたくなるほどよくわかる 数学の基礎講座』 first appeared on ALBERT Official Blog.

2022年4月、ALBERTに12名の新入社員が入社しました。

$
0
0
2022年4月に行われた入社式は、対面形式での実施となりました。
(撮影は感染予防対策を講じたうえで実施しました)

今年は12名の新入社員が入社しました。

入社初日は感染予防対策を万全にした新宿オフィスに新入社員を迎え、社長、執行役員から新入社員へのメッセージ、さらに同期同士のエンゲージメントを深めるためのコミュニケーションワークショップなどが行われました。

■松本社長からお祝いのメッセージ

『超えられないハードルはない』

松本社長が経営者になったときに意識するようになったという、仕事の心構えについて話がありました。

「社会人になると様々な困難が現れるが、自分の前に立ちはだかるハードルは必ず超えられると思うようになった。それは過去の自分が蒔いた種であるはずだと。今後、みなさんにとって学生時代にはあまり経験したことのないハードルが出てくると思うけれど、『大丈夫、超えられる』と信じて対応していってほしい。」

と激励のメッセージを贈り、新入社員の皆さんは真剣な眼差しで松本社長の話を聞いていました。
新入社員へお祝いのメッセージを贈る松本社長

■コミュニケーション研修

チームで工夫するトランプタワーづくり

入社2日目には、新卒社員同士のコミュニケーションを促進するためのワークショップをおこないました。まずはトランプタワー。Aチーム、Bチームに分かれ、54枚のトランプでどちらが高いタワーをつくれるか挑戦。5分の作戦タイムを使って皆でアイデアを出し合い、いよいよ作業スタート!作業が始まると各自の役割に集中しつつも、みなさんよく声が出ていました。
作業の分担が速やかで、セロテープを一定の長さに切って用意する人、貼り合わせの作業に専念する人。「この貼り方はいいみたい」「ここが歪んでいるとバランスがよくないかも」と静かに作業をすすめるなかでも、それぞれが意見を出しながら意識を合わせていく様子もみられました。チームそれぞれの戦略で進めています。

組み立ての担当者は、どちらのチームも専任1名での作業。土台の歪みなど、専任ならではの気づきもあったようです。トランプが崩れてしまうと、残り時間で再度組み立てなければと、焦る気持ちが手を急がせます。1ゲーム目のチャレンジ終了時間が来てしまい、ここで高さを計測。

1ゲーム目ではAチームのタワーが高く、勝利。Bチームは改善に向けて真剣に相談。どの方法が最もよいのか。図形と寸法の計算が、彼らの頭の中ですごい速さでおこなわれ、次の形態が決まったようです。
そして、2ゲーム目の作業スタート!
Aチームは、ぐらつきを補正するための新アイデアで、三角柱を重ねて高さを作っていく作戦。

Bチームは、競合(Aチーム)の1ゲーム目の立て方を参考に、間に1枚のトランプをはさみながら立てるというやり方に。積み上げながら計測してみたり、さらに高くできそうか、とチャレンジで載せてみたり。

どちらも先ほどよりもより楽しそうに作業が進みます。

最後の計測ではBチームが84㎝の高さとなり…ここで、人事から終了のホイッスル! 1-1の引き分けということになりました。
その後、作業の振り返り、チームワークの振り返りをおこないました。
自分たちの計画と改善したポイントはどこにあったか?
Aチーム:上流の作業と下流の作業とのコミュニケーションによって、よりトランプタワーの品質が高まるのでは、と感じた
Bチーム:一回目の立て方では負けてしまったため、二回目では改善のポイントを探り作戦を立てた。さらに効率よく建てるためのアイデアを実施することで、高くすることができた。
それぞれの気づきが得られたようです。今回のゲームは勝敗を決めるというよりも、仲間とのコミュニケーションによってそのプロセスや結果を共有していくことに意義を見出せるような楽しく濃いワークショップでした。  次は、さらにお互いの理解を深めてもらうための、コミュニケーション型ワークショップを実施しました。

■コミュニケーション研修

共通概念を作り上げるためのディスカッション

12名がAチームとBチーム、6名ずつ分かれ、各チームのリーダーを1名選出。 アメリカでおこなわれた意識調査をもとに、動物ランキングを主観で作成し、各自の回答(ランキング)を踏まえたうえで改めて「チームとしての回答(ランキング)を決める」というワークショップ。

各チーム6名ずつに分かれて議論を進めます。

1つのチームのリーダーは、公平性のある平等な決め方の相談など、チームの仲間に合意できるかやり方かどうかを確認しつつ、決定へのプロセスを提案していました。

また、他方のチームリーダーは、皆の意見を踏まえて丁寧に順位を決め、チーム全員合意の回答としてまとめるように進めていました。

どちらのチームもそれぞれのチームメンバーの意見を尊重していました。

このコミュニケーション研修の最後には、ワークショップの意図について解説がありました。 「チームで話し合い、意見を出し、案を修正することによってより標準的な回答に辿りつく。合意のためのプロセスが、ビジネスにおいて意味ある結果を導く。」という説明を受け、それぞれのチームが出した答えの解釈にも納得感があったようです。

◆さいごに

今年は新型コロナウィルスの影響も鑑みながらも、対面での入社式、オリエンテーション、コミュニケーション研修の開催となりました。新卒メンバーの同期同士の関係性づくりに焦点を当てたワークショップ実施。その甲斐もあり、現在はお互いにサポートし合いながら学んでいる様子です。
そして、研修期間中は先輩社員との交流企画も設けられています。彼らがこれからも安心してALBERTで働き、成長できるよう部門間連携をおこないながら、サポートを続けていきたいと思います。

約3か月間の研修を経たあと、新入社員はデータサイエンティストとして各部署に配属されます。ぜひ、今後の活躍にご期待ください!

The post 2022年4月、ALBERTに12名の新入社員が入社しました。 first appeared on ALBERT Official Blog.

マイナビ主催学生向けイベントのDXセミナーに登壇しました。

$
0
0
ALBERTは、マイナビと共同で、学生から社会人まで総DX人材化に向けて、社会で活躍できるDX人材の育成を支援するサービスを提供しています。

今回は、6月4日開催のオンラインと6月12日開催のリアルイベントにALBERTのメンバーが登壇し、学生にとってまだあまり馴染みの少ないDXについて、少しでも興味を持ってもらい、社会人になったときのスタートダッシュに役立てもらうべく、DXの基礎的な考え方や具体的な事例紹介などを行いました。


6月4日 仕事研究&インターンシップWEB EXPO JAPAN【全国】

オンライン開催だった6月4日のイベントでは、「触れてみよう、知ってみようDX」と題して、マイナビ人事部長の谷本様とDX講座の人気講師でもあるALBERTデータサイエンティストの巣山、ファシリテーターとしてマイナビ編集長の高橋様の3名が登壇しました。

この日開催されたイベントの最後のプログラムであり、学生の方は果たしてDXに興味を持っているのだろうか、参加者が他のプログラムに比べて少ないのではないか、と開催前には少し不安があったものの、休日の夜にも関わらず、延べ参加者数1,200名を超える方が参加してくれました。
これには登壇者の皆さんも驚いており、私たちが考えている以上にDXに対する興味関心や具体的なスキル習得の取り組みへのニーズが高まっていると実感しました。

また、参加した方の学部も様々で、工学系からデザイン系まで、文系理系関係なく幅広い学部の皆さんが集まっていました。

講演では、DXとは何かという説明やマイナビで昨年実施したDXインターンシップの紹介、インターンや就職活動時のアドバイス等、後半は参加者からの質問に回答しながら進行していきました。



(コメント一部抜粋)
●株式会社マイナビ 人事統括本部採用部 部長 谷本 健次 氏
「入社時にあった方がいい知識とは?」という質問をよく受けますが、私は、スキルも大事ですが発想力がより重要だと思っています。資格試験(例えばITパスポートなど)を持っているから採用するというよりは、それに取り組んだ前向きさや、なぜ、何のためにその資格を取得したのか、という点を重視して評価をしています。

また、私がよく自社で話しているのは、エンジニアを目指す方には「社会に出たときどう役に立てるかを考えるビジネス視点を持ってもらいたい。」、エンジニア以外の職種を目指す方には「身近なことでも、今やっていることをデジタル化、自動化させるとどうよくなるかと考えたりする視点や発想力を大事にしてほしい。」ということです。


●株式会社ALBERT データサイエンス教育部 セクションマネージャー 巣山 剛 氏
DXやデータサイエンスという分野は、必要とされるスキルが幅広く、必ずしもひとりで全ての能力を習得して実践していく、という必要はないと思います。一方で、社会人になったときにDXにつながる考え方が何も身にいていないとついていくのが大変なので、少なくとも「基礎的なITリテラシー(意識)」、「課題発見力(仮説思考)」、「ロジカルシンキング」「データを活用した検証(データを読む力)」の4つのスキルは身につけておくことをおすすめしています。


●ファシリテーター:株式会社マイナビ 就職情報事業本部 マイナビ編集長 高橋 誠人 氏
まずは、自分の成長のために挑戦することが大事です。学生なら、失敗してもたくさんチャレンジができます。
主体性をもって、とよく言われると思いますが、以前の「主体性」は仕事終わりに自分から「何か手伝えることはありますか?」と聞くこと等だったかもしれませんが、今は意味合いが変わってきたと感じています。自分で課題を見つけ、解決方法を考えながら多様な人材と協力して変えていけるかを考えられる人、が今求められている「主体性」のある人材、と言えるのではないでしょうか。



6月12日 仕事研究&インターンシップEXPO 東京会場

翌週は、東京ビッグサイトにて開催された大型のリアルイベントでの講演でした。

「AI・データ分析専門企業から学ぶ総DX人材化」をテーマに、株式会社ARISE analytics の執行役員でChief Workstyle Officerの佐々木様、ALBERT執行役員でデータサイエンス教育部長の平原、ファシリテーターとしてマイナビ編集長の高橋様の3名が登壇しパネルディスカッションを行いました。

久しぶりのリアル開催ということもあり、会場では多くの学生の皆さんの熱気が感じられました。プログラム参加の予約時点で満席。半数以上は文系の方で、また、女性の方が多く幅広く興味をもってお集まりいただきました。(EXPO最後のセミナーだったにもかかわらず、多くの方にご来場いただきました!)

会場では、ほとんどの学生の方がDXについて詳しくはないが興味は持っている、というやりとりがあり、3段階に分類されるデジタル化のうちDXと呼ばれるものはどのような位置づけにあるかの説明や政府によるDX推進の取り組みやその背景などが紹介されました。

また、デジタル人材とよく言われるなか、分析を行う人材だけでなく戦略やプロジェクトを推進する人、分析結果をシステム化して活用する人など様々な役割の人材が必要であることや、さらに「文系専攻の学生でも今から勉強してデジタル人材になれるのか?」という質問に対してはそれぞれ登壇者から、文系人材がDX人材としてどのような活躍の場があるのかをお話しました。

さらに、日常生活でも課題を見つけ、デジタルを活用してどう改善できそうかを考え、できることから実行していくサイクルが重要という話のなかでは、実際に参加した学生の方のアイデアを出してもらうなど、インタラクティブな交流もあり盛り上がりました。


(コメント一部抜粋)
●株式会社ARISE analytics 執行役員 Chief Workstyle Officer 佐々木 彰 氏
学生のうちにどんなスキルを学んでおけばいいかをよく聞かれますが、技術の進歩はとても早いため、今の最新技術を学生の方が学んでも、数年後に就職していざ使おうとしたらもう古くなっているかもしれないですよね。それよりも、新しいことにいかに早くキャッチアップしていくか、という訓練をするのがいいと考えています。

例えば、技術の仕組みを早く把握してクイックに実装してみることで、「これはこういう仕組みだと思うから、じゃあ自分はこうしてみよう」という動きができるようになります。これを繰り返して、考え続けることが大切です。
先ほどのアイデアだと、プロトタイプのアプリを作って学校に持ち込んでみるといいかもしれない。また、実際に出来上がらなかったとしても、それにチャレンジしたということが重要ですよね。


●株式会社ALBERT 執行役員 データサイエンス教育部長 平原 昭次 氏
学生のうちに、どんどん旅行に行くことをお勧めします。なぜなら、いろんな場所へ行って人と話したり、様々な体験を通して「気づく力」が身に着くからです。デジタル人材、特にDXの「X」トランスフォーメーションに向いているのは「いろんなことに対して疑問を持てる人、気がつく人」だと考えています。

東京にいると気づきにくいですが、地方に行くことで少子高齢化及び労働人口の減少によって、デジタル活用の必要性の視点でみると、多様な課題をより実感しやすいため、一足先に未来を見ているとも考えられます。旅行を楽しみながらも、デジタルを活用してもっとこうすれば、この問題を解決できるかも?社会がより良くなるのでは?という姿勢で考える機会をたくさん持ってもらいたい。


●ファシリテーター:株式会社マイナビ 就職情報事業本部 マイナビ編集長 高橋 誠人 氏
人生100年時代のなかで、これからさらにデジタル活用によるビジネスモデルの変革は待ったなしで進んでいきます。そのなかで、デジタルを活用できる、もしくは活用してビジネスを作れることは、皆さんのキャリアにおいて有利にしかなりません。学生のうちだけではなく、就職してからも学び続ける姿勢が今後ますます重要になります。自分で仮説を立て、課題解決の方法を考え実践していく、それを早いサイクルでどんどん繰り返していくことの重要性を本日学べたと思いますので、忘れないうちにぜひ実践していってください。



就活準備サイト『マイナビ2024』では、DXの定義や各業界におけるDX動向などの基礎知識を学習できる「DXがわかる!超基礎講座」​が提供されています。

マイナビの保有する人材採用・就職支援に関する知見やビッグデータと、ALBERTの持つ分析技術や専門人材育成ノウハウを活かして作られたプログラムで、専門用語などの丁寧な解説や豊富な事例を用いた説明により、どのようなスキルレベルの方でも理解しやすい内容となっています。



ALBERTでは、社内教育で培ったデータサイエンティスト育成サービスを提供し、企業の人材育成を支援しています。また、採用を積極募集していますので、少しでも気になるという方は、お気軽にお問い合わせください。

The post マイナビ主催学生向けイベントのDXセミナーに登壇しました。 first appeared on ALBERT Official Blog.

Isaac Gym で myCobot の把持タスクを強化学習してみました。

$
0
0
こんにちは、先進技術部です。前回のブログ(「RealSense D455による空間認識でmyCobotを操作」)に引き続きmyCobotを使った実験について紹介します。今回は実機ではなくシミュレーターでの実験になります。ロボットを用いた深層強化学習を行いたいとき、実機で大量の学習データを用意するのは難しいですが、シミュレーターなら簡単に大規模データセットの収集ができます。しかし、シミュレーターは触ったことがない人にとってはかなり取っつきづらい印象があると思います。今回Nvidiaが開発しているIsaac Gymを使ってみたところ、ほぼPythonのコードを弄るだけで実験環境作成から強化学習まで実現できたので、その方法について紹介します。

1. はじめに

1. 1. Isaac Gym とは

Nvidiaが開発する強化学習のための物理シミュレーション環境です。OpenAI Gymのライブラリを基に作られていますが、物理シミュレーションの計算がGPU上で実行され、結果もPytorchのGPUテンソルで受け取ることができるため、高速なシミュレーションと学習が可能です。物理シミュレーションはPhysX *1 で行われ、FleX *2 によるソフトボディシミュレーションにも対応しています(ただしFlexを利用する場合は一部の機能が制限されます)。 2023年1月現在の最新版はPreview4です。Preview2まではバグが目立っていた印象ですが、3以降は改善されていて機能追加もあり、非常に魅力的なシミュレーション環境になっていると思います。将来的にはIsaac Simに統合されたOmniverse Isaac Gymがリリースされる予定ですが、Isaac Gym自体はスタンドアローンに開発されていてPythonのみで実験ができます。以前のブログ(「GPUサーバ増設とA6000のベンチマーク」)の最後でも、Omniverse Isaac Simulatorを用いた研究開発に着手している事に触れましたが、まずは強化学習シミュレーションに注力するためにIsaac Gymの利用を進めました。 Isaac Gym がOmniverseに統合された際の一番のメリットは、レイトレーシングや高精度な連続体シミュレーションなど、フォトリアリスティックなビジュアルを使った画像認識などが行えることでしょうか。今後の動向が楽しみです。 *1 PhysXはNVIDIA社が開発する物理演算エンジンです。シミュレーター上でGPUによるリアルタイムな物理演算を可能にします。Isaac Gymで利用されているバージョンについて公開されているarXivやドキュメントに明記されていませんが、発表時期とFleXと分離されていることからPhysX 4を基にしている思われます。OmniverseではPhysX 5が使用されFleXも統合されています。 *2 FleXはPhysXと同じくNVIDIA社が開発する物理演算エンジンですが、こちらでは粒子ベースのシミュレーションにより軟体や流体の表現を可能にします。

1.2. 本記事の趣旨

Isaac Gymを使って簡単に強化学習タスクを作成・学習できました、という話をします。実際のテストケースとして前回の記事で紹介したmyCobotをシミュレーション環境にインポートして作った物体把持タスクを紹介します。

1.3. 動作環境

PC1:Ubuntu 20.04, Python 3.8.10, Nvidia RTX A6000  PC2:Ubuntu 18.04, Python 3.8.0, Nvidia RTX 3060Ti  2つの環境で動作を確認できました。またNvidia Driver 470以降が必要である点にも注意してください。

2. インストール

この章ではIsaac GymとIsaacGymEnvsをインストールします。  推奨環境はUbuntu 18.04, 20.04、python3.6~3.8、Nvidia Driver>=470です。 Isaac Gymのsetup.pyにpython_requires<3.9が記述されているため3.9以降ではそのまま使えません。 Ubuntu 22.04でのテストは行っていませんが、おそらく問題ないと思います。

2.1. Isaac Gym

Isaac Gym本体はNvidiaのデベロッパーページで無償ダウンロードできます。ドキュメントはパッケージ内のdocsディレクトリにHTMLで保存されています(ホームページ上にはないので注意してください)。ダウンロードが完了したら以下でインストールできます。
$ cd isaacgym/python
$ pip install -e .
ただしpytorchが "torch>= 1.8.0", "torchvision>=0.9.0"**で指定されているため、お手持ちのGPUを使用する際は先に公式のページから自分の環境に合ったものを先にインストールしましょう。また、DockerやCondaの仮想環境セットアップファイルも用意されています。私はvenvでpythonの仮想環境管理しているためpipで話を進めていきます。 ** code blockの問題で「>」を全角で書いてます.

2.2. IsaacGymEnvs

IsaacGymEnvsはIsaac Gymで強化学習環境のベンチマークテストができるpythonパッケージです。実装されたタスクを参考にすることで、rl-gamesに実装された強化学習アルゴリズムを利用して簡単に強化学習環境を構築できます。自分で強化学習アルゴリズムを書こうと思っている人も、一度こちらを使ってIsaac Gymでの学習を試してみるといいと思います。元々はIsaac Gymに含まれていましたが、Preview3で切り離され、GitHubに公開されています。
$ git clone https://github.com/NVIDIA-Omniverse/IsaacGymEnvs.git
$ cd IsaacGymEnvs
$ pip install –e .
これで必要なインストールは完了です。

3. デモ

インストールしてパッケージ内を見ると、かなり豊富なサンプルが用意されていることがわかります。詳しくはドキュメントでも紹介されているので、この記事では4章のオリジナル強化学習環境にも関係してくるサンプルを紹介します。環境を準備できる方は文章を読むより、とりあえず実行してみて「こういうことができるのか~」と体験した方が良いと思います。「こんなことしてみたい」があるときは一度サンプルを見てみるとAPIの使い方がわかるかもしれません(わからなかったら頑張ってドキュメントを読みましょう)。

3.1. Isaac Gym

Preview4時点で27個のサンプルがあります。

・1080_balls_of_solitude.py 

python 1080_balls_of_solitude.py [options]  ピラミッド型に配置されたボールが落下してきます。optionなしだと環境内のボール(1つのピラミッド型に配置されたボール群)のみが衝突し、別の環境のボールとの衝突は無視されます。 --all_collisionsオプションで他の環境とも衝突し、 --no_collisionsオプションで同一環境内のオブジェクト同士も衝突しなくなります。  このスクリプトからオブジェクトを環境内に配置する create_actor関数の引数設定がわかります。 

・dof_controls.py 

python dof_controls.py OpenAI gymでおなじみのCartpoleを3次元にしたアクターが動きます。  このスクリプトでは、ロボットのDOF(degrees of freedom)についてコントロール方法の設定がわかります。選択できるコントロール方法は位置・速度・力の3つで関節ごとに設定できます。設定した方法以外でのコントロールはできず、シミュレーション中に変更することもできません。この設定を忘れているとオブジェクトが動かなくて沼ります。

・franka_nut_bolt_ik_osc.py 

python franka_nut_bolt_ik_osc.py  Franka社製多関節ロボットアームPandaがナットを拾ってボルトに回し入れる動作を見られます。アームの操作方法はIK(Inverse Kinematics)です。ファイル名にOSCと書いてありますが実装されていませんでした。franka_cube_ik_osc.pyにはOSC操作も実装されています。  Preview4で追加されたSDF collisionを使った高解像度な衝突ファイル読み込みによりナットとボルトの溝の衝突計算ができます(図1)。SDF読み込みは初回かなり時間がかかりますが、2回目以降はcacheから読み込まれるためすぐに動き始めます。
図1: pandaアームがナットをボルトに回し入れるシミュレーション

・interop_torch.py 

python interop_torch.py  カメラのセンサーデータを直接GPUで取得する get_camera_image_gpu_tensor関数の使い方がわかります。普通の実機カメラと同じようにデータをOpenCVで画像ファイル出力できます。実行するとinterop_imagesディレクトリを作成してカメラ画像が保存されます。  シミュレーションデータをGPUとCPUでやり取りしないので高速な画像処理が可能です。ただし、マルチGPU環境だとエラーが出ます。ForumでCUDA_VIDIBLE_DEVICE=0等で使用するGPUを限定すれば回避できる可能性を提案されましたが、今回使用した環境はその方法でエラー回避できませんでした。 

3.2. IsaacGymEnvs

14個の強化学習タスクが実装されていて、tasksディレクトリにあるスクリプトからベンチマークテストができます。  ・設定ファイルについて  各タスクにyamlで記述された設定ファイルが用意されています。共通の設定はcfgディレクトリのconfig.yamlにあり、hydraで読み込むためコマンドラインオプションでyamlを変更することなく設定変更ができます。それぞれのタスクの環境やPhysXの細かい設定はcfg/task/ディレクトリに、アルゴリズムの選択や構造はcfg/train/ディレクトリに保存されています。  ・アルゴリズムの実装について  強化学習アルゴリズムはRl-gamesのPPO実装を使っています。docsのrl_examples.mdにはSACを選択する設定もあるように書かれていますが現状のリポジトリには存在していません。  NN層は基本的にMLPで、RNN層としてLSTMが組み込まれているものもいくつかあります。CNN層を入れることもできますがサンプルには組み込んだものはありません。5.2節でCNN層を入れてみた話をします。 以下のサンプル実行はtrain.pyがあるisaacgymenvsディレクトリ上でします。 

・Cartpole 

python train.py task=Cartpole [options]  おなじみCartpoleの棒を倒さないようにカートを動かすやつです。デフォルト設定100 epochの学習が、PC2のRTX 3060Ti環境で2分弱、headless(viewerを起動しない)だと15秒で終わりました。学習結果を使って推論テストをするとちゃんと棒が倒れないようになっています(30 epochも学習すれば十分倒れなくなっています)。 それ以上でも以下でもないですが、簡単なタスクがちゃんと学習できていると安心します。 

・Franka Cube Stack 

python train.py task=FrankaCubeStack [options]  Pandaアームで箱を積むタスクです。7軸アームのstep毎の関節動作を学習します。デフォルト設定は10,000 epochになっていますが1,000 epochくらいでだいたい動作が学習できています。PC1のRTX A6000環境だと1000 epochの学習が20~30分程度で完了しました。学習前後の様子が図2,3です。ランダムに動いているだけの状態から箱をしっかり掴んで積むことができるようになっています。 Actionはアーム関節の7次元。observationは合計26次元 * です。rewardは箱へグリッパーを近づける、箱を持ち上げる、箱同士を近づける、箱積みタスクの成功の4段階に場合分けされたrewardが設計されています。rewardに関係するデータにそれぞれ(おそらくトライアル&エラーで設計された)スケールが掛けられています。 このレベルのタスクなら結構簡単に学習できてしまうことに驚きました。とはいえ世界座標が定義され、それぞれのオブジェクトの位置と姿勢などがわかっていることが前提なのでこの学習結果を実機にすぐ適用できるかと言うと……。 * observationの26次元内訳
  • 移動させる箱の位置と姿勢で7次元 
  • 積む箱から移動させる箱へのベクトルで3次元 
  • グリッパーの把持位置と姿勢で7次元
  • 7軸アームの関節+グリッパーの指で9次元
図2: 学習前のFrankaCubeStack
図3: 学習後のFrankaCubeStack

train.pyのよく使うオプション 

  • headless (default: False): Trueのときviewerを起動しません。重たい学習をしているときや、カメラ撮影しているときはviewerを起動しているとかなり遅くなってしまうのでよくheadless=Trueにします。 
  • test(defalut: False): Trueのとき学習モードをオフにします。環境生成や学習結果の確認のときに学習はせずに環境を動かせます。 
  • checkpoint(default: ’’): 読み込む重みのpytorchファイルです。学習結果はruns/<task name>/nn/<task name>.pthに保存されます。学習の再開や推論テストに使います。 
  • num_envs(default: int): 並列学習する環境の数です。テスト時にviewerが重くならないように適度な数を設定します。(学習時にも設定することが出来ますが、バッチサイズと干渉してエラーを起こす * ためコマンドラインから設定する意味はあまりないです) 
* trainコンフィグで horizon_length, minibatch_sizeが設定されていますが、 batch_size = horizon_length * num_actors * num_agentsであり、 batch_sizeminibatch_sizeで割り切れなければなりません。そして、 num_actorsnum_agentsは当然 num_envsに比例するため、 num_envsだけを変更するとエラーになります。 他のサンプルも環境さえあれば手軽に面白いテストが体験できるので試してみてください。

3.3. ViewerのTips

  • collisionメッシュの描画 
シミュレーターは基本的にオブジェクトのvisualメッシュを描画しますが、Isaac GymのViewerではcollisionメッシュの描画に変更できます。図4のようにメニューウィンドウをViewerタブに変更してRender collision meshesにチェックを入れると変更できます。変な挙動をしているオブジェクトがある場合はまずcollisionメッシュがちゃんと読み込まれているか確認してみましょう(visualとcollisionでメッシュの向きがおかしくなっていたり、そもそも読み込まれていなかったり、細かいメッシュが再現できていなかったりはシミュレーターでよくあります)。
図4: collisionメッシュの描画
  • 描画環境を減らす 
設定を変更せずに1つの環境のみを描画することができます。図5のようにメニューウィンドウのActorsでShow only selected envにチェックを入れると選択されている環境のみの描画になります。おかしな挙動があるときに環境番号を出力するようにしておけばその環境番号のみを描画することでデバッグができます。描画も軽くなってfpsが上がります。
図5: 描画環境の番号指定
  • 初期カメラ位置の変更 
初期カメラ位置と姿勢はgymapiのviewer_camera_look_at(viewer, middle_env, cam_pos, cam_target)で決めます。学習用のタスクスクリプトではset_viewer関数をオーバーライドして変更する必要があります。 

4. オリジナル環境・タスク作成

いよいよ本題のオリジナルタスク作成です。

4.1. 前準備

スクリプトとコンフィグなどの用意をします。学習モデルを実機に適用するまでを目標にしているので、箱を持ち上げるだけの簡単なタスクを学習してみました。 myCobotによるオブジェクトピッキングなのでMycobotPickingというタスク名で作成を進めます。  必要なのは、 
  • tasks:メインのpythonスクリプト 
  • cfg/task:環境やシミュレーションの数値データなどを記述したyamlコンフィグ 
  • cfg/train:学習アルゴリズム・NN層・パラメータなどを記述したyamlコンフィグ 
の3ファイルです。今回は、上記でも紹介したFrankaCubeStackが近いタスクなので参考にしてそれぞれのファイルを作成しました。特にコンフィグファイルは忘れると動かないものが多いので、コピーしてタスク名だけ変更しました。あとは適宜編集して使います。  またデモで紹介したように、train.pyからコマンドラインオプションでtaskのスクリプトを読み込むために、tasksディレクトリのinit.pyに作ったタスククラスのimportと、引数に入れるときのタスク名を追加します。

4.2. 環境作成

タスクのクラスはtasks/baseディレクトリのvec_task.pyのVecTaskクラス を継承して作成します。 タスクは図6のような構成になっています。
図6: タスクの構成。オレンジ枠のものは編集不要、緑枠のものはタスクごとに作成する。

4.2.1. __init__の処理 

  1. シミュレーターと環境の作成 
  • create_sim: シミュレーターのインスタンスを生成します。処理自体は親クラスで定義されているため、プロパティをコンフィグファイルで設定します。とは言っても重力やstepの単位時間の設定なので、FrankaCubeStackと同じで問題ありませんでした。またこの関数内で下2つの関数を使って地面とアクターの生成を行います。 
  • create_ground_plane: 地平面を生成します。平面の法線方向を入力にします。平面でない地面を作りたい場合はexampleのterrain_creationが参考になります。 
  • create_envs: アクターのファイル読込み・プロパティ設定・生成、環境の並列化を行います。今回のタスクではmyCobotをURDFから、ターゲットオブジェクトの直方体をAPIの create_boxから生成しました。myCobotのURDFは前回の実機のときにMoveItで使っていたものを基に、ピッキングのためにグリッパーを接続しています(グリッパー周りの詳細な話は5.1節で紹介しています)。 
  1. データ初期化 
  • init_data: コンフィグファイルから読み込んだ環境の変数定義と、Isaac Gym(PhysX)で処理されたデータテンソル用のバッファを用意します。状態・rewardの計算に必要なデータをクラス変数として定義します。APIでバッファに読み込んだテンソルはstep毎にそれぞれのrefresh関数を呼び出すことで更新されます。 

4.2.2. stepの処理

  1. ステップ処理 
メインのstep関数は親クラスで定義されているため変更不要ですが、以下のstepの中で実行される2つは、抽象メソッドのため定義が必須です。 
  • pre_physics_step: actionを使ってactorを操作します。 actionのサイズはコンフィグの[”env”][“numActions”]で定義します。myCobotの6軸アームとグリッパーの開閉で7次元にしました。 
  • post_physics_step: observationとrewardを計算します。またリセットをかける環境の判定もします。最大500stepに到達するか持ち上げに成功するとリセットするように設定しました。 
stepをactionの適用 → 物理演算 → observationとrewardの計算、という順番に固定して学習にデータを渡すためにこのような設計になっています。とりあえずpassでもいいのでここまで書けばviewerを起動しながら環境のチェックが行えます。 
  • reset_idx: 環境を初期状態に戻します。当然ですが初期状態のランダム性が学習の汎化性に大きくかかわります。myCobotを初期姿勢に、ターゲットオブジェクトの位置をmyCobotが届く範囲でランダムな位置にリセットするようにしました。 
  1. 状態・rewardの計算 
  • compute_observation: refresh関数で各バッファを更新して、観測したい状態をobs_bufに入れます。obs_bufのサイズはコンフィグの[”env”][“numObservation”]で定義します。 
  • compute_reward: rewardを計算します。グリッパーの把持位置(指の間)にターゲットオブジェクトが近づくほどrewardが得られ、ターゲットオブジェクトの高さが大きくなると更に大きなrewardが得られるようにしました。 

4.3. 学習の実行

タスクのたたき台ができたので学習してみます。  python train.py task=MycobotPicking --headless  200 epoch進むと最初の重みが保存され、それ以降はrewardが改善されると新しい重みが保存されます。  とはいえとりあえず作ってみたタスクがそんなに簡単に上手くいくはずもなく早々に学習が進まなくなりました。次に上手くいかなかった部分を少しずつ調整していった話を紹介します。 

4.4. タスク調整

学習した重みを使ってテストしてみると学習が上手くいっていない理由をデバッグできます。  python train.py task=MycobotPicking test=True checkpoint=runs/MycobotPicking/nn/[checkpoint].pth
  • 自作したグリッパーの指の関節が上手く動かない 
5.1節でグリッパーの作成については詳しく紹介しますが、上手く動きませんでした。具体的には物体と衝突したときに上手く各関節を連動して動かせませんでした。 色々試行錯誤をしましたが、やはりURDFが閉リンク構造に対応していないのがネックになり、実物と同じようにシミュレーターで動かすのは難しいという結論になりました。  そのためタスクを持ち上げるまでにはせず、リーチングまでにしてその後グリッパーを閉じて持ち上げる部分はルールベースで操作することにしました。グリッパーの指は固定リンクにして、actionを7次元から6次元に変更しました。  シミュレーターでロボットアームを使うときはPanda armのように閉リンクのないグリッパーを使った方が良さそうです。 
  • 一定の位置まで近づくとそれ以上近づかなくなる 
学習はある程度進むようになったのですが、やはりリーチングが完了したときに得られるrewardと比べるとずいぶん控えめな値になっていました。テストしてみると図7のようにオブジェクトの周りで触るのを躊躇うような動きをしていました。 今回のタスクで対象オブジェクトは直方体を立てた状態になっていて、倒してしまうと失敗とみなして環境をリセットしています。そのためリーチングしたときのrewardが充分でないと、倒してしまうリスクの方を重要視してしまうようです。そこでリーチングのrewardを距離の閾値で階段関数的に増加するようにし、目標ポイント内に到達すると最大化するように変更しました。  またタスク完了時にrewardを与えたあと環境をリセットする設定の場合、タスク完了の手前までしか学習していませんでした。ベンチマークタスクのFrankaCabinet(キャビネットの引き出しを引くタスク)でも同様の現象が見られ、39cm以上引き出しを引くと大きなrewardを得られるにも関わらず、タスク完了とみなされ環境をリセットするため、~37cm辺りで止まるように学習してしまいます。これは学習アルゴリズムの問題だと思われるため、今回修正はしませんでした。代わりにタスク完了時のリセットを消去し、最大step数をタスク完了に必要な数に調整してスムーズな動きを学習するようにしました(リーチングのみなら120stepで十分でした)。最大step数を減らしたことで学習も速くなりました。  難しいタスクに対して罰則が厳しすぎると、強化学習エージェントがタスクに消極的になってしまうのは人間味があって面白かったです。
図7: オブジェクトに近づかなくなるmyCobot
  • アームの自己衝突が無視されていた 
目的のリーチングはできるようになりましたが、今度は図8のように自己衝突を完全に無視した姿勢になってしまいました。ドキュメントで自己衝突を計算するように設定できないか調べていくつか試しましたが、上手くいきませんでした。 そもそも用意されているURDFの関節角上限がすべて-3.14~3.14に設定されているのが現実的ではないため、各関節角の上限下限を調節することで自己衝突を避けることにしました。 関節角ができるだけ大きい値になるように動いてしまった理由は未調査です。 
図8: 事故衝突を無視した姿勢になってしまうmyCobot
  • 止まって欲しいところにピタッと止まらずウロウロする 
お気持ちとしてはactionが0に漸近していくように学習されて欲しいですが難しく、どうしても目的位置周辺で振動するような動きになってしまいました。actionにペナルティをかけたり、目的位置をピンポイントに設定してrewardを調整したり、いくつかの条件を検討しましたが改善しませんでした。 この点は実動作の際にルールベースで止められるため固執しないことにしました。
  • 微調整 
マストではありませんでしたが、見栄えの問題でグリッパーは綺麗に下向きになって欲しかったので、rewardにグリッパーに角度が付くとペナルティを与える項を追加しました。 図9に微調整前の学習結果を示します。
図9: 微調整前の学習後myCobot
以上の調整を行った結果が図10になります。この精度が実機でも得られれば充分オブジェクトを持ち上げる動作ができそうです。
図10: 微調整後の学習後myCobot

5. その他

ダメだった話、やってみたい話を紹介します。 

5.1. 上手くいかなかった自作URDFグリッパーの話 

myCobotのURDFは前回の実機を動かしてみたときに使っていたものを基にしていますが、グリッパーが付いていませんでした。グリッパーのモデルは公式のGithubに一応存在しているのですがdaeファイルで図11(a)のように外観が確認できるだけでした。 シミュレーターで動かせるURDFを作るには関節パーツごとに分かれた3Dモデルが必要です。  そこでblenderを使ってパーツを関節ごとに分解(図11(c))、またcollisionに複雑な形状は再現が難しいため大きさを合わせた簡易な箱で作ったパーツを作成(図11(b))して使いました。あとはURDFファイルでリンクとジョイントの構造を記述して完成です。ただしURDFは閉リンク構造のあるモデルに対応していないため、baseについている片方のリンクはcollisionを消して指先側とのjointを完成です。荒っぽい方法ですが、シミュレーター上では6つある関節を同じ角度で動かして実機の動きを再現しました。 完成したものと実物の比較が図11(d)です(配布されていたモデルを使っていますがディティールが結構違います)。 そして、実際動かしてみましたが4.4節で上述の通り上手くいきませんでした。外力がかかると各ジョイントを連動させて動かすことができないのが原因でした(トルク制御が上手くできれば解決できたかもしれません)。
図11:myCobotのグリッパー作成 (a)公開されているグリッパーモデル(b)モデルに合わせて作成したcollision用のモデルパーツ(c)グリッパーモデルを分解したvisual用のモデルパーツ(d)Isaac Gymでの描画と実際のグリッパーの比較

5.2.画像認識を使ってみたい話

ベンチマークや今回作ったMycobotPickingのタスクでは、observationにオブジェクトの位置や姿勢といった情報を使っていますが実際のタスクでそれらの情報を得るのは簡単ではありません。したがって2Dカメラの情報と、簡単に得られるサーボの関節角の情報のみで強化学習ができるとより結果に価値が生まれます。  そこで学習が上手くいっているFrankaCubeStackのタスクでobservationを画像に変更、CNN層を入れて学習を行ってみました。しかし、とりあえず用意されているアルゴリズムに入力できる形にしてみただけなので、当然上手く学習できませんでした。画像情報をCNN層に入れるため1次元情報の関節角を追加するためのフレームワークがない、そもそも画像情報が大きく学習が重くなってしまい、環境の並列化数も制限されるなどの問題がありました。その他にも学習率やclip値などのハイパーパラメータの調節も必要になると思いますが、そこまでするほど効果が期待できなかったためスキップしました。  今回は方法の確認でCNN層を入れて学習を実行するテストまでで終わりました。しかし、どちらかというとカメラ画像を直接入れてCNN層を強化学習するよりも、YOLOやResNetのような簡単に使える物体認識モデルから、グリッパーやオブジェクトの認識を転移学習して特徴量エンコーダーを作成し、エンコードされた特徴量と関節角で強化学習する方が筋が良さそうな気がします。

5.3.学習したモデルを実機で使ってみた話

学習したモデルと、前回の記事で紹介した実機のmyCobotとRealSenseによる空間認識を使ってSim2Realの実験をしてみました。結論から言うと上手くいきませんでした。途中までのリーチングは動きましたが近づくにつれて動作が不安定になりオブジェクトを掴める位置まで正確に動作させることができませんでした。問題点は実機の「サーボが目的姿勢へ正確に動かすパワーがないこと」、「シミュレータではstep毎に目的姿勢に到達する前に次の目的姿勢を予測する一方で、実機は目的姿勢への動作完了まで次の予測をしないことによる細かい差異の蓄積」などが考えられます。前者について、本実験で使用したmyCobotは可搬重量250gの教育目的の安価アームであるため、強化学習によるピッキングのようにより正確に動かしたい場合はもっとハイエンドなロボットアーム使うべきだと思いました。myCobotを作っているElephantrobotics社は、可搬重量1kgのより強いサーボモーターを搭載したモデルも販売しているためこちらも試してみたいです。

6. まとめ

今回はIsaac Gymで強化学習タスクを作って実際に学習してみました。3D物理シミュレーター上でのロボット強化学習の問題設計、実際に動かしたときに起こる問題を体験できました。一から強化学習アルゴリズムを書くことなく、学習環境をテストできるのは魅力的でした。ベンチマーク環境が豊富にあるため、新しい学習アルゴリズムの研究をしたい方にとっても比較検証が行いやすいのは嬉しい点ではないでしょうか。 ALBERTには様々な専門的バックグラウンドを持つリサーチャー・アナリストがおります。技術に関する疑問やビジネスに関するご相談など、お気軽にお問い合わせください。

The post Isaac Gym で myCobot の把持タスクを強化学習してみました。 first appeared on ALBERT Official Blog.


流れ星に全自動で願いを送る装置を作る(続)

$
0
0
こんにちは。先進技術部でアルバイトをしている坪田です。
突然ですが、「流れ星が現れてから消えるまでに願い事を3回唱えると願いが叶う」という言い伝えがありますよね。真実かどうかはさておき、流れ星が流れている間に願いを3回唱えることは可能なのでしょうか。

流れ星は一般に、出現してから消えるまでおおよそ0.5秒と言われています。ほしいものを単語で唱えるだけ(例えば、「りんご」のみなど)なら可能でしょうが、しっかりとした願い(「りんごを食べたい」など)を0.5秒で3回唱えることはかなり難しいのではないでしょうか。(ちなみに、私は「株式会社ALBERT」と口を動かすのに1.5秒かかってしまいました。これでは一生願いを叶えられないかもしれません……)
先進技術部の山内さんが撮影した流れ星の映像
そこで本プロジェクトでは、全自動で流れ星を見つけて、流れ星を追跡しながら高速で願いを送信できる装置を作ることを目的として装置を作っています。
本プロジェクトは以下の手順で動く装置を作ります。
  1. 夜空をカメラで撮影しつづけ、流れ星を検出
  2. 検出した流れ星にレーザーを照射、追跡
  3. 願い事の文字列を0/1に変換し、レーザーの消灯/点灯で表現し、願いの情報を送信
以前の記事では以下のように実装されていました。
  1. では、簡易的にカメラで読み込んだ画像の明るい部分を前のフレームと比較し、変化があった部分を流れ星と判定するアルゴリズムを用いていました。
  2. では、ガルバノミラーモデルというモデルを使って、指定した方向に照射し、追跡していました。
  3. では、点滅していることは確認済みですが、実装されていませんでした。
以上のことは、「流れ星に全自動で願いを送る装置を作る」というブログ記事にさらに詳しく書いてあるので、読んでもらえればと思います。

以前の記事では、1の流れ星の検出アルゴリズムが簡易的なもので実装されていました。このアルゴリズムだと、流れ星ではない遠くの星が瞬いた際に流れ星と判定されてしまう可能性があり、うまくいかないことがあります。
そこで、今回は①に(輝度の差分を取るのではなく、流れ星の画像特徴を使って)流れ星の検出を深層学習で行い、装置のソフトウェア部分に検出器を組み込みました。

流れ星検出の話に入る前に、前の記事で不十分だった、②の狙った場所にレーザー光を照射する話をしようと思います。
以前のモデルでは、
  1. レーザー光をカメラから受け取った画像上で認識
  2. カメラ行列の逆行列を用いてカメラ座標系上の点に変換
  3. 2回目のレーザー反射点を固定の点だと仮定し、回転・推進が学習可能なAffine変換を使って、その点を原点とする座標系(反射点座標系)に変換
  4. 反射点座標系の座標から、三角関数を用いてモータ回転角を算出
のような処理を行っていました。
しかし、実際には最終的な反射点が固定であると仮定している点は考える余地の部分があるところで、実際にはモータの回転角によって移動する点です。地球程度の大きなスケールで考えればとても小さい差であるものの、不安要素は取り除いておきたいです。
この問題点を解消すべく作ったのが、GalvanoモデルとGalvano Inverseモデルです。

Galvanoモデル

Galvanoモデルの模式図
このモデルは、2つのモータの回転角を入力すると、最終反射光の反射点と反射方向を出力してくれるモデルです。
装置ではガルバノミラーはこのように実装されています。
実際の装置
このモデルの実体は、2回の反射をモデル化したもので、Pytorchを使って実装されています。
1回の反射では、以下の図のようになります。反射光のベクトルと反射点(青)は光源の位置・光源の方向ベクトル・鏡の姿勢・モータの回転が決まると1つに決めることができます。
反射モデルの模式図
装置では、レーザーの位置と方向、鏡(回転軸)の姿勢は装置に固定されている(図の黄色の印の部分)ので、これらのパラメータを推定することで、「モータ回転角から反射光の方向と反射点を算出するモデル」を作ることができます。 また、1回目の反射モデルが反射点と反射光のベクトルを出力するので、2回目の反射では、1回目の反射点を光源、1回目の反射光を光源のベクトルとして使うことができるため、2回目の反射は鏡の姿勢のみを推定します。
目の反射点を光源、1回目の反射光を光源のベクトルとして使うことができるため、2回目の反射は鏡の姿勢のみを推定します。 パラメータの推定は、3次元位置とモータの回転角を学習データとして推定しました。 この学習データは、OpenCVとARマーカーを使ってARマーカーの中央にレーザー光が近づくように「X方向はモータ1、Y方向はモータ2を動かしてレーザーの位置を調整する」ことを数回繰り返して作りました。
ARマーカ追跡をすることによってGalvanoモデルの学習データの生成を行う

Galvano Inverseモデル

Galvano Inverseモデルの模式図
「しかし、これではレーザー光を打ち込むことはできないのでは?」と思った読者さん、その通りです。
Galvanoモデルは「モータ回転角を決めるとどのようにレーザーが照射されるのか」ということを教えてくれるのですが、本当に私たちが知りたいのは「3次元位置を決めたときにどのモータ角度にすればいいか」です。
それを教えてくれるのが、Galvano Inverseモデルです。

Galvano Inverseモデルの構成は、2 stepでできています。
step 1で勾配降下を使ってモータ回転角を求め、ステップ2で照射目標点の座標を量子化し、計算の軽量化を行います。

step 1

以下のことを仮想的に(モータは動かさず、計算機上のみでシミュレート)行います。
飛ばしたい3次元位置を用意し、モータの回転角を適当に初期化します。そして、モータをどちらの方向に動かせば目標の3次元位置に近づくかをGalvanoモデルの勾配を使って求めます。この勾配はPytorchの自動微分の機能を使って求められます。
この仮想的な試行を数回繰り返し、レーザー光と目標3次元位置の距離がある閾値まで近づいたときに、仮想上でのモータの位置を実際のモータの位置に反映させます。
これによって、目標の3次元位置に十分近い位置を照射することができます。

step 2

step 2では、目標とする3次元位置を極座標に変換し、角度と動径を量子化し、各量子化した位置に対してあらかじめstep 1の方法でモータ回転角を計算して保持させました。
これによって、メモリから情報を引き出すだけでどのようにモータを回転させればいいのかを近似的に知ることができるようになりました。
実際にレーザーを飛ばす際には、3次元位置を極座標に変換し、量子化し、bilinear補間して推定しています。

以上で目標に向けてレーザー光を照射できるようになりました。

次に待ちに待った流れ星検出の深層学習の部分についてです。

YOLOX

流れ星検出モデルとして、YOLOXに注目しました。このモデルはYOLOv5に匹敵する性能を持ち(最近ではYOLO系もv8まで出ていますが……)、軽量モデルから高性能モデルまで取り揃えられています(電気屋のスマホコーナーのようですね)。 そのため精度と速度のトレードオフの部分を探りやすいと思い、またYOLOXの方がライセンスの問題で商用利用の観点で扱いやすい点もあり、このモデルを選択しました。

モデルはこれでいいのですが、一番大事な流れ星のデータがまだありません。機械学習にとってデータは命であり、データがなければ何もできません。流れ星のデータをどのように用意するかの話をしようと思います。

学習データ生成

端的に言うと、学習データは生成しました。夜空はそこまで複雑な形状というわけではなく、動いている光を検知するだけなので、そこまで凝った画像である必要もありません。
また学習データを外部からとってくることも考えましたが、YouTubeの流れ星の映像だと画像処理によって明るくなっていたり、流れ星の位置などのアノテーション作業が必要になってしまったり、正直あまり使いたくありませんでした。そのため、プログラムで描くことにしました。
今から説明する画像は、流れ星の動きを表現するため3枚で1セットです。
3枚であるところに理由は特にありません。強いて言えば、3枚だとRGB用に作られた深層学習モデルをそのままグレースケール3枚のモデルとして使うことができるからです。

夜空は大雑把に、星雲・流れていない通常の星・流れ星を描画すれば十分に思えます。これらを順に描いていきます。
  1. 星雲
    星雲にはFractal DBを使いました。
    Fractal DBはImageNetなどの画像を使わずに画像用事前学習モデルを作るために数式のみから作られた画像データセットです。本来の使い方とは違いますが、とても星雲っぽい感じがしたのでこれを星雲として採用しました。
  2. 流れていない通常の星
    流れていない星は単純に円を描きました。大きさはランダムで生成しました。また、星の瞬きを表現するため、次のフレームでランダムに大きさを変化させます。
  3. 流れ星
    流れ星も、流れていない星と同様に作りました。異なる点は、次のフレームで位置をずらすことです。移動速度をランダムで決め、動かしました。
Fractal DBの画像のうちの1枚
これによってできた画像が以下です。
生成された学習データ
この3枚のグレースケール画像をYOLOXに入力して学習させました。

Jetson Nanoへの実装

以上のモデルをJetson Nano上に実装しました。
処理内容は、画像をカメラから受け取るための「画像取得プロセス」、YOLOXで物体検出を行うための「推論プロセス」、モータを回転させる命令を送る「モータ制御プロセス」に分かれます。
  1. 「画像取得プロセス」、「推論プロセス」、「モータ制御プロセス」を起動
  2. 以下をループする
    1. カメラからグレースケール画像を取得
    2. 画像をサイズ3のQueueに蓄える
    3. Queueに蓄えた最近3枚の画像をYOLOXで位置を求める
    4. 画像内での位置を、カメラ行列の逆行列を使ってカメラ座標上の位置に変換する
    5. カメラ座標を極座標に変換する(角度はカメラレンズの光軸を0とし、それぞれ上と右を正とする)。ただし、実際の流れ星の動径方向の座標は求めることができないため、ハイパーパラメータで定めることにしました(手元で光を追跡させる実験では1m程度、実際に夜空で使う際は50m以上、のように決める)。
    6. Galvano Inverseモデルを用いて、カメラ座標をモータ回転角に変換する
    7. Arduinoに命令を送信し、モータを回転させてレーザーを照射する

TensorRT化して高速化

TensorRTとは、deep learningの推論を高速できるように計算を最適化したり、量子化して高速化したりするためのツールです。
高速化のため、YOLOX-tinyをTensorRTのfp16の形式に変換して実装しました。
実際には、PytorchモデルをONNXという中間言語のような形式に変換し、そのONNX形式をTensorRT形式に変換しました。

YOLOX-tinyでも遅かった

YOLOX-tinyはとても小さいモデルですが、それでもJetson Nanoの処理速度では流れ星をまともに追跡することはできませんでした(3推論/秒だったので、1つの流れ星に対して2回推論できるかできないかの速さ)。

そのため、YOLOXの内部のConvolutionをいくつか削除をし、軽量化しました(9推論/秒)。
それでも、まだ遅いです。ガルバノミラーの装置では、鏡の大きさが有限なのでレーザーを飛ばせない範囲があります。レーザーを飛ばせない範囲をカメラが拾わないようにし、画像サイズを落とすことによってYOLOXの処理を軽くしました(15推論/秒、0.5秒発光する流れ星なら7回推論できる)。

ここまですることによって、以下のように流れ星の動画をディスプレイに映し、追跡することができました。
流れ星の動画をディスプレイに映して流れ星を追跡

今後の展望

この装置はほとんど完成しています。欲を言えば、もう少し推論速度が速ければいいなというくらいでしょうか。しかし、実際に夜空で試したことはなく(流れ星はなかなか見られないからこそ価値があるわけなので)、未だ手元での実験段階です。
今後の展望として、夜空で実際に試し、街灯の光に釣られないか、実際の環境で撮ったカメラの画像は明るすぎないか、などの検証をすることが考えられます。

以下は技術的な内容からは離れてしまうのですが、よろしければ読んでいただけると嬉しいです。

大変だったこと

大変だったことは、まず一番に計算の高速化の部分です。特に計算が遅くて苦労した部分は、YOLOXの部分の計算とモータ回転角の計算でした。
YOLOXの部分はある程度は仕方ないと思っていましたが、モデルを小さくする方向で考えることによって耐えられる程度には速くすることができました。実際に試した方法としては、TensorRTを導入してfp16へ変換したり、YOLOXの内部の層を消して、消して……としたり、YOLOXの計算にかける画像の範囲を小さくしたりしました。

また、モータ回転角の計算は苦労した点でもありましたが、学びが大きかった点でもありました。
モータ角の計算のGalvano Inverseモデルは、開発初期はstep 1のみの計算でモデルを組み立てていました。しかしstep 1だけでは照射目標点が変わるたびに毎回勾配を数回計算しなければならないのでとても遅く、上司の方にstep 2での「照射目標座標を量子化し、予め計算結果を保持しておく」を提案していただきました。
私の中では、この考え方がなかったわけではなかったのですが、あらかじめ値を保持しておくと大幅に精度が劣化すると(勝手に)思っていたので、その考え方を捨てていました。
しかし今回やってみて、精度が思っていたよりも保たれていて驚きました。今後高速化しなければならない場面で使える考え方を学ぶことができ、とても勉強になりました。

他には、装置が劣化し、導線が切れてしまったときの修理でしょうか。はんだ付けが必要になったときに、部品とはんだ、はんだごてを持たなければならず、手が足りませんでした。この時ばかりはもう1本手が欲しくなりました。結局どうしたかというと、足で部品を抑えたり、もともと部品に付いていたはんだを溶かして使ったりしました。
前任の方が装置のハードウェア部分は作ってくれていたので、あとは得意なソフトウェア部分でしたし、上司の方にも相談にのっていただいたので大変すぎたことはほとんどなかったです。

楽しかった部分も話したいので書きます。

楽しかったこと

まず、このテーマをもらったときは、「え?企業が、これ、え?」と思いました。ですが、プログラムを書くことやニューラルネットによる画像処理は自分の中で比較的得意だったので、すごくワクワクしていました。実は、「給料もらいながら勉強・工作ができるとか最高!」とも思っていました。

基本的に装置の処理内容などは私が決め、詰まった際に上司の方に相談させてもらったのですが、やりたいことをたくさんさせていただきました。
まずはJetson Nanoです。Jetsonは、一度は触ってみたかったもののひとつで、趣味で買ってみようとも思ったのですが、デスクトップPCのGPUで済んでしまっていたので、結局買わずじまいでした。
重い処理をするとメモリがすぐに足りなくなるとか、GUIを起動してプログラムを実行するとそもそも電力が足りず落ちてしまうとか、Jetsonなどの組み込みならではのことをたくさん学べました。

次にカメラですね。ここまできっちりとした産業用カメラを触ったことがなく、趣味ではウェブカメラが限界だったので貴重な体験だったと思います。かなりのfpsが出るし、解像度も大きくかなり高精度でした。また、絞りなどを手で回して調整することをしたことがなかったので、最初は戸惑いましたが、それも勉強でした。

このプロジェクトを進めていくことで個人ではできない多くの学びがあったと思います。

おわりに

M2なので修論などの作業が入ってしまった際には休ませていただき、上司の方にも「学業を優先させてください」と言っていただき、修論作業にも集中することができました。ありがとうございました。

最後になりますが、ALBERTには様々な専門的バックグラウンドを持つリサーチャー・アナリストが在籍しています。技術に関する疑問やビジネスに関するご相談など、お気軽にお問い合わせください。

The post 流れ星に全自動で願いを送る装置を作る(続) first appeared on ALBERT Official Blog.

S-CTRNNを用いた株価の分散予測

$
0
0
こんにちは。3月末まで先進技術部でアルバイトをしていた今井です。 

今回は株価の分散予測をStochastic Continuous Time RNN (S-CTRNN)をはじめ、いくつかのモデルを用いて行ったので、その結果をモデルの概要と併せて紹介します。

 <初めに>

私が先進技術部でバイトを始めるにあたって、卒業までの限られた時間で修士論文とも並行しつつどんな課題を行っていくのか相談していたのですが、その際にS-CTRNNというモデルを使って、何か実データの予測ができたらいいよねという提案を受けたことが今回の課題のきっかけです。

S-CTRNN は元々、先進技術部の有江さんらが研究し論文[1]を出しているモデルで、通常のRNNによる平均値の推定と同時に、分散も推定するモデルになっています。先行研究ではガウシアンノイズを乗せたリサージュカーブを S-CTRNN に学習させ、平均値とノイズの分散を推定することにより、ノイズの乗っていない本来のリサージュカーブの形を算出するといった実験を行なっており、非常に綺麗なリサージュカーブの予測ができていました。論文内ではロボットの腕を制御する際にこのモデルを用いる話に発展してゆくため、よくある「〇〇時系列の予測にこのモデルを使ってみました!」といった方向の話はありませんでした。そのため S-CTRNN の分散予測が、他のデータだとどれ程の精度になるのかを確認するために今回の課題を解いていくことに決まりました。 

モデルの概要からも分かりますが、S-CTRNNは分散の推定ができるという事が特徴のモデルです。予測した分散の精度を確認できて入手しやすいデータとは何かとなった時に選ばれたのが株価データでした。株価データにはボリンジャーバンドというテクニカルチャートがあり、これが分散の近似値として扱え、終値などを直接推定するよりかは当てやすく今回の課題にちょうど良さそうだったからです。
こうして今回の S-CTRNN による株価予測がスタートしていきました。

<使用モデル>

S-CTRNN

今回の記事の主題であるのが S-CTRNNです。このモデルは出力層に配置された分散予測ユニットを用いることで、次の入力の平均値だけでなく分散も同時に推定することができるものです。 
アーキテクチャを示すと以下の図のようになっています。
図1 S-CTRNNのアーキテクチャ(参考文献[1]より)
現在時刻t の入力と前時刻の内部状態c_{t-1}を用いて計算した現在時刻の内部状態c_tが出力ユニットと分散ユニットに渡され出力y_tとバリアンスv_tを算出します。 
ここで、時刻tにおけるi番目のニューロンの内部状態は以下の式で表されます、
ここで、𝐼𝑐, 𝐼𝑜, 𝐼𝑣はそれぞれのニューロン、𝜏 は時定数、𝑤𝑖𝑗は各ユニット i 番目ニューロンと j 番目ニューロン間の結合係数、𝑏𝑖はバイアスを表します。 
学習の際に教師データに対する尤度関数を最大化することにより平均値y_tとバリアンスv_tを推定することができるようになっていて、推定した平均値 𝑦 に推定したバリアンス 𝑣 を持つガウシアンノイズを乗せることで学習データと同じ確率的性質の出力を生成することができるようなモデルとなっています。

比較モデル

S-CTRNNの 比較対象として株価のボラティリティ予測にも用いられている GARCH モデルを用意しました。  GARCHモデルは、株価のボラティリティなどの分散が不均一な現象をモデル化した、自己回帰条件付き不均一分散モデル(ARCH)を一般化させたモデルで、以下の式として表されます。

{ \sigma_t^2 = \omega + \alpha \varepsilon_{t-1}^2 + \beta \sigma_{t-1}^2}
{\varepsilon_t = \nu_t \sigma_t}
{Y_t = \alpha X_t + \varepsilon_t }

上式のように、現在時刻tの分散は、前時刻 t-1 の分散と残差に依存しているモデルとなっています。これにより、大きなボラティリティショックを考慮した推定をすることができます。またGARCHはARIMAなどと同様に、推定時刻の残差を {t-m } にまで伸ばすことによって、𝑚 ステップ前までの情報も取り扱うことができます。

<株価予測実験>

今回の実験ではpandas_datareaderより取得した2003年1月から2022年2月までの米国株式市場に上場している3社のデータを用いて、終値の変化率とボリンジャーバンド σ の値そのものの予測を、単純なワンステップとマルチステップで行い、それぞれのモデルの予測精度を比較しました。 
終値の変化率は以下の式で算出しています。 

変化率 =  (当日の終値 – 前日の終値) / 前日の終値 

学習データには各社の1日間隔の株式データを2003年から2021年までの過去18年間分用いています。また、説明変数は予測対象日前日の取引量と予測対象日4日前から前日までの終値の変化率を用いて行なっています。 
終値をそのままのドル単位の値ではなく変化率(%)に変更している理由として、18年間という長期間データを用いると株価がBoeing社で5倍程度、Apple社だと800倍程度と大きく成長してしまっており、過去と同様な波形が現れてもスケールが異なるためうまく扱うことができないからです。しかしながらこれは、株価が停滞気味の企業を取り扱うときは必要のない処理かもしれません。 予測区間は学習区間の後の1年間分である2021年から2022年のデータを対象としており予測を実行しています。 まずは単純なワンステップ予測の、両モデルの結果を以下に示します。 それぞれ上段が終値の変化率、下段がそのボリンジャーバンドの予測結果となっています。

Boeingの予測結果

S-CTRNNGARCH
σ のRMSE (↓) 1.300.751

Apple の予測結果

S-CTRNNGARCH
σのRMSE (↓) 0.6450.558

Simon Property Group, Inc. の予測結果

S-CTRNNGARCH
σのRMSE (↓) 1.300.751
まず終値の変化率の予測結果ですが、各上図が示す通り、3社とも残念ながらうまくいかず変動の小さいフラットな予測結果となってしまいました。終値の変化率予測にはもう少し株価データ自体の勉強が必要そうです。 
分散の予測結果ですが、今回はGARCHの方が良い結果となりました。 S-CTRNNの方は単純に学習がうまく行っていないだけのような気がするので、パラメータチューニングをもっとしっかり行い、どのような結果となるかも確認しておきたいところでした。また今回の実験対象の3社のデータは比較的変動の緩やかなものを選んでいるため、より大きなボラティリティショックが起きた時の振る舞い、より高度なテクニカルチャートを説明変数にしたときの振る舞いなども比較してみたいなとは思っています。 
次にマルチステップ予測の結果です。  学習自体はワンステップ予測と同じ方法なのですが、出力を翌日の値だけではなく、5日後の値まで出力するように変更しています。そののち、一日後の予測結果、二日後の予測結果と、タイムステップごとに予測精度を集計することにより、両モデルがどのぐらい先まで予測をすることができるのかを比較した実験になっています。 
以下の表は3社分で実験を行なった結果の分散のRMSEの平均値となっています。
予測日S-CTRNNGARCH
1日後1.700.769 
2日後1.710.850 
3日後1.710.945 
4日後1.701.02 
5日後1.721.11 

<付録>

最後に分散予測ではないのですが、先進技術部のAlessioさんが行なっていた研究[2]で、GANでの株価の終値予測もやってみたので簡単に紹介します。  学習方法は先ほどまでの実験とは条件が異なり、終値の変化率ではなく終値の値そのままを学習し予測するような条件となっています。説明変数もテクニカルチャートや複数日分のデータは用いず、前日の終値のみとなっています。  この条件でBoeingのデータでの予測をやってみた結果が以下のようになります。

Boeingの終値予測結果

グラフから見て取れるように、終値の急激な変化に対する反応には多少の遅延が見られるものの、終値の値を追うことが比較的成功している結果となりました。 生成モデルであるGANで時系列を取り扱いここまでうまくいくイメージが自分にはなかったため、個人的には少し驚きの結果となりました。この予測はアルバイト期間の終わりの方にやったものでモデルの勉強をまだしっかりとできていないため、より詳しく見ておきたいと思っています。 

<終わりに> 

今回の株価予測ではあまりうまくいったと言う結果が得られず、私自身、せっかく提案していただいたモデルをうまく使えずに非常に悔しい思いをしました。しかし取り扱ったことのないモデルやテクニカルチャートなどの株式の勉強、他にもこのブログには載せていませんが、VAE のようにS-CTRNNに確率分布を組み込ませて性能を試す実験など個人で参考書を読んでいるだけでは味わえないような経験をすることができました。アルバイトを始めた当初は作業環境も違ったり、修論のプレッシャーがあったり、Kerasしか使ってこなかったのにPyTorchを使うことになったりと正直かなり大変でしたが、終わってみれば非常に楽しくて学びのある時間だったと思っています。  短い時間ながらサポートしてくれた先進技術部の方々、ありがとうございました。

最後になりますが、ALBERTには様々な専門的バックグラウンドを持つリサーチャー・アナリストが在籍しています。技術に関する疑問やビジネスに関するご相談など、お気軽にお問い合わせください。 

<参考文献> 

[1] Shingo Murata, Jun Namikawa, Hiroaki Arie, Shigeki Sugano, and Jun Tani. Learning to Reproduce Fluctuating Time Series by Inferring Their Time-dependent Stochastic Properties: Application in Robot Learning via Tutoring. IEEE Trans. on Autonomous Mental Development, Vol. 5m No 4, pp298-310,2013
[2] Alessio Staffini. Stock Price Forecasting by a Deep Convolutional Generative Adversarial Network. Front Artif Intell, 04 February 2022 Sec Artificial Intelligence in Finance. Volume 5 – 2022

The post S-CTRNNを用いた株価の分散予測 first appeared on ALBERT Official Blog.

2023年入社式を行いました。

$
0
0
4月3日、今年もALBERTに19名の新卒社員の皆さんがジョインしました!

今回は2023年入社式の様子をお伝えします。当日は、フレッシュなスーツに身を包み、かなり緊張した面持ちで式が始まるのを待っている様子にこちらも久しぶりに背筋が伸びる思いでした。

最初に役員紹介があり、それぞれから新卒社員の皆さんに向けてのメッセージが贈られました。




・代表取締役会長 保科さん

「皆さんご入社おめでとうございます。まずはこちらをご覧ください。」
次に、びっしりと祝辞が書かれたスライドが映しだされました。

——————

■私たちの会社に入社してくださり、誠にありがとうございます。
■私たちは、お客様に最高の品質とサービスを提供することを目指して日々努力しています。
 そして、皆様が入社することで、より一層その目標に向かって邁進することができると信じています。
~~~
■会社の未来を担う皆様には、自己啓発やチームワーク、そして創造性という重要な要素を持っていただきたいと思います。
~~~
■最後に、改めて、皆さまの入社を心より歓迎いたします。私たちは、皆様とともに、より一層の発展を目指して、共に歩んでいきます。

——————

最初は何の違和感もなく話を聞いていましたが、この後、衝撃の事実が語られました。
なんと、このスライドはChatGPTが作った祝辞だったのです。


保科さん:
「この祝辞も私の本心ではありますが、今回皆さんへお伝えしたいことは他にもあります。
現在、ChatGPTのようなジェネレーティブAIはホワイトカラーの業務を強力に支援し始めました。
ホワイトカラー業務のあらゆるシーンに登場、仕事を強力に支援する時代に突入しています。

人間とジェネレーティブAIの能力について、今後は機械(AI)にできないことの境目をきちんと認識することが重要になります。すでに、ビジネス文書作成やプログラミングなどはAIができる時代です。

人間が判断する必要があること、それがこれからの私たちの仕事になります。
ALBERTとアクセンチュアで、業務を効率化しあるべき姿に変えていったり、責任あるAI に関する知見・ノウハウの蓄積を行ったりなど、今後さらに推進していきたいと考えています。
今わたしたちが生きている時代は、非常に面白いタイミングです。
そんなときに、皆さんが入社したことにはきっと意味があります。

大変革を楽しんで、一緒に世の中を変えていけたら、とても素晴らしいと思っています。」



・代表取締役社長 松本さん

「わたしからは、保科さんが話されていた「大きな大変革期」に紐づけてお話します。
まずはALBERTという会社がアクセンチュアグループとなった件についてお伝えしないといけません。
2022年11月より、ALBERTはアクセンチュアグループの一員になったわけですが、これは皆さんにとってもチャンスです。

世の中に多くの新卒がいるなかで、2社からの研修を受けられる人はなかなかいません。
それは必ず皆さんの強みになります。

また、内定式の時に私は皆さんに「越えられない壁はない」という話をしました。
繰り返しになりますが、過去の自分が蒔いた種(これまでの振る舞いや身を置いていた環境)が自分にとっての壁につながっていると私は考えています。
明らかに超えられないような壁はそもそも来たりしません。

例えば、私に500万円投資してほしいという相談は来るかもしれませんが50億円投資してほしいなんて話は来ないでしょう。
自分に無理な壁は来ない、だから頑張ってジャンプすれば必ずその壁は超えられるはずです。

技術力ももちろん大事ですが、目の前の壁、それは自分の力だけでなく周りの協力があって超えられるものもあるかもしれませんが、これからやってくる壁に立ち向かって、乗り越えていってほしいと思います。

皆さんはこれから数か月間かけて、ALBERTとアクセンチュアでの研修を受けることとなります。
ぜひ有意義に世界有数のスペシャリストがいる環境を活かしていただきたい。今後の活躍に期待しています。


・取締役 小山さん

「皆さんにはこれから3つの変化が訪れます。
1つ目は環境の社会変化、2つ目はChatGPTなどの技術変化、3つ目は会社の変化です。
どの変化も前向きでよいものになるはずですので、戸惑うことはあると思いますが、それもチャンスだと思ってどんどん挑戦していってもらいたいです。

一方で、様々な変化があるなかにあっても、できれば1つ以上のことを継続してがんばってほしいと思います。
仕事でも趣味でも、それらを続けることによって、3年後5年後にきっとその継続したことが皆さんを次のステージに上げてくれるはずです。」



続いて、今回のTOBによりALBERTの役員に加わった中村さんと納さんからのメッセージです。
中村さんからは今回のTOBを新卒社員にどう感じて欲しいか、納さんからはアクセンチュアの一員になった頃のエピソードをお話しいただきました。

・取締役 中村さん

「今回のALBERTとアクセンチュアのTOBは、両社がしっかりと話したうえで、社員が幸せになれる方法を検討して決めたことなので、皆さんにはこの機会をぜひ成長のきっかけにしてもらいたいと思います。

私も、最初から今の会社に長くいると思っていたわけではなくて、様々なプロジェクトを通じて様々な人達と関わることで、結果、長く今の会社にいます。皆さんもぜひ楽しんでください。」

・取締役 納さん

「私は2001年に入社したのですが、入社直前でとある事情から急に社名が変更されアクセンチュアという会社になりました。
当時はグローバルでも5万人規模でしたが今は20万人規模に成長しています。
どの分野においても一番を目指し、どんどん新しいことに挑戦しながら大きくなってきた会社です。

私自身は、数年前に保科さんと出会い、一緒に仕事をすることに面白さを感じて、コンサルからオフィスの設計や立ち上げ、組織作り、今はAIグループなのに新規事業立ち上げにも従事しているなど、非常に面白い働き方をしています。
みなさんにも、ぜひ自身の可能性を狭めることなく、どんどん新しいことにチャレンジしてほしいと思っています。きっと、その先にはいろいろな形のステップアップがあるはずです。」


役員からの祝辞を受け、新卒社員の皆さんはこれから数か月間の新入社員研修が始まります。
これから一緒に働いていく仲間として、皆さんの活躍を期待しています!



・おまけ:ランチ後のお昼休みの様子

入社式後に会社でランチを終え、ようやく少しだけ緊張が取れてきた様子でした。
(とはいえ、まだまだ初日なので堅い感じですが…。)

新卒研修は、これからオンラインも交えてハイブリッドで行われます。
オフィスへの出社や、同期と対面で話すことも貴重な機会なので、ぜひ時間を大切に、有意義な社会人1年目にしていただきたいと思います!

The post 2023年入社式を行いました。 first appeared on ALBERT Official Blog.

Viewing all 191 articles
Browse latest View live