井戸の中からこんばんわ、52代プロ研のtakowasabiです。
今年の夏休み「学科が暇な分何か始めてみたいな」という思いから、サマーインターンなるものに応募し、幸いながら機械学習のお仕事を体験させていただくことができ、たいそう勉強になりました。
ということで、スパムみたいなタイトルですが、せっかくなのでサマーインターンで学んだこととか、思ったことをこちらにつらつら書いていきたいと思います。
今回のインターンの成果や内容はこちらにまとめてありますので良かったらご覧ください。
一言でまとめる概要
行かない手はない
サマーインターンってどんなもの?
情報系の企業では、普段は忙しい理工の学生たちでも、インターンに参加できるよう夏休みに比較的短い期間のインターンを行っている場合があります。期間は企業によってまちまちで、3日間の短いものからびっちり2カ月のものもあります。
この分野に限って言うと、やたら待遇の良いものが多く、少し調べてみるとその異常さがすぐにわかるのではないでしょうか。(給料があるだけでもありがたいのに、下手なバイトよりも全然稼げてしまう...)
企業ホームページにも募集の情報が書かれているのですが、大手の求人サイトで探せば、様々な企業がサマーインターンを行っていることが分かると思います。ちなみに私はWantedlyさんで探していました。
ほとんどのものが、勉強しながらお金ももらえて、実務経験も積めるということで至れり尽くせりの内容となっています。
想定外の機械学習
今回のサマーインターンで行かせて頂いた会社は、FPGAから量子コンピュータまで、様々な技術を用いた高速化や最適化を行う会社で、普段使っているC++
を使ってお仕事が出来るんじゃないかなと思って初日を迎えました。
しかし、私の想定は早くも覆り、用意されていたのは機械学習を用いた物体検出のお仕事でした。担当のメンターさんによれば、面接の内容的にAIに興味がありそうだからやってみよう、とのこと。(今思い返してみれば、面接でAIに興味があると言ったような記憶があるようなないような。)
もちろん興味はあったのですが、まさか全く触ったこともないような機械学習の仕事をやらせていただけるとは思いもしませんでした。
とにもかくにも、その日から私の1カ月の機械学習生活が始まりました。
機械学習への入門
丁寧にも用意して頂いたGitやDockerなどのチュートリアルを終え、早速貸していただいた機械学習の本を読んでみることに。
そのとき、はじめに読ませていただいたのがO'Reilly社の『ゼロから作る Deep Learning』でした。
こちら本、端的に言って初学者にはとてもおすすめです。
ニューラルネットワークの基本からディープラーニングの実装までを、非常に読みやすい分量でまとめています。数学的で難しい部分も非常にうまくごまかされており、すぐに実践に移すことができる構成になっています。特に誤差逆伝播法の章は必見。
データセットやサンプルコードも用意されているので、機械学習興味あるけどまだやったことないよという方は買ってみてはいかがでしょう。
仕事内容のおはなし
技術的な話をすると長くなってしまいそうなので、出来るだけキーワードに絞って今回のインターンでやったことを説明したいと思います。
仕事の内容としては、新規技術の検討ということで、慣れない論文の解読をしながら新しい技術を実装していくという具合のものでした。(実際にはこちらのレベルに合わせてもらってそこまで難しい実装などは行わなかったのですが...)
分野としては先ほども言った通り物体検出で、今回はその一例として顔検出を主に行っていました。ちなみに、顔がどこにあるのかを調べるのが顔検出
で、顔が誰なのかを調べるのが顔認識
らしいです、成果発表のときに指摘されてしまったので、みなさんも覚えておくといいかも?
画像認識の分野では、畳み込みニューラルネットワーク(CNN)[1]がよく使われるのですが、その中でも今回使ったネットワークモデルは、SSD(Single Shot MultiBox Detector)[2][3]というリアルタイムに高精度な物体検出を行うために考えられ2016年に発表されたモデルでした。
SSDは、ハイエンドなGPUを使った環境下では、実際に60fps近い速度で70%以上の精度で物体検出を行うことが出来るのですが、いかんせん計算量が多く、様々な環境下でよいパフォーマンスを発揮できるものではありませんでした。
そこで、CNNを携帯端末などで使えるようにするための仕組みである、MobileNet[4]を組み込むことで、計算量を少なくして軽量化する、ということをしていました。
出せた成果
機械学習をやったことのない私からすると難しいのかすら分からない内容でしたが、一応成果らしいものは出せたので、紹介させていただきたいと思います。
今回最後まで回した学習は合計6回ほどです。(途中まで回して失敗したものも含めると10回くらい)
使用したGPUはGeForceのGTX1080Tiで、贅沢なことに同時に3つ並行して使うこともありました。データセットはWIDER FACEというフリーの顔検出用のデータセットを使わせていただきました。
主な結果は以下の通りでした。
これらのグラフはPR曲線と呼ばれている、学習結果を評価するのによく使われているグラフです。凡例の部分に書かれているのがmAPという検出の精度を表す値となっています。
左は既存のSSDのモデルで学習したもので、右のものがMobileNet-SSDで学習した結果になります。これを見ると、SSDの結果に対して、MobileNet-SSDの結果は少し劣るように感じられるかもしれません。
しかし、これをGPUがないときに行おうとすると、検出時間に大きな差が生じます。
上の表の示す通り、GPUなしで1枚の画像に対して顔検出を行うのには、既存のSSDはMobileNet-SSDの3倍もの時間を要します。
このような具合で、物体検出の計算をCPUで十分素早く行えるようなモデルを作ることができました!めでたしめでたし。
結局インターンってどうなん?
- 受からない経験も大事
インターンに応募しにくい理由として、受からないと面接やエントリーシートに費やした時間が無駄になってしまう、そもそも受かるのかも分からない、という不安があると思います。(実際私も一つ落ちました)
面接受けたら意外と受かるよ!なんて無責任なことを言うつもりは毛頭ありませんが、応募すること自体は無駄にはならないと断言できます。
面接やエントリーシートを書く経験は、簡単に得られるものではありませんし、自分の将来や、自分の長所を見つめなおす機会にもなります。もとより、インターンに受かる自信もなしに、求める企業への就職はあり得ないでしょう。
- 設備面での待遇
今回参加したインターンは、エンジニアのためにお金を惜しまず、お高い椅子やデュアルモニター、10円ドリンクなどを用意してくれており、自宅よりも快適なんじゃないかという職場環境で仕事をすることが出来ました。
また、メンターさんや技術力のあるインターンの参加者も周りにいるので、質問もし放題なだけでなく、自分が知らないような新しい知識を得ることが出来るかもしれません。
- 期間は長いほうがいい
今年の夏休み、私は2つのサマーインターンに参加したのでですが、2つを比較したときにひとつ言えることは、インターンの期間は長いに越したことはない、ということです。
確かに、短いインターンでも学べることは多く、新たな技術に触れ、それらを習得する感覚を味わえるとあって、明確な成長の感じられるものとなるでしょう。
しかし、長期のインターンではそのもう少し奥の、大きな成果や技術の確かな体得を成すことが可能となります。また、より実務に近い体験が得られるというのも大事なポイントでしょう。
- アルバイトの話がもらえたりする?
これはあまり大声で言っていいことなのかは分かりませんが、しっかりと成果が出せれば、その後のアルバイトのお誘いがあるかもしれません。長期的な勉強場所、収入源を求めている方も、サマーインターンでその機会を得られるかもしれません。
学部2年生でインターンに行くってどうなの?
- 学部2年でも参加できるの?
インターンに実際に参加すると、やはり学部3年生や修士1年生が多いのは事実としてあります。
しかし、私が応募したインターンの中で、学年を鑑みてマイナスイメージを持たれることは待ったくありませんでした。選考の際も問題はなく、むしろプラスイメージになっていたのかとさえ思えるほどでした。
しかし、どの企業もそうであるという訳ではなく、実際に学部2年だからという理由で選考に落とされた友人もいました。応募要項をよく確認し、企業の求めている参加者像をしっかり把握することが大事です。
- なんだか余裕をもった目線で参加できる
学部2年ということで、就活にインターンの結果や振る舞いが直接は関係しないということもあって、他の参加者よりも企業や業務を冷静な目線で見ることが出来ます。
自分の将来を正しく見定めるためにも、冷静で余裕のあるうちに、様々な企業や業務の実態を知っておけるのは、大きなアドバンテージだと思います。
- 長い期間学んだことを生かせる
1、2年生でサマーインターンに参加し、学んだことは大学生活や就活、果ては就職後にも役立てることが出来るものとなるでしょう。
より長い期間学んだことが生かせるよう、早めに参加するに越したことはないです。
- 若手扱いされる
未成年でインターンに参加すると、お酒が飲めなかったりして、少し目立ちます。何故か修士1年の方から、「若いねぇ」「そのころ俺は何してたかなぁ」などおっさんくさいことを言われます。
ということで、普段はなかなかできないフレッシュな若手アピールの勉強になるのではないでしょうか(?)。
終わりに
長くなってしまいましたが、ここまで読んでいただいた方はありがとうございます。この記事が少しでも皆さんの役に立てればと思います。
インターンに参加するのは、エントリーシートを書いたり面接をしたりでかなり大変かもしれません。それでも、参加して後悔することはないと思います。プログラミング経験1年ちょっとの私でもとても良い経験をすることができました。
みなさんも、来年の夏をサマーインターンに捧げてみてはいかがでしょうか?
[1]『畳み込みニューラルネットワークの仕組み』(原文:Brandon Rohrer) https://postd.cc/how-do-convolutional-neural-networks-work/
[2]『SSD:Single Shot Multibox Detector』(Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy, Scott Reed, Cheng-Yang Fu, Alexander C. Berg)https://arxiv.org/pdf/1512.02325.pdf
[3]『SSD:Single Shot Multibox Detector(和訳)』https://qiita.com/de0ta/items/1ae60878c0e177fc7a3a
[4]『MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications』(Andrew G. Howard, Menglong Zhu, Bo Chen, Dmitry Kalenichenko, Weijun Wang, Tobias Weyand, Marco Andreetto, Hartwig Adam)https://arxiv.org/pdf/1704.04861.pdf